| Summary: | don't hardcode colors or play with the palette in ProcessWidget and derivatives | ||
|---|---|---|---|
| Product: | [Applications] kdevelop | Reporter: | Matthew Woehlke <mwoehlke.floss> | 
| Component: | general | Assignee: | kdevelop-bugs-null | 
| Status: | RESOLVED FIXED | ||
| Severity: | minor | ||
| Priority: | NOR | ||
| Version First Reported In: | git master | ||
| Target Milestone: | --- | ||
| Platform: | Compiled Sources | ||
| OS: | Linux | ||
| Latest Commit: | Version Fixed/Implemented In: | ||
| Sentry Crash Report: | |||
| Attachments: | 
              path to not play with palettes or use hard-coded (non-scheme) colors
               patch to fix the patch  | 
      ||
| 
 
        
          Description
        
        
          Matthew Woehlke
        
        
        
        
          2006-12-13 00:50:16 UTC
        
       
    Created attachment 18910 [details]
path to not play with palettes or use hard-coded (non-scheme) colors
Create a patch to do the following things:
- Don't play with the palette. Instead, use setCustomHighlighting(true); and
take over drawing the list item highlights so we don't confuse styles that use
the palette's highlight color.
- Don't use hard-coded colors (e.g. Qt::blue, Qt::darkGreen) for foreground
colors. Instead make use of QColorGroup::link[Visited]() and some color
blending to get more choices that will work well in the scheme. This changes
ProcessListBoxItem and GrepListBoxItem, which were the only two spots that I
could clearly identify as needing to be fixed.
    SVN commit 613289 by apaku:
Fix color highlighting so we don't confuse styles, do not use hardcoded colors.
Matthew, next time please use tabs instead of spaces if the original file does so ;)
BUG: 138730
 M  +56 -9     lib/widgets/processwidget.cpp  
 M  +4 -1      lib/widgets/processwidget.h  
 M  +28 -2     parts/grepview/grepviewwidget.cpp  
--- branches/kdevelop/3.4/lib/widgets/processwidget.cpp #613288:613289
@@ -31,7 +31,9 @@
 
 ProcessListBoxItem::ProcessListBoxItem(const QString &s, Type type)
     : QListBoxText(s), t(type)
-{}
+{
+    setCustomHighlighting(true);
+}
 
 
 bool ProcessListBoxItem::isCustomItem()
@@ -39,11 +41,58 @@
     return false;
 }
 
+static inline unsigned char normalize(int a)
+{
+    return (a < 0 ? 0 : a > 255 ? 255 : a);
+}
 
+static inline double blend1(double a, double b, double k)
+{
+    return a + (b - a) * k;
+}
+
+QColor ProcessListBoxItem::blend(const QColor &c1, const QColor &c2, double k) const
+{
+    if (k < 0.0) return c1;
+    if (k > 1.0) return c2;
+
+    int r = normalize((int)blend1((double)c1.red(),   (double)c2.red(),   k));
+    int g = normalize((int)blend1((double)c1.green(), (double)c2.green(), k));
+    int b = normalize((int)blend1((double)c1.blue(),  (double)c2.blue(),  k));
+
+    return QColor(qRgb(r, g, b));
+}
+
 void ProcessListBoxItem::paint(QPainter *p)
 {
-    p->setPen((t==Error)? Qt::darkRed :
-              (t==Diagnostic)? Qt::black : Qt::darkBlue);
+    QColor dim, warn, err, back;
+    if (listBox()) {
+        const QColorGroup& group = listBox()->palette().active();
+        if (isSelected()) {
+            back = group.button();
+            warn = group.buttonText();
+        }
+        else
+        {
+            back = group.base();
+            warn = group.text();
+        }
+        err = group.linkVisited();
+        dim = blend(warn, back);
+    }
+    else
+    {
+        warn = Qt::black;
+        dim = Qt::darkBlue;
+        err = Qt::darkRed;
+        if (isSelected())
+            back = Qt::lightGray;
+        else
+            back = Qt::white;
+    }
+    p->fillRect(p->window(), QBrush(back));
+    p->setPen((t==Error)? err :
+              (t==Diagnostic)? warn : dim);
     QListBoxText::paint(p);
 }
 
