mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-07-11 01:25:07 +02:00
GE Debugger: Add context menu to control tabs.
Crurent non-functional, but shows up for the correct tab.
This commit is contained in:
@@ -59,6 +59,13 @@ enum PrimaryDisplayType {
|
||||
PRIMARY_STENCILBUF,
|
||||
};
|
||||
|
||||
enum class GEPanelIndex {
|
||||
LEFT,
|
||||
RIGHT,
|
||||
TOPRIGHT,
|
||||
COUNT,
|
||||
};
|
||||
|
||||
static void *AddDisplayListTab(GEDebuggerTab *tab, TabControl *tabs, GETabPosition pos, HINSTANCE inst, HWND parent) {
|
||||
HWND wnd = tabs->AddTabWindow(L"CtrlDisplayListView", tab->name);
|
||||
return CtrlDisplayListView::getFrom(wnd);
|
||||
@@ -396,42 +403,64 @@ void CGEDebugger::UpdatePreviews() {
|
||||
}
|
||||
|
||||
void CGEDebugger::UpdateTab(GEDebuggerTab *tab) {
|
||||
auto doUpdate = [&](GETabPosition pos, TabControl *t, int index) {
|
||||
auto doUpdate = [&](GETabPosition pos, TabControl *t, GEPanelIndex index) {
|
||||
if (tab->pos & pos)
|
||||
tab->update(tab, t, pos, tab->state[index].ptr);
|
||||
tab->update(tab, t, pos, tab->state[(int)index].ptr);
|
||||
};
|
||||
|
||||
doUpdate(GETabPosition::LEFT, tabs, 0);
|
||||
doUpdate(GETabPosition::RIGHT, tabsRight_, 1);
|
||||
doUpdate(GETabPosition::TOPRIGHT, tabsTR_, 2);
|
||||
doUpdate(GETabPosition::LEFT, tabs, GEPanelIndex::LEFT);
|
||||
doUpdate(GETabPosition::RIGHT, tabsRight_, GEPanelIndex::RIGHT);
|
||||
doUpdate(GETabPosition::TOPRIGHT, tabsTR_, GEPanelIndex::TOPRIGHT);
|
||||
}
|
||||
|
||||
void CGEDebugger::AddTab(GEDebuggerTab *tab, GETabPosition mask) {
|
||||
auto doAdd = [&](GETabPosition pos, TabControl *t, int index) {
|
||||
auto doAdd = [&](GETabPosition pos, TabControl *t, GEPanelIndex pindex) {
|
||||
int index = (int)pindex;
|
||||
// On init, we still have nullptr, but already have pos, so we use that.
|
||||
if ((mask & pos) && tab->state[index].ptr == nullptr) {
|
||||
tab->state[index].index = t->Count();
|
||||
tab->state[index].ptr = tab->add(tab, t, pos, m_hInstance, m_hDlg);
|
||||
tab->pos |= pos;
|
||||
}
|
||||
};
|
||||
|
||||
doAdd(GETabPosition::LEFT, tabs, 0);
|
||||
doAdd(GETabPosition::RIGHT, tabsRight_, 1);
|
||||
doAdd(GETabPosition::TOPRIGHT, tabsTR_, 2);
|
||||
doAdd(GETabPosition::LEFT, tabs, GEPanelIndex::LEFT);
|
||||
doAdd(GETabPosition::RIGHT, tabsRight_, GEPanelIndex::RIGHT);
|
||||
doAdd(GETabPosition::TOPRIGHT, tabsTR_, GEPanelIndex::TOPRIGHT);
|
||||
}
|
||||
|
||||
void CGEDebugger::RemoveTab(GEDebuggerTab *tab, GETabPosition mask) {
|
||||
auto doRemove = [&](GETabPosition pos, TabControl *t, int index) {
|
||||
auto doRemove = [&](GETabPosition pos, TabControl *t, GEPanelIndex pindex) {
|
||||
int index = (int)pindex;
|
||||
if ((tab->pos & pos) && (mask & pos)) {
|
||||
_assert_(tab->state[index].ptr != nullptr);
|
||||
tab->remove(tab, t, pos, tab->state[index].ptr);
|
||||
tab->pos = GETabPosition((int)tab->pos & ~(int)pos);
|
||||
tab->state[index].index = -1;
|
||||
}
|
||||
};
|
||||
|
||||
doRemove(GETabPosition::LEFT, tabs, 0);
|
||||
doRemove(GETabPosition::RIGHT, tabsRight_, 1);
|
||||
doRemove(GETabPosition::TOPRIGHT, tabsTR_, 2);
|
||||
doRemove(GETabPosition::LEFT, tabs, GEPanelIndex::LEFT);
|
||||
doRemove(GETabPosition::RIGHT, tabsRight_, GEPanelIndex::RIGHT);
|
||||
doRemove(GETabPosition::TOPRIGHT, tabsTR_, GEPanelIndex::TOPRIGHT);
|
||||
}
|
||||
|
||||
int CGEDebugger::HasTabIndex(GEDebuggerTab *tab, GETabPosition pos) {
|
||||
int stateIndex = 0;
|
||||
switch (pos) {
|
||||
case GETabPosition::LEFT: stateIndex = (int)GEPanelIndex::LEFT; break;
|
||||
case GETabPosition::RIGHT: stateIndex = (int)GEPanelIndex::RIGHT; break;
|
||||
case GETabPosition::TOPRIGHT: stateIndex = (int)GEPanelIndex::TOPRIGHT; break;
|
||||
default: _assert_msg_(false, "Invalid GE tab position"); break;
|
||||
}
|
||||
|
||||
if (tab->pos & pos) {
|
||||
auto &state = tab->state[stateIndex];
|
||||
if (state.ptr == nullptr)
|
||||
return -1;
|
||||
return state.index;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
u32 CGEDebugger::TexturePreviewFlags(const GPUgstate &state) {
|
||||
@@ -870,12 +899,15 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
||||
UpdateTab(&tabState);
|
||||
}
|
||||
}
|
||||
CheckTabMessage(tabs, GETabPosition::LEFT, lParam);
|
||||
break;
|
||||
case IDC_GEDBG_RIGHTTAB:
|
||||
tabsRight_->HandleNotify(lParam);
|
||||
CheckTabMessage(tabsRight_, GETabPosition::RIGHT, lParam);
|
||||
break;
|
||||
case IDC_GEDBG_TOPRIGHTTAB:
|
||||
tabsTR_->HandleNotify(lParam);
|
||||
CheckTabMessage(tabsTR_, GETabPosition::TOPRIGHT, lParam);
|
||||
break;
|
||||
case IDC_GEDBG_FBTABS:
|
||||
fbTabs->HandleNotify(lParam);
|
||||
@@ -1067,6 +1099,64 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void CGEDebugger::CheckTabMessage(TabControl *t, GETabPosition pos, LPARAM lParam) {
|
||||
NMHDR *msg = (LPNMHDR)lParam;
|
||||
if (msg->code != NM_RCLICK)
|
||||
return;
|
||||
|
||||
POINT cursorPos;
|
||||
GetCursorPos(&cursorPos);
|
||||
int tabIndex = t->HitTest(cursorPos);
|
||||
if (tabIndex == -1)
|
||||
return;
|
||||
|
||||
// Find the tabState that was clicked on.
|
||||
GEDebuggerTab *tab = nullptr;
|
||||
for (GEDebuggerTab &tabState : tabStates_) {
|
||||
int foundIndex = HasTabIndex(&tabState, pos);
|
||||
if (foundIndex == tabIndex) {
|
||||
tab = &tabState;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Shouldn't normally happen... maybe we added some other type of tab.
|
||||
if (!tab)
|
||||
return;
|
||||
|
||||
int currentPanels = 0;
|
||||
for (int i = 0; i < (int)GEPanelIndex::COUNT; ++i) {
|
||||
if (tab && tab->state[i].index != -1 && tab->state[i].ptr)
|
||||
currentPanels++;
|
||||
}
|
||||
|
||||
HMENU subMenu = GetContextMenu(ContextMenuID::GEDBG_TABS);
|
||||
static const int itemIDs[] = { ID_GEDBG_SHOWONLEFT, ID_GEDBG_SHOWONRIGHT, ID_GEDBG_SHOWONTOPRIGHT };
|
||||
for (int i = 0; i < (int)GEPanelIndex::COUNT; ++i) {
|
||||
bool active = tab && tab->state[i].index != -1 && tab->state[i].ptr;
|
||||
bool disabled = active && currentPanels == 1;
|
||||
CheckMenuItem(subMenu, itemIDs[i], active ? MF_CHECKED : MF_UNCHECKED);
|
||||
EnableMenuItem(subMenu, itemIDs[i], disabled ? MF_GRAYED : MF_ENABLED);
|
||||
}
|
||||
|
||||
switch (TriggerContextMenu(ContextMenuID::GEDBG_TABS, m_hDlg, ContextPoint::FromCursor())) {
|
||||
case ID_GEDBG_SHOWONLEFT:
|
||||
// TODO
|
||||
break;
|
||||
|
||||
case ID_GEDBG_SHOWONRIGHT:
|
||||
// TODO
|
||||
break;
|
||||
|
||||
case ID_GEDBG_SHOWONTOPRIGHT:
|
||||
// TODO
|
||||
break;
|
||||
|
||||
default:
|
||||
// Cancel, that's fine.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CGEDebugger::UpdateMenus() {
|
||||
CheckMenuItem(GetMenu(m_hDlg), IDC_GEDBG_FLUSHAUTO, MF_BYCOMMAND | (autoFlush_ ? MF_CHECKED : MF_UNCHECKED));
|
||||
}
|
||||
|
||||
@@ -63,10 +63,13 @@ struct GEDebuggerTab {
|
||||
const wchar_t *name;
|
||||
GETabPosition pos;
|
||||
GETabType type;
|
||||
union {
|
||||
Dialog *dlg;
|
||||
CtrlDisplayListView *displayList;
|
||||
void *ptr;
|
||||
struct {
|
||||
union {
|
||||
Dialog *dlg;
|
||||
CtrlDisplayListView *displayList;
|
||||
void *ptr;
|
||||
};
|
||||
int index = -1;
|
||||
} state[3];
|
||||
void *(*add)(GEDebuggerTab *tab, TabControl *tabs, GETabPosition pos, HINSTANCE inst, HWND parent);
|
||||
void (*remove)(GEDebuggerTab *tab, TabControl *tabs, GETabPosition pos, void *ptr);
|
||||
@@ -116,6 +119,8 @@ private:
|
||||
void UpdateTab(GEDebuggerTab *tab);
|
||||
void AddTab(GEDebuggerTab *tab, GETabPosition mask);
|
||||
void RemoveTab(GEDebuggerTab *tab, GETabPosition mask);
|
||||
int HasTabIndex(GEDebuggerTab *tab, GETabPosition pos);
|
||||
void CheckTabMessage(TabControl *t, GETabPosition pos, LPARAM lParam);
|
||||
|
||||
u32 TexturePreviewFlags(const GPUgstate &state);
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ enum class ContextMenuID {
|
||||
GEDBG_STATE = 7,
|
||||
GEDBG_PREVIEW = 8,
|
||||
GEDBG_MATRIX = 9,
|
||||
GEDBG_TABS = 10,
|
||||
};
|
||||
|
||||
struct ContextPoint {
|
||||
|
||||
@@ -272,6 +272,14 @@ void TabControl::HandleNotify(LPARAM lParam)
|
||||
}
|
||||
}
|
||||
|
||||
int TabControl::HitTest(const POINT &screenPos) {
|
||||
TCHITTESTINFO hitTest{};
|
||||
hitTest.pt = screenPos;
|
||||
ScreenToClient(hwnd, &hitTest.pt);
|
||||
|
||||
return TabCtrl_HitTest(hwnd, &hitTest);
|
||||
}
|
||||
|
||||
void TabControl::OnResize()
|
||||
{
|
||||
RECT tabRect;
|
||||
|
||||
@@ -11,6 +11,7 @@ class TabControl
|
||||
public:
|
||||
TabControl(HWND handle, bool noDisplayArea = false);
|
||||
void HandleNotify(LPARAM lParam);
|
||||
int HitTest(const POINT &screenPos);
|
||||
HWND AddTabWindow(const wchar_t* className, const wchar_t* title, DWORD style = 0);
|
||||
void AddTabDialog(Dialog* dialog, const wchar_t* title);
|
||||
void AddTab(HWND hwnd, const wchar_t* title);
|
||||
|
||||
@@ -792,6 +792,12 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Toggle Breakpoint", ID_DISASM_TOGGLEBREAKPOINT
|
||||
END
|
||||
POPUP "getaboptions"
|
||||
BEGIN
|
||||
MENUITEM "Show in &Left Pane" ID_GEDBG_SHOWONLEFT
|
||||
MENUITEM "Show in &Right Pane" ID_GEDBG_SHOWONRIGHT
|
||||
MENUITEM "Show in &Top Right Pane" ID_GEDBG_SHOWONTOPRIGHT
|
||||
END
|
||||
END
|
||||
|
||||
#endif // English (United States) resources
|
||||
|
||||
+4
-1
@@ -328,6 +328,9 @@
|
||||
#define IDC_GEDBG_RIGHTTAB 40216
|
||||
#define ID_OPTIONS_DIRECT3D11 40217
|
||||
#define IDC_GEDBG_TOPRIGHTTAB 40218
|
||||
#define ID_GEDBG_SHOWONLEFT 40219
|
||||
#define ID_GEDBG_SHOWONRIGHT 40220
|
||||
#define ID_GEDBG_SHOWONTOPRIGHT 40221
|
||||
|
||||
|
||||
// Dummy option to let the buffered rendering hotkey cycle through all the options.
|
||||
@@ -341,7 +344,7 @@
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 256
|
||||
#define _APS_NEXT_COMMAND_VALUE 40219
|
||||
#define _APS_NEXT_COMMAND_VALUE 40222
|
||||
#define _APS_NEXT_CONTROL_VALUE 1202
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user