mirror of
https://github.com/rizinorg/cutter.git
synced 2024-12-24 05:45:27 +00:00
First try with colors
This commit is contained in:
parent
9c487b63ca
commit
1ca9b06519
@ -76,7 +76,8 @@ SOURCES += \
|
||||
widgets/DisassemblyWidget.cpp \
|
||||
widgets/SidebarWidget.cpp \
|
||||
widgets/HexdumpWidget.cpp \
|
||||
utils/Configuration.cpp
|
||||
utils/Configuration.cpp \
|
||||
utils/Colors.cpp
|
||||
|
||||
HEADERS += \
|
||||
cutter.h \
|
||||
@ -124,7 +125,8 @@ HEADERS += \
|
||||
widgets/DisassemblyWidget.h \
|
||||
widgets/SidebarWidget.h \
|
||||
widgets/HexdumpWidget.h \
|
||||
utils/Configuration.h
|
||||
utils/Configuration.h \
|
||||
utils/Colors.h
|
||||
|
||||
FORMS += \
|
||||
widgets/PreviewWidget.ui \
|
||||
|
88
src/utils/Colors.cpp
Normal file
88
src/utils/Colors.cpp
Normal file
@ -0,0 +1,88 @@
|
||||
#include "Colors.h"
|
||||
|
||||
Colors::Colors()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Temporary solution
|
||||
// Copied from R_API const char* r_print_color_op_type(RPrint *p, ut64 anal_type) {
|
||||
QString Colors::getColor(ut64 type)
|
||||
{
|
||||
switch (type & R_ANAL_OP_TYPE_MASK) {
|
||||
case R_ANAL_OP_TYPE_NOP:
|
||||
return "nop";
|
||||
case R_ANAL_OP_TYPE_ADD:
|
||||
case R_ANAL_OP_TYPE_SUB:
|
||||
case R_ANAL_OP_TYPE_MUL:
|
||||
case R_ANAL_OP_TYPE_DIV:
|
||||
case R_ANAL_OP_TYPE_MOD:
|
||||
case R_ANAL_OP_TYPE_LENGTH:
|
||||
return "math";
|
||||
case R_ANAL_OP_TYPE_AND:
|
||||
case R_ANAL_OP_TYPE_OR:
|
||||
case R_ANAL_OP_TYPE_XOR:
|
||||
case R_ANAL_OP_TYPE_NOT:
|
||||
case R_ANAL_OP_TYPE_SHL:
|
||||
case R_ANAL_OP_TYPE_SAL:
|
||||
case R_ANAL_OP_TYPE_SAR:
|
||||
case R_ANAL_OP_TYPE_SHR:
|
||||
case R_ANAL_OP_TYPE_ROL:
|
||||
case R_ANAL_OP_TYPE_ROR:
|
||||
case R_ANAL_OP_TYPE_CPL:
|
||||
return "bin";
|
||||
case R_ANAL_OP_TYPE_IO:
|
||||
return "swi";
|
||||
case R_ANAL_OP_TYPE_JMP:
|
||||
case R_ANAL_OP_TYPE_UJMP:
|
||||
case R_ANAL_OP_TYPE_IJMP:
|
||||
case R_ANAL_OP_TYPE_RJMP:
|
||||
case R_ANAL_OP_TYPE_IRJMP:
|
||||
case R_ANAL_OP_TYPE_MJMP:
|
||||
return "jmp";
|
||||
case R_ANAL_OP_TYPE_CJMP:
|
||||
case R_ANAL_OP_TYPE_UCJMP:
|
||||
case R_ANAL_OP_TYPE_SWITCH:
|
||||
return "cjmp";
|
||||
case R_ANAL_OP_TYPE_CMP:
|
||||
case R_ANAL_OP_TYPE_ACMP:
|
||||
return "cmp";
|
||||
case R_ANAL_OP_TYPE_UCALL:
|
||||
case R_ANAL_OP_TYPE_ICALL:
|
||||
case R_ANAL_OP_TYPE_RCALL:
|
||||
case R_ANAL_OP_TYPE_IRCALL:
|
||||
case R_ANAL_OP_TYPE_UCCALL:
|
||||
case R_ANAL_OP_TYPE_CALL:
|
||||
case R_ANAL_OP_TYPE_CCALL:
|
||||
return "call";
|
||||
case R_ANAL_OP_TYPE_NEW:
|
||||
case R_ANAL_OP_TYPE_SWI:
|
||||
return "swi";
|
||||
case R_ANAL_OP_TYPE_ILL:
|
||||
case R_ANAL_OP_TYPE_TRAP:
|
||||
return "trap";
|
||||
case R_ANAL_OP_TYPE_CRET:
|
||||
case R_ANAL_OP_TYPE_RET:
|
||||
return "ret";
|
||||
case R_ANAL_OP_TYPE_CAST:
|
||||
case R_ANAL_OP_TYPE_MOV:
|
||||
case R_ANAL_OP_TYPE_LEA:
|
||||
case R_ANAL_OP_TYPE_CMOV: // TODO: add cmov cathegory?
|
||||
return "mov";
|
||||
case R_ANAL_OP_TYPE_PUSH:
|
||||
case R_ANAL_OP_TYPE_UPUSH:
|
||||
case R_ANAL_OP_TYPE_LOAD:
|
||||
return "push";
|
||||
case R_ANAL_OP_TYPE_POP:
|
||||
case R_ANAL_OP_TYPE_STORE:
|
||||
return "pop";
|
||||
case R_ANAL_OP_TYPE_CRYPTO:
|
||||
return "crypto";
|
||||
case R_ANAL_OP_TYPE_NULL:
|
||||
return "other";
|
||||
case R_ANAL_OP_TYPE_UNK:
|
||||
default:
|
||||
return "invalid";
|
||||
}
|
||||
}
|
||||
|
14
src/utils/Colors.h
Normal file
14
src/utils/Colors.h
Normal file
@ -0,0 +1,14 @@
|
||||
#ifndef COLORS_H
|
||||
#define COLORS_H
|
||||
|
||||
#include "cutter.h"
|
||||
#include "libr/r_anal.h"
|
||||
|
||||
class Colors
|
||||
{
|
||||
public:
|
||||
Colors();
|
||||
static QString getColor(ut64 type);
|
||||
};
|
||||
|
||||
#endif // COLORS_H
|
@ -1,10 +1,14 @@
|
||||
#include "Configuration.h"
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
|
||||
Configuration* Configuration::mPtr = nullptr;
|
||||
|
||||
Configuration::Configuration() : QObject()
|
||||
{
|
||||
mPtr = this;
|
||||
|
||||
loadDefaultColors();
|
||||
}
|
||||
|
||||
Configuration* Configuration::instance()
|
||||
@ -12,6 +16,18 @@ Configuration* Configuration::instance()
|
||||
return mPtr;
|
||||
}
|
||||
|
||||
void Configuration::loadDefaultColors()
|
||||
{
|
||||
Core()->cmd("eco solarized");
|
||||
QJsonObject colors = Core()->cmdj("ecj").object();
|
||||
for (auto color : colors.keys()) {
|
||||
QJsonArray rgb = colors[color].toArray();
|
||||
QColor col = QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt());
|
||||
s.setValue("colors." + color, col);
|
||||
}
|
||||
s.setValue("colors.gui.alt_background", QColor(255, 255, 255));
|
||||
}
|
||||
|
||||
const QFont Configuration::getFont() const
|
||||
{
|
||||
QFont font = s.value("font", QFont("Monospace", 12)).value<QFont>();
|
||||
@ -23,3 +39,12 @@ void Configuration::setFont(const QFont &font)
|
||||
s.setValue("font", font);
|
||||
emit fontsUpdated();
|
||||
}
|
||||
|
||||
const QColor Configuration::getColor(const QString &name) const
|
||||
{
|
||||
if (s.contains("colors." + name)) {
|
||||
return s.value("colors." + name).value<QColor>();
|
||||
} else {
|
||||
return s.value("colors.other").value<QColor>();
|
||||
}
|
||||
}
|
||||
|
@ -3,8 +3,10 @@
|
||||
|
||||
#include <QSettings>
|
||||
#include <QFont>
|
||||
#include <cutter.h>
|
||||
|
||||
#define Config() (Configuration::instance())
|
||||
#define ConfigColor(x) Config()->getColor(x)
|
||||
|
||||
class Configuration : public QObject
|
||||
{
|
||||
@ -13,6 +15,8 @@ private:
|
||||
QSettings s;
|
||||
static Configuration* mPtr;
|
||||
|
||||
void loadDefaultColors();
|
||||
|
||||
public:
|
||||
// Functions
|
||||
Configuration();
|
||||
@ -22,6 +26,9 @@ public:
|
||||
const QFont getFont() const;
|
||||
void setFont(const QFont &font);
|
||||
|
||||
// Colors
|
||||
const QColor getColor(const QString &name) const;
|
||||
|
||||
// TODO Imho it's wrong doing it this way. Should find something else.
|
||||
bool getAsmESIL() const { return s.value("asm.esil", false).toBool(); }
|
||||
void setAsmESIL(bool v) { s.setValue("asm.esil", v); }
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <QFileDialog>
|
||||
#include <QMessageBox>
|
||||
#include "utils/Configuration.h"
|
||||
#include "utils/Colors.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#undef min
|
||||
@ -1592,20 +1593,27 @@ void DisassemblerGraphView::loadCurrentGraph()
|
||||
// TODO
|
||||
RichTextPainter::List richText;
|
||||
|
||||
////////// TODO Put in a helper function to use it on DisassemblyWidget too.
|
||||
RichTextPainter::CustomRichText_t assembly;
|
||||
assembly.highlight = false;
|
||||
assembly.flags = RichTextPainter::FlagColor;
|
||||
assembly.text = op["opcode"].toString();
|
||||
// TODO cut opcode and use op["ptr"] to colorate registers and immediate values
|
||||
QString opcode = op["opcode"].toString();
|
||||
assembly.text = opcode;
|
||||
|
||||
QString colorName = Colors::getColor(op["type_num"].toVariant().toULongLong());
|
||||
assembly.textColor = ConfigColor(colorName);
|
||||
richText.insert(richText.begin(), assembly);
|
||||
|
||||
if (op["comment"].toString().length()) {
|
||||
RichTextPainter::CustomRichText_t comment;
|
||||
comment.text = QString(" ; %1").arg(QByteArray::fromBase64(op["comment"].toString().toLocal8Bit()).data());
|
||||
comment.textColor = Qt::blue;
|
||||
comment.textColor = ConfigColor("comment");
|
||||
comment.flags = RichTextPainter::FlagColor;
|
||||
richText.insert(richText.end(), comment);
|
||||
}
|
||||
//////////
|
||||
|
||||
|
||||
i.text = Text(richText);
|
||||
b.instrs.push_back(i);
|
||||
@ -1618,6 +1626,9 @@ void DisassemblerGraphView::loadCurrentGraph()
|
||||
this->analysis = anal;
|
||||
this->function = this->analysis.entry;
|
||||
this->ready = true;
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
////////////////// REMOVE BELOW //////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////
|
||||
/*
|
||||
bool showGraphRva = ConfigBool("Gui", "ShowGraphRva");
|
||||
Analysis anal;
|
||||
@ -1907,14 +1918,14 @@ void DisassemblerGraphView::followDisassemblerSlot()
|
||||
|
||||
void DisassemblerGraphView::colorsUpdatedSlot()
|
||||
{
|
||||
disassemblyBackgroundColor = Qt::white;
|
||||
graphNodeColor = Qt::black;
|
||||
backgroundColor = QColor(220, 240, 255);
|
||||
disassemblySelectionColor = Qt::yellow;
|
||||
disassemblyBackgroundColor = ConfigColor("gui.background");
|
||||
graphNodeColor = ConfigColor("gui.border");
|
||||
backgroundColor = ConfigColor("gui.alt_background");
|
||||
disassemblySelectionColor = ConfigColor("gui.highlight");
|
||||
|
||||
jmpColor = Qt::blue;
|
||||
brtrueColor = Qt::green;
|
||||
brfalseColor = Qt::red;
|
||||
jmpColor = ConfigColor("graph.trufae");
|
||||
brtrueColor = ConfigColor("graph.true");
|
||||
brfalseColor = ConfigColor("graph.false");
|
||||
/*disassemblyBackgroundColor = ConfigColor("GraphNodeBackgroundColor");
|
||||
if(!disassemblyBackgroundColor.alpha())
|
||||
disassemblyBackgroundColor = ConfigColor("DisassemblyBackgroundColor");
|
||||
|
Loading…
Reference in New Issue
Block a user