diff options
Diffstat (limited to 'src/gui/embedded/qdecorationwindows_qws.cpp')
-rw-r--r-- | src/gui/embedded/qdecorationwindows_qws.cpp | 407 |
1 files changed, 407 insertions, 0 deletions
diff --git a/src/gui/embedded/qdecorationwindows_qws.cpp b/src/gui/embedded/qdecorationwindows_qws.cpp new file mode 100644 index 0000000000..51d57d7203 --- /dev/null +++ b/src/gui/embedded/qdecorationwindows_qws.cpp @@ -0,0 +1,407 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module 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 <qapplication.h> +#include <qwidget.h> +#include <qpainter.h> +#include <qdrawutil.h> +#include "qdecorationwindows_qws.h" + +QT_BEGIN_NAMESPACE + +#if !defined(QT_NO_QWS_DECORATION_WINDOWS) || defined(QT_PLUGIN) + +#ifndef QT_NO_IMAGEFORMAT_XPM + +/* XPM */ +static const char * const win_close_xpm[] = { +"16 16 4 1", +" s None c None", +". c #000000", +"X c #FFFFFF", +"Y c #707070", +" ", +" ", +" ", +" Y. .Y ", +" .. .. ", +" .. .. ", +" .YY. ", +" Y..Y ", +" .YY. ", +" .. .. ", +" .. .. ", +" Y. .Y ", +" ", +" ", +" ", +" "}; + +static const char * const win_help_xpm[] = { +"16 16 3 1", +" s None c None", +". c #ffffff", +"X c #000000", +" ", +" ", +" ", +" XXXXXX ", +" XX XX ", +" XX XX ", +" XX ", +" XX ", +" XX ", +" XX ", +" ", +" XX ", +" XX ", +" ", +" ", +" "}; + +static const char * const win_maximize_xpm[] = { +"16 16 4 1", +" s None c None", +". c #000000", +"X c #FFFFFF", +"Y c #707070", +" ", +" ", +" ", +" .......... ", +" .......... ", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" .......... ", +" ", +" ", +" ", +" "}; + +static const char * const win_minimize_xpm[] = { +"16 16 4 1", +" s None c None", +". c #000000", +"X c #FFFFFF", +"Y c #707070", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ........ ", +" ........ ", +" ", +" ", +" ", +" "}; + +static const char * const win_normalize_xpm[] = { +"16 16 4 1", +" s None c None", +". c #000000", +"X c #FFFFFF", +"Y c #707070", +" ", +" ", +" ......... ", +" ......... ", +" . . ", +" . . ", +" ......... . ", +" ......... . ", +" . . . ", +" . .... ", +" . . ", +" . . ", +" ......... ", +" ", +" ", +" "}; + +#endif // QT_NO_IMAGEFORMAT_XPM + + +QDecorationWindows::QDecorationWindows() + : QDecorationDefault() +{ + menu_width = 16; + help_width = 18; + minimize_width = 18; + maximize_width = 18; + close_width = 18; +} + +QDecorationWindows::~QDecorationWindows() +{ +} + +const char **QDecorationWindows::xpmForRegion(int reg) +{ +#ifdef QT_NO_IMAGEFORMAT_XPM + Q_UNUSED(reg); +#else + switch(reg) + { + case Close: + return (const char **)win_close_xpm; + case Help: + return (const char **)win_help_xpm; + case Minimize: + return (const char **)win_minimize_xpm; + case Maximize: + return (const char **)win_maximize_xpm; + case Normalize: + return (const char **)win_normalize_xpm; + default: + return QDecorationDefault::xpmForRegion(reg); + } +#endif + return 0; +} + +QRegion QDecorationWindows::region(const QWidget *widget, const QRect &rect, int type) +{ + Qt::WindowFlags flags = widget->windowFlags(); + bool hasTitle = flags & Qt::WindowTitleHint; + bool hasSysMenu = flags & Qt::WindowSystemMenuHint; + bool hasContextHelp = flags & Qt::WindowContextHelpButtonHint; + bool hasMinimize = flags & Qt::WindowMinimizeButtonHint; + bool hasMaximize = flags & Qt::WindowMaximizeButtonHint; + const QFontMetrics fontMetrics = QApplication::fontMetrics(); + int titleHeight = hasTitle ? qMax(20, fontMetrics.height()) : 0; + int state = widget->windowState(); + bool isMinimized = state & Qt::WindowMinimized; + bool isMaximized = state & Qt::WindowMaximized; + + QRegion region; + switch (type) { + case Menu: { + if (hasSysMenu) { + region = QRect(rect.left() + 2, rect.top() - titleHeight, + menu_width, titleHeight); + } + } + break; + + case Title: { + QRect r(rect.left() + + (hasSysMenu ? menu_width + 4: 0), + rect.top() - titleHeight, + rect.width() + - (hasSysMenu ? menu_width : 0) + - close_width + - (hasMaximize ? maximize_width : 0) + - (hasMinimize ? minimize_width : 0) + - (hasContextHelp ? help_width : 0) + - 3, + titleHeight); + if (r.width() > 0) + region = r; + } + break; + case Help: { + if (hasContextHelp) { + QRect r(rect.right() + - close_width + - (hasMaximize ? maximize_width : 0) + - (hasMinimize ? minimize_width : 0) + - help_width - 3, rect.top() - titleHeight, + help_width, titleHeight); + if (r.left() > rect.left() + titleHeight) + region = r; + } + } + break; + + case Minimize: { + if (hasMinimize && !isMinimized) { + QRect r(rect.right() - close_width + - (hasMaximize ? maximize_width : 0) + - minimize_width - 3, rect.top() - titleHeight, + minimize_width, titleHeight); + if (r.left() > rect.left() + titleHeight) + region = r; + } + } + break; + + case Maximize: { + if (hasMaximize && !isMaximized) { + QRect r(rect.right() - close_width - maximize_width - 3, + rect.top() - titleHeight, maximize_width, titleHeight); + if (r.left() > rect.left() + titleHeight) + region = r; + } + } + break; + + case Normalize: { + if (hasMinimize && isMinimized) { + QRect r(rect.right() - close_width + - (hasMaximize ? maximize_width : 0) + - minimize_width - 3, rect.top() - titleHeight, + minimize_width, titleHeight); + if (r.left() > rect.left() + titleHeight) + region = r; + } else if (hasMaximize && isMaximized) { + QRect r(rect.right() - close_width - maximize_width - 3, + rect.top() - titleHeight, maximize_width, titleHeight); + if (r.left() > rect.left() + titleHeight) + region = r; + } + } + break; + + case Close: { + QRect r(rect.right() - close_width - 1, rect.top() - titleHeight, + close_width, titleHeight); + if (r.left() > rect.left() + titleHeight) + region = r; + } + break; + + default: + region = QDecorationDefault::region(widget, rect, type); + break; + } + + return region; +} + +bool QDecorationWindows::paint(QPainter *painter, const QWidget *widget, int decorationRegion, + DecorationState state) +{ + if (decorationRegion == None) + return false; + + const QRect titleRect = QDecoration::region(widget, Title).boundingRect(); + const QPalette pal = QApplication::palette(); + QRegion oldClipRegion = painter->clipRegion(); + + bool paintAll = (decorationRegion == int(All)); + if ((paintAll || decorationRegion & Title && titleRect.width() > 0) && state == Normal + && (widget->windowFlags() & Qt::WindowTitleHint) ) { + painter->setClipRegion(oldClipRegion); + QColor fromBrush, toBrush; + QPen titlePen; + + if (widget == qApp->activeWindow() || qApp->activeWindow() == qApp->activePopupWidget()) { + fromBrush = pal.color(QPalette::Highlight); + titlePen = pal.color(QPalette::HighlightedText); + } else { + fromBrush = pal.color(QPalette::Window); + titlePen = pal.color(QPalette::Text); + } + toBrush = fromBrush.lighter(300); + + painter->setPen(Qt::NoPen); + QPoint p1(titleRect.x(), titleRect.y() + titleRect.height()/2); + QPoint p2(titleRect.right(), titleRect.y() + titleRect.height()/2); + QLinearGradient lg(p1, p2); + lg.setColorAt(0, fromBrush); + lg.setColorAt(1, toBrush); + painter->fillRect(titleRect, lg); + + painter->setPen(titlePen); + painter->drawText(titleRect, Qt::AlignVCenter, windowTitleFor(widget)); + decorationRegion ^= Title; + } + + return QDecorationDefault::paint(painter, widget, decorationRegion, state); +} + +void QDecorationWindows::paintButton(QPainter *painter, const QWidget *widget, int buttonRegion, + DecorationState state, const QPalette &pal) +{ + QBrush fromBrush, toBrush; + QPen titlePen; + + if (widget == qApp->activeWindow() || qApp->activeWindow() == qApp->activePopupWidget()) { + fromBrush = pal.brush(QPalette::Highlight); + titlePen = pal.color(QPalette::HighlightedText); + } else { + fromBrush = pal.brush(QPalette::Window); + titlePen = pal.color(QPalette::Text); + } + toBrush = fromBrush.color().lighter(300); + + QRect brect(QDecoration::region(widget, buttonRegion).boundingRect()); + if (buttonRegion != Close && buttonRegion != Menu) + painter->fillRect(brect, toBrush); + else + painter->fillRect(brect.x() - 2, brect.y(), brect.width() + 4, brect.height(), + buttonRegion == Menu ? fromBrush : toBrush); + + int xoff = 1; + int yoff = 2; + const QPixmap pm = pixmapFor(widget, buttonRegion, xoff, yoff); + if (buttonRegion != Menu) { + if (state & Normal) { + qDrawWinPanel(painter, brect.x(), brect.y() + 2, brect.width(), + brect.height() - 4, pal, false, &pal.brush(QPalette::Window)); + } else if (state & Pressed) { + qDrawWinPanel(painter, brect.x(), brect.y() + 2, brect.width(), + brect.height() - 4, pal, true, &pal.brush(QPalette::Window)); + ++xoff; + ++yoff; + } + } else { + xoff = 0; + yoff = 2; + } + + if (!pm.isNull()) + painter->drawPixmap(brect.x() + xoff, brect.y() + yoff, pm); +} + +#endif // QT_NO_QWS_DECORATION_WINDOWS || QT_PLUGIN + +QT_END_NAMESPACE |