48 #include <qalgorithms.h> 52 #include <QAbstractItemView> 53 #include <QApplication> 54 #include <QDialogButtonBox> 55 #include <QFormLayout> 61 #include <QStyleOption> 62 #include <QPainterPath> 64 #include <kconfiggroup.h> 66 #include <kiconloader.h> 67 #include <kcolorscheme.h> 70 static const qint32 u_arrow[] = { -1, -3, 0, -3, -2, -2, 1, -2, -3, -1, 2, -1, -4, 0, 3, 0, -4, 1, 3, 1};
71 static const qint32 d_arrow[] = { -4, -2, 3, -2, -4, -1, 3, -1, -3, 0, 2, 0, -2, 1, 1, 1, -1, 2, 0, 2};
72 static const qint32 l_arrow[] = { -3, -1, -3, 0, -2, -2, -2, 1, -1, -3, -1, 2, 0, -4, 0, 3, 1, -4, 1, 3};
73 static const qint32 r_arrow[] = { -2, -4, -2, 3, -1, -4, -1, 3, 0, -3, 0, 2, 1, -2, 1, 1, 2, -1, 2, 0};
74 #define QCOORDARRLEN(x) sizeof(x)/(sizeof(qint32)*2) 86 struct SelectionTiles {
93 static const int X_KdeBase = 0xff000000;
102 int hintCounter, controlCounter, subElementCounter;
105 K4StylePrivate::K4StylePrivate()
107 selectionCache.setMaxCost(10);
108 controlCounter = subElementCounter = X_KdeBase;
109 hintCounter = X_KdeBase + 1;
114 K4Style::K4Style() : clickedLabel(nullptr), d(new K4StylePrivate)
117 setWidgetLayoutProp(WT_Generic, Generic::DefaultFrameWidth, 2);
118 setWidgetLayoutProp(WT_Generic, Generic::DefaultLayoutSpacing, 6);
119 setWidgetLayoutProp(WT_Generic, Generic::DefaultLayoutMargin, 9);
121 setWidgetLayoutProp(WT_PushButton, PushButton::ContentsMargin, 5);
122 setWidgetLayoutProp(WT_PushButton, PushButton::FocusMargin, 3);
123 setWidgetLayoutProp(WT_PushButton, PushButton::PressedShiftHorizontal, 2);
124 setWidgetLayoutProp(WT_PushButton, PushButton::PressedShiftVertical, 2);
125 setWidgetLayoutProp(WT_PushButton, PushButton::MenuIndicatorSize, 8);
126 setWidgetLayoutProp(WT_PushButton, PushButton::TextToIconSpace, 6);
128 setWidgetLayoutProp(WT_Splitter, Splitter::Width, 6);
130 setWidgetLayoutProp(WT_CheckBox, CheckBox::Size, 16);
131 setWidgetLayoutProp(WT_CheckBox, CheckBox::BoxTextSpace, 6);
132 setWidgetLayoutProp(WT_CheckBox, CheckBox::NoLabelFocusMargin, 1);
134 setWidgetLayoutProp(WT_RadioButton, RadioButton::Size, 16);
135 setWidgetLayoutProp(WT_RadioButton, RadioButton::BoxTextSpace, 6);
137 setWidgetLayoutProp(WT_DockWidget, DockWidget::TitleTextColor,
139 setWidgetLayoutProp(WT_DockWidget, DockWidget::TitleMargin, 2);
140 setWidgetLayoutProp(WT_DockWidget, DockWidget::FrameWidth, 3);
141 setWidgetLayoutProp(WT_DockWidget, DockWidget::SeparatorExtent, 6);
143 setWidgetLayoutProp(WT_ProgressBar, ProgressBar::GrooveMargin, 2);
144 setWidgetLayoutProp(WT_ProgressBar, ProgressBar::SideTextSpace, 3);
145 setWidgetLayoutProp(WT_ProgressBar, ProgressBar::MaxBusyIndicatorSize, 10000);
146 setWidgetLayoutProp(WT_ProgressBar, ProgressBar::BusyIndicatorSize, 10);
147 setWidgetLayoutProp(WT_ProgressBar, ProgressBar::Precision, 1);
149 setWidgetLayoutProp(WT_MenuBar, MenuBar::ItemSpacing, 14);
150 setWidgetLayoutProp(WT_MenuBar, MenuBar::Margin, 2);
151 setWidgetLayoutProp(WT_MenuBar, MenuBar::Margin + Left, 4);
152 setWidgetLayoutProp(WT_MenuBar, MenuBar::Margin + Right, 4);
154 setWidgetLayoutProp(WT_MenuBarItem, MenuBarItem::Margin, 1);
156 setWidgetLayoutProp(WT_Menu, Menu::FrameWidth, 1);
157 setWidgetLayoutProp(WT_Menu, Menu::Margin, 3);
158 setWidgetLayoutProp(WT_Menu, Menu::ScrollerHeight, 10);
159 setWidgetLayoutProp(WT_Menu, Menu::TearOffHeight, 10);
161 setWidgetLayoutProp(WT_MenuItem, MenuItem::CheckWidth, 12);
162 setWidgetLayoutProp(WT_MenuItem, MenuItem::CheckSpace, 3);
163 setWidgetLayoutProp(WT_MenuItem, MenuItem::IconWidth, 12);
164 setWidgetLayoutProp(WT_MenuItem, MenuItem::IconSpace, 3);
165 setWidgetLayoutProp(WT_MenuItem, MenuItem::ArrowWidth, 11);
166 setWidgetLayoutProp(WT_MenuItem, MenuItem::ArrowSpace, 3);
167 setWidgetLayoutProp(WT_MenuItem, MenuItem::Margin, 2);
168 setWidgetLayoutProp(WT_MenuItem, MenuItem::SeparatorHeight, 0);
169 setWidgetLayoutProp(WT_MenuItem, MenuItem::MinHeight, 16);
170 setWidgetLayoutProp(WT_MenuItem, MenuItem::TextColor, ColorMode(
QPalette::Text));
172 setWidgetLayoutProp(WT_MenuItem, MenuItem::DisabledTextColor, ColorMode(
QPalette::Text));
173 setWidgetLayoutProp(WT_MenuItem, MenuItem::ActiveDisabledTextColor, ColorMode(
QPalette::Text));
174 setWidgetLayoutProp(WT_MenuItem, MenuItem::AccelSpace, 16);
177 setWidgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleTopButton, 0);
178 setWidgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleBotButton, 1);
179 setWidgetLayoutProp(WT_ScrollBar, ScrollBar::SingleButtonHeight, 16);
180 setWidgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleButtonHeight, 32);
181 setWidgetLayoutProp(WT_ScrollBar, ScrollBar::BarWidth, 16);
182 setWidgetLayoutProp(WT_ScrollBar, ScrollBar::ArrowColor,
184 setWidgetLayoutProp(WT_ScrollBar, ScrollBar::ActiveArrowColor,
187 setWidgetLayoutProp(WT_TabBar, TabBar::TabContentsMargin, 6);
188 setWidgetLayoutProp(WT_TabBar, TabBar::TabFocusMargin, 3);
189 setWidgetLayoutProp(WT_TabBar, TabBar::TabOverlap, 0);
190 setWidgetLayoutProp(WT_TabBar, TabBar::BaseHeight, 2);
191 setWidgetLayoutProp(WT_TabBar, TabBar::BaseOverlap, 2);
192 setWidgetLayoutProp(WT_TabBar, TabBar::ScrollButtonWidth, 10);
193 setWidgetLayoutProp(WT_TabBar, TabBar::TabTextToIconSpace, 6);
195 setWidgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin, 2);
197 setWidgetLayoutProp(WT_Tree, Tree::MaxExpanderSize, 9);
199 setWidgetLayoutProp(WT_Slider, Slider::HandleThickness, 20);
200 setWidgetLayoutProp(WT_Slider, Slider::HandleLength, 16);
202 setWidgetLayoutProp(WT_SpinBox, SpinBox::FrameWidth, 1);
203 setWidgetLayoutProp(WT_SpinBox, SpinBox::ButtonWidth, 16);
204 setWidgetLayoutProp(WT_SpinBox, SpinBox::ButtonSpacing, 1);
205 setWidgetLayoutProp(WT_SpinBox, SpinBox::ButtonMargin + Right, 1);
206 setWidgetLayoutProp(WT_SpinBox, SpinBox::ButtonMargin + Top, 1);
207 setWidgetLayoutProp(WT_SpinBox, SpinBox::ButtonMargin + Bot, 1);
209 setWidgetLayoutProp(WT_ComboBox, ComboBox::FrameWidth, 1);
210 setWidgetLayoutProp(WT_ComboBox, ComboBox::ButtonWidth, 16);
211 setWidgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Right, 1);
212 setWidgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Top, 1);
213 setWidgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Bot, 1);
214 setWidgetLayoutProp(WT_ComboBox, ComboBox::FocusMargin, 1);
216 setWidgetLayoutProp(WT_Header, Header::ContentsMargin, 3);
217 setWidgetLayoutProp(WT_Header, Header::TextToIconSpace, 3);
218 setWidgetLayoutProp(WT_Header, Header::MarkSize, 9);
220 setWidgetLayoutProp(WT_GroupBox, GroupBox::FrameWidth, 2);
221 setWidgetLayoutProp(WT_GroupBox, GroupBox::TextAlignTop,
false);
222 setWidgetLayoutProp(WT_GroupBox, GroupBox::TitleTextColor, ColorMode(
QPalette::Text));
224 setWidgetLayoutProp(WT_ToolBar, ToolBar::HandleExtent, 6);
225 setWidgetLayoutProp(WT_ToolBar, ToolBar::SeparatorExtent, 6);
226 setWidgetLayoutProp(WT_ToolBar, ToolBar::ExtensionExtent, 10);
227 setWidgetLayoutProp(WT_ToolBar, ToolBar::FrameWidth, 2);
228 setWidgetLayoutProp(WT_ToolBar, ToolBar::ItemSpacing, 3);
229 setWidgetLayoutProp(WT_ToolBar, ToolBar::ItemMargin, 1);
231 setWidgetLayoutProp(WT_ToolButton, ToolButton::ContentsMargin, 5);
232 setWidgetLayoutProp(WT_ToolButton, ToolButton::FocusMargin, 3);
233 setWidgetLayoutProp(WT_ToolButton, ToolButton::MenuIndicatorSize, 11);
235 setWidgetLayoutProp(WT_ToolBoxTab, ToolBoxTab::Margin, 0);
238 setWidgetLayoutProp(WT_Window, Window::TitleHeight, 20);
239 setWidgetLayoutProp(WT_Window, Window::TitleMargin, 2);
240 setWidgetLayoutProp(WT_Window, Window::NoTitleFrame, 0);
241 setWidgetLayoutProp(WT_Window, Window::ButtonWidth, 16);
242 setWidgetLayoutProp(WT_Window, Window::ButtonSpace, 2);
243 setWidgetLayoutProp(WT_Window, Window::ButtonToTextSpace, 3);
251 const DoubleButtonOption *bOpt = extractOption<const DoubleButtonOption *>(
nullptr);
254 #warning "mem leak: need to delete bOpt" 307 int id = elements->
value(element, 0);
311 elements->
insert(element,
id);
318 return (
StyleHint)newStyleElement(element,
"SH_", d->hintCounter, &d->styleElements);
323 return (
ControlElement)newStyleElement(element,
"CE_", d->controlCounter, &d->styleElements);
328 return (
SubElement)newStyleElement(element,
"SE_", d->subElementCounter, &d->styleElements);
333 #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) 360 return (
StyleHint) customStyleElement(SH_KCustomStyleElement, element, const_cast<QWidget *>(widget));
365 return (
ControlElement) customStyleElement(SH_KCustomStyleElement, element, const_cast<QWidget *>(widget));
370 return (
SubElement) customStyleElement(SH_KCustomStyleElement, element, const_cast<QWidget *>(widget));
373 void K4Style::polish(
QWidget *w)
375 if (qobject_cast<QLabel *>(w)) {
386 void K4Style::unpolish(
QWidget *w)
388 if (qobject_cast<QLabel *>(w)) {
407 int flags,
bool enabled,
412 QRect K4Style::itemPixmapRect(
const QRect &r,
int flags,
const QPixmap &pixmap)
const 416 void K4Style::drawItemText(
QPainter *painter,
const QRect &rect,
417 int flags,
const QPalette &pal,
bool enabled,
423 void K4Style::drawItemPixmap(
QPainter *painter,
const QRect &rect,
424 int alignment,
const QPixmap &pixmap)
const 428 QPalette K4Style::standardPalette()
const 436 switch (standardIcon) {
577 return centerRect(in, size.
width(), size.
height());
587 switch (widgetType) {
590 case Tree::VerticalBranch:
591 case Tree::HorizontalBranch:
595 case Tree::ExpanderOpen:
596 case Tree::ExpanderClosed: {
598 drawInsideRect(p, r);
599 int signLineSize = r.
width() / 4;
602 if (primitive == Tree::ExpanderClosed)
616 case SpinBox::PlusSymbol:
617 case SpinBox::MinusSymbol: {
623 p->
drawLine(c.x() - l / 2, c.y(), c.x() + l / 2, c.y());
624 if (primitive == SpinBox::PlusSymbol) {
625 p->
drawLine(c.x(), c.y() - l / 2, c.x(), c.y() + l / 2);
638 if (primitive == GroupBox::FlatFrame) {
648 case WT_ToolBoxTab: {
649 if (primitive == ToolBoxTab::Panel) {
650 drawKStylePrimitive(WT_ToolButton, ToolButton::Panel, opt, r, pal, flags, p, widget);
656 case WT_DockWidget: {
658 case DockWidget::TitlePanel:
662 case DockWidget::SeparatorHandle:
674 case Window::TitlePanel:
678 case Window::ButtonMenu: {
680 extractOption<K4Style::TitleButtonOption *>(kOpt);
687 QPixmap pm = standardPixmap(SP_TitleBarMenuButton, &tool, widget);
696 case Window::ButtonMin:
697 case Window::ButtonMax:
698 case Window::ButtonRestore:
699 case Window::ButtonClose:
700 case Window::ButtonShade:
701 case Window::ButtonUnshade:
702 case Window::ButtonHelp: {
704 extractOption<K4Style::TitleButtonOption *>(kOpt);
705 State bflags = flags;
706 bflags &= ~State_Sunken;
708 bflags |= State_Sunken;
710 drawKStylePrimitive(WT_ToolButton, ToolButton::Panel, opt, r, pal, bflags, p, widget);
721 if (primitive == TabBar::EastText || primitive == TabBar::WestText) {
724 if (primitive == TabBar::WestText) {
734 drawKStylePrimitive(WT_TabBar, Generic::Text, opt,
745 if (primitive == Generic::Text) {
758 }
else if (primitive == Generic::Icon) {
764 if (flags & State_Enabled)
774 if ((flags & State_On) || (flags & State_Sunken)) {
780 QSize size = iconOpts->size;
782 size =
QSize(pixelMetric(PM_SmallIconSize), pixelMetric(PM_SmallIconSize));
786 }
else if (primitive == Generic::FocusIndicator) {
791 drawInsideRect(p, r);
792 }
else if (primitive >= Generic::ArrowUp && primitive <= Generic::ArrowLeft) {
801 case Generic::ArrowUp:
802 poly.
setPoints(QCOORDARRLEN(u_arrow), u_arrow);
805 case Generic::ArrowDown:
806 poly.
setPoints(QCOORDARRLEN(d_arrow), d_arrow);
809 case Generic::ArrowLeft:
810 poly.
setPoints(QCOORDARRLEN(l_arrow), l_arrow);
814 poly.
setPoints(QCOORDARRLEN(r_arrow), r_arrow);
817 if (flags & State_Enabled) {
834 #if 0 //Reenable if you need a debug aid 837 drawInsideRect(p, r);
844 if (metrics.size() <= widget) {
845 metrics.resize(widget + 1);
849 if (widgetMetrics.
size() <= metric) {
850 widgetMetrics.
resize(metric + 1);
853 widgetMetrics[metric] = value;
863 if (metrics.size() <= widget) {
868 if (widgetMetrics.
size() <= metric) {
872 return widgetMetrics[metric];
878 int addWidth = 2 * widgetLayoutProp(wt, baseMarginMetric + MainMargin, opt, w) +
879 widgetLayoutProp(wt, baseMarginMetric + Left, opt, w) +
880 widgetLayoutProp(wt, baseMarginMetric + Right, opt, w);
882 int addHeight = 2 * widgetLayoutProp(wt, baseMarginMetric + MainMargin, opt, w) +
883 widgetLayoutProp(wt, baseMarginMetric + Top, opt, w) +
884 widgetLayoutProp(wt, baseMarginMetric + Bot, opt, w);
886 return QSize(orig.
width() + (rotated ? addHeight : addWidth),
887 orig.
height() + (rotated ? addWidth : addHeight));
891 int baseMarginMetric,
899 x1 += widgetLayoutProp(wt, baseMarginMetric + MainMargin, opt, w);
900 x1 += widgetLayoutProp(wt, baseMarginMetric + Left, opt, w);
902 y1 += widgetLayoutProp(wt, baseMarginMetric + MainMargin, opt, w);
903 y1 += widgetLayoutProp(wt, baseMarginMetric + Top, opt, w);
905 x2 -= widgetLayoutProp(wt, baseMarginMetric + MainMargin, opt, w);
906 x2 -= widgetLayoutProp(wt, baseMarginMetric + Right, opt, w);
908 y2 -= widgetLayoutProp(wt, baseMarginMetric + MainMargin, opt, w);
909 y2 -= widgetLayoutProp(wt, baseMarginMetric + Bot, opt, w);
911 return QRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
916 return visualRect(opt->direction, opt->rect, subRect);
921 return visualPos(opt->direction, opt->rect, pos);
927 State flags = option->state;
928 QRect r = option->rect;
932 case PE_FrameFocusRect:
933 drawKStylePrimitive(WT_Generic, Generic::FocusIndicator, option, r, pal, flags, painter, widget);
935 case PE_IndicatorArrowUp:
936 drawKStylePrimitive(WT_Generic, Generic::ArrowUp, option, r, pal, flags, painter, widget);
938 case PE_IndicatorArrowDown:
939 drawKStylePrimitive(WT_Generic, Generic::ArrowDown, option, r, pal, flags, painter, widget);
941 case PE_IndicatorArrowLeft:
942 drawKStylePrimitive(WT_Generic, Generic::ArrowLeft, option, r, pal, flags, painter, widget);
944 case PE_IndicatorArrowRight:
945 drawKStylePrimitive(WT_Generic, Generic::ArrowRight, option, r, pal, flags, painter, widget);
947 case PE_IndicatorMenuCheckMark:
949 drawKStylePrimitive(WT_MenuItem, MenuItem::CheckOn, option, r, pal, flags, painter, widget);
951 case PE_IndicatorCheckBox:
952 if (flags & State_NoChange) {
953 drawKStylePrimitive(WT_CheckBox, CheckBox::CheckTriState, option, r, pal, flags, painter, widget);
954 }
else if (flags & State_On) {
955 drawKStylePrimitive(WT_CheckBox, CheckBox::CheckOn, option, r, pal, flags, painter, widget);
957 drawKStylePrimitive(WT_CheckBox, CheckBox::CheckOff, option, r, pal, flags, painter, widget);
960 case PE_IndicatorRadioButton:
961 if (flags & State_On) {
962 drawKStylePrimitive(WT_RadioButton, RadioButton::RadioOn, option, r, pal, flags, painter, widget);
964 drawKStylePrimitive(WT_RadioButton, RadioButton::RadioOff, option, r, pal, flags, painter, widget);
967 case PE_IndicatorBranch: {
968 int centerX = r.
x() + r.
width() / 2;
969 int centerY = r.
y() + r.
height() / 2;
971 int expanderAdjust = 0;
973 if (flags & State_Children) {
976 widgetLayoutProp(WT_Tree, Tree::MaxExpanderSize, option, widget));
977 if ((sizeLimit & 1) == 0) {
981 expanderAdjust = sizeLimit / 2 + 1;
983 QRect expanderRect =
QRect(centerX - sizeLimit / 2, centerY - sizeLimit / 2,
984 sizeLimit, sizeLimit);
986 drawKStylePrimitive(WT_Tree, flags & State_Open ? Tree::ExpanderOpen : Tree::ExpanderClosed,
987 option, expanderRect, pal, flags, painter, widget);
992 if (flags & (State_Item | State_Children | State_Sibling)) {
994 drawKStylePrimitive(WT_Tree, Tree::VerticalBranch, option, topLine, pal, flags, painter, widget);
998 if (flags & State_Item) {
1001 horLine =
QRect(
QPoint(centerX + expanderAdjust, centerY),
1005 QPoint(centerX - expanderAdjust, centerY));
1006 drawKStylePrimitive(WT_Tree, Tree::HorizontalBranch, option, horLine, pal, flags, painter, widget);
1010 if (flags & State_Sibling) {
1013 drawKStylePrimitive(WT_Tree, Tree::VerticalBranch, option, botLine, pal, flags, painter, widget);
1018 drawKStylePrimitive(WT_Menu, Generic::Frame, option, r, pal, flags, painter, widget);
1020 case PE_IndicatorHeaderArrow: {
1024 primitive = Generic::ArrowUp;
1026 primitive = Generic::ArrowDown;
1028 if (primitive != 0) {
1029 drawKStylePrimitive(WT_Header, primitive, option, r, pal, flags, painter, widget);
1033 case PE_FrameTabBarBase: {
1034 drawKStylePrimitive(WT_TabBar, TabBar::BaseFrame, option, r, pal, flags, painter, widget);
1037 case PE_IndicatorTabTear: {
1038 drawKStylePrimitive(WT_TabBar, TabBar::IndicatorTear, option, r, pal, flags, painter, widget);
1041 case PE_FrameTabWidget: {
1042 drawKStylePrimitive(WT_TabWidget, Generic::Frame, option, r, pal, flags, painter, widget);
1046 case PE_PanelLineEdit: {
1047 drawKStylePrimitive(WT_LineEdit, LineEdit::Panel, option, r, pal, flags, painter, widget);
1051 case PE_FrameLineEdit: {
1052 drawKStylePrimitive(WT_LineEdit, Generic::Frame, option, r, pal, flags, painter, widget);
1056 case PE_FrameGroupBox: {
1058 qstyleoption_cast<const QStyleOptionFrame *>(option)) {
1062 drawKStylePrimitive(WT_GroupBox, GroupBox::FlatFrame, option, r, pal, flags, painter, widget);
1064 drawKStylePrimitive(WT_GroupBox, Generic::Frame, option, r, pal, flags, painter, widget);
1070 case PE_FrameStatusBar: {
1071 drawKStylePrimitive(WT_StatusBar, Generic::Frame, option, r, pal, flags, painter, widget);
1075 case PE_FrameDockWidget: {
1076 drawKStylePrimitive(WT_DockWidget, Generic::Frame, option, r, pal, flags, painter, widget);
1080 case PE_IndicatorDockWidgetResizeHandle: {
1081 drawKStylePrimitive(WT_DockWidget, DockWidget::SeparatorHandle, option, r, pal, flags,
1086 case PE_FrameWindow: {
1087 drawKStylePrimitive(WT_Window, Generic::Frame, option, r, pal, flags, painter, widget);
1092 drawKStylePrimitive(WT_Generic, Generic::Frame, option, r, pal, flags, painter, widget);
1096 case PE_IndicatorToolBarHandle: {
1097 if (flags & State_Horizontal)
1098 drawKStylePrimitive(WT_ToolBar, ToolBar::HandleHor,
1099 option, r, pal, flags, painter, widget);
1101 drawKStylePrimitive(WT_ToolBar, ToolBar::HandleVert,
1102 option, r, pal, flags, painter, widget);
1106 case PE_IndicatorToolBarSeparator:
1107 drawKStylePrimitive(WT_ToolBar, ToolBar::Separator, option, r, pal, flags, painter, widget);
1110 case PE_PanelButtonCommand:
1112 drawKStylePrimitive(WT_PushButton, PushButton::Panel, option, r, pal, flags, painter, widget);
1114 case PE_FrameDefaultButton:
1115 drawKStylePrimitive(WT_PushButton, PushButton::DefaultButtonFrame, option, r, pal, flags, painter, widget);
1118 case PE_PanelButtonTool:
1119 drawKStylePrimitive(WT_ToolButton, ToolButton::Panel, option, r, pal, flags, painter, widget);
1122 case PE_IndicatorButtonDropDown:
1123 drawKStylePrimitive(WT_ToolButton, Generic::ArrowDown, option, r, pal, flags, painter, widget);
1126 case PE_PanelItemViewItem: {
1130 bool hover = (option->state & State_MouseOver) && (!view ||
1133 bool hasCustomBackground = opt->backgroundBrush.style() !=
Qt::NoBrush &&
1134 !(option->state & State_Selected);
1135 bool hasSolidBackground = !hasCustomBackground || opt->backgroundBrush.style() ==
Qt::SolidPattern;
1137 const qreal rounding = 2.5;
1139 if (!hover && !(option->state & State_Selected) && !hasCustomBackground &&
1145 if (option->state & State_Enabled) {
1153 if (hasCustomBackground && hasSolidBackground) {
1154 color = opt->backgroundBrush.color();
1159 if (hover && !hasCustomBackground) {
1160 if (!(option->state & State_Selected)) {
1171 if (!hover && !(option->state & State_Selected) && !hasCustomBackground) {
1175 quint64
key = quint64(option->rect.height()) << 32 | color.
rgba();
1176 SelectionTiles tiles;
1177 SelectionTiles *tilesPtr = d->selectionCache.object(key);
1183 if (!tilesPtr && hasSolidBackground) {
1196 int lightenAmount = hasCustomBackground ? 110 : 130;
1199 gradient.setColorAt(1, color);
1212 tiles.left = pixmap.
copy(0, 0, 8, image.height());
1213 tiles.center = pixmap.
copy(8, 0, 32, image.height());
1214 tiles.right = pixmap.
copy(40, 0, 8, image.height());
1216 d->selectionCache.insert(key,
new SelectionTiles(tiles));
1217 }
else if (hasCustomBackground && !hasSolidBackground) {
1220 painter->
setBrush(opt->backgroundBrush);
1227 bool roundedLeft =
false;
1228 bool roundedRight =
false;
1236 roundedRight =
true;
1240 QRect r = option->rect;
1243 if (!reverseLayout ? roundedLeft : roundedRight) {
1247 if (!reverseLayout ? roundedRight : roundedLeft) {
1268 State flags = option->state;
1269 QRect r = option->rect;
1273 case CE_PushButton: {
1280 drawControl(CE_PushButtonBevel, option, p, widget);
1283 QRect labelRect = r;
1287 labelRect = insideMargin(labelRect, WT_PushButton, PushButton::DefaultIndicatorMargin, option, widget);
1291 labelRect = insideMargin(labelRect, WT_PushButton, PushButton::ContentsMargin, option, widget);
1296 bOptTmp.rect = labelRect;
1297 drawControl(CE_PushButtonLabel, &bOptTmp, p, widget);
1300 if (flags & State_HasFocus) {
1301 QRect focusRect = insideMargin(r, WT_PushButton, PushButton::FocusMargin, option, widget);
1304 foOpts.palette = pal;
1305 foOpts.rect = focusRect;
1306 foOpts.state = flags;
1308 drawKStylePrimitive(WT_PushButton, Generic::FocusIndicator, &foOpts, focusRect, pal, flags, p, widget);
1314 case CE_PushButtonBevel: {
1322 drawPrimitive(PE_FrameDefaultButton, option, p, widget);
1325 QRect bevelRect = r;
1328 bevelRect = insideMargin(r, WT_PushButton, PushButton::DefaultIndicatorMargin, option, widget);
1333 bOptTmp.rect = bevelRect;
1334 drawPrimitive(PE_PanelButtonCommand, &bOptTmp, p, widget);
1339 case CE_PushButtonLabel: {
1351 bool active = (flags & State_On) || (flags & State_Sunken);
1353 x += widgetLayoutProp(WT_PushButton, PushButton::PressedShiftHorizontal, option, widget);
1354 y += widgetLayoutProp(WT_PushButton, PushButton::PressedShiftVertical, option, widget);
1359 int indicatorWidth = widgetLayoutProp(WT_PushButton, PushButton::MenuIndicatorSize, option, widget);
1360 int indicatorSpacing = widgetLayoutProp(WT_PushButton, PushButton::TextToIconSpace, option, widget);
1361 w -= indicatorWidth + indicatorSpacing;
1364 drawKStylePrimitive(WT_PushButton, Generic::ArrowDown, option,
1365 handleRTL(bOpt,
QRect(x + w + indicatorSpacing, y, indicatorWidth, h)),
1366 pal, flags, p, widget);
1370 if (!bOpt->icon.isNull()) {
1372 icoOpt.
icon = bOpt->icon;
1373 icoOpt.size = bOpt->iconSize;
1374 icoOpt.
active = flags & State_HasFocus;
1376 if (!bOpt->text.isEmpty()) {
1377 int margin = widgetLayoutProp(WT_PushButton, PushButton::TextToIconSpace, option, widget);
1381 int length = bOpt->iconSize.width() + margin
1385 int offset = (w - length) / 2;
1388 QRect rect =
QRect(
QPoint(x + offset, y + h / 2 - bOpt->iconSize.height() / 2), bOpt->iconSize);
1389 drawKStylePrimitive(WT_PushButton, Generic::Icon, option,
1390 handleRTL(bOpt, rect),
1391 pal, flags, p, widget, &icoOpt);
1394 x += offset + bOpt->iconSize.width() + margin;
1395 w = length - bOpt->iconSize.width() - margin;
1399 drawKStylePrimitive(WT_PushButton, Generic::Icon, option,
1401 pal, flags, p, widget, &icoOpt);
1406 x += (w - textW) / 2;
1411 drawKStylePrimitive(WT_PushButton, Generic::Text, option, handleRTL(bOpt,
QRect(x, y, w, h)),
1412 pal, flags, p, widget, &lbOpt);
1417 case CE_DockWidgetTitle: {
1423 QRect textRect = insideMargin(r, WT_DockWidget, DockWidget::TitleMargin, option, widget);
1424 drawKStylePrimitive(WT_DockWidget, DockWidget::TitlePanel, option, r, pal, flags, p, widget);
1427 lbOpt.
color = widgetLayoutProp(WT_DockWidget, DockWidget::TitleTextColor,
1429 drawKStylePrimitive(WT_DockWidget, Generic::Text, option, textRect, pal, flags, p, widget, &lbOpt);
1433 case CE_ToolBoxTabShape: {
1434 drawKStylePrimitive(WT_ToolBoxTab, ToolBoxTab::Panel, option, r, pal, flags, p, widget);
1451 QRect checkBox = subElementRect(SE_CheckBoxIndicator, option, widget);
1453 bOptTmp.rect = checkBox;
1454 drawPrimitive(PE_IndicatorCheckBox, &bOptTmp, p, widget);
1457 bOptTmp.rect = subElementRect(SE_CheckBoxContents, option, widget);
1458 drawControl(CE_CheckBoxLabel, &bOptTmp, p, widget);
1461 if (flags & State_HasFocus) {
1462 QRect focusRect = subElementRect(SE_CheckBoxFocusRect, option, widget);
1463 drawKStylePrimitive(WT_CheckBox, Generic::FocusIndicator, option, focusRect,
1464 pal, flags, p, widget);
1469 case CE_CheckBoxLabel: {
1477 if (!bOpt->icon.isNull()) {
1479 icoOpt.
icon = bOpt->icon;
1480 icoOpt.size = bOpt->iconSize;
1481 icoOpt.
active = flags & State_HasFocus;
1483 QRect iconRect(r.
x(), r.
y() + (r.
height() - bOpt->iconSize.height()) / 2,
1484 bOpt->iconSize.width(), bOpt->iconSize.height());
1485 drawKStylePrimitive(WT_CheckBox, Generic::Icon, option,
1486 handleRTL(bOpt, iconRect),
1487 pal, flags, p, widget, &icoOpt);
1489 textShift = bOpt->iconSize.width() +
1490 widgetLayoutProp(WT_RadioButton, RadioButton::BoxTextSpace, option, widget);
1493 if (!bOpt->text.isEmpty()) {
1495 drawKStylePrimitive(WT_CheckBox, Generic::Text, option,
1496 handleRTL(bOpt, r.
adjusted(textShift, 0, 0, 0)),
1497 pal, flags, p, widget, &lbOpt);
1503 case CE_RadioButton: {
1510 QRect indicator = subElementRect(SE_RadioButtonIndicator, option, widget);
1512 bOptTmp.rect = indicator;
1513 drawPrimitive(PE_IndicatorRadioButton, &bOptTmp, p, widget);
1516 bOptTmp.rect = subElementRect(SE_RadioButtonContents, option, widget);
1517 drawControl(CE_RadioButtonLabel, &bOptTmp, p, widget);
1520 if (flags & State_HasFocus) {
1521 QRect focusRect = subElementRect(SE_RadioButtonFocusRect, option, widget);
1522 drawKStylePrimitive(WT_RadioButton, Generic::FocusIndicator, option, focusRect,
1523 pal, flags, p, widget);
1528 case CE_RadioButtonLabel: {
1536 if (!bOpt->icon.isNull()) {
1538 icoOpt.
icon = bOpt->icon;
1539 icoOpt.
active = flags & State_HasFocus;
1540 icoOpt.size = bOpt->iconSize;
1542 QRect iconRect(r.
x(), r.
y() + (r.
height() - bOpt->iconSize.height()) / 2,
1543 bOpt->iconSize.width(), bOpt->iconSize.height());
1544 drawKStylePrimitive(WT_RadioButton, Generic::Icon, option,
1545 handleRTL(bOpt, iconRect),
1546 pal, flags, p, widget, &icoOpt);
1548 textShift = bOpt->iconSize.width() +
1549 widgetLayoutProp(WT_RadioButton, RadioButton::BoxTextSpace, option, widget);
1553 drawKStylePrimitive(WT_RadioButton, Generic::Text, option,
1554 handleRTL(bOpt, r.
adjusted(textShift, 0, 0, 0)),
1555 pal, flags, p, widget, &lbOpt);
1562 case CE_ProgressBarGroove: {
1563 drawKStylePrimitive(WT_ProgressBar, ProgressBar::Groove, option, r,
1564 pal, flags, p, widget);
1568 case CE_ProgressBarContents: {
1576 double progress = pbOpt->progress - pbOpt->minimum;
1577 int steps = qMax(pbOpt->maximum - pbOpt->minimum, 1);
1578 bool busyIndicator = (pbOpt->minimum == 0 && pbOpt->maximum == 0);
1579 bool horizontal = !pbOpt2 || pbOpt2->orientation ==
Qt::Horizontal;
1582 if (!progress && ! busyIndicator) {
1588 if (busyIndicator) {
1589 widthFrac = widgetLayoutProp(WT_ProgressBar, ProgressBar::BusyIndicatorSize, option, widget) / 100.0;
1591 widthFrac = progress / steps;
1595 int width = qMin(r.
width(), (int)(widthFrac *
double(r.
width())));
1596 int height = qMin(r.
height(), (int)(widthFrac * r.
height()));
1598 if (busyIndicator) {
1604 if (size > widgetLayoutProp(WT_ProgressBar, ProgressBar::MaxBusyIndicatorSize, option, widget)) {
1605 size = widgetLayoutProp(WT_ProgressBar, ProgressBar::MaxBusyIndicatorSize, option, widget);
1613 int remSize = (horizontal ? r.
width() : r.
height()) - size;
1618 int pstep = int(progress) % (2 * remSize);
1620 if (pstep > remSize) {
1623 pstep = -(pstep - 2 * remSize);
1626 QRect indicatorRect;
1628 indicatorRect =
QRect(r.
x() + pstep, r.
y(), size, r.
height());
1630 indicatorRect =
QRect(r.
x(), r.
y() + pstep, r.
width(), size);
1632 drawKStylePrimitive(WT_ProgressBar, ProgressBar::BusyIndicator, option, handleRTL(option, indicatorRect),
1633 pal, flags, p, widget);
1635 QRect indicatorRect;
1641 drawKStylePrimitive(WT_ProgressBar, ProgressBar::Indicator, option, handleRTL(option, indicatorRect),
1642 pal, flags, p, widget);
1647 case CE_ProgressBarLabel: {
1652 bool horizontal = !pbOpt2 || pbOpt2->orientation ==
Qt::Horizontal;
1658 if (!horizontal && !reverseLayout) {
1661 }
else if (!horizontal) {
1666 if (useSideText(pbOpt)) {
1677 int marWidth = widgetLayoutProp(WT_ProgressBar, ProgressBar::SideTextSpace, option, widget);
1679 drawKStylePrimitive(WT_ProgressBar, Generic::Text, option,
1681 pal, flags, p, widget, &lbOpt);
1686 lbOpt.
hAlign = pbOpt->textAlignment;
1691 double progress = pbOpt->progress - pbOpt->minimum;
1692 int steps = qMax(pbOpt->maximum - pbOpt->minimum, 1);
1693 bool busyIndicator = (steps <= 1);
1697 if (busyIndicator) {
1702 double widthFrac = progress / steps;;
1703 width = qMin(r.
width(), (int)(widthFrac * r.
width()));
1704 height = qMin(r.
height(), (int)(widthFrac * r.
height()));
1709 if (width || height) {
1712 }
else if (!reverseLayout) {
1718 drawKStylePrimitive(WT_ProgressBar, Generic::Text, option,
1720 pal, flags, p, widget, &lbOpt);
1724 }
else if (!reverseLayout) {
1730 drawKStylePrimitive(WT_ProgressBar, Generic::Text, option,
1732 pal, flags, p, widget, &lbOpt);
1736 drawKStylePrimitive(WT_ProgressBar, Generic::Text, option,
1738 pal, flags, p, widget, &lbOpt);
1746 case CE_MenuBarItem: {
1753 drawKStylePrimitive(WT_MenuBarItem, MenuBarItem::Panel, option, r,
1754 pal, flags, p, widget);
1757 QRect textRect = insideMargin(r, WT_MenuBarItem, MenuBarItem::Margin, option, widget);
1760 drawKStylePrimitive(WT_MenuBarItem, Generic::Text, option, textRect,
1761 pal, flags, p, widget, &lbOpt);
1766 case CE_MenuBarEmptyArea: {
1767 drawKStylePrimitive(WT_MenuBar, MenuBar::EmptyArea, option, r,
1768 pal, flags, p, widget);
1772 case CE_MenuEmptyArea:
1773 case CE_MenuVMargin:
1774 case CE_MenuHMargin: {
1775 drawKStylePrimitive(WT_Menu, Menu::Background, option, r,
1776 pal, flags, p, widget);
1783 drawKStylePrimitive(WT_Menu, Menu::Background, option, r,
1784 pal, flags, p, widget);
1792 QRect ir = insideMargin(r, WT_MenuItem, MenuItem::Margin, option, widget);
1796 int iconColW = miOpt->maxIconWidth;
1797 iconColW = qMax(iconColW, widgetLayoutProp(WT_MenuItem, MenuItem::IconWidth, option, widget));
1798 int checkColW = widgetLayoutProp(WT_MenuItem, MenuItem::CheckWidth, option, widget);
1799 int checkSpace = widgetLayoutProp(WT_MenuItem, MenuItem::CheckSpace, option, widget);
1801 int leftColW = iconColW;
1803 bool checkAlongsideIcon = (miOpt->menuHasCheckableItems &&
1804 widgetLayoutProp(WT_MenuItem, MenuItem::CheckAlongsideIcon, option, widget));
1805 if (checkAlongsideIcon) {
1806 leftColW = checkColW + checkSpace + iconColW;
1810 int rightColW = widgetLayoutProp(WT_MenuItem, MenuItem::ArrowSpace, option, widget) +
1811 widgetLayoutProp(WT_MenuItem, MenuItem::ArrowWidth, option, widget);
1815 drawKStylePrimitive(WT_MenuItem, MenuItem::CheckColumn, option, handleRTL(option, leftColRect),
1816 pal, flags, p, widget);
1820 drawKStylePrimitive(WT_MenuItem, MenuItem::Separator, option, ir, pal, flags, p, widget);
1825 bool active = (flags & State_Selected);
1829 drawKStylePrimitive(WT_MenuItem, MenuItem::ItemIndicator, option, handleRTL(option, r), pal, flags, p, widget);
1832 ColorMode textColor = (flags & State_Enabled) ? (widgetLayoutProp(WT_MenuItem, active ?
1833 MenuItem::ActiveTextColor :
1834 MenuItem::TextColor, option, widget))
1835 : (widgetLayoutProp(WT_MenuItem, active ?
1836 MenuItem::ActiveDisabledTextColor :
1837 MenuItem::DisabledTextColor, option, widget));
1842 if (!checkAlongsideIcon && !miOpt->icon.isNull()) {
1844 if (miOpt->checked) {
1845 drawKStylePrimitive(WT_MenuItem, MenuItem::CheckIcon,
1846 option, handleRTL(option, leftColRect), pal, flags,
1852 if (checkAlongsideIcon) {
1853 checkColRect =
QRect(leftColRect.x(), leftColRect.y(),
1854 checkColW, leftColRect.height());
1856 checkColRect = leftColRect;
1859 bool checked = miOpt->checked;
1861 drawKStylePrimitive(WT_MenuItem, checked ? MenuItem::CheckOn : MenuItem::CheckOff,
1862 option, handleRTL(option, checkColRect), pal, flags,
1865 drawKStylePrimitive(WT_MenuItem, checked ? MenuItem::RadioOn : MenuItem::RadioOff,
1866 option, handleRTL(option, checkColRect), pal, flags,
1871 if (!miOpt->icon.isNull()) {
1872 int iconSize = pixelMetric(PM_SmallIconSize);
1875 if (checkAlongsideIcon) {
1876 iconColRect =
QRect(leftColRect.x() + checkColW + checkSpace, leftColRect.y(),
1877 leftColRect.width() - (checkColW + checkSpace), leftColRect.height());
1879 iconColRect = leftColRect;
1882 icoOpt.
icon = miOpt->icon;
1883 icoOpt.
active = flags & State_Selected;
1884 drawKStylePrimitive(WT_MenuItem, Generic::Icon, option,
1885 handleRTL(option, centerRect(iconColRect, iconSize, iconSize)),
1886 pal, flags, p, widget, &icoOpt);
1890 leftColW += widgetLayoutProp(WT_MenuItem, MenuItem::IconSpace, option, widget);
1895 QFont font = miOpt->font;
1899 int tabPos = miOpt->text.indexOf(
QLatin1Char(
'\t'));
1901 text = miOpt->text.left(tabPos);
1902 QString accl = miOpt->text.mid(tabPos + 1);
1906 lbOpt.
color = textColor;
1908 drawKStylePrimitive(WT_MenuItem, Generic::Text, option, handleRTL(option, textRect),
1909 pal, flags, p, widget, &lbOpt);
1914 lbOpt.
color = textColor;
1915 drawKStylePrimitive(WT_MenuItem, Generic::Text, option, handleRTL(option, textRect),
1916 pal, flags, p, widget, &lbOpt);
1923 arrowColor.
color = textColor;
1925 int aw = widgetLayoutProp(WT_MenuItem, MenuItem::ArrowWidth, option, widget);
1928 drawKStylePrimitive(WT_MenuItem, option->direction ==
Qt::LeftToRight ?
1929 Generic::ArrowRight : Generic::ArrowLeft,
1930 option, handleRTL(option, arrowRect), pal, flags, p, widget, &arrowColor);
1936 case CE_ScrollBarAddLine:
1937 case CE_ScrollBarSubLine: {
1944 r = internalSubControlRect(CC_ScrollBar, slOpt,
1945 element == CE_ScrollBarAddLine ? SC_ScrollBarAddLine : SC_ScrollBarSubLine, widget);
1948 bool doubleButton =
false;
1951 if (element == CE_ScrollBarAddLine && widgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleBotButton, option, widget)) {
1952 doubleButton =
true;
1954 if (element == CE_ScrollBarSubLine && widgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleTopButton, option, widget)) {
1955 doubleButton =
true;
1959 if (flags & State_Horizontal) {
1963 bool leftAdds, rightAdds;
1973 if (flags & State_Sunken) {
1974 if (((slOpt->activeSubControls & SC_ScrollBarAddLine) && leftAdds) ||
1975 ((slOpt->activeSubControls & SC_ScrollBarSubLine) && !leftAdds)) {
1976 ab = DoubleButtonOption::Left;
1979 if (((slOpt->activeSubControls & SC_ScrollBarAddLine) && rightAdds) ||
1980 ((slOpt->activeSubControls & SC_ScrollBarSubLine) && !rightAdds)) {
1981 ab = DoubleButtonOption::Right;
1986 drawKStylePrimitive(WT_ScrollBar, ScrollBar::DoubleButtonHor,
1987 option, r, pal, flags, p, widget, &bOpt);
1993 colOpt.
color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ArrowColor, option, widget);
1994 if (ab == DoubleButtonOption::Left) {
1995 colOpt.color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ActiveArrowColor, option, widget);
1998 drawKStylePrimitive(WT_ScrollBar, Generic::ArrowLeft, option, leftSubButton, pal,
1999 flags, p, widget, &colOpt);
2002 QRect rightSubButton;
2008 colOpt.color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ArrowColor, option, widget);
2009 if (ab == DoubleButtonOption::Right) {
2010 colOpt.color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ActiveArrowColor, option, widget);
2013 drawKStylePrimitive(WT_ScrollBar, Generic::ArrowRight, option, rightSubButton, pal,
2014 flags, p, widget, &colOpt);
2021 if (flags & State_Sunken) {
2022 if (slOpt->activeSubControls & SC_ScrollBarSubLine) {
2023 ab = DoubleButtonOption::Top;
2026 if (slOpt->activeSubControls & SC_ScrollBarAddLine) {
2027 ab = DoubleButtonOption::Bottom;
2033 drawKStylePrimitive(WT_ScrollBar, ScrollBar::DoubleButtonVert,
2034 option, r, pal, flags, p, widget, &bOpt);
2038 colOpt.
color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ArrowColor, option, widget);
2040 if (ab == DoubleButtonOption::Top) {
2041 colOpt.
color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ActiveArrowColor, option, widget);
2045 drawKStylePrimitive(WT_ScrollBar, Generic::ArrowUp, option, topSubButton, pal,
2046 flags, p, widget, &colOpt);
2054 colOpt.
color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ArrowColor, option, widget);
2056 if (ab == DoubleButtonOption::Bottom) {
2057 colOpt.
color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ActiveArrowColor, option, widget);
2060 drawKStylePrimitive(WT_ScrollBar, Generic::ArrowDown, option, botSubButton, pal,
2061 flags, p, widget, &colOpt);
2065 if (flags & State_Horizontal) {
2066 drawKStylePrimitive(WT_ScrollBar, ScrollBar::SingleButtonHor,
2067 option, r, pal, flags, p, widget);
2070 bool active =
false;
2072 if (element == CE_ScrollBarAddLine) {
2074 primitive = Generic::ArrowRight;
2076 primitive = Generic::ArrowLeft;
2079 if ((slOpt->activeSubControls & SC_ScrollBarAddLine) && (flags & State_Sunken)) {
2084 primitive = Generic::ArrowLeft;
2086 primitive = Generic::ArrowRight;
2089 if ((slOpt->activeSubControls & SC_ScrollBarSubLine) && (flags & State_Sunken)) {
2095 colOpt.
color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ArrowColor, option, widget);
2097 colOpt.
color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ActiveArrowColor, option, widget);
2100 drawKStylePrimitive(WT_ScrollBar, primitive, option, r, pal,
2101 flags, p, widget, &colOpt);
2103 drawKStylePrimitive(WT_ScrollBar, ScrollBar::SingleButtonVert,
2104 option, r, pal, flags, p, widget);
2107 bool active =
false;
2109 if (element == CE_ScrollBarAddLine) {
2110 primitive = Generic::ArrowDown;
2111 if ((slOpt->activeSubControls & SC_ScrollBarAddLine) && (flags & State_Sunken)) {
2115 primitive = Generic::ArrowUp;
2116 if ((slOpt->activeSubControls & SC_ScrollBarSubLine) && (flags & State_Sunken)) {
2122 colOpt.
color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ArrowColor, option, widget);
2124 colOpt.
color = widgetLayoutProp(WT_ScrollBar, ScrollBar::ActiveArrowColor, option, widget);
2127 drawKStylePrimitive(WT_ScrollBar, primitive, option, r, pal,
2128 flags, p, widget, &colOpt);
2138 case CE_ScrollBarSlider: {
2139 drawKStylePrimitive(WT_ScrollBar,
2140 (flags & State_Horizontal) ? ScrollBar::SliderHor :
2141 ScrollBar::SliderVert,
2142 option, r, pal, flags, p, widget);
2146 case CE_ScrollBarAddPage: {
2152 if (flags & State_Horizontal)
2153 drawKStylePrimitive(WT_ScrollBar,
2154 (slOpt->direction ==
Qt::LeftToRight) ? ScrollBar::GrooveAreaHorRight :
2155 ScrollBar::GrooveAreaHorLeft,
2156 option, r, pal, flags, p, widget);
2158 drawKStylePrimitive(WT_ScrollBar, ScrollBar::GrooveAreaVertBottom,
2159 option, r, pal, flags, p, widget);
2163 case CE_ScrollBarSubPage: {
2169 if (flags & State_Horizontal)
2170 drawKStylePrimitive(WT_ScrollBar,
2171 (slOpt->direction ==
Qt::LeftToRight) ? ScrollBar::GrooveAreaHorLeft :
2172 ScrollBar::GrooveAreaHorRight,
2173 option, r, pal, flags, p, widget);
2175 drawKStylePrimitive(WT_ScrollBar, ScrollBar::GrooveAreaVertTop,
2176 option, r, pal, flags, p, widget);
2182 case CE_TabBarTabShape: {
2189 int tabOverlap = pixelMetric(PM_TabBarTabOverlap, option, widget);
2192 if (!beginning && !onlyOne) {
2193 switch (tabSide(tabOpt)) {
2197 r.
adjust(-tabOverlap, 0, 0, 0);
2199 r.
adjust(0, 0, tabOverlap, 0);
2204 r.
adjust(0, -tabOverlap, 0, 0);
2211 switch (tabSide(tabOpt)) {
2213 prim = TabBar::NorthTab;
break;
2215 prim = TabBar::SouthTab;
break;
2217 prim = TabBar::EastTab;
break;
2219 prim = TabBar::WestTab;
break;
2222 drawKStylePrimitive(WT_TabBar, prim, option, r, pal, flags, p, widget);
2227 case CE_TabBarTabLabel: {
2234 QRect labelRect = subElementRect(SE_TabBarTabText, option, widget);
2236 Side tabSd = tabSide(tabOpt);
2240 if (!tabOpt->icon.isNull()) {
2242 QSize iconSize = tabV3.iconSize;
2244 int iconExtent = pixelMetric(PM_SmallIconSize);
2245 iconSize =
QSize(iconExtent, iconExtent);
2249 icoOpt.
icon = tabOpt->icon;
2250 icoOpt.
active = flags & State_Selected;
2251 icoOpt.size = iconSize;
2253 if (tabOpt->text.isNull()) {
2255 drawKStylePrimitive(WT_TabBar, Generic::Icon, option, labelRect,
2256 pal, flags, p, widget, &icoOpt);
2263 if (tabSd == North || tabSd == South) {
2269 iconRect =
QRect(labelRect.
x(), labelRect.
y() + (labelRect.
height() - iconSize.
height() + 1) / 2,
2274 widgetLayoutProp(WT_TabBar, TabBar::TabTextToIconSpace, option, widget));
2281 widgetLayoutProp(WT_TabBar, TabBar::TabTextToIconSpace, option, widget));
2284 bool aboveIcon =
false;
2293 iconRect =
QRect(labelRect.
x() + (labelRect.
width() - iconSize.
width() + 1) / 2, labelRect.
y(),
2296 widgetLayoutProp(WT_TabBar, TabBar::TabTextToIconSpace, option, widget));
2298 iconRect =
QRect(labelRect.
x() + (labelRect.
width() - iconSize.
width() + 1) / 2,
2302 widgetLayoutProp(WT_TabBar, TabBar::TabTextToIconSpace, option, widget));
2307 drawKStylePrimitive(WT_TabBar, Generic::Icon, option, iconRect,
2308 pal, flags, p, widget, &icoOpt);
2312 if (!tabOpt->text.isNull()) {
2318 int primitive = Generic::Text;
2320 if (tabSd == East) {
2321 primitive = TabBar::EastText;
2322 }
else if (tabSd == West) {
2323 primitive = TabBar::WestText;
2326 drawKStylePrimitive(WT_TabBar, primitive, option, labelRect,
2327 pal, flags, p, widget, &lbOpt);
2331 if (tabOpt->state & State_HasFocus) {
2332 QRect focusRect = marginAdjustedTab(tabOpt, TabBar::TabFocusMargin);
2333 drawKStylePrimitive(WT_TabBar, Generic::FocusIndicator, option, focusRect,
2334 pal, flags, p, widget);
2340 if (flags & State_Horizontal) {
2341 drawKStylePrimitive(WT_ToolBar, ToolBar::PanelHor, option, r, pal, flags, p, widget);
2343 drawKStylePrimitive(WT_ToolBar, ToolBar::PanelVert, option, r, pal, flags, p, widget);
2349 case CE_HeaderSection: {
2350 if (
const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
2351 drawKStylePrimitive(WT_Header, (header->orientation ==
Qt::Horizontal) ? Header::SectionHor : Header::SectionVert,
2352 option, r, pal, flags, p, widget);
2357 case CE_HeaderLabel: {
2358 if (
const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
2360 if (!header->icon.isNull()) {
2361 bool enabled = flags & State_Enabled;
2372 drawKStylePrimitive(WT_Header, Generic::Icon, option, iconRect, pal, flags, p, widget, &iconOpt);
2375 int spacing = widgetLayoutProp(WT_Header, Header::TextToIconSpace, option, widget);
2376 if (reverseLayout) {
2384 lbOpt.
hAlign = header->textAlignment;
2385 drawKStylePrimitive(WT_Header, Generic::Text, option, textRect, pal, flags, p, widget, &lbOpt);
2391 if (flags & State_Horizontal) {
2392 drawKStylePrimitive(WT_Splitter, Splitter::HandleHor, option, r, pal, flags, p, widget);
2394 drawKStylePrimitive(WT_Splitter, Splitter::HandleVert, option, r, pal, flags, p, widget);
2409 case SH_ComboBox_ListMouseTracking:
2412 case SH_MenuBar_MouseTracking:
2413 case SH_Menu_MouseTracking:
2416 case SH_Menu_SubMenuPopupDelay:
2419 case SH_TitleBar_NoBorder:
2420 return widgetLayoutProp(WT_Window, Window::NoTitleFrame, option, widget);
2422 case SH_GroupBox_TextLabelVerticalAlignment:
2423 if (widgetLayoutProp(WT_GroupBox, GroupBox::TextAlignTop, option, widget)) {
2429 case SH_GroupBox_TextLabelColor: {
2430 ColorMode cm(widgetLayoutProp(WT_GroupBox, GroupBox::TitleTextColor,
2432 return cm.
color(option ? option->palette : qApp->palette()).rgba();
2435 case SH_DialogButtonLayout:
2438 case SH_ScrollBar_MiddleClickAbsolutePosition:
2442 case SH_ItemView_ShowDecorationSelected:
2445 case SH_ItemView_ActivateItemOnSingleClick:
2447 case SH_KCustomStyleElement:
2451 return d->styleElements.value(widget->
objectName(), 0);
2454 case SH_FormLayoutFormAlignment:
2458 case SH_FormLayoutLabelAlignment:
2461 case SH_FormLayoutFieldGrowthPolicy:
2464 case SH_FormLayoutWrapPolicy:
2467 case SH_MessageBox_TextInteractionFlags:
2470 case SH_DialogButtonBox_ButtonsHaveIcons: {
2473 return g.
readEntry(
"ShowIconsOnPushButtons",
true);
2475 case SH_ItemView_ArrowKeysNavigateIntoChildren:
2477 case SH_Widget_Animate: {
2479 return g.
readEntry(
"GraphicEffectsLevel", 0);
2491 case PM_SmallIconSize:
2492 case PM_ButtonIconSize:
2494 case PM_ToolBarIconSize:
2496 case PM_LargeIconSize:
2498 case PM_MessageBoxIconSize:
2502 case PM_DefaultFrameWidth:
2503 if (qstyleoption_cast<const QStyleOptionGroupBox *>(option)) {
2504 return widgetLayoutProp(WT_GroupBox, GroupBox::FrameWidth, option, widget);
2506 return widgetLayoutProp(WT_Generic, Generic::DefaultFrameWidth, option, widget);
2509 case PM_DefaultChildMargin:
2510 case PM_DefaultTopLevelMargin:
2511 return widgetLayoutProp(WT_Generic, Generic::DefaultLayoutMargin, option, widget);
2513 case PM_LayoutHorizontalSpacing:
2514 case PM_LayoutVerticalSpacing:
2518 case PM_DefaultLayoutSpacing:
2519 return widgetLayoutProp(WT_Generic, Generic::DefaultLayoutSpacing, option, widget);
2521 case PM_LayoutLeftMargin:
2522 case PM_LayoutTopMargin:
2523 case PM_LayoutRightMargin:
2524 case PM_LayoutBottomMargin: {
2527 || (widget && widget->
isWindow())) {
2528 marginMetric = PM_DefaultTopLevelMargin;
2530 marginMetric = PM_DefaultChildMargin;
2532 return pixelMetric(marginMetric, option, widget);
2535 case PM_ButtonMargin:
2538 case PM_ButtonDefaultIndicator:
2542 return widgetLayoutProp(WT_PushButton, PushButton::DefaultIndicatorMargin, option, widget);
2543 case PM_ButtonShiftHorizontal:
2544 return widgetLayoutProp(WT_PushButton, PushButton::PressedShiftHorizontal, option, widget);
2545 case PM_ButtonShiftVertical:
2546 return widgetLayoutProp(WT_PushButton, PushButton::PressedShiftVertical, option, widget);
2547 case PM_MenuButtonIndicator:
2548 if (qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
2549 return widgetLayoutProp(WT_ToolButton, ToolButton::MenuIndicatorSize, option, widget);
2551 return widgetLayoutProp(WT_PushButton, PushButton::MenuIndicatorSize, option, widget);
2554 case PM_SplitterWidth:
2555 return widgetLayoutProp(WT_Splitter, Splitter::Width, option, widget);
2557 case PM_IndicatorWidth:
2558 case PM_IndicatorHeight:
2559 return widgetLayoutProp(WT_CheckBox, CheckBox::Size, option, widget);
2561 case PM_ExclusiveIndicatorWidth:
2562 case PM_ExclusiveIndicatorHeight:
2563 return widgetLayoutProp(WT_RadioButton, RadioButton::Size, option, widget);
2565 case PM_DockWidgetFrameWidth:
2566 return widgetLayoutProp(WT_DockWidget, DockWidget::FrameWidth, option, widget);
2568 case PM_DockWidgetSeparatorExtent:
2569 return widgetLayoutProp(WT_DockWidget, DockWidget::SeparatorExtent, option, widget);
2574 case PM_DockWidgetTitleMargin:
2575 return widgetLayoutProp(WT_DockWidget, DockWidget::TitleMargin, option, widget);
2577 case PM_ProgressBarChunkWidth:
2578 return widgetLayoutProp(WT_ProgressBar, ProgressBar::Precision, option, widget);
2580 case PM_MenuBarPanelWidth:
2583 case PM_MenuBarHMargin: {
2586 int spaceL = widgetLayoutProp(WT_MenuBar, MenuBar::Margin, option, widget) + widgetLayoutProp(WT_MenuBar, MenuBar::Margin + Left, option, widget);
2591 case PM_MenuBarVMargin: {
2593 int spaceT = widgetLayoutProp(WT_MenuBar, MenuBar::Margin, option, widget) + widgetLayoutProp(WT_MenuBar, MenuBar::Margin + Top, option, widget);
2597 case PM_MenuBarItemSpacing:
2598 return widgetLayoutProp(WT_MenuBar, MenuBar::ItemSpacing, option, widget);
2600 case PM_MenuDesktopFrameWidth:
2603 case PM_MenuPanelWidth:
2604 return widgetLayoutProp(WT_Menu, Menu::FrameWidth, option, widget);
2625 case PM_MenuScrollerHeight:
2626 return widgetLayoutProp(WT_Menu, Menu::ScrollerHeight, option, widget);
2628 case PM_MenuTearoffHeight:
2629 return widgetLayoutProp(WT_Menu, Menu::TearOffHeight, option, widget);
2631 case PM_TabBarTabHSpace: {
2635 if (tabOpt->text.isNull() && !tabOpt->icon.isNull()) {
2638 if (tabOpt->icon.isNull() && !tabOpt->text.isNull()) {
2643 return widgetLayoutProp(WT_TabBar, TabBar::TabTextToIconSpace, option, widget);
2646 case PM_TabBarTabVSpace:
2649 case PM_TabBarBaseHeight:
2650 return widgetLayoutProp(WT_TabBar, TabBar::BaseHeight, option, widget);
2652 case PM_TabBarBaseOverlap:
2653 return widgetLayoutProp(WT_TabBar, TabBar::BaseOverlap, option, widget);
2655 case PM_TabBarTabOverlap:
2656 return widgetLayoutProp(WT_TabBar, TabBar::TabOverlap, option, widget);
2658 case PM_TabBarScrollButtonWidth:
2659 return widgetLayoutProp(WT_TabBar, TabBar::ScrollButtonWidth, option, widget);
2661 case PM_TabBarTabShiftVertical:
2664 case PM_TabBarTabShiftHorizontal:
2667 case PM_SliderControlThickness:
2668 return widgetLayoutProp(WT_Slider, Slider::HandleThickness, option, widget);
2670 case PM_SliderLength:
2671 return widgetLayoutProp(WT_Slider, Slider::HandleLength, option, widget);
2673 case PM_SliderThickness: {
2675 return widgetLayoutProp(WT_Slider, Slider::HandleThickness, option, widget);
2678 case PM_SpinBoxFrameWidth:
2679 return widgetLayoutProp(WT_SpinBox, SpinBox::FrameWidth, option, widget);
2681 case PM_ComboBoxFrameWidth:
2682 return widgetLayoutProp(WT_ComboBox, ComboBox::FrameWidth, option, widget);
2684 case PM_HeaderMarkSize:
2685 return widgetLayoutProp(WT_Header, Header::MarkSize, option, widget);
2687 case PM_HeaderMargin:
2688 return widgetLayoutProp(WT_Header, Header::TextToIconSpace, option, widget);
2690 case PM_ToolBarFrameWidth:
2691 return widgetLayoutProp(WT_ToolBar, ToolBar::FrameWidth, option, widget);
2693 case PM_ToolBarHandleExtent:
2694 return widgetLayoutProp(WT_ToolBar, ToolBar::HandleExtent, option, widget);
2696 case PM_ToolBarSeparatorExtent:
2697 return widgetLayoutProp(WT_ToolBar, ToolBar::SeparatorExtent, option, widget);
2699 case PM_ToolBarExtensionExtent:
2700 return widgetLayoutProp(WT_ToolBar, ToolBar::ExtensionExtent, option, widget);
2702 case PM_ToolBarItemMargin:
2703 return widgetLayoutProp(WT_ToolBar, ToolBar::ItemMargin, option, widget);
2705 case PM_ToolBarItemSpacing:
2706 return widgetLayoutProp(WT_ToolBar, ToolBar::ItemSpacing, option, widget);
2708 case PM_ScrollBarExtent:
2709 return widgetLayoutProp(WT_ScrollBar, ScrollBar::BarWidth, option, widget);
2711 case PM_TitleBarHeight:
2712 return widgetLayoutProp(WT_Window, Window::TitleHeight, option, widget);
2723 Q_UNUSED(control1); Q_UNUSED(control2); Q_UNUSED(orientation);
2725 return pixelMetric(PM_DefaultLayoutSpacing, option, widget);
2730 switch (tbOpt->shape) {
2743 switch (tbOpt->shape) {
2756 switch (tbOpt->shape) {
2773 QRect r = tabOpt->rect;
2777 bool vertical = isVerticalTab(tabOpt);
2778 bool flip = isReflectedTab(tabOpt);
2783 QRect contentArea = insideMargin(idializedGeometry, WT_TabBar, property, tabOpt,
nullptr);
2785 int leftMargin = contentArea.x();
2786 int rightMargin = idializedGeometry.
width() - 1 - contentArea.right();
2787 int topMargin = contentArea.y();
2788 int botMargin = idializedGeometry.
height() - 1 - contentArea.bottom();
2791 int t = rightMargin;
2792 rightMargin = topMargin;
2793 topMargin = leftMargin;
2794 leftMargin = botMargin;
2798 qSwap(leftMargin, rightMargin);
2801 qSwap(topMargin, botMargin);
2804 qSwap(leftMargin, rightMargin);
2811 r.
height() - 1 - botMargin));
2818 if (widgetLayoutProp(WT_ProgressBar, ProgressBar::SideText) == 0) {
2826 if (!pbOpt->textVisible) {
2836 if (pbOpt->minimum == pbOpt->maximum) {
2840 int widthAlloc = pbOpt->fontMetrics.width(
QLatin1String(
"100%"));
2842 if (pbOpt->fontMetrics.width(pbOpt->text) > widthAlloc) {
2852 2 * widgetLayoutProp(WT_ProgressBar, ProgressBar::SideTextSpace);
2857 QRect r = option->rect;
2860 case SE_PushButtonContents: {
2867 r = insideMargin(r, WT_PushButton, PushButton::DefaultIndicatorMargin, option, widget);
2870 return insideMargin(r, WT_PushButton, PushButton::ContentsMargin, option, widget);
2873 case SE_PushButtonFocusRect: {
2880 r = insideMargin(r, WT_PushButton, PushButton::DefaultIndicatorMargin, option, widget);
2883 return insideMargin(r, WT_PushButton, PushButton::FocusMargin, option, widget);
2886 case SE_ToolBoxTabContents: {
2887 return insideMargin(r, WT_ToolBoxTab, ToolBoxTab::Margin, option, widget);
2890 case SE_CheckBoxContents: {
2891 r.
setX(r.
x() + widgetLayoutProp(WT_CheckBox, CheckBox::Size, option, widget) +
2892 widgetLayoutProp(WT_CheckBox, CheckBox::BoxTextSpace, option, widget));
2893 return handleRTL(option, r);
2896 case SE_RadioButtonContents: {
2897 r.
setX(r.
x() + widgetLayoutProp(WT_RadioButton, RadioButton::Size, option, widget) +
2898 widgetLayoutProp(WT_RadioButton, RadioButton::BoxTextSpace, option, widget));
2899 return handleRTL(option, r);
2902 case SE_CheckBoxFocusRect: {
2910 if (bOpt->text.isEmpty()) {
2913 handleRTL(option, subElementRect(SE_CheckBoxIndicator, option, widget));
2914 ret = insideMargin(checkRect, WT_CheckBox, CheckBox::NoLabelFocusMargin, option, widget);
2917 QRect contentsRect =
2918 handleRTL(option, subElementRect(SE_CheckBoxContents, option, widget));
2919 ret = insideMargin(contentsRect, WT_CheckBox, CheckBox::FocusMargin, option, widget);
2922 return handleRTL(option, ret);
2925 case SE_RadioButtonFocusRect: {
2927 QRect contentsRect =
2928 handleRTL(option, subElementRect(SE_RadioButtonContents, option, widget));
2931 return handleRTL(option,
2932 insideMargin(contentsRect, WT_RadioButton,
2933 RadioButton::FocusMargin, option, widget));
2936 case SE_ProgressBarGroove: {
2938 if (useSideText(pbOpt)) {
2947 case SE_ProgressBarContents: {
2948 QRect grooveRect = subElementRect(SE_ProgressBarGroove, option, widget);
2949 return insideMargin(grooveRect, WT_ProgressBar, ProgressBar::GrooveMargin, option, widget);
2952 case SE_ProgressBarLabel: {
2954 if (useSideText(pbOpt)) {
2955 int width = sideTextWidth(pbOpt);
2960 return subElementRect(SE_PushButtonContents, option, widget);
2964 case SE_TabWidgetTabContents: {
2971 if (tabOpt->lineWidth == 0) {
2978 int m = widgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin, option, widget);
2979 int top = m + widgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin + Top,
2981 int bot = m + widgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin + Bot,
2983 int left = m + widgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin + Left,
2985 int right = m + widgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin + Right,
2988 switch (tabOpt->shape) {
2991 return pane.
adjusted(left, top, -right, -bot);
2994 return pane.
adjusted(bot, left, -top, -right);
2997 return pane.
adjusted(right, bot, -left, -top);
3000 return pane.
adjusted(top, right, -bot, -left);
3004 case SE_TabBarTabText: {
3010 QRect r = marginAdjustedTab(tabOpt, TabBar::TabContentsMargin);
3013 switch (tov3.shape) {
3019 r.
adjust(tov3.leftButtonSize.width(), 0, -tov3.rightButtonSize.width(), 0);
3021 r.
adjust(tov3.rightButtonSize.width(), 0, -tov3.leftButtonSize.width(), 0);
3026 r.
adjust(0, tov3.leftButtonSize.width(), 0, -tov3.rightButtonSize.width());
3030 r.
adjust(0, tov3.rightButtonSize.width(), 0, -tov3.leftButtonSize.width());
3048 State flags = opt->state;
3049 QRect r = opt->rect;
3053 case CC_ScrollBar: {
3055 if ((mutableOpt->subControls & SC_ScrollBarSubLine) || (mutableOpt->subControls & SC_ScrollBarAddLine)) {
3057 mutableOpt->subControls |= SC_ScrollBarSubPage | SC_ScrollBarAddLine;
3064 if (
const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
3065 QRect groove = subControlRect(CC_Slider, slider, SC_SliderGroove, w);
3066 QRect handle = subControlRect(CC_Slider, slider, SC_SliderHandle, w);
3069 if (slider->subControls & SC_SliderTickmarks) {
3072 tmpSlider.subControls = SC_SliderTickmarks;
3076 if ((slider->subControls & SC_SliderGroove) && groove.
isValid()) {
3077 drawKStylePrimitive(WT_Slider, hor ? Slider::GrooveHor : Slider::GrooveVert, opt, groove, pal, flags, p, w);
3080 if (slider->subControls & SC_SliderHandle) {
3081 drawKStylePrimitive(WT_Slider, hor ? Slider::HandleHor : Slider::HandleVert, opt, handle, pal, flags, p, w);
3083 if (slider->state & State_HasFocus) {
3084 QRect focus = subElementRect(SE_SliderFocusRect, slider, w);
3085 drawKStylePrimitive(WT_Slider, Generic::FocusIndicator, opt, focus, pal, flags, p, w,
nullptr);
3093 if (
const QStyleOptionSpinBox *sb = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
3094 bool activeSbUp = sb->activeSubControls & SC_SpinBoxUp && (flags & State_Sunken);
3095 bool activeSbDown = sb->activeSubControls & SC_SpinBoxDown && (flags & State_Sunken);
3097 if (sb->subControls & SC_SpinBoxFrame) {
3098 drawKStylePrimitive(WT_SpinBox, Generic::Frame, opt, r, pal, flags, p, w);
3101 if (sb->subControls & SC_SpinBoxEditField) {
3102 QRect editField = subControlRect(CC_SpinBox, opt, SC_SpinBoxEditField, w);
3103 drawKStylePrimitive(WT_SpinBox, SpinBox::EditField, opt, editField, pal, flags, p, w);
3106 QRect upRect, downRect;
3107 if (sb->subControls & (SC_SpinBoxUp | SC_SpinBoxDown)) {
3108 upRect = subControlRect(CC_SpinBox, opt, SC_SpinBoxUp, w);
3109 downRect = subControlRect(CC_SpinBox, opt, SC_SpinBoxDown, w);
3110 QRect buttonAreaRect = upRect | downRect;
3111 drawKStylePrimitive(WT_SpinBox, SpinBox::ButtonArea, opt, buttonAreaRect, pal, flags, p, w);
3114 if (sb->subControls & SC_SpinBoxUp) {
3116 State upFlags = flags;
3118 upFlags |= State_Sunken;
3120 upFlags &= ~State_Sunken;
3123 drawKStylePrimitive(WT_SpinBox, SpinBox::UpButton, opt, upRect, pal, upFlags, p, w);
3128 primitive = SpinBox::PlusSymbol;
3130 primitive = Generic::ArrowUp;
3132 drawKStylePrimitive(WT_SpinBox, primitive, opt, upRect, pal, upFlags, p, w);
3135 if (sb->subControls & SC_SpinBoxDown) {
3137 State downFlags = flags;
3139 downFlags |= State_Sunken;
3141 downFlags &= ~State_Sunken;
3144 drawKStylePrimitive(WT_SpinBox, SpinBox::DownButton, opt, downRect, pal, downFlags, p, w);
3149 primitive = SpinBox::MinusSymbol;
3151 primitive = Generic::ArrowDown;
3153 drawKStylePrimitive(WT_SpinBox, primitive, opt, downRect, pal, downFlags, p, w);
3162 if (cb->subControls & SC_ComboBoxFrame) {
3163 drawKStylePrimitive(WT_ComboBox, Generic::Frame, opt, r, pal, flags, p, w);
3166 if (cb->state & State_HasFocus) {
3167 QRect editField = subControlRect(CC_ComboBox, opt, SC_ComboBoxEditField, w);
3168 QRect focusRect = insideMargin(editField, WT_ComboBox, ComboBox::FocusMargin, opt, w);
3169 drawKStylePrimitive(WT_ComboBox, Generic::FocusIndicator, opt, focusRect, pal, flags, p, w,
nullptr);
3173 if (cb->subControls & SC_ComboBoxEditField) {
3174 QRect editField = subControlRect(CC_ComboBox, opt, SC_ComboBoxEditField, w);
3175 drawKStylePrimitive(WT_ComboBox, ComboBox::EditField, opt, editField, pal, flags, p, w);
3178 if (cb->subControls & SC_ComboBoxArrow) {
3179 QRect buttonRect = subControlRect(CC_ComboBox, opt, SC_ComboBoxArrow, w);
3180 drawKStylePrimitive(WT_ComboBox, ComboBox::Button, opt, buttonRect, pal, flags, p, w);
3183 drawKStylePrimitive(WT_ComboBox, Generic::ArrowDown, opt, buttonRect, pal, flags, p, w);
3191 case CC_ToolButton: {
3193 QRect buttonRect = subControlRect(cc, tool, SC_ToolButton, w);
3194 QRect menuRect = subControlRect(cc, tool, SC_ToolButtonMenu, w);
3197 State bflags = tool->state;
3198 if (bflags & State_AutoRaise) {
3199 if (!(bflags & State_MouseOver)) {
3200 bflags &= ~State_Raised;
3203 State mflags = bflags;
3208 if (tool->subControls & SC_ToolButton) {
3209 if (bflags & (State_Sunken | State_On | State_Raised)) {
3210 tOpt.rect = buttonRect;
3211 tOpt.state = bflags;
3212 drawPrimitive(PE_PanelButtonTool, &tOpt, p, w);
3216 if (tool->subControls & SC_ToolButtonMenu) {
3217 tOpt.rect = menuRect;
3218 tOpt.state = mflags;
3219 drawPrimitive(PE_IndicatorButtonDropDown, &tOpt, p, w);
3224 int size = widgetLayoutProp(WT_ToolButton, ToolButton::InlineMenuIndicatorSize, opt, w);
3227 int xOff = widgetLayoutProp(WT_ToolButton, ToolButton::InlineMenuIndicatorXOff, opt, w);
3228 int yOff = widgetLayoutProp(WT_ToolButton, ToolButton::InlineMenuIndicatorYOff, opt, w);
3232 tOpt.state = bflags;
3233 drawPrimitive(PE_IndicatorButtonDropDown, &tOpt, p, w);
3237 if (flags & State_HasFocus) {
3238 QRect focusRect = insideMargin(r, WT_ToolButton, ToolButton::FocusMargin, opt, w);
3239 tOpt.rect = focusRect;
3240 tOpt.state = bflags;
3241 drawKStylePrimitive(WT_ToolButton, Generic::FocusIndicator, &tOpt, focusRect, pal, bflags, p, w);
3246 labelOpt.rect = buttonRect;
3247 drawControl(CE_ToolButtonLabel, &labelOpt, p, w);
3262 drawKStylePrimitive(WT_Window, Window::TitlePanel, opt, r, pal, flags, p, w);
3266 QRect textRect = subControlRect(CC_TitleBar, tb, SC_TitleBarLabel, w);
3268 textOpt.
color = widgetLayoutProp(WT_Window, Window::TitleTextColor, opt, w);
3269 drawKStylePrimitive(WT_Window, Generic::Text, opt, textRect,
3270 pal, flags, p, w, &textOpt);
3273 buttonKOpt.
icon = tb->icon;
3275 if ((tb->subControls & SC_TitleBarSysMenu) &&
3277 buttonKOpt.
active = (tb->activeSubControls & SC_TitleBarSysMenu)
3278 && (tb->state & State_Sunken);
3279 QRect br = subControlRect(CC_TitleBar, tb, SC_TitleBarSysMenu, w);
3280 drawKStylePrimitive(WT_Window, Window::ButtonMenu, opt, br, pal, flags, p, w,
3284 if ((tb->subControls & SC_TitleBarMinButton) &&
3286 buttonKOpt.
active = (tb->activeSubControls & SC_TitleBarMinButton)
3287 && (tb->state & State_Sunken);
3288 QRect br = subControlRect(CC_TitleBar, tb, SC_TitleBarMinButton, w);
3289 drawKStylePrimitive(WT_Window, Window::ButtonMin, opt, br, pal, flags, p, w,
3293 if ((tb->subControls & SC_TitleBarMaxButton) &&
3295 buttonKOpt.
active = (tb->activeSubControls & SC_TitleBarMaxButton)
3296 && (tb->state & State_Sunken);
3297 QRect br = subControlRect(CC_TitleBar, tb, SC_TitleBarMaxButton, w);
3298 drawKStylePrimitive(WT_Window, Window::ButtonMax, opt, br, pal, flags, p, w,
3302 if ((tb->subControls & SC_TitleBarCloseButton) &&
3306 buttonKOpt.
active = (tb->activeSubControls & SC_TitleBarCloseButton)
3307 && (tb->state & State_Sunken);
3308 QRect br = subControlRect(CC_TitleBar, tb, SC_TitleBarCloseButton, w);
3309 drawKStylePrimitive(WT_Window, Window::ButtonClose, opt, br, pal, flags, p, w,
3313 if ((tb->subControls & SC_TitleBarNormalButton) &&
3318 buttonKOpt.
active = (tb->activeSubControls & SC_TitleBarNormalButton)
3319 && (tb->state & State_Sunken);
3320 QRect br = subControlRect(CC_TitleBar, tb, SC_TitleBarNormalButton, w);
3321 drawKStylePrimitive(WT_Window, Window::ButtonRestore, opt, br, pal, flags, p, w,
3325 if (tb->subControls & SC_TitleBarShadeButton) {
3326 buttonKOpt.
active = (tb->activeSubControls & SC_TitleBarShadeButton)
3327 && (tb->state & State_Sunken);
3328 QRect br = subControlRect(CC_TitleBar, tb, SC_TitleBarShadeButton, w);
3329 drawKStylePrimitive(WT_Window, Window::ButtonShade, opt, br, pal, flags, p, w,
3333 if (tb->subControls & SC_TitleBarUnshadeButton) {
3334 buttonKOpt.
active = (tb->activeSubControls & SC_TitleBarUnshadeButton)
3335 && (tb->state & State_Sunken);
3336 QRect br = subControlRect(CC_TitleBar, tb, SC_TitleBarUnshadeButton, w);
3337 drawKStylePrimitive(WT_Window, Window::ButtonUnshade, opt, br, pal, flags, p, w,
3341 if ((tb->subControls & SC_TitleBarContextHelpButton)
3343 buttonKOpt.
active = (tb->activeSubControls & SC_TitleBarContextHelpButton)
3344 && (tb->state & State_Sunken);
3345 QRect br = subControlRect(CC_TitleBar, tb, SC_TitleBarContextHelpButton, w);
3346 drawKStylePrimitive(WT_Window, Window::ButtonHelp, opt, br, pal, flags, p, w,
3363 QRect r = option->rect;
3365 if (control == CC_ScrollBar) {
3366 switch (subControl) {
3368 case SC_ScrollBarSubLine: {
3370 if (widgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleTopButton, option, widget)) {
3371 majorSize = widgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleButtonHeight, option, widget);
3373 majorSize = widgetLayoutProp(WT_ScrollBar, ScrollBar::SingleButtonHeight, option, widget);
3376 if (option->state & State_Horizontal) {
3377 return handleRTL(option,
QRect(r.
x(), r.
y(), majorSize, r.
height()));
3379 return handleRTL(option,
QRect(r.
x(), r.
y(), r.
width(), majorSize));
3385 case SC_ScrollBarAddLine: {
3387 if (widgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleBotButton, option, widget)) {
3388 majorSize = widgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleButtonHeight, option, widget);
3390 majorSize = widgetLayoutProp(WT_ScrollBar, ScrollBar::SingleButtonHeight, option, widget);
3393 if (option->state & State_Horizontal) {
3394 return handleRTL(option,
QRect(r.
right() - majorSize + 1, r.
y(), majorSize, r.
height()));
3396 return handleRTL(option,
QRect(r.
x(), r.
bottom() - majorSize + 1, r.
width(), majorSize));
3411 QRect r = option->rect;
3414 case CC_ScrollBar: {
3415 switch (subControl) {
3419 case SC_ScrollBarSubLine:
3420 case SC_ScrollBarAddLine:
3424 case SC_ScrollBarGroove: {
3425 QRect top = handleRTL(option, internalSubControlRect(control, option, SC_ScrollBarSubLine, widget));
3426 QRect bot = handleRTL(option, internalSubControlRect(control, option, SC_ScrollBarAddLine, widget));
3428 QPoint topLeftCorner, botRightCorner;
3429 if (option->state & State_Horizontal) {
3437 return handleRTL(option,
QRect(topLeftCorner, botRightCorner));
3440 case SC_ScrollBarFirst:
3441 case SC_ScrollBarLast:
3444 case SC_ScrollBarSlider: {
3448 QRect groove = handleRTL(option, subControlRect(control, option, SC_ScrollBarGroove, widget));
3451 if (slOpt->minimum == slOpt->maximum) {
3457 if (option->state & State_Horizontal) {
3458 space = groove.width();
3460 space = groove.height();
3464 int sliderSize = int(space *
float(slOpt->pageStep) /
3465 (slOpt->maximum - slOpt->minimum + slOpt->pageStep));
3467 if (sliderSize < widgetLayoutProp(WT_ScrollBar, ScrollBar::MinimumSliderHeight, option, widget)) {
3468 sliderSize = widgetLayoutProp(WT_ScrollBar, ScrollBar::MinimumSliderHeight, option, widget);
3471 if (sliderSize > space) {
3476 space = space - sliderSize;
3483 int pos = qRound(
float(slOpt->sliderPosition - slOpt->minimum) /
3484 (slOpt->maximum - slOpt->minimum) * space);
3485 if (option->state & State_Horizontal) {
3486 return handleRTL(option,
QRect(groove.x() + pos, groove.y(), sliderSize, groove.height()));
3488 return handleRTL(option,
QRect(groove.x(), groove.y() + pos, groove.width(), sliderSize));
3492 case SC_ScrollBarSubPage: {
3494 QRect slider = handleRTL(option, subControlRect(control, option, SC_ScrollBarSlider, widget));
3495 QRect groove = handleRTL(option, subControlRect(control, option, SC_ScrollBarGroove, widget));
3498 if (option->state & State_Horizontal) {
3499 return handleRTL(option,
QRect(groove.
x(), groove.
y(), slider.
x() - groove.
x(), groove.
height()));
3501 return handleRTL(option,
QRect(groove.
x(), groove.
y(), groove.
width(), slider.
y() - groove.
y()));
3505 case SC_ScrollBarAddPage: {
3507 QRect slider = handleRTL(option, subControlRect(control, option, SC_ScrollBarSlider, widget));
3508 QRect groove = handleRTL(option, subControlRect(control, option, SC_ScrollBarGroove, widget));
3511 if (option->state & State_Horizontal)
3512 return handleRTL(option,
3515 return handleRTL(option,
3525 if (
const QStyleOptionSpinBox *sb = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
3527 int fw = widgetLayoutProp(WT_SpinBox, SpinBox::FrameWidth, option, widget);
3528 int bw = widgetLayoutProp(WT_SpinBox, SpinBox::ButtonWidth, option, widget);
3529 int bm = widgetLayoutProp(WT_SpinBox, SpinBox::ButtonMargin, option, widget);
3530 int bml = bm + widgetLayoutProp(WT_SpinBox, SpinBox::ButtonMargin + Left, option, widget);
3531 int bmr = bm + widgetLayoutProp(WT_SpinBox, SpinBox::ButtonMargin + Right, option, widget);
3532 int bmt = bm + widgetLayoutProp(WT_SpinBox, SpinBox::ButtonMargin + Top, option, widget);
3533 int bmb = bm + widgetLayoutProp(WT_SpinBox, SpinBox::ButtonMargin + Bot, option, widget);
3534 int bs = widgetLayoutProp(WT_SpinBox, SpinBox::ButtonSpacing, option, widget);
3535 bool symmButtons = widgetLayoutProp(WT_SpinBox, SpinBox::SymmetricButtons, option, widget);
3536 bool supportFrameless = widgetLayoutProp(WT_SpinBox, SpinBox::SupportFrameless, option, widget);
3539 if (supportFrameless && !sb->frame) {
3542 bmt = bmb = bmr = 0;
3545 const int buttonsWidth = bw - bml - bmr;
3546 const int buttonsLeft = r.
right() - bw + bml + 1;
3549 int availableButtonHeight = r.
height() - bmt - bmb - bs;
3554 if (availableButtonHeight % 2 != 0) {
3558 availableButtonHeight = r.
height() - bmt - bmb - bs;
3561 int heightUp = availableButtonHeight / 2;
3562 int heightDown = availableButtonHeight - heightUp;
3564 switch (subControl) {
3566 return handleRTL(option,
3567 QRect(buttonsLeft, r.
top() + bmt, buttonsWidth, heightUp));
3568 case SC_SpinBoxDown:
3569 return handleRTL(option,
3570 QRect(buttonsLeft, r.
bottom() - bmb - heightDown + 1, buttonsWidth, heightDown));
3571 case SC_SpinBoxEditField: {
3573 labelRect = insideMargin(labelRect, WT_SpinBox, SpinBox::ContentsMargin, option, widget);
3574 return handleRTL(option, labelRect);
3576 case SC_SpinBoxFrame:
3577 return (sb->frame || !supportFrameless) ? r :
QRect();
3585 if (
const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
3587 int fw = widgetLayoutProp(WT_ComboBox, ComboBox::FrameWidth, option, widget);
3588 int bw = widgetLayoutProp(WT_ComboBox, ComboBox::ButtonWidth, option, widget);
3589 int bm = widgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin, option, widget);
3590 int bml = bm + widgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Left, option, widget);
3591 int bmr = bm + widgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Right, option, widget);
3592 int bmt = bm + widgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Top, option, widget);
3593 int bmb = bm + widgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Bot, option, widget);
3594 bool supportFrameless = widgetLayoutProp(WT_ComboBox, ComboBox::SupportFrameless, option, widget);
3597 if (supportFrameless && !cb->frame) {
3600 bmt = bmb = bmr = 0;
3603 switch (subControl) {
3604 case SC_ComboBoxFrame:
3605 return (cb->frame || !supportFrameless) ? r :
QRect();
3606 case SC_ComboBoxArrow:
3607 return handleRTL(option,
3609 case SC_ComboBoxEditField: {
3611 labelRect = insideMargin(labelRect, WT_ComboBox, ComboBox::ContentsMargin, option, widget);
3612 return handleRTL(option, labelRect);
3614 case SC_ComboBoxListBoxPopup:
3632 QRect ret = insideMargin(r, WT_Window, Window::TitleMargin, option, widget);
3634 const int btnHeight = ret.
height();
3635 const int btnWidth = widgetLayoutProp(WT_Window, Window::ButtonWidth, option, widget);
3636 const int btnSpace = widgetLayoutProp(WT_Window, Window::ButtonSpace, option, widget);
3637 const int titleSpace = widgetLayoutProp(WT_Window, Window::ButtonToTextSpace, option, widget);
3645 bool minBtn = !isMinimized &&
3647 bool maxBtn = !isMaximized &&
3655 int btnOffsetCount = 0;
3657 switch (subControl) {
3658 case SC_TitleBarLabel: {
3684 ret.
adjust(cLeft * btnWidth + (cLeft - 1)*btnSpace + titleSpace, 0,
3685 -(titleSpace + cRight * btnWidth + (cRight - 1)*btnSpace), 0);
3690 case SC_TitleBarSysMenu: {
3697 case SC_TitleBarContextHelpButton:
3701 case SC_TitleBarMinButton:
3704 }
else if (subControl == SC_TitleBarMinButton) {
3707 case SC_TitleBarNormalButton:
3710 }
else if (subControl == SC_TitleBarNormalButton) {
3713 case SC_TitleBarMaxButton:
3716 }
else if (subControl == SC_TitleBarMaxButton) {
3719 case SC_TitleBarShadeButton:
3720 if (!isMinimized && shadeBtn) {
3722 }
else if (subControl == SC_TitleBarShadeButton) {
3725 case SC_TitleBarUnshadeButton:
3726 if (isMinimized && shadeBtn) {
3728 }
else if (subControl == SC_TitleBarUnshadeButton) {
3731 case SC_TitleBarCloseButton: {
3734 }
else if (subControl == SC_TitleBarCloseButton) {
3738 ret.
setRect(ret.
right() - btnOffsetCount * btnWidth - (btnOffsetCount - 1)*btnSpace,
3739 ret.
top(), btnWidth, btnHeight);
3747 return visualRect(tbOpt->direction, tbOpt->rect, ret);
3762 static bool preceeds(
const QPoint &pt,
const QRect &bound,
3768 return pt.
x() < bound.
right();
3770 return pt.
x() > bound.
x();
3773 return pt.
y() < bound.
y();
3796 if (cc == CC_ScrollBar) {
3798 QRect groove = subControlRect(CC_ScrollBar, opt, SC_ScrollBarGroove, w);
3803 QRect slider = subControlRect(CC_ScrollBar, opt, SC_ScrollBarSlider, w);
3806 return SC_ScrollBarSlider;
3807 }
else if (preceeds(pt, slider, opt)) {
3808 return SC_ScrollBarSubPage;
3810 return SC_ScrollBarAddPage;
3814 if (preceeds(pt, groove, opt)) {
3816 if (widgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleTopButton,
nullptr, w)) {
3817 QRect buttonRect = internalSubControlRect(CC_ScrollBar, opt, SC_ScrollBarSubLine, w);
3818 return buttonPortion(buttonRect, pt, opt);
3820 return SC_ScrollBarSubLine;
3824 if (widgetLayoutProp(WT_ScrollBar, ScrollBar::DoubleBotButton,
nullptr, w)) {
3825 QRect buttonRect = internalSubControlRect(CC_ScrollBar, opt, SC_ScrollBarAddLine, w);
3826 return buttonPortion(buttonRect, pt, opt);
3828 return SC_ScrollBarAddLine;
3840 case CT_PushButton: {
3843 return contentsSize;
3846 QSize size = contentsSize;
3849 size = expandDim(size, WT_PushButton, PushButton::DefaultIndicatorMargin, option, widget);
3853 size = expandDim(size, WT_PushButton, PushButton::ContentsMargin, option, widget);
3856 size.
setWidth(size.
width() + widgetLayoutProp(WT_PushButton, PushButton::TextToIconSpace, option, widget));
3859 if (!bOpt->text.isEmpty() && !bOpt->icon.isNull()) {
3862 size.
setWidth(size.
width() - 4 + widgetLayoutProp(WT_PushButton, PushButton::TextToIconSpace, option, widget));
3867 case CT_ToolButton: {
3873 QSize size = contentsSize;
3874 int menuAreaWidth = 0;
3879 size.
setWidth(size.
width() + widgetLayoutProp(WT_ToolButton, ToolButton::InlineMenuIndicatorSize, tbOpt, widget));
3889 return expandDim(size, WT_ToolButton, ToolButton::ContentsMargin, option, widget);
3894 int indicator = widgetLayoutProp(WT_CheckBox, CheckBox::Size, option, widget);
3895 int spacer = widgetLayoutProp(WT_CheckBox, CheckBox::BoxTextSpace, option, widget);
3898 QSize size = expandDim(contentsSize, WT_CheckBox, CheckBox::FocusMargin, option, widget);
3909 case CT_RadioButton: {
3911 int indicator = widgetLayoutProp(WT_RadioButton, RadioButton::Size, option, widget);
3912 int spacer = widgetLayoutProp(WT_RadioButton, RadioButton::BoxTextSpace, option, widget);
3915 QSize size = expandDim(contentsSize, WT_RadioButton, RadioButton::FocusMargin, option, widget);
3926 case CT_ProgressBar: {
3927 QSize size = contentsSize;
3930 if (useSideText(pbOpt)) {
3939 int extraW = widgetLayoutProp(WT_MenuBar, MenuBar::Margin + Right, option, widget) -
3940 widgetLayoutProp(WT_MenuBar, MenuBar::Margin + Left, option, widget);
3942 int extraH = widgetLayoutProp(WT_MenuBar, MenuBar::Margin + Bot, option, widget) -
3943 widgetLayoutProp(WT_MenuBar, MenuBar::Margin + Top, option, widget);
3945 return QSize(contentsSize.
width() + extraW, contentsSize.
height() + extraH);
3949 int extraW = widgetLayoutProp(WT_Menu, Menu::Margin + Right, option, widget) -
3950 widgetLayoutProp(WT_Menu, Menu::Margin + Left, option, widget);
3952 int extraH = widgetLayoutProp(WT_Menu, Menu::Margin + Bot, option, widget) -
3953 widgetLayoutProp(WT_Menu, Menu::Margin + Top, option, widget);
3955 return QSize(contentsSize.
width() + extraW, contentsSize.
height() + extraH);
3961 return contentsSize;
3967 switch (miOpt->menuItemType) {
3971 int iconColW = miOpt->maxIconWidth;
3972 iconColW = qMax(iconColW, widgetLayoutProp(WT_MenuItem, MenuItem::IconWidth, option, widget));
3974 int leftColW = iconColW;
3975 if (miOpt->menuHasCheckableItems &&
3976 widgetLayoutProp(WT_MenuItem, MenuItem::CheckAlongsideIcon, option, widget)) {
3977 leftColW = widgetLayoutProp(WT_MenuItem, MenuItem::CheckWidth, option, widget) +
3978 widgetLayoutProp(WT_MenuItem, MenuItem::CheckSpace, option, widget) +
3982 leftColW += widgetLayoutProp(WT_MenuItem, MenuItem::IconSpace, option, widget);
3984 int rightColW = widgetLayoutProp(WT_MenuItem, MenuItem::ArrowSpace, option, widget) +
3985 widgetLayoutProp(WT_MenuItem, MenuItem::ArrowWidth, option, widget);
3990 int tabPos = miOpt->text.indexOf(
QLatin1Char(
'\t'));
3993 textW = contentsSize.
width();
3999 textW = contentsSize.
width() +
4000 widgetLayoutProp(WT_MenuItem, MenuItem::AccelSpace, option, widget);
4003 int h = qMax(contentsSize.
height(), widgetLayoutProp(WT_MenuItem, MenuItem::MinHeight, option, widget));
4004 insideSize =
QSize(leftColW + textW + rightColW, h);
4009 insideSize =
QSize(10, widgetLayoutProp(WT_MenuItem, MenuItem::SeparatorHeight, option, widget));
4018 return contentsSize;
4022 return expandDim(insideSize, WT_MenuItem, MenuItem::Margin, option, widget);
4025 case CT_MenuBarItem:
4026 return expandDim(contentsSize, WT_MenuBarItem, MenuBarItem::Margin, option, widget);
4028 case CT_TabBarTab: {
4033 bool rotated =
false;
4034 if (
const QStyleOptionTab *tabOpt = qstyleoption_cast<const QStyleOptionTab *>(option)) {
4035 rotated = isVerticalTab(tabOpt);
4038 return expandDim(contentsSize, WT_TabBar, TabBar::TabContentsMargin, option, widget, rotated);
4041 case CT_TabWidget: {
4047 int m = widgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin, option, widget);
4049 widgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin + Top, option, widget) +
4050 widgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin + Bot, option, widget);
4052 widgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin + Left, option, widget) +
4053 widgetLayoutProp(WT_TabWidget, TabWidget::ContentsMargin + Right, option, widget);
4055 switch (tabOpt->shape) {
4060 return contentsSize +
QSize(hor, vert);
4065 return contentsSize + QSize(vert, hor);
4069 case CT_HeaderSection: {
4070 if (
const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
4072 QSize textSize = header->fontMetrics.size(0, header->text);
4073 int iconSpacing = widgetLayoutProp(WT_Header, Header::TextToIconSpace, option, widget);
4074 int w = iconSize.
width() + iconSpacing + textSize.
width();
4077 return expandDim(
QSize(w, h), WT_Header, Header::ContentsMargin, option, widget);
4083 QSize size = contentsSize;
4086 size = expandDim(size, WT_ComboBox, ComboBox::ContentsMargin, option, widget);
4089 size.
rwidth() += widgetLayoutProp(WT_ComboBox, ComboBox::ButtonWidth, option, widget);
4092 size.
rwidth() += widgetLayoutProp(WT_ComboBox, ComboBox::FrameWidth, option, widget) * 2;
4093 size.
rheight() += widgetLayoutProp(WT_ComboBox, ComboBox::FrameWidth, option, widget) * 2;
4111 if (
QLabel *lbl = qobject_cast<QLabel *>(obj)) {
4112 QWidget *buddy = lbl->buddy();
4114 switch (ev->
type()) {
4121 if (lbl->rect().contains(mev->
pos())) {
4134 clickedLabel =
nullptr;
4139 if (lbl->rect().contains(mev->
pos())) {
4145 if (obj == clickedLabel && buddy->
isEnabled()) {
4149 QRect foRect(0, 0, lbl->width(), lbl->height());
4150 foOpts.palette = lbl->palette();
4151 foOpts.rect = foRect;
4152 drawKStylePrimitive(WT_Generic, Generic::FocusIndicator, &foOpts,
4153 foRect, lbl->palette(),
nullptr, &p, lbl);
4167 mode(PaletteEntryMode),
4176 K4Style::ColorMode::operator int()
const 4178 return int(role) | int(mode);
4183 mode = (encoded & BWAutoContrastMode) ? BWAutoContrastMode : PaletteEntryMode;
4191 if (mode == BWAutoContrastMode) {
4192 if (qGray(palColor.
rgb()) > 128) {
4201 K4Style::TextOption::TextOption()
4206 K4Style::TextOption::TextOption(
const QString &_text):
K4AboutData::LicenseKey key() const
Returns the license key.
QString text() const
Returns the full license text.
bool isValid() const const
void setHeight(int height)
void setStyle(Qt::PenStyle style)
QRect centerRect(const QRect &in, int w, int h) const
Returns a w x h QRect center inside the 'in' rectangle.
QEvent::Type type() const const
QHash::iterator insert(const Key &key, const T &value)
int currentSize(KIconLoader::Group group) const
QPoint topRight() const const
StyleHint newStyleHint(const QString &element)
Runtime element extension, allows inheriting styles to add support custom elements merges supporting ...
const QBrush & text() const const
void fillRect(const QRectF &rectangle, const QBrush &brush)
void setBottomRight(const QPoint &position)
QPixmap copy(int x, int y, int width, int height) const const
virtual void polish(QPalette &pal) override
void setRenderHint(QPainter::RenderHint hint, bool on)
void strokePath(const QPainterPath &path, const QPen &pen)
virtual QPixmap standardPixmap(QStyle::StandardPixmap sp, const QStyleOption *option, const QWidget *widget) const const override
virtual void drawKStylePrimitive(WidgetType widgetType, int primitive, const QStyleOption *opt, const QRect &r, const QPalette &pal, State flags, QPainter *p, const QWidget *widget=nullptr, Option *kOpt=nullptr) const
Draws primitives which are used inside K4Style.
virtual void unpolish(QWidget *widget) override
void setColorAt(qreal position, const QColor &color)
const QFont & font() const const
virtual void drawComplexControl(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p, const QWidget *widget) const const override
virtual int widgetLayoutProp(WidgetType widgetType, int metric, const QStyleOption *opt=nullptr, const QWidget *w=nullptr) const
Used to obtain information about K4Style layout properties and metrics.
void setClipping(bool enable)
const QColor & color(QPalette::ColorGroup group, QPalette::ColorRole role) const const
void addRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode)
QTextStream & right(QTextStream &stream)
QPoint bottomRight() const const
bool isNull() const const
void translate(int dx, int dy)
QPoint bottomLeft() const const
void drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule)
QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags)
void drawTiledPixmap(const QRectF &rectangle, const QPixmap &pixmap, const QPointF &position)
virtual QRect itemTextRect(const QFontMetrics &metrics, const QRect &rectangle, int alignment, bool enabled, const QString &text) const const
Base for our own option classes.
QString text
The text to draw.
void drawLine(const QLineF &line)
Option representing text drawing info. For Generic::Text.
ColorMode(QPalette::ColorRole _role)
Constructor, using a the given palette role _role and a default mode.
void setBrushOrigin(int x, int y)
virtual QRect subControlRect(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, QStyle::SubControl sc, const QWidget *widget) const const override
bool active
Is the icon active?
QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) const const
Mode
K4Style understands two kinds of colors:Palette entries.
QTextStream & left(QTextStream &stream)
const QColor & color() const const
static StyleHint customStyleHint(const QString &element, const QWidget *widget)
Runtime element extension This is just convenience and does /not/ require the using widgets style to ...
void drawRect(const QRectF &rectangle)
void setFont(const QFont &font)
virtual int pixelMetric(QStyle::PixelMetric m, const QStyleOption *opt, const QWidget *widget) const const override
void drawInsideRect(QPainter *p, const QRect &r) const
Draws inside the rectangle using a thinkness 0 pen.
void installEventFilter(QObject *filterObj)
void fill(uint pixelValue)
virtual QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const const override
Option representing the color of the thing to draw.
void setPen(const QColor &color)
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
virtual int styleHint(QStyle::StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const const =0
virtual QRect subElementRect(QStyle::SubElement sr, const QStyleOption *opt, const QWidget *widget) const const override
QTextStream & center(QTextStream &stream)
Qt::Alignment hAlign
The horizontal alignment, default is Qt::AlignLeft.
void setBrush(const QBrush &brush)
QPoint center() const const
virtual bool eventFilter(QObject *watched, QEvent *event)
virtual void drawItemText(QPainter *painter, const QRect &rectangle, int alignment, const QPalette &palette, bool enabled, const QString &text, QPalette::ColorRole textRole) const const
QPoint brushOrigin() const const
void init()
Called by the constructor to set the default value of hAlign.
virtual QSize sizeFromContents(QStyle::ContentsType ct, const QStyleOption *opt, const QSize &csz, const QWidget *widget) const const override
void paint(QPainter *painter, const QRect &rect, Qt::Alignment alignment, QIcon::Mode mode, QIcon::State state) const const
static KIconLoader * global()
static QPalette createApplicationPalette(const KSharedConfigPtr &config)
QRect adjusted(int dx1, int dy1, int dx2, int dy2) const const
const T value(const Key &key) const const
QColor color(const QPalette &palette)
Return the color corresponding to our role from the palette, automatically compensating for the contr...
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
const QBrush & mid() const const
virtual void drawItemPixmap(QPainter *painter, const QRect &rectangle, int alignment, const QPixmap &pixmap) const const
QColor lighter(int factor) const const
static KSharedConfig::Ptr openConfig(const QString &fileName=QString(), OpenFlags mode=FullConfig, QStandardPaths::StandardLocation type=QStandardPaths::GenericConfigLocation)
bool isValid() const const
A representation for colors for use as a widget layout property.
QIcon icon
Icon drawn by this option.
bool contains(const QRect &rectangle, bool proper) const const
void setClipRect(const QRectF &rectangle, Qt::ClipOperation operation)
void drawPath(const QPainterPath &path)
const QBrush & buttonText() const const
void setRect(int x, int y, int width, int height)
bool isNull() const const
QFontMetrics fontMetrics() const const
void setHeight(int height)
void setWidgetLayoutProp(WidgetType widget, int metric, int value)
Interface for the style to configure various metrics that K4Style has customizable.
void translate(int dx, int dy)
void adjust(int dx1, int dy1, int dx2, int dy2)
QPoint topLeft() const const
void translate(const QPointF &offset)
virtual QStyle::SubControl hitTestComplexControl(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, const QPoint &pt, const QWidget *widget) const const override
void setAlphaF(qreal alpha)
Option for drawing icons: represents whether the icon should be active or not.
QIcon fromTheme(const QString &name)
QSize size(int flags, const QString &text, int tabStops, int *tabArray) const const
virtual QRect itemPixmapRect(const QRect &rectangle, int alignment, const QPixmap &pixmap) const const
virtual int styleHint(QStyle::StyleHint sh, const QStyleOption *opt, const QWidget *widget, QStyleHintReturn *hret) const const override
virtual void drawControl(QStyle::ControlElement element, const QStyleOption *opt, QPainter *p, const QWidget *widget) const const override
void setPoints(int nPoints, const int *points)
static QString defaultStyle()
Returns the default widget style.
const QPen & pen() const const
T readEntry(const QString &key, const T &aDefault) const
virtual void drawPrimitive(QStyle::PrimitiveElement pe, const QStyleOption *opt, QPainter *p, const QWidget *widget) const const override
void getRect(int *x, int *y, int *width, int *height) const const
void removeEventFilter(QObject *obj)
ColorMode color
Color to use for the drawing.