- implement: context menu for debug console

- fix: errors in debug console
 - fix: speed up the parsing process of debugger
This commit is contained in:
royqh1979@gmail.com 2021-10-02 17:01:08 +08:00
parent 8ebe9174bb
commit 25070cc491
8 changed files with 155 additions and 5 deletions

View File

@ -21,6 +21,9 @@ Version 0.3.0
- enhancement: use up/down key to navigate function parameter tooltip - enhancement: use up/down key to navigate function parameter tooltip
- enhancement: press esc to close function parameter tooltip - enhancement: press esc to close function parameter tooltip
- enhancement: code suggestion for unicode identifiers - enhancement: code suggestion for unicode identifiers
- implement: context menu for debug console
- fix: errors in debug console
- fix: speed up the parsing process of debugger
Version 0.2.1 Version 0.2.1
- fix: crash when load last opens - fix: crash when load last opens

View File

@ -1665,7 +1665,7 @@ void DebugReader::run()
} else if (!mCmdRunning && readed.isEmpty()){ } else if (!mCmdRunning && readed.isEmpty()){
runNextCmd(); runNextCmd();
} else if (readed.isEmpty()){ } else if (readed.isEmpty()){
msleep(100); msleep(1);
} }
} }
if (errorOccurred) { if (errorOccurred) {

View File

@ -1338,6 +1338,9 @@ void MainWindow::prepareDebugger()
// Clear logs // Clear logs
ui->debugConsole->clear(); ui->debugConsole->clear();
if (!pSettings->debugger().showCommandLog()) {
ui->debugConsole->addLine("(gdb) ");
}
ui->txtEvalOutput->clear(); ui->txtEvalOutput->clear();
// Restore when no watch vars are shown // Restore when no watch vars are shown
@ -1539,6 +1542,51 @@ void MainWindow::buildContextMenus()
connect(ui->watchView,&QWidget::customContextMenuRequested, connect(ui->watchView,&QWidget::customContextMenuRequested,
this, &MainWindow::onWatchViewContextMenu); this, &MainWindow::onWatchViewContextMenu);
//context menu signal for the watch view
ui->debugConsole->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->debugConsole,&QWidget::customContextMenuRequested,
this, &MainWindow::onDebugConsoleContextMenu);
mDebugConsole_ShowCommandLog = createActionFor(
tr("Show debug logs in the debug console"),
ui->debugConsole);
mDebugConsole_ShowCommandLog->setCheckable(true);
connect(mDebugConsole_ShowCommandLog, &QAction::toggled,
[this]() {
pSettings->debugger().setShowCommandLog(mDebugConsole_ShowCommandLog->isChecked());
pSettings->debugger().save();
});
mDebugConsole_Copy=createActionFor(
tr("Copy"),
ui->debugConsole,
QKeySequence("Ctrl+C"));
connect(mDebugConsole_Copy, &QAction::triggered,
[this]() {
ui->debugConsole->copy();
});
mDebugConsole_Paste=createActionFor(
tr("Paste"),
ui->debugConsole,
QKeySequence("Ctrl+V"));
connect(mDebugConsole_Paste, &QAction::triggered,
[this]() {
ui->debugConsole->paste();
});
mDebugConsole_SelectAll=createActionFor(
tr("Select All"),
ui->debugConsole,
QKeySequence("Ctrl+A"));
connect(mDebugConsole_SelectAll, &QAction::triggered,
[this]() {
ui->debugConsole->selectAll();
});
mDebugConsole_Clear=createActionFor(
tr("Clear"),
ui->debugConsole);
connect(mDebugConsole_Clear, &QAction::triggered,
[this]() {
ui->debugConsole->clear();
});
//context menu signal for Editor's tabbar //context menu signal for Editor's tabbar
ui->EditorTabsLeft->tabBar()->setContextMenuPolicy(Qt::CustomContextMenu); ui->EditorTabsLeft->tabBar()->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->EditorTabsLeft->tabBar(),&QWidget::customContextMenuRequested, connect(ui->EditorTabsLeft->tabBar(),&QWidget::customContextMenuRequested,
@ -2051,6 +2099,23 @@ void MainWindow::onClassBrowserContextMenu(const QPoint &pos)
menu.exec(ui->projectView->mapToGlobal(pos)); menu.exec(ui->projectView->mapToGlobal(pos));
} }
void MainWindow::onDebugConsoleContextMenu(const QPoint &pos)
{
QMenu menu(this);
bool oldBlock = mDebugConsole_ShowCommandLog->blockSignals(true);
mDebugConsole_ShowCommandLog->setChecked(pSettings->debugger().showCommandLog());
mDebugConsole_ShowCommandLog->blockSignals(oldBlock);
menu.addAction(mDebugConsole_Copy);
menu.addAction(mDebugConsole_Paste);
menu.addAction(mDebugConsole_SelectAll);
menu.addAction(mDebugConsole_Clear);
menu.addSeparator();
menu.addAction(mDebugConsole_ShowCommandLog);
menu.exec(ui->debugConsole->mapToGlobal(pos));
}
void MainWindow::onEditorContextMenu(const QPoint &pos) void MainWindow::onEditorContextMenu(const QPoint &pos)
{ {
Editor * editor = mEditorList->getEditor(); Editor * editor = mEditorList->getEditor();
@ -2655,7 +2720,7 @@ void MainWindow::cleanUpCPUDialog()
void MainWindow::onDebugCommandInput(const QString &command) void MainWindow::onDebugCommandInput(const QString &command)
{ {
if (mDebugger->executing()) { if (mDebugger->executing()) {
mDebugger->sendCommand(command,""); mDebugger->sendCommand(command,"",true,true);
} }
} }

View File

@ -175,6 +175,7 @@ private slots:
void onBreakpointsViewContextMenu(const QPoint& pos); void onBreakpointsViewContextMenu(const QPoint& pos);
void onProjectViewContextMenu(const QPoint& pos); void onProjectViewContextMenu(const QPoint& pos);
void onClassBrowserContextMenu(const QPoint& pos); void onClassBrowserContextMenu(const QPoint& pos);
void onDebugConsoleContextMenu(const QPoint& pos);
void on_actionNew_triggered(); void on_actionNew_triggered();
@ -432,6 +433,13 @@ private:
QAction * mClassBrowser_goto_definition; QAction * mClassBrowser_goto_definition;
QWidget * mClassBrowserToolbar; QWidget * mClassBrowserToolbar;
//action for debug console
QAction * mDebugConsole_ShowCommandLog;
QAction * mDebugConsole_Clear;
QAction * mDebugConsole_Copy;
QAction * mDebugConsole_Paste;
QAction * mDebugConsole_SelectAll;
// QWidget interface // QWidget interface
protected: protected:
void closeEvent(QCloseEvent *event) override; void closeEvent(QCloseEvent *event) override;

View File

@ -2,9 +2,9 @@
#include <QObject> #include <QObject>
#include <memory> #include <memory>
#include <QMap> #include <QMap>
#ifdef Q_OS_WIN
#include <QSet> #include <QSet>
#ifdef Q_OS_WIN
#include <windows.h> #include <windows.h>
#endif #endif

View File

@ -569,7 +569,11 @@ void CodeCompletionPopup::getCompletionFor(const QString &fileName, const QStrin
} }
PStatement parentTypeStatement; PStatement parentTypeStatement;
PStatement statement = mParser->findStatementOf( PStatement statement = mParser->findStatementOf(
fileName, scopeName,mCurrentStatement,parentTypeStatement); fileName,
scopeName,
mCurrentStatement,
parentTypeStatement);
if (!statement) if (!statement)
return; return;
// find the most inner scope statement that has a name (not a block) // find the most inner scope statement that has a name (not a block)

View File

@ -11,6 +11,7 @@
#include <QDebug> #include <QDebug>
#include <QTimer> #include <QTimer>
#include <QApplication> #include <QApplication>
#include <QClipboard>
#include "../utils.h" #include "../utils.h"
QConsole::QConsole(QWidget *parent): QConsole::QConsole(QWidget *parent):
@ -180,6 +181,63 @@ void QConsole::clear()
mSelectionBegin = {0,0}; mSelectionBegin = {0,0};
mSelectionEnd = {0,0}; mSelectionEnd = {0,0};
mCaretChar = 0; mCaretChar = 0;
updateScrollbars();
}
void QConsole::copy()
{
if (!this->hasSelection())
return;
QString s = selText();
QClipboard* clipboard=QGuiApplication::clipboard();
clipboard->clear();
clipboard->setText(s);
}
void QConsole::paste()
{
if (mReadonly)
return;
QClipboard* clipboard=QGuiApplication::clipboard();
textInputed(clipboard->text());
}
void QConsole::selectAll()
{
if (mContents.lines()>0) {
mSelectionBegin = {1,1};
mSelectionEnd = { mContents.getLastLine().length()+1,mContents.lines()};
}
}
QString QConsole::selText()
{
if (!hasSelection())
return "";
int ColFrom = selectionBegin().ch;
int First = selectionBegin().line;
int ColTo = selectionEnd().ch;
int Last = selectionEnd().line;
if (First == Last) {
QString s = mContents.getLine(First);
if (First == mContents.lines()) {
s += this->mCommand;
}
return s.mid(ColFrom, ColTo - ColFrom);
} else {
QString result = mContents.getLine(First).mid(ColFrom);
result+= lineBreak();
for (int i = First + 1; i<=Last - 1; i++) {
result += mContents.getLine(i);
result+= lineBreak();
}
QString s = mContents.getLine(Last);
if (Last == mContents.lines())
s+= this->mCommand;
result += s.leftRef(ColTo);
return result;
}
} }
void QConsole::recalcCharExtent() { void QConsole::recalcCharExtent() {
@ -645,6 +703,7 @@ void QConsole::paintEvent(QPaintEvent *event)
//Get the invalidated rect. //Get the invalidated rect.
QRect rcClip = event->rect(); QRect rcClip = event->rect();
QRect rcCaret= getCaretRect(); QRect rcCaret= getCaretRect();
if (rcCaret == rcClip) { if (rcCaret == rcClip) {
// only update caret // only update caret
painter.drawImage(rcCaret,*mContentImage,rcCaret); painter.drawImage(rcCaret,*mContentImage,rcCaret);
@ -656,6 +715,7 @@ void QConsole::paintEvent(QPaintEvent *event)
nL2 = std::min(std::max(mTopRow + (rcClip.bottom() + mRowHeight - 1) / mRowHeight, 1), maxScrollHeight() + mRowsInWindow - 1); nL2 = std::min(std::max(mTopRow + (rcClip.bottom() + mRowHeight - 1) / mRowHeight, 1), maxScrollHeight() + mRowsInWindow - 1);
QPainter cachePainter(mContentImage.get()); QPainter cachePainter(mContentImage.get());
cachePainter.setFont(font()); cachePainter.setFont(font());
painter.fillRect(rcClip,mBackground);
paintRows(cachePainter,nL1,nL2); paintRows(cachePainter,nL1,nL2);
painter.drawImage(rcClip,*mContentImage,rcClip); painter.drawImage(rcClip,*mContentImage,rcClip);
} }
@ -841,6 +901,11 @@ RowColumn QConsole::pixelsToNearestRowColumn(int x, int y)
}; };
} }
QString QConsole::lineBreak()
{
return "\r\n";
}
void QConsole::fontChanged() void QConsole::fontChanged()
{ {

View File

@ -115,6 +115,10 @@ public:
void changeLastLine(const QString& line); void changeLastLine(const QString& line);
QString getLastLine(); QString getLastLine();
void clear(); void clear();
void copy();
void paste();
void selectAll();
QString selText();
signals: signals:
void commandInput(const QString& command); void commandInput(const QString& command);
@ -180,6 +184,7 @@ private:
bool hasSelection(); bool hasSelection();
int computeScrollY(int Y); int computeScrollY(int Y);
RowColumn pixelsToNearestRowColumn(int x,int y); RowColumn pixelsToNearestRowColumn(int x,int y);
QString lineBreak();
private slots: private slots: