Blame style/adwaitastyle.cpp

Packit 8e9c33
/*************************************************************************
Packit 8e9c33
 * Copyright (C) 2014 by Hugo Pereira Da Costa <hugo.pereira@free.fr>    *
Packit 8e9c33
 *                                                                       *
Packit 8e9c33
 * This program is free software; you can redistribute it and/or modify  *
Packit 8e9c33
 * it under the terms of the GNU General Public License as published by  *
Packit 8e9c33
 * the Free Software Foundation; either version 2 of the License, or     *
Packit 8e9c33
 * (at your option) any later version.                                   *
Packit 8e9c33
 *                                                                       *
Packit 8e9c33
 * This program is distributed in the hope that it will be useful,       *
Packit 8e9c33
 * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
Packit 8e9c33
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
Packit 8e9c33
 * GNU General Public License for more details.                          *
Packit 8e9c33
 *                                                                       *
Packit 8e9c33
 * You should have received a copy of the GNU General Public License     *
Packit 8e9c33
 * along with this program; if not, write to the                         *
Packit 8e9c33
 * Free Software Foundation, Inc.,                                       *
Packit 8e9c33
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
Packit 8e9c33
 *************************************************************************/
Packit 8e9c33
Packit 8e9c33
#include "adwaitastyle.h"
Packit 8e9c33
Packit 8e9c33
#include "adwaita.h"
Packit 8e9c33
#include "adwaitaanimations.h"
Packit 8e9c33
#include "adwaitahelper.h"
Packit 8e9c33
#include "adwaitamnemonics.h"
Packit 8e9c33
#include "adwaitapropertynames.h"
Packit 8e9c33
#include "adwaitasplitterproxy.h"
Packit 8e9c33
#include "fakeadwaitastyleconfigdata.h"
Packit 8e9c33
#include "adwaitawidgetexplorer.h"
Packit 8e9c33
#include "adwaitawindowmanager.h"
Packit 8e9c33
Packit 8e9c33
#include <QApplication>
Packit 8e9c33
#include <QCheckBox>
Packit 8e9c33
#include <QComboBox>
Packit 8e9c33
#include <QDial>
Packit 8e9c33
#include <QDialog>
Packit 8e9c33
#include <QDBusConnection>
Packit 8e9c33
#include <QDockWidget>
Packit 8e9c33
#include <QFormLayout>
Packit 8e9c33
#include <QGraphicsView>
Packit 8e9c33
#include <QGroupBox>
Packit 8e9c33
#include <QLineEdit>
Packit 8e9c33
#include <QMainWindow>
Packit 8e9c33
#include <QMdiSubWindow>
Packit 8e9c33
#include <QMenu>
Packit 8e9c33
#include <QPainter>
Packit 8e9c33
#include <QProxyStyle>
Packit 8e9c33
#include <QPushButton>
Packit 8e9c33
#include <QRadioButton>
Packit 8e9c33
#include <QScrollBar>
Packit 8e9c33
#include <QItemDelegate>
Packit 8e9c33
#include <QSplitterHandle>
Packit 8e9c33
#include <QTextEdit>
Packit 8e9c33
#include <QToolBar>
Packit 8e9c33
#include <QToolBox>
Packit 8e9c33
#include <QToolButton>
Packit 8e9c33
#include <QWidgetAction>
Packit 8e9c33
Packit 8e9c33
namespace AdwaitaPrivate
Packit 8e9c33
{
Packit 8e9c33
Packit 8e9c33
    // needed to keep track of tabbars when being dragged
Packit 8e9c33
    class TabBarData: public QObject
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        public:
Packit 8e9c33
Packit 8e9c33
        //* constructor
Packit 8e9c33
        explicit TabBarData( QObject* parent ):
Packit 8e9c33
            QObject( parent )
Packit 8e9c33
        {}
Packit 8e9c33
Packit 8e9c33
        //* destructor
Packit 8e9c33
        virtual ~TabBarData( void )
Packit 8e9c33
        {}
Packit 8e9c33
Packit 8e9c33
        //* assign target tabBar
Packit 8e9c33
        void lock( const QWidget* widget )
Packit 8e9c33
        { _tabBar = widget; }
Packit 8e9c33
Packit 8e9c33
        //* true if tabbar is locked
Packit 8e9c33
        bool isLocked( const QWidget* widget ) const
Packit 8e9c33
        { return _tabBar && _tabBar.data() == widget; }
Packit 8e9c33
Packit 8e9c33
        //* release
Packit 8e9c33
        void release( void )
Packit 8e9c33
        { _tabBar.clear(); }
Packit 8e9c33
Packit 8e9c33
        private:
Packit 8e9c33
Packit 8e9c33
        //* pointer to target tabBar
Packit 8e9c33
        Adwaita::WeakPointer<const QWidget> _tabBar;
Packit 8e9c33
Packit 8e9c33
    };
Packit 8e9c33
Packit 8e9c33
    //* needed to have spacing added to items in combobox
Packit 8e9c33
    class ComboBoxItemDelegate: public QItemDelegate
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        public:
Packit 8e9c33
Packit 8e9c33
        //* constructor
Packit 8e9c33
        ComboBoxItemDelegate( QAbstractItemView* parent ):
Packit 8e9c33
            QItemDelegate( parent ),
Packit 8e9c33
            _proxy( parent->itemDelegate() ),
Packit 8e9c33
            _itemMargin( Adwaita::Metrics::ItemView_ItemMarginWidth )
Packit 8e9c33
        {}
Packit 8e9c33
Packit 8e9c33
        //* destructor
Packit 8e9c33
        virtual ~ComboBoxItemDelegate( void )
Packit 8e9c33
        {}
Packit 8e9c33
Packit 8e9c33
        //* paint
Packit 8e9c33
        void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
Packit 8e9c33
        {
Packit 8e9c33
            // call either proxy or parent class
Packit 8e9c33
            if( _proxy ) _proxy.data()->paint( painter, option, index );
Packit 8e9c33
            else QItemDelegate::paint( painter, option, index );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        //* size hint for index
Packit 8e9c33
        virtual QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            // get size from either proxy or parent class
Packit 8e9c33
            QSize size( _proxy ?
Packit 8e9c33
                _proxy.data()->sizeHint( option, index ):
Packit 8e9c33
                QItemDelegate::sizeHint( option, index ) );
Packit 8e9c33
Packit 8e9c33
            // adjust and return
Packit 8e9c33
            if( size.isValid() ) { size.rheight() += _itemMargin*2; }
Packit 8e9c33
            return size;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        private:
Packit 8e9c33
Packit 8e9c33
        //* proxy
Packit 8e9c33
        Adwaita::WeakPointer<QAbstractItemDelegate> _proxy;
Packit 8e9c33
Packit 8e9c33
        //* margin
Packit 8e9c33
        int _itemMargin;
Packit 8e9c33
Packit 8e9c33
    };
Packit 8e9c33
Packit 8e9c33
}
Packit 8e9c33
Packit 8e9c33
void tabLayout(const QStyleOptionTabV3 *opt, const QWidget *widget, QRect *textRect, QRect *iconRect, const QStyle *proxyStyle) {
Packit 8e9c33
    Q_ASSERT(textRect);
Packit 8e9c33
    Q_ASSERT(iconRect);
Packit 8e9c33
    QRect tr = opt->rect;
Packit 8e9c33
    bool verticalTabs = opt->shape == QTabBar::RoundedEast
Packit 8e9c33
                        || opt->shape == QTabBar::RoundedWest
Packit 8e9c33
                        || opt->shape == QTabBar::TriangularEast
Packit 8e9c33
                        || opt->shape == QTabBar::TriangularWest;
Packit 8e9c33
    if (verticalTabs)
Packit 8e9c33
        tr.setRect(0, 0, tr.height(), tr.width()); //0, 0 as we will have a translate transform
Packit 8e9c33
Packit 8e9c33
    int verticalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftVertical, opt, widget);
Packit 8e9c33
    int horizontalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, opt, widget);
Packit 8e9c33
    int hpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabHSpace, opt, widget) / 2;
Packit 8e9c33
    int vpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabVSpace, opt, widget) / 2;
Packit 8e9c33
    if (opt->shape == QTabBar::RoundedSouth || opt->shape == QTabBar::TriangularSouth)
Packit 8e9c33
        verticalShift = -verticalShift;
Packit 8e9c33
    tr.adjust(hpadding, verticalShift - vpadding, horizontalShift - hpadding, vpadding);
Packit 8e9c33
    bool selected = opt->state & QStyle::State_Selected;
