diff --git a/kstyle/breezemetrics.h b/kstyle/breezemetrics.h index 086a4b6a..c7be720c 100644 --- a/kstyle/breezemetrics.h +++ b/kstyle/breezemetrics.h @@ -30,12 +30,18 @@ namespace Breeze enum Metrics { + // frames + Frame_FrameWidth = 1, + + // groupbox title margin + GroupBox_TitleMargin = 4, + // buttons Button_Margin = 12, // checkboxes and radio buttons CheckBox_Size = 22, - CheckBox_BoxTextSpace = 4, + CheckBox_BoxTextSpace = 8, RadioButton_Size = 22, // scrollbar diff --git a/kstyle/breezestyle.cpp b/kstyle/breezestyle.cpp index 30282471..168203d7 100644 --- a/kstyle/breezestyle.cpp +++ b/kstyle/breezestyle.cpp @@ -192,6 +192,9 @@ namespace Breeze switch( metric ) { + // frame width + case PM_DefaultFrameWidth: return Metrics::Frame_FrameWidth; + // buttons case PM_ButtonMargin: return Metrics::Button_Margin; case PM_ButtonDefaultIndicator: return 0; @@ -274,6 +277,10 @@ namespace Breeze switch( element ) { + // groupbox + case CC_GroupBox: return groupBoxSubControlRect( option, subControl, widget ); + + // scrollbar case CC_ScrollBar: return scrollBarSubControlRect( option, subControl, widget ); // fallback @@ -368,7 +375,8 @@ namespace Breeze case PE_IndicatorCheckBox: fcn = &Style::drawIndicatorCheckBoxPrimitive; break; case PE_IndicatorRadioButton: fcn = &Style::drawIndicatorRadioButtonPrimitive; break; - // focus + // frames + case PE_FrameGroupBox: fcn = &Style::drawFrameGroupBoxPrimitive; break; case PE_FrameFocusRect: fcn = &Style::drawFrameFocusRectPrimitive; break; // fallback @@ -544,7 +552,7 @@ namespace Breeze // calculate text rect const QRect contentsRect( option->rect.adjusted( Metrics::CheckBox_Size + Metrics::CheckBox_BoxTextSpace, 0, 0, 0 ) ); - const QRect boundingRect( option->fontMetrics.boundingRect( contentsRect, Qt::AlignLeft|Qt::AlignVCenter|Qt::TextHideMnemonic, buttonOption->text ) ); + const QRect boundingRect( option->fontMetrics.boundingRect( contentsRect, Qt::AlignLeft|Qt::AlignVCenter|Qt::TextShowMnemonic, buttonOption->text ) ); return handleRTL( option, boundingRect ); } @@ -617,6 +625,117 @@ namespace Breeze } + //______________________________________________________________ + QRect Style::groupBoxSubControlRect( const QStyleOptionComplex* option, SubControl subControl, const QWidget* widget ) const + { + + QRect rect = option->rect; + switch( subControl ) + { + + case SC_GroupBoxFrame: return rect; + + case SC_GroupBoxContents: + { + + // cast option and check + const QStyleOptionGroupBox *groupBoxOption = qstyleoption_cast( option ); + if( !groupBoxOption ) break; + + // take out frame width + const int frameWidth( pixelMetric( PM_DefaultFrameWidth, option, widget ) ); + rect.adjust( frameWidth, frameWidth, -frameWidth, -frameWidth ); + + // get flags + const bool checkable( groupBoxOption->subControls & QStyle::SC_GroupBoxCheckBox ); + const bool emptyText( groupBoxOption->text.isEmpty() ); + + // calculate title height + int titleHeight( 0 ); + if( !emptyText ) titleHeight = groupBoxOption->fontMetrics.height(); + if( checkable ) titleHeight = qMax( titleHeight, (int) Metrics::CheckBox_Size ); + + // add margin + if( titleHeight > 0 ) titleHeight += 2*Metrics::GroupBox_TitleMargin; + + rect.adjust( 0, titleHeight, 0, 0 ); + return rect; + + } + + case SC_GroupBoxCheckBox: + case SC_GroupBoxLabel: + { + + // cast option and check + const QStyleOptionGroupBox *groupBoxOption = qstyleoption_cast( option ); + if( !groupBoxOption ) break; + + // take out frame width + const int frameWidth( pixelMetric( PM_DefaultFrameWidth, option, widget ) ); + rect.adjust( frameWidth, frameWidth, -frameWidth, -frameWidth ); + + const bool emptyText( groupBoxOption->text.isEmpty() ); + const bool checkable( groupBoxOption->subControls & QStyle::SC_GroupBoxCheckBox ); + + // calculate title height + int titleHeight( 0 ); + int titleWidth( 0 ); + if( !emptyText ) + { + const QFontMetrics fontMetrics = option->fontMetrics; + titleHeight = qMax( titleHeight, fontMetrics.height() ); + titleWidth += fontMetrics.size( Qt::TextShowMnemonic, groupBoxOption->text ).width(); + } + + if( checkable ) + { + titleHeight = qMax( titleHeight, (int) Metrics::CheckBox_Size ); + titleWidth += Metrics::CheckBox_Size; + if( !emptyText ) titleWidth += Metrics::CheckBox_BoxTextSpace; + } + + // adjust height + QRect titleRect( rect ); + titleRect.setHeight( titleHeight ); + titleRect.translate( 0, Metrics::GroupBox_TitleMargin ); + + // center + titleRect = centerRect( titleRect, titleWidth, titleHeight ); + + if( subControl == SC_GroupBoxCheckBox ) + { + + // vertical centering + titleRect = centerRect( titleRect, titleWidth, Metrics::CheckBox_Size ); + + // horizontal positioning + const QRect subRect( titleRect.topLeft(), QSize( Metrics::CheckBox_Size, titleRect.height() ) ); + return visualRect( option->direction, titleRect, subRect ); + + } else { + + // vertical centering + QFontMetrics fontMetrics = option->fontMetrics; + titleRect = centerRect( titleRect, titleWidth, fontMetrics.height() ); + + // horizontal positioning + QRect subRect( titleRect ); + if( checkable ) subRect.adjust( Metrics::CheckBox_Size + Metrics::CheckBox_BoxTextSpace, 0, 0, 0 ); + return visualRect( option->direction, titleRect, subRect ); + + } + + } + + default: break; + + } + + return KStyle::subControlRect( CC_GroupBox, option, subControl, widget ); + + } + //___________________________________________________________________________________________________________________ QRect Style::scrollBarInternalSubControlRect( const QStyleOptionComplex* option, SubControl subControl ) const { @@ -811,6 +930,48 @@ namespace Breeze } + //______________________________________________________________ + bool Style::drawFrameGroupBoxPrimitive( const QStyleOption* option, QPainter* painter, const QWidget* widget ) const + { + + Q_UNUSED( widget ); + + // cast option and check + const QStyleOptionFrame *frameOption = qstyleoption_cast( option ); + if( !frameOption ) return true; + + // no frame for flat groupboxes + QStyleOptionFrameV2 frameOption2( *frameOption ); + if( frameOption2.features & QStyleOptionFrameV2::Flat ) return true; + + // normal frame + const QPalette& palette( option->palette ); + const QRect& rect( option->rect ); + const QColor outline( KColorUtils::mix( palette.color( QPalette::Window ), palette.color( QPalette::WindowText ), 0.25 ) ); + const QColor base( KColorUtils::mix( palette.color( QPalette::Window ), palette.color( QPalette::Base ), 0.3 ) ); + + painter->setRenderHint( QPainter::Antialiasing ); + + const QRectF baseRect( rect ); + + { + // content + painter->setPen( Qt::NoPen ); + painter->setBrush( base ); + painter->drawRoundedRect( baseRect, 2.5, 2.5 ); + } + + { + // outline + painter->setPen( QPen( outline, 1 ) ); + painter->setBrush( Qt::NoBrush ); + painter->drawRoundedRect( baseRect.adjusted( 0.5, 0.5, -0.5, -0.5 ), 2, 2 ); + } + + return true; + + } + //______________________________________________________________ bool Style::drawPanelButtonCommandPrimitive( const QStyleOption* option, QPainter* painter, const QWidget* widget ) const { diff --git a/kstyle/breezestyle.h b/kstyle/breezestyle.h index c3a0b551..056298cc 100644 --- a/kstyle/breezestyle.h +++ b/kstyle/breezestyle.h @@ -219,10 +219,19 @@ namespace Breeze //!@name subcontrol Rect specialized functions //@{ -// QRect groupBoxSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const; + //! groupbox + QRect groupBoxSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const; + +// //! combobox // QRect comboBoxSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const; + + //! scrollbar (internal) QRect scrollBarInternalSubControlRect( const QStyleOptionComplex*, SubControl ) const; + + //! scrollbar QRect scrollBarSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const; + + //! spinbox // QRect spinBoxSubControlRect( const QStyleOptionComplex*, SubControl, const QWidget* ) const; //@} @@ -253,7 +262,7 @@ namespace Breeze // 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 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;