mirror of
https://github.com/rizinorg/cutter.git
synced 2024-12-24 05:45:27 +00:00
Keep scroll history in decompiler widget. (#3177)
* Keep scroll history in decompiler widget. This commit adds a `scrollHistory` on top of the rizin-managed history, that keeps track of the scroll position within decompiled functions. * Fix clearing history upon init.
This commit is contained in:
parent
f1a421c9f6
commit
a6a7667852
@ -26,8 +26,7 @@ DecompilerWidget::DecompilerWidget(MainWindow *main)
|
|||||||
ui(new Ui::DecompilerWidget),
|
ui(new Ui::DecompilerWidget),
|
||||||
decompilerBusy(false),
|
decompilerBusy(false),
|
||||||
seekFromCursor(false),
|
seekFromCursor(false),
|
||||||
scrollerHorizontal(0),
|
historyPos(0),
|
||||||
scrollerVertical(0),
|
|
||||||
previousFunctionAddr(RVA_INVALID),
|
previousFunctionAddr(RVA_INVALID),
|
||||||
decompiledFunctionAddr(RVA_INVALID),
|
decompiledFunctionAddr(RVA_INVALID),
|
||||||
code(Decompiler::makeWarning(tr("Choose an offset and refresh to get decompiled code")),
|
code(Decompiler::makeWarning(tr("Choose an offset and refresh to get decompiled code")),
|
||||||
@ -311,13 +310,6 @@ QTextCursor DecompilerWidget::getCursorForAddress(RVA addr)
|
|||||||
|
|
||||||
void DecompilerWidget::decompilationFinished(RzAnnotatedCode *codeDecompiled)
|
void DecompilerWidget::decompilationFinished(RzAnnotatedCode *codeDecompiled)
|
||||||
{
|
{
|
||||||
bool isDisplayReset = false;
|
|
||||||
if (previousFunctionAddr == decompiledFunctionAddr) {
|
|
||||||
scrollerHorizontal = ui->textEdit->horizontalScrollBar()->sliderPosition();
|
|
||||||
scrollerVertical = ui->textEdit->verticalScrollBar()->sliderPosition();
|
|
||||||
isDisplayReset = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->progressLabel->setVisible(false);
|
ui->progressLabel->setVisible(false);
|
||||||
ui->decompilerComboBox->setEnabled(decompilerSelectionEnabled);
|
ui->decompilerComboBox->setEnabled(decompilerSelectionEnabled);
|
||||||
|
|
||||||
@ -354,10 +346,8 @@ void DecompilerWidget::decompilationFinished(RzAnnotatedCode *codeDecompiled)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDisplayReset) {
|
ui->textEdit->horizontalScrollBar()->setSliderPosition(scrollHistory[historyPos].first);
|
||||||
ui->textEdit->horizontalScrollBar()->setSliderPosition(scrollerHorizontal);
|
ui->textEdit->verticalScrollBar()->setSliderPosition(scrollHistory[historyPos].second);
|
||||||
ui->textEdit->verticalScrollBar()->setSliderPosition(scrollerVertical);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DecompilerWidget::setAnnotationsAtCursor(size_t pos)
|
void DecompilerWidget::setAnnotationsAtCursor(size_t pos)
|
||||||
@ -416,11 +406,28 @@ void DecompilerWidget::cursorPositionChanged()
|
|||||||
updateSelection();
|
updateSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DecompilerWidget::seekChanged()
|
void DecompilerWidget::seekChanged(RVA /* addr */, CutterCore::SeekHistoryType type)
|
||||||
{
|
{
|
||||||
if (seekFromCursor) {
|
if (seekFromCursor) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!scrollHistory.empty()) { // History is empty upon init.
|
||||||
|
scrollHistory[historyPos] = { ui->textEdit->horizontalScrollBar()->sliderPosition(),
|
||||||
|
ui->textEdit->verticalScrollBar()->sliderPosition() };
|
||||||
|
}
|
||||||
|
if (type == CutterCore::SeekHistoryType::New) {
|
||||||
|
// Erase previous history past this point.
|
||||||
|
if (scrollHistory.size() > historyPos + 1) {
|
||||||
|
scrollHistory.erase(scrollHistory.begin() + historyPos + 1, scrollHistory.end());
|
||||||
|
}
|
||||||
|
scrollHistory.push_back({ 0, 0 });
|
||||||
|
historyPos = scrollHistory.size() - 1;
|
||||||
|
} else if (type == CutterCore::SeekHistoryType::Undo) {
|
||||||
|
--historyPos;
|
||||||
|
} else if (type == CutterCore::SeekHistoryType::Redo) {
|
||||||
|
++historyPos;
|
||||||
|
}
|
||||||
RVA fcnAddr = Core()->getFunctionStart(seekable->getOffset());
|
RVA fcnAddr = Core()->getFunctionStart(seekable->getOffset());
|
||||||
if (fcnAddr == RVA_INVALID || fcnAddr != decompiledFunctionAddr) {
|
if (fcnAddr == RVA_INVALID || fcnAddr != decompiledFunctionAddr) {
|
||||||
doRefresh();
|
doRefresh();
|
||||||
|
@ -53,7 +53,7 @@ private slots:
|
|||||||
* - Seek changed to an offset contained in the decompiled function.
|
* - Seek changed to an offset contained in the decompiled function.
|
||||||
* - Auto-refresh is disabled.
|
* - Auto-refresh is disabled.
|
||||||
*/
|
*/
|
||||||
void seekChanged();
|
void seekChanged(RVA /* addr */, CutterCore::SeekHistoryType type);
|
||||||
void decompilationFinished(RzAnnotatedCode *code);
|
void decompilationFinished(RzAnnotatedCode *code);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -72,8 +72,8 @@ private:
|
|||||||
bool decompilerBusy;
|
bool decompilerBusy;
|
||||||
|
|
||||||
bool seekFromCursor;
|
bool seekFromCursor;
|
||||||
int scrollerHorizontal;
|
int historyPos;
|
||||||
int scrollerVertical;
|
QVector<QPair<int, int>> scrollHistory;
|
||||||
RVA previousFunctionAddr;
|
RVA previousFunctionAddr;
|
||||||
RVA decompiledFunctionAddr;
|
RVA decompiledFunctionAddr;
|
||||||
std::unique_ptr<RzAnnotatedCode, void (*)(RzAnnotatedCode *)> code;
|
std::unique_ptr<RzAnnotatedCode, void (*)(RzAnnotatedCode *)> code;
|
||||||
|
Loading…
Reference in New Issue
Block a user