diff demos/shared/arthurstyle.d @ 310:5bcfe9e7db7f lifetime

Committing local changes
author maxter <spambox@d-coding.com>
date Wed, 23 Dec 2009 16:10:46 +0200
parents ab01453c9d56
children
line wrap: on
line diff
--- a/demos/shared/arthurstyle.d	Tue Sep 22 15:22:37 2009 +0000
+++ b/demos/shared/arthurstyle.d	Wed Dec 23 16:10:46 2009 +0200
@@ -1,450 +1,450 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the demonstration applications of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial Usage
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-module arthurstyle;
-
-
-import
-	qt.gui.QLayout,
-	qt.gui.QWindowsStyle,
-	qt.gui.QPainter,
-	qt.gui.QPainterPath,
-	qt.gui.QPixmapCache,
-	qt.gui.QRadioButton,
-	qt.gui.QPushButton,
-	qt.gui.QGroupBox,
-	qt.gui.QLinearGradient,
-	qt.gui.QStyleOption,
-	qt.gui.QStyleOptionFrameV2;
-
-
-class ArthurStyle : QWindowsStyle
-{
-    QPixmap cached(string img)
-    {
-        QPixmap pm = new QPixmap;
-        if (QPixmapCache.find(img, pm))
-            return pm;
-
-        pm = QPixmap.fromImage(new QImage(img), Qt.OrderedDither | Qt.OrderedAlphaDither);
-        if (pm.isNull)
-            return new QPixmap;
-
-        QPixmapCache.insert(img, pm);
-        return pm;
-    }
-
-    this()
-    {
-        //Q_INIT_RESOURCE(shared);
-    }
-    
-    void drawHoverRect(QPainter painter, QRect r)
-    {
-        qreal h = r.height();
-        qreal h2 = r.height() / 2.0;
-        QPainterPath path = new QPainterPath;
-        path.addRect(r.x() + h2, r.y() + 0, r.width() - h2 * 2, r.height());
-        path.addEllipse(r.x(), r.y(), h, h);
-        path.addEllipse(r.x() + r.width() - h, r.y(), h, h);
-        path.setFillRule(Qt.WindingFill);
-        painter.setPen(Qt.NoPen);
-        painter.setBrush(new QColor(191, 215, 191));
-        painter.setRenderHint(QPainter.Antialiasing);
-        painter.drawPath(path);
-    }
-
-    override void drawPrimitive(PrimitiveElement element, QStyleOption option, QPainter painter, QWidget widget)
-    {
-        assert(option);
-        switch (element)
-        {
-        case PE_FrameFocusRect:
-            break;
-
-        case PE_IndicatorRadioButton:
-            if (QStyleOptionButton button = cast(QStyleOptionButton)(option)) {
-                bool hover = (button.state & State_Enabled) && (button.state & State_MouseOver);
-                painter.save;
-                QPixmap radio;
-                if (hover)
-                    drawHoverRect(painter, widget.rect);
-
-                if (button.state & State_Sunken)
-                    radio = cached(":res/images/radiobutton-on.png");
-                else if (button.state & State_On)
-                    radio = cached(":res/images/radiobutton_on.png");
-                else
-                    radio = cached(":res/images/radiobutton_off.png");
-                painter.drawPixmap(button.rect.topLeft, radio);
-
-                painter.restore();
-            }
-            break;
-
-        case PE_PanelButtonCommand:
-            if (QStyleOptionButton button = cast(QStyleOptionButton)(option)) {
-                bool hover = (button.state & State_Enabled) && (button.state & State_MouseOver);
-
-                painter.save();
-                QPushButton pushButton = cast(QPushButton)(widget);
-                assert(pushButton);
-                auto parent = pushButton.parentWidget;
-                if (parent && cast(QGroupBox)(parent)) {
-                    auto lg = new QLinearGradient(0, 0, 0, parent.height);
-                    lg.setColorAt(0, new QColor(224,224,224));
-                    lg.setColorAt(1, new QColor(255,255,255));
-                    painter.setPen(Qt.NoPen);
-                    painter.setBrush(lg);
-                    painter.setBrushOrigin(QPoint() - widget.mapToParent(QPoint(0,0)));
-                    painter.drawRect(button.rect);
-                    painter.setBrushOrigin(0, 0);
-                }
-
-                bool down = (button.state & State_Sunken) || (button.state & State_On);
-
-                QPixmap left, right, mid;
-                if (down) {
-                    left = cached(":res/images/button_pressed_cap_left.png");
-                    right = cached(":res/images/button_pressed_cap_right.png");
-                    mid = cached(":res/images/button_pressed_stretch.png");
-                } else {
-                    left = cached(":res/images/button_normal_cap_left.png");
-                    right = cached(":res/images/button_normal_cap_right.png");
-                    mid = cached(":res/images/button_normal_stretch.png");
-                }
-                painter.drawPixmap(button.rect.topLeft, left);
-                painter.drawTiledPixmap(QRect(button.rect.x + left.width,
-                                               button.rect.y,
-                                               button.rect.width - left.width - right.width,
-                                               left.height),
-                                         mid);
-                painter.drawPixmap(button.rect.x + button.rect.width - right.width,
-                                    button.rect.y,
-                                    right);
-                if (hover)
-                    painter.fillRect(widget.rect.adjusted(3,5,-3,-5), new QColor(31,127,31,63));
-                painter.restore;
-            }
-            break;
-
-        case PE_FrameGroupBox:
-            if (QStyleOptionFrameV2 group = cast(QStyleOptionFrameV2)(option)) {
-                auto r = group.rect;
-
-                painter.save();
-                int radius = 14;
-                int radius2 = radius*2;
-                QPainterPath clipPath;
-                clipPath.moveTo(radius, 0);
-                clipPath.arcTo(r.right() - radius2, 0, radius2, radius2, 90, -90);
-                clipPath.arcTo(r.right() - radius2, r.bottom() - radius2, radius2, radius2, 0, -90);
-                clipPath.arcTo(r.left(), r.bottom() - radius2, radius2, radius2, 270, -90);
-                clipPath.arcTo(r.left(), r.top(), radius2, radius2, 180, -90);
-                painter.setClipPath(clipPath);
-                QPixmap titleStretch = cached(":res/images/title_stretch.png");
-                QPixmap topLeft = cached(":res/images/groupframe_topleft.png");
-                QPixmap topRight = cached(":res/images/groupframe_topright.png");
-                QPixmap bottomLeft = cached(":res/images/groupframe_bottom_left.png");
-                QPixmap bottomRight = cached(":res/images/groupframe_bottom_right.png");
-                QPixmap leftStretch = cached(":res/images/groupframe_left_stretch.png");
-                QPixmap topStretch = cached(":res/images/groupframe_top_stretch.png");
-                QPixmap rightStretch = cached(":res/images/groupframe_right_stretch.png");
-                QPixmap bottomStretch = cached(":res/images/groupframe_bottom_stretch.png");
-                auto lg = new QLinearGradient(0, 0, 0, r.height());
-                lg.setColorAt(0, new QColor(224,224,224));
-                lg.setColorAt(1, new QColor(255,255,255));
-                painter.setPen(Qt.NoPen);
-                painter.setBrush(lg);
-                painter.drawRect(r.adjusted(0, titleStretch.height()/2, 0, 0));
-                painter.setClipping(false);
-
-                int topFrameOffset = titleStretch.height()/2 - 2;
-                painter.drawPixmap(r.topLeft() + QPoint(0, topFrameOffset), topLeft);
-                painter.drawPixmap(r.topRight() - QPoint(topRight.width()-1, 0) + QPoint(0, topFrameOffset), topRight);
-                painter.drawPixmap(r.bottomLeft() - QPoint(0, bottomLeft.height()-1), bottomLeft);
-                painter.drawPixmap(r.bottomRight() - QPoint(bottomRight.width()-1, bottomRight.height()-1), bottomRight);
-
-                QRect left = r;
-                left.setY(r.y() + topLeft.height() + topFrameOffset);
-                left.setWidth(leftStretch.width());
-                left.setHeight(r.height() - topLeft.height() - bottomLeft.height() - topFrameOffset);
-                painter.drawTiledPixmap(left, leftStretch);
-
-                QRect top = r;
-                top.setX(r.x() + topLeft.width());
-                top.setY(r.y() + topFrameOffset);
-                top.setWidth(r.width() - topLeft.width() - topRight.width());
-                top.setHeight(topLeft.height());
-                painter.drawTiledPixmap(top, topStretch);
-
-                QRect right = r;
-                right.setX(r.right() - rightStretch.width()+1);
-                right.setY(r.y() + topRight.height() + topFrameOffset);
-                right.setWidth(rightStretch.width());
-                right.setHeight(r.height() - topRight.height() - bottomRight.height() - topFrameOffset);
-                painter.drawTiledPixmap(right, rightStretch);
-
-                QRect bottom = r;
-                bottom.setX(r.x() + bottomLeft.width());
-                bottom.setY(r.bottom() - bottomStretch.height()+1);
-                bottom.setWidth(r.width() - bottomLeft.width() - bottomRight.width());
-                bottom.setHeight(bottomLeft.height());
-                painter.drawTiledPixmap(bottom, bottomStretch);
-                painter.restore();
-            }
-            break;
-
-        default:
-            QWindowsStyle.drawPrimitive(element, option, painter, widget);
-            break;
-        }
-        return;
-    }
-
-    override void drawComplexControl(ComplexControl control, QStyleOptionComplex option,
-                                         QPainter painter, QWidget widget)
-    {
-        switch (control) {
-        case CC_Slider:
-            if (QStyleOptionSlider slider = cast(QStyleOptionSlider)(option)) {
-                QRect groove = subControlRect(CC_Slider, option, SC_SliderGroove, widget);
-                QRect handle = subControlRect(CC_Slider, option, SC_SliderHandle, widget);
-
-                painter.save;
-
-                bool hover = (slider.state & State_Enabled) && (slider.state & State_MouseOver);
-                if (hover) {
-                    QRect moderated = widget.rect().adjusted(0, 4, 0, -4);
-                    drawHoverRect(painter, moderated);
-                }
-
-                if ((option.subControls & SC_SliderGroove) && groove.isValid()) {
-                    QPixmap grv = cached(":res/images/slider_bar.png");
-                    painter.drawPixmap(QRect(groove.x() + 5, groove.y(),
-                                              groove.width() - 10, grv.height()),
-                                        grv);
-                }
-                if ((option.subControls & SC_SliderHandle) && handle.isValid()) {
-                    QPixmap hndl = cached(":res/images/slider_thumb_on.png");
-                    painter.drawPixmap(handle.topLeft(), hndl);
-                }
-
-                painter.restore();
-            }
-            break;
-        case CC_GroupBox:
-            if (QStyleOptionGroupBox groupBox
-                    = cast(QStyleOptionGroupBox)(option)) {
-                auto groupBoxCopy = new QStyleOptionGroupBox(groupBox);
-                groupBoxCopy.setSubControls = groupBoxCopy.subControls & ~SC_GroupBoxLabel;
-                QWindowsStyle.drawComplexControl(control, groupBoxCopy, painter, widget);
-
-                if (groupBox.subControls & SC_GroupBoxLabel) {
-                    QRect r = groupBox.rect;
-                    QPixmap titleLeft = cached(":res/images/title_cap_left.png");
-                    QPixmap titleRight = cached(":res/images/title_cap_right.png");
-                    QPixmap titleStretch = cached(":res/images/title_stretch.png");
-                    int txt_width = groupBox.fontMetrics.width(groupBox.text) + 20;
-                    painter.drawPixmap(r.center().x() - txt_width/2, 0, titleLeft);
-                    QRect tileRect = subControlRect(control, groupBox, SC_GroupBoxLabel, widget);
-                    painter.drawTiledPixmap(tileRect, titleStretch);
-                    painter.drawPixmap(tileRect.x() + tileRect.width(), 0, titleRight);
-                    int opacity = 31;
-                    painter.setPen(new QColor(0, 0, 0, opacity));
-                    painter.drawText(tileRect.translated(0, 1),
-                                      cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null);
-                    painter.drawText(tileRect.translated(2, 1),
-                                      cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null);
-                    painter.setPen(new QColor(0, 0, 0, opacity * 2));
-                    painter.drawText(tileRect.translated(1, 1),
-                                      cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null);
-                    painter.setPen(new QColor(Qt.white));
-                    painter.drawText(tileRect, cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null);
-                }
-            }
-            break;
-        default:
-            QWindowsStyle.drawComplexControl(control, option, painter, widget);
-            break;
-        }
-        return;
-    }
-
-    override QRect subControlRect(QStyle_ComplexControl control, QStyleOptionComplex option,
-                                      int sc, QWidget widget = null)
-    {
-        QRect rect;
-
-        auto subControl = cast(SubControl)sc;
-
-        switch (control) {
-        default:
-            rect = QWindowsStyle.subControlRect(control, option, subControl, widget);
-            break;
-        case CC_GroupBox:
-            if (QStyleOptionGroupBox group
-                    = cast(QStyleOptionGroupBox)(option)) {
-                switch (subControl) {
-                default:
-                    rect = QWindowsStyle.subControlRect(control, option, subControl, widget);
-                    break;
-                case SC_GroupBoxContents:
-                    rect = QWindowsStyle.subControlRect(control, option, subControl, widget);
-                    rect.adjust(0, -8, 0, 0);
-                    break;
-                case SC_GroupBoxFrame:
-                    rect = group.rect;
-                    break;
-                case SC_GroupBoxLabel:
-                    QPixmap titleLeft = cached(":res/images/title_cap_left.png");
-                    QPixmap titleRight = cached(":res/images/title_cap_right.png");
-                    QPixmap titleStretch = cached(":res/images/title_stretch.png");
-                    int txt_width = group.fontMetrics.width(group.text) + 20;
-                    rect = QRect(group.rect.center().x() - txt_width/2 + titleLeft.width(), 0,
-                                 txt_width - titleLeft.width() - titleRight.width(),
-                                 titleStretch.height());
-                    break;
-                }
-            }
-            break;
-        }
-
-        if (control == CC_Slider && subControl == SC_SliderHandle) {
-            rect.setWidth(13);
-            rect.setHeight(27);
-        } else if (control == CC_Slider && subControl == SC_SliderGroove) {
-            rect.setHeight(9);
-            rect.moveTop(27/2 - 9/2);
-        }
-        return rect;
-    }
-
-    override QSize sizeFromContents(ContentsType type, QStyleOption option,
-                                        QSize size, QWidget widget)
-    {
-        QSize newSize = QWindowsStyle.sizeFromContents(type, option, size, widget);
-
-        switch (type) {
-        case CT_RadioButton:
-            newSize += QSize(20, 0);
-            break;
-
-        case CT_PushButton:
-            newSize.setHeight(26);
-            break;
-
-        case CT_Slider:
-            newSize.setHeight(27);
-            break;
-
-        default:
-            break;
-        }
-
-        return newSize;
-    }
-
-    override int pixelMetric(PixelMetric pm, QStyleOption opt, QWidget widget)
-    {
-        if (pm == PM_SliderLength)
-            return 13;
-        return QWindowsStyle.pixelMetric(pm, opt, widget);
-    }
-
-    override void polish(QWidget widget)
-    {
-        if (widget.layout() && cast(QGroupBox)(widget)) {
-            if (widget.findChildren!(QGroupBox).length == 0) {
-                widget.layout().setWidgetSpacing(0); // Why setSpacing was renamed to setWidgetSpacing?
-                widget.layout().setMargin(12);
-            } else {
-                widget.layout().setMargin(13);
-            }
-        }
-
-        if (cast(QPushButton)(widget)
-            || cast(QRadioButton)(widget)
-            || cast(QSlider)(widget)) {
-            widget.setAttribute(Qt.WA_Hover);
-        }
-
-        QPalette pal = widget.palette();
-        if (widget.isWindow()) {
-            pal.setColor(QPalette.Window, new QColor(241, 241, 241));
-            widget.setPalette(pal);
-        }
-    }
-
-    override void unpolish(QWidget widget)
-    {
-        if (cast(QPushButton)(widget)
-            || cast(QRadioButton)(widget)
-            || cast(QSlider)(widget)) {
-            widget.setAttribute(Qt.WA_Hover, false);
-        }
-    }
-
-    override void polish(QPalette palette)
-    {
-        palette.setColor(QPalette.Window, new QColor(241, 241, 241));
-    }
-
-    override QRect subElementRect(SubElement element, QStyleOption option, QWidget widget)
-    {
-        QRect r;
-        switch(element) {
-        case SE_RadioButtonClickRect:
-            r = widget.rect();
-            break;
-        case SE_RadioButtonContents:
-            r = widget.rect().adjusted(20, 0, 0, 0);
-            break;
-        default:
-            r = QWindowsStyle.subElementRect(element, option, widget);
-            break;
-        }
-
-        if (cast(QRadioButton)(widget))
-            r = r.adjusted(5, 0, -5, 0);
-
-        return r;
-    }
-}
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial Usage
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+module arthurstyle;
+
+
+import
+	qt.gui.QLayout,
+	qt.gui.QWindowsStyle,
+	qt.gui.QPainter,
+	qt.gui.QPainterPath,
+	qt.gui.QPixmapCache,
+	qt.gui.QRadioButton,
+	qt.gui.QPushButton,
+	qt.gui.QGroupBox,
+	qt.gui.QLinearGradient,
+	qt.gui.QStyleOption,
+	qt.gui.QStyleOptionFrameV2;
+
+
+class ArthurStyle : QWindowsStyle
+{
+    QPixmap cached(string img)
+    {
+        QPixmap pm = new QPixmap;
+        if (QPixmapCache.find(img, pm))
+            return pm;
+
+        pm = QPixmap.fromImage(new QImage(img), Qt.OrderedDither | Qt.OrderedAlphaDither);
+        if (pm.isNull)
+            return new QPixmap;
+
+        QPixmapCache.insert(img, pm);
+        return pm;
+    }
+
+    this()
+    {
+        //Q_INIT_RESOURCE(shared);
+    }
+    
+    void drawHoverRect(QPainter painter, QRect r)
+    {
+        qreal h = r.height();
+        qreal h2 = r.height() / 2.0;
+        QPainterPath path = new QPainterPath;
+        path.addRect(r.x() + h2, r.y() + 0, r.width() - h2 * 2, r.height());
+        path.addEllipse(r.x(), r.y(), h, h);
+        path.addEllipse(r.x() + r.width() - h, r.y(), h, h);
+        path.setFillRule(Qt.WindingFill);
+        painter.setPen(Qt.NoPen);
+        painter.setBrush(new QColor(191, 215, 191));
+        painter.setRenderHint(QPainter.Antialiasing);
+        painter.drawPath(path);
+    }
+
+    override void drawPrimitive(PrimitiveElement element, QStyleOption option, QPainter painter, QWidget widget)
+    {
+        assert(option);
+        switch (element)
+        {
+        case PE_FrameFocusRect:
+            break;
+
+        case PE_IndicatorRadioButton:
+            if (QStyleOptionButton button = cast(QStyleOptionButton)(option)) {
+                bool hover = (button.state & State_Enabled) && (button.state & State_MouseOver);
+                painter.save;
+                QPixmap radio;
+                if (hover)
+                    drawHoverRect(painter, widget.rect);
+
+                if (button.state & State_Sunken)
+                    radio = cached(":res/images/radiobutton-on.png");
+                else if (button.state & State_On)
+                    radio = cached(":res/images/radiobutton_on.png");
+                else
+                    radio = cached(":res/images/radiobutton_off.png");
+                painter.drawPixmap(button.rect.topLeft, radio);
+
+                painter.restore();
+            }
+            break;
+
+        case PE_PanelButtonCommand:
+            if (QStyleOptionButton button = cast(QStyleOptionButton)(option)) {
+                bool hover = (button.state & State_Enabled) && (button.state & State_MouseOver);
+
+                painter.save();
+                QPushButton pushButton = cast(QPushButton)(widget);
+                assert(pushButton);
+                auto parent = pushButton.parentWidget;
+                if (parent && cast(QGroupBox)(parent)) {
+                    auto lg = new QLinearGradient(0, 0, 0, parent.height);
+                    lg.setColorAt(0, new QColor(224,224,224));
+                    lg.setColorAt(1, new QColor(255,255,255));
+                    painter.setPen(Qt.NoPen);
+                    painter.setBrush(lg);
+                    painter.setBrushOrigin(QPoint() - widget.mapToParent(QPoint(0,0)));
+                    painter.drawRect(button.rect);
+                    painter.setBrushOrigin(0, 0);
+                }
+
+                bool down = (button.state & State_Sunken) || (button.state & State_On);
+
+                QPixmap left, right, mid;
+                if (down) {
+                    left = cached(":res/images/button_pressed_cap_left.png");
+                    right = cached(":res/images/button_pressed_cap_right.png");
+                    mid = cached(":res/images/button_pressed_stretch.png");
+                } else {
+                    left = cached(":res/images/button_normal_cap_left.png");
+                    right = cached(":res/images/button_normal_cap_right.png");
+                    mid = cached(":res/images/button_normal_stretch.png");
+                }
+                painter.drawPixmap(button.rect.topLeft, left);
+                painter.drawTiledPixmap(QRect(button.rect.x + left.width,
+                                               button.rect.y,
+                                               button.rect.width - left.width - right.width,
+                                               left.height),
+                                         mid);
+                painter.drawPixmap(button.rect.x + button.rect.width - right.width,
+                                    button.rect.y,
+                                    right);
+                if (hover)
+                    painter.fillRect(widget.rect.adjusted(3,5,-3,-5), new QColor(31,127,31,63));
+                painter.restore;
+            }
+            break;
+
+        case PE_FrameGroupBox:
+            if (QStyleOptionFrameV2 group = cast(QStyleOptionFrameV2)(option)) {
+                auto r = group.rect;
+
+                painter.save();
+                int radius = 14;
+                int radius2 = radius*2;
+                QPainterPath clipPath;
+                clipPath.moveTo(radius, 0);
+                clipPath.arcTo(r.right() - radius2, 0, radius2, radius2, 90, -90);
+                clipPath.arcTo(r.right() - radius2, r.bottom() - radius2, radius2, radius2, 0, -90);
+                clipPath.arcTo(r.left(), r.bottom() - radius2, radius2, radius2, 270, -90);
+                clipPath.arcTo(r.left(), r.top(), radius2, radius2, 180, -90);
+                painter.setClipPath(clipPath);
+                QPixmap titleStretch = cached(":res/images/title_stretch.png");
+                QPixmap topLeft = cached(":res/images/groupframe_topleft.png");
+                QPixmap topRight = cached(":res/images/groupframe_topright.png");
+                QPixmap bottomLeft = cached(":res/images/groupframe_bottom_left.png");
+                QPixmap bottomRight = cached(":res/images/groupframe_bottom_right.png");
+                QPixmap leftStretch = cached(":res/images/groupframe_left_stretch.png");
+                QPixmap topStretch = cached(":res/images/groupframe_top_stretch.png");
+                QPixmap rightStretch = cached(":res/images/groupframe_right_stretch.png");
+                QPixmap bottomStretch = cached(":res/images/groupframe_bottom_stretch.png");
+                auto lg = new QLinearGradient(0, 0, 0, r.height());
+                lg.setColorAt(0, new QColor(224,224,224));
+                lg.setColorAt(1, new QColor(255,255,255));
+                painter.setPen(Qt.NoPen);
+                painter.setBrush(lg);
+                painter.drawRect(r.adjusted(0, titleStretch.height()/2, 0, 0));
+                painter.setClipping(false);
+
+                int topFrameOffset = titleStretch.height()/2 - 2;
+                painter.drawPixmap(r.topLeft() + QPoint(0, topFrameOffset), topLeft);
+                painter.drawPixmap(r.topRight() - QPoint(topRight.width()-1, 0) + QPoint(0, topFrameOffset), topRight);
+                painter.drawPixmap(r.bottomLeft() - QPoint(0, bottomLeft.height()-1), bottomLeft);
+                painter.drawPixmap(r.bottomRight() - QPoint(bottomRight.width()-1, bottomRight.height()-1), bottomRight);
+
+                QRect left = r;
+                left.setY(r.y() + topLeft.height() + topFrameOffset);
+                left.setWidth(leftStretch.width());
+                left.setHeight(r.height() - topLeft.height() - bottomLeft.height() - topFrameOffset);
+                painter.drawTiledPixmap(left, leftStretch);
+
+                QRect top = r;
+                top.setX(r.x() + topLeft.width());
+                top.setY(r.y() + topFrameOffset);
+                top.setWidth(r.width() - topLeft.width() - topRight.width());
+                top.setHeight(topLeft.height());
+                painter.drawTiledPixmap(top, topStretch);
+
+                QRect right = r;
+                right.setX(r.right() - rightStretch.width()+1);
+                right.setY(r.y() + topRight.height() + topFrameOffset);
+                right.setWidth(rightStretch.width());
+                right.setHeight(r.height() - topRight.height() - bottomRight.height() - topFrameOffset);
+                painter.drawTiledPixmap(right, rightStretch);
+
+                QRect bottom = r;
+                bottom.setX(r.x() + bottomLeft.width());
+                bottom.setY(r.bottom() - bottomStretch.height()+1);
+                bottom.setWidth(r.width() - bottomLeft.width() - bottomRight.width());
+                bottom.setHeight(bottomLeft.height());
+                painter.drawTiledPixmap(bottom, bottomStretch);
+                painter.restore();
+            }
+            break;
+
+        default:
+            QWindowsStyle.drawPrimitive(element, option, painter, widget);
+            break;
+        }
+        return;
+    }
+
+    override void drawComplexControl(ComplexControl control, QStyleOptionComplex option,
+                                         QPainter painter, QWidget widget)
+    {
+        switch (control) {
+        case CC_Slider:
+            if (QStyleOptionSlider slider = cast(QStyleOptionSlider)(option)) {
+                QRect groove = subControlRect(CC_Slider, option, SC_SliderGroove, widget);
+                QRect handle = subControlRect(CC_Slider, option, SC_SliderHandle, widget);
+
+                painter.save;
+
+                bool hover = (slider.state & State_Enabled) && (slider.state & State_MouseOver);
+                if (hover) {
+                    QRect moderated = widget.rect().adjusted(0, 4, 0, -4);
+                    drawHoverRect(painter, moderated);
+                }
+
+                if ((option.subControls & SC_SliderGroove) && groove.isValid()) {
+                    QPixmap grv = cached(":res/images/slider_bar.png");
+                    painter.drawPixmap(QRect(groove.x() + 5, groove.y(),
+                                              groove.width() - 10, grv.height()),
+                                        grv);
+                }
+                if ((option.subControls & SC_SliderHandle) && handle.isValid()) {
+                    QPixmap hndl = cached(":res/images/slider_thumb_on.png");
+                    painter.drawPixmap(handle.topLeft(), hndl);
+                }
+
+                painter.restore();
+            }
+            break;
+        case CC_GroupBox:
+            if (QStyleOptionGroupBox groupBox
+                    = cast(QStyleOptionGroupBox)(option)) {
+                auto groupBoxCopy = new QStyleOptionGroupBox(groupBox);
+                groupBoxCopy.setSubControls = groupBoxCopy.subControls & ~SC_GroupBoxLabel;
+                QWindowsStyle.drawComplexControl(control, groupBoxCopy, painter, widget);
+
+                if (groupBox.subControls & SC_GroupBoxLabel) {
+                    QRect r = groupBox.rect;
+                    QPixmap titleLeft = cached(":res/images/title_cap_left.png");
+                    QPixmap titleRight = cached(":res/images/title_cap_right.png");
+                    QPixmap titleStretch = cached(":res/images/title_stretch.png");
+                    int txt_width = groupBox.fontMetrics.width(groupBox.text) + 20;
+                    painter.drawPixmap(r.center().x() - txt_width/2, 0, titleLeft);
+                    QRect tileRect = subControlRect(control, groupBox, SC_GroupBoxLabel, widget);
+                    painter.drawTiledPixmap(tileRect, titleStretch);
+                    painter.drawPixmap(tileRect.x() + tileRect.width(), 0, titleRight);
+                    int opacity = 31;
+                    painter.setPen(new QColor(0, 0, 0, opacity));
+                    painter.drawText(tileRect.translated(0, 1),
+                                      cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null);
+                    painter.drawText(tileRect.translated(2, 1),
+                                      cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null);
+                    painter.setPen(new QColor(0, 0, 0, opacity * 2));
+                    painter.drawText(tileRect.translated(1, 1),
+                                      cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null);
+                    painter.setPen(new QColor(Qt.white));
+                    painter.drawText(tileRect, cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null);
+                }
+            }
+            break;
+        default:
+            QWindowsStyle.drawComplexControl(control, option, painter, widget);
+            break;
+        }
+        return;
+    }
+
+    override QRect subControlRect(QStyle_ComplexControl control, QStyleOptionComplex option,
+                                      int sc, QWidget widget = null)
+    {
+        QRect rect;
+
+        auto subControl = cast(SubControl)sc;
+
+        switch (control) {
+        default:
+            rect = QWindowsStyle.subControlRect(control, option, subControl, widget);
+            break;
+        case CC_GroupBox:
+            if (QStyleOptionGroupBox group
+                    = cast(QStyleOptionGroupBox)(option)) {
+                switch (subControl) {
+                default:
+                    rect = QWindowsStyle.subControlRect(control, option, subControl, widget);
+                    break;
+                case SC_GroupBoxContents:
+                    rect = QWindowsStyle.subControlRect(control, option, subControl, widget);
+                    rect.adjust(0, -8, 0, 0);
+                    break;
+                case SC_GroupBoxFrame:
+                    rect = group.rect;
+                    break;
+                case SC_GroupBoxLabel:
+                    QPixmap titleLeft = cached(":res/images/title_cap_left.png");
+                    QPixmap titleRight = cached(":res/images/title_cap_right.png");
+                    QPixmap titleStretch = cached(":res/images/title_stretch.png");
+                    int txt_width = group.fontMetrics.width(group.text) + 20;
+                    rect = QRect(group.rect.center().x() - txt_width/2 + titleLeft.width(), 0,
+                                 txt_width - titleLeft.width() - titleRight.width(),
+                                 titleStretch.height());
+                    break;
+                }
+            }
+            break;
+        }
+
+        if (control == CC_Slider && subControl == SC_SliderHandle) {
+            rect.setWidth(13);
+            rect.setHeight(27);
+        } else if (control == CC_Slider && subControl == SC_SliderGroove) {
+            rect.setHeight(9);
+            rect.moveTop(27/2 - 9/2);
+        }
+        return rect;
+    }
+
+    override QSize sizeFromContents(ContentsType type, QStyleOption option,
+                                        QSize size, QWidget widget)
+    {
+        QSize newSize = QWindowsStyle.sizeFromContents(type, option, size, widget);
+
+        switch (type) {
+        case CT_RadioButton:
+            newSize += QSize(20, 0);
+            break;
+
+        case CT_PushButton:
+            newSize.setHeight(26);
+            break;
+
+        case CT_Slider:
+            newSize.setHeight(27);
+            break;
+
+        default:
+            break;
+        }
+
+        return newSize;
+    }
+
+    override int pixelMetric(PixelMetric pm, QStyleOption opt, QWidget widget)
+    {
+        if (pm == PM_SliderLength)
+            return 13;
+        return QWindowsStyle.pixelMetric(pm, opt, widget);
+    }
+
+    override void polish(QWidget widget)
+    {
+        if (widget.layout() && cast(QGroupBox)(widget)) {
+            if (widget.findChildren!(QGroupBox).length == 0) {
+                widget.layout().setWidgetSpacing(0); // Why setSpacing was renamed to setWidgetSpacing?
+                widget.layout().setMargin(12);
+            } else {
+                widget.layout().setMargin(13);
+            }
+        }
+
+        if (cast(QPushButton)(widget)
+            || cast(QRadioButton)(widget)
+            || cast(QSlider)(widget)) {
+            widget.setAttribute(Qt.WA_Hover);
+        }
+
+        QPalette pal = widget.palette();
+        if (widget.isWindow()) {
+            pal.setColor(QPalette.Window, new QColor(241, 241, 241));
+            widget.setPalette(pal);
+        }
+    }
+
+    override void unpolish(QWidget widget)
+    {
+        if (cast(QPushButton)(widget)
+            || cast(QRadioButton)(widget)
+            || cast(QSlider)(widget)) {
+            widget.setAttribute(Qt.WA_Hover, false);
+        }
+    }
+
+    override void polish(QPalette palette)
+    {
+        palette.setColor(QPalette.Window, new QColor(241, 241, 241));
+    }
+
+    override QRect subElementRect(SubElement element, QStyleOption option, QWidget widget)
+    {
+        QRect r;
+        switch(element) {
+        case SE_RadioButtonClickRect:
+            r = widget.rect();
+            break;
+        case SE_RadioButtonContents:
+            r = widget.rect().adjusted(20, 0, 0, 0);
+            break;
+        default:
+            r = QWindowsStyle.subElementRect(element, option, widget);
+            break;
+        }
+
+        if (cast(QRadioButton)(widget))
+            r = r.adjusted(5, 0, -5, 0);
+
+        return r;
+    }
+}