From c29c0e82dd2f177e8aae7a81cea2de3ea51e8e92 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Fri, 11 Apr 2025 12:35:23 -0400 Subject: [PATCH] Add theme editor dialog --- external/qt6ct.cmake | 27 +++++++++-- scwx-qt/scwx-qt.cmake | 1 + scwx-qt/source/scwx/qt/ui/settings_dialog.cpp | 45 ++++++++++++------- 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/external/qt6ct.cmake b/external/qt6ct.cmake index 9c1c177a..665b5368 100644 --- a/external/qt6ct.cmake +++ b/external/qt6ct.cmake @@ -2,10 +2,10 @@ cmake_minimum_required(VERSION 3.16.0) set(PROJECT_NAME scwx-qt6ct) find_package(QT NAMES Qt6 - COMPONENTS Gui + COMPONENTS Gui Widgets REQUIRED) find_package(Qt${QT_VERSION_MAJOR} - COMPONENTS Gui + COMPONENTS Gui Widgets REQUIRED) #extract version from qt6ct.h @@ -24,20 +24,39 @@ else() message(FATAL_ERROR "invalid header") endif() -set(app_SRCS +set(qt6ct-common-source 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}) target_link_libraries(qt6ct-common PRIVATE Qt6::Gui) 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) # Produce PDB file for debug target_compile_options(qt6ct-common PRIVATE "$<$:/Zi>") + target_compile_options(qt6ct-widgets PRIVATE "$<$:/Zi>") else() target_compile_options(qt6ct-common PRIVATE "$<$:-g>") + target_compile_options(qt6ct-widgets PRIVATE "$<$:-g>") endif() target_include_directories( qt6ct-common INTERFACE qt6ct/src ) +target_include_directories( qt6ct-widgets INTERFACE qt6ct/src ) diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 74864ab7..4c0ea7cd 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -703,6 +703,7 @@ target_link_libraries(scwx-qt PUBLIC Qt${QT_VERSION_MAJOR}::Widgets glm::glm imgui qt6ct-common + qt6ct-widgets SQLite::SQLite3 wxdata) diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index fa891795..a339a79e 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -48,6 +48,11 @@ #include #include +#define QT6CT_LIBRARY +#include +#include +#undef QT6CT_LIBRARY + namespace scwx { namespace qt @@ -578,31 +583,39 @@ void SettingsDialogImpl::SetupGeneralTab() self_, [this]() { - static const std::string themeFilter = "Qt6Ct Theme File (*.conf)"; - static const std::string allFilter = "All Files (*)"; + const settings::GeneralSettings& generalSettings = + settings::GeneralSettings::Instance(); + const QString file = + generalSettings.theme_file().GetStagedOrValue().c_str(); + const QPalette palette = + Qt6CT::loadColorScheme(file, QApplication::palette()); + QStyle* style = QApplication::style(); - QFileDialog* dialog = new QFileDialog(self_); - - dialog->setFileMode(QFileDialog::ExistingFile); - - dialog->setNameFilters( - {QObject::tr(themeFilter.c_str()), QObject::tr(allFilter.c_str())}); + // WA_DeleteOnClose manages memory + // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) + auto* dialog = new PaletteEditDialog(palette, style, self_); dialog->setAttribute(Qt::WA_DeleteOnClose); QObject::connect( dialog, - &QFileDialog::fileSelected, + &QDialog::accepted, self_, - [this](const QString& file) + [dialog]() { - QString path = QDir::toNativeSeparators(file); - logger_->info("Selected theme file: {}", path.toStdString()); - self_->ui->themeFileLineEdit->setText(path); + const QPalette palette = dialog->selectedPalette(); + const settings::GeneralSettings& generalSettings = + settings::GeneralSettings::Instance(); + const QString file = + generalSettings.theme_file().GetStagedOrValue().c_str(); + Qt6CT::createColorScheme(file, palette); - // setText does not emit the textEdited signal - Q_EMIT self_->ui->themeFileLineEdit->textEdited(path); + auto uiStyle = scwx::qt::types::GetUiStyle( + generalSettings.theme().GetValue()); + if (uiStyle == scwx::qt::types::UiStyle::FusionCustom) + { + QApplication::setPalette(palette); + } }); - dialog->open(); });