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;
}
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
ScriptDocument* doc = findScriptWindow(script);
if (doc != nullptr) {
ui->mdiArea->setActiveSubWindow(doc);
doc->setFocus();
if (line > -1) doc->moveCursor(line);
return;
}
doc = new ScriptDocument(script);
doc->setAttribute(Qt::WA_DeleteOnClose, true);
if (line > -1) doc->moveCursor(line);
ui->mdiArea->addSubWindow(doc);
ui->mdiArea->setActiveSubWindow(doc);
doc->showMaximized();
doc->setFocus();
}
void MainWindow::closeScriptDocument(std::shared_ptr<Script> script) {

View file

@ -58,7 +58,7 @@ public:
GridSnappingMode snappingMode;
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 openFile(std::string path);

View file

@ -60,7 +60,7 @@ void OutputTextView::handleLog(Logger::LogLevel logLevel, std::string message, L
stackTraceScripts[id] = source.script;
format.setAnchor(true);
format.setAnchorHref(QString::number(id));
format.setAnchorHref(QString::number(id) + ":" + QString::number(source.line));
}
cursor.insertText(message.c_str(), format);
@ -72,11 +72,13 @@ void OutputTextView::mousePressEvent(QMouseEvent *e) {
QString anchor = anchorAt(e->pos());
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);
MainWindow* mainWnd = dynamic_cast<MainWindow*>(window());
mainWnd->openScriptDocument(script.lock());
mainWnd->openScriptDocument(script.lock(), line);
}
void OutputTextView::mouseReleaseEvent(QMouseEvent *e) {

View file

@ -179,6 +179,13 @@ ScriptDocument::ScriptDocument(std::shared_ptr<Script> script, QWidget* parent):
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* apis = new QsciAPIs(lexer);

View file

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