MuseScore/mstyle/mstyle.h
2014-10-02 19:55:18 +02:00

740 lines
37 KiB
C++

//=============================================================================
// MuseScore
// Linux Music Score Editor
// $Id:$
//
// Copyright (C) 2010 Werner Schweer and others
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//=============================================================================
#ifndef __MSTYLE_H__
#define __MSTYLE_H__
#include "tileset.h"
#include "stylehelper.h"
class StyleHelper;
class FrameShadowFactory;
class WidgetExplorer;
class Animations;
class Transitions;
//---------------------------------------------------------
// MgStyle
//---------------------------------------------------------
class MgStyle : public QCommonStyle {
Q_OBJECT
//! arrow orientation
enum ArrowOrientation {
ArrowNone, ArrowUp, ArrowDown, ArrowLeft, ArrowRight
};
//! get polygon corresponding to generic arrow
enum ArrowSize {
ArrowNormal, ArrowSmall, ArrowTiny
};
//! internal option flags to pass arguments around
enum StyleOption {
Sunken = 0x1,
Focus = 0x2,
Hover = 0x4,
Disabled = 0x8,
NoFill = 0x10,
SubtleShadow = 0x20
};
Q_DECLARE_FLAGS(StyleOptions, StyleOption)
//! used to store slab characteristics
class SlabRect {
public:
//! constructor
SlabRect(void): _tiles( TileSet::Ring ) {}
//! constructor
SlabRect( const QRect& r, const int& tiles ): _r( r ), _tiles( TileSet::Tiles( tiles ) ) {}
QRect _r;
TileSet::Tiles _tiles;
};
//! list of slabs
typedef QList<SlabRect> SlabRectList;
/*!
tabBar data class needed for
the rendering of tabbars when
one tab is being drawn
*/
class TabBarData: public QObject {
QWeakPointer<const MgStyle> _style; //! pointer to parent style object
QWeakPointer<const QWidget> _tabBar; //! pointer to target tabBar
bool _dirty; //! if true, will paint on next TabBarTabShapeControlCall
public:
TabBarData(MgStyle* parent):
QObject(parent),
_style(parent),
_dirty(false)
{}
virtual ~TabBarData() {}
//! assign target tabBar
void lock(const QWidget* widget) {
_tabBar = widget;
}
//! true if tabbar is locked
bool locks( const QWidget* widget ) const {
return _tabBar && _tabBar.data() == widget;
}
void setDirty(const bool& value = true) {
_dirty = value;
}
void release() {
_tabBar.clear();
}
virtual void drawTabBarBaseControl(const QStyleOptionTab*, QPainter*, const QWidget*);
};
bool emptyControl(const QStyleOption*, QPainter*, const QWidget*) const {
return true;
}
bool drawMenuBarItem(const QStyleOption*, QPainter*, const QWidget*) const;
//! metrics
/*! these are copied from the old KStyle WidgetProperties */
enum InternalMetrics {
GlowWidth = 1,
// checkbox. Do not change, unless
// changing the actual cached pixmap size
CheckBox_Size = 21,
CheckBox_BoxTextSpace = 4,
// combobox
ComboBox_FrameWidth = 3,
ComboBox_ButtonWidth = 19,
ComboBox_ButtonMargin = 2,
ComboBox_ButtonMargin_Left = 0,
ComboBox_ButtonMargin_Right = 4,
ComboBox_ButtonMargin_Top = 2,
ComboBox_ButtonMargin_Bottom = 1,
ComboBox_ContentsMargin = 0,
ComboBox_ContentsMargin_Left = 2,
ComboBox_ContentsMargin_Right = 0,
ComboBox_ContentsMargin_Top = 0,
ComboBox_ContentsMargin_Bottom = 0,
// dockwidgets
DockWidget_FrameWidth = 0,
DockWidget_SeparatorExtend = 3,
DockWidget_TitleMargin = 3,
// generic frames
Frame_FrameWidth = 3,
// group boxes
GroupBox_FrameWidth = 3,
// header
Header_TextToIconSpace = 3,
Header_ContentsMargin = 3,
// line edit
LineEdit_FrameWidth = 3,
// menu item
MenuItem_AccelSpace = 16,
MenuItem_ArrowWidth = 11,
MenuItem_ArrowSpace = 3,
MenuItem_CheckWidth = 16,
MenuItem_CheckSpace = 3,
MenuItem_IconWidth = 12,
MenuItem_IconSpace = 3,
MenuItem_Margin = 2,
MenuItem_MinHeight = 20,
// menu bar item
MenuBarItem_Margin = 3,
MenuBarItem_Margin_Left = 5,
MenuBarItem_Margin_Right = 5,
// pushbuttons
PushButton_ContentsMargin = 5,
PushButton_ContentsMargin_Left = 8,
PushButton_ContentsMargin_Top = -1,
PushButton_ContentsMargin_Right = 8,
PushButton_ContentsMargin_Bottom = 0,
PushButton_MenuIndicatorSize = 8,
PushButton_TextToIconSpace = 6,
// progress bar
ProgressBar_BusyIndicatorSize = 10,
ProgressBar_GrooveMargin = 2,
// scrollbar
ScrollBar_MinimumSliderHeight = 21,
// spin boxes
SpinBox_FrameWidth = 3,
SpinBox_ButtonWidth = 19,
SpinBox_ButtonMargin = 0,
SpinBox_ButtonMargin_Left = 2,
SpinBox_ButtonMargin_Right = 6,
SpinBox_ButtonMargin_Top = 4,
SpinBox_ButtonMargin_Bottom = 2,
// splitter
Splitter_Width = 3,
// tabs
TabBar_BaseOverlap = 7,
TabBar_BaseHeight = 2,
TabBar_ScrollButtonWidth = 18,
TabBar_TabContentsMargin = 4,
TabBar_TabContentsMargin_Left = 5,
TabBar_TabContentsMargin_Right = 5,
TabBar_TabContentsMargin_Top = 2,
TabBar_TabContentsMargin_Bottom = 4,
TabBar_TabOverlap = 0,
TabWidget_ContentsMargin = 4,
// toolbuttons
ToolButton_ContentsMargin = 4,
ToolButton_InlineMenuIndicatorSize = 8,
ToolButton_InlineMenuIndicatorXOff = -11,
ToolButton_InlineMenuIndicatorYOff = -10,
ToolButton_MenuIndicatorSize = 11,
Tree_MaxExpanderSize = 9
};
//! scrollbar buttons
enum ScrollBarButtonType {
NoButton,
SingleButton,
DoubleButton
};
//! returns height for scrollbar buttons depending of button types
int scrollBarButtonHeight( const ScrollBarButtonType& type ) const {
switch ( type ) {
case NoButton:
return _noButtonHeight;
case SingleButton:
return _singleButtonHeight;
case DoubleButton:
return _doubleButtonHeight;
default:
return 0;
}
}
//! adjusted slabRect
inline void adjustSlabRect( SlabRect& slab, const QRect&, bool documentMode, bool vertical ) const;
//! qdial slab
void renderDialSlab( QPainter* p, const QRect& r, const QColor& c, const QStyleOption* option, StyleOptions opts = 0 ) const {
renderDialSlab( p, r, c, option, opts, -1, AnimationNone );
}
//! qdial slab
void renderDialSlab( QPainter*, const QRect&, const QColor&, const QStyleOption*, StyleOptions, qreal, AnimationMode ) const;
//! generic button slab
void renderButtonSlab( QPainter* p, QRect r, const QColor& c, StyleOptions opts = 0, TileSet::Tiles tiles = TileSet::Ring) const {
renderButtonSlab( p, r, c, opts, -1, AnimationNone, tiles );
}
//! generic button slab
void renderButtonSlab( QPainter*, QRect, const QColor&, StyleOptions, qreal, AnimationMode, TileSet::Tiles ) const;
//! generic slab
void renderSlab( QPainter* painter, const SlabRect& slab, const QColor& color, StyleOptions options = 0 ) const {
renderSlab( painter, slab._r, color, options, slab._tiles );
}
//! generic slab
void renderSlab( QPainter* painter, QRect rect, const QColor& color, StyleOptions options = 0, TileSet::Tiles tiles = TileSet::Ring) const {
renderSlab( painter, rect, color, options, -1, AnimationNone, tiles );
}
//! generic slab
void renderSlab( QPainter* painter, const SlabRect& slab, const QColor& color, StyleOptions options, qreal opacity, AnimationMode mode ) const {
renderSlab( painter, slab._r, color, options, opacity, mode, slab._tiles );
}
//! generic slab
void renderSlab( QPainter*, QRect, const QColor&, StyleOptions, qreal, AnimationMode, TileSet::Tiles ) const;
// render tab background
void renderTabBackground( QPainter*, const QRect&, const QPalette&, const QTabBar::Shape, const QWidget* ) const;
//! tab background
/*! this paints window background behind tab when tab is being dragged */
void fillTabBackground( QPainter*, const QRect&, const QColor&, const QTabBar::Shape, const QWidget* ) const;
//! tab filling
void fillTab( QPainter*, const QRect&, const QColor&, const QTabBar::Shape, bool active ) const;
// scrollbar button types (for addLine and subLine )
ScrollBarButtonType _addLineButtons;
ScrollBarButtonType _subLineButtons;
// metrics for scrollbar buttons
int _noButtonHeight;
int _singleButtonHeight;
int _doubleButtonHeight;
// mnemonic state
Qt::TextFlag _mnemonic;
StyleHelper _helper;
Animations* _animations;
Transitions* _transitions;
// WindowManager* _windowManager;
FrameShadowFactory* _frameShadowFactory;
//! widget explorer
// WidgetExplorer* _widgetExplorer;
//! tabBar data
TabBarData* _tabBarData;
//! pointer to primitive specialized function
typedef bool (MgStyle::*StylePrimitive)( const QStyleOption*, QPainter*, const QWidget* ) const;
StylePrimitive _frameFocusPrimitive;
//! pointer to control specialized function
typedef bool (MgStyle::*StyleControl)( const QStyleOption*, QPainter*, const QWidget* ) const;
StyleControl _tabBarTabShapeControl;
//! pointer to control specialized function
typedef bool (MgStyle::*StyleComplexControl)( const QStyleOptionComplex*, QPainter*, const QWidget* ) const;
int _hintCounter;
int _controlCounter;
int _subElementCounter;
QHash<QString, int> _styleElements;
QStyle::ControlElement CE_CapacityBar;
void renderSplitter(const QStyleOption*, QPainter*, const QWidget*, bool) const;
QSize expandSize(const QSize& size, int main, int left = 0, int top = 0, int right = 0, int bottom = 0) const;
QSize checkBoxSizeFromContents(const QStyleOption*, const QSize&, const QWidget*) const;
QSize comboBoxSizeFromContents(const QStyleOption*, const QSize&, const QWidget*) const;
QSize headerSectionSizeFromContents(const QStyleOption*, const QSize&, const QWidget*) const;
QSize menuItemSizeFromContents(const QStyleOption*, const QSize&, const QWidget*) const;
QSize pushButtonSizeFromContents(const QStyleOption*, const QSize&, const QWidget*) const;
QSize tabBarTabSizeFromContents(const QStyleOption*, const QSize& size, const QWidget*) const;
QSize toolButtonSizeFromContents(const QStyleOption*, const QSize&, const QWidget*) const;
//! returns true for vertical tabs
bool isVerticalTab(const QStyleOptionTab* option) const {
return isVerticalTab(option->shape);
}
bool isVerticalTab(const QTabBar::Shape& shape) const;
void polishScrollArea(QAbstractScrollArea* scrollArea) const;
bool drawPanelTipLabelPrimitive( const QStyleOption* option, QPainter* painter, const QWidget* widget) const;
bool drawFramePrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawFrameFocusRectPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawFrameGroupBoxPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawFrameMenuPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawFrameTabBarBasePrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawFrameTabWidgetPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawFrameWindowPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawIndicatorArrowUpPrimitive(const QStyleOption* option, QPainter* painter, const QWidget* widget) const {
return drawIndicatorArrowPrimitive( ArrowUp, option, painter, widget );
}
bool drawIndicatorArrowDownPrimitive(const QStyleOption* option, QPainter* painter, const QWidget* widget) const {
return drawIndicatorArrowPrimitive( ArrowDown, option, painter, widget );
}
bool drawIndicatorArrowLeftPrimitive(const QStyleOption* option, QPainter* painter, const QWidget* widget) const {
return drawIndicatorArrowPrimitive( ArrowLeft, option, painter, widget );
}
bool drawIndicatorArrowRightPrimitive(const QStyleOption* option, QPainter* painter, const QWidget* widget) const {
return drawIndicatorArrowPrimitive( ArrowRight, option, painter, widget );
}
bool drawIndicatorArrowPrimitive( ArrowOrientation, const QStyleOption*, QPainter*, const QWidget* ) const;
//! dock widget separators
/*! it uses the same painting as QSplitter, but due to Qt, the horizontal/vertical convention is inverted */
bool drawIndicatorDockWidgetResizeHandlePrimitive(const QStyleOption* option,
QPainter* painter, const QWidget* widget) const {
renderSplitter(option, painter, widget, !(option->state & State_Horizontal));
return true;
}
bool drawIndicatorHeaderArrowPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawPanelButtonCommandPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawPanelMenuPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawPanelButtonToolPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawPanelScrollAreaCornerPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawPanelItemViewItemPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawPanelLineEditPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawIndicatorBranchPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawIndicatorButtonDropDownPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawIndicatorCheckBoxPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawIndicatorRadioButtonPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawIndicatorTabTearPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawIndicatorToolBarHandlePrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawIndicatorToolBarSeparatorPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawWidgetPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const;
//! checkbox state (used for checkboxes _and_ radio buttons)
enum CheckBoxState {
CheckOn,
CheckOff,
CheckTriState
};
void renderRadioButton(QPainter*, const QRect&, const QPalette&, StyleOptions,
CheckBoxState, qreal opacity = -1, AnimationMode mode = AnimationNone) const;
QColor slabShadowColor( QColor, StyleOptions, qreal, AnimationMode ) const;
//! checkbox
void renderCheckBox( QPainter*, const QRect&, const QPalette&, StyleOptions, CheckBoxState, qreal opacity = -1, AnimationMode mode = AnimationNone ) const;
void renderScrollBarHole( QPainter*, const QRect&, const QColor&, const Qt::Orientation&, const TileSet::Tiles& = TileSet::Full ) const;
//! scrollbar handle (non animated)
void renderScrollBarHandle(
QPainter* painter, const QRect& r, const QPalette& palette,
const Qt::Orientation& orientation, const bool& hover) const {
renderScrollBarHandle( painter, r, palette, orientation, hover, -1 );
}
void renderScrollBarHandle( QPainter*, const QRect&, const QPalette&, const Qt::Orientation&, const bool&, const qreal& ) const;
void renderScrollBarArrow( QPainter*, const QRect&, const QColor&, const QColor&, ArrowOrientation ) const;
QColor scrollBarArrowColor( const QStyleOption*, const SubControl&, const QWidget* ) const;
void renderSliderTickmarks( QPainter*, const QStyleOptionSlider*, const QWidget* ) const;
QPolygonF genericArrow(ArrowOrientation, ArrowSize = ArrowNormal) const;
QRect centerRect(const QRect& in, const QSize& s ) const {
return centerRect( in, s.width(), s.height() );
}
QRect centerRect(const QRect& in, int w, int h) const {
return QRect(in.x() + (in.width() - w) / 2, in.y() + (in.height() - h) / 2, w, h);
}
//! adjust rect based on provided margins
QRect insideMargin( const QRect& r, int main, int left = 0, int top = 0, int right = 0, int bottom = 0 ) const {
return r.adjusted( main + left, main + top, -main - right, -main - bottom );
}
//! generic element
int newStyleElement( const QString& element, const char* check, int& counter) {
if ( !element.contains(check) )
return 0;
int id = _styleElements.value(element, 0);
if ( !id ) {
++counter;
id = counter;
_styleElements.insert(element, id);
}
return id;
}
//! style hint
QStyle::StyleHint newStyleHint( const QString& element ) {
return (StyleHint) newStyleElement( element, "SH_", _hintCounter );
}
//! control element
QStyle::ControlElement newControlElement( const QString& element ) {
return (ControlElement)newStyleElement( element, "CE_", _controlCounter );
}
//! subElement
QStyle::SubElement newSubElement(const QString& element ) {
return (SubElement)newStyleElement( element, "SE_", _subElementCounter );
}
bool drawComboBoxComplexControl(const QStyleOptionComplex*, QPainter*, const QWidget*) const;
bool drawDialComplexControl(const QStyleOptionComplex*, QPainter*, const QWidget*) const;
bool drawGroupBoxComplexControl(const QStyleOptionComplex*, QPainter*, const QWidget*) const;
bool drawSliderComplexControl(const QStyleOptionComplex*, QPainter*, const QWidget*) const;
bool drawSpinBoxComplexControl(const QStyleOptionComplex*, QPainter*, const QWidget*) const;
bool drawTitleBarComplexControl(const QStyleOptionComplex*, QPainter*, const QWidget*) const;
bool drawToolButtonComplexControl(const QStyleOptionComplex*, QPainter*, const QWidget*) const;
bool eventFilterComboBoxContainer( QWidget*, QEvent* );
bool eventFilterDockWidget( QDockWidget*, QEvent* );
bool eventFilterMdiSubWindow( QMdiSubWindow*, QEvent* );
bool eventFilterScrollBar( QWidget*, QEvent* );
bool eventFilterTabBar( QWidget*, QEvent* );
bool eventFilterToolBar( QToolBar*, QEvent* );
bool eventFilterToolBox( QToolBox*, QEvent* );
bool drawCapacityBarControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawComboBoxLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawDockWidgetTitleControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawHeaderEmptyAreaControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawHeaderLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawHeaderSectionControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawMenuBarItemControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawMenuItemControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawProgressBarControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawProgressBarContentsControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawProgressBarGrooveControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawProgressBarLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawPushButtonLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawRubberBandControl( const QStyleOption*, QPainter*, const QWidget* ) const;
//! scrollbar
bool drawScrollBarSliderControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawScrollBarAddLineControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawScrollBarSubLineControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawScrollBarAddPageControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawScrollBarSubPageControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawShapedFrameControl( const QStyleOption*, QPainter*, const QWidget* ) const;
// splitters
bool drawSplitterControl( const QStyleOption* option, QPainter* painter, const QWidget* widget ) const {
renderSplitter( option, painter, widget, option->state & State_Horizontal );
return true;
}
bool drawTabBarTabLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
//! tabbar tabs.
/*! there are two methods (_Single and _Plain) implemented, to deal with tabbar appearance selected from options */
bool drawTabBarTabShapeControl_Single( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawTabBarTabShapeControl_Plain( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawToolBarControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawToolBoxTabLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawToolBoxTabShapeControl( const QStyleOption*, QPainter*, const QWidget* ) const;
bool drawToolButtonLabelControl( const QStyleOption*, QPainter*, const QWidget* ) const;
QRect handleRTL(const QStyleOption* opt, const QRect& subRect) const {
return visualRect(opt->direction, opt->rect, subRect);
}
//! right to left alignment handling
QPoint handleRTL(const QStyleOption* opt, const QPoint& pos) const {
return visualPos(opt->direction, opt->rect, pos);
}
//! tiles from tab orientation
inline TileSet::Tiles tilesByShape( const QTabBar::Shape& shape) const;
//! toolbar mask
/*! this masks out toolbar expander buttons, when visible, from painting */
QRegion tabBarClipRegion( const QTabBar* ) const;
inline QStyle::SubControl scrollBarHitTest(const QRect& rect, const QPoint& point, const QStyleOption* option) const;
inline bool preceeds( const QPoint& point, const QRect& bound, const QStyleOption* option ) const;
TabBarData& tabBarData() const {
return *_tabBarData;
}
QRect groupBoxSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
QRect comboBoxSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
QRect scrollBarSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
QRect sliderSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
QRect spinBoxSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const;
//! this properly handles single/double or no scrollBar buttons
QRect scrollBarInternalSubControlRect( const QStyleOptionComplex*, SubControl ) const;
//! menu item background
void renderMenuItemBackground( const QStyleOption*, QPainter*, const QWidget* ) const;
void renderMenuItemRect( const QStyleOption* opt, const QRect& rect, const QPalette& pal,
QPainter* p, qreal opacity = -1 ) const {
renderMenuItemRect( opt, rect, pal.color(QPalette::Window), p, opacity );
}
void renderMenuItemRect( const QStyleOption*, const QRect&, const QColor&, const QPalette&, QPainter* p, qreal opacity = -1 ) const;
//! header background
void renderHeaderBackground( const QRect&, const QPalette&, QPainter*, const QWidget*, bool horizontal, bool reverse ) const;
void renderHeaderLines( const QRect&, const QPalette&, QPainter*, TileSet::Tiles ) const;
//! mdi subwindow titlebar button
void renderTitleBarButton( QPainter*, const QStyleOptionTitleBar*, const QWidget*, const SubControl& ) const;
void renderTitleBarIcon( QPainter*, const QRectF&, const SubControl& ) const;
void renderSpinBoxArrow( QPainter*, const QStyleOptionSpinBox*, const QWidget*, const SubControl& ) const;
//! default implementation. Does not change anything
QRect defaultSubElementRect( const QStyleOption* option, const QWidget* ) const {
return option->rect;
}
//! pushbutton contents
QRect pushButtonContentsRect( const QStyleOption* option, const QWidget* ) const {
return insideMargin( option->rect,
PushButton_ContentsMargin,
PushButton_ContentsMargin_Left,
PushButton_ContentsMargin_Top,
PushButton_ContentsMargin_Right,
PushButton_ContentsMargin_Bottom );
}
//! toolbox tab
QRect toolBoxTabContentsRect( const QStyleOption* option, const QWidget* ) const {
return insideMargin( option->rect, 0, 5, 0, 5, 0 );
}
QRect checkBoxContentsRect( const QStyleOption* option, const QWidget* ) const {
return handleRTL( option, option->rect.adjusted( CheckBox_Size + CheckBox_BoxTextSpace, 0, 0, 0 ) );
}
QRect progressBarContentsRect( const QStyleOption* option, const QWidget* ) const {
return insideMargin( option->rect, ProgressBar_GrooveMargin );
}
//! tabBar buttons
QRect tabBarTabLeftButtonRect( const QStyleOption* option, const QWidget* widget ) const {
return tabBarTabButtonRect( SE_TabBarTabLeftButton, option, widget );
}
QRect tabBarTabRightButtonRect( const QStyleOption* option, const QWidget* widget ) const {
return tabBarTabButtonRect( SE_TabBarTabRightButton, option, widget );
}
QRect tabBarTabButtonRect( SubElement, const QStyleOption*, const QWidget* ) const;
// tabbar tab text
QRect tabBarTabTextRect( const QStyleOption* option, const QWidget* widget ) const {
return QCommonStyle::subElementRect( SE_TabBarTabText, option, widget ).adjusted( 6, 0, -6, 0 );
}
// tab widgets
QRect tabWidgetTabContentsRect( const QStyleOption*, const QWidget* ) const;
QRect tabWidgetTabPaneRect( const QStyleOption*, const QWidget* ) const;
QRect tabWidgetLeftCornerRect( const QStyleOption* option, const QWidget* widget ) const;
QRect tabWidgetRightCornerRect( const QStyleOption* option, const QWidget* widget ) const;
bool emptyPrimitive( const QStyleOption*, QPainter*, const QWidget* ) const {
return true;
}
QIcon getCachedIcon(QString key) const;
protected slots:
virtual QIcon standardIcon(StandardPixmap standardIcon,
const QStyleOption* option, const QWidget* widget) const;
public slots:
void configurationChanged();
public:
MgStyle();
virtual int pixelMetric(PixelMetric, const QStyleOption* = 0, const QWidget* = 0) const;
virtual int styleHint(StyleHint, const QStyleOption* = 0, const QWidget* = 0, QStyleHintReturn* = 0) const;
virtual QRect subElementRect(SubElement, const QStyleOption*, const QWidget*) const;
virtual QRect subControlRect(ComplexControl, const QStyleOptionComplex*, SubControl, const QWidget*) const;
QSize sizeFromContents(ContentsType, const QStyleOption*, const QSize&, const QWidget*) const;
SubControl hitTestComplexControl(ComplexControl, const QStyleOptionComplex*, const QPoint&, const QWidget*) const;
virtual void polish(QWidget* widget);
void unpolish(QWidget* widget);
void drawPrimitive(PrimitiveElement, const QStyleOption*, QPainter*, const QWidget*) const;
void drawControl(ControlElement, const QStyleOption*, QPainter*, const QWidget*) const;
void drawComplexControl(ComplexControl, const QStyleOptionComplex*, QPainter*, const QWidget*) const;
virtual void drawItemText(QPainter*, const QRect&, int alignment, const QPalette&, bool enabled,
const QString&, QPalette::ColorRole = QPalette::NoRole) const;
virtual bool eventFilter(QObject*, QEvent*);
Animations& animations() const {
return *_animations;
}
Transitions& transitions() const {
return *_transitions;
}
// WindowManager& windowManager() const { return *_windowManager; }
FrameShadowFactory& frameShadowFactory() const {
return *_frameShadowFactory;
}
// virtual QPalette standardPalette() const;
};
//---------------------------------------------------------
// preceeds
//---------------------------------------------------------
bool MgStyle::preceeds( const QPoint& point, const QRect& bound, const QStyleOption* option ) const {
if (option->state & QStyle::State_Horizontal) {
if (option->direction == Qt::LeftToRight)
return point.x() < bound.right();
else
return point.x() > bound.x();
}
else
return point.y() < bound.y();
}
//---------------------------------------------------------
// scrollBarHitTest
//---------------------------------------------------------
QStyle::SubControl MgStyle::scrollBarHitTest(const QRect& rect, const QPoint& point, const QStyleOption* option) const {
if (option->state & QStyle::State_Horizontal) {
if (option->direction == Qt::LeftToRight )
return point.x() < rect.center().x() ? QStyle::SC_ScrollBarSubLine : QStyle::SC_ScrollBarAddLine;
else
return point.x() > rect.center().x() ? QStyle::SC_ScrollBarSubLine : QStyle::SC_ScrollBarAddLine;
}
else
return point.y() < rect.center().y() ? QStyle::SC_ScrollBarSubLine : QStyle::SC_ScrollBarAddLine;
}
//---------------------------------------------------------
// tilesByShape
//---------------------------------------------------------
TileSet::Tiles MgStyle::tilesByShape( const QTabBar::Shape& shape ) const {
switch (shape) {
case QTabBar::RoundedNorth:
case QTabBar::TriangularNorth:
return TileSet::Top | TileSet::Left | TileSet::Right;
case QTabBar::RoundedSouth:
case QTabBar::TriangularSouth:
return TileSet::Bottom | TileSet::Left | TileSet::Right;
case QTabBar::RoundedEast:
case QTabBar::TriangularEast:
return TileSet::Right | TileSet::Top | TileSet::Bottom;
case QTabBar::RoundedWest:
case QTabBar::TriangularWest:
return TileSet::Left | TileSet::Top | TileSet::Bottom;
default:
return TileSet::Ring;
}
}
//---------------------------------------------------------
// adjustSlabRect
//---------------------------------------------------------
void MgStyle::adjustSlabRect(SlabRect& slab, const QRect& tabWidgetRect, bool documentMode, bool vertical) const {
// no tabWidget found, do nothing
if ( documentMode || !tabWidgetRect.isValid() )
return;
else if ( vertical ) {
slab._r.setTop( qMax( slab._r.top(), tabWidgetRect.top() ) );
slab._r.setBottom( qMin( slab._r.bottom(), tabWidgetRect.bottom() ) );
}
else {
slab._r.setLeft( qMax( slab._r.left(), tabWidgetRect.left() ) );
slab._r.setRight( qMin( slab._r.right(), tabWidgetRect.right() ) );
}
return;
}
#endif