From 2ce2e5a8a3b9a1139d1d41f777dfbb65f56b3a67 Mon Sep 17 00:00:00 2001 From: Matthew Budd Date: Sat, 14 Nov 2020 13:42:43 -0500 Subject: [PATCH 1/4] Fixed wheel event scroll direction for custom QWidgets --- src/drivers/Qt/ConsoleDebugger.cpp | 4 ++-- src/drivers/Qt/HexEditor.cpp | 4 ++-- src/drivers/Qt/RamSearch.cpp | 4 ++-- src/drivers/Qt/TraceLogger.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/drivers/Qt/ConsoleDebugger.cpp b/src/drivers/Qt/ConsoleDebugger.cpp index 48629dff..93141c9a 100644 --- a/src/drivers/Qt/ConsoleDebugger.cpp +++ b/src/drivers/Qt/ConsoleDebugger.cpp @@ -3411,7 +3411,7 @@ void QAsmView::wheelEvent(QWheelEvent *event) if (!numPixels.isNull()) { - wheelPixelCounter += numPixels.y(); + wheelPixelCounter -= numPixels.y(); //printf("numPixels: (%i,%i) \n", numPixels.x(), numPixels.y() ); } else if (!numDegrees.isNull()) @@ -3419,7 +3419,7 @@ void QAsmView::wheelEvent(QWheelEvent *event) //QPoint numSteps = numDegrees / 15; //printf("numSteps: (%i,%i) \n", numSteps.x(), numSteps.y() ); //printf("numDegrees: (%i,%i) %i\n", numDegrees.x(), numDegrees.y(), pxLineSpacing ); - wheelPixelCounter += (pxLineSpacing * numDegrees.y()) / (15*8); + wheelPixelCounter -= (pxLineSpacing * numDegrees.y()) / (15*8); } //printf("Wheel Event: %i\n", wheelPixelCounter); diff --git a/src/drivers/Qt/HexEditor.cpp b/src/drivers/Qt/HexEditor.cpp index 2e6eb740..914b23ae 100644 --- a/src/drivers/Qt/HexEditor.cpp +++ b/src/drivers/Qt/HexEditor.cpp @@ -1787,7 +1787,7 @@ void QHexEdit::wheelEvent(QWheelEvent *event) if (!numPixels.isNull()) { - wheelPixelCounter += numPixels.y(); + wheelPixelCounter -= numPixels.y(); //printf("numPixels: (%i,%i) \n", numPixels.x(), numPixels.y() ); } else if (!numDegrees.isNull()) @@ -1795,7 +1795,7 @@ void QHexEdit::wheelEvent(QWheelEvent *event) //QPoint numSteps = numDegrees / 15; //printf("numSteps: (%i,%i) \n", numSteps.x(), numSteps.y() ); //printf("numDegrees: (%i,%i) %i\n", numDegrees.x(), numDegrees.y(), pxLineSpacing ); - wheelPixelCounter += (pxLineSpacing * numDegrees.y()) / (15*8); + wheelPixelCounter -= (pxLineSpacing * numDegrees.y()) / (15*8); } //printf("Wheel Event: %i\n", wheelPixelCounter); diff --git a/src/drivers/Qt/RamSearch.cpp b/src/drivers/Qt/RamSearch.cpp index 815cd252..664eae49 100644 --- a/src/drivers/Qt/RamSearch.cpp +++ b/src/drivers/Qt/RamSearch.cpp @@ -1673,7 +1673,7 @@ void QRamSearchView::wheelEvent(QWheelEvent *event) if (!numPixels.isNull()) { - wheelPixelCounter += numPixels.y(); + wheelPixelCounter -= numPixels.y(); //printf("numPixels: (%i,%i) \n", numPixels.x(), numPixels.y() ); } else if (!numDegrees.isNull()) @@ -1681,7 +1681,7 @@ void QRamSearchView::wheelEvent(QWheelEvent *event) //QPoint numSteps = numDegrees / 15; //printf("numSteps: (%i,%i) \n", numSteps.x(), numSteps.y() ); //printf("numDegrees: (%i,%i) %i\n", numDegrees.x(), numDegrees.y(), pxLineSpacing ); - wheelPixelCounter += (pxLineSpacing * numDegrees.y()) / (15*8); + wheelPixelCounter -= (pxLineSpacing * numDegrees.y()) / (15*8); } //printf("Wheel Event: %i\n", wheelPixelCounter); diff --git a/src/drivers/Qt/TraceLogger.cpp b/src/drivers/Qt/TraceLogger.cpp index 3017327b..f96b88bd 100644 --- a/src/drivers/Qt/TraceLogger.cpp +++ b/src/drivers/Qt/TraceLogger.cpp @@ -1137,7 +1137,7 @@ void QTraceLogView::wheelEvent(QWheelEvent *event) if (!numPixels.isNull()) { - wheelPixelCounter += numPixels.y(); + wheelPixelCounter -= numPixels.y(); //printf("numPixels: (%i,%i) \n", numPixels.x(), numPixels.y() ); } else if (!numDegrees.isNull()) @@ -1145,7 +1145,7 @@ void QTraceLogView::wheelEvent(QWheelEvent *event) //QPoint numSteps = numDegrees / 15; //printf("numSteps: (%i,%i) \n", numSteps.x(), numSteps.y() ); //printf("numDegrees: (%i,%i) %i\n", numDegrees.x(), numDegrees.y(), pxLineSpacing ); - wheelPixelCounter += (pxLineSpacing * numDegrees.y()) / (15*8); + wheelPixelCounter -= (pxLineSpacing * numDegrees.y()) / (15*8); } //printf("Wheel Event: %i\n", wheelPixelCounter); From e36f53609e4eb39ab607cb62b5dbe78d20faf5bd Mon Sep 17 00:00:00 2001 From: Matthew Budd Date: Sat, 14 Nov 2020 14:01:23 -0500 Subject: [PATCH 2/4] Added logic to clear QClipboard contents at program exit. This will prevent a momentary terminal X11 hang and following error message "QClipboard: Unable to receive an event from the clipboard manager in a reasonable time" --- src/drivers/Qt/ConsoleWindow.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/drivers/Qt/ConsoleWindow.cpp b/src/drivers/Qt/ConsoleWindow.cpp index 7a59d4ae..cbaed837 100644 --- a/src/drivers/Qt/ConsoleWindow.cpp +++ b/src/drivers/Qt/ConsoleWindow.cpp @@ -103,6 +103,8 @@ consoleWin_t::consoleWin_t(QWidget *parent) consoleWin_t::~consoleWin_t(void) { + QClipboard *clipboard; + nes_shm->runEmulator = 0; gameTimer->stop(); @@ -132,6 +134,18 @@ consoleWin_t::~consoleWin_t(void) g_config->setOption ("SDL.NetworkIP", ""); g_config->save (); + // Clear Clipboard Contents on Program Exit + clipboard = QGuiApplication::clipboard(); + + if ( clipboard->ownsClipboard() ) + { + clipboard->clear( QClipboard::Clipboard ); + } + if ( clipboard->ownsSelection() ) + { + clipboard->clear( QClipboard::Selection ); + } + if ( this == consoleWindow ) { consoleWindow = NULL; From 0d6f5e567e6e309b04126b6afa9b91249eb23cc5 Mon Sep 17 00:00:00 2001 From: Matthew Budd Date: Sat, 14 Nov 2020 14:35:11 -0500 Subject: [PATCH 3/4] Minor changes to Qt debugger window to allow for it to be more compact. --- src/drivers/Qt/ConsoleDebugger.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/drivers/Qt/ConsoleDebugger.cpp b/src/drivers/Qt/ConsoleDebugger.cpp index 93141c9a..b70d352e 100644 --- a/src/drivers/Qt/ConsoleDebugger.cpp +++ b/src/drivers/Qt/ConsoleDebugger.cpp @@ -87,6 +87,8 @@ ConsoleDebugger::ConsoleDebugger(QWidget *parent) asmLineSelLbl = new QLabel( tr("Line Select") ); emuStatLbl = new QLabel( tr("Emulator is Running") ); + asmLineSelLbl->setWordWrap( true ); + asmView->setScrollBars( hbar, vbar ); grid->addWidget( asmView, 0, 0 ); @@ -2046,7 +2048,7 @@ void QAsmView::updateAssemblyView(void) pxLineWidth = maxLineLen * pxCharWidth; - setMinimumWidth( pxLineWidth ); + setMinimumWidth( 50 * pxCharWidth ); vbar->setMaximum( asmEntry.size() ); } @@ -3137,7 +3139,7 @@ void QAsmView::mouseMoveEvent(QMouseEvent * event) { fileName = "..."; } - sprintf( txt, ", Offset 0x%06X in File \"%s\" (NL file: %X)", romOfs, fileName, bank); + sprintf( txt, "\nOffset 0x%06X in File \"%s\" (NL file: %X)", romOfs, fileName, bank); s.append( txt ); } From 13ea28dad485dd59df21596eff7bbdab9d16666d Mon Sep 17 00:00:00 2001 From: Matthew Budd Date: Sat, 14 Nov 2020 14:56:57 -0500 Subject: [PATCH 4/4] Added window menu to Qt debugger and shortcuts for debug execution control buttons. --- src/drivers/Qt/ConsoleDebugger.cpp | 124 ++++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 2 deletions(-) diff --git a/src/drivers/Qt/ConsoleDebugger.cpp b/src/drivers/Qt/ConsoleDebugger.cpp index b70d352e..46175299 100644 --- a/src/drivers/Qt/ConsoleDebugger.cpp +++ b/src/drivers/Qt/ConsoleDebugger.cpp @@ -15,6 +15,9 @@ #include #include #include +#include +#include +#include #include #include "../../types.h" @@ -62,9 +65,12 @@ ConsoleDebugger::ConsoleDebugger(QWidget *parent) QPushButton *button; QFrame *frame; QLabel *lbl; + QMenuBar *menuBar; + QMenu *debugMenu; + QAction *act; float fontCharWidth; QTreeWidgetItem * item; - int opt; + int opt, useNativeMenuBar; font.setFamily("Courier New"); font.setStyle( QFont::StyleNormal ); @@ -76,9 +82,75 @@ ConsoleDebugger::ConsoleDebugger(QWidget *parent) setWindowTitle("6502 Debugger"); //resize( 512, 512 ); + + menuBar = new QMenuBar(this); + // This is needed for menu bar to show up on MacOS + g_config->getOption( "SDL.UseNativeMenuBar", &useNativeMenuBar ); + + menuBar->setNativeMenuBar( useNativeMenuBar ? true : false ); + + //----------------------------------------------------------------------- + // Menu Start + //----------------------------------------------------------------------- + // Debug + debugMenu = menuBar->addMenu(tr("Debug")); + + // Debug -> Run + act = new QAction(tr("Run"), this); + act->setShortcut(QKeySequence( tr("F5") ) ); + act->setStatusTip(tr("Run")); + connect( act, SIGNAL(triggered()), this, SLOT(debugRunCB(void)) ); + + debugMenu->addAction(act); + + // Debug -> Step Into + act = new QAction(tr("Step Into"), this); + act->setShortcut(QKeySequence( tr("F11") ) ); + act->setStatusTip(tr("Step Into")); + connect( act, SIGNAL(triggered()), this, SLOT(debugStepIntoCB(void)) ); + + debugMenu->addAction(act); + + // Debug -> Step Out + act = new QAction(tr("Step Out"), this); + act->setShortcut(QKeySequence( tr("Shift+F11") ) ); + act->setStatusTip(tr("Step Out")); + connect( act, SIGNAL(triggered()), this, SLOT(debugStepOutCB(void)) ); + + debugMenu->addAction(act); + + // Debug -> Step Over + act = new QAction(tr("Step Over"), this); + act->setShortcut(QKeySequence( tr("F10") ) ); + act->setStatusTip(tr("Step Over")); + connect( act, SIGNAL(triggered()), this, SLOT(debugStepOverCB(void)) ); + + debugMenu->addAction(act); + + // Debug -> Run Line + act = new QAction(tr("Run Line"), this); + act->setShortcut(QKeySequence( tr("F6") ) ); + act->setStatusTip(tr("Run Line")); + connect( act, SIGNAL(triggered()), this, SLOT(debugRunLineCB(void)) ); + + debugMenu->addAction(act); + + // Debug -> Run 128 Lines + act = new QAction(tr("Run 128 Lines"), this); + act->setShortcut(QKeySequence( tr("F7") ) ); + act->setStatusTip(tr("Run 128 Lines")); + connect( act, SIGNAL(triggered()), this, SLOT(debugRunLine128CB(void)) ); + + debugMenu->addAction(act); + + //----------------------------------------------------------------------- + // Menu End + //----------------------------------------------------------------------- mainLayout = new QHBoxLayout(); + mainLayout->setMenuBar( menuBar ); + vbox4 = new QVBoxLayout(); grid = new QGridLayout(); asmView = new QAsmView(this); @@ -2974,25 +3046,73 @@ void QAsmView::resizeEvent(QResizeEvent *event) void QAsmView::keyPressEvent(QKeyEvent *event) { //printf("Debug ASM Window Key Press: 0x%x \n", event->key() ); - if ( selAddrValue >= 0 ) + if (event->matches(QKeySequence::MoveToPreviousLine)) + { + lineOffset--; + + if ( lineOffset < 0 ) + { + lineOffset = 0; + } + vbar->setValue( lineOffset ); + event->accept(); + } + else if (event->matches(QKeySequence::MoveToNextLine)) + { + lineOffset++; + + if ( lineOffset > maxLineOffset ) + { + lineOffset = maxLineOffset; + } + vbar->setValue( lineOffset ); + event->accept(); + } + else if (event->matches(QKeySequence::MoveToNextPage)) + { + lineOffset += ( (3 * viewLines) / 4); + + if ( lineOffset >= maxLineOffset ) + { + lineOffset = maxLineOffset; + } + vbar->setValue( lineOffset ); + event->accept(); + } + else if (event->matches(QKeySequence::MoveToPreviousPage)) + { + lineOffset -= ( (3 * viewLines) / 4); + + if ( lineOffset < 0 ) + { + lineOffset = 0; + } + vbar->setValue( lineOffset ); + event->accept(); + } + else if ( selAddrValue >= 0 ) { ctxMenuAddr = selAddrValue; if ( event->key() == Qt::Key_B ) { parent->asmViewCtxMenuAddBP(); + event->accept(); } else if ( event->key() == Qt::Key_S ) { parent->asmViewCtxMenuAddSym(); + event->accept(); } else if ( event->key() == Qt::Key_M ) { parent->asmViewCtxMenuAddBM(); + event->accept(); } else if ( event->key() == Qt::Key_H ) { parent->asmViewCtxMenuOpenHexEdit(); + event->accept(); } } }