[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    [PyKDE] [Qt4] visual appearance of plastique style on mouse over
From:       Hans-Peter Jansen <hpj () urpla ! net>
Date:       2006-11-11 12:45:05
Message-ID: 200611111345.06409.hpj () urpla ! net
[Download RAW message or body]

Hi,

while I caught the flu, I bothered with Qt4 a bit for the first time (being 
addicted to _Py_Qt3 since ages).

Building an rpm for SuSE 9.3 went pretty smooth, and playing around with 
qtdemo in the build dir was very appealing, up to the point where I 
recognized the appearance of buttons/combos and the like on mouse over for 
the first time.. Well, I may use a palette, where this is especially 
disturbing, but repainting the buttons top and bottom lines with the 
highlight color just looks butt ugly here. 

Since I still had some spare time, I looked into the source, quickly found 
the offending part, and started to play. The result is attached. Let me 
know your opinions, and let's hope, that Trolltech adds something similar 
to the next version..

BTW, compared with the rest of my KDE 3.5.5 desktop in plastik style, I also 
noted, that all but the button color wasn't imported correctly from my 
environment..

BTW2: the appearance of QProgressBars is also unfortunate, if the highlight 
color doesn't contrast strongly with the background.

Here's my palette:
Palette\active=#000000, #f8d991, #ffffff, #fbecc8, #7c6c48, #a59161, 
#000000, #ffffff, #000000, #ffffff, #ffe8ae, #000000, #ffdd76, #000000, 
#0000ff, #ff00ff, #e8e8e8
[just replace in .config/Trolltech.conf]

Kind regards,
   Pete

["qplastiquestyle-hover-fix.diff" (text/x-diff)]

--- src/gui/styles/qplastiquestyle.cpp.orig	2006-10-20 12:23:41.000000000 +0200
+++ src/gui/styles/qplastiquestyle.cpp	2006-11-11 12:59:33.578162970 +0100
@@ -402,6 +402,25 @@ static const char * const qt_titlebar_co
 "                           ",
 "                           "};
 
+// shamelessly stolen from kdelibs/kstyles/plastik/misc.cpp
+QColor alphaBlendColors(const QColor &bgColor, const QColor &fgColor, const int a)
+{
+    // normal button...
+    QRgb rgb = bgColor.rgb();
+    QRgb rgb_b = fgColor.rgb();
+    int alpha = a;
+    if(alpha>255) alpha = 255;
+    if(alpha<0) alpha = 0;
+    int inv_alpha = 255 - alpha;
+
+    QColor result  = QColor( qRgb(qRed(rgb_b)*inv_alpha/255 + qRed(rgb)*alpha/255,
+                                  qGreen(rgb_b)*inv_alpha/255 + qGreen(rgb)*alpha/255,
+                                  qBlue(rgb_b)*inv_alpha/255 + qBlue(rgb)*alpha/255) );
+
+    return result;
+}
+
+
 #define BEGIN_PLASTIQUE_PIXMAPCACHE(a) \
     QRect rect = button->rect; \
     QPixmap cache; \
@@ -1518,9 +1537,18 @@ void QPlastiqueStyle::drawPrimitive(Prim
             }
 
             // Main fill
