diff --git a/src/cutter.cpp b/src/cutter.cpp index b532a2b5..d9f27c9c 100644 --- a/src/cutter.cpp +++ b/src/cutter.cpp @@ -849,7 +849,7 @@ void CutterCore::setSettings() //setConfig("bin.rawstr", "true"); // Colors - setConfig("scr.color", true); + setConfig("scr.color", false); setConfig("scr.truecolor", false); } diff --git a/src/cutter.pro b/src/cutter.pro index 3df9f6e1..3bf880c6 100644 --- a/src/cutter.pro +++ b/src/cutter.pro @@ -78,7 +78,8 @@ SOURCES += \ widgets/HexdumpWidget.cpp \ utils/Configuration.cpp \ utils/Colors.cpp \ - dialogs/SaveProjectDialog.cpp + dialogs/SaveProjectDialog.cpp \ + utils/TempConfig.cpp HEADERS += \ cutter.h \ @@ -127,7 +128,8 @@ HEADERS += \ widgets/HexdumpWidget.h \ utils/Configuration.h \ utils/Colors.h \ - dialogs/SaveProjectDialog.h + dialogs/SaveProjectDialog.h \ + utils/TempConfig.h FORMS += \ widgets/PreviewWidget.ui \ diff --git a/src/dialogs/XrefsDialog.cpp b/src/dialogs/XrefsDialog.cpp index e69cbcbe..388e8f5f 100644 --- a/src/dialogs/XrefsDialog.cpp +++ b/src/dialogs/XrefsDialog.cpp @@ -1,6 +1,8 @@ #include "XrefsDialog.h" #include "ui_XrefsDialog.h" +#include "utils/TempConfig.h" + #include "MainWindow.h" #include @@ -19,11 +21,14 @@ XrefsDialog::XrefsDialog(QWidget *parent) : QTextDocument *asm_docu = ui->previewTextEdit->document(); asm_docu->setDocumentMargin(10); - // Syntax highlight - highlighter = new Highlighter(ui->previewTextEdit->document()); + setupPreviewFont(); + setupPreviewColors(); // Highlight current line connect(ui->previewTextEdit, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine())); + + connect(Config(), SIGNAL(fontsUpdated()), this, SLOT(setupPreviewFont())); + connect(Config(), SIGNAL(colorsUpdated()), this, SLOT(setupPreviewColors())); } XrefsDialog::~XrefsDialog() {} @@ -110,6 +115,18 @@ QString XrefsDialog::normalizeAddr(const QString& addr) const } } +void XrefsDialog::setupPreviewFont() +{ + ui->previewTextEdit->setFont(Config()->getFont()); +} + +void XrefsDialog::setupPreviewColors() +{ + ui->previewTextEdit->setStyleSheet(QString("QPlainTextEdit { background-color: %1; color: %2; }") + .arg(ConfigColor("gui.background").name()) + .arg(ConfigColor("btext").name())); +} + void XrefsDialog::highlightCurrentLine() { QList extraSelections; @@ -152,20 +169,26 @@ void XrefsDialog::on_toTreeWidget_itemSelectionChanged() void XrefsDialog::updatePreview(RVA addr) { + // is the address part of a function, so we can use pdf? + bool isFunction = !core->cmdj("afij@" + QString::number(addr)).array().isEmpty(); + + TempConfig tempConfig; + tempConfig.set("scr.html", true); + tempConfig.set("scr.color", true); + QString disass; - // is the address part of a function, so we can use pdf? - if (!core->cmdj("afij@" + QString::number(addr)).array().isEmpty()) + if (isFunction) disass = core->cmd("pdf @ " + QString::number(addr)); else disass = core->cmd("pd 10 @ " + QString::number(addr)); - ui->previewTextEdit->setPlainText(disass.trimmed()); + ui->previewTextEdit->document()->setHtml(disass); // Does it make any sense? ui->previewTextEdit->moveCursor(QTextCursor::End); ui->previewTextEdit->find(this->normalizeAddr(RAddressString(addr)), QTextDocument::FindBackward); - ui->previewTextEdit->moveCursor(QTextCursor::StartOfWord, QTextCursor::MoveAnchor); + ui->previewTextEdit->moveCursor(QTextCursor::StartOfLine, QTextCursor::MoveAnchor); } void XrefsDialog::updateLabels(QString name) @@ -176,6 +199,10 @@ void XrefsDialog::updateLabels(QString name) void XrefsDialog::fillRefsForAddress(RVA addr, QString name, bool whole_function) { + TempConfig tempConfig; + tempConfig.set("scr.html", false); + tempConfig.set("scr.color", false); + this->addr = addr; this->func_name = func_name; diff --git a/src/dialogs/XrefsDialog.h b/src/dialogs/XrefsDialog.h index d7024d0d..d1b7eb29 100644 --- a/src/dialogs/XrefsDialog.h +++ b/src/dialogs/XrefsDialog.h @@ -25,13 +25,14 @@ public: void fillRefsForAddress(RVA addr, QString name, bool whole_function); private slots: - void on_fromTreeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column); - void on_toTreeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column); QString normalizeAddr(const QString& addr) const; + void setupPreviewFont(); + void setupPreviewColors(); + void highlightCurrentLine(); void on_fromTreeWidget_itemSelectionChanged(); @@ -44,8 +45,6 @@ private: std::unique_ptr ui; CutterCore *core; - Highlighter *highlighter; - void fillRefs(QList refs, QList xrefs); void updateLabels(QString name); void updatePreview(RVA addr); diff --git a/src/utils/TempConfig.cpp b/src/utils/TempConfig.cpp new file mode 100644 index 00000000..5c27617a --- /dev/null +++ b/src/utils/TempConfig.cpp @@ -0,0 +1,60 @@ + +#include + +#include "cutter.h" +#include "TempConfig.h" + +TempConfig::~TempConfig() +{ + for (auto i = resetValues.begin(); i != resetValues.end(); i++) + { + switch(i.value().type()) + { + case QVariant::String: + Core()->setConfig(i.key(), i.value().toString()); + break; + case QVariant::Int: + Core()->setConfig(i.key(), i.value().toInt()); + break; + case QVariant::Bool: + Core()->setConfig(i.key(), i.value().toBool()); + break; + default: + assert(false); + break; + } + } +} + +TempConfig &TempConfig::set(const QString &key, const QString &value) +{ + if (!resetValues.contains(key)) + { + resetValues[key] = Core()->getConfig(key); + } + + Core()->setConfig(key, value); + return *this; +} + +TempConfig &TempConfig::set(const QString &key, int value) +{ + if (!resetValues.contains(key)) + { + resetValues[key] = Core()->getConfigi(key); + } + + Core()->setConfig(key, value); + return *this; +} + +TempConfig &TempConfig::set(const QString &key, bool value) +{ + if (!resetValues.contains(key)) + { + resetValues[key] = Core()->getConfigb(key); + } + + Core()->setConfig(key, value); + return *this; +} \ No newline at end of file diff --git a/src/utils/TempConfig.h b/src/utils/TempConfig.h new file mode 100644 index 00000000..4f6b8fb8 --- /dev/null +++ b/src/utils/TempConfig.h @@ -0,0 +1,22 @@ + +#ifndef TEMPCONFIG_H +#define TEMPCONFIG_H + +#include +#include + +class TempConfig +{ +public: + TempConfig() = default; + ~TempConfig(); + + TempConfig &set(const QString &key, const QString &value); + TempConfig &set(const QString &key, int value); + TempConfig &set(const QString &key, bool value); + +private: + QMap resetValues; +}; + +#endif //TEMPCONFIG_H diff --git a/src/widgets/DisassemblyWidget.cpp b/src/widgets/DisassemblyWidget.cpp index 7816c662..7b0f3f50 100644 --- a/src/widgets/DisassemblyWidget.cpp +++ b/src/widgets/DisassemblyWidget.cpp @@ -4,6 +4,7 @@ #include "utils/HexHighlighter.h" #include "utils/Configuration.h" #include "utils/Helpers.h" +#include "utils/TempConfig.h" #include #include @@ -108,11 +109,11 @@ QWidget* DisassemblyWidget::getTextWidget() QString DisassemblyWidget::readDisasm(const QString &cmd, bool stripLastNewline) { - Core()->setConfig("scr.html", true); - Core()->setConfig("scr.color", true); + TempConfig tempConfig; + tempConfig.set("scr.html", true) + .set("scr.color", true); + QString disas = Core()->cmd(cmd); - Core()->setConfig("scr.html", false); - Core()->setConfig("scr.color", false); if (stripLastNewline) { diff --git a/src/widgets/HexdumpWidget.cpp b/src/widgets/HexdumpWidget.cpp index c9d81835..43165377 100644 --- a/src/widgets/HexdumpWidget.cpp +++ b/src/widgets/HexdumpWidget.cpp @@ -5,6 +5,7 @@ #include "MainWindow.h" #include "utils/Helpers.h" +#include "utils/TempConfig.h" #include #include @@ -482,6 +483,9 @@ void HexdumpWidget::fillPlugins() std::array HexdumpWidget::fetchHexdump(RVA offset, RVA bytes) { + TempConfig tempConfig; + tempConfig.set("scr.color", false); + QString hexdump = Core()->cmd(QString("px %1 @ %2").arg(QString::number(bytes), QString::number(offset))); QString offsets; diff --git a/src/widgets/SidebarWidget.cpp b/src/widgets/SidebarWidget.cpp index 65f58e72..bd0f0f1f 100644 --- a/src/widgets/SidebarWidget.cpp +++ b/src/widgets/SidebarWidget.cpp @@ -3,6 +3,7 @@ #include "DisassemblerGraphView.h" #include "utils/Helpers.h" +#include "utils/TempConfig.h" #include #include @@ -149,6 +150,11 @@ void SidebarWidget::get_refs_data(RVA addr) void SidebarWidget::fill_refs(QList refs, QList xrefs, QList graph_data) { Q_UNUSED(graph_data); + + TempConfig tempConfig; + tempConfig.set("scr.html", false) + .set("scr.color", false); + this->xreFromTreeWidget_2->clear(); for (int i = 0; i < refs.size(); ++i) { @@ -196,6 +202,10 @@ void SidebarWidget::fill_refs(QList refs, QListoffsetTreeWidget->clear(); QString raw = Core()->getOffsetInfo(off); QList lines = raw.split("\n", QString::SkipEmptyParts);