mirror of
https://github.com/rizinorg/cutter.git
synced 2025-02-22 14:43:46 +00:00
Interface theme and theme features refactoring (#1598)
* init commit * use hex * delete obsolete code * alpha channel feature update * enhance pattern painting * remove useless code * add comment
This commit is contained in:
parent
a3657f913b
commit
228d3a454a
@ -5,6 +5,7 @@
|
|||||||
#include <QColor>
|
#include <QColor>
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
|
|
||||||
#include "common/Configuration.h"
|
#include "common/Configuration.h"
|
||||||
|
|
||||||
const QStringList ColorThemeWorker::cutterSpecificOptions = {
|
const QStringList ColorThemeWorker::cutterSpecificOptions = {
|
||||||
@ -160,15 +161,26 @@ bool ColorThemeWorker::isThemeExist(const QString &name) const
|
|||||||
QJsonDocument ColorThemeWorker::getTheme(const QString& themeName) const
|
QJsonDocument ColorThemeWorker::getTheme(const QString& themeName) const
|
||||||
{
|
{
|
||||||
int r, g, b, a;
|
int r, g, b, a;
|
||||||
QJsonObject theme;
|
QVariantMap theme;
|
||||||
QString curr = Config()->getColorTheme();
|
QString curr = Config()->getColorTheme();
|
||||||
|
|
||||||
if (themeName != curr) {
|
if (themeName != curr) {
|
||||||
Core()->cmd(QString("eco %1").arg(themeName));
|
Core()->cmd(QString("eco %1").arg(themeName));
|
||||||
theme = Core()->cmdj("ecj").object();
|
theme = Core()->cmdj("ecj").object().toVariantMap();
|
||||||
Core()->cmd(QString("eco %1").arg(curr));
|
Core()->cmd(QString("eco %1").arg(curr));
|
||||||
} else {
|
} else {
|
||||||
theme = Core()->cmdj("ecj").object();
|
theme = Core()->cmdj("ecj").object().toVariantMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto it = theme.begin(); it != theme.end(); it++) {
|
||||||
|
auto arr = it.value().toList();
|
||||||
|
QColor(arr[0].toInt(), arr[1].toInt(), arr[2].toInt()).getRgb(&r, &g, &b, &a);
|
||||||
|
theme[it.key()] = QJsonArray({r, g, b, a});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& it : cutterSpecificOptions) {
|
||||||
|
Configuration::cutterOptionColors[it][Configuration::relevantThemes[themeName]].getRgb(&r, &g, &b, &a);
|
||||||
|
theme.insert(it, QJsonArray{r, g, b, a});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isCustomTheme(themeName)) {
|
if (isCustomTheme(themeName)) {
|
||||||
@ -185,27 +197,13 @@ QJsonDocument ColorThemeWorker::getTheme(const QString& themeName) const
|
|||||||
QColor(sl[2]).getRgb(&r, &g, &b, &a);
|
QColor(sl[2]).getRgb(&r, &g, &b, &a);
|
||||||
theme.insert(sl[1], QJsonArray({r, g, b, a}));
|
theme.insert(sl[1], QJsonArray({r, g, b, a}));
|
||||||
}
|
}
|
||||||
for (auto &it : cutterSpecificOptions) {
|
|
||||||
if (!theme.contains(it)) {
|
|
||||||
mergeColors(Config()->getColor(it),
|
|
||||||
Config()->getColor("gui.background")).getRgb(&r, &g, &b, &a);
|
|
||||||
Config()->getColor(it).getRgb(&r, &g, &b, &a);
|
|
||||||
theme.insert(it, QJsonArray({r, g, b, a}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (auto &it : cutterSpecificOptions) {
|
|
||||||
mergeColors(Config()->getColor(it),
|
|
||||||
Config()->getColor("gui.background")).getRgb(&r, &g, &b, &a);
|
|
||||||
Config()->getColor(it).getRgb(&r, &g, &b, &a);
|
|
||||||
theme.insert(it, QJsonArray({r, g, b, a}));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto &key : radare2UnusedOptions) {
|
for (auto &key : radare2UnusedOptions) {
|
||||||
theme.remove(key);
|
theme.remove(key);
|
||||||
}
|
}
|
||||||
return QJsonDocument(theme);
|
|
||||||
|
return QJsonDocument(QJsonObject::fromVariantMap(theme));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ColorThemeWorker::deleteTheme(const QString &themeName) const
|
QString ColorThemeWorker::deleteTheme(const QString &themeName) const
|
||||||
|
@ -9,10 +9,77 @@
|
|||||||
|
|
||||||
#include "common/ColorThemeWorker.h"
|
#include "common/ColorThemeWorker.h"
|
||||||
|
|
||||||
const QList<CutterInterfaceTheme> kCutterInterfaceThemesList = {
|
/* Map with names of themes associated with its color palette
|
||||||
{ "Native", static_cast<ColorFlags>(LightFlag | DarkFlag) },
|
* (Dark or Light), so for dark interface themes will be shown only Dark color themes
|
||||||
{ "Dark", DarkFlag },
|
* and for light - only light ones.
|
||||||
{ "Light", LightFlag }
|
*/
|
||||||
|
const QHash<QString, ColorFlags> Configuration::relevantThemes = {
|
||||||
|
{ "ayu", DarkFlag },
|
||||||
|
{ "consonance", DarkFlag },
|
||||||
|
{ "darkda", DarkFlag },
|
||||||
|
{ "onedark", DarkFlag },
|
||||||
|
{ "solarized", DarkFlag },
|
||||||
|
{ "zenburn", DarkFlag },
|
||||||
|
{ "cutter", LightFlag },
|
||||||
|
{ "dark", LightFlag },
|
||||||
|
{ "matrix", LightFlag },
|
||||||
|
{ "tango", LightFlag },
|
||||||
|
{ "white", LightFlag }
|
||||||
|
};
|
||||||
|
|
||||||
|
const QHash<QString, QHash<ColorFlags, QColor>> Configuration::cutterOptionColors = {
|
||||||
|
{ "gui.cflow", { { DarkFlag, QColor(0xff, 0xff, 0xff) },
|
||||||
|
{ LightFlag, QColor(0x00, 0x00, 0x00) }} },
|
||||||
|
{ "gui.dataoffset", { { DarkFlag, QColor(0xff, 0xff, 0xff) },
|
||||||
|
{ LightFlag, QColor(0x00, 0x00, 0x00) }} },
|
||||||
|
{ "gui.imports", { { DarkFlag, QColor(0x32, 0x8c, 0xff) },
|
||||||
|
{ LightFlag, QColor(0x32, 0x8c, 0xff) }} },
|
||||||
|
{ "gui.item_invalid", { { DarkFlag, QColor(0x9b, 0x9b, 0x9b) },
|
||||||
|
{ LightFlag, QColor(0x9b, 0x9b, 0x9b) }} },
|
||||||
|
{ "gui.main", { { DarkFlag, QColor(0x00, 0x80, 0x00) },
|
||||||
|
{ LightFlag, QColor(0x00, 0x80, 0x00) }} },
|
||||||
|
{ "gui.item_unsafe", { { DarkFlag, QColor(0xff, 0x81, 0x7b) },
|
||||||
|
{ LightFlag, QColor(0xff, 0x81, 0x7b) }} },
|
||||||
|
{ "gui.navbar.seek", { { DarkFlag, QColor(0xe9, 0x56, 0x56) },
|
||||||
|
{ LightFlag, QColor(0xff, 0x00, 0x00) }} },
|
||||||
|
{ "gui.navbar.pc", { { DarkFlag, QColor(0x42, 0xee, 0xf4) },
|
||||||
|
{ LightFlag, QColor(0x42, 0xee, 0xf4) }} },
|
||||||
|
{ "gui.navbar.code", { { DarkFlag, QColor(0x82, 0xc8, 0x6f) },
|
||||||
|
{ LightFlag, QColor(0x68, 0xe5, 0x45) }} },
|
||||||
|
{ "gui.navbar.str", { { DarkFlag, QColor(0x6f, 0x86, 0xd8) },
|
||||||
|
{ LightFlag, QColor(0x45, 0x68, 0xe5) }} },
|
||||||
|
{ "gui.navbar.sym", { { DarkFlag, QColor(0xdd, 0xa3, 0x68) },
|
||||||
|
{ LightFlag, QColor(0xe5, 0x96, 0x45) }} },
|
||||||
|
{ "gui.navbar.empty", { { DarkFlag, QColor(0x64, 0x64, 0x64) },
|
||||||
|
{ LightFlag, QColor(0xdc, 0xec, 0xf5) }} },
|
||||||
|
{ "gui.breakpoint_background", { { DarkFlag, QColor(0x8c, 0x4c, 0x4c) },
|
||||||
|
{ LightFlag, QColor(0xe9, 0x8f, 0x8f) }} },
|
||||||
|
{ "gui.overview.node", { { DarkFlag, QColor(0x64, 0x64, 0x64) },
|
||||||
|
{ LightFlag, QColor(0xf5, 0xfa, 0xff) }} },
|
||||||
|
{ "gui.tooltip.background", { { DarkFlag, QColor(0x2a, 0x2c, 0x2e) },
|
||||||
|
{ LightFlag, QColor(0xfa, 0xfc, 0xfe) }} },
|
||||||
|
{ "gui.tooltip.foreground", { { DarkFlag, QColor(0xfa, 0xfc, 0xfe) },
|
||||||
|
{ LightFlag, QColor(0x2a, 0x2c, 0x2e) }} },
|
||||||
|
{ "gui.border", { { DarkFlag, QColor(0x64, 0x64, 0x64) },
|
||||||
|
{ LightFlag, QColor(0x91, 0xc8, 0xfa) }} },
|
||||||
|
{ "gui.background", { { DarkFlag, QColor(0x25, 0x28, 0x2b) },
|
||||||
|
{ LightFlag, QColor(0xff, 0xff, 0xff) }} },
|
||||||
|
{ "gui.alt_background", { { DarkFlag, QColor(0x1c, 0x1f, 0x24) },
|
||||||
|
{ LightFlag, QColor(0xf5, 0xfa, 0xff) }} },
|
||||||
|
{ "gui.disass_selected", { { DarkFlag, QColor(0x1f, 0x22, 0x28) },
|
||||||
|
{ LightFlag, QColor(0xff, 0xff, 0xff) }} },
|
||||||
|
{ "lineHighlight", { { DarkFlag, QColor(0x15, 0x1d, 0x1d, 0x96) },
|
||||||
|
{ LightFlag, QColor(0xd2, 0xd2, 0xff, 0x96) }} },
|
||||||
|
{ "wordHighlight", { { DarkFlag, QColor(0x34, 0x3a, 0x47, 0xff) },
|
||||||
|
{ LightFlag, QColor(0xb3, 0x77, 0xd6, 0x3c) }} },
|
||||||
|
{ "highlightPC", { { DarkFlag, QColor(0x57, 0x1a, 0x07) },
|
||||||
|
{ LightFlag, QColor(0xd6, 0xff, 0xd2) }} },
|
||||||
|
{ "gui.overview.fill", { { DarkFlag, QColor(0xff, 0xff, 0xff, 0x28) },
|
||||||
|
{ LightFlag, QColor(0xaf, 0xd9, 0xea, 0x41) }} },
|
||||||
|
{ "gui.overview.border", { { DarkFlag, QColor(0x63, 0xda, 0xe8, 0x32) },
|
||||||
|
{ LightFlag, QColor(0x63, 0xda, 0xe8, 0x32) }} },
|
||||||
|
{ "gui.navbar.err", { { DarkFlag, QColor(0x03, 0xaa, 0xf5) },
|
||||||
|
{ LightFlag, QColor(0x03, 0xaa, 0xf5) }} }
|
||||||
};
|
};
|
||||||
|
|
||||||
Configuration *Configuration::mPtr = nullptr;
|
Configuration *Configuration::mPtr = nullptr;
|
||||||
@ -191,13 +258,17 @@ bool Configuration::windowColorIsDark()
|
|||||||
} else if (currentThemeColorFlags == ColorFlags::DarkFlag) {
|
} else if (currentThemeColorFlags == ColorFlags::DarkFlag) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
return nativeWindowIsDark();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Configuration::nativeWindowIsDark()
|
||||||
|
{
|
||||||
const QPalette &palette = qApp->palette();
|
const QPalette &palette = qApp->palette();
|
||||||
auto windowColor = palette.color(QPalette::Window).toRgb();
|
auto windowColor = palette.color(QPalette::Window).toRgb();
|
||||||
return (windowColor.red() + windowColor.green() + windowColor.blue()) < 382;
|
return (windowColor.red() + windowColor.green() + windowColor.blue()) < 382;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Configuration::loadBaseThemeNative()
|
void Configuration::loadNativeStylesheet()
|
||||||
{
|
{
|
||||||
/* Load Qt Theme */
|
/* Load Qt Theme */
|
||||||
QFile f(":native/native.qss");
|
QFile f(":native/native.qss");
|
||||||
@ -218,62 +289,12 @@ void Configuration::loadBaseThemeNative()
|
|||||||
for (auto widget : qApp->allWidgets()) {
|
for (auto widget : qApp->allWidgets()) {
|
||||||
widget->setPalette(nativePalette);
|
widget->setPalette(nativePalette);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Colors */
|
|
||||||
// GUI
|
|
||||||
setColor("gui.cflow", QColor(0, 0, 0));
|
|
||||||
// Custom
|
|
||||||
setColor("gui.imports", QColor(50, 140, 255));
|
|
||||||
setColor("gui.main", QColor(0, 128, 0));
|
|
||||||
setColor("gui.navbar.seek", QColor(255, 0, 0));
|
|
||||||
setColor("gui.navbar.pc", QColor(66, 238, 244));
|
|
||||||
setColor("gui.navbar.code", QColor(104, 229, 69));
|
|
||||||
setColor("gui.navbar.str", QColor(69, 104, 229));
|
|
||||||
setColor("gui.navbar.sym", QColor(229, 150, 69));
|
|
||||||
setColor("gui.navbar.empty", QColor(100, 100, 100));
|
|
||||||
setColor("gui.breakpoint_background", QColor(233, 143, 143));
|
|
||||||
setColor("gui.item_invalid", QColor(155, 155, 155));
|
|
||||||
setColor("gui.item_unsafe", QColor(255, 129, 123));
|
|
||||||
setColor("gui.overview.node", QColor(200, 200, 200));
|
|
||||||
setColor("gui.tooltip.background", QColor(250, 252, 254));
|
|
||||||
setColor("gui.tooltip.foreground", QColor(42, 44, 46));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Configuration::loadNativeTheme()
|
|
||||||
{
|
|
||||||
loadBaseThemeNative();
|
|
||||||
|
|
||||||
if (windowColorIsDark()) {
|
|
||||||
setColor("gui.border", QColor(0, 0, 0));
|
|
||||||
setColor("gui.background", QColor(30, 30, 30));
|
|
||||||
setColor("gui.alt_background", QColor(42, 42, 42));
|
|
||||||
setColor("gui.disass_selected", QColor(35, 35, 35));
|
|
||||||
setColor("lineHighlight", QColor(255, 255, 255, 15));
|
|
||||||
setColor("wordHighlight", QColor(20, 20, 20, 255));
|
|
||||||
setColor("highlightPC", QColor(87, 26, 7));
|
|
||||||
setColor("gui.tooltip.background", QColor(42, 44, 46));
|
|
||||||
setColor("gui.tooltip.foreground", QColor(250, 252, 254));
|
|
||||||
setColor("gui.dataoffset", QColor(255, 255, 255));
|
|
||||||
setColor("gui.overview.fill", QColor(255, 255, 255, 40));
|
|
||||||
setColor("gui.overview.border", QColor(99, 218, 232, 50));
|
|
||||||
} else {
|
|
||||||
setColor("gui.border", QColor(0, 0, 0));
|
|
||||||
setColor("gui.background", QColor(255, 255, 255));
|
|
||||||
setColor("gui.alt_background", QColor(245, 250, 255));
|
|
||||||
setColor("gui.disass_selected", QColor(255, 255, 255));
|
|
||||||
setColor("lineHighlight", QColor(210, 210, 255, 150));
|
|
||||||
setColor("wordHighlight", QColor(179, 119, 214, 60));
|
|
||||||
setColor("highlightPC", QColor(214, 255, 210));
|
|
||||||
setColor("gui.dataoffset", QColor(0, 0, 0));
|
|
||||||
setColor("gui.overview.fill", QColor(175, 217, 234, 65));
|
|
||||||
setColor("gui.overview.border", QColor(99, 218, 232, 50));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Loads the Light theme of Cutter and modify special theme colors
|
* @brief Loads the Light theme of Cutter and modify special theme colors
|
||||||
*/
|
*/
|
||||||
void Configuration::loadLightTheme()
|
void Configuration::loadLightStylesheet()
|
||||||
{
|
{
|
||||||
/* Load Qt Theme */
|
/* Load Qt Theme */
|
||||||
QFile f(":lightstyle/light.qss");
|
QFile f(":lightstyle/light.qss");
|
||||||
@ -290,26 +311,9 @@ void Configuration::loadLightTheme()
|
|||||||
|
|
||||||
qApp->setStyleSheet(stylesheet);
|
qApp->setStyleSheet(stylesheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
setColor("gui.border", QColor(145, 200, 250));
|
|
||||||
setColor("gui.background", QColor(255, 255, 255));
|
|
||||||
setColor("gui.alt_background", QColor(245, 250, 255));
|
|
||||||
setColor("gui.disass_selected", QColor(255, 255, 255));
|
|
||||||
setColor("lineHighlight", QColor(210, 210, 255, 150));
|
|
||||||
setColor("wordHighlight", QColor(179, 119, 214, 60));
|
|
||||||
setColor("highlightPC", QColor(214, 255, 210));
|
|
||||||
setColor("gui.navbar.empty", QColor(220, 236, 245));
|
|
||||||
setColor("gui.navbar.err", QColor(3, 170, 245));
|
|
||||||
setColor("gui.tooltip.background", QColor(250, 252, 254));
|
|
||||||
setColor("gui.tooltip.foreground", QColor(42, 44, 46));
|
|
||||||
|
|
||||||
// Graph Overview
|
|
||||||
setColor("gui.overview.node", QColor(245, 250, 255));
|
|
||||||
setColor("gui.overview.fill", QColor(175, 217, 234, 65));
|
|
||||||
setColor("gui.overview.border", QColor(99, 218, 232, 50));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Configuration::loadBaseThemeDark()
|
void Configuration::loadDarkStylesheet()
|
||||||
{
|
{
|
||||||
/* Load Qt Theme */
|
/* Load Qt Theme */
|
||||||
QFile f(":qdarkstyle/style.qss");
|
QFile f(":qdarkstyle/style.qss");
|
||||||
@ -333,50 +337,6 @@ void Configuration::loadBaseThemeDark()
|
|||||||
qApp->setPalette(p);
|
qApp->setPalette(p);
|
||||||
qApp->setStyleSheet(stylesheet);
|
qApp->setStyleSheet(stylesheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Colors */
|
|
||||||
// GUI
|
|
||||||
setColor("gui.cflow", QColor(255, 255, 255));
|
|
||||||
setColor("gui.dataoffset", QColor(255, 255, 255));
|
|
||||||
// Custom
|
|
||||||
setColor("gui.imports", QColor(50, 140, 255));
|
|
||||||
setColor("gui.item_invalid", QColor(155, 155, 155));
|
|
||||||
setColor("gui.item_unsafe", QColor(255, 129, 123));
|
|
||||||
setColor("gui.main", QColor(0, 128, 0));
|
|
||||||
|
|
||||||
// GUI: navbar
|
|
||||||
setColor("gui.navbar.seek", QColor(233, 86, 86));
|
|
||||||
setColor("gui.navbar.pc", QColor(66, 238, 244));
|
|
||||||
setColor("gui.navbar.code", QColor(130, 200, 111));
|
|
||||||
setColor("gui.navbar.str", QColor(111, 134, 216));
|
|
||||||
setColor("gui.navbar.sym", QColor(221, 163, 104));
|
|
||||||
setColor("gui.navbar.empty", QColor(100, 100, 100));
|
|
||||||
|
|
||||||
// RIP line selection in debug
|
|
||||||
setColor("highlightPC", QColor(87, 26, 7));
|
|
||||||
setColor("gui.breakpoint_background", QColor(140, 76, 76));
|
|
||||||
|
|
||||||
// Graph Overview
|
|
||||||
setColor("gui.overview.node", QColor(100, 100, 100));
|
|
||||||
setColor("gui.overview.fill", QColor(255, 255, 255, 40));
|
|
||||||
setColor("gui.overview.border", QColor(99, 218, 232, 50));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Configuration::loadDarkTheme()
|
|
||||||
{
|
|
||||||
loadBaseThemeDark();
|
|
||||||
setColor("gui.border", QColor(100, 100, 100));
|
|
||||||
// Windows background
|
|
||||||
setColor("gui.background", QColor(37, 40, 43));
|
|
||||||
// Disassembly nodes background
|
|
||||||
setColor("gui.alt_background", QColor(28, 31, 36));
|
|
||||||
// Disassembly nodes background when selected
|
|
||||||
setColor("gui.disass_selected", QColor(31, 34, 40));
|
|
||||||
// Disassembly line selected
|
|
||||||
setColor("gui.tooltip.background", QColor(42, 44, 46));
|
|
||||||
setColor("gui.tooltip.foreground", QColor(250, 252, 254));
|
|
||||||
setColor("lineHighlight", QColor(21, 29, 29, 150));
|
|
||||||
setColor("wordHighlight", QColor(52, 58, 71, 255));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const QFont Configuration::getFont() const
|
const QFont Configuration::getFont() const
|
||||||
@ -399,21 +359,26 @@ QString Configuration::getLastThemeOf(const CutterInterfaceTheme &currInterfaceT
|
|||||||
|
|
||||||
void Configuration::setInterfaceTheme(int theme)
|
void Configuration::setInterfaceTheme(int theme)
|
||||||
{
|
{
|
||||||
if (theme >= kCutterInterfaceThemesList.size() ||
|
if (theme >= cutterInterfaceThemesList().size() ||
|
||||||
theme < 0) {
|
theme < 0) {
|
||||||
theme = 0;
|
theme = 0;
|
||||||
}
|
}
|
||||||
s.setValue("ColorPalette", theme);
|
s.setValue("ColorPalette", theme);
|
||||||
QString themeName = kCutterInterfaceThemesList[theme].name;
|
|
||||||
|
|
||||||
if (themeName == "Native") {
|
CutterInterfaceTheme interfaceTheme = cutterInterfaceThemesList()[theme];
|
||||||
loadNativeTheme();
|
|
||||||
} else if (themeName == "Dark") {
|
if (interfaceTheme.name == "Native") {
|
||||||
loadDarkTheme();
|
loadNativeStylesheet();
|
||||||
} else if (themeName == "Light") {
|
} else if (interfaceTheme.name == "Dark") {
|
||||||
loadLightTheme();
|
loadDarkStylesheet();
|
||||||
|
} else if (interfaceTheme.name == "Light") {
|
||||||
|
loadLightStylesheet();
|
||||||
} else {
|
} else {
|
||||||
loadNativeTheme();
|
loadNativeStylesheet();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto it = cutterOptionColors.cbegin(); it != cutterOptionColors.cend(); it++) {
|
||||||
|
setColor(it.key(), it.value()[interfaceTheme.flag]);
|
||||||
}
|
}
|
||||||
|
|
||||||
emit interfaceThemeChanged();
|
emit interfaceThemeChanged();
|
||||||
@ -423,11 +388,11 @@ void Configuration::setInterfaceTheme(int theme)
|
|||||||
const CutterInterfaceTheme *Configuration::getCurrentTheme()
|
const CutterInterfaceTheme *Configuration::getCurrentTheme()
|
||||||
{
|
{
|
||||||
int i = getInterfaceTheme();
|
int i = getInterfaceTheme();
|
||||||
if (i < 0 || i >= kCutterInterfaceThemesList.size()) {
|
if (i < 0 || i >= cutterInterfaceThemesList().size()) {
|
||||||
i = 0;
|
i = 0;
|
||||||
setInterfaceTheme(i);
|
setInterfaceTheme(i);
|
||||||
}
|
}
|
||||||
return &kCutterInterfaceThemesList[i];
|
return &cutterInterfaceThemesList()[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Configuration::getLogoFile()
|
QString Configuration::getLogoFile()
|
||||||
@ -480,11 +445,6 @@ void Configuration::setColorTheme(const QString &theme)
|
|||||||
setColor(it.key(), QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt(), rgb[3].toInt()));
|
setColor(it.key(), QColor(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt(), rgb[3].toInt()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trick Cutter to load colors that are not specified in standard theme
|
|
||||||
if (!ThemeWorker().isCustomTheme(theme)) {
|
|
||||||
setInterfaceTheme(getInterfaceTheme());
|
|
||||||
}
|
|
||||||
|
|
||||||
emit colorsUpdated();
|
emit colorsUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -502,6 +462,16 @@ void Configuration::applySavedAsmOptions()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QList<CutterInterfaceTheme>& Configuration::cutterInterfaceThemesList()
|
||||||
|
{
|
||||||
|
static const QList<CutterInterfaceTheme> list = {
|
||||||
|
{ "Native", Configuration::nativeWindowIsDark() ? DarkFlag : LightFlag },
|
||||||
|
{ "Dark", DarkFlag },
|
||||||
|
{ "Light", LightFlag }
|
||||||
|
};
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
QVariant Configuration::getConfigVar(const QString &key)
|
QVariant Configuration::getConfigVar(const QString &key)
|
||||||
{
|
{
|
||||||
QHash<QString, QVariant>::const_iterator it = asmOptions.find(key);
|
QHash<QString, QVariant>::const_iterator it = asmOptions.find(key);
|
||||||
|
@ -18,7 +18,6 @@ struct CutterInterfaceTheme {
|
|||||||
ColorFlags flag;
|
ColorFlags flag;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const QList<CutterInterfaceTheme> kCutterInterfaceThemesList;
|
|
||||||
|
|
||||||
class Configuration : public QObject
|
class Configuration : public QObject
|
||||||
{
|
{
|
||||||
@ -31,14 +30,18 @@ private:
|
|||||||
// Colors
|
// Colors
|
||||||
void loadBaseThemeNative();
|
void loadBaseThemeNative();
|
||||||
void loadBaseThemeDark();
|
void loadBaseThemeDark();
|
||||||
void loadNativeTheme();
|
void loadNativeStylesheet();
|
||||||
void loadLightTheme();
|
void loadLightStylesheet();
|
||||||
void loadDarkTheme();
|
void loadDarkStylesheet();
|
||||||
|
|
||||||
// Asm Options
|
// Asm Options
|
||||||
void applySavedAsmOptions();
|
void applySavedAsmOptions();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static const QList<CutterInterfaceTheme>& cutterInterfaceThemesList();
|
||||||
|
static const QHash<QString, ColorFlags> relevantThemes;
|
||||||
|
static const QHash<QString, QHash<ColorFlags, QColor>> cutterOptionColors;
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
Configuration();
|
Configuration();
|
||||||
static Configuration *instance();
|
static Configuration *instance();
|
||||||
@ -63,6 +66,7 @@ public:
|
|||||||
|
|
||||||
// Colors
|
// Colors
|
||||||
bool windowColorIsDark();
|
bool windowColorIsDark();
|
||||||
|
static bool nativeWindowIsDark();
|
||||||
void setLastThemeOf(const CutterInterfaceTheme &currInterfaceTheme, const QString &theme);
|
void setLastThemeOf(const CutterInterfaceTheme &currInterfaceTheme, const QString &theme);
|
||||||
QString getLastThemeOf(const CutterInterfaceTheme &currInterfaceTheme) const;
|
QString getLastThemeOf(const CutterInterfaceTheme &currInterfaceTheme) const;
|
||||||
void setInterfaceTheme(int theme);
|
void setInterfaceTheme(int theme);
|
||||||
|
@ -80,11 +80,11 @@ void AppearanceOptionsWidget::updateThemeFromConfig(bool interfaceThemeChanged)
|
|||||||
QSignalBlocker signalBlockerThemeBox(ui->themeComboBox);
|
QSignalBlocker signalBlockerThemeBox(ui->themeComboBox);
|
||||||
|
|
||||||
ui->themeComboBox->clear();
|
ui->themeComboBox->clear();
|
||||||
for (auto &it : kCutterInterfaceThemesList) {
|
for (auto &it : Configuration::cutterInterfaceThemesList()) {
|
||||||
ui->themeComboBox->addItem(it.name);
|
ui->themeComboBox->addItem(it.name);
|
||||||
}
|
}
|
||||||
int currInterfaceThemeIndex = Config()->getInterfaceTheme();
|
int currInterfaceThemeIndex = Config()->getInterfaceTheme();
|
||||||
if (currInterfaceThemeIndex >= kCutterInterfaceThemesList.size()) {
|
if (currInterfaceThemeIndex >= Configuration::cutterInterfaceThemesList().size()) {
|
||||||
currInterfaceThemeIndex = 0;
|
currInterfaceThemeIndex = 0;
|
||||||
Config()->setInterfaceTheme(currInterfaceThemeIndex);
|
Config()->setInterfaceTheme(currInterfaceThemeIndex);
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,12 @@ ColorThemeEditDialog::ColorThemeEditDialog(QWidget *parent) :
|
|||||||
configSignalBlocker(Config()), // Blocks signals from Config to avoid updating of widgets during editing
|
configSignalBlocker(Config()), // Blocks signals from Config to avoid updating of widgets during editing
|
||||||
colorTheme(Config()->getColorTheme())
|
colorTheme(Config()->getColorTheme())
|
||||||
{
|
{
|
||||||
|
showAlphaOptions = {
|
||||||
|
"gui.overview.border",
|
||||||
|
"gui.overview.fill",
|
||||||
|
"wordHighlight",
|
||||||
|
"lineHighlight"
|
||||||
|
};
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
ui->colorComboBox->setShowOnlyCustom(true);
|
ui->colorComboBox->setShowOnlyCustom(true);
|
||||||
|
|
||||||
@ -41,7 +47,7 @@ ColorThemeEditDialog::ColorThemeEditDialog(QWidget *parent) :
|
|||||||
.data(Qt::UserRole)
|
.data(Qt::UserRole)
|
||||||
.value<ColorOption>()
|
.value<ColorOption>()
|
||||||
.optionName;
|
.optionName;
|
||||||
ui->colorPicker->setAlphaEnabled(optionName == "wordHighlight" || optionName == "lineHighlight");
|
ui->colorPicker->setAlphaEnabled(showAlphaOptions.contains(optionName));
|
||||||
});
|
});
|
||||||
|
|
||||||
ui->colorThemeListView->setCurrentIndex(ui->colorThemeListView->model()->index(0, 0));
|
ui->colorThemeListView->setCurrentIndex(ui->colorThemeListView->model()->index(0, 0));
|
||||||
|
@ -43,6 +43,7 @@ private:
|
|||||||
bool themeWasEdited(const QString &theme) const;
|
bool themeWasEdited(const QString &theme) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QList<QString> showAlphaOptions;
|
||||||
Ui::ColorThemeEditDialog *ui;
|
Ui::ColorThemeEditDialog *ui;
|
||||||
QSignalBlocker configSignalBlocker;
|
QSignalBlocker configSignalBlocker;
|
||||||
DisassemblyWidget *previewDisasmWidget;
|
DisassemblyWidget *previewDisasmWidget;
|
||||||
|
@ -5,24 +5,6 @@
|
|||||||
#include "common/ColorThemeWorker.h"
|
#include "common/ColorThemeWorker.h"
|
||||||
#include "common/Configuration.h"
|
#include "common/Configuration.h"
|
||||||
|
|
||||||
/* Map with names of themes associated with its color palette
|
|
||||||
* (Dark or Light), so for dark interface themes will be shown only Dark color themes
|
|
||||||
* and for light - only light ones.
|
|
||||||
*/
|
|
||||||
static const QHash<QString, ColorFlags> kRelevantThemes = {
|
|
||||||
{ "ayu", DarkFlag },
|
|
||||||
{ "consonance", DarkFlag },
|
|
||||||
{ "darkda", DarkFlag },
|
|
||||||
{ "onedark", DarkFlag },
|
|
||||||
{ "solarized", DarkFlag },
|
|
||||||
{ "zenburn", DarkFlag },
|
|
||||||
{ "cutter", LightFlag },
|
|
||||||
{ "dark", LightFlag },
|
|
||||||
{ "matrix", LightFlag },
|
|
||||||
{ "tango", LightFlag },
|
|
||||||
{ "white", LightFlag }
|
|
||||||
};
|
|
||||||
|
|
||||||
ColorThemeComboBox::ColorThemeComboBox(QWidget *parent) : QComboBox(parent), showOnlyCustom(false)
|
ColorThemeComboBox::ColorThemeComboBox(QWidget *parent) : QComboBox(parent), showOnlyCustom(false)
|
||||||
{
|
{
|
||||||
connect(this, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
connect(this, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||||
@ -42,13 +24,14 @@ void ColorThemeComboBox::updateFromConfig(bool interfaceThemeChanged)
|
|||||||
clear();
|
clear();
|
||||||
for (const QString &theme : themes) {
|
for (const QString &theme : themes) {
|
||||||
if (ThemeWorker().isCustomTheme(theme) ||
|
if (ThemeWorker().isCustomTheme(theme) ||
|
||||||
(kCutterInterfaceThemesList[curInterfaceThemeIndex].flag & kRelevantThemes[theme])) {
|
(Configuration::cutterInterfaceThemesList()[curInterfaceThemeIndex].flag &
|
||||||
|
Configuration::relevantThemes[theme])) {
|
||||||
addItem(theme);
|
addItem(theme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString curTheme = interfaceThemeChanged
|
QString curTheme = interfaceThemeChanged
|
||||||
? Config()->getLastThemeOf(kCutterInterfaceThemesList[curInterfaceThemeIndex])
|
? Config()->getLastThemeOf(Configuration::cutterInterfaceThemesList()[curInterfaceThemeIndex])
|
||||||
: Config()->getColorTheme();
|
: Config()->getColorTheme();
|
||||||
const int index = findText(curTheme);
|
const int index = findText(curTheme);
|
||||||
|
|
||||||
@ -73,12 +56,12 @@ void ColorThemeComboBox::onCurrentIndexChanged(int index)
|
|||||||
QString theme = itemText(index);
|
QString theme = itemText(index);
|
||||||
|
|
||||||
int curQtThemeIndex = Config()->getInterfaceTheme();
|
int curQtThemeIndex = Config()->getInterfaceTheme();
|
||||||
if (curQtThemeIndex >= kCutterInterfaceThemesList.size()) {
|
if (curQtThemeIndex >= Configuration::cutterInterfaceThemesList().size()) {
|
||||||
curQtThemeIndex = 0;
|
curQtThemeIndex = 0;
|
||||||
Config()->setInterfaceTheme(curQtThemeIndex);
|
Config()->setInterfaceTheme(curQtThemeIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
Config()->setLastThemeOf(kCutterInterfaceThemesList[curQtThemeIndex], theme);
|
Config()->setLastThemeOf(Configuration::cutterInterfaceThemesList()[curQtThemeIndex], theme);
|
||||||
Config()->setColorTheme(theme);
|
Config()->setColorTheme(theme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,7 +133,21 @@ void ColorOptionDelegate::paint(QPainter *painter,
|
|||||||
|
|
||||||
QPainterPath roundedColorRect;
|
QPainterPath roundedColorRect;
|
||||||
roundedColorRect.addRoundedRect(colorRect, fontHeight / 4, fontHeight / 4);
|
roundedColorRect.addRoundedRect(colorRect, fontHeight / 4, fontHeight / 4);
|
||||||
painter->setPen(Qt::NoPen);
|
// Create chess-like pattern of black and white squares
|
||||||
|
// and fill background of roundedColorRect with it
|
||||||
|
if (currCO.color.alpha() < 255) {
|
||||||
|
const int c1 = static_cast<int>(8 * painter->device()->devicePixelRatioF());
|
||||||
|
const int c2 = c1 / 2;
|
||||||
|
QPixmap p(c1, c1);
|
||||||
|
QPainter paint(&p);
|
||||||
|
paint.fillRect(0, 0, c1, c1, Qt::white);
|
||||||
|
paint.fillRect(0, 0, c2, c2, Qt::black);
|
||||||
|
paint.fillRect(c2, c2, c2, c2, Qt::black);
|
||||||
|
QBrush b;
|
||||||
|
b.setTexture(p);
|
||||||
|
painter->fillPath(roundedColorRect, b);
|
||||||
|
}
|
||||||
|
painter->setPen(currCO.color);
|
||||||
painter->fillPath(roundedColorRect, currCO.color);
|
painter->fillPath(roundedColorRect, currCO.color);
|
||||||
|
|
||||||
QString desc = painter->fontMetrics().elidedText(
|
QString desc = painter->fontMetrics().elidedText(
|
||||||
|
Loading…
Reference in New Issue
Block a user