diff --git a/rizin b/rizin index cdc80202..f2a1e5e0 160000 --- a/rizin +++ b/rizin @@ -1 +1 @@ -Subproject commit cdc80202dd7eaf5bacf0e36a64f964c822e67dd4 +Subproject commit f2a1e5e09087550e70122c3a2bedd4e2a02f77f1 diff --git a/src/common/ColorThemeWorker.cpp b/src/common/ColorThemeWorker.cpp index aabc0c1f..c4abfd5c 100644 --- a/src/common/ColorThemeWorker.cpp +++ b/src/common/ColorThemeWorker.cpp @@ -37,9 +37,7 @@ ColorThemeWorker::ColorThemeWorker(QObject *parent) : QObject(parent) QDir().mkpath(customRzThemesLocationPath); } - QDir currDir { - QStringLiteral("%1%2%3").arg(rz_path_prefix(nullptr)).arg(RZ_SYS_DIR).arg(RZ_THEMES) - }; + QDir currDir { QStringLiteral("%1%2%3").arg(rz_path_prefix(nullptr), RZ_SYS_DIR, RZ_THEMES) }; if (currDir.exists()) { standardRzThemesLocationPath = currDir.absolutePath(); } else { @@ -78,27 +76,15 @@ QString ColorThemeWorker::copy(const QString &srcThemeName, const QString ©T return save(getTheme(srcThemeName), copyThemeName); } -QString ColorThemeWorker::save(const QJsonDocument &theme, const QString &themeName) const +QString ColorThemeWorker::save(const Theme &theme, const QString &themeName) const { QFile fOut(QDir(customRzThemesLocationPath).filePath(themeName)); if (!fOut.open(QFile::WriteOnly | QFile::Truncate)) { return tr("The file %1 cannot be opened.").arg(QFileInfo(fOut).filePath()); } - QJsonObject obj = theme.object(); - for (auto it = obj.constBegin(); it != obj.constEnd(); it++) { - - QJsonArray arr = it.value().toArray(); - QColor color; - if (arr.isEmpty()) { - color = it.value().toVariant().value(); - } else if (arr.size() == 4) { - color = QColor(arr[0].toInt(), arr[1].toInt(), arr[2].toInt(), arr[3].toInt()); - } else if (arr.size() == 3) { - color = QColor(arr[0].toInt(), arr[1].toInt(), arr[2].toInt()); - } else { - continue; - } + for (auto it = theme.constBegin(); it != theme.constEnd(); it++) { + const QColor &color = it.value(); if (cutterSpecificOptions.contains(it.key())) { fOut.write(QString("#~%1 rgb:%2\n") .arg(it.key(), color.name(QColor::HexArgb).remove('#')) @@ -125,37 +111,18 @@ bool ColorThemeWorker::isThemeExist(const QString &name) const return themes.contains(name); } -QJsonDocument ColorThemeWorker::getTheme(const QString &themeName) const +ColorThemeWorker::Theme ColorThemeWorker::getTheme(const QString &themeName) const { - int r, g, b, a; - CutterJson rzTheme; - QVariantMap theme; + Theme theme; QString curr = Config()->getColorTheme(); if (themeName != curr) { RzCoreLocked core(Core()); rz_core_theme_load(core, themeName.toUtf8().constData()); - rzTheme = Core()->cmdj("ecj"); + theme = Core()->getTheme(); rz_core_theme_load(core, curr.toUtf8().constData()); } else { - rzTheme = Core()->cmdj("ecj"); - } - - for (CutterJson value : rzTheme) { - QJsonArray arr; - int count = 0; - for (CutterJson element : value) { - arr.append(element.toSt64()); - count++; - if (count >= 3) { - break; - } - } - while (count < 3) { - arr.append(0); - } - arr.append(255); - theme[value.key()] = arr; + theme = Core()->getTheme(); } ColorFlags colorFlags = ColorFlags::DarkFlag; @@ -164,14 +131,13 @@ QJsonDocument ColorThemeWorker::getTheme(const QString &themeName) const } for (auto &it : cutterSpecificOptions) { - Configuration::cutterOptionColors[it][colorFlags].getRgb(&r, &g, &b, &a); - theme.insert(it, QJsonArray { r, g, b, a }); + theme.insert(it, QColor(Configuration::cutterOptionColors[it][colorFlags])); } if (isCustomTheme(themeName)) { QFile src(QDir(customRzThemesLocationPath).filePath(themeName)); if (!src.open(QFile::ReadOnly)) { - return QJsonDocument(); + return {}; } QStringList sl; for (auto &line : QString(src.readAll()).split('\n', CUTTER_QT_SKIP_EMPTY_PARTS)) { @@ -181,8 +147,7 @@ QJsonDocument ColorThemeWorker::getTheme(const QString &themeName) const if (sl.size() != 3 || sl[0][0] == '#') { continue; } - QColor(sl[2]).getRgb(&r, &g, &b, &a); - theme.insert(sl[1], QJsonArray({ r, g, b, a })); + theme.insert(sl[1], QColor(sl[2])); } } @@ -190,21 +155,7 @@ QJsonDocument ColorThemeWorker::getTheme(const QString &themeName) const theme.remove(key); } - // manualy converting instead of using QJsonObject::fromVariantMap because - // Qt < 5.6 QJsonValue.fromVariant doesn't expect QVariant to already contain - // QJson values like QJsonArray. - // https://github.com/qt/qtbase/commit/26237f0a2d8db80024b601f676bbce54d483e672 - QJsonObject obj; - for (auto it = theme.begin(); it != theme.end(); it++) { - auto &value = it.value(); - if (value.canConvert()) { - obj[it.key()] = it.value().value(); - } else { - obj[it.key()] = QJsonValue::fromVariant(value); - } - } - - return QJsonDocument(obj); + return theme; } QString ColorThemeWorker::deleteTheme(const QString &themeName) const @@ -291,11 +242,10 @@ bool ColorThemeWorker::isFileTheme(const QString &filePath, bool *ok) const const QString colors = "black|red|white|green|magenta|yellow|cyan|blue|gray|none"; QString options = - (Core()->cmdj("ecj").keys() << cutterSpecificOptions).join('|').replace(".", "\\."); + (Core()->getThemeKeys() << cutterSpecificOptions).join('|').replace(".", "\\."); - QString pattern = QString("((ec\\s+(%1)\\s+(((rgb:|#)[0-9a-fA-F]{3,8})|(%2))))\\s*") - .arg(options) - .arg(colors); + QString pattern = + QString("((ec\\s+(%1)\\s+(((rgb:|#)[0-9a-fA-F]{3,8})|(%2))))\\s*").arg(options, colors); // The below construct mimics the behaviour of QRegexP::exactMatch(), which was here before QRegularExpression regexp("\\A(?:" + pattern + ")\\z"); @@ -326,7 +276,7 @@ QStringList ColorThemeWorker::customThemes() const const QStringList &ColorThemeWorker::getRizinSpecificOptions() { if (rizinSpecificOptions.isEmpty()) { - rizinSpecificOptions = Core()->cmdj("ecj").keys(); + rizinSpecificOptions << Core()->getThemeKeys(); } return rizinSpecificOptions; } diff --git a/src/common/ColorThemeWorker.h b/src/common/ColorThemeWorker.h index 3d67826f..3942a428 100644 --- a/src/common/ColorThemeWorker.h +++ b/src/common/ColorThemeWorker.h @@ -18,6 +18,8 @@ class ColorThemeWorker : public QObject { Q_OBJECT public: + typedef QHash Theme; + /** * @brief cutterSpecificOptions is list of all available Cutter-only color options. */ @@ -54,7 +56,7 @@ public: * Name of theme to save. * @return "" on success or error message. */ - QString save(const QJsonDocument &theme, const QString &themeName) const; + QString save(const Theme &theme, const QString &themeName) const; /** * @brief Returns whether or not @a themeName theme is custom (created by user or imported) or @@ -71,12 +73,11 @@ public: bool isThemeExist(const QString &name) const; /** - * @brief Returns theme as Json where key is option name and value is array of 3 Ints (Red, - * Green, Blue). + * @brief Returns theme as QHash where key is option name and value is QColor. * @param themeName * Theme to get. */ - QJsonDocument getTheme(const QString &themeName) const; + Theme getTheme(const QString &themeName) const; /** * @brief Deletes theme named @a themeName. diff --git a/src/common/Configuration.cpp b/src/common/Configuration.cpp index 0a73eb34..5239ad6b 100644 --- a/src/common/Configuration.cpp +++ b/src/common/Configuration.cpp @@ -534,13 +534,9 @@ void Configuration::setColorTheme(const QString &theme) s.setValue("theme", theme); } - QJsonObject colorTheme = ThemeWorker().getTheme(theme).object(); + ColorThemeWorker::Theme colorTheme = ThemeWorker().getTheme(theme); for (auto it = colorTheme.constBegin(); it != colorTheme.constEnd(); it++) { - QJsonArray rgb = it.value().toArray(); - if (rgb.size() != 4) { - continue; - } - setColor(it.key(), QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt(), rgb[3].toInt())); + setColor(it.key(), it.value()); } emit colorsUpdated(); diff --git a/src/common/SettingsUpgrade.cpp b/src/common/SettingsUpgrade.cpp index 4ef57e59..a03a818a 100644 --- a/src/common/SettingsUpgrade.cpp +++ b/src/common/SettingsUpgrade.cpp @@ -181,26 +181,21 @@ void Cutter::initializeSettings() static void removeObsoleteOptionsFromCustomThemes() { - const QStringList options = Core()->cmdj("ecj").keys() - << ColorThemeWorker::cutterSpecificOptions; - RzList *themes_list = rz_core_theme_list(Core()->core()); - RzListIter *th_iter; - const char *th; - CutterRzListForeach (themes_list, th_iter, const char, th) { - auto theme = QString(th).trimmed(); - if (!ThemeWorker().isCustomTheme(theme)) { + const QStringList options = Core()->getThemeKeys() << ColorThemeWorker::cutterSpecificOptions; + QStringList themes = Core()->getColorThemes(); + for (const auto &themeName : themes) { + if (!ThemeWorker().isCustomTheme(themeName)) { continue; } - QJsonObject updatedTheme; - auto sch = ThemeWorker().getTheme(theme).object(); - for (const auto &key : sch.keys()) { - if (options.contains(key)) { - updatedTheme.insert(key, sch[key]); + ColorThemeWorker::Theme sch = ThemeWorker().getTheme(themeName); + ColorThemeWorker::Theme updatedTheme; + for (auto it = sch.constBegin(); it != sch.constEnd(); ++it) { + if (options.contains(it.key())) { + updatedTheme.insert(it.key(), it.value()); } } - ThemeWorker().save(QJsonDocument(updatedTheme), theme); + ThemeWorker().save(updatedTheme, themeName); } - rz_list_free(themes_list); } void Cutter::migrateThemes() diff --git a/src/core/Cutter.cpp b/src/core/Cutter.cpp index 44a79343..3858b88b 100644 --- a/src/core/Cutter.cpp +++ b/src/core/Cutter.cpp @@ -2157,26 +2157,9 @@ void CutterCore::stopDebug() if (currentlyEmulating) { cmdEsil("aeim-; aei-; wcr; .ar-; aets-"); currentlyEmulating = false; - } else if (currentlyAttachedToPID != -1) { - // Use cmd because cmdRaw would not work with command concatenation - cmd(QString("dp- %1; o %2; .ar-") - .arg(QString::number(currentlyAttachedToPID), currentlyOpenFile)); - currentlyAttachedToPID = -1; } else { - QString ptraceFiles = ""; - // close ptrace file descriptors left open - RzCoreLocked core(Core()); - RzList *descs = rz_id_storage_list(core->io->files); - RzListIter *it; - RzIODesc *desc; - CutterRzListForeach (descs, it, RzIODesc, desc) { - QString URI = QString(desc->uri); - if (URI.contains("ptrace")) { - ptraceFiles += "o-" + QString::number(desc->fd) + ";"; - } - } - // Use cmd because cmdRaw would not work with command concatenation - cmd("doc" + ptraceFiles); + rz_core_debug_process_close(core()); + currentlyAttachedToPID = -1; } syncAndSeekProgramCounter(); @@ -2331,7 +2314,16 @@ void CutterCore::continueUntilSyscall() return; } } else { - if (!asyncCmd("dcs", debugTask)) { + if (!asyncTask( + [](RzCore *core) { + rz_cons_break_push(reinterpret_cast(rz_debug_stop), core->dbg); + rz_reg_arena_swap(core->dbg->reg, true); + rz_debug_continue_syscalls(core->dbg, NULL, 0); + rz_cons_break_pop(); + rz_core_dbg_follow_seek_register(core); + return nullptr; + }, + debugTask)) { return; } } @@ -2390,7 +2382,15 @@ void CutterCore::stepOverDebug() return; } } else { - if (!asyncCmd("dso", debugTask)) { + bool ret; + asyncTask( + [&](RzCore *core) { + ret = rz_core_debug_step_over(core, 1); + rz_core_dbg_follow_seek_register(core); + return nullptr; + }, + debugTask); + if (!ret) { return; } } @@ -2413,7 +2413,15 @@ void CutterCore::stepOutDebug() } emit debugTaskStateChanged(); - if (!asyncCmd("dsf", debugTask)) { + bool ret; + asyncTask( + [&](RzCore *core) { + ret = rz_core_debug_step_until_frame(core); + rz_core_dbg_follow_seek_register(core); + return nullptr; + }, + debugTask); + if (!ret) { return; } @@ -2438,7 +2446,15 @@ void CutterCore::stepBackDebug() return; } } else { - if (!asyncCmd("dsb", debugTask)) { + bool ret; + asyncTask( + [&](RzCore *core) { + ret = rz_core_debug_step_back(core, 1); + rz_core_dbg_follow_seek_register(core); + return nullptr; + }, + debugTask); + if (!ret) { return; } } @@ -2457,11 +2473,11 @@ void CutterCore::stepBackDebug() QStringList CutterCore::getDebugPlugins() { QStringList plugins; - - for (CutterJson pluginObject : cmdj("dLj")) { - QString plugin = pluginObject[RJsonKey::name].toString(); - - plugins << plugin; + RzListIter *iter; + RzDebugPlugin *plugin; + CORE_LOCK(); + CutterRzListForeach (core->dbg->plugins, iter, RzDebugPlugin, plugin) { + plugins << plugin->name; } return plugins; } @@ -2661,11 +2677,9 @@ void CutterCore::disableBreakpoint(RVA addr) void CutterCore::setBreakpointTrace(int index, bool enabled) { - if (enabled) { - cmdRaw(QString("dbite %1").arg(index)); - } else { - cmdRaw(QString("dbitd %1").arg(index)); - } + CORE_LOCK(); + RzBreakpointItem *bpi = rz_bp_get_index(core->dbg->bp, index); + bpi->trace = enabled; } static BreakpointDescription breakpointDescriptionFromRizin(int index, rz_bp_item_t *bpi) @@ -2746,11 +2760,6 @@ bool CutterCore::isBreakpoint(const QList &breakpoints, RVA addr) return breakpoints.contains(addr); } -CutterJson CutterCore::getBacktrace() -{ - return cmdj("dbtj"); -} - QList CutterCore::getProcessThreads(int pid = -1) { CORE_LOCK(); @@ -4120,15 +4129,56 @@ QString CutterCore::getVersionInformation() return versionInfo; } -QList CutterCore::getColorThemes() +QStringList CutterCore::getColorThemes() { - QList r; - for (CutterJson s : cmdj("ecoj")) { - r << s.toString(); + QStringList r; + CORE_LOCK(); + RzList *themes_list = rz_core_theme_list(core); + RzListIter *it; + const char *th; + CutterRzListForeach (themes_list, it, const char, th) { + r << fromOwnedCharPtr(rz_str_trim_dup(th)); } + rz_list_free(themes_list); return r; } +QHash CutterCore::getTheme() +{ + QHash theme; + for (int i = 0;; ++i) { + const char *k = rz_cons_pal_get_name(i); + if (!k) { + break; + } + RzColor color = rz_cons_pal_get_i(i); + theme.insert(k, QColor(color.r, color.g, color.b)); + } + return theme; +} + +QStringList CutterCore::getThemeKeys() +{ + QStringList stringList; + for (int i = 0;; ++i) { + const char *k = rz_cons_pal_get_name(i); + if (!k) { + break; + } + stringList << k; + } + return stringList; +} + +bool CutterCore::setColor(const QString &key, const QString &color) +{ + if (!rz_cons_pal_set(key.toUtf8().constData(), color.toUtf8().constData())) { + return false; + } + rz_cons_pal_update_event(); + return true; +} + QString CutterCore::ansiEscapeToHtml(const QString &text) { int len; diff --git a/src/core/Cutter.h b/src/core/Cutter.h index bc76233a..66b7b0f3 100644 --- a/src/core/Cutter.h +++ b/src/core/Cutter.h @@ -393,7 +393,10 @@ public: QString getConfig(const char *k); QString getConfig(const QString &k) { return getConfig(k.toUtf8().constData()); } QString getConfigDescription(const char *k); - QList getColorThemes(); + QStringList getColorThemes(); + QHash getTheme(); + QStringList getThemeKeys(); + bool setColor(const QString &key, const QString &color); /* Assembly\Hexdump related methods */ QByteArray assemble(const QString &code); @@ -449,7 +452,6 @@ public: * @return List of ProcessDescription */ QList getProcessThreads(int pid); - CutterJson getBacktrace(); /** * @brief Get a list of heap chunks * Uses RZ_API rz_heap_chunks_list to get vector of chunks diff --git a/src/dialogs/preferences/ColorThemeEditDialog.cpp b/src/dialogs/preferences/ColorThemeEditDialog.cpp index 93838698..bc0dff62 100644 --- a/src/dialogs/preferences/ColorThemeEditDialog.cpp +++ b/src/dialogs/preferences/ColorThemeEditDialog.cpp @@ -72,7 +72,7 @@ ColorThemeEditDialog::~ColorThemeEditDialog() void ColorThemeEditDialog::accept() { colorTheme = Config()->getColorTheme(); - QJsonDocument sch = ui->colorThemeListView->colorSettingsModel()->getTheme(); + ColorThemeWorker::Theme sch = ui->colorThemeListView->colorSettingsModel()->getTheme(); if (ThemeWorker().isCustomTheme(colorTheme)) { QString err = ThemeWorker().save(sch, colorTheme); if (!err.isEmpty()) { @@ -133,7 +133,7 @@ void ColorThemeEditDialog::colorOptionChanged(const QColor &newColor) Config()->setColor(currOption.optionName, currOption.color); if (!ColorThemeWorker::cutterSpecificOptions.contains(currOption.optionName)) { - Core()->cmdRaw(QString("ec %1 %2").arg(currOption.optionName).arg(currOption.color.name())); + Core()->setColor(currOption.optionName, currOption.color.name()); } previewDisasmWidget->colorsUpdatedSlot(); } diff --git a/src/widgets/BacktraceWidget.cpp b/src/widgets/BacktraceWidget.cpp index 433a1b1e..d4413c39 100644 --- a/src/widgets/BacktraceWidget.cpp +++ b/src/widgets/BacktraceWidget.cpp @@ -44,27 +44,25 @@ void BacktraceWidget::updateContents() void BacktraceWidget::setBacktraceGrid() { + RzList *list = rz_core_debug_backtraces(Core()->core()); int i = 0; - for (CutterJson backtraceItem : Core()->getBacktrace()) { - QString progCounter = RzAddressString(backtraceItem["pc"].toRVA()); - QString stackPointer = RzAddressString(backtraceItem["sp"].toRVA()); - st64 frameSize = backtraceItem["frame_size"].toSt64(); - QString funcName = backtraceItem["fname"].toString(); - QString desc = backtraceItem["desc"].toString(); + RzListIter *iter; + RzBacktrace *bt; + CutterRzListForeach (list, iter, RzBacktrace, bt) { + QString funcName = bt->fcn ? bt->fcn->name : ""; + QString pc = RzAddressString(bt->frame ? bt->frame->addr : 0); + QString sp = RzAddressString(bt->frame ? bt->frame->sp : 0); + QString frameSize = QString::number(bt->frame ? bt->frame->size : 0); + QString desc = bt->desc; - QStandardItem *rowPC = new QStandardItem(progCounter); - QStandardItem *rowSP = new QStandardItem(stackPointer); - QStandardItem *rowFrameSize = new QStandardItem(QString::number(frameSize)); - QStandardItem *rowFuncName = new QStandardItem(funcName); - QStandardItem *rowDesc = new QStandardItem(desc); - - modelBacktrace->setItem(i, 0, rowFuncName); - modelBacktrace->setItem(i, 1, rowSP); - modelBacktrace->setItem(i, 2, rowPC); - modelBacktrace->setItem(i, 3, rowDesc); - modelBacktrace->setItem(i, 4, rowFrameSize); - i++; + modelBacktrace->setItem(i, 0, new QStandardItem(funcName)); + modelBacktrace->setItem(i, 1, new QStandardItem(sp)); + modelBacktrace->setItem(i, 2, new QStandardItem(pc)); + modelBacktrace->setItem(i, 3, new QStandardItem(desc)); + modelBacktrace->setItem(i, 4, new QStandardItem(frameSize)); + ++i; } + rz_list_free(list); // Remove irrelevant old rows if (modelBacktrace->rowCount() > i) { diff --git a/src/widgets/ColorThemeListView.cpp b/src/widgets/ColorThemeListView.cpp index a5c93354..7d534f57 100644 --- a/src/widgets/ColorThemeListView.cpp +++ b/src/widgets/ColorThemeListView.cpp @@ -220,13 +220,7 @@ ColorThemeListView::ColorThemeListView(QWidget *parent) : QListView(parent) setItemDelegate(new ColorOptionDelegate(this)); setResizeMode(ResizeMode::Adjust); - QJsonArray rgb = - colorSettingsModel()->getTheme().object().find("gui.background").value().toArray(); - if (rgb.size() == 3) { - backgroundColor = QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt()); - } else { - backgroundColor = palette().base().color(); - } + backgroundColor = colorSettingsModel()->getTheme().find("gui.background").value(); connect(&blinkTimer, &QTimer::timeout, this, &ColorThemeListView::blinkTimeout); @@ -241,7 +235,7 @@ void ColorThemeListView::currentChanged(const QModelIndex ¤t, const QModel ColorOption prev = previous.data(Qt::UserRole).value(); Config()->setColor(prev.optionName, prev.color); if (ThemeWorker().getRizinSpecificOptions().contains(prev.optionName)) { - Core()->cmdRaw(QString("ec %1 %2").arg(prev.optionName).arg(prev.color.name())); + Core()->setColor(prev.optionName, prev.color.name()); } QListView::currentChanged(current, previous); @@ -267,9 +261,7 @@ void ColorThemeListView::mouseReleaseEvent(QMouseEvent *e) .contains(e->pos())) { ColorOption co = currentIndex().data(Qt::UserRole).value(); co.changed = false; - QJsonArray rgb = - ThemeWorker().getTheme(Config()->getColorTheme()).object()[co.optionName].toArray(); - co.color = QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt()); + co.color = ThemeWorker().getTheme(Config()->getColorTheme())[co.optionName]; model()->setData(currentIndex(), QVariant::fromValue(co)); QCursor c; c.setShape(Qt::CursorShape::ArrowCursor); @@ -307,7 +299,7 @@ void ColorThemeListView::blinkTimeout() auto updateColor = [](const QString &name, const QColor &color) { Config()->setColor(name, color); if (ThemeWorker().getRizinSpecificOptions().contains(name)) { - Core()->cmdRaw(QString("ec %1 %2").arg(name).arg(color.name())); + Core()->setColor(name, color.name()); } }; @@ -374,16 +366,10 @@ void ColorSettingsModel::updateTheme() { beginResetModel(); theme.clear(); - QJsonObject obj = ThemeWorker().getTheme(Config()->getColorTheme()).object(); + ColorThemeWorker::Theme obj = ThemeWorker().getTheme(Config()->getColorTheme()); for (auto it = obj.constBegin(); it != obj.constEnd(); it++) { - QJsonArray rgb = it.value().toArray(); - if (rgb.size() != 4) { - continue; - } - theme.push_back({ it.key(), - QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt(), rgb[3].toInt()), - false }); + theme.push_back({ it.key(), it.value(), false }); } std::sort(theme.begin(), theme.end(), [](const ColorOption &f, const ColorOption &s) { @@ -395,15 +381,13 @@ void ColorSettingsModel::updateTheme() endResetModel(); } -QJsonDocument ColorSettingsModel::getTheme() const +ColorThemeWorker::Theme ColorSettingsModel::getTheme() const { - QJsonObject obj; - int r, g, b, a; + ColorThemeWorker::Theme th; for (auto &it : theme) { - it.color.getRgb(&r, &g, &b, &a); - obj.insert(it.optionName, QJsonArray({ r, g, b, a })); + th.insert(it.optionName, it.color); } - return QJsonDocument(obj); + return th; } const QMap optionInfoMap__ = { diff --git a/src/widgets/ColorThemeListView.h b/src/widgets/ColorThemeListView.h index 8525312d..f992f2f7 100644 --- a/src/widgets/ColorThemeListView.h +++ b/src/widgets/ColorThemeListView.h @@ -73,7 +73,7 @@ public: void updateTheme(); - QJsonDocument getTheme() const; + QHash getTheme() const; private: QList theme;