From 3e108c13f1f17d78a36564cf5577cf0d359a4db5 Mon Sep 17 00:00:00 2001 From: Igor Kolokolnikov Date: Sat, 20 Jun 2026 08:13:24 -0700 Subject: [PATCH 1/2] Add go to line dialog. --- kdbg/dbgmainwnd.cpp | 9 ++++++ kdbg/dbgmainwnd.h | 1 + kdbg/kdbgui.rc | 2 ++ kdbg/sourcewnd.cpp | 13 +++++++++ kdbg/sourcewnd.h | 1 + kdbg/winstack.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++ kdbg/winstack.h | 26 +++++++++++++++++ 7 files changed, 122 insertions(+) diff --git a/kdbg/dbgmainwnd.cpp b/kdbg/dbgmainwnd.cpp index ea92ef5f..35e4ceb4 100644 --- a/kdbg/dbgmainwnd.cpp +++ b/kdbg/dbgmainwnd.cpp @@ -276,6 +276,13 @@ void DebuggerMainWnd::initKAction() m_findAction = KStandardAction::find(m_filesWindow, SLOT(slotViewFind()), actionCollection()); KStandardAction::findNext(m_filesWindow, SLOT(slotFindForward()), actionCollection()); KStandardAction::findPrev(m_filesWindow, SLOT(slotFindBackward()), actionCollection()); + m_gotoLineAction = KStandardAction::gotoLine(m_filesWindow, &WinStack::slotViewGotoLine, actionCollection()); + /* + * Change KStandardAction::gotoLine's internal name to prevent + * auto-generation of the "Go to Line..." action under the "Go" menu + * despite specifying the position of "go_goto_line" in the '.rc' file. + */ + actionCollection()->addAction(QStringLiteral("view_goto_line"), m_gotoLineAction); struct { QWidget* w; const char* id; QAction** act; } dw[] = { { m_btWindow, "view_stack", &m_btWindowAction }, @@ -518,6 +525,8 @@ void DebuggerMainWnd::updateUI() { m_findAction->setChecked(m_filesWindow->m_findDlg.isVisible()); m_findAction->setEnabled(m_filesWindow->hasWindows()); + m_gotoLineAction->setChecked(m_filesWindow->m_gotoLineDlg.isVisible()); + m_gotoLineAction->setEnabled(m_filesWindow->hasWindows()); m_bpSetAction->setEnabled(m_debugger->canChangeBreakpoints()); m_bpSetTempAction->setEnabled(m_debugger->canChangeBreakpoints()); m_bpEnableAction->setEnabled(m_debugger->canChangeBreakpoints()); diff --git a/kdbg/dbgmainwnd.h b/kdbg/dbgmainwnd.h index 1616dfe1..ba0cac01 100644 --- a/kdbg/dbgmainwnd.h +++ b/kdbg/dbgmainwnd.h @@ -93,6 +93,7 @@ class DebuggerMainWnd : public KXmlGuiWindow QAction* m_coreDumpAction; QAction* m_settingsAction; QAction* m_findAction; + QAction* m_gotoLineAction; QAction* m_btWindowAction; QAction* m_localVariablesAction; QAction* m_watchesAction; diff --git a/kdbg/kdbgui.rc b/kdbg/kdbgui.rc index 2f2dd4b5..f015d0a0 100644 --- a/kdbg/kdbgui.rc +++ b/kdbg/kdbgui.rc @@ -13,6 +13,8 @@ + + diff --git a/kdbg/sourcewnd.cpp b/kdbg/sourcewnd.cpp index 1dd422ab..0e6ba4fa 100644 --- a/kdbg/sourcewnd.cpp +++ b/kdbg/sourcewnd.cpp @@ -349,6 +349,19 @@ void SourceWindow::find(const QString& text, bool caseSensitive, FindDirection d setTextCursor(cursor); } +bool SourceWindow::gotoLine(int lineNo) +{ + // line is zero-based + lineNo--; + + if (lineNo < 0 || lineNo >= int(m_sourceCode.size())) + return false; + + scrollToRow(lineToRow(lineNo)); + + return true; +} + void SourceWindow::infoMousePress(QMouseEvent* ev) { // we handle left and middle button diff --git a/kdbg/sourcewnd.h b/kdbg/sourcewnd.h index 78c05216..7a2e4482 100644 --- a/kdbg/sourcewnd.h +++ b/kdbg/sourcewnd.h @@ -35,6 +35,7 @@ class SourceWindow : public QPlainTextEdit void setPC(bool set, int lineNo, const DbgAddr& address, int frameNo); enum FindDirection { findForward = 1, findBackward = -1 }; void find(const QString& text, bool caseSensitive, FindDirection dir); + bool gotoLine(int lineNo); bool wordAtPoint(const QPoint& p, QString& word, QRect& r); /** * Translates row number (zero-based) to zero-based source line number. diff --git a/kdbg/winstack.cpp b/kdbg/winstack.cpp index 10b1dc3d..244085de 100644 --- a/kdbg/winstack.cpp +++ b/kdbg/winstack.cpp @@ -8,6 +8,7 @@ #include "sourcewnd.h" #include "dbgdriver.h" #include +#include #include #include #include @@ -31,6 +32,9 @@ WinStack::WinStack(QWidget* parent) : connect(&m_findDlg.m_buttonBackward, SIGNAL(clicked()), SLOT(slotFindBackward())); + connect(&m_gotoLineDlg.m_buttonOk, + &QPushButton::clicked, this, &WinStack::slotGotoLine); + connect(this, SIGNAL(setTabWidth(int)), this, SLOT(slotSetTabWidth(int))); connect(this, SIGNAL(tabCloseRequested(int)), this, SLOT(slotCloseTab(int))); @@ -245,6 +249,15 @@ void WinStack::slotFindBackward() SourceWindow::findBackward); } +void WinStack::slotGotoLine() +{ + if (activeWindow()) { + if (activeWindow()->gotoLine(m_gotoLineDlg.lineNumber())) { + m_gotoLineDlg.done(0); + } + } +} + bool WinStack::event(QEvent* evt) { if (evt->type() != QEvent::ToolTip) @@ -335,6 +348,15 @@ void WinStack::slotViewFind() } } +void WinStack::slotViewGotoLine() +{ + if (m_gotoLineDlg.isVisible()) { + m_gotoLineDlg.done(0); + } else { + m_gotoLineDlg.show(); + } +} + void WinStack::slotBrkptSet() { QString file; @@ -437,3 +459,51 @@ void FindDialog::done(int result) QDialog::done(result); Q_EMIT closed(); } + +GotoLineDialog::GotoLineDialog() : + QDialog(), + m_lineText(this), + m_buttonOk(this), + m_buttonClose(this) +{ + setWindowTitle(i18n("Go to Line")); + + m_lineText.setMinimumSize(330, 24); + m_lineText.setMaxLength(10000); + m_lineText.setFrame(true); + m_lineText.setFocus(); + + QIntValidator *validator = new QIntValidator(this); + validator->setBottom(1); + m_lineText.setValidator(validator); + + m_buttonOk.setText(i18n("OK")); + m_buttonOk.setDefault(true); + m_buttonClose.setText(i18n("Close")); + + connect(&m_buttonClose, &QPushButton::clicked, this, &QDialog::reject); + + m_layout.addWidget(&m_lineText); + m_layout.addLayout(&m_buttons); + + m_buttons.addWidget(&m_buttonOk); + m_buttons.addWidget(&m_buttonClose); + + setLayout(&m_layout); +} + +GotoLineDialog::~GotoLineDialog() +{ +} + +void GotoLineDialog::closeEvent(QCloseEvent* ev) +{ + QDialog::closeEvent(ev); + Q_EMIT closed(); +} + +void GotoLineDialog::done(int result) +{ + QDialog::done(result); + Q_EMIT closed(); +} diff --git a/kdbg/winstack.h b/kdbg/winstack.h index 5c80c382..528e2916 100644 --- a/kdbg/winstack.h +++ b/kdbg/winstack.h @@ -49,6 +49,29 @@ class FindDialog : public QDialog QHBoxLayout m_buttons; }; +class GotoLineDialog : public QDialog +{ + Q_OBJECT +public: + GotoLineDialog(); + ~GotoLineDialog(); + + int lineNumber() const { return m_lineText.text().toInt(); } + void done(int result) override; + + QLineEdit m_lineText; + QPushButton m_buttonOk; + QPushButton m_buttonClose; + +Q_SIGNALS: + void closed(); + +protected: + void closeEvent(QCloseEvent* ev) override; + QVBoxLayout m_layout; + QHBoxLayout m_buttons; +}; + class WinStack : public QTabWidget { @@ -84,6 +107,7 @@ class WinStack : public QTabWidget public Q_SLOTS: virtual void slotFindForward(); virtual void slotFindBackward(); + virtual void slotGotoLine(); virtual void activate(const QString& filename, int lineNo, const DbgAddr& address); void updatePC(const QString& filename, int lineNo, const DbgAddr& address, int frameNo); void reloadAllFiles(); @@ -92,6 +116,7 @@ public Q_SLOTS: void slotFileReload(); void slotViewFind(); + void slotViewGotoLine(); void slotBrkptSet(); void slotBrkptSetTemp(); void slotBrkptEnable(); @@ -137,6 +162,7 @@ public Q_SLOTS: public: // find dialog FindDialog m_findDlg; + GotoLineDialog m_gotoLineDlg; }; #endif // WINSTACK_H From 8d4d1e5d99fcbe6f65f75588c223c71dbfb34cf7 Mon Sep 17 00:00:00 2001 From: Igor Kolokolnikov Date: Sat, 20 Jun 2026 08:14:12 -0700 Subject: [PATCH 2/2] Focus and select text when go to line dialog appears. --- kdbg/winstack.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kdbg/winstack.cpp b/kdbg/winstack.cpp index 244085de..1bb1a547 100644 --- a/kdbg/winstack.cpp +++ b/kdbg/winstack.cpp @@ -354,6 +354,8 @@ void WinStack::slotViewGotoLine() m_gotoLineDlg.done(0); } else { m_gotoLineDlg.show(); + m_gotoLineDlg.m_lineText.setFocus(); + m_gotoLineDlg.m_lineText.selectAll(); } }