Packit 8e9c33
    if (selected) {
Packit 8e9c33
        tr.setTop(tr.top() - verticalShift);
Packit 8e9c33
        tr.setRight(tr.right() - horizontalShift);
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    // left widget
Packit 8e9c33
    if (!opt->leftButtonSize.isEmpty()) {
Packit 8e9c33
        tr.setLeft(tr.left() + 4 +
Packit 8e9c33
            (verticalTabs ? opt->leftButtonSize.height() : opt->leftButtonSize.width()));
Packit 8e9c33
    }
Packit 8e9c33
    // right widget
Packit 8e9c33
    if (!opt->rightButtonSize.isEmpty()) {
Packit 8e9c33
        tr.setRight(tr.right() - 4 -
Packit 8e9c33
        (verticalTabs ? opt->rightButtonSize.height() : opt->rightButtonSize.width()));
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    // icon
Packit 8e9c33
    if (!opt->icon.isNull()) {
Packit 8e9c33
        QSize iconSize = opt->iconSize;
Packit 8e9c33
        if (!iconSize.isValid()) {
Packit 8e9c33
            int iconExtent = proxyStyle->pixelMetric(QStyle::PM_SmallIconSize);
Packit 8e9c33
            iconSize = QSize(iconExtent, iconExtent);
Packit 8e9c33
        }
Packit 8e9c33
        QSize tabIconSize = opt->icon.actualSize(iconSize,
Packit 8e9c33
                        (opt->state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled,
Packit 8e9c33
                        (opt->state & QStyle::State_Selected) ? QIcon::On : QIcon::Off  );
Packit 8e9c33
Packit 8e9c33
        *iconRect = QRect(tr.left(), tr.center().y() - tabIconSize.height() / 2,
Packit 8e9c33
                    tabIconSize.width(), tabIconSize .height());
Packit 8e9c33
        if (!verticalTabs)
Packit 8e9c33
            *iconRect = proxyStyle->visualRect(opt->direction, opt->rect, *iconRect);
Packit 8e9c33
        tr.setLeft(tr.left() + tabIconSize.width() + 4);
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    if (!verticalTabs)
Packit 8e9c33
        tr = proxyStyle->visualRect(opt->direction, opt->rect, tr);
Packit 8e9c33
Packit 8e9c33
    *textRect = tr;
Packit 8e9c33
}
Packit 8e9c33
Packit 8e9c33
namespace Adwaita
Packit 8e9c33
{
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    Style::Style( bool dark ):
Packit 8e9c33
        _addLineButtons( SingleButton )
Packit 8e9c33
        , _subLineButtons( SingleButton )
Packit 8e9c33
Packit 8e9c33
        #if ADWAITA_USE_KDE4
Packit 8e9c33
        , _helper( new Helper( "adwaita" ) )
Packit 8e9c33
        #else
Packit 8e9c33
        , _helper( new Helper( ) )
Packit 8e9c33
        #endif
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
        , _animations( new Animations( this ) )
Packit 8e9c33
        , _mnemonics( new Mnemonics( this ) )
Packit 8e9c33
        , _windowManager( new WindowManager( this ) )
Packit 8e9c33
        , _splitterFactory( new SplitterFactory( this ) )
Packit 8e9c33
        , _widgetExplorer( new WidgetExplorer( this ) )
Packit 8e9c33
        , _tabBarData( new AdwaitaPrivate::TabBarData( this ) )
Packit 8e9c33
        #if ADWAITA_USE_KDE4
Packit 8e9c33
        , SH_ArgbDndWindow( newStyleHint( QStringLiteral( "SH_ArgbDndWindow" ) ) )
Packit 8e9c33
        , CE_CapacityBar( newControlElement( QStringLiteral( "CE_CapacityBar" ) ) )
Packit 8e9c33
        #endif
Packit 8e9c33
        , _dark(dark)
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // use DBus connection to update on adwaita configuration change
Packit 8e9c33
        QDBusConnection dbus = QDBusConnection::sessionBus();
Packit 8e9c33
        dbus.connect( QString(),
Packit 8e9c33
            QStringLiteral( "/AdwaitaStyle" ),
Packit 8e9c33
            QStringLiteral( "org.kde.Adwaita.Style" ),
Packit 8e9c33
            QStringLiteral( "reparseConfiguration" ), this, SLOT(configurationChanged()) );
Packit 8e9c33
Packit 8e9c33
        dbus.connect( QString(),
Packit 8e9c33
            QStringLiteral( "/AdwaitaDecoration" ),
Packit 8e9c33
            QStringLiteral( "org.kde.Adwaita.Style" ),
Packit 8e9c33
            QStringLiteral( "reparseConfiguration" ), this, SLOT(configurationChanged()) );
Packit 8e9c33
Packit 8e9c33
        // Detect if running under KDE, if so set menus, etc, to have translucent background.
Packit 8e9c33
        // For GNOME desktop, dont want translucent backgrounds otherwise no menu shadow is drawn.
Packit 8e9c33
        _isKDE = qgetenv("XDG_CURRENT_DESKTOP").toLower()=="kde";
Packit 8e9c33
        _isGNOME = qgetenv("XDG_CURRENT_DESKTOP").toLower()=="gnome";
Packit 8e9c33
Packit 8e9c33
        // call the slot directly; this initial call will set up things that also
Packit 8e9c33
        // need to be reset when the system palette changes
Packit 8e9c33
        loadConfiguration();
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    Style::~Style( void )
Packit 8e9c33
    {
Packit 8e9c33
        delete _helper;
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    void Style::polish( QWidget* widget )
Packit 8e9c33
    {
Packit 8e9c33
        if( !widget ) return;
Packit 8e9c33
Packit 8e9c33
        // register widget to animations
Packit 8e9c33
        _animations->registerWidget( widget );
Packit 8e9c33
        _windowManager->registerWidget( widget );
Packit 8e9c33
        _splitterFactory->registerWidget( widget );
Packit 8e9c33
Packit 8e9c33
        // enable mouse over effects for all necessary widgets
Packit 8e9c33
        if(
Packit 8e9c33
            qobject_cast<QAbstractItemView*>( widget )
Packit 8e9c33
            || qobject_cast<QAbstractSpinBox*>( widget )
Packit 8e9c33
            || qobject_cast<QCheckBox*>( widget )
Packit 8e9c33
            || qobject_cast<QComboBox*>( widget )
Packit 8e9c33
            || qobject_cast<QDial*>( widget )
Packit 8e9c33
            || qobject_cast<QLineEdit*>( widget )
Packit 8e9c33
            || qobject_cast<QPushButton*>( widget )
Packit 8e9c33
            || qobject_cast<QRadioButton*>( widget )
Packit 8e9c33
            || qobject_cast<QScrollBar*>( widget )
Packit 8e9c33
            || qobject_cast<QSlider*>( widget )
Packit 8e9c33
            || qobject_cast<QSplitterHandle*>( widget )
Packit 8e9c33
            || qobject_cast<QTabBar*>( widget )
Packit 8e9c33
            || qobject_cast<QTextEdit*>( widget )
Packit 8e9c33
            || qobject_cast<QToolButton*>( widget )
Packit 8e9c33
            #if QT_VERSION >= 0x050000
Packit 8e9c33
            || qobject_cast<QHeaderView*>( widget )
Packit 8e9c33
            #endif
Packit 8e9c33
            || widget->inherits( "KTextEditor::View" )
Packit 8e9c33
            )
Packit 8e9c33
        { widget->setAttribute( Qt::WA_Hover ); }
Packit 8e9c33
Packit 8e9c33
        if (qobject_cast<QTabBar*>(widget)) {
Packit 8e9c33
            qobject_cast<QTabBar*>(widget)->setDrawBase(true);
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // enforce translucency for drag and drop window
Packit 8e9c33
        if( widget->testAttribute( Qt::WA_X11NetWmWindowTypeDND ) && _helper->compositingActive() )
Packit 8e9c33
        {
Packit 8e9c33
            widget->setAttribute( Qt::WA_TranslucentBackground );
Packit 8e9c33
            widget->clearMask();
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // scrollarea polishing is somewhat complex. It is moved to a dedicated method
Packit 8e9c33
        polishScrollArea( qobject_cast<QAbstractScrollArea*>( widget ) );
Packit 8e9c33
Packit 8e9c33
        if( QAbstractItemView *itemView = qobject_cast<QAbstractItemView*>( widget ) )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            // enable mouse over effects in itemviews' viewport
Packit 8e9c33
            itemView->viewport()->setAttribute( Qt::WA_Hover );
Packit 8e9c33
Packit 8e9c33
        } else if( QGroupBox* groupBox = qobject_cast<QGroupBox*>( widget ) )  {
Packit 8e9c33
Packit 8e9c33
            // checkable group boxes
Packit 8e9c33
            if( groupBox->isCheckable() )
Packit 8e9c33
            { groupBox->setAttribute( Qt::WA_Hover ); }
Packit 8e9c33
Packit 8e9c33
        } else if( qobject_cast<QAbstractButton*>( widget ) && qobject_cast<QDockWidget*>( widget->parent() ) ) {
Packit 8e9c33
Packit 8e9c33
            widget->setAttribute( Qt::WA_Hover );
Packit 8e9c33
Packit 8e9c33
        } else if( qobject_cast<QAbstractButton*>( widget ) && qobject_cast<QToolBox*>( widget->parent() ) ) {
Packit 8e9c33
Packit 8e9c33
            widget->setAttribute( Qt::WA_Hover );
Packit 8e9c33
Packit 8e9c33
        } else if( qobject_cast<QFrame*>( widget ) && widget->parent() && widget->parent()->inherits( "KTitleWidget" ) ) {
Packit 8e9c33
Packit 8e9c33
            widget->setAutoFillBackground( false );
Packit 8e9c33
            if( !StyleConfigData::titleWidgetDrawFrame() )
Packit 8e9c33
            { widget->setBackgroundRole( QPalette::Window ); }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        if( qobject_cast<QScrollBar*>( widget ) )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            // remove opaque painting for scrollbars
Packit 8e9c33
            widget->setAttribute( Qt::WA_OpaquePaintEvent, false );
Packit 8e9c33
Packit 8e9c33
        } else if( widget->inherits( "KTextEditor::View" ) ) {
Packit 8e9c33
Packit 8e9c33
            addEventFilter( widget );
Packit 8e9c33
Packit 8e9c33
        } else if( QToolButton* toolButton = qobject_cast<QToolButton*>( widget ) ) {
Packit 8e9c33
Packit 8e9c33
            if( toolButton->autoRaise() )
Packit 8e9c33
            {
Packit 8e9c33
                // for flat toolbuttons, adjust foreground and background role accordingly
Packit 8e9c33
                widget->setBackgroundRole( QPalette::NoRole );
Packit 8e9c33
                widget->setForegroundRole( QPalette::WindowText );
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            if( widget->parentWidget() &&
Packit 8e9c33
                widget->parentWidget()->parentWidget() &&
Packit 8e9c33
                widget->parentWidget()->parentWidget()->inherits( "Gwenview::SideBarGroup" ) )
Packit 8e9c33
            { widget->setProperty( PropertyNames::toolButtonAlignment, Qt::AlignLeft ); }
Packit 8e9c33
Packit 8e9c33
        } else if( qobject_cast<QDockWidget*>( widget ) ) {
Packit 8e9c33
Packit 8e9c33
            // add event filter on dock widgets
Packit 8e9c33
            // and alter palette
Packit 8e9c33
            widget->setAutoFillBackground( false );
Packit 8e9c33
            widget->setContentsMargins( Metrics::Frame_FrameWidth, Metrics::Frame_FrameWidth, Metrics::Frame_FrameWidth, Metrics::Frame_FrameWidth );
Packit 8e9c33
            addEventFilter( widget );
Packit 8e9c33
Packit 8e9c33
        } else if( qobject_cast<QMdiSubWindow*>( widget ) ) {
Packit 8e9c33
Packit 8e9c33
            widget->setAutoFillBackground( false );
Packit 8e9c33
            addEventFilter( widget );
Packit 8e9c33
Packit 8e9c33
        } else if( qobject_cast<QToolBox*>( widget ) ) {
Packit 8e9c33
Packit 8e9c33
            widget->setBackgroundRole( QPalette::NoRole );
Packit 8e9c33
            widget->setAutoFillBackground( false );
Packit 8e9c33
Packit 8e9c33
        } else if( widget->parentWidget() && widget->parentWidget()->parentWidget() && qobject_cast<QToolBox*>( widget->parentWidget()->parentWidget()->parentWidget() ) ) {
Packit 8e9c33
Packit 8e9c33
            widget->setBackgroundRole( QPalette::NoRole );
Packit 8e9c33
            widget->setAutoFillBackground( false );
Packit 8e9c33
            widget->parentWidget()->setAutoFillBackground( false );
Packit 8e9c33
Packit 8e9c33
        } else if( qobject_cast<QMenu*>( widget ) ) {
Packit 8e9c33
Packit 8e9c33
            setTranslucentBackground( widget );
Packit 8e9c33
Packit 8e9c33
        #if QT_VERSION >= 0x050000
Packit 8e9c33
        } else if( qobject_cast<QCommandLinkButton*>( widget ) ) {
Packit 8e9c33
Packit 8e9c33
            addEventFilter( widget );
Packit 8e9c33
        #endif
Packit 8e9c33
        } else if( QComboBox *comboBox = qobject_cast<QComboBox*>( widget ) ) {
Packit 8e9c33
Packit 8e9c33
            if( !hasParent( widget, "QWebView" ) )
Packit 8e9c33
            {
Packit 8e9c33
                QAbstractItemView *itemView( comboBox->view() );
Packit 8e9c33
                if( itemView && itemView->itemDelegate() && itemView->itemDelegate()->inherits( "QComboBoxDelegate" ) )
Packit 8e9c33
                { itemView->setItemDelegate( new AdwaitaPrivate::ComboBoxItemDelegate( itemView ) ); }
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        } else if( widget->inherits( "QComboBoxPrivateContainer" ) ) {
Packit 8e9c33
Packit 8e9c33
            addEventFilter( widget );
Packit 8e9c33
            setTranslucentBackground( widget );
Packit 8e9c33
Packit 8e9c33
        } else if( widget->inherits( "QTipLabel" ) ) {
Packit 8e9c33
Packit 8e9c33
            setTranslucentBackground( widget );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        if (!widget->parent() || !qobject_cast<QWidget *>(widget->parent())) {
Packit 8e9c33
            addEventFilter( widget );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // base class polishing
Packit 8e9c33
        ParentStyleClass::polish( widget );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    void Style::polishScrollArea( QAbstractScrollArea* scrollArea )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // check argument
Packit 8e9c33
        if( !scrollArea ) return;
Packit 8e9c33
Packit 8e9c33
        // enable mouse over effect in sunken scrollareas that support focus
Packit 8e9c33
        if( scrollArea->frameShadow() == QFrame::Sunken && scrollArea->focusPolicy()&Qt::StrongFocus )
Packit 8e9c33
        { scrollArea->setAttribute( Qt::WA_Hover ); }
Packit 8e9c33
Packit 8e9c33
        if( scrollArea->viewport() && scrollArea->inherits( "KItemListContainer" ) && scrollArea->frameShape() == QFrame::NoFrame )
Packit 8e9c33
        {
Packit 8e9c33
            scrollArea->viewport()->setBackgroundRole( QPalette::Window );
Packit 8e9c33
            scrollArea->viewport()->setForegroundRole( QPalette::WindowText );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // add event filter, to make sure proper background is rendered behind scrollbars
Packit 8e9c33
        addEventFilter( scrollArea );
Packit 8e9c33
Packit 8e9c33
        // force side panels as flat, on option
Packit 8e9c33
        if( scrollArea->inherits( "KDEPrivate::KPageListView" ) || scrollArea->inherits( "KDEPrivate::KPageTreeView" ) )
Packit 8e9c33
        { scrollArea->setProperty( PropertyNames::sidePanelView, true ); }
Packit 8e9c33
Packit 8e9c33
        // for all side view panels, unbold font (design choice)
Packit 8e9c33
        if( scrollArea->property( PropertyNames::sidePanelView ).toBool() )
Packit 8e9c33
        {
Packit 8e9c33
            // upbold list font
Packit 8e9c33
            QFont font( scrollArea->font() );
Packit 8e9c33
            font.setBold( false );
Packit 8e9c33
            scrollArea->setFont( font );
Packit 8e9c33
Packit 8e9c33
            // adjust background role
Packit 8e9c33
            if( !StyleConfigData::sidePanelDrawFrame() )
Packit 8e9c33
            {
Packit 8e9c33
                scrollArea->setBackgroundRole( QPalette::Window );
Packit 8e9c33
                scrollArea->setForegroundRole( QPalette::WindowText );
Packit 8e9c33
Packit 8e9c33
                if( scrollArea->viewport() )
Packit 8e9c33
                {
Packit 8e9c33
                    scrollArea->viewport()->setBackgroundRole( QPalette::Window );
Packit 8e9c33
                    scrollArea->viewport()->setForegroundRole( QPalette::WindowText );
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // disable autofill background for flat (== NoFrame) scrollareas, with QPalette::Window as a background
Packit 8e9c33
        // this fixes flat scrollareas placed in a tinted widget, such as groupboxes, tabwidgets or framed dock-widgets
Packit 8e9c33
        if( !(scrollArea->frameShape() == QFrame::NoFrame || scrollArea->backgroundRole() == QPalette::Window ) )
Packit 8e9c33
        { return; }
Packit 8e9c33
Packit 8e9c33
        // get viewport and check background role
Packit 8e9c33
        QWidget* viewport( scrollArea->viewport() );
Packit 8e9c33
        if( !( viewport && viewport->backgroundRole() == QPalette::Window ) ) return;
Packit 8e9c33
Packit 8e9c33
        // change viewport autoFill background.
Packit 8e9c33
        // do the same for all children if the background role is QPalette::Window
Packit 8e9c33
        viewport->setAutoFillBackground( false );
Packit 8e9c33
        QList<QWidget*> children( viewport->findChildren<QWidget*>() );
Packit 8e9c33
        foreach( QWidget* child, children )
Packit 8e9c33
        {
Packit 8e9c33
            if( child->parent() == viewport && child->backgroundRole() == QPalette::Window )
Packit 8e9c33
            { child->setAutoFillBackground( false ); }
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_______________________________________________________________
Packit 8e9c33
    void Style::unpolish( QWidget* widget )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // register widget to animations
Packit 8e9c33
        _animations->unregisterWidget( widget );
Packit 8e9c33
        _windowManager->unregisterWidget( widget );
Packit 8e9c33
        _splitterFactory->unregisterWidget( widget );
Packit 8e9c33
Packit 8e9c33
        // remove event filter
Packit 8e9c33
        if( qobject_cast<QAbstractScrollArea*>( widget ) ||
Packit 8e9c33
            qobject_cast<QDockWidget*>( widget ) ||
Packit 8e9c33
            qobject_cast<QMdiSubWindow*>( widget ) ||
Packit 8e9c33
            widget->inherits( "QComboBoxPrivateContainer" ) ||
Packit 8e9c33
            qobject_cast<QDialog *>(widget) ||
Packit 8e9c33
            qobject_cast<QMainWindow *>(widget))
Packit 8e9c33
            { widget->removeEventFilter( this ); }
Packit 8e9c33
Packit 8e9c33
        ParentStyleClass::unpolish( widget );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    void Style::polish(QPalette &palette)
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        if (_dark) {
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Window,          QColor("#33393b"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::WindowText,      QColor("white"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Base,            QColor("#232729"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::AlternateBase,   QColor("#1c1f20"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::ToolTipBase,     QColor("#1c1f20"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::ToolTipText,     QColor("white"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Text,            QColor("white"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Button,          QColor("#25292b"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::ButtonText,      QColor("white"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::BrightText,      QColor("black"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Light,           QColor("white"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Midlight,        QColor("#d7d7d7"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Mid,             QColor("#b4b4b4"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Dark,            QColor("#1a1a1a"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Shadow,          QColor("black"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Highlight,       QColor("#4a90d9"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::HighlightedText, QColor("white"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Link,            QColor("#2a76c6"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::LinkVisited,     QColor("#2a76c6"));
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Window,          QColor("#2e3436"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::WindowText,      QColor("#8d9091"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Base,            QColor("#3d4244"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::AlternateBase,   QColor("#3a3d3e"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Text,            QColor("#8d9091"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Button,          QColor("#33393b"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::ButtonText,      QColor("#8d9091"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::BrightText,      QColor("#ededed"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Light,           QColor("#f4f4f4"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Midlight,        QColor("#f4f4f4"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Dark,            QColor("#f4f4f4"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Mid,             QColor("#c3c3c3"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Shadow,          QColor("black"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Highlight,       QColor("#4a90d9"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::HighlightedText, QColor("white"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Link,            QColor("#4a90d9"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::LinkVisited,     QColor("#4a90d9"));
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Window,          QColor("#33393b"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::WindowText,      QColor("#d3d4d5"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Base,            QColor("#252a2c"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::AlternateBase,   QColor("#1d2021"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Text,            QColor("#d3d4d5"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Button,          QColor("#33393b"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::ButtonText,      QColor("#eeeeec"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::BrightText,      QColor("#d3d4d5"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Light,           QColor("white"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Midlight,        QColor("#d7d7d7"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Mid,             QColor("#b4b4b4"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Dark,            QColor("#33393b"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Shadow,          QColor("black"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Highlight,       QColor("#4a90d9"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::HighlightedText, QColor("white"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Link,            QColor("#4a90d9"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::LinkVisited,     QColor("#4a90d9"));
Packit 8e9c33
        }
Packit 8e9c33
        else {
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Window,          QColor("#ededed"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::WindowText,      QColor("#2e3436"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Base,            QColor("white"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::AlternateBase,   QColor("#ededed"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::ToolTipBase,     QColor("#060606"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::ToolTipText,     QColor("white"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Text,            QColor("#2e3436"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Button,          QColor("#eeeeee"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::ButtonText,      QColor("#2e3436"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::BrightText,      QColor("white"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Light,           QColor("#fafafa"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Midlight,        QColor("#f3f3f3"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Dark,            QColor("#d3d3d3"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Mid,             QColor("#b4b4b4"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Shadow,          QColor("black"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Highlight,       QColor("#4a90d9"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::HighlightedText, QColor("white"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::Link,            QColor("#2a76c6"));
Packit 8e9c33
            palette.setColor(QPalette::All,      QPalette::LinkVisited,     QColor("#2a76c6"));
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Window,          QColor("#f4f4f4"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::WindowText,      QColor("#8d9091"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Base,            QColor("white"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::AlternateBase,   QColor("#ededed"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Text,            QColor("#8d9091"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Button,          QColor("#f4f4f4"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::ButtonText,      QColor("#8d9091"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::BrightText,      QColor("#ededed"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Light,           QColor("#f4f4f4"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Midlight,        QColor("#f4f4f4"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Dark,            QColor("#f4f4f4"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Mid,             QColor("#c3c3c3"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Shadow,          QColor("black"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Highlight,       QColor("#4a90d9"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::HighlightedText, QColor("white"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::Link,            QColor("#4a90d9"));
Packit 8e9c33
            palette.setColor(QPalette::Disabled, QPalette::LinkVisited,     QColor("#4a90d9"));
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Window,          QColor("#ededed"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::WindowText,      QColor("#54595a"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Base,            QColor("#fcfcfc"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::AlternateBase,   QColor("#ededed"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Text,            QColor("#54595a"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Button,          QColor("#ededed"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::ButtonText,      QColor("#54595a"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::BrightText,      QColor("#ededed"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Light,           QColor("#ededed"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Midlight,        QColor("#ededed"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Dark,            QColor("#ededed"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Mid,             QColor("#c3c3c3"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Shadow,          QColor("black"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Highlight,       QColor("#4a90d9"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::HighlightedText, QColor("white"));
Packit 8e9c33
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::Link,            QColor("#4a90d9"));
Packit 8e9c33
            palette.setColor(QPalette::Inactive, QPalette::LinkVisited,     QColor("#4a90d9"));
Packit 8e9c33
        }
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    int Style::pixelMetric( PixelMetric metric, const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // handle special cases
Packit 8e9c33
        switch( metric )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            // frame width
Packit 8e9c33
            case PM_DefaultFrameWidth:
Packit 8e9c33
            if ( widget && widget->inherits("QComboBoxPrivateContainer") ) return 1;
Packit 8e9c33
            if( qobject_cast<const QMenu*>( widget ) ) return Metrics::Menu_FrameWidth;
Packit 8e9c33
            if( qobject_cast<const QLineEdit*>( widget ) ) return Metrics::LineEdit_FrameWidth;
Packit 8e9c33
            if( qobject_cast<const QAbstractScrollArea*>( widget ) ) return Metrics::ScrollArea_FrameWidth;
Packit 8e9c33
            #if QT_VERSION >= 0x050000
Packit 8e9c33
            else if( isQtQuickControl( option, widget ) )
Packit 8e9c33
            {
Packit 8e9c33
                const QString &elementType = option->styleObject->property( "elementType" ).toString();
Packit 8e9c33
                if( elementType == QLatin1String( "edit" ) || elementType == QLatin1String( "spinbox" ) )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    return Metrics::LineEdit_FrameWidth;
Packit 8e9c33
Packit 8e9c33
                } else if( elementType == QLatin1String( "combobox" ) ) {
Packit 8e9c33
Packit 8e9c33
                    return Metrics::ComboBox_FrameWidth;
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
            #endif
Packit 8e9c33
Packit 8e9c33
            // fallback
Packit 8e9c33
            return Metrics::Frame_FrameWidth;
Packit 8e9c33
Packit 8e9c33
            case PM_ComboBoxFrameWidth:
Packit 8e9c33
            {
Packit 8e9c33
                const QStyleOptionComboBox* comboBoxOption( qstyleoption_cast< const QStyleOptionComboBox*>( option ) );
Packit 8e9c33
                return comboBoxOption && comboBoxOption->editable ? Metrics::LineEdit_FrameWidth : Metrics::ComboBox_FrameWidth;
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case PM_SpinBoxFrameWidth: return Metrics::SpinBox_FrameWidth;
Packit 8e9c33
            case PM_ToolBarFrameWidth: return Metrics::ToolBar_FrameWidth;
Packit 8e9c33
            case PM_ToolTipLabelFrameWidth: return Metrics::ToolTip_FrameWidth;
Packit 8e9c33
Packit 8e9c33
            // layout
Packit 8e9c33
            case PM_LayoutLeftMargin:
Packit 8e9c33
            case PM_LayoutTopMargin:
Packit 8e9c33
            case PM_LayoutRightMargin:
Packit 8e9c33
            case PM_LayoutBottomMargin:
Packit 8e9c33
            {
Packit 8e9c33
                /*
Packit 8e9c33
                 * use either Child margin or TopLevel margin,
Packit 8e9c33
                 * depending on  widget type
Packit 8e9c33
                 */
Packit 8e9c33
                if( ( option && ( option->state & QStyle::State_Window ) ) || ( widget && widget->isWindow() ) )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    return Metrics::Layout_TopLevelMarginWidth;
Packit 8e9c33
Packit 8e9c33
                } else if( widget && widget->inherits( "KPageView" ) ) {
Packit 8e9c33
Packit 8e9c33
                    return 0;
Packit 8e9c33
Packit 8e9c33
                } else {
Packit 8e9c33
Packit 8e9c33
                    return Metrics::Layout_ChildMarginWidth;
Packit 8e9c33
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case PM_LayoutHorizontalSpacing: return Metrics::Layout_DefaultSpacing;
Packit 8e9c33
            case PM_LayoutVerticalSpacing: return Metrics::Layout_DefaultSpacing;
Packit 8e9c33
Packit 8e9c33
            // buttons
Packit 8e9c33
            case PM_ButtonMargin:
Packit 8e9c33
            {
Packit 8e9c33
                // needs special case for kcalc buttons, to prevent the application to set too small margins
Packit 8e9c33
                if( widget && widget->inherits( "KCalcButton" ) ) return Metrics::Button_MarginWidth + 4;
Packit 8e9c33
                else return Metrics::Button_MarginWidth;
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case PM_ButtonDefaultIndicator: return 0;
Packit 8e9c33
            case PM_ButtonShiftHorizontal: return 0;
Packit 8e9c33
            case PM_ButtonShiftVertical: return 0;
Packit 8e9c33
Packit 8e9c33
            // menubars
Packit 8e9c33
            case PM_MenuBarPanelWidth: return 0;
Packit 8e9c33
            case PM_MenuBarHMargin: return 0;
Packit 8e9c33
            case PM_MenuBarVMargin: return 0;
Packit 8e9c33
            case PM_MenuBarItemSpacing: return 0;
Packit 8e9c33
            case PM_MenuDesktopFrameWidth: return 0;
Packit 8e9c33
Packit 8e9c33
            // menu buttons
Packit 8e9c33
            case PM_MenuButtonIndicator: return Metrics::MenuButton_IndicatorWidth;
Packit 8e9c33
            case PM_MenuVMargin: return 2;
Packit 8e9c33
            case PM_MenuHMargin: return _isGNOME ? 0 : 1;
Packit 8e9c33
Packit 8e9c33
            // toolbars
Packit 8e9c33
            case PM_ToolBarHandleExtent: return Metrics::ToolBar_HandleExtent;
Packit 8e9c33
            case PM_ToolBarSeparatorExtent: return Metrics::ToolBar_SeparatorWidth;
Packit 8e9c33
            case PM_ToolBarExtensionExtent:
Packit 8e9c33
            return pixelMetric( PM_SmallIconSize, option, widget ) + 2*Metrics::ToolButton_MarginWidth;
Packit 8e9c33
Packit 8e9c33
            case PM_ToolBarItemMargin: return 0;
Packit 8e9c33
            case PM_ToolBarItemSpacing: return Metrics::ToolBar_ItemSpacing;
Packit 8e9c33
Packit 8e9c33
            // tabbars
Packit 8e9c33
            case PM_TabBarTabShiftVertical: return 0;
Packit 8e9c33
            case PM_TabBarTabShiftHorizontal: return 0;
Packit 8e9c33
            case PM_TabBarTabOverlap: return Metrics::TabBar_TabOverlap;
Packit 8e9c33
            case PM_TabBarBaseOverlap: return Metrics::TabBar_BaseOverlap;
Packit 8e9c33
            case PM_TabBarTabHSpace: return 2*Metrics::TabBar_TabMarginWidth;
Packit 8e9c33
            case PM_TabBarTabVSpace: return 2*Metrics::TabBar_TabMarginHeight;
Packit 8e9c33
            case PM_TabCloseIndicatorWidth:
Packit 8e9c33
            case PM_TabCloseIndicatorHeight:
Packit 8e9c33
            return pixelMetric( PM_SmallIconSize, option, widget );
Packit 8e9c33
Packit 8e9c33
            // scrollbars
Packit 8e9c33
            case PM_ScrollBarExtent: return Metrics::ScrollBar_Extend;
Packit 8e9c33
            case PM_ScrollBarSliderMin: return Metrics::ScrollBar_MinSliderHeight;
Packit 8e9c33
Packit 8e9c33
            // title bar
Packit 8e9c33
            case PM_TitleBarHeight: return 2*Metrics::TitleBar_MarginWidth + pixelMetric( PM_SmallIconSize, option, widget );
Packit 8e9c33
Packit 8e9c33
            // sliders
Packit 8e9c33
            case PM_SliderThickness: return Metrics::Slider_ControlThickness;
Packit 8e9c33
            case PM_SliderControlThickness: return Metrics::Slider_ControlThickness;
Packit 8e9c33
            case PM_SliderLength: return Metrics::Slider_ControlThickness;
Packit 8e9c33
Packit 8e9c33
            // checkboxes and radio buttons
Packit 8e9c33
            case PM_IndicatorWidth: return Metrics::CheckBox_Size;
Packit 8e9c33
            case PM_IndicatorHeight: return Metrics::CheckBox_Size;
Packit 8e9c33
            case PM_ExclusiveIndicatorWidth: return Metrics::CheckBox_Size;
Packit 8e9c33
            case PM_ExclusiveIndicatorHeight: return Metrics::CheckBox_Size;
Packit 8e9c33
Packit 8e9c33
            // list heaaders
Packit 8e9c33
            case PM_HeaderMarkSize: return Metrics::Header_ArrowSize;
Packit 8e9c33
            case PM_HeaderMargin: return Metrics::Header_MarginWidth;
Packit 8e9c33
Packit 8e9c33
            // dock widget
Packit 8e9c33
            // return 0 here, since frame is handled directly in polish
Packit 8e9c33
            case PM_DockWidgetFrameWidth: return 0;
Packit 8e9c33
            case PM_DockWidgetTitleMargin: return Metrics::Frame_FrameWidth;
Packit 8e9c33
            case PM_DockWidgetTitleBarButtonMargin: return Metrics::ToolButton_MarginWidth;
Packit 8e9c33
Packit 8e9c33
            case PM_SplitterWidth: return Metrics::Splitter_SplitterWidth;
Packit 8e9c33
            case PM_DockWidgetSeparatorExtent: return Metrics::Splitter_SplitterWidth;
Packit 8e9c33
Packit 8e9c33
            // fallback
Packit 8e9c33
            default: return ParentStyleClass::pixelMetric( metric, option, widget );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    int Style::styleHint( StyleHint hint, const QStyleOption* option, const QWidget* widget, QStyleHintReturn* returnData ) const
Packit 8e9c33
    {
Packit 8e9c33
        switch( hint )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            case SH_RubberBand_Mask:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                if( QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask*>( returnData ) )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    mask->region = option->rect;
Packit 8e9c33
Packit 8e9c33
                    /*
Packit 8e9c33
                     * need to check on widget before removing inner region
Packit 8e9c33
                     * in order to still preserve rubberband in MainWindow and QGraphicsView
Packit 8e9c33
                     * in QMainWindow because it looks better
Packit 8e9c33
                     * in QGraphicsView because the painting fails completely otherwise
Packit 8e9c33
                     */
Packit 8e9c33
                    if( widget && (
Packit 8e9c33
                        qobject_cast<const QAbstractItemView*>( widget->parent() ) ||
Packit 8e9c33
                        qobject_cast<const QGraphicsView*>( widget->parent() ) ||
Packit 8e9c33
                        qobject_cast<const QMainWindow*>( widget->parent() ) ) )
Packit 8e9c33
                    { return true; }
Packit 8e9c33
Packit 8e9c33
                    // also check if widget's parent is some itemView viewport
Packit 8e9c33
                    if( widget && widget->parent() &&
Packit 8e9c33
                        qobject_cast<const QAbstractItemView*>( widget->parent()->parent() ) &&
Packit 8e9c33
                        static_cast<const QAbstractItemView*>( widget->parent()->parent() )->viewport() == widget->parent() )
Packit 8e9c33
                    { return true; }
Packit 8e9c33
Packit 8e9c33
                    // mask out center
Packit 8e9c33
                    mask->region -= insideMargin( option->rect, 1 );
Packit 8e9c33
Packit 8e9c33
                    return true;
Packit 8e9c33
                }
Packit 8e9c33
                return false;
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case SH_ComboBox_ListMouseTracking: return true;
Packit 8e9c33
            case SH_MenuBar_MouseTracking: return true;
Packit 8e9c33
            case SH_Menu_MouseTracking: return true;
Packit 8e9c33
            case SH_Menu_SubMenuPopupDelay: return 150;
Packit 8e9c33
            case SH_Menu_SloppySubMenus: return true;
Packit 8e9c33
Packit 8e9c33
            #if QT_VERSION >= 0x050000
Packit 8e9c33
            case SH_Widget_Animate: return StyleConfigData::animationsEnabled();
Packit 8e9c33
            case SH_Menu_SupportsSections: return true;
Packit 8e9c33
            #endif
Packit 8e9c33
Packit 8e9c33
            case SH_DialogButtonBox_ButtonsHaveIcons: return false;
Packit 8e9c33
Packit 8e9c33
            case SH_GroupBox_TextLabelVerticalAlignment: return Qt::AlignVCenter;
Packit 8e9c33
            case SH_TabBar_Alignment: return StyleConfigData::tabBarDrawCenteredTabs() ? Qt::AlignCenter:Qt::AlignLeft;
Packit 8e9c33
            case SH_ToolBox_SelectedPageTitleBold: return false;
Packit 8e9c33
            case SH_ScrollBar_MiddleClickAbsolutePosition: return true;
Packit 8e9c33
            case SH_ScrollView_FrameOnlyAroundContents: return false;
Packit 8e9c33
            case SH_FormLayoutFormAlignment: return Qt::AlignLeft | Qt::AlignTop;
Packit 8e9c33
            case SH_FormLayoutLabelAlignment: return Qt::AlignRight;
Packit 8e9c33
            case SH_FormLayoutFieldGrowthPolicy: return QFormLayout::ExpandingFieldsGrow;
Packit 8e9c33
            case SH_FormLayoutWrapPolicy: return QFormLayout::DontWrapRows;
Packit 8e9c33
            case SH_MessageBox_TextInteractionFlags: return Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse;
Packit 8e9c33
            case SH_ProgressDialog_CenterCancelButton: return false;
Packit 8e9c33
            case SH_MessageBox_CenterButtons: return false;
Packit 8e9c33
Packit 8e9c33
            case SH_RequestSoftwareInputPanel: return RSIP_OnMouseClick;
Packit 8e9c33
            case SH_TitleBar_NoBorder: return true;
Packit 8e9c33
            case SH_DockWidget_ButtonsHaveFrame: return false;
Packit 8e9c33
            default: return ParentStyleClass::styleHint( hint, option, widget, returnData );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QRect Style::subElementRect( SubElement element, const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
        switch( element )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            case SE_PushButtonContents: return pushButtonContentsRect( option, widget );
Packit 8e9c33
            case SE_PushButtonFocusRect: return pushButtonFocusRect( option, widget );
Packit 8e9c33
            case SE_CheckBoxContents: return checkBoxContentsRect( option, widget );
Packit 8e9c33
            case SE_CheckBoxIndicator: return checkBoxIndicatorRect( option, widget );
Packit 8e9c33
            case SE_CheckBoxFocusRect: return checkBoxFocusRect( option, widget );
Packit 8e9c33
            case SE_RadioButtonContents: return checkBoxContentsRect( option, widget );
Packit 8e9c33
            case SE_RadioButtonIndicator: return checkBoxIndicatorRect( option, widget );
Packit 8e9c33
            case SE_RadioButtonFocusRect: return checkBoxFocusRect( option, widget );
Packit 8e9c33
            case SE_LineEditContents: return lineEditContentsRect( option, widget );
Packit 8e9c33
            case SE_ProgressBarGroove: return progressBarGrooveRect( option, widget );
Packit 8e9c33
            case SE_ProgressBarContents: return progressBarContentsRect( option, widget );
Packit 8e9c33
            case SE_ProgressBarLabel: return progressBarLabelRect( option, widget );
Packit 8e9c33
            case SE_HeaderArrow: return headerArrowRect( option, widget );
Packit 8e9c33
            case SE_HeaderLabel: return headerLabelRect( option, widget );
Packit 8e9c33
            case SE_SliderFocusRect: return sliderFocusRect( option, widget );
Packit 8e9c33
            case SE_TabBarTabLeftButton: return tabBarTabLeftButtonRect( option, widget );
Packit 8e9c33
            case SE_TabBarTabRightButton: return tabBarTabRightButtonRect( option, widget );
Packit 8e9c33
            case SE_TabWidgetTabBar: return tabWidgetTabBarRect( option, widget );
Packit 8e9c33
            case SE_TabWidgetTabContents: return tabWidgetTabContentsRect( option, widget );
Packit 8e9c33
            case SE_TabWidgetTabPane: return tabWidgetTabPaneRect( option, widget );
Packit 8e9c33
            case SE_TabWidgetLeftCorner: return tabWidgetCornerRect( SE_TabWidgetLeftCorner, option, widget );
Packit 8e9c33
            case SE_TabWidgetRightCorner: return tabWidgetCornerRect( SE_TabWidgetRightCorner, option, widget );
Packit 8e9c33
            case SE_ToolBoxTabContents: return toolBoxTabContentsRect( option, widget );
Packit 8e9c33
            // fallback
Packit 8e9c33
            default: return ParentStyleClass::subElementRect( element, option, widget );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QRect Style::subControlRect( ComplexControl element, const QStyleOptionComplex* option, SubControl subControl, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        switch( element )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            case CC_GroupBox: return groupBoxSubControlRect( option, subControl, widget );
Packit 8e9c33
            case CC_ToolButton: return toolButtonSubControlRect( option, subControl, widget );
Packit 8e9c33
            case CC_ComboBox: return comboBoxSubControlRect( option, subControl, widget );
Packit 8e9c33
            case CC_SpinBox: return spinBoxSubControlRect( option, subControl, widget );
Packit 8e9c33
            case CC_ScrollBar: return scrollBarSubControlRect( option, subControl, widget );
Packit 8e9c33
            case CC_Dial: return dialSubControlRect( option, subControl, widget );
Packit 8e9c33
            case CC_Slider: return sliderSubControlRect( option, subControl, widget );
Packit 8e9c33
Packit 8e9c33
            // fallback
Packit 8e9c33
            default: return ParentStyleClass::subControlRect( element, option, subControl, widget );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::sizeFromContents( ContentsType element, const QStyleOption* option, const QSize& size, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        switch( element )
Packit 8e9c33
        {
Packit 8e9c33
            case CT_CheckBox: return checkBoxSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_RadioButton: return checkBoxSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_LineEdit: return lineEditSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_ComboBox: return comboBoxSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_SpinBox: return spinBoxSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_Slider: return sliderSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_PushButton: return pushButtonSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_ToolButton: return toolButtonSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_MenuBar: return defaultSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_MenuBarItem: return menuBarItemSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_MenuItem: return menuItemSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_ProgressBar: return progressBarSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_TabWidget: return tabWidgetSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_TabBarTab: return tabBarTabSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_HeaderSection: return headerSectionSizeFromContents( option, size, widget );
Packit 8e9c33
            case CT_ItemViewItem: return itemViewItemSizeFromContents( option, size, widget );
Packit 8e9c33
Packit 8e9c33
            // fallback
Packit 8e9c33
            default: return ParentStyleClass::sizeFromContents( element, option, size, widget );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QStyle::SubControl Style::hitTestComplexControl( ComplexControl control, const QStyleOptionComplex* option, const QPoint& point, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
        switch( control )
Packit 8e9c33
        {
Packit 8e9c33
            case CC_ScrollBar:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                QRect grooveRect = subControlRect( CC_ScrollBar, option, SC_ScrollBarGroove, widget );
Packit 8e9c33
                if( grooveRect.contains( point ) )
Packit 8e9c33
                {
Packit 8e9c33
                    // Must be either page up/page down, or just click on the slider.
Packit 8e9c33
                    QRect sliderRect = subControlRect( CC_ScrollBar, option, SC_ScrollBarSlider, widget );
Packit 8e9c33
Packit 8e9c33
                    if( sliderRect.contains( point ) ) return SC_ScrollBarSlider;
Packit 8e9c33
                    else if( preceeds( point, sliderRect, option ) ) return SC_ScrollBarSubPage;
Packit 8e9c33
                    else return SC_ScrollBarAddPage;
Packit 8e9c33
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
                // This is one of the up/down buttons. First, decide which one it is.
Packit 8e9c33
                if( preceeds( point, grooveRect, option ) )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    if( _subLineButtons == DoubleButton )
Packit 8e9c33
                    {
Packit 8e9c33
Packit 8e9c33
                        QRect buttonRect = scrollBarInternalSubControlRect( option, SC_ScrollBarSubLine );
Packit 8e9c33
                        return scrollBarHitTest( buttonRect, point, option );
Packit 8e9c33
Packit 8e9c33
                    } else return SC_ScrollBarSubLine;
Packit 8e9c33
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
                if( _addLineButtons == DoubleButton )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    QRect buttonRect = scrollBarInternalSubControlRect( option, SC_ScrollBarAddLine );
Packit 8e9c33
                    return scrollBarHitTest( buttonRect, point, option );
Packit 8e9c33
Packit 8e9c33
                } else return SC_ScrollBarAddLine;
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            // fallback
Packit 8e9c33
            default: return ParentStyleClass::hitTestComplexControl( control, option, point, widget );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    void Style::drawPrimitive( PrimitiveElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        StylePrimitive fcn( nullptr );
Packit 8e9c33
        switch( element )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
            case PE_PanelButtonCommand: fcn = &Style::drawPanelButtonCommandPrimitive; break;
Packit 8e9c33
            case PE_PanelButtonTool: fcn = &Style::drawPanelButtonToolPrimitive; break;
Packit 8e9c33
            case PE_PanelScrollAreaCorner: fcn = &Style::drawPanelScrollAreaCornerPrimitive; break;
Packit 8e9c33
            case PE_PanelMenu: fcn = &Style::drawPanelMenuPrimitive; break;
Packit 8e9c33
            case PE_PanelTipLabel: fcn = &Style::drawPanelTipLabelPrimitive; break;
Packit 8e9c33
            case PE_PanelItemViewItem: fcn = &Style::drawPanelItemViewItemPrimitive; break;
Packit 8e9c33
            case PE_IndicatorCheckBox: fcn = &Style::drawIndicatorCheckBoxPrimitive; break;
Packit 8e9c33
            case PE_IndicatorRadioButton: fcn = &Style::drawIndicatorRadioButtonPrimitive; break;
Packit 8e9c33
            case PE_IndicatorButtonDropDown: fcn = &Style::drawIndicatorButtonDropDownPrimitive; break;
Packit 8e9c33
            case PE_IndicatorTabClose: fcn = &Style::drawIndicatorTabClosePrimitive; break;
Packit 8e9c33
            case PE_IndicatorTabTear: fcn = &Style::drawIndicatorTabTearPrimitive; break;
Packit 8e9c33
            case PE_IndicatorArrowUp: fcn = &Style::drawIndicatorArrowUpPrimitive; break;
Packit 8e9c33
            case PE_IndicatorArrowDown: fcn = &Style::drawIndicatorArrowDownPrimitive; break;
Packit 8e9c33
            case PE_IndicatorArrowLeft: fcn = &Style::drawIndicatorArrowLeftPrimitive; break;
Packit 8e9c33
            case PE_IndicatorArrowRight: fcn = &Style::drawIndicatorArrowRightPrimitive; break;
Packit 8e9c33
            case PE_IndicatorHeaderArrow: fcn = &Style::drawIndicatorHeaderArrowPrimitive; break;
Packit 8e9c33
            case PE_IndicatorToolBarHandle: fcn = &Style::drawIndicatorToolBarHandlePrimitive; break;
Packit 8e9c33
            case PE_IndicatorToolBarSeparator: fcn = &Style::drawIndicatorToolBarSeparatorPrimitive; break;
Packit 8e9c33
            case PE_IndicatorBranch: fcn = &Style::drawIndicatorBranchPrimitive; break;
Packit 8e9c33
            case PE_FrameStatusBar: fcn = &Style::emptyPrimitive; break;
Packit 8e9c33
            case PE_Frame: fcn = &Style::drawFramePrimitive; break;
Packit 8e9c33
            case PE_FrameLineEdit: fcn = &Style::drawFrameLineEditPrimitive; break;
Packit 8e9c33
            case PE_FrameMenu: fcn = &Style::drawFrameMenuPrimitive; break;
Packit 8e9c33
            case PE_FrameGroupBox: fcn = &Style::drawFrameGroupBoxPrimitive; break;
Packit 8e9c33
            case PE_FrameTabWidget: fcn = &Style::drawFrameTabWidgetPrimitive; break;
Packit 8e9c33
            case PE_FrameTabBarBase: fcn = &Style::drawFrameTabBarBasePrimitive; break;
Packit 8e9c33
            case PE_FrameWindow: fcn = &Style::drawFrameWindowPrimitive; break;
Packit 8e9c33
            case PE_FrameFocusRect: fcn = _frameFocusPrimitive; break;
Packit 8e9c33
            // fallback
Packit 8e9c33
            default: break;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        painter->save();
Packit 8e9c33
Packit 8e9c33
        // call function if implemented
Packit 8e9c33
        if( !( fcn && ( this->*fcn )( option, painter, widget ) ) )
Packit 8e9c33
        { ParentStyleClass::drawPrimitive( element, option, painter, widget ); }
Packit 8e9c33
Packit 8e9c33
        painter->restore();
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    void Style::drawControl( ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        StyleControl fcn( nullptr );
Packit 8e9c33
Packit 8e9c33
        #if ADWAITA_HAVE_KSTYLE||ADWAITA_USE_KDE4
Packit 8e9c33
        if( element == CE_CapacityBar )
Packit 8e9c33
        {
Packit 8e9c33
            fcn = &Style::drawProgressBarControl;
Packit 8e9c33
Packit 8e9c33
        } else
Packit 8e9c33
        #endif
Packit 8e9c33
Packit 8e9c33
        switch( element ) {
Packit 8e9c33
            case CE_PushButtonBevel: fcn = &Style::drawPanelButtonCommandPrimitive; break;
Packit 8e9c33
            case CE_PushButtonLabel: fcn = &Style::drawPushButtonLabelControl; break;
Packit 8e9c33
            case CE_CheckBoxLabel: fcn = &Style::drawCheckBoxLabelControl; break;
Packit 8e9c33
            case CE_RadioButtonLabel: fcn = &Style::drawCheckBoxLabelControl; break;
Packit 8e9c33
            case CE_ToolButtonLabel: fcn = &Style::drawToolButtonLabelControl; break;
Packit 8e9c33
            case CE_ComboBoxLabel: fcn = &Style::drawComboBoxLabelControl; break;
Packit 8e9c33
            case CE_MenuBarEmptyArea: fcn = &Style::drawMenuBarEmptyArea; break;
Packit 8e9c33
            case CE_MenuBarItem: fcn = &Style::drawMenuBarItemControl; break;
Packit 8e9c33
            case CE_MenuEmptyArea: fcn = &Style::drawMenuEmptyAreaControl; break;
Packit 8e9c33
            case CE_MenuItem: fcn = &Style::drawMenuItemControl; break;
Packit 8e9c33
            case CE_ToolBar: fcn = &Style::emptyControl; break;
Packit 8e9c33
            case CE_ProgressBar: fcn = &Style::drawProgressBarControl; break;
Packit 8e9c33
            case CE_ProgressBarContents: fcn = &Style::drawProgressBarContentsControl; break;
Packit 8e9c33
            case CE_ProgressBarGroove: fcn = &Style::drawProgressBarGrooveControl; break;
Packit 8e9c33
            case CE_ProgressBarLabel: fcn = &Style::drawProgressBarLabelControl; break;
Packit 8e9c33
            case CE_ScrollBarSlider: fcn = &Style::drawScrollBarSliderControl; break;
Packit 8e9c33
            case CE_ScrollBarAddLine: fcn = &Style::drawScrollBarAddLineControl; break;
Packit 8e9c33
            case CE_ScrollBarSubLine: fcn = &Style::drawScrollBarSubLineControl; break;
Packit 8e9c33
            case CE_ScrollBarAddPage: fcn = &Style::emptyControl; break;
Packit 8e9c33
            case CE_ScrollBarSubPage: fcn = &Style::emptyControl; break;
Packit 8e9c33
            case CE_ShapedFrame: fcn = &Style::drawShapedFrameControl; break;
Packit 8e9c33
            case CE_RubberBand: fcn = &Style::drawRubberBandControl; break;
Packit 8e9c33
            case CE_SizeGrip: fcn = &Style::emptyControl; break;
Packit 8e9c33
            case CE_HeaderSection: fcn = &Style::drawHeaderSectionControl; break;
Packit 8e9c33
            case CE_HeaderLabel: fcn = &Style::drawHeaderLabelControl; break;
Packit 8e9c33
            case CE_HeaderEmptyArea: fcn = &Style::drawHeaderEmptyAreaControl; break;
Packit 8e9c33
            case CE_TabBarTabLabel: fcn = &Style::drawTabBarTabLabelControl; break;
Packit 8e9c33
            case CE_TabBarTabShape: fcn = &Style::drawTabBarTabShapeControl; break;
Packit 8e9c33
            case CE_ToolBoxTabLabel: fcn = &Style::drawToolBoxTabLabelControl; break;
Packit 8e9c33
            case CE_ToolBoxTabShape: fcn = &Style::drawToolBoxTabShapeControl; break;
Packit 8e9c33
            case CE_DockWidgetTitle: fcn = &Style::drawDockWidgetTitleControl; break;
Packit 8e9c33
            // fallback
Packit 8e9c33
            default: break;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        painter->save();
Packit 8e9c33
Packit 8e9c33
        // call function if implemented
Packit 8e9c33
        if( !( fcn && ( this->*fcn )( option, painter, widget ) ) )
Packit 8e9c33
        { ParentStyleClass::drawControl( element, option, painter, widget ); }
Packit 8e9c33
Packit 8e9c33
        painter->restore();
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    void Style::drawComplexControl( ComplexControl element, const QStyleOptionComplex* option, QPainter* painter, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        StyleComplexControl fcn( nullptr );
Packit 8e9c33
        switch( element )
Packit 8e9c33
        {
Packit 8e9c33
            case CC_GroupBox: fcn = &Style::drawGroupBoxComplexControl; break;
Packit 8e9c33
            case CC_ToolButton: fcn = &Style::drawToolButtonComplexControl; break;
Packit 8e9c33
            case CC_ComboBox: fcn = &Style::drawComboBoxComplexControl; break;
Packit 8e9c33
            case CC_SpinBox: fcn = &Style::drawSpinBoxComplexControl; break;
Packit 8e9c33
            case CC_Slider: fcn = &Style::drawSliderComplexControl; break;
Packit 8e9c33
            case CC_Dial: fcn = &Style::drawDialComplexControl; break;
Packit 8e9c33
            case CC_ScrollBar: fcn = &Style::drawScrollBarComplexControl; break;
Packit 8e9c33
            case CC_TitleBar: fcn = &Style::drawTitleBarComplexControl; break;
Packit 8e9c33
Packit 8e9c33
            // fallback
Packit 8e9c33
            default: break;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
        painter->save();
Packit 8e9c33
Packit 8e9c33
        // call function if implemented
Packit 8e9c33
        if( !( fcn && ( this->*fcn )( option, painter, widget ) ) )
Packit 8e9c33
        { ParentStyleClass::drawComplexControl( element, option, painter, widget ); }
Packit 8e9c33
Packit 8e9c33
        painter->restore();
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________
Packit 8e9c33
    void Style::drawItemText(
Packit 8e9c33
        QPainter* painter, const QRect& rect, int flags, const QPalette& palette, bool enabled,
Packit 8e9c33
        const QString &text, QPalette::ColorRole textRole ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // hide mnemonics if requested
Packit 8e9c33
        if( !_mnemonics->enabled() && ( flags&Qt::TextShowMnemonic ) && !( flags&Qt::TextHideMnemonic ) )
Packit 8e9c33
        {
Packit 8e9c33
            flags &= ~Qt::TextShowMnemonic;
Packit 8e9c33
            flags |= Qt::TextHideMnemonic;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // make sure vertical alignment is defined
Packit 8e9c33
        // fallback on Align::VCenter if not
Packit 8e9c33
        if( !(flags&Qt::AlignVertical_Mask) ) flags |= Qt::AlignVCenter;
Packit 8e9c33
Packit 8e9c33
        if( _animations->widgetEnabilityEngine().enabled() )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            /*
Packit 8e9c33
             * check if painter engine is registered to WidgetEnabilityEngine, and animated
Packit 8e9c33
             * if yes, merge the palettes. Note: a static_cast is safe here, since only the address
Packit 8e9c33
             * of the pointer is used, not the actual content.
Packit 8e9c33
             */
Packit 8e9c33
            const QWidget* widget( static_cast<const QWidget*>( painter->device() ) );
Packit 8e9c33
            if( _animations->widgetEnabilityEngine().isAnimated( widget, AnimationEnable ) )
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                QPalette copy( _helper->disabledPalette( palette, _animations->widgetEnabilityEngine().opacity( widget, AnimationEnable ) ) );
Packit 8e9c33
                return ParentStyleClass::drawItemText( painter, rect, flags, copy, enabled, text, textRole );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // fallback
Packit 8e9c33
        return ParentStyleClass::drawItemText( painter, rect, flags, palette, enabled, text, textRole );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_____________________________________________________________________
Packit 8e9c33
    bool Style::eventFilter( QObject *object, QEvent *event )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        if( QDockWidget* dockWidget = qobject_cast<QDockWidget*>( object ) ) { return eventFilterDockWidget( dockWidget, event ); }
Packit 8e9c33
        else if( QMdiSubWindow* subWindow = qobject_cast<QMdiSubWindow*>( object ) ) { return eventFilterMdiSubWindow( subWindow, event ); }
Packit 8e9c33
        #if QT_VERSION >= 0x050000
Packit 8e9c33
        else if( QCommandLinkButton* commandLinkButton = qobject_cast<QCommandLinkButton*>( object ) ) { return eventFilterCommandLinkButton( commandLinkButton, event ); }
Packit 8e9c33
        #endif
Packit 8e9c33
        // cast to QWidget
Packit 8e9c33
        QWidget *widget = static_cast<QWidget*>( object );
Packit 8e9c33
        if( widget->inherits( "QAbstractScrollArea" ) || widget->inherits( "KTextEditor::View" ) ) { return eventFilterScrollArea( widget, event ); }
Packit 8e9c33
        else if( widget->inherits( "QComboBoxPrivateContainer" ) ) { return eventFilterComboBoxContainer( widget, event ); }
Packit 8e9c33
Packit 8e9c33
        if ((!widget->parent() || !qobject_cast<QWidget *>(widget->parent())) &&
Packit 8e9c33
                (QEvent::Show==event->type() || QEvent::StyleChange==event->type())) {
Packit 8e9c33
            _helper->setVariant(widget, _dark ? "dark" : "light");
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // fallback
Packit 8e9c33
        return ParentStyleClass::eventFilter( object, event );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________________
Packit 8e9c33
    bool Style::eventFilterScrollArea( QWidget* widget, QEvent* event )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        switch( event->type() )
Packit 8e9c33
        {
Packit 8e9c33
            case QEvent::Paint:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                // get scrollarea viewport
Packit 8e9c33
                QAbstractScrollArea* scrollArea( qobject_cast<QAbstractScrollArea*>( widget ) );
Packit 8e9c33
                QWidget* viewport;
Packit 8e9c33
                if( !( scrollArea && (viewport = scrollArea->viewport()) ) ) break;
Packit 8e9c33
Packit 8e9c33
                // get scrollarea horizontal and vertical containers
Packit 8e9c33
                QWidget* child( nullptr );
Packit 8e9c33
                QList<QWidget*> children;
Packit 8e9c33
                if( ( child = scrollArea->findChild<QWidget*>( "qt_scrollarea_vcontainer" ) ) && child->isVisible() )
Packit 8e9c33
                { children.append( child ); }
Packit 8e9c33
Packit 8e9c33
                if( ( child = scrollArea->findChild<QWidget*>( "qt_scrollarea_hcontainer" ) ) && child->isVisible() )
Packit 8e9c33
                { children.append( child ); }
Packit 8e9c33
Packit 8e9c33
                if( children.empty() ) break;
Packit 8e9c33
                if( !scrollArea->styleSheet().isEmpty() ) break;
Packit 8e9c33
Packit 8e9c33
                // make sure proper background is rendered behind the containers
Packit 8e9c33
                QPainter painter( scrollArea );
Packit 8e9c33
                painter.setClipRegion( static_cast<QPaintEvent*>( event )->region() );
Packit 8e9c33
Packit 8e9c33
                painter.setPen( Qt::NoPen );
Packit 8e9c33
Packit 8e9c33
                // decide background color
Packit 8e9c33
                const QPalette::ColorRole role( viewport->backgroundRole() );
Packit 8e9c33
                QColor background;
Packit 8e9c33
                if( role == QPalette::Window && hasAlteredBackground( viewport ) ) background = _helper->frameBackgroundColor( viewport->palette() );
Packit 8e9c33
                else background = viewport->palette().color( role );
Packit 8e9c33
                painter.setBrush( background );
Packit 8e9c33
Packit 8e9c33
                // render
Packit 8e9c33
                foreach( auto* child, children )
Packit 8e9c33
                { painter.drawRect( child->geometry() ); }
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QEvent::MouseButtonPress:
Packit 8e9c33
            case QEvent::MouseButtonRelease:
Packit 8e9c33
            case QEvent::MouseMove:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                // case event
Packit 8e9c33
                QMouseEvent* mouseEvent( static_cast<QMouseEvent*>( event ) );
Packit 8e9c33
Packit 8e9c33
                // get frame framewidth
Packit 8e9c33
                int frameWidth( pixelMetric( PM_DefaultFrameWidth, 0, widget ) );
Packit 8e9c33
Packit 8e9c33
                // find list of scrollbars
Packit 8e9c33
                QList<QScrollBar*> scrollBars;
Packit 8e9c33
                if( QAbstractScrollArea* scrollArea = qobject_cast<QAbstractScrollArea*>( widget ) )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    if( scrollArea->horizontalScrollBarPolicy() != Qt::ScrollBarAlwaysOff ) scrollBars.append( scrollArea->horizontalScrollBar() );
Packit 8e9c33
                    if( scrollArea->verticalScrollBarPolicy() != Qt::ScrollBarAlwaysOff )scrollBars.append( scrollArea->verticalScrollBar() );
Packit 8e9c33
Packit 8e9c33
                } else if( widget->inherits( "KTextEditor::View" ) ) {
Packit 8e9c33
Packit 8e9c33
                    scrollBars = widget->findChildren<QScrollBar*>();
Packit 8e9c33
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
                // loop over found scrollbars
Packit 8e9c33
                foreach( QScrollBar* scrollBar, scrollBars )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    if( !( scrollBar && scrollBar->isVisible() ) ) continue;
Packit 8e9c33
Packit 8e9c33
                    QPoint offset;
Packit 8e9c33
                    if( scrollBar->orientation() == Qt::Horizontal ) offset = QPoint( 0, frameWidth );
Packit 8e9c33
                    else offset = QPoint( QApplication::isLeftToRight() ? frameWidth : -frameWidth, 0 );
Packit 8e9c33
Packit 8e9c33
                    // map position to scrollarea
Packit 8e9c33
                    QPoint position( scrollBar->mapFrom( widget, mouseEvent->pos() - offset ) );
Packit 8e9c33
Packit 8e9c33
                    // check if contains
Packit 8e9c33
                    if( !scrollBar->rect().contains( position ) ) continue;
Packit 8e9c33
Packit 8e9c33
                    // copy event, send and return
Packit 8e9c33
                    QMouseEvent copy(
Packit 8e9c33
                        mouseEvent->type(),
Packit 8e9c33
                        position,
Packit 8e9c33
                        scrollBar->mapToGlobal( position ),
Packit 8e9c33
                        mouseEvent->button(),
Packit 8e9c33
                        mouseEvent->buttons(), mouseEvent->modifiers());
Packit 8e9c33
Packit 8e9c33
                    QCoreApplication::sendEvent( scrollBar, &copy );
Packit 8e9c33
                    event->setAccepted( true );
Packit 8e9c33
                    return true;
Packit 8e9c33
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
                break;
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            default: break;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return  ParentStyleClass::eventFilter( widget, event );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_________________________________________________________
Packit 8e9c33
    bool Style::eventFilterComboBoxContainer( QWidget* widget, QEvent* event )
Packit 8e9c33
    {
Packit 8e9c33
        if( event->type() == QEvent::Paint )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            QPainter painter( widget );
Packit 8e9c33
            QPaintEvent *paintEvent = static_cast<QPaintEvent*>( event );
Packit 8e9c33
            painter.setClipRegion( paintEvent->region() );
Packit 8e9c33
Packit 8e9c33
            QRect rect( widget->rect() );
Packit 8e9c33
            const QPalette& palette( widget->palette() );
Packit 8e9c33
            QColor background( _helper->frameBackgroundColor( palette ) );
Packit 8e9c33
            QColor outline( _helper->frameOutlineColor( palette ) );
Packit 8e9c33
Packit 8e9c33
            bool hasAlpha( _helper->hasAlphaChannel( widget ) );
Packit 8e9c33
            if( hasAlpha )
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                painter.setCompositionMode( QPainter::CompositionMode_Source );
Packit 8e9c33
                _helper->renderMenuFrame( &painter, rect, background, outline, true );
Packit 8e9c33
Packit 8e9c33
            } else {
Packit 8e9c33
Packit 8e9c33
                _helper->renderMenuFrame( &painter, rect, background, outline, false );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return false;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________________
Packit 8e9c33
    bool Style::eventFilterDockWidget( QDockWidget* dockWidget, QEvent* event )
Packit 8e9c33
    {
Packit 8e9c33
        if( event->type() == QEvent::Paint )
Packit 8e9c33
        {
Packit 8e9c33
            // create painter and clip
Packit 8e9c33
            QPainter painter( dockWidget );
Packit 8e9c33
            QPaintEvent *paintEvent = static_cast<QPaintEvent*>( event );
Packit 8e9c33
            painter.setClipRegion( paintEvent->region() );
Packit 8e9c33
Packit 8e9c33
            // store palette and set colors
Packit 8e9c33
            const QPalette& palette( dockWidget->palette() );
Packit 8e9c33
            QColor background( _helper->frameBackgroundColor( palette ) );
Packit 8e9c33
            QColor outline( _helper->frameOutlineColor( palette ) );
Packit 8e9c33
Packit 8e9c33
            // store rect
Packit 8e9c33
            QRect rect( dockWidget->rect() );
Packit 8e9c33
Packit 8e9c33
            // render
Packit 8e9c33
            if( dockWidget->isFloating() )
Packit 8e9c33
            {
Packit 8e9c33
                _helper->renderMenuFrame( &painter, rect, background, outline, false );
Packit 8e9c33
Packit 8e9c33
            } else if( StyleConfigData::dockWidgetDrawFrame() || (dockWidget->features()&QDockWidget::AllDockWidgetFeatures) ) {
Packit 8e9c33
Packit 8e9c33
                _helper->renderFrame( &painter, rect, background, outline );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return false;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________________
Packit 8e9c33
    bool Style::eventFilterMdiSubWindow( QMdiSubWindow* subWindow, QEvent* event )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        if( event->type() == QEvent::Paint )
Packit 8e9c33
        {
Packit 8e9c33
            QPainter painter( subWindow );
Packit 8e9c33
            QPaintEvent* paintEvent( static_cast<QPaintEvent*>( event ) );
Packit 8e9c33
            painter.setClipRegion( paintEvent->region() );
Packit 8e9c33
Packit 8e9c33
            QRect rect( subWindow->rect() );
Packit 8e9c33
            QColor background( subWindow->palette().color( QPalette::Window ) );
Packit 8e9c33
Packit 8e9c33
            if( subWindow->isMaximized() )
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                // full painting
Packit 8e9c33
                painter.setPen( Qt::NoPen );
Packit 8e9c33
                painter.setBrush( background );
Packit 8e9c33
                painter.drawRect( rect );
Packit 8e9c33
Packit 8e9c33
            } else {
Packit 8e9c33
Packit 8e9c33
                // framed painting
Packit 8e9c33
                _helper->renderMenuFrame( &painter, rect, background, QColor() );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // continue with normal painting
Packit 8e9c33
        return false;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________________
Packit 8e9c33
    #if QT_VERSION >= 0x050000
Packit 8e9c33
    bool Style::eventFilterCommandLinkButton( QCommandLinkButton* button, QEvent* event )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        if( event->type() == QEvent::Paint )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            // painter
Packit 8e9c33
            QPainter painter( button );
Packit 8e9c33
            painter.setClipRegion( static_cast<QPaintEvent*>( event )->region() );
Packit 8e9c33
Packit 8e9c33
            bool isFlat = false;
Packit 8e9c33
Packit 8e9c33
            // option
Packit 8e9c33
            QStyleOptionButton option;
Packit 8e9c33
            option.initFrom( button );
Packit 8e9c33
            option.features |= QStyleOptionButton::CommandLinkButton;
Packit 8e9c33
            if( isFlat ) option.features |= QStyleOptionButton::Flat;
Packit 8e9c33
            option.text = QString();
Packit 8e9c33
            option.icon = QIcon();
Packit 8e9c33
Packit 8e9c33
            if( button->isChecked() ) option.state|=State_On;
Packit 8e9c33
            if( button->isDown() ) option.state|=State_Sunken;
Packit 8e9c33
Packit 8e9c33
            // frame
Packit 8e9c33
            drawControl(QStyle::CE_PushButton, &option, &painter, button );
Packit 8e9c33
Packit 8e9c33
            // offset
Packit 8e9c33
            int margin( Metrics::Button_MarginWidth + Metrics::Frame_FrameWidth );
Packit 8e9c33
            QPoint offset( margin, margin );
Packit 8e9c33
Packit 8e9c33
            if( button->isDown() && !isFlat ) painter.translate( 1, 1 );
Packit 8e9c33
            { offset += QPoint( 1, 1 ); }
Packit 8e9c33
Packit 8e9c33
            // state
Packit 8e9c33
            const State& state( option.state );
Packit 8e9c33
            bool enabled( state & State_Enabled );
Packit 8e9c33
            bool mouseOver( (state & State_Active) && enabled && ( state & State_MouseOver ) );
Packit 8e9c33
            bool hasFocus( enabled && ( state & State_HasFocus ) );
Packit 8e9c33
Packit 8e9c33
            // icon
Packit 8e9c33
            if( !button->icon().isNull() )
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                QSize pixmapSize( button->icon().actualSize( button->iconSize() ) );
Packit 8e9c33
                QRect pixmapRect( QPoint( offset.x(), button->description().isEmpty() ? (button->height() - pixmapSize.height())/2:offset.y() ), pixmapSize );
Packit 8e9c33
                const QPixmap pixmap( button->icon().pixmap(pixmapSize,
Packit 8e9c33
                    enabled ? QIcon::Normal : QIcon::Disabled,
Packit 8e9c33
                    button->isChecked() ? QIcon::On : QIcon::Off) );
Packit 8e9c33
                drawItemPixmap( &painter, pixmapRect, Qt::AlignCenter, pixmap );
Packit 8e9c33
Packit 8e9c33
                offset.rx() += pixmapSize.width() + Metrics::Button_ItemSpacing;
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            // text rect
Packit 8e9c33
            QRect textRect( offset, QSize( button->size().width() - offset.x() - margin, button->size().height() - 2*margin ) );
Packit 8e9c33
            const QPalette::ColorRole textRole = (enabled && hasFocus && !mouseOver && !isFlat ) ? QPalette::HighlightedText : QPalette::ButtonText;
Packit 8e9c33
            if( !button->text().isEmpty() )
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                QFont font( button->font() );
Packit 8e9c33
                font.setBold( true );
Packit 8e9c33
                painter.setFont( font );
Packit 8e9c33
                if( button->description().isEmpty() )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    drawItemText( &painter, textRect, Qt::AlignLeft|Qt::AlignVCenter|Qt::TextHideMnemonic, button->palette(), enabled, button->text(), textRole );
Packit 8e9c33
Packit 8e9c33
                } else {
Packit 8e9c33
Packit 8e9c33
                    drawItemText( &painter, textRect, Qt::AlignLeft|Qt::AlignTop|Qt::TextHideMnemonic, button->palette(), enabled, button->text(), textRole );
Packit 8e9c33
                    textRect.setTop( textRect.top() + QFontMetrics( font ).height() );
Packit 8e9c33
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
                painter.setFont( button->font() );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            if( !button->description().isEmpty() )
Packit 8e9c33
            { drawItemText( &painter, textRect, Qt::AlignLeft|Qt::AlignVCenter|Qt::TextWordWrap, button->palette(), enabled, button->description(), textRole ); }
Packit 8e9c33
Packit 8e9c33
            return true;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // continue with normal painting
Packit 8e9c33
        return false;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
    #endif
Packit 8e9c33
Packit 8e9c33
    //_____________________________________________________________________
Packit 8e9c33
    void Style::configurationChanged( void )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // reload
Packit 8e9c33
        StyleConfigData::self();
Packit 8e9c33
Packit 8e9c33
        // reload configuration
Packit 8e9c33
        loadConfiguration();
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________
Packit 8e9c33
    QIcon Style::standardIconImplementation( StandardPixmap standardPixmap, const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // lookup cache
Packit 8e9c33
        if( _iconCache.contains( standardPixmap ) ) return _iconCache.value( standardPixmap );
Packit 8e9c33
Packit 8e9c33
        QIcon icon;
Packit 8e9c33
        switch( standardPixmap )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            case SP_TitleBarNormalButton:
Packit 8e9c33
            case SP_TitleBarMinButton:
Packit 8e9c33
            case SP_TitleBarMaxButton:
Packit 8e9c33
            case SP_TitleBarCloseButton:
Packit 8e9c33
            case SP_DockWidgetCloseButton:
Packit 8e9c33
            icon = titleBarButtonIcon( standardPixmap, option, widget );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case SP_ToolBarHorizontalExtensionButton:
Packit 8e9c33
            case SP_ToolBarVerticalExtensionButton:
Packit 8e9c33
            icon = toolBarExtensionIcon( standardPixmap, option, widget );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            default:
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        if( icon.isNull() )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            // do not cache parent style icon, since it may change at runtime
Packit 8e9c33
            #if QT_VERSION >= 0x050000
Packit 8e9c33
            return  ParentStyleClass::standardIcon( standardPixmap, option, widget );
Packit 8e9c33
            #else
Packit 8e9c33
            return  ParentStyleClass::standardIconImplementation( standardPixmap, option, widget );
Packit 8e9c33
            #endif
Packit 8e9c33
Packit 8e9c33
        } else {
Packit 8e9c33
            const_cast<IconCache*>(&_iconCache)->insert( standardPixmap, icon );
Packit 8e9c33
            return icon;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_____________________________________________________________________
Packit 8e9c33
    void Style::loadConfiguration()
Packit 8e9c33
    {
Packit 8e9c33
        // reinitialize engines
Packit 8e9c33
        _animations->setupEngines();
Packit 8e9c33
        _windowManager->initialize();
Packit 8e9c33
Packit 8e9c33
        // mnemonics
Packit 8e9c33
        _mnemonics->setMode( StyleConfigData::mnemonicsMode() );
Packit 8e9c33
Packit 8e9c33
        // splitter proxy
Packit 8e9c33
        _splitterFactory->setEnabled( StyleConfigData::splitterProxyEnabled() );
Packit 8e9c33
Packit 8e9c33
        // clear icon cache
Packit 8e9c33
        _iconCache.clear();
Packit 8e9c33
Packit 8e9c33
        // scrollbar buttons
Packit 8e9c33
        switch( StyleConfigData::scrollBarAddLineButtons() )
Packit 8e9c33
        {
Packit 8e9c33
            case 0: _addLineButtons = NoButton; break;
Packit 8e9c33
            case 1: _addLineButtons = SingleButton; break;
Packit 8e9c33
Packit 8e9c33
            default:
Packit 8e9c33
            case 2: _addLineButtons = DoubleButton; break;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        switch( StyleConfigData::scrollBarSubLineButtons() )
Packit 8e9c33
        {
Packit 8e9c33
            case 0: _subLineButtons = NoButton; break;
Packit 8e9c33
            case 1: _subLineButtons = SingleButton; break;
Packit 8e9c33
Packit 8e9c33
            default:
Packit 8e9c33
            case 2: _subLineButtons = DoubleButton; break;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // frame focus
Packit 8e9c33
        if( StyleConfigData::viewDrawFocusIndicator() ) _frameFocusPrimitive = &Style::drawFrameFocusRectPrimitive;
Packit 8e9c33
        else _frameFocusPrimitive = &Style::emptyPrimitive;
Packit 8e9c33
Packit 8e9c33
        // widget explorer
Packit 8e9c33
        _widgetExplorer->setEnabled( StyleConfigData::widgetExplorerEnabled() );
Packit 8e9c33
        _widgetExplorer->setDrawWidgetRects( StyleConfigData::drawWidgetRects() );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::pushButtonContentsRect( const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    { return insideMargin( option->rect, Metrics::Frame_FrameWidth ); }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::pushButtonFocusRect(const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    { return insideMargin( option->rect, 3 ); }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::checkBoxContentsRect( const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    { return visualRect( option, option->rect.adjusted( Metrics::CheckBox_Size + 2 * Metrics::CheckBox_ItemSpacing, 0, 0, 0 ) ); }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::checkBoxIndicatorRect(const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    { return ParentStyleClass::subElementRect( SE_CheckBoxIndicator, option, widget ).translated( Metrics::CheckBox_ItemSpacing, 0 ); }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::checkBoxFocusRect(const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
        return QRect( option->rect.left() + 2,
Packit 8e9c33
                      option->rect.top() + 1,
Packit 8e9c33
                      ParentStyleClass::subElementRect( SE_CheckBoxFocusRect, option, widget ).right() - option->rect.left(),
Packit 8e9c33
                      option->rect.height() - 2
Packit 8e9c33
                    );
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::lineEditContentsRect( const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionFrame* frameOption( qstyleoption_cast<const QStyleOptionFrame*>( option ) );
Packit 8e9c33
        if( !frameOption ) return option->rect;
Packit 8e9c33
Packit 8e9c33
        // check flatness
Packit 8e9c33
        bool flat( frameOption->lineWidth == 0 );
Packit 8e9c33
        if( flat ) return option->rect;
Packit 8e9c33
Packit 8e9c33
        // copy rect and take out margins
Packit 8e9c33
        QRect rect( option->rect );
Packit 8e9c33
Packit 8e9c33
        // take out margins if there is enough room
Packit 8e9c33
        int frameWidth( pixelMetric( PM_DefaultFrameWidth, option, widget ) );
Packit 8e9c33
        if( rect.height() >= option->fontMetrics.height() + 2*frameWidth ) return insideMargin( rect, frameWidth );
Packit 8e9c33
        else return rect;
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::progressBarGrooveRect( const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionProgressBar* progressBarOption( qstyleoption_cast<const QStyleOptionProgressBar*>( option ) );
Packit 8e9c33
        if( !progressBarOption ) return option->rect;
Packit 8e9c33
Packit 8e9c33
        // get flags and orientation
Packit 8e9c33
        bool textVisible( progressBarOption->textVisible );
Packit 8e9c33
        bool busy( progressBarOption->minimum == 0 && progressBarOption->maximum == 0 );
Packit 8e9c33
Packit 8e9c33
        const QStyleOptionProgressBarV2* progressBarOption2( qstyleoption_cast<const QStyleOptionProgressBarV2*>( option ) );
Packit 8e9c33
        bool horizontal( !progressBarOption2 || progressBarOption2->orientation == Qt::Horizontal );
Packit 8e9c33
Packit 8e9c33
        // copy rectangle and adjust
Packit 8e9c33
        QRect rect( option->rect );
Packit 8e9c33
        int frameWidth( pixelMetric( PM_DefaultFrameWidth, option, widget ) );
Packit 8e9c33
        if( horizontal ) rect = insideMargin( rect, frameWidth, 0 );
Packit 8e9c33
        else rect = insideMargin( rect, 0, frameWidth );
Packit 8e9c33
Packit 8e9c33
        if( textVisible && !busy && horizontal )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            QRect textRect( subElementRect( SE_ProgressBarLabel, option, widget ) );
Packit 8e9c33
            textRect = visualRect( option, textRect );
Packit 8e9c33
            rect.setRight( textRect.left() - Metrics::ProgressBar_ItemSpacing - 1 );
Packit 8e9c33
            rect = visualRect( option, rect );
Packit 8e9c33
            rect = centerRect( rect, rect.width(), Metrics::ProgressBar_Thickness );
Packit 8e9c33
Packit 8e9c33
        } else if( horizontal ) {
Packit 8e9c33
Packit 8e9c33
            rect = centerRect( rect, rect.width(), Metrics::ProgressBar_Thickness );
Packit 8e9c33
Packit 8e9c33
        } else {
Packit 8e9c33
Packit 8e9c33
            rect = centerRect( rect, Metrics::ProgressBar_Thickness, rect.height() );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return rect;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::progressBarContentsRect( const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionProgressBar* progressBarOption( qstyleoption_cast<const QStyleOptionProgressBar*>( option ) );
Packit 8e9c33
        if( !progressBarOption ) return QRect();
Packit 8e9c33
Packit 8e9c33
        // get groove rect
Packit 8e9c33
        QRect rect( progressBarGrooveRect( option, widget ) );
Packit 8e9c33
Packit 8e9c33
        // in busy mode, grooveRect is used
Packit 8e9c33
        bool busy( progressBarOption->minimum == 0 && progressBarOption->maximum == 0 );
Packit 8e9c33
        if( busy ) return rect;
Packit 8e9c33
Packit 8e9c33
        // get orientation
Packit 8e9c33
        const QStyleOptionProgressBarV2* progressBarOption2( qstyleoption_cast<const QStyleOptionProgressBarV2*>( option ) );
Packit 8e9c33
        bool horizontal( !progressBarOption2 || progressBarOption2->orientation == Qt::Horizontal );
Packit 8e9c33
Packit 8e9c33
        // check inverted appearance
Packit 8e9c33
        bool inverted( progressBarOption2 ? progressBarOption2->invertedAppearance : false );
Packit 8e9c33
Packit 8e9c33
        // get progress and steps
Packit 8e9c33
        qreal progress( progressBarOption->progress - progressBarOption->minimum );
Packit 8e9c33
        int steps( qMax( progressBarOption->maximum  - progressBarOption->minimum, 1 ) );
Packit 8e9c33
Packit 8e9c33
        //Calculate width fraction
Packit 8e9c33
        qreal widthFrac = qMin( qreal(1), progress/steps );
Packit 8e9c33
Packit 8e9c33
        // convert the pixel width
Packit 8e9c33
        int indicatorSize( widthFrac*( horizontal ? rect.width():rect.height() ) );
Packit 8e9c33
Packit 8e9c33
        QRect indicatorRect;
Packit 8e9c33
        if( horizontal )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            indicatorRect = QRect( inverted ? ( rect.right() - indicatorSize + 1):rect.left(), rect.y(), indicatorSize, rect.height() );
Packit 8e9c33
            indicatorRect = visualRect( option->direction, rect, indicatorRect );
Packit 8e9c33
Packit 8e9c33
        } else indicatorRect = QRect( rect.x(), inverted ? rect.top() : (rect.bottom() - indicatorSize + 1), rect.width(), indicatorSize );
Packit 8e9c33
Packit 8e9c33
        return indicatorRect;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::progressBarLabelRect( const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionProgressBar* progressBarOption( qstyleoption_cast<const QStyleOptionProgressBar*>( option ) );
Packit 8e9c33
        if( !progressBarOption ) return QRect();
Packit 8e9c33
Packit 8e9c33
        // get flags and check
Packit 8e9c33
        bool textVisible( progressBarOption->textVisible );
Packit 8e9c33
        bool busy( progressBarOption->minimum == 0 && progressBarOption->maximum == 0 );
Packit 8e9c33
        if( !textVisible || busy ) return QRect();
Packit 8e9c33
Packit 8e9c33
        // get direction and check
Packit 8e9c33
        const QStyleOptionProgressBarV2* progressBarOption2( qstyleoption_cast<const QStyleOptionProgressBarV2*>( option ) );
Packit 8e9c33
        bool horizontal( !progressBarOption2 || progressBarOption2->orientation == Qt::Horizontal );
Packit 8e9c33
        if( !horizontal ) return QRect();
Packit 8e9c33
Packit 8e9c33
        int textWidth = qMax(
Packit 8e9c33
            option->fontMetrics.size( _mnemonics->textFlags(), progressBarOption->text ).width(),
Packit 8e9c33
            option->fontMetrics.size( _mnemonics->textFlags(), QStringLiteral( "100%" ) ).width() );
Packit 8e9c33
Packit 8e9c33
        QRect rect( insideMargin( option->rect, Metrics::Frame_FrameWidth, 0 ) );
Packit 8e9c33
        rect.setLeft( rect.right() - textWidth + 1 );
Packit 8e9c33
        rect = visualRect( option, rect );
Packit 8e9c33
Packit 8e9c33
        return rect;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::headerArrowRect( const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionHeader* headerOption( qstyleoption_cast<const QStyleOptionHeader*>( option ) );
Packit 8e9c33
        if( !headerOption ) return option->rect;
Packit 8e9c33
Packit 8e9c33
        // check if arrow is necessary
Packit 8e9c33
        if( headerOption->sortIndicator == QStyleOptionHeader::None ) return QRect();
Packit 8e9c33
Packit 8e9c33
        QRect arrowRect( insideMargin( option->rect, Metrics::Header_MarginWidth ) );
Packit 8e9c33
        arrowRect.setLeft( arrowRect.right() - Metrics::Header_ArrowSize + 1 );
Packit 8e9c33
Packit 8e9c33
        return visualRect( option, arrowRect );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::headerLabelRect( const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionHeader* headerOption( qstyleoption_cast<const QStyleOptionHeader*>( option ) );
Packit 8e9c33
        if( !headerOption ) return option->rect;
Packit 8e9c33
Packit 8e9c33
        // check if arrow is necessary
Packit 8e9c33
        // QRect labelRect( insideMargin( option->rect, Metrics::Header_MarginWidth ) );
Packit 8e9c33
        QRect labelRect( insideMargin( option->rect, Metrics::Header_MarginWidth, 0 ) );
Packit 8e9c33
        if( headerOption->sortIndicator == QStyleOptionHeader::None ) return labelRect;
Packit 8e9c33
Packit 8e9c33
        labelRect.adjust( 0, 0, -Metrics::Header_ArrowSize-Metrics::Header_ItemSpacing, 0 );
Packit 8e9c33
        return visualRect( option, labelRect );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::sliderFocusRect(const QStyleOption *option, const QWidget *widget) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        const QStyleOptionSlider* sliderOption( qstyleoption_cast<const QStyleOptionSlider*>( option ) );
Packit 8e9c33
Packit 8e9c33
        QRect r( option->rect );
Packit 8e9c33
Packit 8e9c33
        if (sliderOption->orientation == Qt::Vertical) {
Packit 8e9c33
            int thickness = Slider_GrooveThickness + 8;
Packit 8e9c33
            return QRect(r.center().x() - thickness / 2, r.top() + 1, thickness + 1, r.height() - 1);
Packit 8e9c33
        }
Packit 8e9c33
        else {
Packit 8e9c33
            int thickness = Slider_GrooveThickness + 6;
Packit 8e9c33
            return QRect(r.left() + 1, r.center().y() - thickness / 2, r.width() - 1, thickness + 1);
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________
Packit 8e9c33
    QRect Style::tabBarTabLeftButtonRect( const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionTabV3 *tabOptionV3( qstyleoption_cast<const QStyleOptionTabV3*>( option ) );
Packit 8e9c33
        if( !tabOptionV3 || tabOptionV3->leftButtonSize.isEmpty() ) return QRect();
Packit 8e9c33
Packit 8e9c33
        QRect rect( option->rect );
Packit 8e9c33
        QSize size( tabOptionV3->leftButtonSize );
Packit 8e9c33
        QRect buttonRect( QPoint(0,0), size );
Packit 8e9c33
Packit 8e9c33
        // vertical positioning
Packit 8e9c33
        switch( tabOptionV3->shape )
Packit 8e9c33
        {
Packit 8e9c33
            case QTabBar::RoundedNorth:
Packit 8e9c33
            case QTabBar::TriangularNorth:
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedSouth:
Packit 8e9c33
            case QTabBar::TriangularSouth:
Packit 8e9c33
            buttonRect.moveLeft( rect.left() + Metrics::TabBar_TabMarginWidth );
Packit 8e9c33
            buttonRect.moveTop( ( rect.height() - buttonRect.height() )/2 );
Packit 8e9c33
            buttonRect = visualRect( option, buttonRect );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedWest:
Packit 8e9c33
            case QTabBar::TriangularWest:
Packit 8e9c33
            buttonRect.moveBottom( rect.bottom() - Metrics::TabBar_TabMarginWidth );
Packit 8e9c33
            buttonRect.moveLeft( ( rect.width() - buttonRect.width() )/2 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedEast:
Packit 8e9c33
            case QTabBar::TriangularEast:
Packit 8e9c33
            buttonRect.moveTop( rect.top() + Metrics::TabBar_TabMarginWidth );
Packit 8e9c33
            buttonRect.moveLeft( ( rect.width() - buttonRect.width() )/2 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            default: break;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return buttonRect;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________
Packit 8e9c33
    QRect Style::tabBarTabRightButtonRect( const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionTabV3 *tabOptionV3( qstyleoption_cast<const QStyleOptionTabV3*>( option ) );
Packit 8e9c33
        if( !tabOptionV3 || tabOptionV3->rightButtonSize.isEmpty() ) return QRect();
Packit 8e9c33
Packit 8e9c33
        QRect rect( option->rect );
Packit 8e9c33
        QSize size( tabOptionV3->rightButtonSize );
Packit 8e9c33
        QRect buttonRect( QPoint(0,0), size );
Packit 8e9c33
Packit 8e9c33
        // vertical positioning
Packit 8e9c33
        switch( tabOptionV3->shape )
Packit 8e9c33
        {
Packit 8e9c33
            case QTabBar::RoundedNorth:
Packit 8e9c33
            case QTabBar::TriangularNorth:
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedSouth:
Packit 8e9c33
            case QTabBar::TriangularSouth:
Packit 8e9c33
            buttonRect.moveRight( rect.right() - Metrics::TabBar_TabMarginWidth );
Packit 8e9c33
            buttonRect.moveTop( ( rect.height() - buttonRect.height() )/2 );
Packit 8e9c33
            buttonRect = visualRect( option, buttonRect );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedWest:
Packit 8e9c33
            case QTabBar::TriangularWest:
Packit 8e9c33
            buttonRect.moveTop( rect.top() + Metrics::TabBar_TabMarginWidth );
Packit 8e9c33
            buttonRect.moveLeft( ( rect.width() - buttonRect.width() )/2 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedEast:
Packit 8e9c33
            case QTabBar::TriangularEast:
Packit 8e9c33
            buttonRect.moveBottom( rect.bottom() - Metrics::TabBar_TabMarginWidth );
Packit 8e9c33
            buttonRect.moveLeft( ( rect.width() - buttonRect.width() )/2 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            default: break;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return buttonRect;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________
Packit 8e9c33
    QRect Style::tabWidgetTabBarRect( const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionTabWidgetFrame* tabOption = qstyleoption_cast<const QStyleOptionTabWidgetFrame*>( option );
Packit 8e9c33
        if( !tabOption ) return ParentStyleClass::subElementRect( SE_TabWidgetTabBar, option, widget );
Packit 8e9c33
Packit 8e9c33
        // do nothing if tabbar is hidden
Packit 8e9c33
        QSize tabBarSize( tabOption->tabBarSize );
Packit 8e9c33
Packit 8e9c33
        QRect rect( option->rect );
Packit 8e9c33
        QRect tabBarRect( QPoint(0, 0), tabBarSize );
Packit 8e9c33
Packit 8e9c33
        Qt::Alignment tabBarAlignment( styleHint( SH_TabBar_Alignment, option, widget ) );
Packit 8e9c33
Packit 8e9c33
        // horizontal positioning
Packit 8e9c33
        bool verticalTabs( isVerticalTab( tabOption->shape ) );
Packit 8e9c33
        if( verticalTabs )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            tabBarRect.setTop(option->rect.top() + 1);
Packit 8e9c33
            tabBarRect.setBottom(option->rect.bottom() - 1);
Packit 8e9c33
            //tabBarRect.setHeight( qMin( tabBarRect.height(), rect.height() - 2 ) );
Packit 8e9c33
            //if( tabBarAlignment == Qt::AlignCenter ) tabBarRect.moveTop( rect.top() + ( rect.height() - tabBarRect.height() )/2 );
Packit 8e9c33
            //else tabBarRect.moveTop( rect.top()+1 );
Packit 8e9c33
Packit 8e9c33
        } else {
Packit 8e9c33
Packit 8e9c33
            // account for corner rects
Packit 8e9c33
            // need to re-run visualRect to remove right-to-left handling, since it is re-added on tabBarRect at the end
Packit 8e9c33
            QRect leftButtonRect( visualRect( option, subElementRect( SE_TabWidgetLeftCorner, option, widget ) ) );
Packit 8e9c33
            QRect rightButtonRect( visualRect( option, subElementRect( SE_TabWidgetRightCorner, option, widget ) ) );
Packit 8e9c33
Packit 8e9c33
            rect.setLeft( leftButtonRect.width() );
Packit 8e9c33
            rect.setRight( rightButtonRect.left() - 1 );
Packit 8e9c33
Packit 8e9c33
            tabBarRect.moveLeft( rect.left() + 1 );
Packit 8e9c33
            tabBarRect.setWidth( rect.width() - 2 );
Packit 8e9c33
Packit 8e9c33
            tabBarRect = visualRect( option, tabBarRect );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // vertical positioning
Packit 8e9c33
        switch( tabOption->shape )
Packit 8e9c33
        {
Packit 8e9c33
            case QTabBar::RoundedNorth:
Packit 8e9c33
            case QTabBar::TriangularNorth:
Packit 8e9c33
            tabBarRect.moveTop( rect.top()+1 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedSouth:
Packit 8e9c33
            case QTabBar::TriangularSouth:
Packit 8e9c33
            tabBarRect.moveBottom( rect.bottom()-1 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedWest:
Packit 8e9c33
            case QTabBar::TriangularWest:
Packit 8e9c33
            tabBarRect.moveLeft( rect.left()+1 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedEast:
Packit 8e9c33
            case QTabBar::TriangularEast:
Packit 8e9c33
            tabBarRect.moveRight( rect.right()-1 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            default: break;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return tabBarRect;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________
Packit 8e9c33
    QRect Style::tabWidgetTabContentsRect( const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionTabWidgetFrame* tabOption = qstyleoption_cast<const QStyleOptionTabWidgetFrame*>( option );
Packit 8e9c33
        if( !tabOption ) return option->rect;
Packit 8e9c33
Packit 8e9c33
        // do nothing if tabbar is hidden
Packit 8e9c33
        if( tabOption->tabBarSize.isEmpty() ) return option->rect;
Packit 8e9c33
        QRect rect = tabWidgetTabPaneRect( option, widget );
Packit 8e9c33
Packit 8e9c33
        bool documentMode( tabOption->lineWidth == 0 );
Packit 8e9c33
        if( documentMode )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            // add margin only to the relevant side
Packit 8e9c33
            switch( tabOption->shape )
Packit 8e9c33
            {
Packit 8e9c33
                case QTabBar::RoundedNorth:
Packit 8e9c33
                case QTabBar::TriangularNorth:
Packit 8e9c33
                return rect.adjusted( 0, Metrics::TabWidget_MarginWidth, 0, 0 );
Packit 8e9c33
Packit 8e9c33
                case QTabBar::RoundedSouth:
Packit 8e9c33
                case QTabBar::TriangularSouth:
Packit 8e9c33
                return rect.adjusted( 0, 0, 0, -Metrics::TabWidget_MarginWidth );
Packit 8e9c33
Packit 8e9c33
                case QTabBar::RoundedWest:
Packit 8e9c33
                case QTabBar::TriangularWest:
Packit 8e9c33
                return rect.adjusted( Metrics::TabWidget_MarginWidth, 0, 0, 0 );
Packit 8e9c33
Packit 8e9c33
                case QTabBar::RoundedEast:
Packit 8e9c33
                case QTabBar::TriangularEast:
Packit 8e9c33
                return rect.adjusted( 0, 0, -Metrics::TabWidget_MarginWidth, 0 );
Packit 8e9c33
Packit 8e9c33
                default: return rect;
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        } else return insideMargin( rect, Metrics::TabWidget_MarginWidth );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________
Packit 8e9c33
    QRect Style::tabWidgetTabPaneRect( const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        const QStyleOptionTabWidgetFrame* tabOption = qstyleoption_cast<const QStyleOptionTabWidgetFrame*>( option );
Packit 8e9c33
        if( !tabOption || tabOption->tabBarSize.isEmpty() ) return option->rect;
Packit 8e9c33
Packit 8e9c33
        int overlap = Metrics::TabBar_BaseOverlap + 1;
Packit 8e9c33
        QSize tabBarSize( tabOption->tabBarSize - QSize( overlap, overlap ) );
Packit 8e9c33
Packit 8e9c33
        QRect rect( option->rect );
Packit 8e9c33
        switch( tabOption->shape )
Packit 8e9c33
        {
Packit 8e9c33
            case QTabBar::RoundedNorth:
Packit 8e9c33
            case QTabBar::TriangularNorth:
Packit 8e9c33
            rect.adjust( 0, tabBarSize.height(), 0, 0 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedSouth:
Packit 8e9c33
            case QTabBar::TriangularSouth:
Packit 8e9c33
            rect.adjust( 0, 0, 0, -tabBarSize.height() );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedWest:
Packit 8e9c33
            case QTabBar::TriangularWest:
Packit 8e9c33
            rect.adjust( tabBarSize.width(), 0, 0, 0 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedEast:
Packit 8e9c33
            case QTabBar::TriangularEast:
Packit 8e9c33
            rect.adjust( 0, 0, -tabBarSize.width(), 0 );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            default: return QRect();
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return rect;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________
Packit 8e9c33
    QRect Style::tabWidgetCornerRect( SubElement element, const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionTabWidgetFrame* tabOption = qstyleoption_cast<const QStyleOptionTabWidgetFrame*>( option );
Packit 8e9c33
        if( !tabOption ) return option->rect;
Packit 8e9c33
Packit 8e9c33
        // do nothing if tabbar is hidden
Packit 8e9c33
        QSize tabBarSize( tabOption->tabBarSize );
Packit 8e9c33
        if( tabBarSize.isEmpty() ) return QRect();
Packit 8e9c33
Packit 8e9c33
        // do nothing for vertical tabs
Packit 8e9c33
        bool verticalTabs( isVerticalTab( tabOption->shape ) );
Packit 8e9c33
        if( verticalTabs ) return QRect();
Packit 8e9c33
Packit 8e9c33
        QRect rect( option->rect );
Packit 8e9c33
        QRect cornerRect;
Packit 8e9c33
        switch( element )
Packit 8e9c33
        {
Packit 8e9c33
            case SE_TabWidgetLeftCorner:
Packit 8e9c33
            cornerRect = QRect( QPoint(0,0), tabOption->leftCornerWidgetSize );
Packit 8e9c33
            cornerRect.moveLeft( rect.left() );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case SE_TabWidgetRightCorner:
Packit 8e9c33
            cornerRect = QRect( QPoint(0,0), tabOption->rightCornerWidgetSize );
Packit 8e9c33
            cornerRect.moveRight( rect.right() );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            default: break;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // expend height to tabBarSize, if needed, to make sure base is properly rendered
Packit 8e9c33
        cornerRect.setHeight( qMax( cornerRect.height(), tabBarSize.height() + 1 ) );
Packit 8e9c33
Packit 8e9c33
        switch( tabOption->shape )
Packit 8e9c33
        {
Packit 8e9c33
            case QTabBar::RoundedNorth:
Packit 8e9c33
            case QTabBar::TriangularNorth:
Packit 8e9c33
            cornerRect.moveTop( rect.top() );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QTabBar::RoundedSouth:
Packit 8e9c33
            case QTabBar::TriangularSouth:
Packit 8e9c33
            cornerRect.moveBottom( rect.bottom() );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            default: break;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // return cornerRect;
Packit 8e9c33
        cornerRect = visualRect( option, cornerRect );
Packit 8e9c33
        return cornerRect;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________
Packit 8e9c33
    QRect Style::toolBoxTabContentsRect( const QStyleOption* option, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionToolBox* toolBoxOption( qstyleoption_cast<const QStyleOptionToolBox *>( option ) );
Packit 8e9c33
        if( !toolBoxOption ) return option->rect;
Packit 8e9c33
Packit 8e9c33
        // copy rect
Packit 8e9c33
        const QRect& rect( option->rect );
Packit 8e9c33
Packit 8e9c33
        int contentsWidth(0);
Packit 8e9c33
        if( !toolBoxOption->icon.isNull() )
Packit 8e9c33
        {
Packit 8e9c33
            int iconSize( pixelMetric( QStyle::PM_SmallIconSize, option, widget ) );
Packit 8e9c33
            contentsWidth += iconSize;
Packit 8e9c33
Packit 8e9c33
            if( !toolBoxOption->text.isEmpty() ) contentsWidth += Metrics::ToolBox_TabItemSpacing;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        if( !toolBoxOption->text.isEmpty() )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            int textWidth = toolBoxOption->fontMetrics.size( _mnemonics->textFlags(), toolBoxOption->text ).width();
Packit 8e9c33
            contentsWidth += textWidth;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        contentsWidth += 2*Metrics::ToolBox_TabMarginWidth;
Packit 8e9c33
        contentsWidth = qMin( contentsWidth, rect.width() );
Packit 8e9c33
        contentsWidth = qMax( contentsWidth, int(Metrics::ToolBox_TabMinWidth) );
Packit 8e9c33
        return centerRect( rect, contentsWidth, rect.height() );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //____________________________________________________________________
Packit 8e9c33
    QRect Style::genericLayoutItemRect( const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
    { return insideMargin( option->rect, -Metrics::Frame_FrameWidth ); }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QRect Style::groupBoxSubControlRect( const QStyleOptionComplex* option, SubControl subControl, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
        if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option))
Packit 8e9c33
        {
Packit 8e9c33
            QRect rect = ParentStyleClass::subControlRect(CC_GroupBox, option, subControl, widget);
Packit 8e9c33
            int topMargin = 0;
Packit 8e9c33
            int topHeight = 0;
Packit 8e9c33
            int verticalAlignment = proxy()->styleHint(SH_GroupBox_TextLabelVerticalAlignment, groupBox, widget);
Packit 8e9c33
Packit 8e9c33
            if (!groupBox->text.isEmpty())
Packit 8e9c33
            {
Packit 8e9c33
                topHeight = groupBox->fontMetrics.height();
Packit 8e9c33
                if (verticalAlignment & Qt::AlignVCenter)
Packit 8e9c33
                {
Packit 8e9c33
                    topMargin = topHeight / 2;
Packit 8e9c33
                }
Packit 8e9c33
                else if (verticalAlignment & Qt::AlignTop)
Packit 8e9c33
                {
Packit 8e9c33
                    topMargin = topHeight;
Packit 8e9c33
                }
Packit 8e9c33
            }
Packit 8e9c33
            QRect frameRect = groupBox->rect;
Packit 8e9c33
            frameRect.setTop(topMargin);
Packit 8e9c33
            if (subControl == SC_GroupBoxFrame)
Packit 8e9c33
            {
Packit 8e9c33
                return rect;
Packit 8e9c33
            }
Packit 8e9c33
            else if (subControl == SC_GroupBoxContents)
Packit 8e9c33
            {
Packit 8e9c33
                int margin = 0;
Packit 8e9c33
                int leftMarginExtension = 16;
Packit 8e9c33
                return frameRect.adjusted(leftMarginExtension + margin, margin + topHeight, -margin, -margin);
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            if (const QGroupBox *groupBoxWidget = qobject_cast<const QGroupBox *>(widget))
Packit 8e9c33
            {
Packit 8e9c33
                 //Prepare metrics for a bold font
Packit 8e9c33
                QFont font = widget->font();
Packit 8e9c33
                font.setBold(true);
Packit 8e9c33
                QFontMetrics fontMetrics(font);
Packit 8e9c33
Packit 8e9c33
                QSize textRect = fontMetrics.boundingRect(groupBoxWidget->title()).size() + QSize(2, 2);
Packit 8e9c33
                if (subControl == SC_GroupBoxCheckBox)
Packit 8e9c33
                {
Packit 8e9c33
                    int indicatorWidth = proxy()->pixelMetric(PM_IndicatorWidth, option, widget);
Packit 8e9c33
                    int indicatorHeight = proxy()->pixelMetric(PM_IndicatorHeight, option, widget);
Packit 8e9c33
                    rect.setWidth(indicatorWidth);
Packit 8e9c33
                    rect.setHeight(indicatorHeight);
Packit 8e9c33
                    rect.moveTop((textRect.height() - indicatorHeight) / 2);
Packit 8e9c33
                }
Packit 8e9c33
                else if (subControl == SC_GroupBoxLabel)
Packit 8e9c33
                {
Packit 8e9c33
                    rect.setSize(textRect);
Packit 8e9c33
                }
Packit 8e9c33
            }
Packit 8e9c33
            return rect;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return ParentStyleClass::subControlRect( CC_GroupBox, option, subControl, widget );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::toolButtonSubControlRect( const QStyleOptionComplex* option, SubControl subControl, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionToolButton* toolButtonOption = qstyleoption_cast<const QStyleOptionToolButton*>( option );
Packit 8e9c33
        if( !toolButtonOption ) return ParentStyleClass::subControlRect( CC_ToolButton, option, subControl, widget );
Packit 8e9c33
Packit 8e9c33
        bool hasPopupMenu( toolButtonOption->features & QStyleOptionToolButton::MenuButtonPopup );
Packit 8e9c33
        const bool hasInlineIndicator(
Packit 8e9c33
            toolButtonOption->features&QStyleOptionToolButton::HasMenu
Packit 8e9c33
            && toolButtonOption->features&QStyleOptionToolButton::PopupDelay
Packit 8e9c33
            && !hasPopupMenu );
Packit 8e9c33
Packit 8e9c33
        // store rect
Packit 8e9c33
        const QRect& rect( option->rect );
Packit 8e9c33
        int menuButtonWidth( Metrics::MenuButton_IndicatorWidth );
Packit 8e9c33
        switch( subControl )
Packit 8e9c33
        {
Packit 8e9c33
            case SC_ToolButtonMenu:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                // check fratures
Packit 8e9c33
                if( !(hasPopupMenu || hasInlineIndicator ) ) return QRect();
Packit 8e9c33
Packit 8e9c33
                // check features
Packit 8e9c33
                QRect menuRect( rect );
Packit 8e9c33
                menuRect.setLeft( rect.right() - menuButtonWidth + 1 );
Packit 8e9c33
                if( hasInlineIndicator )
Packit 8e9c33
                { menuRect.setTop( menuRect.bottom() - menuButtonWidth + 1 ); }
Packit 8e9c33
Packit 8e9c33
                return visualRect( option, menuRect );
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case SC_ToolButton:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                if( hasPopupMenu )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    QRect contentsRect( rect );
Packit 8e9c33
                    contentsRect.setRight( rect.right() - menuButtonWidth );
Packit 8e9c33
                    return visualRect( option, contentsRect );
Packit 8e9c33
Packit 8e9c33
                } else return rect;
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            default: return QRect();
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::comboBoxSubControlRect( const QStyleOptionComplex* option, SubControl subControl, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionComboBox *comboBoxOption( qstyleoption_cast<const QStyleOptionComboBox*>( option ) );
Packit 8e9c33
        if( !comboBoxOption ) return ParentStyleClass::subControlRect( CC_ComboBox, option, subControl, widget );
Packit 8e9c33
Packit 8e9c33
        bool editable( comboBoxOption->editable );
Packit 8e9c33
        bool flat( editable && !comboBoxOption->frame );
Packit 8e9c33
Packit 8e9c33
        // copy rect
Packit 8e9c33
        QRect rect( option->rect );
Packit 8e9c33
Packit 8e9c33
        switch( subControl )
Packit 8e9c33
        {
Packit 8e9c33
            case SC_ComboBoxFrame: return flat ? rect : QRect();
Packit 8e9c33
            case SC_ComboBoxListBoxPopup: return rect;
Packit 8e9c33
Packit 8e9c33
            case SC_ComboBoxArrow:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                QRect arrowRect(
Packit 8e9c33
                    rect.right() - rect.height() + 1,
Packit 8e9c33
                    rect.top(),
Packit 8e9c33
                    rect.height(),
Packit 8e9c33
                    rect.height() );
Packit 8e9c33
Packit 8e9c33
                return arrowRect;
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case SC_ComboBoxEditField:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                QRect labelRect;
Packit 8e9c33
                int frameWidth( pixelMetric( PM_ComboBoxFrameWidth, option, widget ) );
Packit 8e9c33
                labelRect = QRect(
Packit 8e9c33
                    rect.left(), rect.top(),
Packit 8e9c33
                    rect.width() - rect.height() - 4,
Packit 8e9c33
                    rect.height() );
Packit 8e9c33
Packit 8e9c33
                // remove margins
Packit 8e9c33
                if( !flat && rect.height() >= option->fontMetrics.height() + 2*frameWidth )
Packit 8e9c33
                { labelRect.adjust( frameWidth, frameWidth, 0, -frameWidth ); }
Packit 8e9c33
Packit 8e9c33
                return visualRect( option, labelRect );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            default: break;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return ParentStyleClass::subControlRect( CC_ComboBox, option, subControl, widget );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::spinBoxSubControlRect( const QStyleOptionComplex* option, SubControl subControl, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionSpinBox *spinBoxOption( qstyleoption_cast<const QStyleOptionSpinBox*>( option ) );
Packit 8e9c33
        if( !spinBoxOption ) return ParentStyleClass::subControlRect( CC_SpinBox, option, subControl, widget );
Packit 8e9c33
        bool flat( !spinBoxOption->frame );
Packit 8e9c33
Packit 8e9c33
        // copy rect
Packit 8e9c33
        QRect rect( option->rect );
Packit 8e9c33
Packit 8e9c33
        switch( subControl )
Packit 8e9c33
        {
Packit 8e9c33
            case SC_SpinBoxFrame: return flat ? QRect():rect;
Packit 8e9c33
Packit 8e9c33
            case SC_SpinBoxUp:
Packit 8e9c33
Packit 8e9c33
            if (rect.width() > 2 * rect.height() + 24)
Packit 8e9c33
                return QRect(rect.right() - rect.height() - 1,
Packit 8e9c33
                             rect.top(),
Packit 8e9c33
                             rect.height(),
Packit 8e9c33
                             rect.height() - 1
Packit 8e9c33
                            );
Packit 8e9c33
            else
Packit 8e9c33
                return QRect(rect.right() - 0.6 * rect.height(),
Packit 8e9c33
                             rect.top(),
Packit 8e9c33
                             rect.height() * 0.6,
Packit 8e9c33
                            rect.height() / 2 + 3 );
Packit 8e9c33
Packit 8e9c33
            case SC_SpinBoxDown:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
            if (rect.width() > 2 * rect.height() + 24)
Packit 8e9c33
                return QRect(rect.right() - 2 * rect.height(),
Packit 8e9c33
                             rect.top(),
Packit 8e9c33
                             rect.height(),
Packit 8e9c33
                             rect.height() - 1
Packit 8e9c33
                            );
Packit 8e9c33
            else
Packit 8e9c33
                return QRect(rect.right() - 0.6 * rect.height(),
Packit 8e9c33
                             rect.top() + rect.height() / 2 - 2,
Packit 8e9c33
                             rect.height() * 0.6,
Packit 8e9c33
                             rect.height() / 2 + 1 );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case SC_SpinBoxEditField:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
                int frameWidth( pixelMetric( PM_SpinBoxFrameWidth, option, widget ) );
Packit 8e9c33
Packit 8e9c33
                QRect labelRect;
Packit 8e9c33
Packit 8e9c33
                if (rect.width() > 2 * rect.height() + 24)
Packit 8e9c33
                    labelRect = QRect(
Packit 8e9c33
                        rect.left(), rect.top(),
Packit 8e9c33
                        rect.width() - 2 * rect.height() - frameWidth,
Packit 8e9c33
                        rect.height() );
Packit 8e9c33
                else
Packit 8e9c33
                    labelRect = QRect(
Packit 8e9c33
                        rect.left(), rect.top(),
Packit 8e9c33
                        rect.width() - 0.6 * rect.height() - frameWidth,
Packit 8e9c33
                        rect.height() );
Packit 8e9c33
Packit 8e9c33
                // remove right side line editor margins
Packit 8e9c33
                if( !flat && labelRect.height() >= option->fontMetrics.height() + 2*frameWidth )
Packit 8e9c33
                { labelRect.adjust( frameWidth, frameWidth, 0, -frameWidth ); }
Packit 8e9c33
Packit 8e9c33
                return visualRect( option, labelRect );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            default: break;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return ParentStyleClass::subControlRect( CC_SpinBox, option, subControl, widget );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::scrollBarInternalSubControlRect( const QStyleOptionComplex* option, SubControl subControl ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        const QRect& rect = option->rect;
Packit 8e9c33
        const State& state( option->state );
Packit 8e9c33
        bool horizontal( state & State_Horizontal );
Packit 8e9c33
Packit 8e9c33
        switch( subControl )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            case SC_ScrollBarSubLine:
Packit 8e9c33
            {
Packit 8e9c33
                int majorSize( scrollBarButtonHeight( _subLineButtons ) );
Packit 8e9c33
                if( horizontal ) return visualRect( option, QRect( rect.left(), rect.top(), majorSize, rect.height() ) );
Packit 8e9c33
                else return visualRect( option, QRect( rect.left(), rect.top(), rect.width(), majorSize ) );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case SC_ScrollBarAddLine:
Packit 8e9c33
            {
Packit 8e9c33
                int majorSize( scrollBarButtonHeight( _addLineButtons ) );
Packit 8e9c33
                if( horizontal ) return visualRect( option, QRect( rect.right() - majorSize + 1, rect.top(), majorSize, rect.height() ) );
Packit 8e9c33
                else return visualRect( option, QRect( rect.left(), rect.bottom() - majorSize + 1, rect.width(), majorSize ) );
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            default: return QRect();
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::scrollBarSubControlRect( const QStyleOptionComplex* option, SubControl subControl, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionSlider* sliderOption( qstyleoption_cast<const QStyleOptionSlider*>( option ) );
Packit 8e9c33
        if( !sliderOption ) return ParentStyleClass::subControlRect( CC_ScrollBar, option, subControl, widget );
Packit 8e9c33
Packit 8e9c33
        // get relevant state
Packit 8e9c33
        const State& state( option->state );
Packit 8e9c33
        bool horizontal( state & State_Horizontal );
Packit 8e9c33
Packit 8e9c33
        switch( subControl )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            case SC_ScrollBarSubLine:
Packit 8e9c33
            case SC_ScrollBarAddLine:
Packit 8e9c33
            return QRect();
Packit 8e9c33
Packit 8e9c33
            case SC_ScrollBarGroove:
Packit 8e9c33
            {
Packit 8e9c33
                QRect topRect = visualRect( option, scrollBarInternalSubControlRect( option, SC_ScrollBarSubLine ) );
Packit 8e9c33
                QRect bottomRect = visualRect( option, scrollBarInternalSubControlRect( option, SC_ScrollBarAddLine ) );
Packit 8e9c33
Packit 8e9c33
                QPoint topLeftCorner;
Packit 8e9c33
                QPoint botRightCorner;
Packit 8e9c33
Packit 8e9c33
                if( horizontal )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    topLeftCorner  = QPoint( topRect.right() + 1, topRect.top() );
Packit 8e9c33
                    botRightCorner = QPoint( bottomRect.left()  - 1, topRect.bottom() );
Packit 8e9c33
Packit 8e9c33
                } else {
Packit 8e9c33
Packit 8e9c33
                    topLeftCorner  = QPoint( topRect.left(),  topRect.bottom() + 1 );
Packit 8e9c33
                    botRightCorner = QPoint( topRect.right(), bottomRect.top() - 1 );
Packit 8e9c33
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
                // define rect
Packit 8e9c33
                return visualRect( option, QRect( topLeftCorner, botRightCorner )  );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case SC_ScrollBarSlider:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                // handle RTL here to unreflect things if need be
Packit 8e9c33
                QRect groove = visualRect( option, subControlRect( CC_ScrollBar, option, SC_ScrollBarGroove, widget ) );
Packit 8e9c33
                groove.adjust(0, 0, 1, 1);
Packit 8e9c33
Packit 8e9c33
                if( sliderOption->minimum == sliderOption->maximum ) return groove;
Packit 8e9c33
Packit 8e9c33
                // Figure out how much room there is
Packit 8e9c33
                int space( horizontal ? groove.width() : groove.height() );
Packit 8e9c33
Packit 8e9c33
                // Calculate the portion of this space that the slider should occupy
Packit 8e9c33
                int sliderSize = space * qreal( sliderOption->pageStep ) / ( sliderOption->maximum - sliderOption->minimum + sliderOption->pageStep );
Packit 8e9c33
                sliderSize = qMax( sliderSize, static_cast<int>(Metrics::ScrollBar_MinSliderHeight ) );
Packit 8e9c33
                sliderSize = qMin( sliderSize, space );
Packit 8e9c33
Packit 8e9c33
                space -= sliderSize;
Packit 8e9c33
                if( space <= 0 ) return groove;
Packit 8e9c33
Packit 8e9c33
                int pos = qRound( qreal( sliderOption->sliderPosition - sliderOption->minimum )/ ( sliderOption->maximum - sliderOption->minimum )*space );
Packit 8e9c33
                if( sliderOption->upsideDown ) pos = space - pos;
Packit 8e9c33
                if( horizontal ) return visualRect( option, QRect( groove.left() + pos, groove.top(), sliderSize, groove.height() ) );
Packit 8e9c33
                else return visualRect( option, QRect( groove.left(), groove.top() + pos, groove.width(), sliderSize ) );
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case SC_ScrollBarSubPage:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                // handle RTL here to unreflect things if need be
Packit 8e9c33
                QRect slider = visualRect( option, subControlRect( CC_ScrollBar, option, SC_ScrollBarSlider, widget ) );
Packit 8e9c33
                QRect groove = visualRect( option, subControlRect( CC_ScrollBar, option, SC_ScrollBarGroove, widget ) );
Packit 8e9c33
Packit 8e9c33
                if( horizontal ) return visualRect( option, QRect( groove.left(), groove.top(), slider.left() - groove.left(), groove.height() ) );
Packit 8e9c33
                else return visualRect( option, QRect( groove.left(), groove.top(), groove.width(), slider.top() - groove.top() ) );
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case SC_ScrollBarAddPage:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                // handle RTL here to unreflect things if need be
Packit 8e9c33
                QRect slider = visualRect( option, subControlRect( CC_ScrollBar, option, SC_ScrollBarSlider, widget ) );
Packit 8e9c33
                QRect groove = visualRect( option, subControlRect( CC_ScrollBar, option, SC_ScrollBarGroove, widget ) );
Packit 8e9c33
Packit 8e9c33
                if( horizontal ) return visualRect( option, QRect( slider.right() + 1, groove.top(), groove.right() - slider.right(), groove.height() ) );
Packit 8e9c33
                else return visualRect( option, QRect( groove.left(), slider.bottom() + 1, groove.width(), groove.bottom() - slider.bottom() ) );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            default: return ParentStyleClass::subControlRect( CC_ScrollBar, option, subControl, widget );;
Packit 8e9c33
        }
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::dialSubControlRect( const QStyleOptionComplex* option, SubControl subControl, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionSlider* sliderOption( qstyleoption_cast<const QStyleOptionSlider*>( option ) );
Packit 8e9c33
        if( !sliderOption ) return ParentStyleClass::subControlRect( CC_Dial, option, subControl, widget );
Packit 8e9c33
Packit 8e9c33
        // adjust rect to be square, and centered
Packit 8e9c33
        QRect rect( option->rect );
Packit 8e9c33
        int dimension( qMin( rect.width(), rect.height() ) );
Packit 8e9c33
        rect = centerRect( rect, dimension, dimension );
Packit 8e9c33
Packit 8e9c33
        switch( subControl )
Packit 8e9c33
        {
Packit 8e9c33
            case QStyle::SC_DialGroove: return insideMargin( rect, (Metrics::Slider_ControlThickness - Metrics::Slider_GrooveThickness)/2 + 2 );
Packit 8e9c33
            case QStyle::SC_DialHandle:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                // calculate angle at which handle needs to be drawn
Packit 8e9c33
                qreal angle( dialAngle( sliderOption, sliderOption->sliderPosition ) );
Packit 8e9c33
Packit 8e9c33
                // groove rect
Packit 8e9c33
                QRectF grooveRect( insideMargin( rect, Metrics::Slider_ControlThickness/2 ) );
Packit 8e9c33
                qreal radius( grooveRect.width()/2 );
Packit 8e9c33
Packit 8e9c33
                // slider center
Packit 8e9c33
                QPointF center( grooveRect.center() + QPointF( radius*std::cos( angle ), -radius*std::sin( angle ) ) );
Packit 8e9c33
Packit 8e9c33
                // slider rect
Packit 8e9c33
                QRect handleRect( 0, 0, Metrics::Slider_ControlThickness, Metrics::Slider_ControlThickness );
Packit 8e9c33
                handleRect.moveCenter( center.toPoint() );
Packit 8e9c33
                return handleRect;
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            default: return ParentStyleClass::subControlRect( CC_Dial, option, subControl, widget );;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //___________________________________________________________________________________________________________________
Packit 8e9c33
    QRect Style::sliderSubControlRect( const QStyleOptionComplex* option, SubControl subControl, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionSlider* sliderOption( qstyleoption_cast<const QStyleOptionSlider*>( option ) );
Packit 8e9c33
        if( !sliderOption ) return ParentStyleClass::subControlRect( CC_Slider, option, subControl, widget );
Packit 8e9c33
Packit 8e9c33
        switch( subControl )
Packit 8e9c33
        {
Packit 8e9c33
            case SC_SliderGroove:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                // direction
Packit 8e9c33
                bool horizontal( sliderOption->orientation == Qt::Horizontal );
Packit 8e9c33
Packit 8e9c33
                // get base class rect
Packit 8e9c33
                QRect grooveRect( ParentStyleClass::subControlRect( CC_Slider, option, subControl, widget ) );
Packit 8e9c33
                grooveRect = insideMargin( grooveRect, pixelMetric( PM_DefaultFrameWidth, option, widget ) );
Packit 8e9c33
Packit 8e9c33
                // centering
Packit 8e9c33
                if( horizontal ) grooveRect = centerRect( grooveRect, grooveRect.width(), Metrics::Slider_GrooveThickness );
Packit 8e9c33
                else grooveRect = centerRect( grooveRect, Metrics::Slider_GrooveThickness, grooveRect.height() );
Packit 8e9c33
                return grooveRect;
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            default: return ParentStyleClass::subControlRect( CC_Slider, option, subControl, widget );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::checkBoxSizeFromContents( const QStyleOption*, const QSize& contentsSize, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
        // get contents size
Packit 8e9c33
        QSize size( contentsSize );
Packit 8e9c33
Packit 8e9c33
        // add focus height
Packit 8e9c33
        size = expandSize( size, 0, Metrics::CheckBox_FocusMarginWidth );
Packit 8e9c33
Packit 8e9c33
        // make sure there is enough height for indicator
Packit 8e9c33
        size.setHeight( qMax( size.height(), int(Metrics::CheckBox_Size) ) );
Packit 8e9c33
Packit 8e9c33
        // Add space for the indicator and the icon
Packit 8e9c33
        size.rwidth() += Metrics::CheckBox_Size + Metrics::CheckBox_ItemSpacing;
Packit 8e9c33
Packit 8e9c33
        // also add extra space, to leave room to the right of the label
Packit 8e9c33
        size.rwidth() += Metrics::CheckBox_ItemSpacing;
Packit 8e9c33
Packit 8e9c33
        return size;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::lineEditSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionFrame* frameOption( qstyleoption_cast<const QStyleOptionFrame*>( option ) );
Packit 8e9c33
        if( !frameOption ) return contentsSize;
Packit 8e9c33
Packit 8e9c33
        bool flat( frameOption->lineWidth == 0 );
Packit 8e9c33
        int frameWidth( pixelMetric( PM_DefaultFrameWidth, option, widget ) );
Packit 8e9c33
        return flat ? contentsSize : expandSize( contentsSize, frameWidth );
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::comboBoxSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionComboBox* comboBoxOption( qstyleoption_cast<const QStyleOptionComboBox*>( option ) );
Packit 8e9c33
        if( !comboBoxOption ) return contentsSize;
Packit 8e9c33
Packit 8e9c33
        // copy size
Packit 8e9c33
        QSize size( contentsSize );
Packit 8e9c33
Packit 8e9c33
        // add relevant margin
Packit 8e9c33
        bool flat( !comboBoxOption->frame );
Packit 8e9c33
        int frameWidth( pixelMetric( PM_ComboBoxFrameWidth, option, widget ) );
Packit 8e9c33
        if( !flat ) size = expandSize( size, frameWidth );
Packit 8e9c33
Packit 8e9c33
        // make sure there is enough height for the button
Packit 8e9c33
        size.setHeight( qMax( size.height(), int(Metrics::MenuButton_IndicatorWidth) ) );
Packit 8e9c33
Packit 8e9c33
        // add button width and spacing
Packit 8e9c33
        size.rwidth() += size.height() + 4;
Packit 8e9c33
Packit 8e9c33
        return size;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::spinBoxSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionSpinBox *spinBoxOption( qstyleoption_cast<const QStyleOptionSpinBox*>( option ) );
Packit 8e9c33
        if( !spinBoxOption ) return contentsSize;
Packit 8e9c33
Packit 8e9c33
        bool flat( !spinBoxOption->frame );
Packit 8e9c33
Packit 8e9c33
        // copy size
Packit 8e9c33
        QSize size( contentsSize );
Packit 8e9c33
Packit 8e9c33
        // add editor margins
Packit 8e9c33
        int frameWidth( pixelMetric( PM_SpinBoxFrameWidth, option, widget ) );
Packit 8e9c33
        if( !flat ) size = expandSize( size, frameWidth );
Packit 8e9c33
Packit 8e9c33
        // add button width and spacing
Packit 8e9c33
        size.rwidth() += 2 * size.height() - 1;
Packit 8e9c33
Packit 8e9c33
        return size;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::sliderSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionSlider *sliderOption( qstyleoption_cast<const QStyleOptionSlider*>( option ) );
Packit 8e9c33
        if( !sliderOption ) return contentsSize;
Packit 8e9c33
Packit 8e9c33
        // store tick position and orientation
Packit 8e9c33
        const QSlider::TickPosition& tickPosition( sliderOption->tickPosition );
Packit 8e9c33
        bool horizontal( sliderOption->orientation == Qt::Horizontal );
Packit 8e9c33
        bool disableTicks( !StyleConfigData::sliderDrawTickMarks() );
Packit 8e9c33
Packit 8e9c33
        // do nothing if no ticks are requested
Packit 8e9c33
        if( tickPosition == QSlider::NoTicks ) return contentsSize;
Packit 8e9c33
Packit 8e9c33
        /*
Packit 8e9c33
         * Qt adds its own tick length directly inside QSlider.
Packit 8e9c33
         * Take it out and replace by ours, if needed
Packit 8e9c33
         */
Packit 8e9c33
        const int tickLength( disableTicks ? 0 : (
Packit 8e9c33
            Metrics::Slider_TickLength + Metrics::Slider_TickMarginWidth +
Packit 8e9c33
            (Metrics::Slider_GrooveThickness - Metrics::Slider_ControlThickness)/2 ) );
Packit 8e9c33
Packit 8e9c33
        int builtInTickLength( 5 );
Packit 8e9c33
Packit 8e9c33
        QSize size( contentsSize );
Packit 8e9c33
        if( horizontal )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            if(tickPosition & QSlider::TicksAbove) size.rheight() += tickLength - builtInTickLength;
Packit 8e9c33
            if(tickPosition & QSlider::TicksBelow) size.rheight() += tickLength - builtInTickLength;
Packit 8e9c33
Packit 8e9c33
        } else {
Packit 8e9c33
Packit 8e9c33
            if(tickPosition & QSlider::TicksAbove) size.rwidth() += tickLength - builtInTickLength;
Packit 8e9c33
            if(tickPosition & QSlider::TicksBelow) size.rwidth() += tickLength - builtInTickLength;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return size;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::pushButtonSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionButton* buttonOption( qstyleoption_cast<const QStyleOptionButton*>( option ) );
Packit 8e9c33
        if( !buttonOption ) return contentsSize;
Packit 8e9c33
Packit 8e9c33
        // output
Packit 8e9c33
        QSize size;
Packit 8e9c33
Packit 8e9c33
        // check text and icon
Packit 8e9c33
        bool hasText( !buttonOption->text.isEmpty() );
Packit 8e9c33
        bool flat( buttonOption->features & QStyleOptionButton::Flat );
Packit 8e9c33
        bool hasIcon( !buttonOption->icon.isNull() );
Packit 8e9c33
Packit 8e9c33
        if( !( hasText||hasIcon ) )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            /*
Packit 8e9c33
            no text nor icon is passed.
Packit 8e9c33
            assume custom button and use contentsSize as a starting point
Packit 8e9c33
            */
Packit 8e9c33
            size = contentsSize;
Packit 8e9c33
Packit 8e9c33
        } else {
Packit 8e9c33
Packit 8e9c33
            /*
Packit 8e9c33
            rather than trying to guess what Qt puts into its contents size calculation,
Packit 8e9c33
            we recompute the button size entirely, based on button option
Packit 8e9c33
            this ensures consistency with the rendering stage
Packit 8e9c33
            */
Packit 8e9c33
Packit 8e9c33
            // update has icon to honour showIconsOnPushButtons, when possible
Packit 8e9c33
            hasIcon &= (showIconsOnPushButtons() || flat || !hasText );
Packit 8e9c33
Packit 8e9c33
            // text
Packit 8e9c33
            if( hasText ) size = buttonOption->fontMetrics.size( Qt::TextShowMnemonic, buttonOption->text );
Packit 8e9c33
Packit 8e9c33
            // icon
Packit 8e9c33
            if( hasIcon )
Packit 8e9c33
            {
Packit 8e9c33
                QSize iconSize = buttonOption->iconSize;
Packit 8e9c33
                if( !iconSize.isValid() ) iconSize = QSize( pixelMetric( PM_SmallIconSize, option, widget ), pixelMetric( PM_SmallIconSize, option, widget ) );
Packit 8e9c33
Packit 8e9c33
                size.setHeight( qMax( size.height(), iconSize.height() ) );
Packit 8e9c33
                size.rwidth() += iconSize.width();
Packit 8e9c33
Packit 8e9c33
                if( hasText ) size.rwidth() += Metrics::Button_ItemSpacing;
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // menu
Packit 8e9c33
        bool hasMenu( buttonOption->features & QStyleOptionButton::HasMenu );
Packit 8e9c33
        if( hasMenu )
Packit 8e9c33
        {
Packit 8e9c33
            size.rwidth() += Metrics::MenuButton_IndicatorWidth;
Packit 8e9c33
            if( hasText||hasIcon ) size.rwidth() += Metrics::Button_ItemSpacing;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // expand with buttons margin
Packit 8e9c33
        size = expandSize( size, Metrics::Button_MarginWidth );
Packit 8e9c33
Packit 8e9c33
        // make sure buttons have a minimum width
Packit 8e9c33
        if( hasText )
Packit 8e9c33
        { size.setWidth( qMax( size.width(), int( Metrics::Button_MinWidth ) ) ); }
Packit 8e9c33
Packit 8e9c33
        // finally add frame margins
Packit 8e9c33
        return expandSize( size, Metrics::Frame_FrameWidth );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::toolButtonSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionToolButton* toolButtonOption = qstyleoption_cast<const QStyleOptionToolButton*>( option );
Packit 8e9c33
        if( !toolButtonOption ) return contentsSize;
Packit 8e9c33
Packit 8e9c33
        // copy size
Packit 8e9c33
        QSize size = contentsSize;
Packit 8e9c33
Packit 8e9c33
        // get relevant state flags
Packit 8e9c33
        const State& state( option->state );
Packit 8e9c33
        bool autoRaise( state & State_AutoRaise );
Packit 8e9c33
        bool hasPopupMenu( toolButtonOption->features & QStyleOptionToolButton::MenuButtonPopup );
Packit 8e9c33
        const bool hasInlineIndicator(
Packit 8e9c33
            toolButtonOption->features&QStyleOptionToolButton::HasMenu
Packit 8e9c33
            && toolButtonOption->features&QStyleOptionToolButton::PopupDelay
Packit 8e9c33
            && !hasPopupMenu );
Packit 8e9c33
Packit 8e9c33
        int marginWidth( Metrics::Button_MarginWidth + Metrics::Frame_FrameWidth );
Packit 8e9c33
Packit 8e9c33
        if( hasInlineIndicator ) size.rwidth() += Metrics::ToolButton_InlineIndicatorWidth;
Packit 8e9c33
        size = expandSize( size, marginWidth );
Packit 8e9c33
Packit 8e9c33
        return size;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::menuBarItemSizeFromContents( const QStyleOption*, const QSize& contentsSize, const QWidget* ) const
Packit 8e9c33
    { return expandSize( contentsSize, Metrics::MenuBarItem_MarginWidth, Metrics::MenuBarItem_MarginHeight ); }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::menuItemSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionMenuItem* menuItemOption = qstyleoption_cast<const QStyleOptionMenuItem*>( option );
Packit 8e9c33
        if( !menuItemOption ) return contentsSize;
Packit 8e9c33
Packit 8e9c33
        /*
Packit 8e9c33
         * First calculate the intrinsic size of the item.
Packit 8e9c33
         * this must be kept consistent with what's in drawMenuItemControl
Packit 8e9c33
         */
Packit 8e9c33
        QSize size( contentsSize );
Packit 8e9c33
        switch( menuItemOption->menuItemType )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            case QStyleOptionMenuItem::Normal:
Packit 8e9c33
            case QStyleOptionMenuItem::DefaultItem:
Packit 8e9c33
            case QStyleOptionMenuItem::SubMenu:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                int iconWidth = 0;
Packit 8e9c33
                if( showIconsInMenuItems() ) iconWidth = isQtQuickControl( option, widget ) ? qMax( pixelMetric(PM_SmallIconSize, option, widget ), menuItemOption->maxIconWidth ) : menuItemOption->maxIconWidth;
Packit 8e9c33
Packit 8e9c33
                int leftColumnWidth( iconWidth );
Packit 8e9c33
Packit 8e9c33
                // add space with respect to text
Packit 8e9c33
                leftColumnWidth += Metrics::MenuItem_ItemSpacing;
Packit 8e9c33
Packit 8e9c33
                // add checkbox indicator width
Packit 8e9c33
                if( menuItemOption->menuHasCheckableItems )
Packit 8e9c33
                { leftColumnWidth += Metrics::CheckBox_Size + Metrics::MenuItem_ItemSpacing; }
Packit 8e9c33
Packit 8e9c33
                // add spacing for accelerator
Packit 8e9c33
                /*
Packit 8e9c33
                 * Note:
Packit 8e9c33
                 * The width of the accelerator itself is not included here since
Packit 8e9c33
                 * Qt will add that on separately after obtaining the
Packit 8e9c33
                 * sizeFromContents() for each menu item in the menu to be shown
Packit 8e9c33
                 * ( see QMenuPrivate::calcActionRects() )
Packit 8e9c33
                 */
Packit 8e9c33
                bool hasAccelerator( menuItemOption->text.indexOf( QLatin1Char( '\t' ) ) >= 0 );
Packit 8e9c33
                if( hasAccelerator ) size.rwidth() += Metrics::MenuItem_AcceleratorSpace;
Packit 8e9c33
Packit 8e9c33
                // right column
Packit 8e9c33
                int rightColumnWidth = Metrics::MenuButton_IndicatorWidth + Metrics::MenuItem_ItemSpacing;
Packit 8e9c33
                size.rwidth() += leftColumnWidth + rightColumnWidth;
Packit 8e9c33
Packit 8e9c33
                // make sure height is large enough for icon and arrow
Packit 8e9c33
                size.setHeight( qMax( size.height(), int(Metrics::MenuButton_IndicatorWidth) ) );
Packit 8e9c33
                size.setHeight( qMax( size.height(), int(Metrics::CheckBox_Size) ) );
Packit 8e9c33
                size.setHeight( qMax( size.height(), iconWidth ) );
Packit 8e9c33
                return expandSize( size, Metrics::MenuItem_MarginWidth );
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            case QStyleOptionMenuItem::Separator:
Packit 8e9c33
            {
Packit 8e9c33
Packit 8e9c33
                if( menuItemOption->text.isEmpty() && menuItemOption->icon.isNull() )
Packit 8e9c33
                {
Packit 8e9c33
Packit 8e9c33
                    return expandSize( QSize(0,1), Metrics::MenuItem_MarginWidth );
Packit 8e9c33
Packit 8e9c33
                } else {
Packit 8e9c33
Packit 8e9c33
                    // build toolbutton option
Packit 8e9c33
                    QStyleOptionToolButton toolButtonOption( separatorMenuItemOption( menuItemOption, widget ) );
Packit 8e9c33
Packit 8e9c33
                    // make sure height is large enough for icon and text
Packit 8e9c33
                    int iconWidth( menuItemOption->maxIconWidth );
Packit 8e9c33
                    int textHeight( menuItemOption->fontMetrics.height() );
Packit 8e9c33
                    if( !menuItemOption->icon.isNull() ) size.setHeight( qMax( size.height(), iconWidth ) );
Packit 8e9c33
                    if( !menuItemOption->text.isEmpty() )
Packit 8e9c33
                    {
Packit 8e9c33
                        size.setHeight( qMax( size.height(), textHeight ) );
Packit 8e9c33
                        size.setWidth( qMax( size.width(), menuItemOption->fontMetrics.width( menuItemOption->text ) ) );
Packit 8e9c33
                    }
Packit 8e9c33
Packit 8e9c33
                    return sizeFromContents( CT_ToolButton, &toolButtonOption, size, widget );
Packit 8e9c33
Packit 8e9c33
                }
Packit 8e9c33
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
            // for all other cases, return input
Packit 8e9c33
            default: return contentsSize;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::progressBarSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option
Packit 8e9c33
        const QStyleOptionProgressBar* progressBarOption( qstyleoption_cast<const QStyleOptionProgressBar*>( option ) );
Packit 8e9c33
        if( !progressBarOption ) return contentsSize;
Packit 8e9c33
Packit 8e9c33
        const QStyleOptionProgressBarV2* progressBarOption2( qstyleoption_cast<const QStyleOptionProgressBarV2*>( option ) );
Packit 8e9c33
        bool horizontal( !progressBarOption2 || progressBarOption2->orientation == Qt::Horizontal );
Packit 8e9c33
Packit 8e9c33
        // make local copy
Packit 8e9c33
        QSize size( contentsSize );
Packit 8e9c33
Packit 8e9c33
        if( horizontal )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            // check text visibility
Packit 8e9c33
            bool textVisible( progressBarOption->textVisible );
Packit 8e9c33
Packit 8e9c33
            size.setWidth( qMax( size.width(), int(Metrics::ProgressBar_Thickness) ) );
Packit 8e9c33
            size.setHeight( qMax( size.height(), int(Metrics::ProgressBar_Thickness) ) );
Packit 8e9c33
            if( textVisible ) size.setHeight( qMax( size.height(), option->fontMetrics.height() ) );
Packit 8e9c33
Packit 8e9c33
        } else {
Packit 8e9c33
Packit 8e9c33
            size.setHeight( qMax( size.height(), int(Metrics::ProgressBar_Thickness) ) );
Packit 8e9c33
            size.setWidth( qMax( size.width(), int(Metrics::ProgressBar_Thickness) ) );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return size;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::tabWidgetSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionTabWidgetFrame* tabOption = qstyleoption_cast<const QStyleOptionTabWidgetFrame*>( option );
Packit 8e9c33
        if( !tabOption ) return expandSize( contentsSize, Metrics::TabWidget_MarginWidth );
Packit 8e9c33
Packit 8e9c33
        // try find direct children of type QTabBar and QStackedWidget
Packit 8e9c33
        // this is needed in order to add TabWidget margins only if they are necessary around tabWidget content, not the tabbar
Packit 8e9c33
        if( !widget ) return expandSize( contentsSize, Metrics::TabWidget_MarginWidth );
Packit 8e9c33
        QTabBar* tabBar = nullptr;
Packit 8e9c33
        QStackedWidget* stack = nullptr;
Packit 8e9c33
        auto children( widget->children() );
Packit 8e9c33
        foreach( auto child, children )
Packit 8e9c33
        {
Packit 8e9c33
            if( !tabBar ) tabBar = qobject_cast<QTabBar*>( child );
Packit 8e9c33
            if( !stack ) stack = qobject_cast<QStackedWidget*>( child );
Packit 8e9c33
            if( tabBar && stack ) break;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        if( !( tabBar && stack ) ) return expandSize( contentsSize, Metrics::TabWidget_MarginWidth );
Packit 8e9c33
Packit 8e9c33
        // tab orientation
Packit 8e9c33
        bool verticalTabs( tabOption && isVerticalTab( tabOption->shape ) );
Packit 8e9c33
        if( verticalTabs )
Packit 8e9c33
        {
Packit 8e9c33
            int tabBarHeight = tabBar->minimumSizeHint().height();
Packit 8e9c33
            int stackHeight = stack->minimumSizeHint().height();
Packit 8e9c33
            if( contentsSize.height() == tabBarHeight && tabBarHeight + 2*(Metrics::Frame_FrameWidth - 1) >= stackHeight + 2*Metrics::TabWidget_MarginWidth ) return QSize( contentsSize.width() + 2*Metrics::TabWidget_MarginWidth, contentsSize.height() + 2*(Metrics::Frame_FrameWidth - 1) );
Packit 8e9c33
            else return expandSize( contentsSize, Metrics::TabWidget_MarginWidth );
Packit 8e9c33
Packit 8e9c33
        } else {
Packit 8e9c33
Packit 8e9c33
            int tabBarWidth = tabBar->minimumSizeHint().width();
Packit 8e9c33
            int stackWidth = stack->minimumSizeHint().width();
Packit 8e9c33
            if( contentsSize.width() == tabBarWidth && tabBarWidth + 2*(Metrics::Frame_FrameWidth - 1) >= stackWidth + 2*Metrics::TabWidget_MarginWidth) return QSize( contentsSize.width() + 2*(Metrics::Frame_FrameWidth - 1), contentsSize.height() + 2*Metrics::TabWidget_MarginWidth );
Packit 8e9c33
            else return expandSize( contentsSize, Metrics::TabWidget_MarginWidth );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::tabBarTabSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
        const QStyleOptionTab *tabOption( qstyleoption_cast<const QStyleOptionTab*>( option ) );
Packit 8e9c33
        const QStyleOptionTabV3 *tabOptionV3( qstyleoption_cast<const QStyleOptionTabV3*>( option ) );
Packit 8e9c33
        bool hasText( tabOption && !tabOption->text.isEmpty() );
Packit 8e9c33
        bool hasIcon( tabOption && !tabOption->icon.isNull() );
Packit 8e9c33
        bool hasLeftButton( tabOptionV3 && !tabOptionV3->leftButtonSize.isEmpty() );
Packit 8e9c33
        bool hasRightButton( tabOptionV3 && !tabOptionV3->leftButtonSize.isEmpty() );
Packit 8e9c33
Packit 8e9c33
        // calculate width increment for horizontal tabs
Packit 8e9c33
        int widthIncrement = 0;
Packit 8e9c33
        if( hasIcon && !( hasText || hasLeftButton || hasRightButton ) ) widthIncrement -= 4;
Packit 8e9c33
        if( hasText && hasIcon ) widthIncrement += Metrics::TabBar_TabItemSpacing;
Packit 8e9c33
        if( hasLeftButton && ( hasText || hasIcon ) )  widthIncrement += Metrics::TabBar_TabItemSpacing;
Packit 8e9c33
        if( hasRightButton && ( hasText || hasIcon || hasLeftButton ) )  widthIncrement += Metrics::TabBar_TabItemSpacing;
Packit 8e9c33
Packit 8e9c33
        // add margins
Packit 8e9c33
        QSize size( contentsSize );
Packit 8e9c33
Packit 8e9c33
        if ( hasText ) {
Packit 8e9c33
            widthIncrement += option->fontMetrics.width(tabOption->text) * 0.2;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // compare to minimum size
Packit 8e9c33
        bool verticalTabs( tabOption && isVerticalTab( tabOption ) );
Packit 8e9c33
        if( verticalTabs )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            size.rheight() += widthIncrement;
Packit 8e9c33
            if( hasIcon && !hasText ) size = size.expandedTo( QSize( Metrics::TabBar_TabMinHeight, 0 ) );
Packit 8e9c33
            else size = size.expandedTo( QSize( Metrics::TabBar_TabMinHeight, Metrics::TabBar_TabMinWidth ) );
Packit 8e9c33
Packit 8e9c33
        } else {
Packit 8e9c33
Packit 8e9c33
            size.rwidth() += widthIncrement;
Packit 8e9c33
            if( hasIcon && !hasText ) size = size.expandedTo( QSize( 0, Metrics::TabBar_TabMinHeight ) );
Packit 8e9c33
            else size = size.expandedTo( QSize( Metrics::TabBar_TabMinWidth, Metrics::TabBar_TabMinHeight ) );
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return size;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::headerSectionSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // cast option and check
Packit 8e9c33
        const QStyleOptionHeader* headerOption( qstyleoption_cast<const QStyleOptionHeader*>( option ) );
Packit 8e9c33
        if( !headerOption ) return contentsSize;
Packit 8e9c33
Packit 8e9c33
        // get text size
Packit 8e9c33
        bool horizontal( headerOption->orientation == Qt::Horizontal );
Packit 8e9c33
        bool hasText( !headerOption->text.isEmpty() );
Packit 8e9c33
        bool hasIcon( !headerOption->icon.isNull() );
Packit 8e9c33
Packit 8e9c33
        QSize textSize( hasText ? headerOption->fontMetrics.size( 0, headerOption->text ) : QSize() );
Packit 8e9c33
        QSize iconSize( hasIcon ? QSize( 22,22 ) : QSize() );
Packit 8e9c33
Packit 8e9c33
        // contents width
Packit 8e9c33
        int contentsWidth( 0 );
Packit 8e9c33
        if( hasText ) contentsWidth += textSize.width();
Packit 8e9c33
        if( hasIcon )
Packit 8e9c33
        {
Packit 8e9c33
            contentsWidth += iconSize.width();
Packit 8e9c33
            if( hasText ) contentsWidth += Metrics::Header_ItemSpacing;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // contents height
Packit 8e9c33
        int contentsHeight( headerOption->fontMetrics.height() );
Packit 8e9c33
        if( hasIcon ) contentsHeight = qMax( contentsHeight, iconSize.height() );
Packit 8e9c33
Packit 8e9c33
        if( horizontal )
Packit 8e9c33
        {
Packit 8e9c33
            // also add space for icon
Packit 8e9c33
            contentsWidth += Metrics::Header_ArrowSize + Metrics::Header_ItemSpacing;
Packit 8e9c33
            contentsHeight = qMax( contentsHeight, int(Metrics::Header_ArrowSize) );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        // update contents size, add margins and return
Packit 8e9c33
        QSize size( contentsSize.expandedTo( QSize( contentsWidth, contentsHeight ) ) );
Packit 8e9c33
        return expandSize( size, Metrics::Header_MarginWidth );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    QSize Style::itemViewItemSizeFromContents( const QStyleOption* option, const QSize& contentsSize, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
        // call base class
Packit 8e9c33
        QSize size( ParentStyleClass::sizeFromContents( CT_ItemViewItem, option, contentsSize, widget ) );
Packit 8e9c33
        return expandSize( size, Metrics::ItemView_ItemMarginWidth );
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________________________
Packit 8e9c33
    bool Style::drawFramePrimitive( const QStyleOption* option, QPainter* painter, const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // copy palette and rect
Packit 8e9c33
        const QPalette& palette( option->palette );
Packit 8e9c33
        const QRect& rect( option->rect );
Packit 8e9c33
Packit 8e9c33
        // detect title widgets
Packit 8e9c33
        const bool isTitleWidget(
Packit 8e9c33
            StyleConfigData::titleWidgetDrawFrame() &&
Packit 8e9c33
            widget &&
Packit 8e9c33
            widget->parent() &&
Packit 8e9c33
            widget->parent()->inherits( "KTitleWidget" ) );
Packit 8e9c33
Packit 8e9c33
        // copy state
Packit 8e9c33
        const State& state( option->state );
Packit 8e9c33
        if( !isTitleWidget && !( state & (State_Sunken | State_Raised ) ) ) return true;
Packit 8e9c33
Packit 8e9c33
        #if QT_VERSION >= 0x050000
Packit 8e9c33
        const bool isInputWidget( ( widget && widget->testAttribute( Qt::WA_Hover ) ) ||
<