KColorScheme: default to application scheme if set by KColorSchemeManager
authorFrancis Herne <mail@flherne.uk>
Sun, 19 Feb 2017 20:01:38 +0000 (20:01 +0000)
committerMaximiliano Curia <maxy@debian.org>
Fri, 31 Mar 2017 13:26:18 +0000 (14:26 +0100)
KColorSchemeManager::activateScheme() sets a custom path for the
application's color scheme, with
`qApp->setProperty("KDE_COLOR_SCHEME_PATH", index.data(Qt::UserRole));`

Currently, the KColorScheme() and KStatefulBrush() constructors will
 ignore this and use only the system color scheme, unless an
 application-specific config is explicitly loaded and passed in by the
 caller.
This is problematic, because most callers assume that the default is to
 match the *application* scheme - usually this is equivalent, but it
 differs when KColorSchemeManager is used.

For example, when the application of a KTextEditor widget or
 KonsolePart has an opposite color scheme to the system, the Find bars
 are unreadable.
BUG: 373764

This patch makes KColorScheme() match the application scheme by default
 when this differs from the system scheme, which seems preferable to
 adding the same code in hundreds of callers.

Differential Revision: https://phabricator.kde.org/D4637

Gbp-Pq: Name KColorScheme-default-to-application-scheme-if-set-by-KCol.patch

src/kcolorscheme.cpp
src/kcolorscheme.h

index ba18d8e8b74d7ba24be103108fd866a77d8470c2..9405b72ba984788282820f3abcf35ee50b31fc16 100644 (file)
@@ -26,6 +26,7 @@
 #include <QColor>
 #include <QBrush>
 #include <QWidget>
+#include <QCoreApplication>
 
 //BEGIN StateEffects
 class StateEffects
@@ -250,6 +251,12 @@ static const DecoDefaultColors defaultDecorationColors = {
 };
 //END default colors
 
+KSharedConfigPtr defaultConfig() {
+    // Read from the application's color scheme file (as set by KColorSchemeManager).
+    // If unset, this is equivalent to openConfig() and the system scheme is used.
+    return KSharedConfig::openConfig(qApp->property("KDE_COLOR_SCHEME_PATH").toString());
+}
+
 //BEGIN KColorSchemePrivate
 class KColorSchemePrivate : public QSharedData
 {
@@ -431,7 +438,7 @@ KColorScheme::~KColorScheme()
 KColorScheme::KColorScheme(QPalette::ColorGroup state, ColorSet set, KSharedConfigPtr config)
 {
     if (!config) {
-        config = KSharedConfig::openConfig();
+        config = defaultConfig();
     }
 
     switch (set) {
@@ -662,7 +669,7 @@ KStatefulBrush::KStatefulBrush(KColorScheme::ColorSet set, KColorScheme::Decorat
 KStatefulBrush::KStatefulBrush(const QBrush &brush, KSharedConfigPtr config)
 {
     if (!config) {
-        config = KSharedConfig::openConfig();
+        config = defaultConfig();
     }
     d = new KStatefulBrushPrivate[3];
     d[0] = brush;
@@ -674,7 +681,7 @@ KStatefulBrush::KStatefulBrush(const QBrush &brush, const QBrush &background,
                                KSharedConfigPtr config)
 {
     if (!config) {
-        config = KSharedConfig::openConfig();
+        config = defaultConfig();
     }
     d = new KStatefulBrushPrivate[3];
     d[0] = brush;
index 2dced8ebff6b5cc96d686e8ce3ceee761cc76d71..fe636d59001897944f396754137e7e6ad8e0f31d 100644 (file)
@@ -312,8 +312,9 @@ public:
     KColorScheme &operator=(const KColorScheme &);
 
     /**
-     * Construct a palette from given color set and state, using the colors
-     * from the given KConfig (if null, the system colors are used).
+     * Construct a palette from given color set and state. Colors are taken
+     * from the given KConfig. If null, the application's color scheme is used
+     *  (either the system default or one set by KColorSchemeManager).
      *
      * @note KColorScheme provides direct access to the color scheme for users
      * that deal directly with widget states. Unless you are a low-level user
@@ -342,8 +343,7 @@ public:
      * Retrieve the requested shade color, using
      * KColorScheme::background(KColorScheme::NormalBackground)
      * as the base color and the contrast setting from the KConfig used to
-     * create this KColorScheme instance (the system contrast setting, if no
-     * KConfig was specified).
+     * create this KColorScheme instance.
      *
      * @note Shades are chosen such that all shades would contrast with the
      * base color. This means that if base is very dark, the 'dark' shades will
@@ -363,7 +363,8 @@ public:
     /**
      * Returns the contrast for borders as a floating point value.
      * @param config pointer to the config from which to read the contrast
-     * setting (the default is to use KSharedConfig::openConfig())
+     * setting. If null, the application's color scheme will be used
+     *   (either the system default or one set by KColorSchemeManager).
      * @return the contrast (between 0.0 for minimum and 1.0 for maximum
      *         contrast)
      */
@@ -371,7 +372,7 @@ public:
 
     /**
      * Retrieve the requested shade color, using the specified color as the
-     * base color and the system contrast setting.
+     * base color and the application's contrast setting.
      *
      * @note Shades are chosen such that all shades would contrast with the
      * base color. This means that if base is very dark, the 'dark' shades will
@@ -483,8 +484,9 @@ public:
 
     /**
      * Construct a stateful brush from given color set and foreground role,
-     * using the colors from the given KConfig (if null, the system colors are
-     * used).
+     * using the colors from the given KConfig.
+     * If null, the application's color scheme is used (either the system
+     * default, or one set by KColorSchemeManager).
      */
     explicit KStatefulBrush(KColorScheme::ColorSet,
                             KColorScheme::ForegroundRole,
@@ -492,8 +494,8 @@ public:
 
     /**
      * Construct a stateful brush from given color set and background role,
-     * using the colors from the given KConfig (if null, the system colors are
-     * used).
+     * using the colors from the given KConfig (if null, the application's
+     * colors are used).
      */
     explicit KStatefulBrush(KColorScheme::ColorSet,
                             KColorScheme::BackgroundRole,
@@ -501,8 +503,8 @@ public:
 
     /**
      * Construct a stateful brush from given color set and decoration role,
-     * using the colors from the given KConfig (if null, the system colors are
-     * used).
+     * using the colors from the given KConfig (if null, the application's
+     * colors are used).
      */
     explicit KStatefulBrush(KColorScheme::ColorSet,
                             KColorScheme::DecorationRole,
@@ -514,7 +516,7 @@ public:
      * determined from the base QBrush (which fills in the Active state)
      * according to the same rules used to build stateful color schemes from
      * the system color scheme. The state effects from the given KConfig are
-     * used (if null, the system state effects are used).
+     * used (if null, the application's state effects are used).
      */
     explicit KStatefulBrush(const QBrush &, KSharedConfigPtr = KSharedConfigPtr());
 
@@ -524,7 +526,7 @@ public:
      * states are determined from the base QBrush (which fills in the Active
      * state) according to the same rules used to build stateful color schemes
      * from the system color scheme. The state effects from the given KConfig
-     * are used (if null, the system state effects are used).
+     * are used (if null, the application's state effects are used).
      *
      * @param background The background brush (or color) corresponding to the
      * KColorScheme::NormalBackground role and QPalette::Active state for this