Compare commits

...

18 Commits

Author SHA1 Message Date
Martchus 6016ec4bff Set the desktop file name via `SET_QT_APPLICATION_INFO` 2024-04-08 12:37:39 +02:00
Martchus 4feedbb057 Bump patch version 2024-04-08 12:36:51 +02:00
Martchus ded20b34a6 Add helper to react to darkmode changes 2024-03-31 22:48:22 +02:00
Martchus d20130d770 Update translations 2024-03-31 13:45:35 +02:00
Martchus a7d2611400 Allow re-applying the default icon theme independently of palette
This is useful under Android where the palette is apparently not set to
something matching the darkmode setting but the Qt Quick Material style
nevertheless seems to follow the darkmode setting. So we just want to take
the darkmode setting into account for assigning the appropriate icon theme
and ignore the palette.
2024-03-31 13:42:38 +02:00
Martchus 264386acad Bump minor version 2024-03-31 13:28:49 +02:00
Martchus 8ee322abb7 Deprecate the CMake module `AndroidApk` 2024-03-17 00:42:19 +01:00
Martchus bbd42e167d Adapt default QQC2 style definitions for Qt 6
The casing is important, otherwise this results in the error
`module "material" is not installed`.
2024-03-16 23:17:30 +01:00
Martchus 63ffbc4a6f Avoid warning after `QOperatingSystemVersion::OSType` was moved
This is now `QOperatingSystemVersionBase::OSType` causing a warning about
an implicit conversion. Making an explicit cast to whatever type
`os.type()` actually returns (depends on the Qt version) this warning does
not occur anymore and the code should still compile with any Qt version.
2024-03-15 23:54:17 +01:00
Martchus 600470e609 Bump patch version 2024-03-15 23:50:29 +01:00
Martchus 7a07077daf Apply change of `global.h` template 2024-02-22 19:42:13 +01:00
Martchus 7e7f8a5740 Fix configuring macro for network information plugins
The actual name of these plugins differs from the name of the CMake target.
2024-02-16 17:40:16 +01:00
Martchus 6dd98369b8 Allow configuring network information plugins 2024-02-15 21:51:48 +01:00
Martchus 6e103e09ad Update copyright date 2024-02-15 21:47:03 +01:00
Martchus 5bb21d2ead Bump patch version 2024-02-15 21:46:54 +01:00
Martchus 010f5d8408 No longer enforce Fusion style on Windows 11 as of Qt 6.7
It looks like Qt 6.7 is going to provide a style for Windows 11 that will
fix the mentioned bug.
2023-12-15 15:56:09 +01:00
Martchus a30509a743 Add `ModernWindowsStyle` to list of style plugins
It looks like `WindowsVistaStyle`-plugin is going to be renamed
to `ModernWindowsStyle`-plugin. This plugin is going to provide the old
style `windowsvista` and the new style `windows11`.

I haven't seen any changelogs yet but that's what it looks like so far:
https://code.qt.io/cgit/qt/qtbase.git/tree/src/plugins/styles/modernwindows?h=6.7
2023-12-15 15:42:21 +01:00
Martchus 02a5617e36 Bump patch version 2023-12-15 15:36:07 +01:00
16 changed files with 129 additions and 20 deletions

View File

@ -9,8 +9,8 @@ set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}")
set(META_APP_DESCRIPTION
"Common Qt related C++ classes and routines used by my applications such as dialogs, widgets and models")
set(META_VERSION_MAJOR 6)
set(META_VERSION_MINOR 13)
set(META_VERSION_PATCH 3)
set(META_VERSION_MINOR 14)
set(META_VERSION_PATCH 1)
set(META_APP_VERSION ${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH})
project(${META_PROJECT_NAME})

View File

@ -12,6 +12,6 @@ core, gui, widgets
Some header files also require further Qt modules.
## Copyright notice and license
Copyright © 2015-2023 Marius Kittler
Copyright © 2015-2024 Marius Kittler
All code is licensed under [GPL-2-or-later](LICENSE).

View File

@ -1,5 +1,8 @@
cmake_minimum_required(VERSION 3.17.0 FATAL_ERROR)
message(DEPRECATION "Do not use the AndroidApk module anymore. It broke after some minor Qt 5 version. As of Qt 6 the "
"CMake functions that come with Qt itself are sufficient.")
# adds a target to create an Android APK with the help of androiddeployqt if target platform is Android
if (NOT ANDROID)

View File

