Added layout presets to debugger.

This commit is contained in:
mjbudd77 2021-07-17 14:48:53 -04:00
parent a3669b5b93
commit 31cbbebc8e
2 changed files with 268 additions and 31 deletions

View File

@ -138,7 +138,7 @@ ConsoleDebugger::ConsoleDebugger(QWidget *parent)
{ {
char stmp[64]; char stmp[64];
tabView[i][j] = new DebuggerTabWidget(); tabView[i][j] = new DebuggerTabWidget(i,j);
sprintf( stmp, "debuggerTabView%i%i\n", i+1, j+1 ); sprintf( stmp, "debuggerTabView%i%i\n", i+1, j+1 );
@ -329,45 +329,37 @@ QMenuBar *ConsoleDebugger::buildMenuBar(void)
viewMenu->addSeparator(); viewMenu->addSeparator();
// View -> Layout // View -> Layout
visMenu = viewMenu->addMenu( tr("&Layout") ); visMenu = viewMenu->addMenu( tr("&Layout Presets") );
g_config->getOption( "SDL.DebuggerLayoutOpt", &opt ); g_config->getOption( "SDL.DebuggerLayoutOpt", &opt );
actGroup = new QActionGroup(this); actGroup = new QActionGroup(this);
actGroup->setExclusive(true); actGroup->setExclusive(true);
// View -> Layout -> 1 // View -> Layout -> Compact View
act = new QAction(tr("&1"), this); act = new QAction(tr("&Compact View"), this);
act->setStatusTip(tr("1 Tabbed Vertical Column")); //act->setStatusTip(tr("Compact View"));
act->setCheckable(true);
act->setChecked( opt == 1 );
connect( act, &QAction::triggered, [this]{ setLayoutOption(1); } ); connect( act, &QAction::triggered, [this]{ setLayoutOption(1); } );
actGroup->addAction(act); actGroup->addAction(act);
visMenu->addAction(act); visMenu->addAction(act);
// View -> Layout -> 2 // View -> Layout -> Compact View Split
act = new QAction(tr("&2"), this); act = new QAction(tr("Compact View &Split"), this);
act->setStatusTip(tr("1 Tabbed Vertical Column with 2 Sections")); //act->setStatusTip(tr("1 Tabbed Vertical Column with 2 Sections"));
act->setCheckable(true);
act->setChecked( opt == 2 );
connect( act, &QAction::triggered, [this]{ setLayoutOption(2); } ); connect( act, &QAction::triggered, [this]{ setLayoutOption(2); } );
actGroup->addAction(act); actGroup->addAction(act);
visMenu->addAction(act); visMenu->addAction(act);
// View -> Layout -> 3 // View -> Layout -> Wide View
act = new QAction(tr("&3"), this); act = new QAction(tr("&Wide View"), this);
act->setStatusTip(tr("2 Tabbed Vertical Columns with 3 Sections")); //act->setStatusTip(tr("2 Tabbed Vertical Columns with 3 Sections"));
act->setCheckable(true);
act->setChecked( opt == 3 );
connect( act, &QAction::triggered, [this]{ setLayoutOption(3); } ); connect( act, &QAction::triggered, [this]{ setLayoutOption(3); } );
actGroup->addAction(act); actGroup->addAction(act);
visMenu->addAction(act); visMenu->addAction(act);
// View -> Layout -> 4 // View -> Layout -> Wide View Quad
act = new QAction(tr("&4"), this); act = new QAction(tr("Wide View &Quad"), this);
act->setStatusTip(tr("2 Tabbed Vertical Columns with 4 Sections")); //act->setStatusTip(tr("2 Tabbed Vertical Columns with 4 Sections"));
act->setCheckable(true);
act->setChecked( opt == 4 );
connect( act, &QAction::triggered, [this]{ setLayoutOption(4); } ); connect( act, &QAction::triggered, [this]{ setLayoutOption(4); } );
actGroup->addAction(act); actGroup->addAction(act);
visMenu->addAction(act); visMenu->addAction(act);
@ -1344,6 +1336,8 @@ void ConsoleDebugger::loadDisplayViews(void)
sprintf( key, "debugger/vPanelState%i", i+1); sprintf( key, "debugger/vPanelState%i", i+1);
vsplitter[i]->restoreState( settings.value(key).toByteArray() ); vsplitter[i]->restoreState( settings.value(key).toByteArray() );
} }
updateTabVisibility();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void ConsoleDebugger::saveDisplayViews(void) void ConsoleDebugger::saveDisplayViews(void)
@ -1387,6 +1381,61 @@ void ConsoleDebugger::saveDisplayViews(void)
settings.setValue("debugger/geometry", saveGeometry()); settings.setValue("debugger/geometry", saveGeometry());
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void ConsoleDebugger::updateTabVisibility(void)
{
for (int i=0; i<2; i++)
{
for (int j=0; j<4; j++)
{
if ( tabView[i][j]->count() > 0 )
{
if ( !tabView[i][j]->isVisible() )
{
QList<int> s = vsplitter[i]->sizes();
s[j] = tabView[i][j]->minimumSizeHint().height();
vsplitter[i]->setSizes(s);
}
tabView[i][j]->setVisible( true );
}
else
{
tabView[i][j]->setVisible( false );
}
}
}
}
//----------------------------------------------------------------------------
void ConsoleDebugger::moveTab( QWidget *w, int row, int column)
{
int idx = -1;
DebuggerTabWidget *p = NULL;
for (int i=0; i<2; i++)
{
for (int j=0; j<4; j++)
{
idx = tabView[i][j]->indexOf(w);
if ( idx >= 0 )
{
p = tabView[i][j]; break;
}
}
if (p) break;
}
if ( p )
{
QString txt = p->tabBar()->tabText( idx );
p->removeTab( idx );
tabView[column][row]->addTab(w, txt);
//printf("Move Widget %p to (%i,%i) %s\n", w, row, column, txt.toStdString().c_str() );
}
updateTabVisibility();
}
//----------------------------------------------------------------------------
void ConsoleDebugger::setCpuStatusFont( const QFont &font ) void ConsoleDebugger::setCpuStatusFont( const QFont &font )
{ {
QFontMetrics fm(font); QFontMetrics fm(font);
@ -2520,7 +2569,96 @@ void ConsoleDebugger::navHistForwardCB (void)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void ConsoleDebugger::setLayoutOption( int opt ) void ConsoleDebugger::setLayoutOption( int opt )
{ {
for (int i=0; i<2; i++)
{
for (int j=0; j<4; j++)
{
for (int k=0; k<tabView[i][j]->count(); k++)
{
tabView[i][j]->removeTab(k);
}
}
}
switch ( opt )
{
default:
case 1:
{
tabView[0][0]->addTab( cpuFrame, tr("CPU") );
tabView[0][0]->addTab( ppuFrame, tr("PPU") );
tabView[0][0]->addTab( bpFrame, tr("Breakpoints") );
tabView[0][0]->addTab( bmFrame, tr("BookMarks") );
tabView[0][0]->setVisible(true);
}
break;
case 2:
{
tabView[0][0]->addTab( cpuFrame, tr("CPU") );
tabView[0][0]->addTab( ppuFrame, tr("PPU") );
tabView[0][1]->addTab( bpFrame, tr("Breakpoints") );
tabView[0][1]->addTab( bmFrame, tr("BookMarks") );
tabView[0][0]->setVisible(true);
tabView[0][1]->setVisible(true);
QList <int> s = vsplitter[0]->sizes();
s[0] = tabView[0][0]->minimumSizeHint().height();
s[1] = vsplitter[0]->height() - s[0];
s[2] = 0;
s[3] = 0;
vsplitter[0]->setSizes(s);
}
break;
case 3:
{
tabView[0][0]->addTab( cpuFrame, tr("CPU") );
tabView[0][1]->addTab( ppuFrame, tr("PPU") );
tabView[1][0]->addTab( bpFrame, tr("Breakpoints") );
tabView[1][0]->addTab( bmFrame, tr("BookMarks") );
tabView[0][0]->setVisible(true);
tabView[0][1]->setVisible(true);
tabView[1][0]->setVisible(true);
QList <int> s = vsplitter[0]->sizes();
s[0] = vsplitter[0]->height() / 2;
s[1] = s[0];
s[2] = 0;
s[3] = 0;
vsplitter[0]->setSizes(s);
}
break;
case 4:
{
tabView[0][0]->addTab( cpuFrame, tr("CPU") );
tabView[0][1]->addTab( ppuFrame, tr("PPU") );
tabView[1][0]->addTab( bpFrame, tr("Breakpoints") );
tabView[1][1]->addTab( bmFrame, tr("BookMarks") );
tabView[0][0]->setVisible(true);
tabView[0][1]->setVisible(true);
tabView[1][0]->setVisible(true);
tabView[1][1]->setVisible(true);
QList <int> s = vsplitter[0]->sizes();
s[0] = vsplitter[0]->height() / 2;
s[1] = s[0];
s[2] = 0;
s[3] = 0;
vsplitter[0]->setSizes(s);
vsplitter[1]->setSizes(s);
}
break;
}
updateTabVisibility();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void ConsoleDebugger::seekPCCB (void) void ConsoleDebugger::seekPCCB (void)
@ -6261,7 +6399,7 @@ ppuRegPopup::~ppuRegPopup( void )
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
//--- Debugger Tabbed Data Display //--- Debugger Tabbed Data Display
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
DebuggerTabWidget::DebuggerTabWidget( QWidget *parent ) DebuggerTabWidget::DebuggerTabWidget( int row, int col, QWidget *parent )
: QTabWidget(parent) : QTabWidget(parent)
{ {
DebuggerTabBar *bar = new DebuggerTabBar(this); DebuggerTabBar *bar = new DebuggerTabBar(this);
@ -6271,6 +6409,9 @@ DebuggerTabWidget::DebuggerTabWidget( QWidget *parent )
setMouseTracking(true); setMouseTracking(true);
setAcceptDrops(true); setAcceptDrops(true);
_row = row;
_col = col;
setMovable(true); setMovable(true);
setUsesScrollButtons(true); setUsesScrollButtons(true);
@ -6339,19 +6480,20 @@ bool DebuggerTabWidget::indexValid(int idx)
void DebuggerTabWidget::dragEnterEvent(QDragEnterEvent *event) void DebuggerTabWidget::dragEnterEvent(QDragEnterEvent *event)
{ {
DebuggerTabBar *w = qobject_cast<DebuggerTabBar*>(event->source()); DebuggerTabBar *w = qobject_cast<DebuggerTabBar*>(event->source());
printf("Tab Widget Drag Enter Event: %p\n", w); //printf("Tab Widget Drag Enter Event: %p\n", w);
if ( (w != NULL) && (event->dropAction() == Qt::MoveAction) ) if ( (w != NULL) && (event->dropAction() == Qt::MoveAction) )
{ {
printf("Drag Action Accepted\n"); //printf("Drag Action Accepted\n");
event->acceptProposedAction(); event->acceptProposedAction();
} }
} }
//----------------------------------------------------------------------------
void DebuggerTabWidget::dropEvent(QDropEvent *event) void DebuggerTabWidget::dropEvent(QDropEvent *event)
{ {
DebuggerTabBar *bar = qobject_cast<DebuggerTabBar*>(event->source()); DebuggerTabBar *bar = qobject_cast<DebuggerTabBar*>(event->source());
printf("Tab Widget Drop Event: %p\n", bar); //printf("Tab Widget Drop Event: %p\n", bar);
if ( (bar != NULL) && (event->dropAction() == Qt::MoveAction) ) if ( (bar != NULL) && (event->dropAction() == Qt::MoveAction) )
{ {
@ -6367,17 +6509,80 @@ void DebuggerTabWidget::dropEvent(QDropEvent *event)
if ( w ) if ( w )
{ {
QString txt = bar->tabText(idx); QString txt = bar->tabText(idx);
printf("Removing Widget from Parent:%p %p %p %i\n", bar, p, w, idx); //printf("Removing Widget from Parent:%p %p %p %i\n", bar, p, w, idx);
p->removeTab( idx ); p->removeTab( idx );
addTab(w, txt); addTab(w, txt);
dbgWin->updateTabVisibility();
} }
} }
} }
//----------------------------------------------------------------------------
void DebuggerTabWidget::mouseMoveEvent(QMouseEvent * e) void DebuggerTabWidget::mouseMoveEvent(QMouseEvent * e)
{ {
//printf("TabWidget: (%i,%i) \n", e->pos().x(), e->pos().y() );; //printf("TabWidget: (%i,%i) \n", e->pos().x(), e->pos().y() );;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void DebuggerTabWidget::contextMenuEvent(QContextMenuEvent *event)
{
buildContextMenu(event);
}
//----------------------------------------------------------------------------
void DebuggerTabWidget::buildContextMenu(QContextMenuEvent *event)
{
int i,j;
QAction *act;
QActionGroup *group;
QMenu menu(this);
QMenu *moveMenu, *subMenu;
//printf("TabWidget Context\n");
moveMenu = menu.addMenu( tr("Move To") );
group = new QActionGroup(moveMenu);
group->setExclusive(true);
for (j=0; j<4; j++)
{
const char *vertText;
switch (j)
{
default:
case 0:
vertText = "Upper";
break;
case 1:
vertText = "Mid-Upper";
break;
case 2:
vertText = "Mid-Lower";
break;
case 3:
vertText = "Lower";
break;
}
subMenu = moveMenu->addMenu( tr(vertText) );
for (i=0; i<2; i++)
{
const char *horzText = i ? "Right" : "Left";
act = new QAction(tr(horzText), &menu);
subMenu->addAction(act);
group->addAction(act);
QWidget *w = widget( currentIndex() );
connect( act, &QAction::triggered, [w, j, i]{ dbgWin->ConsoleDebugger::moveTab( w, j, i ); } );
}
}
menu.exec(event->globalPos());
}
//----------------------------------------------------------------------------
void DebuggerTabWidget::popPage(QWidget *page) void DebuggerTabWidget::popPage(QWidget *page)
{ {
printf("Pop Page: %p\n", page); printf("Pop Page: %p\n", page);
@ -6426,7 +6631,7 @@ void DebuggerTabBar::mouseMoveEvent( QMouseEvent *event)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void DebuggerTabBar::mousePressEvent( QMouseEvent *event) void DebuggerTabBar::mousePressEvent( QMouseEvent *event)
{ {
//printf("TabBar Mouse Press: (%i,%i) \n", event->pos().x(), event->pos().y() );; printf("TabBar Mouse Press: (%i,%i) \n", event->pos().x(), event->pos().y() );;
QTabBar::mousePressEvent(event); QTabBar::mousePressEvent(event);
if ( (event->button() == Qt::LeftButton) && (currentIndex() >= 0) ) if ( (event->button() == Qt::LeftButton) && (currentIndex() >= 0) )
@ -6444,3 +6649,26 @@ void DebuggerTabBar::mouseReleaseEvent( QMouseEvent *event)
theDragOut = false; theDragOut = false;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void DebuggerTabBar::contextMenuEvent(QContextMenuEvent *event)
{
int idx;
idx = tabAt(event->pos());
if ( idx < 0 )
{
idx = currentIndex();
}
if ( idx != currentIndex() )
{
setCurrentIndex(idx);
}
DebuggerTabWidget *p = qobject_cast<DebuggerTabWidget*>(parent());
if ( p )
{
p->buildContextMenu(event);
}
}
//----------------------------------------------------------------------------

View File

@ -322,8 +322,7 @@ class DebuggerTabBar : public QTabBar
void mousePressEvent(QMouseEvent * event); void mousePressEvent(QMouseEvent * event);
void mouseReleaseEvent(QMouseEvent * event); void mouseReleaseEvent(QMouseEvent * event);
void mouseMoveEvent(QMouseEvent * event); void mouseMoveEvent(QMouseEvent * event);
//void dragEnterEvent(QDragEnterEvent *event); void contextMenuEvent(QContextMenuEvent *event);
//void dropEvent(QDropEvent *event);
private: private:
bool theDragPress; bool theDragPress;
bool theDragOut; bool theDragOut;
@ -336,17 +335,25 @@ class DebuggerTabWidget : public QTabWidget
Q_OBJECT Q_OBJECT
public: public:
DebuggerTabWidget( QWidget *parent = nullptr ); DebuggerTabWidget( int row, int col, QWidget *parent = nullptr );
~DebuggerTabWidget( void ); ~DebuggerTabWidget( void );
void popPage(QWidget *page); void popPage(QWidget *page);
bool indexValid(int idx); bool indexValid(int idx);
void buildContextMenu(QContextMenuEvent *event);
int row(void){ return _row; }
int col(void){ return _col; }
protected: protected:
void mouseMoveEvent(QMouseEvent * event); void mouseMoveEvent(QMouseEvent * event);
void dragEnterEvent(QDragEnterEvent *event); void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event); void dropEvent(QDropEvent *event);
void contextMenuEvent(QContextMenuEvent *event);
private: private:
DebuggerTabBar *bar; DebuggerTabBar *bar;
int _row;
int _col;
}; };
class ConsoleDebugger : public QDialog class ConsoleDebugger : public QDialog
@ -359,6 +366,7 @@ class ConsoleDebugger : public QDialog
void updateWindowData(void); void updateWindowData(void);
void updateRegisterView(void); void updateRegisterView(void);
void updateTabVisibility(void);
void breakPointNotify(int bpNum); void breakPointNotify(int bpNum);
void openBpEditWindow(int editIdx = -1, watchpointinfo *wp = NULL, bool forceAccept = false ); void openBpEditWindow(int editIdx = -1, watchpointinfo *wp = NULL, bool forceAccept = false );
void openDebugSymbolEditWindow( int addr ); void openDebugSymbolEditWindow( int addr );
@ -481,6 +489,7 @@ class ConsoleDebugger : public QDialog
void asmViewCtxMenuAddSym(void); void asmViewCtxMenuAddSym(void);
void asmViewCtxMenuOpenHexEdit(void); void asmViewCtxMenuOpenHexEdit(void);
void asmViewCtxMenuRunToCursor(void); void asmViewCtxMenuRunToCursor(void);
void moveTab( QWidget *w, int row, int column);
private slots: private slots:
void updatePeriodic(void); void updatePeriodic(void);
void hbarChanged(int value); void hbarChanged(int value);