Merge pull request #415 from AdenKoperczak/add_theme_editor

Add theme editor
This commit is contained in:
Dan Paulat 2025-04-11 23:31:25 -05:00 committed by GitHub
commit b74229a3f4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 64 additions and 20 deletions

2
.gitmodules vendored
View file

@ -39,4 +39,4 @@
url = https://github.com/dpaulat/maplibre-gl-native.git url = https://github.com/dpaulat/maplibre-gl-native.git
[submodule "external/qt6ct"] [submodule "external/qt6ct"]
path = external/qt6ct path = external/qt6ct
url = https://github.com/trialuser02/qt6ct.git url = https://github.com/AdenKoperczak/qt6ct.git

2
external/qt6ct vendored

@ -1 +1 @@
Subproject commit 55dba8704c0a748b0ce9f2d3cc2cf200ca3db464 Subproject commit 2c569c6c4776ea5a1299030c079b16f70473c9e6

27
external/qt6ct.cmake vendored
View file

@ -2,10 +2,10 @@ cmake_minimum_required(VERSION 3.16.0)
set(PROJECT_NAME scwx-qt6ct) set(PROJECT_NAME scwx-qt6ct)
find_package(QT NAMES Qt6 find_package(QT NAMES Qt6
COMPONENTS Gui COMPONENTS Gui Widgets
REQUIRED) REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} find_package(Qt${QT_VERSION_MAJOR}
COMPONENTS Gui COMPONENTS Gui Widgets
REQUIRED) REQUIRED)
#extract version from qt6ct.h #extract version from qt6ct.h
@ -24,20 +24,39 @@ else()
message(FATAL_ERROR "invalid header") message(FATAL_ERROR "invalid header")
endif() endif()
set(app_SRCS set(qt6ct-common-source
qt6ct/src/qt6ct-common/qt6ct.cpp qt6ct/src/qt6ct-common/qt6ct.cpp
) )
add_library(qt6ct-common STATIC ${app_SRCS}) set(qt6ct-widgets-source
qt6ct/src/qt6ct/paletteeditdialog.cpp
qt6ct/src/qt6ct/paletteeditdialog.ui
)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
include_directories(qt6ct/src/qt6ct-common)
add_library(qt6ct-common STATIC ${qt6ct-common-source})
set_target_properties(qt6ct-common PROPERTIES VERSION ${QT6CT_VERSION}) set_target_properties(qt6ct-common PROPERTIES VERSION ${QT6CT_VERSION})
target_link_libraries(qt6ct-common PRIVATE Qt6::Gui) target_link_libraries(qt6ct-common PRIVATE Qt6::Gui)
target_compile_definitions(qt6ct-common PRIVATE QT6CT_LIBRARY) target_compile_definitions(qt6ct-common PRIVATE QT6CT_LIBRARY)
add_library(qt6ct-widgets STATIC ${qt6ct-widgets-source})
set_target_properties(qt6ct-widgets PROPERTIES VERSION ${QT6CT_VERSION})
target_link_libraries(qt6ct-widgets PRIVATE Qt6::Widgets Qt6::WidgetsPrivate qt6ct-common)
target_compile_definitions(qt6ct-widgets PRIVATE QT6CT_LIBRARY)
if (MSVC) if (MSVC)
# Produce PDB file for debug # Produce PDB file for debug
target_compile_options(qt6ct-common PRIVATE "$<$<CONFIG:Release>:/Zi>") target_compile_options(qt6ct-common PRIVATE "$<$<CONFIG:Release>:/Zi>")
target_compile_options(qt6ct-widgets PRIVATE "$<$<CONFIG:Release>:/Zi>")
else() else()
target_compile_options(qt6ct-common PRIVATE "$<$<CONFIG:Release>:-g>") target_compile_options(qt6ct-common PRIVATE "$<$<CONFIG:Release>:-g>")
target_compile_options(qt6ct-widgets PRIVATE "$<$<CONFIG:Release>:-g>")
endif() endif()
target_include_directories( qt6ct-common INTERFACE qt6ct/src ) target_include_directories( qt6ct-common INTERFACE qt6ct/src )
target_include_directories( qt6ct-widgets INTERFACE qt6ct/src )

View file

@ -703,6 +703,7 @@ target_link_libraries(scwx-qt PUBLIC Qt${QT_VERSION_MAJOR}::Widgets
glm::glm glm::glm
imgui imgui
qt6ct-common qt6ct-common
qt6ct-widgets
SQLite::SQLite3 SQLite::SQLite3
wxdata) wxdata)

View file

@ -45,9 +45,15 @@
#include <QGeoPositionInfo> #include <QGeoPositionInfo>
#include <QPushButton> #include <QPushButton>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QStandardPaths>
#include <QToolButton> #include <QToolButton>
#include <utility> #include <utility>
#define QT6CT_LIBRARY
#include <qt6ct-common/qt6ct.h>
#include <qt6ct/paletteeditdialog.h>
#undef QT6CT_LIBRARY
namespace scwx namespace scwx
{ {
namespace qt namespace qt
@ -578,31 +584,49 @@ void SettingsDialogImpl::SetupGeneralTab()
self_, self_,
[this]() [this]()
{ {
static const std::string themeFilter = "Qt6Ct Theme File (*.conf)"; const settings::GeneralSettings& generalSettings =
static const std::string allFilter = "All Files (*)"; settings::GeneralSettings::Instance();
QString file = generalSettings.theme_file().GetStagedOrValue().c_str();
QFileDialog* dialog = new QFileDialog(self_); if (file.isEmpty())
{
const QString appDataPath {QStandardPaths::writableLocation(
QStandardPaths::AppLocalDataLocation)};
file = appDataPath + "/theme.conf";
self_->ui->themeFileLineEdit->setText(file);
// setText does not emit the textEdited signal
Q_EMIT self_->ui->themeFileLineEdit->textEdited(file);
}
dialog->setFileMode(QFileDialog::ExistingFile); const QPalette palette =
Qt6CT::loadColorScheme(file, QApplication::palette());
QStyle* style = QApplication::style();
dialog->setNameFilters( // WA_DeleteOnClose manages memory
{QObject::tr(themeFilter.c_str()), QObject::tr(allFilter.c_str())}); // NOLINTNEXTLINE(cppcoreguidelines-owning-memory)
auto* dialog = new PaletteEditDialog(palette, style, self_);
dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect( QObject::connect(
dialog, dialog,
&QFileDialog::fileSelected, &QDialog::accepted,
self_, self_,
[this](const QString& file) [dialog]()
{ {
QString path = QDir::toNativeSeparators(file); const QPalette palette = dialog->selectedPalette();
logger_->info("Selected theme file: {}", path.toStdString()); const settings::GeneralSettings& generalSettings =
self_->ui->themeFileLineEdit->setText(path); settings::GeneralSettings::Instance();
const QString file =
generalSettings.theme_file().GetStagedOrValue().c_str();
Qt6CT::createColorScheme(file, palette);
// setText does not emit the textEdited signal auto uiStyle = scwx::qt::types::GetUiStyle(
Q_EMIT self_->ui->themeFileLineEdit->textEdited(path); generalSettings.theme().GetValue());
if (uiStyle == scwx::qt::types::UiStyle::FusionCustom)
{
QApplication::setPalette(palette);
}
}); });
dialog->open(); dialog->open();
}); });