|
| 1 | +#include "MarkDialog.h" |
| 2 | +#include "Cutter.h" |
| 3 | +#include "CutterCommon.h" |
| 4 | +#include "ui_MarkDialog.h" |
| 5 | +#include <QColorDialog> |
| 6 | +#include <QRegularExpressionValidator> |
| 7 | + |
| 8 | +MarkDialog::MarkDialog(RVA start, RVA end, QWidget *parent, QString name) |
| 9 | + : QDialog(parent), |
| 10 | + ui(new Ui::MarkDialog), |
| 11 | + markName(name), |
| 12 | + markFrom(start), |
| 13 | + markTo(end), |
| 14 | + markColor(Qt::black), |
| 15 | + markComment(""), |
| 16 | + edit(false) |
| 17 | +{ |
| 18 | + ui->setupUi(this); |
| 19 | + |
| 20 | + if (!markName.isEmpty()) { |
| 21 | + // Editing existing Mark |
| 22 | + setWindowTitle("Edit Mark"); |
| 23 | + RzCoreLocked core(Core()); |
| 24 | + RzMarkItem *mark = rz_mark_get(core->marks, markName.toStdString().c_str()); |
| 25 | + if (mark) { |
| 26 | + markFrom = mark->from; |
| 27 | + markTo = mark->to; |
| 28 | + markColor = QColor(mark->color); |
| 29 | + markComment = mark->comment; |
| 30 | + } |
| 31 | + edit = true; |
| 32 | + } else { |
| 33 | + // Creating new Mark |
| 34 | + setWindowTitle("Add Mark"); |
| 35 | + markName = QString("%1_%2").arg(RzAddressString(markFrom), RzAddressString(markTo)); |
| 36 | + } |
| 37 | + |
| 38 | + ui->startAddressEdit->setText(RzAddressString(markFrom)); |
| 39 | + ui->endAddressEdit->setText(RzAddressString(markTo)); |
| 40 | + ui->nameEdit->setText(markName); |
| 41 | + ui->commentEdit->setText(markComment); |
| 42 | + ui->colorDisplay->setStyleSheet(colorToStyle(markColor)); |
| 43 | + |
| 44 | + auto hexValidator = |
| 45 | + new QRegularExpressionValidator(QRegularExpression("(?:0[xX])?[0-9a-fA-F]+"), this); |
| 46 | + ui->startAddressEdit->setValidator(hexValidator); |
| 47 | + ui->endAddressEdit->setValidator(hexValidator); |
| 48 | + |
| 49 | + connect(ui->colorButton, &QPushButton::clicked, this, &MarkDialog::onPickColor); |
| 50 | + connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &MarkDialog::accept); |
| 51 | + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &MarkDialog::reject); |
| 52 | +} |
| 53 | + |
| 54 | +void MarkDialog::accept() |
| 55 | +{ |
| 56 | + bool ok = false; |
| 57 | + markFrom = ui->startAddressEdit->text().toULongLong(&ok, 16); |
| 58 | + if (!ok) { |
| 59 | + QMessageBox::warning(this, tr("Invalid Input"), |
| 60 | + tr("Starting address is not a valid hexadecimal number")); |
| 61 | + return; |
| 62 | + } |
| 63 | + markTo = ui->endAddressEdit->text().toULongLong(&ok, 16); |
| 64 | + if (!ok) { |
| 65 | + QMessageBox::warning(this, tr("Invalid Input"), |
| 66 | + tr("Ending address is not a valid hexadecimal number")); |
| 67 | + return; |
| 68 | + } |
| 69 | + if (markFrom > markTo) { |
| 70 | + QMessageBox::warning(this, tr("Invalid Input"), |
| 71 | + tr("Starting address cannot be greater than ending address")); |
| 72 | + return; |
| 73 | + } |
| 74 | + |
| 75 | + QString name = ui->nameEdit->text(); |
| 76 | + if (edit && !name.isEmpty() && name != markName) { |
| 77 | + Core()->delMark(markName); // Delete the old mark |
| 78 | + } else if (name.isEmpty()) { |
| 79 | + QMessageBox::warning(this, tr("Invalid Input"), tr("Name cannot be empty")); |
| 80 | + return; |
| 81 | + } |
| 82 | + |
| 83 | + markName = name; |
| 84 | + markComment = ui->commentEdit->toPlainText(); |
| 85 | + Core()->addMark(markFrom, markTo, markName, markComment, markColor); |
| 86 | + |
| 87 | + QDialog::accept(); |
| 88 | +} |
| 89 | + |
| 90 | +MarkDialog::~MarkDialog() {} |
| 91 | + |
| 92 | +void MarkDialog::onPickColor() |
| 93 | +{ |
| 94 | + QColor c = QColorDialog::getColor(markColor, this, tr("Pick Background Color")); |
| 95 | + if (c.isValid()) { |
| 96 | + markColor = c; |
| 97 | + ui->colorDisplay->setStyleSheet(colorToStyle(markColor)); |
| 98 | + } |
| 99 | +} |
| 100 | + |
| 101 | +QString MarkDialog::colorToStyle(const QColor &color) |
| 102 | +{ |
| 103 | + return QString("background-color: rgba(%1, %2, %3, %4);") |
| 104 | + .arg(color.red()) |
| 105 | + .arg(color.green()) |
| 106 | + .arg(color.blue()) |
| 107 | + .arg(MARK_ALPHA_F); |
| 108 | +} |
0 commit comments