]> 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 bfccf7a6f60a9a8473055f042a1bb270ab5805aa..9c5adb4f65e316b014c9b7905a262dc3e620bf27 100644 (file)
 
 #include <config.h>
 
+#include "LyXRC.h"
+
 #include "ColorCache.h"
+#include "ColorSet.h"
 
-#include "Color.h"
+namespace lyx {
 
-#include <string>
+namespace{
+// FIXME (later): Qt >= 4.4 has a proper QPalette::NoRole value.
+QPalette::ColorRole const NoRole = static_cast<QPalette::ColorRole>(-1);
 
-namespace lyx {
+QPalette::ColorRole role(ColorCode 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:
+               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()
+{
+       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 const & color) const
+{
+       return get(color, lyxrc.use_system_colors);
+}
 
-const QColor grey40(0x66, 0x66, 0x66);
-const QColor grey60(0x99, 0x99, 0x99);
-const QColor grey80(0xcc, 0xcc, 0xcc);
-const QColor grey90(0xe5, 0xe5, 0xe5);
-const QColor none = Qt::black;
 
-QColor const & ColorCache::get(ColorCode col) const
+/// get the given color
+QColor ColorCache::get(Color const & color, bool syscolors) const
 {
-       lcolor_map::const_iterator cit = colormap.find(col);
-       if (cit != colormap.end())
-               return cit->second;
-
-       if (lcolor.getX11Name(col) == "grey40")
-               colormap[col] = grey40;
-       else if (lcolor.getX11Name(col) == "grey60")
-               colormap[col] = grey60;
-       else if (lcolor.getX11Name(col) == "grey80")
-               colormap[col] = grey80;
-       else if (lcolor.getX11Name(col) == "grey90")
-               colormap[col] = grey90;
-       else if (lcolor.getX11Name(col) == "none")
-               colormap[col] = none;
-       else
-               colormap[col] = QColor(lcolor.getX11Name(col).c_str());
-
-       return colormap[col];
+       if (!initialized_)
+               const_cast<ColorCache *>(this)->init();
+       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, 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,
+                       (base_color.blue() + merge_color.blue()) / 2);
+       }
+       // used by branches
+       return QColor(lcolor.getX11Name(color.baseColor).c_str()); 
 }
 
 
-void ColorCache::clear()
+bool ColorCache::isSystem(ColorCode const color) const
 {
-       colormap.clear();
+       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;
 }