Blame style/adwaitastyle.h

Packit 8e9c33
#ifndef adwaitastyle_h
Packit 8e9c33
#define adwaitastyle_h
Packit 8e9c33
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 "adwaita.h"
Packit 8e9c33
#include "config-adwaita.h"
Packit 8e9c33
Packit 8e9c33
#if ADWAITA_USE_KDE4
Packit 8e9c33
#include "kstylekde4compat.h"
Packit 8e9c33
#endif
Packit 8e9c33
Packit 8e9c33
#include <QAbstractItemView>
Packit 8e9c33
#include <QAbstractScrollArea>
Packit 8e9c33
Packit 8e9c33
#include <QCommonStyle>
Packit 8e9c33
#include <QDockWidget>
Packit 8e9c33
#include <QHash>
Packit 8e9c33
#include <QIcon>
Packit 8e9c33
#include <QMdiSubWindow>
Packit 8e9c33
#include <QStyleOption>
Packit 8e9c33
#include <QWidget>
Packit 8e9c33
Packit 8e9c33
#if QT_VERSION >= 0x050000
Packit 8e9c33
#include <QCommandLinkButton>
Packit 8e9c33
#endif
Packit 8e9c33
Packit 8e9c33
namespace AdwaitaPrivate
Packit 8e9c33
{
Packit 8e9c33
    class TabBarData;
Packit 8e9c33
}
Packit 8e9c33
Packit 8e9c33
namespace Adwaita
Packit 8e9c33
{
Packit 8e9c33
Packit 8e9c33
    class Animations;
Packit 8e9c33
    class Helper;
Packit 8e9c33
    class Mnemonics;
Packit 8e9c33
    class SplitterFactory;
Packit 8e9c33
    class WidgetExplorer;
Packit 8e9c33
    class WindowManager;
Packit 8e9c33
Packit 8e9c33
    //* convenience typedef for base class
Packit 8e9c33
    #if ADWAITA_USE_KDE4
Packit 8e9c33
    using ParentStyleClass = KStyleKDE4Compat;
Packit 8e9c33
    #else
Packit 8e9c33
    using ParentStyleClass = QCommonStyle;
Packit 8e9c33
    #endif
Packit 8e9c33
Packit 8e9c33
    //* base class for adwaita style
Packit 8e9c33
    /** it is responsible to draw all the primitives to be displayed on screen, on request from Qt paint engine */
Packit 8e9c33
    class Style: public ParentStyleClass
Packit 8e9c33
    {
Packit 8e9c33
        Q_OBJECT
Packit 8e9c33
Packit 8e9c33
        /* this tells kde applications that custom style elements are supported, using the kstyle mechanism */
Packit 8e9c33
        Q_CLASSINFO ("X-KDE-CustomElements", "true")
Packit 8e9c33
Packit 8e9c33
        public:
Packit 8e9c33
Packit 8e9c33
        //* constructor
Packit 8e9c33
        explicit Style( bool dark );
Packit 8e9c33
Packit 8e9c33
        //* destructor
Packit 8e9c33
        virtual ~Style( void );
Packit 8e9c33
Packit 8e9c33
        //* needed to avoid warnings at compilation time
Packit 8e9c33
        using  ParentStyleClass::polish;
Packit 8e9c33
        using  ParentStyleClass::unpolish;
Packit 8e9c33
Packit 8e9c33
        //* widget polishing
Packit 8e9c33
        virtual void polish( QWidget* );
Packit 8e9c33
Packit 8e9c33
        //* widget unpolishing
Packit 8e9c33
        virtual void unpolish( QWidget* );
Packit 8e9c33
Packit 8e9c33
        //* palette polishing
Packit 8e9c33
        virtual void polish( QPalette &palette );
Packit 8e9c33
Packit 8e9c33
        //* polish scrollarea
Packit 8e9c33
        void polishScrollArea( QAbstractScrollArea* );
Packit 8e9c33
Packit 8e9c33
        //* pixel metrics
Packit 8e9c33
        virtual int pixelMetric(PixelMetric, const QStyleOption* = nullptr, const QWidget* = nullptr) const;
Packit 8e9c33
Packit 8e9c33
        //* style hints
Packit 8e9c33
        virtual int styleHint(StyleHint, const QStyleOption* = nullptr, const QWidget* = nullptr, QStyleHintReturn* = nullptr) const;
Packit 8e9c33
Packit 8e9c33
        //* returns rect corresponding to one widget's subelement
Packit 8e9c33
        virtual QRect subElementRect( SubElement, const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* returns rect corresponding to one widget's subcontrol
Packit 8e9c33
        virtual QRect subControlRect( ComplexControl, const QStyleOptionComplex*, SubControl, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* returns size matching contents
Packit 8e9c33
        QSize sizeFromContents( ContentsType, const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* returns which subcontrol given QPoint corresponds to
Packit 8e9c33
        SubControl hitTestComplexControl( ComplexControl, const QStyleOptionComplex*, const QPoint&, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* primitives
Packit 8e9c33
        void drawPrimitive( PrimitiveElement, const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* controls
Packit 8e9c33
        void drawControl( ControlElement, const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* complex controls
Packit 8e9c33
        void drawComplexControl( ComplexControl, const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* generic text rendering
Packit 8e9c33
        virtual void drawItemText(
Packit 8e9c33
            QPainter*, const QRect&, int alignment, const QPalette&, bool enabled,
Packit 8e9c33
            const QString&, QPalette::ColorRole = QPalette::NoRole) const;
Packit 8e9c33
Packit 8e9c33
        //*@name event filters
Packit 8e9c33
        //@{
Packit 8e9c33
Packit 8e9c33
        virtual bool eventFilter(QObject *, QEvent *);
Packit 8e9c33
        bool eventFilterScrollArea( QWidget*, QEvent* );
Packit 8e9c33
        bool eventFilterComboBoxContainer( QWidget*, QEvent* );
Packit 8e9c33
        bool eventFilterDockWidget( QDockWidget*, QEvent* );
Packit 8e9c33
        bool eventFilterMdiSubWindow( QMdiSubWindow*, QEvent* );
Packit 8e9c33
Packit 8e9c33
        #if QT_VERSION >= 0x050000
Packit 8e9c33
        bool eventFilterCommandLinkButton( QCommandLinkButton*, QEvent* );
Packit 8e9c33
        #endif
Packit 8e9c33
Packit 8e9c33
        //* install event filter to object, in a unique way
Packit 8e9c33
        void addEventFilter( QObject* object )
Packit 8e9c33
        {
Packit 8e9c33
            object->removeEventFilter( this );
Packit 8e9c33
            object->installEventFilter( this );
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        protected Q_SLOTS:
Packit 8e9c33
Packit 8e9c33
        //* update configuration
Packit 8e9c33
        void configurationChanged( void );
Packit 8e9c33
Packit 8e9c33
        //* standard icons
Packit 8e9c33
        virtual QIcon standardIconImplementation( StandardPixmap, const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        protected:
Packit 8e9c33
Packit 8e9c33
        //* standard icons
Packit 8e9c33
        virtual QIcon standardIcon( StandardPixmap pixmap, const QStyleOption* option = nullptr, const QWidget* widget = nullptr) const
Packit 8e9c33
        { return standardIconImplementation( pixmap, option, widget ); }
Packit 8e9c33
Packit 8e9c33
        //* load configuration
Packit 8e9c33
        void loadConfiguration();
Packit 8e9c33
Packit 8e9c33
        //*@name subelementRect specialized functions
Packit 8e9c33
        //@{
Packit 8e9c33
Packit 8e9c33
        //* default implementation. Does not change anything
Packit 8e9c33
        QRect defaultSubElementRect( const QStyleOption* option, const QWidget* ) const
Packit 8e9c33
        { return option->rect; }
Packit 8e9c33
Packit 8e9c33
        QRect pushButtonContentsRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect pushButtonFocusRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect checkBoxContentsRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect checkBoxIndicatorRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect checkBoxFocusRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect lineEditContentsRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect progressBarGrooveRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect progressBarContentsRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect progressBarLabelRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect headerArrowRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect headerLabelRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect sliderFocusRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect tabBarTabLeftButtonRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect tabBarTabRightButtonRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect tabWidgetTabBarRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect tabWidgetTabContentsRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect tabWidgetTabPaneRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect tabWidgetCornerRect( SubElement, const QStyleOption*, const QWidget* widget ) const;
Packit 8e9c33
        QRect toolBoxTabContentsRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
        QRect genericLayoutItemRect( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //*@name subcontrol Rect specialized functions
Packit 8e9c33
        //@{
Packit 8e9c33
Packit 8e9c33
        QRect groupBoxSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
Packit 8e9c33
        QRect toolButtonSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
Packit 8e9c33
        QRect comboBoxSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
Packit 8e9c33
        QRect spinBoxSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
Packit 8e9c33
        QRect scrollBarInternalSubControlRect( const QStyleOptionComplex*, SubControl ) const;
Packit 8e9c33
        QRect scrollBarSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
Packit 8e9c33
        QRect dialSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
Packit 8e9c33
        QRect sliderSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //*@name sizeFromContents
Packit 8e9c33
        //@{
Packit 8e9c33
        QSize defaultSizeFromContents( const QStyleOption*, const QSize& size, const QWidget* ) const
Packit 8e9c33
        { return size; }
Packit 8e9c33
Packit 8e9c33
        QSize checkBoxSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize lineEditSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize comboBoxSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize spinBoxSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize sliderSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize pushButtonSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize toolButtonSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize menuBarItemSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize menuItemSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize progressBarSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize tabWidgetSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize tabBarTabSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize headerSectionSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
        QSize itemViewItemSizeFromContents( const QStyleOption*, const QSize&, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //*@name primitives specialized functions
Packit 8e9c33
        //@{
Packit 8e9c33
Packit 8e9c33
        bool emptyPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const
Packit 8e9c33
        { return true; }
Packit 8e9c33
Packit 8e9c33
        bool drawFramePrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawFrameLineEditPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawFrameFocusRectPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawFrameMenuPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawFrameGroupBoxPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawFrameTabWidgetPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawFrameTabBarBasePrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawFrameWindowPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        bool drawIndicatorArrowUpPrimitive( const QStyleOption* option, QPainter* painter, const QWidget* widget ) const
Packit 8e9c33
        { return drawIndicatorArrowPrimitive( ArrowUp, option, painter, widget ); }
Packit 8e9c33
Packit 8e9c33
        bool drawIndicatorArrowDownPrimitive( const QStyleOption* option, QPainter* painter, const QWidget* widget ) const
Packit 8e9c33
        { return drawIndicatorArrowPrimitive( ArrowDown, option, painter, widget ); }
Packit 8e9c33
Packit 8e9c33
        bool drawIndicatorArrowLeftPrimitive( const QStyleOption* option, QPainter* painter, const QWidget* widget ) const
Packit 8e9c33
        { return drawIndicatorArrowPrimitive( ArrowLeft, option, painter, widget ); }
Packit 8e9c33
Packit 8e9c33
        bool drawIndicatorArrowRightPrimitive( const QStyleOption* option, QPainter* painter, const QWidget* widget ) const
Packit 8e9c33
        { return drawIndicatorArrowPrimitive( ArrowRight, option, painter, widget ); }
Packit 8e9c33
Packit 8e9c33
        bool drawIndicatorArrowPrimitive( ArrowOrientation, const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawIndicatorHeaderArrowPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawPanelButtonCommandPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawPanelButtonToolPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawTabBarPanelButtonToolPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawPanelScrollAreaCornerPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawPanelMenuPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawPanelTipLabelPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawPanelItemViewItemPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawIndicatorCheckBoxPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawIndicatorRadioButtonPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawIndicatorButtonDropDownPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawIndicatorTabClosePrimitive( const QStyleOption*, QPainter* painter, const QWidget* widget ) const;
Packit 8e9c33
        bool drawIndicatorTabTearPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawIndicatorToolBarHandlePrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawIndicatorToolBarSeparatorPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawIndicatorBranchPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //*@name controls specialized functions
Packit 8e9c33
        //@{
Packit 8e9c33
Packit 8e9c33
        bool emptyControl( const QStyleOption*, QPainter*, const QWidget* ) const
Packit 8e9c33
        { return true; }
Packit 8e9c33
Packit 8e9c33
        virtual bool drawPushButtonLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawToolButtonLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawCheckBoxLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawComboBoxLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawMenuBarEmptyArea( const QStyleOption*, QPainter* , const QWidget*) const;
Packit 8e9c33
        virtual bool drawMenuBarItemControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawMenuEmptyAreaControl( const QStyleOption*, QPainter* , const QWidget*) const;
Packit 8e9c33
        virtual bool drawMenuItemControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawProgressBarControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawProgressBarContentsControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawProgressBarGrooveControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawProgressBarLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawScrollBarSliderControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawScrollBarAddLineControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawScrollBarSubLineControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawShapedFrameControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawRubberBandControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawHeaderSectionControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawHeaderLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawHeaderEmptyAreaControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawTabBarTabLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawTabBarTabShapeControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawToolBoxTabLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawToolBoxTabShapeControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        virtual bool drawDockWidgetTitleControl( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //*@}
Packit 8e9c33
Packit 8e9c33
        //*@name complex ontrols specialized functions
Packit 8e9c33
        //@{
Packit 8e9c33
        bool drawGroupBoxComplexControl( const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawToolButtonComplexControl( const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawComboBoxComplexControl( const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawSpinBoxComplexControl( const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawSliderComplexControl( const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawDialComplexControl( const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawScrollBarComplexControl( const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        bool drawTitleBarComplexControl( const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //!*@name various utilty functions
Packit 8e9c33
        //@{
Packit 8e9c33
Packit 8e9c33
        //* spinbox arrows
Packit 8e9c33
        void renderSpinBoxArrow( const SubControl&, const QStyleOptionSpinBox*, QPainter*, const QWidget*) const;
Packit 8e9c33
Packit 8e9c33
        //* menu title
Packit 8e9c33
        void renderMenuTitle( const QStyleOptionToolButton*, QPainter*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* return dial angle based on option and value
Packit 8e9c33
        qreal dialAngle( const QStyleOptionSlider*, int ) const;
Packit 8e9c33
Packit 8e9c33
        //* returns relevant scrollbar parent
Packit 8e9c33
        /** needed to detect parent focus */
Packit 8e9c33
        const QWidget* scrollBarParent( const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* returns true if given scrollbar arrow is animated
Packit 8e9c33
        QColor scrollBarArrowColor( const QStyleOptionSlider*, const SubControl&, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* scrollbar buttons
Packit 8e9c33
        enum ScrollBarButtonType
Packit 8e9c33
        {
Packit 8e9c33
            NoButton,
Packit 8e9c33
            SingleButton,
Packit 8e9c33
            DoubleButton
Packit 8e9c33
        };
Packit 8e9c33
Packit 8e9c33
        //* returns height for scrollbar buttons depending of button types
Packit 8e9c33
        int scrollBarButtonHeight( const ScrollBarButtonType& type ) const
Packit 8e9c33
        {
Packit 8e9c33
            switch( type )
Packit 8e9c33
            {
Packit 8e9c33
                case NoButton: return Metrics::ScrollBar_NoButtonHeight;
Packit 8e9c33
                case SingleButton: return Metrics::ScrollBar_SingleButtonHeight;
Packit 8e9c33
                case DoubleButton: return Metrics::ScrollBar_DoubleButtonHeight;
Packit 8e9c33
                default: return 0;
Packit 8e9c33
            }
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //* translucent background
Packit 8e9c33
        void setTranslucentBackground( QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        /**
Packit 8e9c33
        separator can have a title and an icon
Packit 8e9c33
        in that case they are rendered as sunken flat toolbuttons
Packit 8e9c33
        return toolbutton option that matches named separator menu items
Packit 8e9c33
        */
Packit 8e9c33
        QStyleOptionToolButton separatorMenuItemOption( const QStyleOptionMenuItem*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* create toolbar extension icon
Packit 8e9c33
        QIcon toolBarExtensionIcon( StandardPixmap, const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* create title bar button icon
Packit 8e9c33
        QIcon titleBarButtonIcon( StandardPixmap, const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* returns item view parent if any
Packit 8e9c33
        /** needed to have correct color on focused checkboxes and radiobuttons */
Packit 8e9c33
        const QAbstractItemView* itemViewParent( const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* returns true if a given widget is a selected item in a focused list
Packit 8e9c33
        /**
Packit 8e9c33
        This is necessary to have the correct colors used for e.g. checkboxes and radiobuttons in lists
Packit 8e9c33
        @param widget The widget to be checked
Packit 8e9c33
        @param position Used to find the relevant QModelIndex
Packit 8e9c33
        */
Packit 8e9c33
        bool isSelectedItem( const QWidget*, const QPoint& ) const;
Packit 8e9c33
Packit 8e9c33
        //* return true if option corresponds to QtQuick control
Packit 8e9c33
        bool isQtQuickControl( const QStyleOption*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //* adjust rect based on provided margins
Packit 8e9c33
        QRect insideMargin( const QRect& r, int margin ) const
Packit 8e9c33
        { return insideMargin( r, margin, margin ); }
Packit 8e9c33
Packit 8e9c33
        //* adjust rect based on provided margins
Packit 8e9c33
        QRect insideMargin( const QRect& r, int marginWidth, int marginHeight ) const
Packit 8e9c33
        { return r.adjusted( marginWidth, marginHeight, -marginWidth, -marginHeight ); }
Packit 8e9c33
Packit 8e9c33
        //* expand size based on margins
Packit 8e9c33
        QSize expandSize( const QSize& size, int margin ) const
Packit 8e9c33
        { return expandSize( size, margin, margin ); }
Packit 8e9c33
Packit 8e9c33
        //* expand size based on margins
Packit 8e9c33
        QSize expandSize( const QSize& size, int marginWidth, int marginHeight ) const
Packit 8e9c33
        { return size + 2*QSize( marginWidth, marginHeight ); }
Packit 8e9c33
Packit 8e9c33
        //* returns true for vertical tabs
Packit 8e9c33
        bool isVerticalTab( const QStyleOptionTab* option ) const
Packit 8e9c33
        { return isVerticalTab( option->shape ); }
Packit 8e9c33
Packit 8e9c33
        bool isVerticalTab( const QTabBar::Shape& shape ) const
Packit 8e9c33
        {
Packit 8e9c33
            return shape == QTabBar::RoundedEast
Packit 8e9c33
                || shape == QTabBar::RoundedWest
Packit 8e9c33
                || shape == QTabBar::TriangularEast
Packit 8e9c33
                || shape == QTabBar::TriangularWest;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        //* right to left alignment handling
Packit 8e9c33
        using ParentStyleClass::visualRect;
Packit 8e9c33
        QRect visualRect(const QStyleOption* opt, const QRect& subRect) const
Packit 8e9c33
        { return ParentStyleClass::visualRect(opt->direction, opt->rect, subRect); }
Packit 8e9c33
Packit 8e9c33
        //* centering
Packit 8e9c33
        QRect centerRect(const QRect &rect, const QSize& size ) const
Packit 8e9c33
        { return centerRect( rect, size.width(), size.height() ); }
Packit 8e9c33
Packit 8e9c33
        QRect centerRect(const QRect &rect, int width, int height) const
Packit 8e9c33
        { return QRect(rect.left() + (rect.width() - width)/2, rect.top() + (rect.height() - height)/2, width, height); }
Packit 8e9c33
Packit 8e9c33
        /*
Packit 8e9c33
        Checks whether the point is before the bound rect for bound of given orientation.
Packit 8e9c33
        This is needed to implement custom number of buttons in scrollbars,
Packit 8e9c33
        as well as proper mouse-hover
Packit 8e9c33
        */
Packit 8e9c33
        inline bool preceeds( const QPoint&, const QRect&, const QStyleOption* ) const;
Packit 8e9c33
Packit 8e9c33
        //* return which arrow button is hit by point for scrollbar double buttons
Packit 8e9c33
        inline QStyle::SubControl scrollBarHitTest( const QRect&, const QPoint&, const QStyleOption* ) const;
Packit 8e9c33
Packit 8e9c33
        //! return true if one of the widget's parent inherits requested type
Packit 8e9c33
        inline bool hasParent( const QWidget*, const char* ) const;
Packit 8e9c33
Packit 8e9c33
        //* return true if one of the widget's parent inherits requested type
Packit 8e9c33
        template<typename T> bool hasParent( const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* return true if icons should be shown in menus
Packit 8e9c33
        bool showIconsInMenuItems( void ) const;
Packit 8e9c33
Packit 8e9c33
        //* return true if icons should be shown on buttons
Packit 8e9c33
        bool showIconsOnPushButtons( void ) const;
Packit 8e9c33
Packit 8e9c33
        //* return true if passed widget is a menu title (KMenu::addTitle)
Packit 8e9c33
        bool isMenuTitle( const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* return true if passed widget is a menu title (KMenu::addTitle)
Packit 8e9c33
        bool hasAlteredBackground( const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        private:
Packit 8e9c33
Packit 8e9c33
        //*@name scrollbar button types (for addLine and subLine )
Packit 8e9c33
        //@{
Packit 8e9c33
        ScrollBarButtonType _addLineButtons;
Packit 8e9c33
        ScrollBarButtonType _subLineButtons;
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //* helper
Packit 8e9c33
        Helper* _helper;
Packit 8e9c33
Packit 8e9c33
        //* animations
Packit 8e9c33
        Animations* _animations;
Packit 8e9c33
Packit 8e9c33
        //* keyboard accelerators
Packit 8e9c33
        Mnemonics* _mnemonics;
Packit 8e9c33
Packit 8e9c33
        //* window manager
Packit 8e9c33
        WindowManager* _windowManager;
Packit 8e9c33
Packit 8e9c33
        //* splitter Factory, to extend splitters hit area
Packit 8e9c33
        SplitterFactory* _splitterFactory;
Packit 8e9c33
Packit 8e9c33
        //* widget explorer
Packit 8e9c33
        WidgetExplorer* _widgetExplorer;
Packit 8e9c33
Packit 8e9c33
        //* tabbar data
Packit 8e9c33
        AdwaitaPrivate::TabBarData* _tabBarData;
Packit 8e9c33
Packit 8e9c33
        //* icon hash
Packit 8e9c33
        using IconCache = QHash<StandardPixmap, QIcon>;
Packit 8e9c33
        IconCache _iconCache;
Packit 8e9c33
Packit 8e9c33
        //* pointer to primitive specialized function
Packit 8e9c33
        using StylePrimitive = bool(Style::*)(const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
        StylePrimitive _frameFocusPrimitive = nullptr;
Packit 8e9c33
Packit 8e9c33
        //* pointer to control specialized function
Packit 8e9c33
        using StyleControl = bool (Style::*)( const QStyleOption*, QPainter*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //* pointer to control specialized function
Packit 8e9c33
        using StyleComplexControl = bool (Style::*)( const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
Packit 8e9c33
Packit 8e9c33
        //*@name custom elements
Packit 8e9c33
        //@{
Packit 8e9c33
Packit 8e9c33
        //* use Argb Drag and Drop Window
Packit 8e9c33
        QStyle::StyleHint SH_ArgbDndWindow;
Packit 8e9c33
Packit 8e9c33
        //! styled painting for KCapacityBar
Packit 8e9c33
        QStyle::ControlElement CE_CapacityBar;
Packit 8e9c33
Packit 8e9c33
        bool _dark { false };
Packit 8e9c33
Packit 8e9c33
        bool _isGNOME { false };
Packit 8e9c33
        bool _isKDE { false };
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
    };
Packit 8e9c33
Packit 8e9c33
    //_________________________________________________________________________
Packit 8e9c33
    bool Style::preceeds( const QPoint& point, const QRect& bound, const QStyleOption* option ) const
Packit 8e9c33
    {
Packit 8e9c33
        if( option->state&QStyle::State_Horizontal)
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            if( option->direction == Qt::LeftToRight) return point.x() < bound.right();
Packit 8e9c33
            else return point.x() > bound.x();
Packit 8e9c33
Packit 8e9c33
        } else return point.y() < bound.y();
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_________________________________________________________________________
Packit 8e9c33
    QStyle::SubControl Style::scrollBarHitTest( const QRect& rect, const QPoint& point, const QStyleOption* option ) const
Packit 8e9c33
    {
Packit 8e9c33
        if( option->state & QStyle::State_Horizontal)
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            if( option->direction == Qt::LeftToRight ) return point.x() < rect.center().x() ? QStyle::SC_ScrollBarSubLine : QStyle::SC_ScrollBarAddLine;
Packit 8e9c33
            else return point.x() > rect.center().x() ? QStyle::SC_ScrollBarSubLine : QStyle::SC_ScrollBarAddLine;
Packit 8e9c33
Packit 8e9c33
        } else return point.y() < rect.center().y() ? QStyle::SC_ScrollBarSubLine : QStyle::SC_ScrollBarAddLine;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_________________________________________________________________________
Packit 8e9c33
    bool Style::hasParent( const QWidget* widget, const char* className ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        if( !widget ) return false;
Packit 8e9c33
Packit 8e9c33
        while( (widget = widget->parentWidget()) )
Packit 8e9c33
        { if( widget->inherits( className ) ) return true; }
Packit 8e9c33
Packit 8e9c33
        return false;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_________________________________________________________________________
Packit 8e9c33
    template< typename T > bool Style::hasParent( const QWidget* widget ) const
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        if( !widget ) return false;
Packit 8e9c33
Packit 8e9c33
        while( (widget = widget->parentWidget()) )
Packit 8e9c33
        { if( qobject_cast<const T*>( widget ) ) return true; }
Packit 8e9c33
Packit 8e9c33
        return false;
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
}
Packit 8e9c33
Packit 8e9c33
#endif