examples/widgets/styles/norwegianwoodstyle.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/widgets/styles/norwegianwoodstyle.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,331 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+#include "norwegianwoodstyle.h"
+
+//! [0]
+void NorwegianWoodStyle::polish(QPalette &palette)
+{
+    QColor brown(212, 140, 95);
+    QColor beige(236, 182, 120);
+    QColor slightlyOpaqueBlack(0, 0, 0, 63);
+
+    QPixmap backgroundImage(":/images/woodbackground.png");
+    QPixmap buttonImage(":/images/woodbutton.png");
+    QPixmap midImage = buttonImage;
+
+    QPainter painter;
+    painter.begin(&midImage);
+    painter.setPen(Qt::NoPen);
+    painter.fillRect(midImage.rect(), slightlyOpaqueBlack);
+    painter.end();
+//! [0]
+
+//! [1]
+    palette = QPalette(brown);
+
+    palette.setBrush(QPalette::BrightText, Qt::white);
+    palette.setBrush(QPalette::Base, beige);
+    palette.setBrush(QPalette::Highlight, Qt::darkGreen);
+    setTexture(palette, QPalette::Button, buttonImage);
+    setTexture(palette, QPalette::Mid, midImage);
+    setTexture(palette, QPalette::Window, backgroundImage);
+
+    QBrush brush = palette.background();
+    brush.setColor(brush.color().dark());
+
+    palette.setBrush(QPalette::Disabled, QPalette::WindowText, brush);
+    palette.setBrush(QPalette::Disabled, QPalette::Text, brush);
+    palette.setBrush(QPalette::Disabled, QPalette::ButtonText, brush);
+    palette.setBrush(QPalette::Disabled, QPalette::Base, brush);
+    palette.setBrush(QPalette::Disabled, QPalette::Button, brush);
+    palette.setBrush(QPalette::Disabled, QPalette::Mid, brush);
+}
+//! [1]
+
+//! [3]
+void NorwegianWoodStyle::polish(QWidget *widget)
+//! [3] //! [4]
+{
+    if (qobject_cast<QPushButton *>(widget)
+            || qobject_cast<QComboBox *>(widget))
+        widget->setAttribute(Qt::WA_Hover, true);
+}
+//! [4]
+
+//! [5]
+void NorwegianWoodStyle::unpolish(QWidget *widget)
+//! [5] //! [6]
+{
+    if (qobject_cast<QPushButton *>(widget)
+            || qobject_cast<QComboBox *>(widget))
+        widget->setAttribute(Qt::WA_Hover, false);
+}
+//! [6]
+
+//! [7]
+int NorwegianWoodStyle::pixelMetric(PixelMetric metric,
+//! [7] //! [8]
+                                    const QStyleOption *option,
+                                    const QWidget *widget) const
+{
+    switch (metric) {
+    case PM_ComboBoxFrameWidth:
+        return 8;
+    case PM_ScrollBarExtent:
+        return QMotifStyle::pixelMetric(metric, option, widget) + 4;
+    default:
+        return QMotifStyle::pixelMetric(metric, option, widget);
+    }
+}
+//! [8]
+
+//! [9]
+int NorwegianWoodStyle::styleHint(StyleHint hint, const QStyleOption *option,
+//! [9] //! [10]
+                                  const QWidget *widget,
+                                  QStyleHintReturn *returnData) const
+{
+    switch (hint) {
+    case SH_DitherDisabledText:
+        return int(false);
+    case SH_EtchDisabledText:
+        return int(true);
+    default:
+        return QMotifStyle::styleHint(hint, option, widget, returnData);
+    }
+}
+//! [10]
+
+//! [11]
+void NorwegianWoodStyle::drawPrimitive(PrimitiveElement element,
+//! [11] //! [12]
+                                       const QStyleOption *option,
+                                       QPainter *painter,
+                                       const QWidget *widget) const
+{
+    switch (element) {
+    case PE_PanelButtonCommand:
+        {
+            int delta = (option->state & State_MouseOver) ? 64 : 0;
+            QColor slightlyOpaqueBlack(0, 0, 0, 63);
+            QColor semiTransparentWhite(255, 255, 255, 127 + delta);
+            QColor semiTransparentBlack(0, 0, 0, 127 - delta);
+
+            int x, y, width, height;
+            option->rect.getRect(&x, &y, &width, &height);
+//! [12]
+
+//! [13]
+            QPainterPath roundRect = roundRectPath(option->rect);
+//! [13] //! [14]
+            int radius = qMin(width, height) / 2;
+//! [14]
+
+//! [15]
+            QBrush brush;
+//! [15] //! [16]
+            bool darker;
+
+            const QStyleOptionButton *buttonOption =
+                    qstyleoption_cast<const QStyleOptionButton *>(option);
+            if (buttonOption
+                    && (buttonOption->features & QStyleOptionButton::Flat)) {
+                brush = option->palette.background();
+                darker = (option->state & (State_Sunken | State_On));
+            } else {
+                if (option->state & (State_Sunken | State_On)) {
+                    brush = option->palette.mid();
+                    darker = !(option->state & State_Sunken);
+                } else {
+                    brush = option->palette.button();
+                    darker = false;
+//! [16] //! [17]
+                }
+//! [17] //! [18]
+            }
+//! [18]
+
+//! [19]
+            painter->save();
+//! [19] //! [20]
+            painter->setRenderHint(QPainter::Antialiasing, true);
+//! [20] //! [21]
+            painter->fillPath(roundRect, brush);
+//! [21] //! [22]
+            if (darker)
+//! [22] //! [23]
+                painter->fillPath(roundRect, slightlyOpaqueBlack);
+//! [23]
+
+//! [24]
+            int penWidth;
+//! [24] //! [25]
+            if (radius < 10)
+                penWidth = 3;
+            else if (radius < 20)
+                penWidth = 5;
+            else
+                penWidth = 7;
+
+            QPen topPen(semiTransparentWhite, penWidth);
+            QPen bottomPen(semiTransparentBlack, penWidth);
+
+            if (option->state & (State_Sunken | State_On))
+                qSwap(topPen, bottomPen);
+//! [25]
+
+//! [26]
+            int x1 = x;
+            int x2 = x + radius;
+            int x3 = x + width - radius;
+            int x4 = x + width;
+
+            if (option->direction == Qt::RightToLeft) {
+                qSwap(x1, x4);
+                qSwap(x2, x3);
+            }
+
+            QPolygon topHalf;
+            topHalf << QPoint(x1, y)
+                    << QPoint(x4, y)
+                    << QPoint(x3, y + radius)
+                    << QPoint(x2, y + height - radius)
+                    << QPoint(x1, y + height);
+
+            painter->setClipPath(roundRect);
+            painter->setClipRegion(topHalf, Qt::IntersectClip);
+            painter->setPen(topPen);
+            painter->drawPath(roundRect);
+//! [26] //! [32]
+
+            QPolygon bottomHalf = topHalf;
+            bottomHalf[0] = QPoint(x4, y + height);
+
+            painter->setClipPath(roundRect);
+            painter->setClipRegion(bottomHalf, Qt::IntersectClip);
+            painter->setPen(bottomPen);
+            painter->drawPath(roundRect);
+
+            painter->setPen(option->palette.foreground().color());
+            painter->setClipping(false);
+            painter->drawPath(roundRect);
+
+            painter->restore();
+        }
+        break;
+//! [32] //! [33]
+    default:
+//! [33] //! [34]
+        QMotifStyle::drawPrimitive(element, option, painter, widget);
+    }
+}
+//! [34]
+
+//! [35]
+void NorwegianWoodStyle::drawControl(ControlElement element,
+//! [35] //! [36]
+                                     const QStyleOption *option,
+                                     QPainter *painter,
+                                     const QWidget *widget) const
+{
+    switch (element) {
+    case CE_PushButtonLabel:
+        {
+            QStyleOptionButton myButtonOption;
+            const QStyleOptionButton *buttonOption =
+                    qstyleoption_cast<const QStyleOptionButton *>(option);
+            if (buttonOption) {
+                myButtonOption = *buttonOption;
+                if (myButtonOption.palette.currentColorGroup()
+                        != QPalette::Disabled) {
+                    if (myButtonOption.state & (State_Sunken | State_On)) {
+                        myButtonOption.palette.setBrush(QPalette::ButtonText,
+                                myButtonOption.palette.brightText());
+                    }
+                }
+            }
+            QMotifStyle::drawControl(element, &myButtonOption, painter, widget);
+        }
+        break;
+    default:
+        QMotifStyle::drawControl(element, option, painter, widget);
+    }
+}
+//! [36]
+
+//! [37]
+void NorwegianWoodStyle::setTexture(QPalette &palette, QPalette::ColorRole role,
+//! [37] //! [38]
+                                    const QPixmap &pixmap)
+{
+    for (int i = 0; i < QPalette::NColorGroups; ++i) {
+        QColor color = palette.brush(QPalette::ColorGroup(i), role).color();
+        palette.setBrush(QPalette::ColorGroup(i), role, QBrush(color, pixmap));
+    }
+}
+//! [38]
+
+//! [39]
+QPainterPath NorwegianWoodStyle::roundRectPath(const QRect &rect)
+//! [39] //! [40]
+{
+    int radius = qMin(rect.width(), rect.height()) / 2;
+    int diam = 2 * radius;
+
+    int x1, y1, x2, y2;
+    rect.getCoords(&x1, &y1, &x2, &y2);
+
+    QPainterPath path;
+    path.moveTo(x2, y1 + radius);
+    path.arcTo(QRect(x2 - diam, y1, diam, diam), 0.0, +90.0);
+    path.lineTo(x1 + radius, y1);
+    path.arcTo(QRect(x1, y1, diam, diam), 90.0, +90.0);
+    path.lineTo(x1, y2 - radius);
+    path.arcTo(QRect(x1, y2 - diam, diam, diam), 180.0, +90.0);
+    path.lineTo(x1 + radius, y2);
+    path.arcTo(QRect(x2 - diam, y2 - diam, diam, diam), 270.0, +90.0);
+    path.closeSubpath();
+    return path;
+}
+//! [40]