@@ -52,13 +101,11 @@
     : KListBox(parent, name)
 {
     setFocusPolicy(QWidget::NoFocus);
-    QPalette pal = palette();
-    pal.setColor(QColorGroup::HighlightedText,
-                 pal.color(QPalette::Normal, QColorGroup::Text));
-    pal.setColor(QColorGroup::Highlight,
-                 pal.color(QPalette::Normal, QColorGroup::Mid));
-    setPalette(pal);
 
+    // Don't override the palette, as that can mess up styles. Instead, draw
+    // the background ourselves (see ProcessListBoxItem::paint).
+
+
     childproc = new KProcess();
     childproc->setUseShell(true);
 
--- branches/kdevelop/3.4/lib/widgets/processwidget.h #613288:613289
@@ -41,7 +41,10 @@
     ProcessListBoxItem(const QString &s, Type type);
 
     virtual bool isCustomItem();
-    
+ 
+protected:
+    QColor blend(const QColor &c1, const QColor &c2, double k = 0.5) const;
+
 private:
     virtual void paint(QPainter *p);
     Type t;
--- branches/kdevelop/3.4/parts/grepview/grepviewwidget.cpp #613288:613289
@@ -69,19 +69,45 @@
 
 void GrepListBoxItem::paint(QPainter *p)
 {
+	QColor base, dim, result, bkground;
+	if (listBox()) {
+		const QColorGroup& group = listBox()->palette().active();
+		if (isSelected()) {
+			bkground = group.button();
+			base = group.buttonText();
+		}
+		else
+		{
+			bkground = group.base();
+			base = group.text();
+		}
+		dim = blend(base, bkground);
+		result = group.link();
+	}
+	else
+	{
+		base = Qt::black;
+		dim = Qt::darkGreen;
+		result = Qt::blue;
+		if (isSelected())
+			bkground = Qt::lightGray;
+		else
+			bkground = Qt::white;
+	}
 	QFontMetrics fm = p->fontMetrics();
 	QString stx = lineNumber + ":  ";
 	int y = fm.ascent()+fm.leading()/2;
 	int x = 3;
+	p->fillRect(p->window(), QBrush(bkground));
 	if (show)
 	{
-		p->setPen(Qt::darkGreen);
+		p->setPen(dim);
 		p->drawText(x, y, fileName);
 		x += fm.width(fileName);
 	}
 	else
 	{
-		p->setPen(Qt::black);
+		p->setPen(dim);
 		QFont font1(p->font());
 		QFont font2(font1);
 		font2.setBold(true);
    Aw, nuts, that was KWrite's fault; I hand-edited the patch to pull two comments that are (well, were until a moment ago) still in my local sources (which *does* use tabs) and I have 'replace tabs' turned on. Sorry about that! (Maybe if someone would fix Bug 115175 I would notice when I do that ;-).) Anyway, thanks Andreas! Created attachment 18982 [details]
patch to fix the patch
grepviewwidget.cpp did not get patched correctly: attaching a new patch to fix
it. (Andreas, is that because you had to apply it by hand? I'm sorry, again! I
made sure the tabs are right this time, at least as long as kwrite isn't lying
to me :-).)
    Re-open in light of previous comment/attachment SVN commit 614999 by apaku:
Really fix the color-problems. 
Patch from Matthew Woelke, applied cleanly this time ;)
BUG: 138730
 M  +2 -2      grepviewwidget.cpp  
--- branches/kdevelop/3.4/parts/grepview/grepviewwidget.cpp #614998:614999
@@ -107,7 +107,7 @@
 	}
 	else
 	{
-		p->setPen(dim);
+		p->setPen(base);
 		QFont font1(p->font());
 		QFont font2(font1);
 		font2.setBold(true);
@@ -116,7 +116,7 @@
 		p->setFont(font1);
 		x += fm.width(stx);
 
-		p->setPen(Qt::blue);
+		p->setPen(result);
 		p->drawText(x, y, text);
 	}
 }
     |