commit a36a44fa0be4418f701c15771265f63719331f7c Author: Andrey Rodionov Date: Sun Apr 12 22:15:57 2020 +0300 Create project diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9037593 --- /dev/null +++ b/.gitignore @@ -0,0 +1,87 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +.qmake.stash +.qmake.cache +Thumbs.db +.directory +*.orig + +# Version project +version.h + +# qtcreator generated files +*.pro.user* +*.txt.user* +*.qbs.user* +*.qmlproject.user* +*.pluginspec + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb + +# MinGW generated files +*.Debug +*.Release + +# translation related: +share/qtcreator/translations/*_tr.h +share/qtcreator/translations/qtcreator_untranslated.ts + +# Directories to ignore +# --------------------- + +debug +lib/* +lib64/* +release +.rcc +.pch +doc/doxygen/html +qch/* + +# Binaries +# -------- +bin +build +target_wrapper.sh \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5d8079d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.5) + +project(rtptheme LANGUAGES CXX) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(Qt5 COMPONENTS Widgets REQUIRED) + +add_library(rtptheme SHARED + main.cpp + rtptheme.cpp + rtptheme.h + rtptheme.json +) + +target_link_libraries(rtptheme PRIVATE Qt5::Widgets) +target_link_libraries(rtptheme PRIVATE Qt5::GuiPrivate) + +target_compile_definitions(rtptheme PRIVATE RTPTHEME_LIBRARY) + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..53e061d --- /dev/null +++ b/main.cpp @@ -0,0 +1,26 @@ +#include +#include "rtptheme.h" + +QT_BEGIN_NAMESPACE + +class RTPThemePlugin : public QPlatformThemePlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID QPlatformThemeFactoryInterface_iid FILE "rtptheme.json") + +public: + QPlatformTheme *create(const QString &key, const QStringList ¶ms) override; +}; + +QPlatformTheme *RTPThemePlugin::create(const QString &key, const QStringList ¶ms) +{ + Q_UNUSED(params); + if (!key.compare(QLatin1String("rtptheme"), Qt::CaseInsensitive)) + return new RTPTheme; + + return nullptr; +} + +QT_END_NAMESPACE + +#include "main.moc" diff --git a/rtptheme.cpp b/rtptheme.cpp new file mode 100644 index 0000000..8203557 --- /dev/null +++ b/rtptheme.cpp @@ -0,0 +1,189 @@ +#include "rtptheme.h" + +#include +#include +#include +#include + +#include +#include + +QT_BEGIN_NAMESPACE + +class RTPThemePrivate : public QPlatformThemePrivate +{ +public: + RTPThemePrivate() + : QPlatformThemePrivate() + { } + + ~RTPThemePrivate() + { + delete baseTheme; + } + + QPlatformTheme *baseTheme; +}; + +RTPTheme::RTPTheme() + : d_ptr(new RTPThemePrivate) +{ + Q_D(RTPTheme); + + QStringList themeNames; + themeNames += QGuiApplicationPrivate::platform_integration->themeNames(); + // 1) Look for a theme plugin. + for (const QString &themeName : qAsConst(themeNames)) { + d->baseTheme = QPlatformThemeFactory::create(themeName, nullptr); + if (d->baseTheme) + break; + } + + // 2) If no theme plugin was found ask the platform integration to + // create a theme + if (!d->baseTheme) { + for (const QString &themeName : qAsConst(themeNames)) { + d->baseTheme = QGuiApplicationPrivate::platform_integration->createPlatformTheme(themeName); + if (d->baseTheme) + break; + } + // No error message; not having a theme plugin is allowed. + } + + // 3) Fall back on the built-in "null" platform theme. + if (!d->baseTheme) + d->baseTheme = new QPlatformTheme; +} + +QPlatformMenuItem* RTPTheme::createPlatformMenuItem() const +{ + Q_D(const RTPTheme); + return d->baseTheme->createPlatformMenuItem(); +} + +QPlatformMenu* RTPTheme::createPlatformMenu() const +{ + Q_D(const RTPTheme); + return d->baseTheme->createPlatformMenu(); +} + +QPlatformMenuBar* RTPTheme::createPlatformMenuBar() const +{ + Q_D(const RTPTheme); + return d->baseTheme->createPlatformMenuBar(); +} + +void RTPTheme::showPlatformMenuBar() +{ + Q_D(const RTPTheme); + return d->baseTheme->showPlatformMenuBar(); +} + +bool RTPTheme::usePlatformNativeDialog(DialogType type) const +{ + Q_D(const RTPTheme); + + if (type == FileDialog) + return true; + + return d->baseTheme->usePlatformNativeDialog(type); +} + +QPlatformDialogHelper* RTPTheme::createPlatformDialogHelper(DialogType type) const +{ + Q_D(const RTPTheme); + + return d->baseTheme->createPlatformDialogHelper(type); +} + +#ifndef QT_NO_SYSTEMTRAYICON +QPlatformSystemTrayIcon* RTPTheme::createPlatformSystemTrayIcon() const +{ + Q_D(const RTPTheme); + return d->baseTheme->createPlatformSystemTrayIcon(); +} +#endif + +const QPalette *RTPTheme::palette(Palette type) const +{ + Q_D(const RTPTheme); + + if (type == SystemPalette) { + QStringList active { + "#000000", "#d3d3d3", "#ffffff", "#e9e9e9", "#696969", "#8d8d8d", + "#000000", "#ffffff", "#000000", "#fdfcfa", "#d3d3d3", "#000000", + "#232323", "#ffffff", "#0000ff", "#644a9b", "#faf6ef", "#000000", + "#ffffdc", "#000000" }; + QStringList disabled { + "#808080", "#d3d3d3", "#ffffff", "#f3f3f3", "#696969", "#8d8d8d", + "#808080", "#ffffff", "#808080", "#fdfcfa", "#d3d3d3", "#000000", + "#232323", "#808080", "#0000ff", "#644a9b", "#faf6ef", "#000000", + "#ffffdc", "#000000" }; + QStringList inactive { + "#000000", "#d3d3d3", "#ffffff", "#f3f3f3", "#696969", "#8d8d8d", + "#000000", "#ffffff", "#000000", "#fdfcfa", "#d3d3d3", "#000000", + "#232323", "#ffffff", "#0000ff", "#644a9b", "#faf6ef", "#000000", + "#ffffdc", "#000000" }; + + QPalette *pal = new QPalette(Qt::black); + for (int i = 0; i < qMin(active.count(), int(QPalette::NColorRoles)); ++i) + { + QPalette::ColorRole colorRole = (QPalette::ColorRole)i; + pal->setColor(QPalette::Active, colorRole, QColor(active[i])); + pal->setColor(QPalette::Disabled, colorRole, QColor(disabled[i])); + pal->setColor(QPalette::Inactive, colorRole, QColor(inactive[i])); + } + + return pal; + } + + return d->baseTheme->palette(type); +} + +const QFont* RTPTheme::font(Font type) const +{ + Q_D(const RTPTheme); + + return new QFont("Verdana",8); +} + +QVariant RTPTheme::themeHint(ThemeHint hint) const +{ + Q_D(const RTPTheme); + return d->baseTheme->themeHint(hint); +} + +QPixmap RTPTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const +{ + Q_D(const RTPTheme); + return d->baseTheme->standardPixmap(sp, size); +} + +QIcon RTPTheme::fileIcon(const QFileInfo &fileInfo, + QPlatformTheme::IconOptions iconOptions) const +{ + Q_D(const RTPTheme); + return d->baseTheme->fileIcon(fileInfo, iconOptions); +} + +QIconEngine * RTPTheme::createIconEngine(const QString &iconName) const +{ + Q_D(const RTPTheme); + return d->baseTheme->createIconEngine(iconName); +} + +#if QT_CONFIG(shortcut) +QList RTPTheme::keyBindings(QKeySequence::StandardKey key) const +{ + Q_D(const RTPTheme); + return d->baseTheme->keyBindings(key); +} +#endif + +QString RTPTheme::standardButtonText(int button) const +{ + Q_D(const RTPTheme); + return d->baseTheme->standardButtonText(button); +} + +QT_END_NAMESPACE diff --git a/rtptheme.h b/rtptheme.h new file mode 100644 index 0000000..ed03684 --- /dev/null +++ b/rtptheme.h @@ -0,0 +1,53 @@ +#ifndef RTPTHEME_H +#define RTPTHEME_H + +#include + +QT_BEGIN_NAMESPACE + +class RTPThemePrivate; + +class RTPTheme : public QPlatformTheme +{ + Q_DECLARE_PRIVATE(RTPTheme) +public: + RTPTheme(); + + QPlatformMenuItem *createPlatformMenuItem() const override; + QPlatformMenu *createPlatformMenu() const override; + QPlatformMenuBar *createPlatformMenuBar() const override; + void showPlatformMenuBar() override; + + bool usePlatformNativeDialog(DialogType type) const override; + QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const override; + +#ifndef QT_NO_SYSTEMTRAYICON + QPlatformSystemTrayIcon *createPlatformSystemTrayIcon() const override; +#endif + + const QPalette *palette(Palette type = SystemPalette) const override; + + const QFont *font(Font type = SystemFont) const override; + + QVariant themeHint(ThemeHint hint) const override; + + QPixmap standardPixmap(StandardPixmap sp, const QSizeF &size) const override; + QIcon fileIcon(const QFileInfo &fileInfo, + QPlatformTheme::IconOptions iconOptions = nullptr) const override; + + QIconEngine *createIconEngine(const QString &iconName) const override; + +#if QT_CONFIG(shortcut) + QList keyBindings(QKeySequence::StandardKey key) const override; +#endif + + QString standardButtonText(int button) const override; + +private: + QScopedPointer d_ptr; + Q_DISABLE_COPY_MOVE(RTPTheme) +}; + +QT_END_NAMESPACE + +#endif // QXDGDESKTOPPORTALTHEME_H diff --git a/rtptheme.json b/rtptheme.json new file mode 100644 index 0000000..d2e0612 --- /dev/null +++ b/rtptheme.json @@ -0,0 +1,3 @@ +{ + "Keys": [ "rtptheme"] +} diff --git a/rtptheme.pro b/rtptheme.pro new file mode 100644 index 0000000..e1021c2 --- /dev/null +++ b/rtptheme.pro @@ -0,0 +1,16 @@ +TARGET = rtptheme +CONFIG += plugin +TEMPLATE = lib + +PLUGIN_TYPE = platformthemes +PLUGIN_EXTENDS = - +PLUGIN_CLASS_NAME = RTPThemePlugin + +QT += gui-private + +HEADERS += \ + rtptheme.h + +SOURCES += \ + main.cpp \ + rtptheme.cpp