First addition of qt6ct based color palettes to give dark mode on all platforms.

This commit is contained in:
AdenKoperczak 2024-10-19 09:41:42 -04:00
parent 194638f759
commit 0bce0e2bd7
15 changed files with 187 additions and 1 deletions

View file

@ -12,6 +12,7 @@
#include <scwx/qt/settings/general_settings.hpp>
#include <scwx/qt/types/qt_types.hpp>
#include <scwx/qt/ui/setup/setup_wizard.hpp>
#include <scwx/qt/util/qt6ct_palette.hpp>
#include <scwx/network/cpr.hpp>
#include <scwx/util/environment.hpp>
#include <scwx/util/logger.hpp>
@ -27,6 +28,8 @@
#include <QStandardPaths>
#include <QStyleHints>
#include <QTranslator>
#include <QPalette>
#include <QStyle>
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<std::string>& args)
}
QGuiApplication::styleHints()->setColorScheme(qtColorScheme);
if (uiStyle == scwx::qt::types::UiStyle::FusionQt6Ct)
{
auto palette =
std::make_unique<QPalette>(scwx::qt::util::qt6ct::loadColorScheme(
":res/qt6ct_colors/darker.conf",
QApplication::style()->standardPalette()));
QApplication::setPalette(*palette);
}
}
static void

View file

@ -15,6 +15,7 @@ static const std::unordered_map<UiStyle, std::string> qtStyleName_ {
{UiStyle::Fusion, "Fusion"},
{UiStyle::FusionLight, "Fusion"},
{UiStyle::FusionDark, "Fusion"},
{UiStyle::FusionQt6Ct, "Fusion"},
{UiStyle::Unknown, "?"}};
static const std::unordered_map<UiStyle, std::string> uiStyleName_ {
@ -22,6 +23,7 @@ static const std::unordered_map<UiStyle, std::string> 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<UiStyle, Qt::ColorScheme> qtColorSchemeMap_ {
@ -29,6 +31,7 @@ static const std::unordered_map<UiStyle, Qt::ColorScheme> 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_)

View file

@ -26,9 +26,10 @@ enum class UiStyle
Fusion,
FusionLight,
FusionDark,
FusionQt6Ct,
Unknown
};
typedef scwx::util::Iterator<UiStyle, UiStyle::Default, UiStyle::FusionDark>
typedef scwx::util::Iterator<UiStyle, UiStyle::Default, UiStyle::FusionQt6Ct>
UiStyleIterator;
Qt::ColorScheme GetQtColorScheme(UiStyle uiStyle);

View file

@ -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 <forkotov02@ya.ru>
*
* 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 <QPalette>
#include <QSettings>
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

View file

@ -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 <forkotov02@ya.ru>
*
* 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 <QString>
#include <QPalette>
namespace scwx
{
namespace qt
{
namespace util
{
namespace qt6ct
{
QPalette loadColorScheme(const QString &filePath, const QPalette &fallback);
} // namespace qt6ct
} // namespace util
} // namespace qt
} // namespace scwx