From 0bce0e2bd734c6c299768616f67d42ff4df6e2a2 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 19 Oct 2024 09:41:42 -0400 Subject: [PATCH 01/14] First addition of qt6ct based color palettes to give dark mode on all platforms. --- ACKNOWLEDGEMENTS.md | 2 + scwx-qt/res/qt6ct_colors/airy.conf | 4 + scwx-qt/res/qt6ct_colors/darker.conf | 4 + scwx-qt/res/qt6ct_colors/dusk.conf | 4 + scwx-qt/res/qt6ct_colors/ia_ora.conf | 4 + scwx-qt/res/qt6ct_colors/sand.conf | 4 + scwx-qt/res/qt6ct_colors/simple.conf | 4 + scwx-qt/res/qt6ct_colors/waves.conf | 4 + scwx-qt/scwx-qt.cmake | 2 + scwx-qt/scwx-qt.qrc | 1 + scwx-qt/source/scwx/qt/main/main.cpp | 12 +++ scwx-qt/source/scwx/qt/types/qt_types.cpp | 3 + scwx-qt/source/scwx/qt/types/qt_types.hpp | 3 +- scwx-qt/source/scwx/qt/util/qt6ct_palette.cpp | 87 +++++++++++++++++++ scwx-qt/source/scwx/qt/util/qt6ct_palette.hpp | 50 +++++++++++ 15 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 scwx-qt/res/qt6ct_colors/airy.conf create mode 100644 scwx-qt/res/qt6ct_colors/darker.conf create mode 100644 scwx-qt/res/qt6ct_colors/dusk.conf create mode 100644 scwx-qt/res/qt6ct_colors/ia_ora.conf create mode 100644 scwx-qt/res/qt6ct_colors/sand.conf create mode 100644 scwx-qt/res/qt6ct_colors/simple.conf create mode 100644 scwx-qt/res/qt6ct_colors/waves.conf create mode 100644 scwx-qt/source/scwx/qt/util/qt6ct_palette.cpp create mode 100644 scwx-qt/source/scwx/qt/util/qt6ct_palette.hpp diff --git a/ACKNOWLEDGEMENTS.md b/ACKNOWLEDGEMENTS.md index 154d0f6c..4aec61d2 100644 --- a/ACKNOWLEDGEMENTS.md +++ b/ACKNOWLEDGEMENTS.md @@ -35,6 +35,7 @@ Supercell Wx uses code from the following dependencies: | [nunicode](https://bitbucket.org/alekseyt/nunicode/src/master/) | [MIT License](https://spdx.org/licenses/MIT.html) | Modified for MapLibre Native | | [OpenSSL](https://www.openssl.org/) | [OpenSSL License](https://spdx.org/licenses/OpenSSL.html) | | [Qt](https://www.qt.io/) | [GNU Lesser General Public License v3.0 only](https://spdx.org/licenses/LGPL-3.0-only.html) | Qt Core, Qt GUI, Qt Multimedia, Qt Network, Qt OpenGL, Qt Positioning, Qt Serial Port, Qt SQL, Qt SVG, Qt Widgets
Additional Licenses: https://doc.qt.io/qt-6/licenses-used-in-qt.html | +| [qt6ct](https://github.com/trialuser02/qt6ct) | [BSD 2-Clause "Simplified" License](https://spdx.org/licenses/BSD-2-Clause.html) | | [re2](https://github.com/google/re2) | [BSD 3-Clause "New" or "Revised" License](https://spdx.org/licenses/BSD-3-Clause.html) | | [spdlog](https://github.com/gabime/spdlog) | [MIT License](https://spdx.org/licenses/MIT.html) | | [SQLite](https://www.sqlite.org/) | Public Domain | @@ -67,6 +68,7 @@ Supercell Wx uses assets from the following sources: | [Font Awesome Free](https://fontawesome.com/) | CC BY 4.0 License | | [Inconsolata](https://fonts.google.com/specimen/Inconsolata) | SIL Open Font License | | [NOAA's Weather and Climate Toolkit](https://www.ncdc.noaa.gov/wct/) | Public Domain | Default Color Tables | +| [qt6ct](https://github.com/trialuser02/qt6ct) | [BSD 2-Clause "Simplified" License](https://spdx.org/licenses/BSD-2-Clause.html) | | [Roboto Flex](https://fonts.google.com/specimen/Roboto+Flex) | SIL Open Font License | | [Supercell thunderstorm with dramatic clouds](https://www.shutterstock.com/image-photo/supercell-thunderstorm-dramatic-clouds-1354353521) | Shutterstock Standard License | Photo by John Sirlin diff --git a/scwx-qt/res/qt6ct_colors/airy.conf b/scwx-qt/res/qt6ct_colors/airy.conf new file mode 100644 index 00000000..68b32473 --- /dev/null +++ b/scwx-qt/res/qt6ct_colors/airy.conf @@ -0,0 +1,4 @@ +[ColorScheme] +active_colors=#ff000000, #ffdcdcdc, #ffdcdcdc, #ff5e5c5b, #ff646464, #ffe1e1e1, #ff000000, #ff0a0a0a, #ff0a0a0a, #ffc8c8c8, #ffffffff, #ffe7e4e0, #ff0986d3, #ff0a0a0a, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff646464, #ff050505, #80000000 +disabled_colors=#ffffffff, #ff424245, #ffdcdcdc, #ff5e5c5b, #ff646464, #ffe1e1e1, #ff808080, #ffffffff, #ff808080, #ff969696, #ffc8c8c8, #ffe7e4e0, #ff0986d3, #ff808080, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff646464, #ffffffff, #80000000 +inactive_colors=#ff323232, #ffb4b4b4, #ffdcdcdc, #ff5e5c5b, #ff646464, #ffe1e1e1, #ff323232, #ff323232, #ff323232, #ff969696, #ffc8c8c8, #ffe7e4e0, #ff0986d3, #ff323232, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff646464, #ff323232, #80000000 diff --git a/scwx-qt/res/qt6ct_colors/darker.conf b/scwx-qt/res/qt6ct_colors/darker.conf new file mode 100644 index 00000000..cf2f69f7 --- /dev/null +++ b/scwx-qt/res/qt6ct_colors/darker.conf @@ -0,0 +1,4 @@ +[ColorScheme] +active_colors=#ffffffff, #ff424245, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ffffffff, #ffffffff, #ffffffff, #ff3d3d3d, #ff222020, #ffe7e4e0, #ff12608a, #fff9f9f9, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff3f3f36, #ffffffff, #80ffffff +disabled_colors=#ff808080, #ff424245, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff808080, #ffffffff, #ff808080, #ff3d3d3d, #ff222020, #ffe7e4e0, #ff12608a, #ff808080, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff3f3f36, #ffffffff, #80ffffff +inactive_colors=#ffffffff, #ff424245, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ffffffff, #ffffffff, #ffffffff, #ff3d3d3d, #ff222020, #ffe7e4e0, #ff12608a, #fff9f9f9, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff3f3f36, #ffffffff, #80ffffff diff --git a/scwx-qt/res/qt6ct_colors/dusk.conf b/scwx-qt/res/qt6ct_colors/dusk.conf new file mode 100644 index 00000000..e0b0059a --- /dev/null +++ b/scwx-qt/res/qt6ct_colors/dusk.conf @@ -0,0 +1,4 @@ +[ColorScheme] +active_colors=#ff000000, #ff7f7f7f, #ffffffff, #ffcbc7c4, #ff7f7f7f, #ffb8b5b2, #ff000000, #ffffffff, #ff000000, #ff7f7f7f, #ff7f7f7f, #ff707070, #ff308cc6, #ffffffff, #ff0000ff, #ffff00ff, #ff7f7f7f, #ff000000, #ff7f7f7f, #ff000000, #80000000 +disabled_colors=#ffbebebe, #ff7f7f7f, #ffffffff, #ffcbc7c4, #ff7f7f7f, #ffb8b5b2, #ffbebebe, #ffffffff, #ffbebebe, #ff7f7f7f, #ff7f7f7f, #ffb1aeab, #ff7f7f7f, #ffffffff, #ff0000ff, #ffff00ff, #ff7f7f7f, #ff000000, #ff7f7f7f, #ff000000, #80000000 +inactive_colors=#ff000000, #ff7f7f7f, #ffffffff, #ffcbc7c4, #ff7f7f7f, #ffb8b5b2, #ff000000, #ffffffff, #ff000000, #ff7f7f7f, #ff7f7f7f, #ff707070, #ff308cc6, #ffffffff, #ff0000ff, #ffff00ff, #ff7f7f7f, #ff000000, #ff7f7f7f, #ff000000, #80000000 diff --git a/scwx-qt/res/qt6ct_colors/ia_ora.conf b/scwx-qt/res/qt6ct_colors/ia_ora.conf new file mode 100644 index 00000000..7875fc4d --- /dev/null +++ b/scwx-qt/res/qt6ct_colors/ia_ora.conf @@ -0,0 +1,4 @@ +[ColorScheme] +active_colors=#ff000000, #ffeff3f7, #ffffffff, #ffe9e7e3, #ffc7cbce, #ffa0a0a4, #ff000000, #ffffffff, #ff000000, #ffeff3f7, #ffeff3f7, #ffb8bbbe, #ff4965ae, #ffffffff, #ff0000ff, #ffff00ff, #ffeff3f7, #ff000000, #ffffffdc, #ff000000, #80000000 +disabled_colors=#ff808080, #ffeff3f7, #ffffffff, #ffe9e7e3, #ffc7cbce, #ffa0a0a4, #ff808080, #ffffffff, #ff808080, #ffeff3f7, #ffeff3f7, #ffb8bbbe, #ff4965ae, #ff808080, #ff0000ff, #ffff00ff, #ffeff3f7, #ff000000, #ffffffdc, #ff000000, #80000000 +inactive_colors=#ff000000, #ffeff3f7, #ffffffff, #ffe9e7e3, #ffc7cbce, #ffa0a0a4, #ff000000, #ffffffff, #ff000000, #ffeff3f7, #ffeff3f7, #ffb8bbbe, #ff4965ae, #ffffffff, #ff0000ff, #ffff00ff, #ffeff3f7, #ff000000, #ffffffdc, #ff000000, #80000000 diff --git a/scwx-qt/res/qt6ct_colors/sand.conf b/scwx-qt/res/qt6ct_colors/sand.conf new file mode 100644 index 00000000..004267d1 --- /dev/null +++ b/scwx-qt/res/qt6ct_colors/sand.conf @@ -0,0 +1,4 @@ +[ColorScheme] +active_colors=#ff000000, #ffffffdc, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff000000, #ff000000, #ff000000, #ffffffdc, #ffffffdc, #ffe7e4e0, #ff5f5b5d, #fff9f9f9, #ff0986d3, #ffa70b06, #ffffffdc, #ff000000, #ff3f3f36, #ff000000, #80000000 +disabled_colors=#ff4a4947, #ffffffdc, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff4a4947, #ff4a4947, #ff4a4947, #ffffffdc, #ffffffdc, #ffe7e4e0, #ff5f5b5d, #fff9f9f9, #ff0986d3, #ffa70b06, #ffffffdc, #ff000000, #ff3f3f36, #ff000000, #80000000 +inactive_colors=#ff000000, #ffffffdc, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff000000, #ff000000, #ff000000, #ffffffdc, #ffffffdc, #ffe7e4e0, #ff5f5b5d, #fff9f9f9, #ff0986d3, #ffa70b06, #ffffffdc, #ff000000, #ff3f3f36, #ff000000, #80000000 diff --git a/scwx-qt/res/qt6ct_colors/simple.conf b/scwx-qt/res/qt6ct_colors/simple.conf new file mode 100644 index 00000000..7b655ad5 --- /dev/null +++ b/scwx-qt/res/qt6ct_colors/simple.conf @@ -0,0 +1,4 @@ +[ColorScheme] +active_colors=#ff000000, #ffefebe7, #ffffffff, #ffcbc7c4, #ff9f9d9a, #ffb8b5b2, #ff000000, #ffffffff, #ff000000, #ffffffff, #ffefebe7, #ffb1aeab, #ff308cc6, #ffffffff, #ff0000ff, #ffff0000, #fff7f5f3, #ff000000, #ffffffdc, #ff000000, #80000000 +disabled_colors=#ffbebebe, #ffefebe7, #ffffffff, #ffcbc7c4, #ff9f9d9a, #ffb8b5b2, #ffbebebe, #ffffffff, #ffbebebe, #ffefebe7, #ffefebe7, #ffb1aeab, #ff9f9d9a, #ffffffff, #ff0000ff, #ffff0000, #fff7f5f3, #ff000000, #ffffffdc, #ff000000, #80000000 +inactive_colors=#ff000000, #ffefebe7, #ffffffff, #ffcbc7c4, #ff9f9d9a, #ffb8b5b2, #ff000000, #ffffffff, #ff000000, #ffffffff, #ffefebe7, #ffb1aeab, #ff308cc6, #ffffffff, #ff0000ff, #ffff0000, #fff7f5f3, #ff000000, #ffffffdc, #ff000000, #80000000 diff --git a/scwx-qt/res/qt6ct_colors/waves.conf b/scwx-qt/res/qt6ct_colors/waves.conf new file mode 100644 index 00000000..e0de92fd --- /dev/null +++ b/scwx-qt/res/qt6ct_colors/waves.conf @@ -0,0 +1,4 @@ +[ColorScheme] +active_colors=#ffb0b0b0, #ff010b2c, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ffb0b0b0, #ffb0b0b0, #ffb0b0b0, #ff010b2c, #ff010b2c, #ffb0b0b0, #ff302f2e, #ffb0b0b0, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff0a0a0a, #ffffffff, #80b0b0b0 +disabled_colors=#ff808080, #ff010b2c, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff808080, #ff808080, #ff808080, #ff00071d, #ff00071d, #ffb0b0b0, #ff00071d, #ff808080, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff0a0a0a, #ffffffff, #80b0b0b0 +inactive_colors=#ffb0b0b0, #ff010b2c, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ffb0b0b0, #ffb0b0b0, #ffb0b0b0, #ff010b2c, #ff010b2c, #ffb0b0b0, #ff302f2e, #ffb0b0b0, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff0a0a0a, #ffffffff, #80b0b0b0 diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 71700cec..2741f076 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -357,6 +357,7 @@ set(HDR_UTIL source/scwx/qt/util/color.hpp source/scwx/qt/util/texture_atlas.hpp source/scwx/qt/util/q_file_buffer.hpp source/scwx/qt/util/q_file_input_stream.hpp + source/scwx/qt/util/qt6ct_palette.hpp source/scwx/qt/util/time.hpp source/scwx/qt/util/tooltip.hpp) set(SRC_UTIL source/scwx/qt/util/color.cpp @@ -369,6 +370,7 @@ set(SRC_UTIL source/scwx/qt/util/color.cpp source/scwx/qt/util/texture_atlas.cpp source/scwx/qt/util/q_file_buffer.cpp source/scwx/qt/util/q_file_input_stream.cpp + source/scwx/qt/util/qt6ct_palette.cpp source/scwx/qt/util/time.cpp source/scwx/qt/util/tooltip.cpp) set(HDR_VIEW source/scwx/qt/view/level2_product_view.hpp diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc index 9ed5651a..63ad1793 100644 --- a/scwx-qt/scwx-qt.qrc +++ b/scwx-qt/scwx-qt.qrc @@ -70,6 +70,7 @@ res/palettes/wct/SW.pal res/palettes/wct/VIL.pal res/palettes/wct/ZDR.pal + res/qt6ct_colors/darker.conf res/textures/lines/default-1x7.png res/textures/lines/test-pattern.png res/textures/images/cursor-17.png diff --git a/scwx-qt/source/scwx/qt/main/main.cpp b/scwx-qt/source/scwx/qt/main/main.cpp index d93133a3..d90ec0e9 100644 --- a/scwx-qt/source/scwx/qt/main/main.cpp +++ b/scwx-qt/source/scwx/qt/main/main.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -27,6 +28,8 @@ #include #include #include +#include +#include static const std::string logPrefix_ = "scwx::main"; static const auto logger_ = scwx::util::Logger::Create(logPrefix_); @@ -162,6 +165,15 @@ static void ConfigureTheme(const std::vector& args) } QGuiApplication::styleHints()->setColorScheme(qtColorScheme); + + if (uiStyle == scwx::qt::types::UiStyle::FusionQt6Ct) + { + auto palette = + std::make_unique(scwx::qt::util::qt6ct::loadColorScheme( + ":res/qt6ct_colors/darker.conf", + QApplication::style()->standardPalette())); + QApplication::setPalette(*palette); + } } static void diff --git a/scwx-qt/source/scwx/qt/types/qt_types.cpp b/scwx-qt/source/scwx/qt/types/qt_types.cpp index da2ef622..03d58a75 100644 --- a/scwx-qt/source/scwx/qt/types/qt_types.cpp +++ b/scwx-qt/source/scwx/qt/types/qt_types.cpp @@ -15,6 +15,7 @@ static const std::unordered_map qtStyleName_ { {UiStyle::Fusion, "Fusion"}, {UiStyle::FusionLight, "Fusion"}, {UiStyle::FusionDark, "Fusion"}, + {UiStyle::FusionQt6Ct, "Fusion"}, {UiStyle::Unknown, "?"}}; static const std::unordered_map uiStyleName_ { @@ -22,6 +23,7 @@ static const std::unordered_map uiStyleName_ { {UiStyle::Fusion, "Fusion"}, {UiStyle::FusionLight, "Fusion Light"}, {UiStyle::FusionDark, "Fusion Dark"}, + {UiStyle::FusionQt6Ct, "Fusion with qt6ct Palette"}, {UiStyle::Unknown, "?"}}; static const std::unordered_map qtColorSchemeMap_ { @@ -29,6 +31,7 @@ static const std::unordered_map qtColorSchemeMap_ { {UiStyle::Fusion, Qt::ColorScheme::Unknown}, {UiStyle::FusionLight, Qt::ColorScheme::Light}, {UiStyle::FusionDark, Qt::ColorScheme::Dark}, + {UiStyle::FusionQt6Ct, Qt::ColorScheme::Unknown}, {UiStyle::Unknown, Qt::ColorScheme::Unknown}}; SCWX_GET_ENUM(UiStyle, GetUiStyle, uiStyleName_) diff --git a/scwx-qt/source/scwx/qt/types/qt_types.hpp b/scwx-qt/source/scwx/qt/types/qt_types.hpp index 817d5ca1..a9266c8b 100644 --- a/scwx-qt/source/scwx/qt/types/qt_types.hpp +++ b/scwx-qt/source/scwx/qt/types/qt_types.hpp @@ -26,9 +26,10 @@ enum class UiStyle Fusion, FusionLight, FusionDark, + FusionQt6Ct, Unknown }; -typedef scwx::util::Iterator +typedef scwx::util::Iterator UiStyleIterator; Qt::ColorScheme GetQtColorScheme(UiStyle uiStyle); diff --git a/scwx-qt/source/scwx/qt/util/qt6ct_palette.cpp b/scwx-qt/source/scwx/qt/util/qt6ct_palette.cpp new file mode 100644 index 00000000..b6319709 --- /dev/null +++ b/scwx-qt/source/scwx/qt/util/qt6ct_palette.cpp @@ -0,0 +1,87 @@ +/* This code is drawn from qt6ct, and loads qt6ct color palette files. + * qt6ct is licensed under BSD-2-Clause below. + * + * Copyright (c) 2020-2024, Ilya Kotov + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace util +{ +namespace qt6ct +{ + +QPalette loadColorScheme(const QString &filePath, const QPalette &fallback) +{ + QPalette customPalette; + QSettings settings(filePath, QSettings::IniFormat); + settings.beginGroup("ColorScheme"); + QStringList activeColors = settings.value("active_colors").toStringList(); + QStringList inactiveColors = settings.value("inactive_colors").toStringList(); + QStringList disabledColors = settings.value("disabled_colors").toStringList(); + settings.endGroup(); + + +#if (QT_VERSION >= QT_VERSION_CHECK(6,6,0)) + if(activeColors.count() == QPalette::Accent) + activeColors << activeColors.at(QPalette::Highlight); + if(inactiveColors.count() == QPalette::Accent) + inactiveColors << inactiveColors.at(QPalette::Highlight); + if(disabledColors.count() == QPalette::Accent) + disabledColors << disabledColors.at(QPalette::Highlight); +#endif + + + if(activeColors.count() >= QPalette::NColorRoles && + inactiveColors.count() >= QPalette::NColorRoles && + disabledColors.count() >= QPalette::NColorRoles) + { + for (int i = 0; i < QPalette::NColorRoles; i++) + { + QPalette::ColorRole role = QPalette::ColorRole(i); + customPalette.setColor(QPalette::Active, role, QColor(activeColors.at(i))); + customPalette.setColor(QPalette::Inactive, role, QColor(inactiveColors.at(i))); + customPalette.setColor(QPalette::Disabled, role, QColor(disabledColors.at(i))); + } + } + else + { + customPalette = fallback; //load fallback palette + } + + return customPalette; +} + +} // namespace qt6ct +} // namespace util +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/util/qt6ct_palette.hpp b/scwx-qt/source/scwx/qt/util/qt6ct_palette.hpp new file mode 100644 index 00000000..9b168212 --- /dev/null +++ b/scwx-qt/source/scwx/qt/util/qt6ct_palette.hpp @@ -0,0 +1,50 @@ +#pragma once + +/* This code is drawn from qt6ct, and loads qt6ct color palette files. + * qt6ct is licensed under BSD-2-Clause below. + * + * Copyright (c) 2020-2024, Ilya Kotov + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace util +{ +namespace qt6ct +{ + +QPalette loadColorScheme(const QString &filePath, const QPalette &fallback); + +} // namespace qt6ct +} // namespace util +} // namespace qt +} // namespace scwx From 5c57ae0edc4c24e8568e297c50b628e0b31c9c71 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Mon, 21 Oct 2024 10:39:08 -0400 Subject: [PATCH 02/14] Switch to using a submodule for qt6ct external code --- .gitmodules | 3 + external/CMakeLists.txt | 1 + external/qt6ct | 1 + external/qt6ct.cmake | 6 ++ scwx-qt/scwx-qt.cmake | 3 +- scwx-qt/source/scwx/qt/main/main.cpp | 10 +-- scwx-qt/source/scwx/qt/util/qt6ct_palette.cpp | 87 ------------------- scwx-qt/source/scwx/qt/util/qt6ct_palette.hpp | 50 ----------- 8 files changed, 16 insertions(+), 145 deletions(-) create mode 160000 external/qt6ct create mode 100644 external/qt6ct.cmake delete mode 100644 scwx-qt/source/scwx/qt/util/qt6ct_palette.cpp delete mode 100644 scwx-qt/source/scwx/qt/util/qt6ct_palette.hpp diff --git a/.gitmodules b/.gitmodules index 52ede30b..afccf304 100644 --- a/.gitmodules +++ b/.gitmodules @@ -37,3 +37,6 @@ [submodule "external/maplibre-native"] path = external/maplibre-native url = https://github.com/dpaulat/maplibre-gl-native.git +[submodule "external/qt6ct"] + path = external/qt6ct + url = https://github.com/trialuser02/qt6ct.git diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index bbc76c64..0a32377e 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -21,3 +21,4 @@ include(maplibre-native-qt.cmake) include(stb.cmake) include(textflowcpp.cmake) include(units.cmake) +include(qt6ct.cmake) diff --git a/external/qt6ct b/external/qt6ct new file mode 160000 index 00000000..55dba870 --- /dev/null +++ b/external/qt6ct @@ -0,0 +1 @@ +Subproject commit 55dba8704c0a748b0ce9f2d3cc2cf200ca3db464 diff --git a/external/qt6ct.cmake b/external/qt6ct.cmake new file mode 100644 index 00000000..c1227711 --- /dev/null +++ b/external/qt6ct.cmake @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.16.0) +set(PROJECT_NAME scwx-qt6ct) + +add_subdirectory(qt6ct/src/qt6ct-common) +set_target_properties(qt6ct-common PROPERTIES PUBLIC_HEADER qt6ct/src/qt6ct-common/qt6ct.h) +target_include_directories( qt6ct-common INTERFACE qt6ct/src ) diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 2741f076..3d2f8368 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -357,7 +357,6 @@ set(HDR_UTIL source/scwx/qt/util/color.hpp source/scwx/qt/util/texture_atlas.hpp source/scwx/qt/util/q_file_buffer.hpp source/scwx/qt/util/q_file_input_stream.hpp - source/scwx/qt/util/qt6ct_palette.hpp source/scwx/qt/util/time.hpp source/scwx/qt/util/tooltip.hpp) set(SRC_UTIL source/scwx/qt/util/color.cpp @@ -370,7 +369,6 @@ set(SRC_UTIL source/scwx/qt/util/color.cpp source/scwx/qt/util/texture_atlas.cpp source/scwx/qt/util/q_file_buffer.cpp source/scwx/qt/util/q_file_input_stream.cpp - source/scwx/qt/util/qt6ct_palette.cpp source/scwx/qt/util/time.cpp source/scwx/qt/util/tooltip.cpp) set(HDR_VIEW source/scwx/qt/view/level2_product_view.hpp @@ -687,6 +685,7 @@ target_link_libraries(scwx-qt PUBLIC Qt${QT_VERSION_MAJOR}::Widgets GLEW::GLEW glm::glm imgui + qt6ct-common SQLite::SQLite3 wxdata) diff --git a/scwx-qt/source/scwx/qt/main/main.cpp b/scwx-qt/source/scwx/qt/main/main.cpp index d90ec0e9..602a5fe8 100644 --- a/scwx-qt/source/scwx/qt/main/main.cpp +++ b/scwx-qt/source/scwx/qt/main/main.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -24,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -168,11 +168,9 @@ static void ConfigureTheme(const std::vector& args) if (uiStyle == scwx::qt::types::UiStyle::FusionQt6Ct) { - auto palette = - std::make_unique(scwx::qt::util::qt6ct::loadColorScheme( - ":res/qt6ct_colors/darker.conf", - QApplication::style()->standardPalette())); - QApplication::setPalette(*palette); + QPalette palette = Qt6CT::loadColorScheme(":res/qt6ct_colors/darker.conf", + QApplication::style()->standardPalette());; + QApplication::setPalette(palette); } } diff --git a/scwx-qt/source/scwx/qt/util/qt6ct_palette.cpp b/scwx-qt/source/scwx/qt/util/qt6ct_palette.cpp deleted file mode 100644 index b6319709..00000000 --- a/scwx-qt/source/scwx/qt/util/qt6ct_palette.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* This code is drawn from qt6ct, and loads qt6ct color palette files. - * qt6ct is licensed under BSD-2-Clause below. - * - * Copyright (c) 2020-2024, Ilya Kotov - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -namespace scwx -{ -namespace qt -{ -namespace util -{ -namespace qt6ct -{ - -QPalette loadColorScheme(const QString &filePath, const QPalette &fallback) -{ - QPalette customPalette; - QSettings settings(filePath, QSettings::IniFormat); - settings.beginGroup("ColorScheme"); - QStringList activeColors = settings.value("active_colors").toStringList(); - QStringList inactiveColors = settings.value("inactive_colors").toStringList(); - QStringList disabledColors = settings.value("disabled_colors").toStringList(); - settings.endGroup(); - - -#if (QT_VERSION >= QT_VERSION_CHECK(6,6,0)) - if(activeColors.count() == QPalette::Accent) - activeColors << activeColors.at(QPalette::Highlight); - if(inactiveColors.count() == QPalette::Accent) - inactiveColors << inactiveColors.at(QPalette::Highlight); - if(disabledColors.count() == QPalette::Accent) - disabledColors << disabledColors.at(QPalette::Highlight); -#endif - - - if(activeColors.count() >= QPalette::NColorRoles && - inactiveColors.count() >= QPalette::NColorRoles && - disabledColors.count() >= QPalette::NColorRoles) - { - for (int i = 0; i < QPalette::NColorRoles; i++) - { - QPalette::ColorRole role = QPalette::ColorRole(i); - customPalette.setColor(QPalette::Active, role, QColor(activeColors.at(i))); - customPalette.setColor(QPalette::Inactive, role, QColor(inactiveColors.at(i))); - customPalette.setColor(QPalette::Disabled, role, QColor(disabledColors.at(i))); - } - } - else - { - customPalette = fallback; //load fallback palette - } - - return customPalette; -} - -} // namespace qt6ct -} // namespace util -} // namespace qt -} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/util/qt6ct_palette.hpp b/scwx-qt/source/scwx/qt/util/qt6ct_palette.hpp deleted file mode 100644 index 9b168212..00000000 --- a/scwx-qt/source/scwx/qt/util/qt6ct_palette.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -/* This code is drawn from qt6ct, and loads qt6ct color palette files. - * qt6ct is licensed under BSD-2-Clause below. - * - * Copyright (c) 2020-2024, Ilya Kotov - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -namespace scwx -{ -namespace qt -{ -namespace util -{ -namespace qt6ct -{ - -QPalette loadColorScheme(const QString &filePath, const QPalette &fallback); - -} // namespace qt6ct -} // namespace util -} // namespace qt -} // namespace scwx From 57d65cf0861b95159eecbc0ad2374c4411d56c61 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Mon, 21 Oct 2024 11:23:34 -0400 Subject: [PATCH 03/14] Change how new fusion styles are selected --- scwx-qt/scwx-qt.qrc | 6 ++++ scwx-qt/source/scwx/qt/main/main.cpp | 20 ++++++++++-- scwx-qt/source/scwx/qt/types/qt_types.cpp | 39 +++++++++++++++++++++-- scwx-qt/source/scwx/qt/types/qt_types.hpp | 16 +++++++--- 4 files changed, 71 insertions(+), 10 deletions(-) diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc index 63ad1793..fbe846ca 100644 --- a/scwx-qt/scwx-qt.qrc +++ b/scwx-qt/scwx-qt.qrc @@ -70,7 +70,13 @@ res/palettes/wct/SW.pal res/palettes/wct/VIL.pal res/palettes/wct/ZDR.pal + res/qt6ct_colors/airy.conf res/qt6ct_colors/darker.conf + res/qt6ct_colors/dusk.conf + res/qt6ct_colors/ia_ora.conf + res/qt6ct_colors/sand.conf + res/qt6ct_colors/simple.conf + res/qt6ct_colors/waves.conf res/textures/lines/default-1x7.png res/textures/lines/test-pattern.png res/textures/images/cursor-17.png diff --git a/scwx-qt/source/scwx/qt/main/main.cpp b/scwx-qt/source/scwx/qt/main/main.cpp index 602a5fe8..11b7f098 100644 --- a/scwx-qt/source/scwx/qt/main/main.cpp +++ b/scwx-qt/source/scwx/qt/main/main.cpp @@ -166,10 +166,24 @@ static void ConfigureTheme(const std::vector& args) QGuiApplication::styleHints()->setColorScheme(qtColorScheme); - if (uiStyle == scwx::qt::types::UiStyle::FusionQt6Ct) + std::optional paletteFile = + scwx::qt::types::GetQtPaletteFile(uiStyle); + if (paletteFile) { - QPalette palette = Qt6CT::loadColorScheme(":res/qt6ct_colors/darker.conf", - QApplication::style()->standardPalette());; + QPalette defaultPalette = QApplication::style()->standardPalette(); + QPalette palette = + Qt6CT::loadColorScheme(QString::fromStdString(*paletteFile), + defaultPalette); + + if (defaultPalette == palette) + { + logger_->warn("Failed to load palette file '{}'", *paletteFile); + } + else + { + logger_->info("Loaded palette file '{}'", *paletteFile); + } + QApplication::setPalette(palette); } } diff --git a/scwx-qt/source/scwx/qt/types/qt_types.cpp b/scwx-qt/source/scwx/qt/types/qt_types.cpp index 03d58a75..5e5a96a7 100644 --- a/scwx-qt/source/scwx/qt/types/qt_types.cpp +++ b/scwx-qt/source/scwx/qt/types/qt_types.cpp @@ -15,7 +15,12 @@ static const std::unordered_map qtStyleName_ { {UiStyle::Fusion, "Fusion"}, {UiStyle::FusionLight, "Fusion"}, {UiStyle::FusionDark, "Fusion"}, - {UiStyle::FusionQt6Ct, "Fusion"}, + {UiStyle::FusionAiry, "Fusion"}, + {UiStyle::FusionDarker, "Fusion"}, + {UiStyle::FusionDusk, "Fusion"}, + {UiStyle::FusionIaOra, "Fusion"}, + {UiStyle::FusionSand, "Fusion"}, + {UiStyle::FusionWaves, "Fusion"}, {UiStyle::Unknown, "?"}}; static const std::unordered_map uiStyleName_ { @@ -23,7 +28,12 @@ static const std::unordered_map uiStyleName_ { {UiStyle::Fusion, "Fusion"}, {UiStyle::FusionLight, "Fusion Light"}, {UiStyle::FusionDark, "Fusion Dark"}, - {UiStyle::FusionQt6Ct, "Fusion with qt6ct Palette"}, + {UiStyle::FusionAiry, "Fusion Airy"}, + {UiStyle::FusionDarker, "Fusion Darker"}, + {UiStyle::FusionDusk, "Fusion Dusk"}, + {UiStyle::FusionIaOra, "Fusion IA Ora"}, + {UiStyle::FusionSand, "Fusion Sand"}, + {UiStyle::FusionWaves, "Fusion Waves"}, {UiStyle::Unknown, "?"}}; static const std::unordered_map qtColorSchemeMap_ { @@ -31,9 +41,22 @@ static const std::unordered_map qtColorSchemeMap_ { {UiStyle::Fusion, Qt::ColorScheme::Unknown}, {UiStyle::FusionLight, Qt::ColorScheme::Light}, {UiStyle::FusionDark, Qt::ColorScheme::Dark}, - {UiStyle::FusionQt6Ct, Qt::ColorScheme::Unknown}, + {UiStyle::FusionAiry, Qt::ColorScheme::Unknown}, + {UiStyle::FusionDarker, Qt::ColorScheme::Unknown}, + {UiStyle::FusionDusk, Qt::ColorScheme::Unknown}, + {UiStyle::FusionIaOra, Qt::ColorScheme::Unknown}, + {UiStyle::FusionSand, Qt::ColorScheme::Unknown}, + {UiStyle::FusionWaves, Qt::ColorScheme::Unknown}, {UiStyle::Unknown, Qt::ColorScheme::Unknown}}; +static const std::unordered_map paletteFile_ { + {UiStyle::FusionAiry, ":res/qt6ct_colors/airy.conf"}, + {UiStyle::FusionDarker, ":res/qt6ct_colors/darker.conf"}, + {UiStyle::FusionDusk, ":res/qt6ct_colors/dusk.conf"}, + {UiStyle::FusionIaOra, ":res/qt6ct_colors/ia_ora.conf"}, + {UiStyle::FusionSand, ":res/qt6ct_colors/sand.conf"}, + {UiStyle::FusionWaves, ":res/qt6ct_colors/waves.conf"}}; + SCWX_GET_ENUM(UiStyle, GetUiStyle, uiStyleName_) Qt::ColorScheme GetQtColorScheme(UiStyle uiStyle) @@ -46,6 +69,16 @@ std::string GetQtStyleName(UiStyle uiStyle) return qtStyleName_.at(uiStyle); } +std::optional GetQtPaletteFile(UiStyle uiStyle) +{ + if (paletteFile_.contains(uiStyle)) + { + return paletteFile_.at(uiStyle); + } + + return std::nullopt; +} + std::string GetUiStyleName(UiStyle uiStyle) { return uiStyleName_.at(uiStyle); diff --git a/scwx-qt/source/scwx/qt/types/qt_types.hpp b/scwx-qt/source/scwx/qt/types/qt_types.hpp index a9266c8b..9bb7ed5d 100644 --- a/scwx-qt/source/scwx/qt/types/qt_types.hpp +++ b/scwx-qt/source/scwx/qt/types/qt_types.hpp @@ -2,6 +2,7 @@ #include +#include #include #include @@ -26,14 +27,21 @@ enum class UiStyle Fusion, FusionLight, FusionDark, - FusionQt6Ct, + FusionAiry, + FusionDarker, + FusionDusk, + FusionIaOra, + FusionSand, + FusionWaves, Unknown }; -typedef scwx::util::Iterator +typedef scwx::util::Iterator UiStyleIterator; -Qt::ColorScheme GetQtColorScheme(UiStyle uiStyle); -std::string GetQtStyleName(UiStyle uiStyle); +Qt::ColorScheme GetQtColorScheme(UiStyle uiStyle); +std::string GetQtStyleName(UiStyle uiStyle); + +std::optional GetQtPaletteFile(UiStyle uiStyle); UiStyle GetUiStyle(const std::string& name); std::string GetUiStyleName(UiStyle uiStyle); From 67c510cbd80aa66363164679bb9b3c6f83a878e0 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Mon, 21 Oct 2024 14:00:34 -0400 Subject: [PATCH 04/14] Try adding Qt requirments from qt6ct into scwx-qt to fix windows build --- scwx-qt/scwx-qt.cmake | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 3d2f8368..1f4f4449 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -21,7 +21,9 @@ find_package(Python COMPONENTS Interpreter) find_package(SQLite3) find_package(QT NAMES Qt6 - COMPONENTS Gui + COMPONENTS BuildInternals + Core + Gui LinguistTools Multimedia Network @@ -30,10 +32,14 @@ find_package(QT NAMES Qt6 Positioning SerialPort Svg - Widgets REQUIRED) + Widgets + Sql + REQUIRED) find_package(Qt${QT_VERSION_MAJOR} - COMPONENTS Gui + COMPONENTS BuildInternals + Core + Gui LinguistTools Multimedia Network From 96c6baa6c90bdd965903206d3fcd9786cb422a93 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Mon, 21 Oct 2024 16:20:56 -0400 Subject: [PATCH 05/14] Add install location for qt6ct for windows (maybe) --- external/qt6ct.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/external/qt6ct.cmake b/external/qt6ct.cmake index c1227711..1c6bb947 100644 --- a/external/qt6ct.cmake +++ b/external/qt6ct.cmake @@ -4,3 +4,8 @@ set(PROJECT_NAME scwx-qt6ct) add_subdirectory(qt6ct/src/qt6ct-common) set_target_properties(qt6ct-common PROPERTIES PUBLIC_HEADER qt6ct/src/qt6ct-common/qt6ct.h) target_include_directories( qt6ct-common INTERFACE qt6ct/src ) +install(TARGETS qt6ct-common + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/qt6ct + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) From a7939a3a19ad5ac3cdd3dd2233d745d9943e7b75 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 26 Oct 2024 15:31:15 -0400 Subject: [PATCH 06/14] switch to static linking for qt6ct library --- external/qt6ct.cmake | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/external/qt6ct.cmake b/external/qt6ct.cmake index 1c6bb947..9ea8b8e3 100644 --- a/external/qt6ct.cmake +++ b/external/qt6ct.cmake @@ -1,11 +1,34 @@ cmake_minimum_required(VERSION 3.16.0) set(PROJECT_NAME scwx-qt6ct) -add_subdirectory(qt6ct/src/qt6ct-common) +#extract version from qt6ct.h +file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/qt6ct/src/qt6ct-common/qt6ct.h" + QT6CT_VERSION_DATA REGEX "^#define[ \t]+QT6CT_VERSION_[A-Z]+[ \t]+[0-9]+.*$") + +if(QT6CT_VERSION_DATA) + foreach(item IN ITEMS MAJOR MINOR) + string(REGEX REPLACE ".*#define[ \t]+QT6CT_VERSION_${item}[ \t]+([0-9]+).*" + "\\1" QT6CT_VERSION_${item} ${QT6CT_VERSION_DATA}) + endforeach() + set(QT6CT_VERSION "${QT6CT_VERSION_MAJOR}.${QT6CT_VERSION_MINOR}") + set(QT6CT_SOVERSION "${QT6CT_VERSION_MAJOR}") + message(STATUS "qt6ct version: ${QT6CT_VERSION}") +else() + message(FATAL_ERROR "invalid header") +endif() + +add_definitions(-DQT6CT_LIBRARY) + +set(app_SRCS + qt6ct/src/qt6ct-common/qt6ct.cpp +) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/qt6ct/src/qt6ct-common) + +add_library(qt6ct-common STATIC ${app_SRCS}) +set_target_properties(qt6ct-common PROPERTIES VERSION ${QT6CT_VERSION}) +target_link_libraries(qt6ct-common PRIVATE Qt6::Gui) +install(TARGETS qt6ct-common DESTINATION ${CMAKE_INSTALL_LIBDIR}) + set_target_properties(qt6ct-common PROPERTIES PUBLIC_HEADER qt6ct/src/qt6ct-common/qt6ct.h) target_include_directories( qt6ct-common INTERFACE qt6ct/src ) -install(TARGETS qt6ct-common - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/qt6ct - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) From b5a89b51dbb5d83107b714299e6f493322db5964 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sat, 26 Oct 2024 15:46:06 -0400 Subject: [PATCH 07/14] Switch to using qt6ct palettes from submodule instead of copy --- scwx-qt/res/qt6ct_colors/airy.conf | 4 ---- scwx-qt/res/qt6ct_colors/darker.conf | 4 ---- scwx-qt/res/qt6ct_colors/dusk.conf | 4 ---- scwx-qt/res/qt6ct_colors/ia_ora.conf | 4 ---- scwx-qt/res/qt6ct_colors/sand.conf | 4 ---- scwx-qt/res/qt6ct_colors/simple.conf | 4 ---- scwx-qt/res/qt6ct_colors/waves.conf | 4 ---- scwx-qt/scwx-qt.qrc | 14 +++++++------- 8 files changed, 7 insertions(+), 35 deletions(-) delete mode 100644 scwx-qt/res/qt6ct_colors/airy.conf delete mode 100644 scwx-qt/res/qt6ct_colors/darker.conf delete mode 100644 scwx-qt/res/qt6ct_colors/dusk.conf delete mode 100644 scwx-qt/res/qt6ct_colors/ia_ora.conf delete mode 100644 scwx-qt/res/qt6ct_colors/sand.conf delete mode 100644 scwx-qt/res/qt6ct_colors/simple.conf delete mode 100644 scwx-qt/res/qt6ct_colors/waves.conf diff --git a/scwx-qt/res/qt6ct_colors/airy.conf b/scwx-qt/res/qt6ct_colors/airy.conf deleted file mode 100644 index 68b32473..00000000 --- a/scwx-qt/res/qt6ct_colors/airy.conf +++ /dev/null @@ -1,4 +0,0 @@ -[ColorScheme] -active_colors=#ff000000, #ffdcdcdc, #ffdcdcdc, #ff5e5c5b, #ff646464, #ffe1e1e1, #ff000000, #ff0a0a0a, #ff0a0a0a, #ffc8c8c8, #ffffffff, #ffe7e4e0, #ff0986d3, #ff0a0a0a, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff646464, #ff050505, #80000000 -disabled_colors=#ffffffff, #ff424245, #ffdcdcdc, #ff5e5c5b, #ff646464, #ffe1e1e1, #ff808080, #ffffffff, #ff808080, #ff969696, #ffc8c8c8, #ffe7e4e0, #ff0986d3, #ff808080, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff646464, #ffffffff, #80000000 -inactive_colors=#ff323232, #ffb4b4b4, #ffdcdcdc, #ff5e5c5b, #ff646464, #ffe1e1e1, #ff323232, #ff323232, #ff323232, #ff969696, #ffc8c8c8, #ffe7e4e0, #ff0986d3, #ff323232, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff646464, #ff323232, #80000000 diff --git a/scwx-qt/res/qt6ct_colors/darker.conf b/scwx-qt/res/qt6ct_colors/darker.conf deleted file mode 100644 index cf2f69f7..00000000 --- a/scwx-qt/res/qt6ct_colors/darker.conf +++ /dev/null @@ -1,4 +0,0 @@ -[ColorScheme] -active_colors=#ffffffff, #ff424245, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ffffffff, #ffffffff, #ffffffff, #ff3d3d3d, #ff222020, #ffe7e4e0, #ff12608a, #fff9f9f9, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff3f3f36, #ffffffff, #80ffffff -disabled_colors=#ff808080, #ff424245, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff808080, #ffffffff, #ff808080, #ff3d3d3d, #ff222020, #ffe7e4e0, #ff12608a, #ff808080, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff3f3f36, #ffffffff, #80ffffff -inactive_colors=#ffffffff, #ff424245, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ffffffff, #ffffffff, #ffffffff, #ff3d3d3d, #ff222020, #ffe7e4e0, #ff12608a, #fff9f9f9, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff3f3f36, #ffffffff, #80ffffff diff --git a/scwx-qt/res/qt6ct_colors/dusk.conf b/scwx-qt/res/qt6ct_colors/dusk.conf deleted file mode 100644 index e0b0059a..00000000 --- a/scwx-qt/res/qt6ct_colors/dusk.conf +++ /dev/null @@ -1,4 +0,0 @@ -[ColorScheme] -active_colors=#ff000000, #ff7f7f7f, #ffffffff, #ffcbc7c4, #ff7f7f7f, #ffb8b5b2, #ff000000, #ffffffff, #ff000000, #ff7f7f7f, #ff7f7f7f, #ff707070, #ff308cc6, #ffffffff, #ff0000ff, #ffff00ff, #ff7f7f7f, #ff000000, #ff7f7f7f, #ff000000, #80000000 -disabled_colors=#ffbebebe, #ff7f7f7f, #ffffffff, #ffcbc7c4, #ff7f7f7f, #ffb8b5b2, #ffbebebe, #ffffffff, #ffbebebe, #ff7f7f7f, #ff7f7f7f, #ffb1aeab, #ff7f7f7f, #ffffffff, #ff0000ff, #ffff00ff, #ff7f7f7f, #ff000000, #ff7f7f7f, #ff000000, #80000000 -inactive_colors=#ff000000, #ff7f7f7f, #ffffffff, #ffcbc7c4, #ff7f7f7f, #ffb8b5b2, #ff000000, #ffffffff, #ff000000, #ff7f7f7f, #ff7f7f7f, #ff707070, #ff308cc6, #ffffffff, #ff0000ff, #ffff00ff, #ff7f7f7f, #ff000000, #ff7f7f7f, #ff000000, #80000000 diff --git a/scwx-qt/res/qt6ct_colors/ia_ora.conf b/scwx-qt/res/qt6ct_colors/ia_ora.conf deleted file mode 100644 index 7875fc4d..00000000 --- a/scwx-qt/res/qt6ct_colors/ia_ora.conf +++ /dev/null @@ -1,4 +0,0 @@ -[ColorScheme] -active_colors=#ff000000, #ffeff3f7, #ffffffff, #ffe9e7e3, #ffc7cbce, #ffa0a0a4, #ff000000, #ffffffff, #ff000000, #ffeff3f7, #ffeff3f7, #ffb8bbbe, #ff4965ae, #ffffffff, #ff0000ff, #ffff00ff, #ffeff3f7, #ff000000, #ffffffdc, #ff000000, #80000000 -disabled_colors=#ff808080, #ffeff3f7, #ffffffff, #ffe9e7e3, #ffc7cbce, #ffa0a0a4, #ff808080, #ffffffff, #ff808080, #ffeff3f7, #ffeff3f7, #ffb8bbbe, #ff4965ae, #ff808080, #ff0000ff, #ffff00ff, #ffeff3f7, #ff000000, #ffffffdc, #ff000000, #80000000 -inactive_colors=#ff000000, #ffeff3f7, #ffffffff, #ffe9e7e3, #ffc7cbce, #ffa0a0a4, #ff000000, #ffffffff, #ff000000, #ffeff3f7, #ffeff3f7, #ffb8bbbe, #ff4965ae, #ffffffff, #ff0000ff, #ffff00ff, #ffeff3f7, #ff000000, #ffffffdc, #ff000000, #80000000 diff --git a/scwx-qt/res/qt6ct_colors/sand.conf b/scwx-qt/res/qt6ct_colors/sand.conf deleted file mode 100644 index 004267d1..00000000 --- a/scwx-qt/res/qt6ct_colors/sand.conf +++ /dev/null @@ -1,4 +0,0 @@ -[ColorScheme] -active_colors=#ff000000, #ffffffdc, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff000000, #ff000000, #ff000000, #ffffffdc, #ffffffdc, #ffe7e4e0, #ff5f5b5d, #fff9f9f9, #ff0986d3, #ffa70b06, #ffffffdc, #ff000000, #ff3f3f36, #ff000000, #80000000 -disabled_colors=#ff4a4947, #ffffffdc, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff4a4947, #ff4a4947, #ff4a4947, #ffffffdc, #ffffffdc, #ffe7e4e0, #ff5f5b5d, #fff9f9f9, #ff0986d3, #ffa70b06, #ffffffdc, #ff000000, #ff3f3f36, #ff000000, #80000000 -inactive_colors=#ff000000, #ffffffdc, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff000000, #ff000000, #ff000000, #ffffffdc, #ffffffdc, #ffe7e4e0, #ff5f5b5d, #fff9f9f9, #ff0986d3, #ffa70b06, #ffffffdc, #ff000000, #ff3f3f36, #ff000000, #80000000 diff --git a/scwx-qt/res/qt6ct_colors/simple.conf b/scwx-qt/res/qt6ct_colors/simple.conf deleted file mode 100644 index 7b655ad5..00000000 --- a/scwx-qt/res/qt6ct_colors/simple.conf +++ /dev/null @@ -1,4 +0,0 @@ -[ColorScheme] -active_colors=#ff000000, #ffefebe7, #ffffffff, #ffcbc7c4, #ff9f9d9a, #ffb8b5b2, #ff000000, #ffffffff, #ff000000, #ffffffff, #ffefebe7, #ffb1aeab, #ff308cc6, #ffffffff, #ff0000ff, #ffff0000, #fff7f5f3, #ff000000, #ffffffdc, #ff000000, #80000000 -disabled_colors=#ffbebebe, #ffefebe7, #ffffffff, #ffcbc7c4, #ff9f9d9a, #ffb8b5b2, #ffbebebe, #ffffffff, #ffbebebe, #ffefebe7, #ffefebe7, #ffb1aeab, #ff9f9d9a, #ffffffff, #ff0000ff, #ffff0000, #fff7f5f3, #ff000000, #ffffffdc, #ff000000, #80000000 -inactive_colors=#ff000000, #ffefebe7, #ffffffff, #ffcbc7c4, #ff9f9d9a, #ffb8b5b2, #ff000000, #ffffffff, #ff000000, #ffffffff, #ffefebe7, #ffb1aeab, #ff308cc6, #ffffffff, #ff0000ff, #ffff0000, #fff7f5f3, #ff000000, #ffffffdc, #ff000000, #80000000 diff --git a/scwx-qt/res/qt6ct_colors/waves.conf b/scwx-qt/res/qt6ct_colors/waves.conf deleted file mode 100644 index e0de92fd..00000000 --- a/scwx-qt/res/qt6ct_colors/waves.conf +++ /dev/null @@ -1,4 +0,0 @@ -[ColorScheme] -active_colors=#ffb0b0b0, #ff010b2c, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ffb0b0b0, #ffb0b0b0, #ffb0b0b0, #ff010b2c, #ff010b2c, #ffb0b0b0, #ff302f2e, #ffb0b0b0, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff0a0a0a, #ffffffff, #80b0b0b0 -disabled_colors=#ff808080, #ff010b2c, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ff808080, #ff808080, #ff808080, #ff00071d, #ff00071d, #ffb0b0b0, #ff00071d, #ff808080, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff0a0a0a, #ffffffff, #80b0b0b0 -inactive_colors=#ffb0b0b0, #ff010b2c, #ff979797, #ff5e5c5b, #ff302f2e, #ff4a4947, #ffb0b0b0, #ffb0b0b0, #ffb0b0b0, #ff010b2c, #ff010b2c, #ffb0b0b0, #ff302f2e, #ffb0b0b0, #ff0986d3, #ffa70b06, #ff5c5b5a, #ffffffff, #ff0a0a0a, #ffffffff, #80b0b0b0 diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc index fbe846ca..cca0f62c 100644 --- a/scwx-qt/scwx-qt.qrc +++ b/scwx-qt/scwx-qt.qrc @@ -70,13 +70,13 @@ res/palettes/wct/SW.pal res/palettes/wct/VIL.pal res/palettes/wct/ZDR.pal - res/qt6ct_colors/airy.conf - res/qt6ct_colors/darker.conf - res/qt6ct_colors/dusk.conf - res/qt6ct_colors/ia_ora.conf - res/qt6ct_colors/sand.conf - res/qt6ct_colors/simple.conf - res/qt6ct_colors/waves.conf + ../external/qt6ct/colors/airy.conf + ../external/qt6ct/colors/darker.conf + ../external/qt6ct/colors/dusk.conf + ../external/qt6ct/colors/ia_ora.conf + ../external/qt6ct/colors/sand.conf + ../external/qt6ct/colors/simple.conf + ../external/qt6ct/colors/waves.conf res/textures/lines/default-1x7.png res/textures/lines/test-pattern.png res/textures/images/cursor-17.png From 8e114c555fe4d15ab9e237ede8dd341cba56efbc Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Mon, 28 Oct 2024 10:14:49 -0400 Subject: [PATCH 08/14] Update CMake files to possibly work on windows --- external/CMakeLists.txt | 3 ++- external/qt6ct.cmake | 21 +++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index 0a32377e..5ef39ddc 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -11,7 +11,8 @@ set_property(DIRECTORY maplibre-native-qt.cmake stb.cmake textflowcpp.cmake - units.cmake) + units.cmake + qt6ct.cmake) include(aws-sdk-cpp.cmake) include(date.cmake) diff --git a/external/qt6ct.cmake b/external/qt6ct.cmake index 9ea8b8e3..9c1c177a 100644 --- a/external/qt6ct.cmake +++ b/external/qt6ct.cmake @@ -1,6 +1,13 @@ cmake_minimum_required(VERSION 3.16.0) set(PROJECT_NAME scwx-qt6ct) +find_package(QT NAMES Qt6 + COMPONENTS Gui + REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} + COMPONENTS Gui + REQUIRED) + #extract version from qt6ct.h file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/qt6ct/src/qt6ct-common/qt6ct.h" QT6CT_VERSION_DATA REGEX "^#define[ \t]+QT6CT_VERSION_[A-Z]+[ \t]+[0-9]+.*$") @@ -17,18 +24,20 @@ else() message(FATAL_ERROR "invalid header") endif() -add_definitions(-DQT6CT_LIBRARY) - set(app_SRCS qt6ct/src/qt6ct-common/qt6ct.cpp ) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/qt6ct/src/qt6ct-common) - add_library(qt6ct-common STATIC ${app_SRCS}) set_target_properties(qt6ct-common PROPERTIES VERSION ${QT6CT_VERSION}) target_link_libraries(qt6ct-common PRIVATE Qt6::Gui) -install(TARGETS qt6ct-common DESTINATION ${CMAKE_INSTALL_LIBDIR}) +target_compile_definitions(qt6ct-common PRIVATE QT6CT_LIBRARY) + +if (MSVC) + # Produce PDB file for debug + target_compile_options(qt6ct-common PRIVATE "$<$:/Zi>") +else() + target_compile_options(qt6ct-common PRIVATE "$<$:-g>") +endif() -set_target_properties(qt6ct-common PROPERTIES PUBLIC_HEADER qt6ct/src/qt6ct-common/qt6ct.h) target_include_directories( qt6ct-common INTERFACE qt6ct/src ) From ccf5f6a3d827172bb97359d3699bb19de3be8c3d Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Mon, 28 Oct 2024 13:00:39 -0400 Subject: [PATCH 09/14] Added custom theme file selection dialog --- scwx-qt/source/scwx/qt/main/main.cpp | 16 +- .../scwx/qt/settings/general_settings.cpp | 9 + .../scwx/qt/settings/general_settings.hpp | 1 + scwx-qt/source/scwx/qt/types/qt_types.cpp | 3 + scwx-qt/source/scwx/qt/types/qt_types.hpp | 3 +- scwx-qt/source/scwx/qt/ui/settings_dialog.cpp | 41 ++ scwx-qt/source/scwx/qt/ui/settings_dialog.ui | 460 ++++++++++-------- 7 files changed, 311 insertions(+), 222 deletions(-) diff --git a/scwx-qt/source/scwx/qt/main/main.cpp b/scwx-qt/source/scwx/qt/main/main.cpp index 11b7f098..05b7c933 100644 --- a/scwx-qt/source/scwx/qt/main/main.cpp +++ b/scwx-qt/source/scwx/qt/main/main.cpp @@ -166,14 +166,20 @@ static void ConfigureTheme(const std::vector& args) QGuiApplication::styleHints()->setColorScheme(qtColorScheme); - std::optional paletteFile = - scwx::qt::types::GetQtPaletteFile(uiStyle); + std::optional paletteFile; + if (uiStyle == scwx::qt::types::UiStyle::FusionCustom) { + paletteFile = generalSettings.theme_file().GetValue(); + } + else + { + paletteFile = scwx::qt::types::GetQtPaletteFile(uiStyle); + } + if (paletteFile) { QPalette defaultPalette = QApplication::style()->standardPalette(); - QPalette palette = - Qt6CT::loadColorScheme(QString::fromStdString(*paletteFile), - defaultPalette); + QPalette palette = Qt6CT::loadColorScheme( + QString::fromStdString(*paletteFile), defaultPalette); if (defaultPalette == palette) { diff --git a/scwx-qt/source/scwx/qt/settings/general_settings.cpp b/scwx-qt/source/scwx/qt/settings/general_settings.cpp index fe3982e2..9eca4348 100644 --- a/scwx-qt/source/scwx/qt/settings/general_settings.cpp +++ b/scwx-qt/source/scwx/qt/settings/general_settings.cpp @@ -73,6 +73,7 @@ public: showMapCenter_.SetDefault(false); showMapLogo_.SetDefault(true); theme_.SetDefault(defaultThemeValue); + themeFile_.SetDefault(""); trackLocation_.SetDefault(false); updateNotificationsEnabled_.SetDefault(true); warningsProvider_.SetDefault(defaultWarningsProviderValue); @@ -161,6 +162,7 @@ public: SettingsVariable showMapCenter_ {"show_map_center"}; SettingsVariable showMapLogo_ {"show_map_logo"}; SettingsVariable theme_ {"theme"}; + SettingsVariable themeFile_ {"theme_file"}; SettingsVariable trackLocation_ {"track_location"}; SettingsVariable updateNotificationsEnabled_ {"update_notifications"}; SettingsVariable warningsProvider_ {"warnings_provider"}; @@ -193,6 +195,7 @@ GeneralSettings::GeneralSettings() : &p->showMapCenter_, &p->showMapLogo_, &p->theme_, + &p->themeFile_, &p->trackLocation_, &p->updateNotificationsEnabled_, &p->warningsProvider_}); @@ -325,6 +328,11 @@ SettingsVariable& GeneralSettings::theme() const return p->theme_; } +SettingsVariable& GeneralSettings::theme_file() const +{ + return p->themeFile_; +} + SettingsVariable& GeneralSettings::track_location() const { return p->trackLocation_; @@ -385,6 +393,7 @@ bool operator==(const GeneralSettings& lhs, const GeneralSettings& rhs) lhs.p->showMapCenter_ == rhs.p->showMapCenter_ && lhs.p->showMapLogo_ == rhs.p->showMapLogo_ && lhs.p->theme_ == rhs.p->theme_ && + lhs.p->themeFile_ == rhs.p->themeFile_ && lhs.p->trackLocation_ == rhs.p->trackLocation_ && lhs.p->updateNotificationsEnabled_ == rhs.p->updateNotificationsEnabled_ && diff --git a/scwx-qt/source/scwx/qt/settings/general_settings.hpp b/scwx-qt/source/scwx/qt/settings/general_settings.hpp index 2628aef1..3e527238 100644 --- a/scwx-qt/source/scwx/qt/settings/general_settings.hpp +++ b/scwx-qt/source/scwx/qt/settings/general_settings.hpp @@ -49,6 +49,7 @@ public: SettingsVariable& show_map_center() const; SettingsVariable& show_map_logo() const; SettingsVariable& theme() const; + SettingsVariable& theme_file() const; SettingsVariable& track_location() const; SettingsVariable& update_notifications_enabled() const; SettingsVariable& warnings_provider() const; diff --git a/scwx-qt/source/scwx/qt/types/qt_types.cpp b/scwx-qt/source/scwx/qt/types/qt_types.cpp index 5e5a96a7..0c10feb2 100644 --- a/scwx-qt/source/scwx/qt/types/qt_types.cpp +++ b/scwx-qt/source/scwx/qt/types/qt_types.cpp @@ -21,6 +21,7 @@ static const std::unordered_map qtStyleName_ { {UiStyle::FusionIaOra, "Fusion"}, {UiStyle::FusionSand, "Fusion"}, {UiStyle::FusionWaves, "Fusion"}, + {UiStyle::FusionCustom, "Fusion"}, {UiStyle::Unknown, "?"}}; static const std::unordered_map uiStyleName_ { @@ -34,6 +35,7 @@ static const std::unordered_map uiStyleName_ { {UiStyle::FusionIaOra, "Fusion IA Ora"}, {UiStyle::FusionSand, "Fusion Sand"}, {UiStyle::FusionWaves, "Fusion Waves"}, + {UiStyle::FusionCustom, "Fusion Custom"}, {UiStyle::Unknown, "?"}}; static const std::unordered_map qtColorSchemeMap_ { @@ -47,6 +49,7 @@ static const std::unordered_map qtColorSchemeMap_ { {UiStyle::FusionIaOra, Qt::ColorScheme::Unknown}, {UiStyle::FusionSand, Qt::ColorScheme::Unknown}, {UiStyle::FusionWaves, Qt::ColorScheme::Unknown}, + {UiStyle::FusionCustom, Qt::ColorScheme::Unknown}, {UiStyle::Unknown, Qt::ColorScheme::Unknown}}; static const std::unordered_map paletteFile_ { diff --git a/scwx-qt/source/scwx/qt/types/qt_types.hpp b/scwx-qt/source/scwx/qt/types/qt_types.hpp index 9bb7ed5d..b5779ff1 100644 --- a/scwx-qt/source/scwx/qt/types/qt_types.hpp +++ b/scwx-qt/source/scwx/qt/types/qt_types.hpp @@ -33,9 +33,10 @@ enum class UiStyle FusionIaOra, FusionSand, FusionWaves, + FusionCustom, Unknown }; -typedef scwx::util::Iterator +typedef scwx::util::Iterator UiStyleIterator; Qt::ColorScheme GetQtColorScheme(UiStyle uiStyle); diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index d4f4f096..20616204 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -121,6 +121,7 @@ public: &mapboxApiKey_, &mapTilerApiKey_, &theme_, + &themeFile_, &defaultAlertAction_, &clockFormat_, &customStyleDrawLayer_, @@ -242,6 +243,7 @@ public: settings::SettingsInterface nmeaBaudRate_ {}; settings::SettingsInterface nmeaSource_ {}; settings::SettingsInterface theme_ {}; + settings::SettingsInterface themeFile_ {}; settings::SettingsInterface warningsProvider_ {}; settings::SettingsInterface antiAliasingEnabled_ {}; settings::SettingsInterface showMapAttribution_ {}; @@ -526,6 +528,45 @@ void SettingsDialogImpl::SetupGeneralTab() types::GetUiStyleName); theme_.SetResetButton(self_->ui->resetThemeButton); + themeFile_.SetSettingsVariable(generalSettings.theme_file()); + themeFile_.SetEditWidget(self_->ui->themeFileLineEdit); + themeFile_.SetResetButton(self_->ui->resetThemeFileButton); + //themeFile_.EnableTrimming(); + + QObject::connect( + self_->ui->themeFileSelectButton, + &QAbstractButton::clicked, + self_, + [this]() + { + static const std::string themeFilter = "Qt6Ct Theme File (*.conf)"; + static const std::string allFilter = "All Files (*)"; + + QFileDialog* dialog = new QFileDialog(self_); + + dialog->setFileMode(QFileDialog::ExistingFile); + + dialog->setNameFilters( + {QObject::tr(themeFilter.c_str()), QObject::tr(allFilter.c_str())}); + dialog->setAttribute(Qt::WA_DeleteOnClose); + + QObject::connect( + dialog, + &QFileDialog::fileSelected, + self_, + [this](const QString& file) + { + QString path = QDir::toNativeSeparators(file); + logger_->info("Selected theme file: {}", path.toStdString()); + self_->ui->themeFileLineEdit->setText(path); + + // setText dows not emit the textEdited signal + Q_EMIT self_->ui->themeFileLineEdit->textEdited(path); + }); + + dialog->open(); + }); + auto radarSites = config::RadarSite::GetAll(); // Sort radar sites by ID diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui index 444e6705..f66aba6c 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui @@ -135,9 +135,9 @@ 0 - 0 - 513 - 622 + -133 + 511 + 676 @@ -159,15 +159,39 @@ 0 - - + + - MapTiler API Key + ... - - + + + + Mapbox API Key + + + + + + + Custom Map Layer + + + + + + + + + + GPS Plugin + + + + + ... @@ -180,15 +204,18 @@ - - + + + + + - Default Time Zone + ... - - + + ... @@ -198,30 +225,34 @@ - - - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - Map Provider - - - + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + @@ -233,77 +264,9 @@ - - - - - - - - - - ... - - - - - - - QLineEdit::EchoMode::Password - - - - - - - GPS Plugin - - - - - - - GPS Baud Rate - - - - - - - - - - ... - - - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - Grid Width - - - - - - - - - @@ -311,9 +274,16 @@ - + + + + + Warnings Provider + + + @@ -339,8 +309,8 @@ - - + + ... @@ -350,45 +320,66 @@ - - - - Theme + + + + 1 + + + 999999999 - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - Mapbox API Key - - - - - - - Clock Format - - - - - + + QLineEdit::EchoMode::Password + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + + + + GPS Baud Rate + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + @@ -400,8 +391,8 @@ - - + + ... @@ -411,35 +402,56 @@ + + + + Map Provider + + + + + + + + + + Theme + + + + + + + MapTiler API Key + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + + + + Custom Map URL + + + - - - - Warnings Provider - - - - - - - 1 - - - 999999999 - - - - - - - Default Alert Action - - - - - + + ... @@ -449,6 +461,38 @@ + + + + Clock Format + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + Grid Width + + + + + + + QLineEdit::EchoMode::Password + + + @@ -460,61 +504,45 @@ - - + + + + Default Time Zone + + + + + + + Default Alert Action + + + + + + + + + + + + + Theme File + + + + + + + + ... - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - - - - - - - Custom Map URL - - - - - - - Custom Map Layer - - - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - + + ... @@ -610,8 +638,8 @@ 0 0 - 506 - 383 + 98 + 28 From 158a4171d232f6b2ae75968e0c7e954ae37b4ada Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Tue, 29 Oct 2024 09:01:32 -0400 Subject: [PATCH 10/14] Added theme_file to settings test cases --- test/data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/data b/test/data index 40a367ca..a642d730 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit 40a367ca89b5b197353ca58dea547a3e3407c7f3 +Subproject commit a642d730bd8d6c9b291b90e61b3a3a389139f2f6 From 20b8c0da7d648afcb80f259d4589c586db3d6e25 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Tue, 29 Oct 2024 09:02:04 -0400 Subject: [PATCH 11/14] Add QT6CT_LIBRARY to avoid Q_DECL_IMPORT in include --- scwx-qt/source/scwx/qt/main/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scwx-qt/source/scwx/qt/main/main.cpp b/scwx-qt/source/scwx/qt/main/main.cpp index 05b7c933..0e379961 100644 --- a/scwx-qt/source/scwx/qt/main/main.cpp +++ b/scwx-qt/source/scwx/qt/main/main.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -31,6 +30,10 @@ #include #include +#define QT6CT_LIBRARY +#include +#undef QT6CT_LIBRARY + static const std::string logPrefix_ = "scwx::main"; static const auto logger_ = scwx::util::Logger::Create(logPrefix_); From e16db1823da721743841f1ecb200b1c9bb581bbd Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Tue, 29 Oct 2024 11:25:16 -0400 Subject: [PATCH 12/14] Add disabling of theme file when custom theme is not selected --- scwx-qt/source/scwx/qt/ui/settings_dialog.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index 20616204..2d129355 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -528,10 +528,24 @@ void SettingsDialogImpl::SetupGeneralTab() types::GetUiStyleName); theme_.SetResetButton(self_->ui->resetThemeButton); + QObject::connect( + self_->ui->themeComboBox, + &QComboBox::currentTextChanged, + self_, + [this](const QString& text) + { + types::UiStyle style = types::GetUiStyle(text.toStdString()); + bool themeFileEnabled = style == types::UiStyle::FusionCustom; + + self_->ui->themeFileLineEdit->setEnabled(themeFileEnabled); + self_->ui->themeFileSelectButton->setEnabled(themeFileEnabled); + self_->ui->resetThemeFileButton->setEnabled(themeFileEnabled); + }); + themeFile_.SetSettingsVariable(generalSettings.theme_file()); themeFile_.SetEditWidget(self_->ui->themeFileLineEdit); themeFile_.SetResetButton(self_->ui->resetThemeFileButton); - //themeFile_.EnableTrimming(); + themeFile_.EnableTrimming(); QObject::connect( self_->ui->themeFileSelectButton, From 3f52f792108b49f4e66305ca385e148d3d67ac83 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Sun, 3 Nov 2024 14:23:21 -0500 Subject: [PATCH 13/14] Fix spelling mistake in comment --- scwx-qt/source/scwx/qt/ui/settings_dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index 2d129355..15c624b9 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -574,7 +574,7 @@ void SettingsDialogImpl::SetupGeneralTab() logger_->info("Selected theme file: {}", path.toStdString()); self_->ui->themeFileLineEdit->setText(path); - // setText dows not emit the textEdited signal + // setText does not emit the textEdited signal Q_EMIT self_->ui->themeFileLineEdit->textEdited(path); }); From 73d3eedcdc1e8a317d8f8305bb81cbcb7aa0d013 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Mon, 4 Nov 2024 09:51:52 -0500 Subject: [PATCH 14/14] Move connection creation earlier to cause it to be triggered on setting the current value to the combobox --- scwx-qt/source/scwx/qt/ui/settings_dialog.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index 15c624b9..a5a2f857 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -521,12 +521,6 @@ void SettingsDialogImpl::SetupGeneralTab() settings::GeneralSettings& generalSettings = settings::GeneralSettings::Instance(); - theme_.SetSettingsVariable(generalSettings.theme()); - SCWX_SETTINGS_COMBO_BOX(theme_, - self_->ui->themeComboBox, - types::UiStyleIterator(), - types::GetUiStyleName); - theme_.SetResetButton(self_->ui->resetThemeButton); QObject::connect( self_->ui->themeComboBox, @@ -542,6 +536,13 @@ void SettingsDialogImpl::SetupGeneralTab() self_->ui->resetThemeFileButton->setEnabled(themeFileEnabled); }); + theme_.SetSettingsVariable(generalSettings.theme()); + SCWX_SETTINGS_COMBO_BOX(theme_, + self_->ui->themeComboBox, + types::UiStyleIterator(), + types::GetUiStyleName); + theme_.SetResetButton(self_->ui->resetThemeButton); + themeFile_.SetSettingsVariable(generalSettings.theme_file()); themeFile_.SetEditWidget(self_->ui->themeFileLineEdit); themeFile_.SetResetButton(self_->ui->resetThemeFileButton);