@ -280,9 +280,41 @@ if (STATIC_LINKAGE OR QT_TARGET_TYPE STREQUAL STATIC_LIBRARY)
endif ()
endif ()
# enable network information support for projects setting NETWORK_INFORMATION_SUPPORT explicitly
if (NETWORK_INFORMATION_SUPPORT)
set(KNOWN_NETWORK_INFORMATION_PLUGINS
${META_NETWORK_INFORMATION_PLUGINS} NetworkManagerNetworkInformation GlibNetworkInformation NLMNI
AndroidNetworkInformation SCNetworkReachabilityNetworkInformation)
set(USED_NETWORK_INFORMATION_PLUGINS)
foreach (PLUGIN ${KNOWN_NETWORK_INFORMATION_PLUGINS})
if (TARGET "${QT_PACKAGE_PREFIX}::Q${PLUGIN}Plugin")
use_qt_module(
LIBRARIES_VARIABLE
"${QT_PLUGINS_LIBRARIES_VARIABLE}"
PREFIX
"${QT_PACKAGE_PREFIX}"
MODULE
Network
PLUGINS
${PLUGIN}
ONLY_PLUGINS)
if (PLUGIN STREQUAL NLMNI)
set(PLUGIN NetworkListManagerNetworkInformation)
endif ()
list(APPEND USED_NETWORK_INFORMATION_PLUGINS "${PLUGIN}")
endif ()
endforeach ()
# allow importing network information plugins via qtconfig.h
if (USED_NETWORK_INFORMATION_PLUGINS)
list_to_string(" " "\\\n Q_IMPORT_PLUGIN(Q" "BackendFactory)" "${USED_NETWORK_INFORMATION_PLUGINS}"
USED_NETWORK_INFORMATION_PLUGINS_ARRAY)
endif ()
endif ()
# ensure all available widget style plugins are built-in when creating a Qt Widgets application - required since Qt 5.10
# because the styles have been "pluginized" (see commit 4f3249f)
set(KNOWN_WIDGET_STYLE_PLUGINS WindowsVistaStyle MacStyle AndroidStyle)
set(KNOWN_WIDGET_STYLE_PLUGINS ModernWindowsStyle WindowsVistaStyle MacStyle AndroidStyle)
set(USED_WIDGET_STYLE_PLUGINS)
if (Widgets IN_LIST QT_MODULES)
foreach (WIDGET_STYLE_PLUGIN ${KNOWN_WIDGET_STYLE_PLUGINS})

View File

@ -13,5 +13,6 @@
#define IMPORT_IMAGE_FORMAT_PLUGINS @IMAGE_FORMAT_SUPPORT_ARRAY@
#define IMPORT_WIDGET_STYLE_PLUGINS @WIDGET_STYLE_PLUGINS_ARRAY@
#define IMPORT_TLS_PLUGINS @USED_TLS_PLUGINS_ARRAY@
#define IMPORT_NETWORK_INFORMATION_PLUGINS @USED_NETWORK_INFORMATION_PLUGINS_ARRAY@
@META_CUSTOM_QT_CONFIG@
#endif // @META_PROJECT_VARNAME_UPPER@_QT_CONFIG

View File

@ -4,6 +4,7 @@
#ifndef QT_UTILITIES_GLOBAL
#define QT_UTILITIES_GLOBAL
#include "qtutilities-definitions.h"
#include <c++utilities/application/global.h>
#ifdef QT_UTILITIES_STATIC

View File

@ -69,4 +69,27 @@ std::optional<bool> isDarkModeEnabled()
return std::nullopt;
}
/*!
* \brief Invokes the specified callback when the color scheme changed.
*
* The first argument of the callback will be whether the color scheme is dark now (Qt::ColorScheme::Dark).
* The callback is invoked immediately by this function unless \a invokeImmediately is set to false.
*
* \remarks Whether dark mode is enabled can only be determined on Qt 6.5 or newer and only on certain
* platforms. If it cannot be determined the \a darkModeChangedCallback is never invoked.
*/
QMetaObject::Connection onDarkModeChanged(std::function<void(bool)> &&darkModeChangedCallback, QObject *context, bool invokeImmediately)
{
#if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
if (const auto *const styleHints = QGuiApplication::styleHints()) {
if (invokeImmediately) {
darkModeChangedCallback(styleHints->colorScheme() == Qt::ColorScheme::Dark);
}
return QObject::connect(styleHints, &QStyleHints::colorSchemeChanged, context,
[handler = std::move(darkModeChangedCallback)](Qt::ColorScheme colorScheme) { return handler(colorScheme == Qt::ColorScheme::Dark); });
}
#endif
return QMetaObject::Connection();
}
} // namespace QtUtilities

View File

