mirror of https://github.com/PCSX2/pcsx2.git
Abstract list view behavior
This commit is contained in:
parent
fbdc364329
commit
2a0be7e91e
|
@ -18,9 +18,24 @@
|
||||||
#include "BreakpointWindow.h"
|
#include "BreakpointWindow.h"
|
||||||
#include "DebugEvents.h"
|
#include "DebugEvents.h"
|
||||||
|
|
||||||
void insertListViewColumns(wxListCtrl* list, GenericListViewColumn* columns, int count)
|
BEGIN_EVENT_TABLE(GenericListView, wxWindow)
|
||||||
|
EVT_SIZE(GenericListView::sizeEvent)
|
||||||
|
EVT_KEY_DOWN(GenericListView::keydownEvent)
|
||||||
|
EVT_RIGHT_DOWN(GenericListView::mouseEvent)
|
||||||
|
EVT_RIGHT_UP(GenericListView::mouseEvent)
|
||||||
|
EVT_LEFT_DCLICK(GenericListView::mouseEvent)
|
||||||
|
EVT_LIST_ITEM_RIGHT_CLICK(wxID_ANY,GenericListView::listEvent)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
GenericListView::GenericListView(wxWindow* parent, GenericListViewColumn* columns, int columnCount)
|
||||||
|
: wxListView(parent,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxLC_VIRTUAL|wxLC_REPORT|wxLC_SINGLE_SEL|wxNO_BORDER)
|
||||||
{
|
{
|
||||||
int totalWidth = list->GetSize().x;
|
insertColumns(columns,columnCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenericListView::insertColumns(GenericListViewColumn* columns, int count)
|
||||||
|
{
|
||||||
|
int totalWidth = GetSize().x;
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
|
@ -28,30 +43,93 @@ void insertListViewColumns(wxListCtrl* list, GenericListViewColumn* columns, int
|
||||||
column.SetText(columns[i].name);
|
column.SetText(columns[i].name);
|
||||||
column.SetWidth(totalWidth * columns[i].size);
|
column.SetWidth(totalWidth * columns[i].size);
|
||||||
|
|
||||||
list->InsertColumn(i,column);
|
InsertColumn(i,column);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->columns = columns;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenericListView::resizeColumns(int totalWidth)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < GetColumnCount(); i++)
|
||||||
|
{
|
||||||
|
SetColumnWidth(i,totalWidth*columns[i].size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void resizeListViewColumns(wxListCtrl* list, GenericListViewColumn* columns, int count, int totalWidth)
|
void GenericListView::sizeEvent(wxSizeEvent& evt)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < std::min(list->GetColumnCount(), count); i++)
|
resizeColumns(evt.GetSize().x);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenericListView::keydownEvent(wxKeyEvent& evt)
|
||||||
|
{
|
||||||
|
int sel = GetFirstSelected();
|
||||||
|
switch (evt.GetKeyCode())
|
||||||
{
|
{
|
||||||
list->SetColumnWidth(i,totalWidth*columns[i].size);
|
case WXK_DELETE:
|
||||||
|
if (sel+1 == GetItemCount())
|
||||||
|
Select(sel-1);
|
||||||
|
break;
|
||||||
|
case WXK_UP:
|
||||||
|
if (sel > 0)
|
||||||
|
Select(sel-1);
|
||||||
|
break;
|
||||||
|
case WXK_DOWN:
|
||||||
|
if (sel+1 < GetItemCount())
|
||||||
|
Select(sel+1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onKeyDown(evt.GetKeyCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenericListView::update()
|
||||||
|
{
|
||||||
|
int newRows = getRowCount();
|
||||||
|
SetItemCount(newRows);
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString GenericListView::OnGetItemText(long item, long col) const
|
||||||
|
{
|
||||||
|
return getColumnText(item,col);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenericListView::postEvent(wxEventType type, int value)
|
||||||
|
{
|
||||||
|
wxCommandEvent event( type, GetId() );
|
||||||
|
event.SetEventObject(this);
|
||||||
|
event.SetInt(value);
|
||||||
|
wxPostEvent(this,event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenericListView::mouseEvent(wxMouseEvent& evt)
|
||||||
|
{
|
||||||
|
wxEventType type = evt.GetEventType();
|
||||||
|
|
||||||
|
if (type == wxEVT_RIGHT_DOWN)
|
||||||
|
{
|
||||||
|
clickPos = evt.GetPosition();
|
||||||
|
evt.Skip();
|
||||||
|
} else if (type == wxEVT_RIGHT_UP)
|
||||||
|
{
|
||||||
|
onRightClick(GetFirstSelected(),evt.GetPosition());
|
||||||
|
} else if (type == wxEVT_LEFT_DCLICK)
|
||||||
|
{
|
||||||
|
onDoubleClick(GetFirstSelected(),evt.GetPosition());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenericListView::listEvent(wxListEvent& evt)
|
||||||
|
{
|
||||||
|
onRightClick(GetFirstSelected(),clickPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// BreakpointList
|
// BreakpointList
|
||||||
//
|
//
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(BreakpointList, wxWindow)
|
|
||||||
EVT_SIZE(BreakpointList::sizeEvent)
|
|
||||||
EVT_KEY_DOWN(BreakpointList::keydownEvent)
|
|
||||||
EVT_RIGHT_DOWN(BreakpointList::mouseEvent)
|
|
||||||
EVT_RIGHT_UP(BreakpointList::mouseEvent)
|
|
||||||
EVT_LIST_ITEM_RIGHT_CLICK(wxID_ANY,BreakpointList::listEvent)
|
|
||||||
END_EVENT_TABLE()
|
|
||||||
|
|
||||||
enum { BPL_TYPE, BPL_OFFSET, BPL_SIZELABEL, BPL_OPCODE, BPL_CONDITION, BPL_HITS, BPL_ENABLED, BPL_COLUMNCOUNT };
|
enum { BPL_TYPE, BPL_OFFSET, BPL_SIZELABEL, BPL_OPCODE, BPL_CONDITION, BPL_HITS, BPL_ENABLED, BPL_COLUMNCOUNT };
|
||||||
|
|
||||||
enum BreakpointListMenuIdentifiers
|
enum BreakpointListMenuIdentifiers
|
||||||
|
@ -61,7 +139,6 @@ enum BreakpointListMenuIdentifiers
|
||||||
ID_BREAKPOINTLIST_ADDNEW,
|
ID_BREAKPOINTLIST_ADDNEW,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
GenericListViewColumn breakpointColumns[BPL_COLUMNCOUNT] = {
|
GenericListViewColumn breakpointColumns[BPL_COLUMNCOUNT] = {
|
||||||
{ L"Type", 0.12f },
|
{ L"Type", 0.12f },
|
||||||
{ L"Offset", 0.12f },
|
{ L"Offset", 0.12f },
|
||||||
|
@ -73,29 +150,16 @@ GenericListViewColumn breakpointColumns[BPL_COLUMNCOUNT] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
BreakpointList::BreakpointList(wxWindow* parent, DebugInterface* _cpu, CtrlDisassemblyView* _disassembly)
|
BreakpointList::BreakpointList(wxWindow* parent, DebugInterface* _cpu, CtrlDisassemblyView* _disassembly)
|
||||||
: wxListView(parent,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxLC_VIRTUAL|wxLC_REPORT|wxLC_SINGLE_SEL|wxNO_BORDER), cpu(_cpu), disasm(_disassembly)
|
: GenericListView(parent,breakpointColumns,BPL_COLUMNCOUNT), cpu(_cpu),disasm(_disassembly)
|
||||||
{
|
{
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
// On linux wx failed to resize properly the page. I don't know why so for the moment I just create a static size page
|
// On linux wx failed to resize properly the page. I don't know why so for the moment I just create a static size page
|
||||||
// Far from ideal but at least I can use the memory window!
|
// Far from ideal but at least I can use the memory window!
|
||||||
this->SetSize(wxSize(1000, 200));
|
this->SetSize(wxSize(1000, 200));
|
||||||
#endif
|
#endif
|
||||||
insertListViewColumns(this,breakpointColumns,BPL_COLUMNCOUNT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakpointList::sizeEvent(wxSizeEvent& evt)
|
int BreakpointList::getRowCount()
|
||||||
{
|
|
||||||
resizeListViewColumns(this,breakpointColumns,BPL_COLUMNCOUNT,evt.GetSize().x);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BreakpointList::update()
|
|
||||||
{
|
|
||||||
int newRows = getTotalBreakpointCount();
|
|
||||||
SetItemCount(newRows);
|
|
||||||
Refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
int BreakpointList::getTotalBreakpointCount()
|
|
||||||
{
|
{
|
||||||
int count = (int)CBreakPoints::GetMemChecks().size();
|
int count = (int)CBreakPoints::GetMemChecks().size();
|
||||||
for (size_t i = 0; i < CBreakPoints::GetBreakpoints().size(); i++)
|
for (size_t i = 0; i < CBreakPoints::GetBreakpoints().size(); i++)
|
||||||
|
@ -106,7 +170,7 @@ int BreakpointList::getTotalBreakpointCount()
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString BreakpointList::OnGetItemText(long item, long col) const
|
wxString BreakpointList::getColumnText(int item, int col) const
|
||||||
{
|
{
|
||||||
FastFormatUnicode dest;
|
FastFormatUnicode dest;
|
||||||
bool isMemory;
|
bool isMemory;
|
||||||
|
@ -213,24 +277,14 @@ wxString BreakpointList::OnGetItemText(long item, long col) const
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakpointList::keydownEvent(wxKeyEvent& evt)
|
void BreakpointList::onKeyDown(int key)
|
||||||
{
|
{
|
||||||
int sel = GetFirstSelected();
|
int sel = GetFirstSelected();
|
||||||
switch (evt.GetKeyCode())
|
switch (key)
|
||||||
{
|
{
|
||||||
case WXK_DELETE:
|
case WXK_DELETE:
|
||||||
if (sel+1 == GetItemCount())
|
|
||||||
Select(sel-1);
|
|
||||||
removeBreakpoint(sel);
|
removeBreakpoint(sel);
|
||||||
break;
|
break;
|
||||||
case WXK_UP:
|
|
||||||
if (sel > 0)
|
|
||||||
Select(sel-1);
|
|
||||||
break;
|
|
||||||
case WXK_DOWN:
|
|
||||||
if (sel+1 < GetItemCount())
|
|
||||||
Select(sel+1);
|
|
||||||
break;
|
|
||||||
case WXK_RETURN:
|
case WXK_RETURN:
|
||||||
editBreakpoint(sel);
|
editBreakpoint(sel);
|
||||||
break;
|
break;
|
||||||
|
@ -412,21 +466,12 @@ void BreakpointList::showMenu(const wxPoint& pos)
|
||||||
PopupMenu(&menu,pos);
|
PopupMenu(&menu,pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakpointList::mouseEvent(wxMouseEvent& evt)
|
void BreakpointList::onRightClick(int itemIndex, const wxPoint& point)
|
||||||
{
|
{
|
||||||
wxEventType type = evt.GetEventType();
|
showMenu(point);
|
||||||
|
|
||||||
if (type == wxEVT_RIGHT_DOWN)
|
|
||||||
{
|
|
||||||
clickPos = evt.GetPosition();
|
|
||||||
evt.Skip();
|
|
||||||
} else if (type == wxEVT_RIGHT_UP)
|
|
||||||
{
|
|
||||||
showMenu(evt.GetPosition());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakpointList::listEvent(wxListEvent& evt)
|
void BreakpointList::onDoubleClick(int itemIndex, const wxPoint& point)
|
||||||
{
|
{
|
||||||
showMenu(clickPos);
|
gotoBreakpointAddress(itemIndex);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,21 +26,47 @@ struct GenericListViewColumn
|
||||||
int flags;
|
int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BreakpointList: public wxListView
|
class GenericListView: public wxListView
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GenericListView(wxWindow* parent, GenericListViewColumn* columns, int columnCount);
|
||||||
|
void update();
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
protected:
|
||||||
|
void sizeEvent(wxSizeEvent& evt);
|
||||||
|
void keydownEvent(wxKeyEvent& evt);
|
||||||
|
void postEvent(wxEventType type, int value);
|
||||||
|
void mouseEvent(wxMouseEvent& evt);
|
||||||
|
void listEvent(wxListEvent& evt);
|
||||||
|
|
||||||
|
virtual wxString getColumnText(int row, int col) const = 0;
|
||||||
|
virtual int getRowCount() = 0;
|
||||||
|
virtual void onDoubleClick(int itemIndex, const wxPoint& point) { };
|
||||||
|
virtual void onRightClick(int itemIndex, const wxPoint& point) { };
|
||||||
|
virtual void onKeyDown(int key) { };
|
||||||
|
private:
|
||||||
|
void insertColumns(GenericListViewColumn* columns, int count);
|
||||||
|
void resizeColumns(int totalWidth);
|
||||||
|
wxString OnGetItemText(long item, long col) const;
|
||||||
|
|
||||||
|
GenericListViewColumn* columns;
|
||||||
|
wxPoint clickPos;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BreakpointList: public GenericListView
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BreakpointList(wxWindow* parent, DebugInterface* _cpu, CtrlDisassemblyView* _disassembly);
|
BreakpointList(wxWindow* parent, DebugInterface* _cpu, CtrlDisassemblyView* _disassembly);
|
||||||
void reloadBreakpoints();
|
void reloadBreakpoints();
|
||||||
void update();
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
protected:
|
protected:
|
||||||
wxString OnGetItemText(long item, long col) const;
|
|
||||||
void onPopupClick(wxCommandEvent& evt);
|
void onPopupClick(wxCommandEvent& evt);
|
||||||
|
|
||||||
void sizeEvent(wxSizeEvent& evt);
|
virtual wxString getColumnText(int row, int col) const;
|
||||||
void keydownEvent(wxKeyEvent& evt);
|
virtual int getRowCount();
|
||||||
void mouseEvent(wxMouseEvent& evt);
|
virtual void onDoubleClick(int itemIndex, const wxPoint& point);
|
||||||
void listEvent(wxListEvent& evt);
|
virtual void onRightClick(int itemIndex, const wxPoint& point);
|
||||||
|
virtual void onKeyDown(int key);
|
||||||
private:
|
private:
|
||||||
int getBreakpointIndex(int itemIndex, bool& isMemory) const;
|
int getBreakpointIndex(int itemIndex, bool& isMemory) const;
|
||||||
int getTotalBreakpointCount();
|
int getTotalBreakpointCount();
|
||||||
|
@ -55,5 +81,4 @@ private:
|
||||||
std::vector<MemCheck> displayedMemChecks_;
|
std::vector<MemCheck> displayedMemChecks_;
|
||||||
DebugInterface* cpu;
|
DebugInterface* cpu;
|
||||||
CtrlDisassemblyView* disasm;
|
CtrlDisassemblyView* disasm;
|
||||||
wxPoint clickPos;
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue