feat(editor): click on stack trace to go to line in script

This commit is contained in:
maelstrom 2025-07-12 11:20:31 +02:00
parent fcf4343509
commit 41c5b74527
5 changed files with 19 additions and 5 deletions

View file

@ -610,19 +610,23 @@ ScriptDocument* MainWindow::findScriptWindow(std::shared_ptr<Script> script) {
return nullptr; return nullptr;
} }
void MainWindow::openScriptDocument(std::shared_ptr<Script> script) { void MainWindow::openScriptDocument(std::shared_ptr<Script> script, int line) {
// Document already exists, don't open it // Document already exists, don't open it
ScriptDocument* doc = findScriptWindow(script); ScriptDocument* doc = findScriptWindow(script);
if (doc != nullptr) { if (doc != nullptr) {
ui->mdiArea->setActiveSubWindow(doc); ui->mdiArea->setActiveSubWindow(doc);
doc->setFocus();
if (line > -1) doc->moveCursor(line);
return; return;
} }
doc = new ScriptDocument(script); doc = new ScriptDocument(script);
doc->setAttribute(Qt::WA_DeleteOnClose, true); doc->setAttribute(Qt::WA_DeleteOnClose, true);
if (line > -1) doc->moveCursor(line);
ui->mdiArea->addSubWindow(doc); ui->mdiArea->addSubWindow(doc);
ui->mdiArea->setActiveSubWindow(doc); ui->mdiArea->setActiveSubWindow(doc);
doc->showMaximized(); doc->showMaximized();
doc->setFocus();
} }
void MainWindow::closeScriptDocument(std::shared_ptr<Script> script) { void MainWindow::closeScriptDocument(std::shared_ptr<Script> script) {

View file

@ -58,7 +58,7 @@ public:
GridSnappingMode snappingMode; GridSnappingMode snappingMode;
bool editSoundEffects = true; bool editSoundEffects = true;
void openScriptDocument(std::shared_ptr<Script>); void openScriptDocument(std::shared_ptr<Script>, int line = -1);
void closeScriptDocument(std::shared_ptr<Script>); void closeScriptDocument(std::shared_ptr<Script>);
void openFile(std::string path); void openFile(std::string path);

View file

@ -60,7 +60,7 @@ void OutputTextView::handleLog(Logger::LogLevel logLevel, std::string message, L
stackTraceScripts[id] = source.script; stackTraceScripts[id] = source.script;
format.setAnchor(true); format.setAnchor(true);
format.setAnchorHref(QString::number(id)); format.setAnchorHref(QString::number(id) + ":" + QString::number(source.line));
} }
cursor.insertText(message.c_str(), format); cursor.insertText(message.c_str(), format);
@ -72,11 +72,13 @@ void OutputTextView::mousePressEvent(QMouseEvent *e) {
QString anchor = anchorAt(e->pos()); QString anchor = anchorAt(e->pos());
if (anchor == "" || e->modifiers() & Qt::AltModifier) return QTextEdit::mousePressEvent(e); if (anchor == "" || e->modifiers() & Qt::AltModifier) return QTextEdit::mousePressEvent(e);
auto script = stackTraceScripts[anchor.toInt()]; int idx = anchor.indexOf(":");
int id = anchor.mid(0, idx).toInt(), line = anchor.mid(idx+1).toInt();
auto script = stackTraceScripts[id];
if (script.expired()) return QTextEdit::mousePressEvent(e); if (script.expired()) return QTextEdit::mousePressEvent(e);
MainWindow* mainWnd = dynamic_cast<MainWindow*>(window()); MainWindow* mainWnd = dynamic_cast<MainWindow*>(window());
mainWnd->openScriptDocument(script.lock()); mainWnd->openScriptDocument(script.lock(), line);
} }
void OutputTextView::mouseReleaseEvent(QMouseEvent *e) { void OutputTextView::mouseReleaseEvent(QMouseEvent *e) {

View file

@ -179,6 +179,13 @@ ScriptDocument::ScriptDocument(std::shared_ptr<Script> script, QWidget* parent):
ScriptDocument::~ScriptDocument() { ScriptDocument::~ScriptDocument() {
} }
void ScriptDocument::moveCursor(int line) {
if (line == -1) return;
int lineLength = scintilla->lineLength(line-1);
scintilla->setCursorPosition(line-1, lineLength-1);
}
QsciAPIs* makeApis(QsciLexer* lexer) { QsciAPIs* makeApis(QsciLexer* lexer) {
QsciAPIs* apis = new QsciAPIs(lexer); QsciAPIs* apis = new QsciAPIs(lexer);

View file

@ -17,4 +17,5 @@ public:
~ScriptDocument() override; ~ScriptDocument() override;
inline std::shared_ptr<Script> getScript() { return script; } inline std::shared_ptr<Script> getScript() { return script; }
void moveCursor(int line);
}; };