@ -3,10 +3,13 @@
#include "../global.h"
#include <QMetaObject>
#include <QPalette>
#include <functional>
#include <optional>
QT_FORWARD_DECLARE_CLASS(QObject)
QT_FORWARD_DECLARE_CLASS(QString)
namespace QtUtilities {
@ -14,6 +17,8 @@ namespace QtUtilities {
QT_UTILITIES_EXPORT bool openLocalFileOrDir(const QString &path);
QT_UTILITIES_EXPORT bool isPaletteDark(const QPalette &palette = QPalette());
QT_UTILITIES_EXPORT std::optional<bool> isDarkModeEnabled();
QT_UTILITIES_EXPORT QMetaObject::Connection onDarkModeChanged(
std::function<void(bool)> &&darkModeChangedCallback, QObject *context = nullptr, bool invokeImmediately = true);
} // namespace QtUtilities

View File

@ -24,6 +24,7 @@ IMPORT_IMAGE_FORMAT_PLUGINS
IMPORT_WIDGET_STYLE_PLUGINS
#endif // defined(QT_UTILITIES_GUI_QTWIDGETS) || defined(QT_UTILITIES_GUI_QTQUICK)
IMPORT_TLS_PLUGINS
IMPORT_NETWORK_INFORMATION_PLUGINS
#endif // QT_STATIC
#endif // MISC_UTILS_IMPORT_PLUGIN_H

View File

@ -9,6 +9,13 @@
#include <QQuickStyle>
#include <QString>
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#if defined(PLATFORM_ANDROID)
#define QT_UTILITIES_DEFAULT_QQC2_STYLE "Material"
#elif defined(PLATFORM_WINDOWS)
#define QT_UTILITIES_DEFAULT_QQC2_STYLE "Universal"
#endif
#else
#if defined(PLATFORM_ANDROID)
#define QT_UTILITIES_DEFAULT_QQC2_STYLE "material"
#elif defined(PLATFORM_WINDOWS)
@ -16,6 +23,8 @@
#endif
#endif
#endif
namespace CppUtilities {
class QT_UTILITIES_EXPORT QtConfigArguments {

View File

@ -16,6 +16,18 @@ QT_FORWARD_DECLARE_CLASS(QSettings)
QT_FORWARD_DECLARE_CLASS(QStringList)
#endif
/*!
* \brief Sets the base name of the desktop entry for this application from buildsystem-provided meta-data.
* \remarks
* - This is done as part of SET_QT_APPLICATION_INFO and thus normally doesn't need to be invoked individually.
* - This macro is still experimental.
*/
#define SET_QT_DESKTOP_FILE_NAME
#if defined(Q_OS_LINUX) && defined(qGuiApp) && defined(APP_ID)
#undef SET_QT_DESKTOP_FILE_NAME
#define SET_QT_DESKTOP_FILE_NAME QGuiApplication::setDesktopFileName(QStringLiteral(APP_ID));
#endif
/*!
* \brief Sets the application meta data in the QCoreApplication singleton and attributes commonly used
* within my applications.
@ -26,6 +38,7 @@ QT_FORWARD_DECLARE_CLASS(QStringList)
QCoreApplication::setOrganizationDomain(QStringLiteral(APP_DOMAIN)); \
QCoreApplication::setApplicationName(QStringLiteral(APP_NAME)); \
QCoreApplication::setApplicationVersion(QStringLiteral(APP_VERSION)); \
SET_QT_DESKTOP_FILE_NAME \
::QtUtilities::setupCommonQtApplicationAttributes()
/*!

View File

@ -30,7 +30,7 @@
#include <QStyleFactory>
#include <QVersionNumber>
#if defined(Q_OS_WINDOWS) && (QT_VERSION >= QT_VERSION_CHECK(6, 3, 0))
#if defined(Q_OS_WINDOWS) && (QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)) && (QT_VERSION < QT_VERSION_CHECK(6, 7, 0))
#include <QOperatingSystemVersion>
#define QT_UTILITIES_USE_FUSION_ON_WINDOWS_11
#endif
@ -352,7 +352,7 @@ void QtSettings::apply()
}
const auto debugLoggingEnabled = CppUtilities::isEnvVariableSet(PROJECT_VARNAME_UPPER "_LOG_QT_CONFIG");
if (debugLoggingEnabled.has_value() && debugLoggingEnabled.value()) {
if (const auto os = QOperatingSystemVersion::current(); os.type() != QOperatingSystemVersion::Unknown) {
if (const auto os = QOperatingSystemVersion::current(); os.type() != static_cast<decltype(os.type())>(QOperatingSystemVersion::Unknown)) {
const auto version = QVersionNumber(os.majorVersion(), os.minorVersion(), os.microVersion());
std::cerr << "OS name and version: " << os.name().toStdString() << ' ' << version.toString().toStdString() << '\n';
}
@ -365,6 +365,33 @@ void QtSettings::apply()
}
}
/*!
* \brief Re-applies default icon theme assuming the palette is dark or not depending on \a isPaletteDark.
*
* Re-assigns the appropriate default icon theme depending on the current palette. Call this function after the
* darkmode setting has changed without the current palette reflecting that but you want the darkmode setting take
* precedence over the palette (e.g. when using Qt Quick Material style under Android). If your application makes
* actually use of the palette and you want the palette take precedence than call \a reevaluatePaletteAndDefaultIconTheme()
* instead.
*
* Note that QtSettings::isPaletteDark() will return \a isPaletteDark after calling this function (even though the current
* palette is not actually reflecting that).
*
* \remarks
* - The default icon theme must have been assigned before using the apply() function.
* - This function has no effect if a custom icon theme is configured.
*/
void QtSettings::reapplyDefaultIconTheme(bool isPaletteDark)
{
if (isPaletteDark == m_d->isPaletteDark) {
return; // no need to do anything if there's no change
}
m_d->isPaletteDark = isPaletteDark;
if (auto iconTheme = QIcon::themeName(); iconTheme == QStringLiteral("default") || iconTheme == QStringLiteral("default-dark")) {
QIcon::setThemeName(m_d->isPaletteDark ? QStringLiteral("default-dark") : QStringLiteral("default"));
}
}
/*!
* \brief Re-evaluates whether the palette is dark and re-applies default icon theme.
*
@ -377,14 +404,7 @@ void QtSettings::apply()
*/
void QtSettings::reevaluatePaletteAndDefaultIconTheme()
{
const auto isPaletteDark = QtUtilities::isPaletteDark();
if (isPaletteDark == m_d->isPaletteDark) {
return; // no need to do anything if there's no change
}
m_d->isPaletteDark = isPaletteDark;
if (auto iconTheme = QIcon::themeName(); iconTheme == QStringLiteral("default") || iconTheme == QStringLiteral("default-dark")) {
QIcon::setThemeName(m_d->isPaletteDark ? QStringLiteral("default-dark") : QStringLiteral("default"));
}
reapplyDefaultIconTheme(QtUtilities::isPaletteDark());
}
/*!

View File

@ -51,6 +51,7 @@ public:
void restore(QSettings &settings);
void save(QSettings &settings) const;
void apply();
void reapplyDefaultIconTheme(bool isPaletteDark);
void reevaluatePaletteAndDefaultIconTheme();
bool isPaletteDark();
bool hasCustomFont() const;

View File

@ -20,7 +20,7 @@
<context>
<name>QtGui::QtLanguageOptionPage</name>
<message>
<location filename="../settingsdialog/qtsettings.cpp" line="566"/>
<location filename="../settingsdialog/qtsettings.cpp" line="586"/>
<source>recognized by Qt as</source>
<translation>von Qt erkannt als</translation>
</message>
@ -28,7 +28,7 @@
<context>
<name>QtGui::QtOptionCategory</name>
<message>
<location filename="../settingsdialog/qtsettings.cpp" line="420"/>
<location filename="../settingsdialog/qtsettings.cpp" line="440"/>
<source>Qt</source>
<translation></translation>
</message>

View File

@ -20,7 +20,7 @@
<context>
<name>QtGui::QtLanguageOptionPage</name>
<message>
<location filename="../settingsdialog/qtsettings.cpp" line="566"/>
<location filename="../settingsdialog/qtsettings.cpp" line="586"/>
<source>recognized by Qt as</source>
<translation type="unfinished"></translation>
</message>
@ -28,7 +28,7 @@
<context>
<name>QtGui::QtOptionCategory</name>
<message>
<location filename="../settingsdialog/qtsettings.cpp" line="420"/>
<location filename="../settingsdialog/qtsettings.cpp" line="440"/>
<source>Qt</source>
<translation type="unfinished"></translation>
</message>

View File

@ -20,7 +20,7 @@
<context>
<name>QtGui::QtLanguageOptionPage</name>
<message>
<location filename="../settingsdialog/qtsettings.cpp" line="566"/>
<location filename="../settingsdialog/qtsettings.cpp" line="586"/>
<source>recognized by Qt as</source>
<translation> Qt </translation>
</message>
@ -28,7 +28,7 @@
<context>
<name>QtGui::QtOptionCategory</name>
<message>
<location filename="../settingsdialog/qtsettings.cpp" line="420"/>
<location filename="../settingsdialog/qtsettings.cpp" line="440"/>
<source>Qt</source>
<translation>Qt</translation>
</message>