]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/ColorCache.cpp
Set url color from system theme.
[lyx.git] / src / frontends / qt4 / ColorCache.cpp
index 26ee11b279ecfaa3e067d29b44dfdeb243d72b60..9c5adb4f65e316b014c9b7905a262dc3e620bf27 100644 (file)
 
 namespace lyx {
 
-void ColorCache::setColor(int col, QPalette::ColorRole cr)
+namespace{
+// FIXME (later): Qt >= 4.4 has a proper QPalette::NoRole value.
+QPalette::ColorRole const NoRole = static_cast<QPalette::ColorRole>(-1);
+
+QPalette::ColorRole role(ColorCode col)
 {
-       lcolors_[col] = pal_.brush(QPalette::Active, cr).color();
+       switch (ColorCode(col)) {
+       case Color_background:
+       case Color_commentbg:
+       case Color_greyedoutbg:
+       case Color_mathbg:
+       case Color_graphicsbg:
+       case Color_mathmacrobg:
+       case Color_mathcorners:
+               return QPalette::Base;
+               break;
+                               
+       case Color_foreground:
+       case Color_cursor:
+       case Color_preview:
+       case Color_tabularline:
+       case Color_previewframe:
+               return QPalette::Text;
+               break;
+                               
+       case Color_selection:
+               return QPalette::Highlight;
+               break;
+       case Color_selectiontext:
+               return QPalette::HighlightedText;
+               break;
+       case Color_urllabel:
+       case Color_urltext:
+               return QPalette::Link;
+       default:
+               return NoRole;
+       }
+}
+
 }
 
 
 void ColorCache::init()
 {
-       if (lyxrc.use_system_colors) {
-               for (int col = 0; col <= Color_ignore; ++col) {
-                       switch (ColorCode(col)) {
-                       case Color_background:
-                       case Color_commentbg:
-                       case Color_greyedoutbg:
-                       case Color_mathbg:
-                       case Color_graphicsbg:
-                       case Color_mathmacrobg:
-                       case Color_mathcorners:
-                               setColor(col, QPalette::Base);
-                               break;
-                               
-                       case Color_foreground:
-                       case Color_cursor:
-                       case Color_preview:
-                       case Color_tabularline:
-                       case Color_previewframe:
-                               setColor(col, QPalette::Text);
-                               break;
-                               
-                       case Color_selection:
-                               setColor(col, QPalette::Highlight);
-                               break;
-                       case Color_selectiontext:
-                               setColor(col, QPalette::HighlightedText);
-                               break;
-                       default:
-                               lcolors_[col] = QColor(lcolor.getX11Name(ColorCode(col)).c_str());
-                       }
-               }
-       } else {
-               for (int col = 0; col <= Color_ignore; ++col) 
-                       lcolors_[col] = QColor(lcolor.getX11Name(ColorCode(col)).c_str());
+       for (int col = 0; col <= Color_ignore; ++col) {
+               lcolors_[col] = QColor(lcolor.getX11Name(ColorCode(col)).c_str());
        }
+
        initialized_ = true;
 }
 
 
 /// get the given color
-QColor ColorCache::get(Color color) const
+QColor ColorCache::get(Color const & color) const
+{
+       return get(color, lyxrc.use_system_colors);
+}
+
+
+/// get the given color
+QColor ColorCache::get(Color const & color, bool syscolors) const
 {
        if (!initialized_)
                const_cast<ColorCache *>(this)->init();
-       if (color <= Color_ignore && color.mergeColor == Color_ignore)
-               return lcolors_[color.baseColor];
+       if (color <= Color_ignore && color.mergeColor == Color_ignore) {
+               QPalette::ColorRole const cr = role(color.baseColor);
+               if (syscolors && cr != NoRole) {
+                       static QColor const white = Qt::white;
+                       QColor const c = pal_.brush(QPalette::Active, cr).color();
+                       if (cr == QPalette::Base && c == white)
+                               return lcolors_[color.baseColor];
+                       else
+                               return c;
+               } else
+                       return lcolors_[color.baseColor];
+       }
        if (color.mergeColor != Color_ignore) {
                // FIXME: This would ideally be done in the Color class, but
                // that means that we'd have to use the Qt code in the core.
-               QColor base_color = get(color.baseColor).toRgb();
-               QColor merge_color = get(color.mergeColor).toRgb();
+               QColor base_color = get(color.baseColor, syscolors).toRgb();
+               QColor merge_color = get(color.mergeColor, syscolors).toRgb();
                return QColor(
                        (base_color.red() + merge_color.red()) / 2,
                        (base_color.green() + merge_color.green()) / 2,
@@ -86,6 +108,17 @@ QColor ColorCache::get(Color color) const
 }
 
 
+bool ColorCache::isSystem(ColorCode const color) const
+{
+       QPalette::ColorRole const cr = role(color);
+       if (cr == QPalette::Base) {
+               static QColor const white = Qt::white;
+               return pal_.brush(QPalette::Active, cr).color() != white;
+       } else
+               return cr != NoRole;
+}
+
+
 QColor const rgb2qcolor(RGBColor const & rgb)
 {
        return QColor(rgb.r, rgb.g, rgb.b);