-            p->fillRect(fillRect,
-                              qMapBrushToRect(sunken ? sunkenButtonGradientBrush
-                                              : buttonGradientBrush, rect));
+            if (hover && !sunken) {
+                QColor hoverColor = alphaBlendColors(option->palette.button(), 
+                                                     option->palette.highlight(), 230);
+                QBrush buttonHoverBrush = qMapBrushToRect(hoverColor, rect);
+                QLinearGradient buttonHoverGradient(rect.topLeft(), rect.bottomLeft());
+                buttonHoverGradient.setColorAt(0.0, buttonHoverBrush.color().light(104));
+                buttonHoverGradient.setColorAt(1.0, buttonHoverBrush.color().dark(110));
+                buttonGradientBrush = QBrush(buttonHoverGradient);
+                p->fillRect(fillRect, qMapBrushToRect(buttonGradientBrush, rect));
+            } else p->fillRect(fillRect,
+                                    qMapBrushToRect(sunken ? sunkenButtonGradientBrush
+                                                    : buttonGradientBrush, rect));
 
             // Top line
             p->setPen(QPen(qBrushLight(qMapBrushToRect(sunken ? sunkenButtonGradientBrush
@@ -1549,28 +1577,31 @@ void QPlastiqueStyle::drawPrimitive(Prim
             // Hovering
             if (hover && !sunken) {
                 QBrush hover = qMapBrushToRect(option->palette.highlight(), rect);
-                QBrush hoverOuter = hover;
-                qBrushSetAlphaF(&hoverOuter, 0.7);
-
+                qBrushSetAlphaF(&hover, 0.7);
                 p->setPen(QPen(hover, 0));
-                p->drawLine(rect.left() + 2, rect.top(), rect.right() - 2, rect.top());
-                p->drawLine(rect.left() + 2, rect.bottom(), rect.right() - 2, rect.bottom());
+                p->drawLine(rect.left() + 2, rect.top() + 1, rect.right() - 2, rect.top() + 1);
+                p->drawLine(rect.left() + 2, rect.bottom() - 1, rect.right() - 2, rect.bottom() - 1);
 
-                p->setPen(QPen(hoverOuter, 0));
-                p->drawLine(rect.left() + 1, rect.top() + 1, rect.right() - 1, rect.top() + 1);
-                p->drawLine(rect.left() + 1, rect.bottom() - 1, rect.right() - 1, rect.bottom() - 1);
+                p->drawLine(rect.left() + 1, rect.top() + 2, rect.left() + 1, rect.bottom() - 2);
+                p->drawLine(rect.right() - 1, rect.top() + 2, rect.right() - 1, rect.bottom() - 2);
 
                 QBrush hoverInner = hover;
-                qBrushSetAlphaF(&hoverInner, 0.45);
+                qBrushSetAlphaF(&hoverInner, 0.5);
                 p->setPen(QPen(hoverInner, 0));
-                p->drawLine(rect.left() + 1, rect.top() + 2, rect.right() - 1, rect.top() + 2);
-                p->drawLine(rect.left() + 1, rect.bottom() - 2, rect.right() - 1, rect.bottom() - 2);
+                p->drawLine(rect.left() + 2, rect.top() + 2, rect.right() - 2, rect.top() + 2);
+                p->drawLine(rect.left() + 2, rect.bottom() - 2, rect.right() - 2, rect.bottom() - 2);
 
-                QBrush hoverSide = hover;
-                qBrushSetAlphaF(&hoverSide, 0.075);
-                p->setPen(QPen(hoverSide, 0));
-                p->drawLine(rect.left() + 1, rect.top() + 2, rect.left() + 1, rect.bottom() - 2);
-                p->drawLine(rect.right() - 1, rect.top() + 2, rect.right() - 1, rect.bottom() - 2);
+                p->drawLine(rect.left() + 2, rect.top() + 2, rect.left() + 2, rect.bottom() - 2);
+                p->drawLine(rect.right() - 2, rect.top() + 2, rect.right() - 2, rect.bottom() - 2);
+
+                QBrush hoverInnerst = hover;
+                qBrushSetAlphaF(&hoverInnerst, 0.35);
+                p->setPen(QPen(hoverInnerst, 0));
+                p->drawLine(rect.left() + 3, rect.top() + 3, rect.right() - 3, rect.top() + 3);
+                p->drawLine(rect.left() + 3, rect.bottom() - 3, rect.right() - 3, rect.bottom() - 3);
+
+                p->drawLine(rect.left() + 3, rect.top() + 3, rect.left() + 3, rect.bottom() - 3);
+                p->drawLine(rect.right() - 3, rect.top() + 3, rect.right() - 3, rect.bottom() - 3);
             }
 
             p->setPen(oldPen);

["qprogress.png" (image/png)]

_______________________________________________
PyKDE mailing list    PyKDE@mats.imk.fraunhofer.de
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic