103void QPixmapStyle::polish(QWidget *widget)
108#if QT_CONFIG(textedit)
109 if (qobject_cast<QTextEdit*>(widget)) {
110 QPalette p = widget->palette();
111 p.setBrush(QPalette::Base, Qt::NoBrush);
112 widget->setPalette(p);
115#if QT_CONFIG(progressbar)
116 if (QProgressBar *pb = qobject_cast<QProgressBar*>(widget)) {
118 pb->setAlignment(Qt::AlignCenter);
120 QFont font = pb->font();
121 font.setPixelSize(d->descriptors.value(PB_HBackground).size.height()/2);
126 if (qobject_cast<QSlider*>(widget))
127 widget->installEventFilter(
this);
129#if QT_CONFIG(combobox)
130 if (QComboBox *cb = qobject_cast<QComboBox*>(widget)) {
131 widget->installEventFilter(
this);
134 QAbstractItemView *list = cb->view();
135 list->setProperty(
"_pixmap_combobox_list",
true);
136 list->setItemDelegate(
new QStyledItemDelegate(list));
137 QPalette p = list->palette();
138 p.setBrush(QPalette::Active, QPalette::Base, QBrush(Qt::transparent) );
139 p.setBrush(QPalette::Active, QPalette::AlternateBase, QBrush(Qt::transparent) );
140 p.setBrush(QPalette::Inactive, QPalette::Base, QBrush(Qt::transparent) );
141 p.setBrush(QPalette::Inactive, QPalette::AlternateBase, QBrush(Qt::transparent) );
142 p.setBrush(QPalette::Disabled, QPalette::Base, QBrush(Qt::transparent) );
143 p.setBrush(QPalette::Disabled, QPalette::AlternateBase, QBrush(Qt::transparent) );
146 QFrame *frame = qobject_cast<QFrame*>(list->parent());
148 const QPixmapStyleDescriptor &desc = d->descriptors.value(DD_PopupDown);
149 const QPixmapStylePixmap &pix = d->pixmaps.value(DD_ItemSeparator);
150 frame->setContentsMargins(pix.margins.left(), desc.margins.top(),
151 pix.margins.right(), desc.margins.bottom());
152 frame->setAttribute(Qt::WA_TranslucentBackground);
156 if (qstrcmp(widget->metaObject()->className(),
"QComboBoxPrivateContainer") == 0)
157 widget->installEventFilter(
this);
159#if QT_CONFIG(scrollarea)
160 if (QAbstractScrollArea *scrollArea = qobject_cast<QAbstractScrollArea*>(widget)) {
161 scrollArea->viewport()->setAutoFillBackground(
false);
162#if QT_CONFIG(itemviews)
163 if (QAbstractItemView *view = qobject_cast<QAbstractItemView*>(scrollArea)) {
164 view->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
165 view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
168#if QT_CONFIG(gestures) && QT_CONFIG(scroller)
169 QScroller::grabGesture(scrollArea->viewport(), QScroller::LeftMouseButtonGesture);
173#if QT_CONFIG(scrollbar)
174 if (qobject_cast<QScrollBar*>(widget))
175 widget->setAttribute(Qt::WA_OpaquePaintEvent,
false);
177#if !QT_CONFIG(progressbar) && !QT_CONFIG(combobox)
180 QCommonStyle::polish(widget);
194void QPixmapStyle::unpolish(QWidget *widget)
198 qobject_cast<QSlider*>(widget)
202#if QT_CONFIG(combobox)
203 || qobject_cast<QComboBox*>(widget)
206 widget->removeEventFilter(
this);
209 if (qstrcmp(widget->metaObject()->className(),
"QComboBoxPrivateContainer") == 0)
210 widget->removeEventFilter(
this);
212#if QT_CONFIG(gestures) && QT_CONFIG(scrollarea) && QT_CONFIG(scroller)
213 if (QAbstractScrollArea *scrollArea = qobject_cast<QAbstractScrollArea*>(widget))
214 QScroller::ungrabGesture(scrollArea->viewport());
217 QCommonStyle::unpolish(widget);
223void QPixmapStyle::drawPrimitive(PrimitiveElement element,
const QStyleOption *option,
224 QPainter *painter,
const QWidget *widget)
const
227 case PE_FrameFocusRect:
229 case PE_PanelButtonBevel:
230 case PE_PanelButtonCommand:
231 drawPushButton(option, painter, widget);
233 case PE_PanelLineEdit:
234 case PE_FrameLineEdit:
235 drawLineEdit(option, painter, widget);
238#if QT_CONFIG(textedit)
239 case PE_FrameDefaultButton:
240 if (qobject_cast<
const QTextEdit*>(widget))
241 drawTextEdit(option, painter, widget);
244 case PE_IndicatorCheckBox:
245 drawCheckBox(option, painter, widget);
247 case PE_IndicatorRadioButton:
248 drawRadioButton(option, painter, widget);
250 case PE_PanelItemViewItem:
251#if QT_CONFIG(listview)
252 if (qobject_cast<
const QListView*>(widget))
253 drawPanelItemViewItem(option, painter, widget);
256 QCommonStyle::drawPrimitive(element, option, painter, widget);
259 QCommonStyle::drawPrimitive(element, option, painter, widget);
266void QPixmapStyle::drawControl(ControlElement element,
const QStyleOption *option,
267 QPainter *painter,
const QWidget *widget)
const
269 Q_D(
const QPixmapStyle);
272 case CE_ProgressBarGroove:
273 drawProgressBarBackground(option, painter, widget);
275 case CE_ProgressBarLabel:
276 drawProgressBarLabel(option, painter, widget);
278 case CE_ProgressBarContents:
279 drawProgressBarFill(option, painter, widget);
283 if (qstrcmp(widget->metaObject()->className(),
"QComboBoxPrivateContainer") == 0) {
284 const QPixmapStyleDescriptor &desc = d->descriptors.value(DD_PopupDown);
285 const QPixmapStylePixmap &pix = d->pixmaps.value(DD_ItemSeparator);
286 QRect rect = option->rect;
287 rect.adjust(-pix.margins.left(), -desc.margins.top(),
288 pix.margins.right(), desc.margins.bottom());
289 bool up = widget->property(
"_pixmapstyle_combobox_up").toBool();
290 drawCachedPixmap(up ? DD_PopupUp : DD_PopupDown, rect, painter);
293 QCommonStyle::drawControl(element, option, painter, widget);
297 QCommonStyle::drawControl(element, option, painter, widget);
304void QPixmapStyle::drawComplexControl(ComplexControl cc,
const QStyleOptionComplex *option,
305 QPainter *painter,
const QWidget *widget)
const
309 drawSlider(option, painter, widget);
312 drawComboBox(option, painter, widget);
315 drawScrollBar(option, painter, widget);
318 QCommonStyle::drawComplexControl(cc, option, painter, widget);
325QSize QPixmapStyle::sizeFromContents(ContentsType type,
const QStyleOption *option,
326 const QSize &contentsSize,
const QWidget *widget)
const
330 return pushButtonSizeFromContents(option, contentsSize, widget);
332 return lineEditSizeFromContents(option, contentsSize, widget);
334 return progressBarSizeFromContents(option, contentsSize, widget);
336 return sliderSizeFromContents(option, contentsSize, widget);
338 return comboBoxSizeFromContents(option, contentsSize, widget);
339 case CT_ItemViewItem:
340 return itemViewSizeFromContents(option, contentsSize, widget);
344 return QCommonStyle::sizeFromContents(type, option, contentsSize, widget);
350QRect QPixmapStyle::subElementRect(SubElement element,
const QStyleOption *option,
351 const QWidget *widget)
const
353 Q_D(
const QPixmapStyle);
356 case SE_LineEditContents:
358 QRect rect = QCommonStyle::subElementRect(element, option, widget);
359 const QPixmapStyleDescriptor &desc = d->descriptors.value(LE_Enabled);
360 rect.adjust(desc.margins.left(), desc.margins.top(),
361 -desc.margins.right(), -desc.margins.bottom());
362 rect = visualRect(option->direction, option->rect, rect);
368 return QCommonStyle::subElementRect(element, option, widget);
374QRect QPixmapStyle::subControlRect(ComplexControl cc,
const QStyleOptionComplex *option,
375 SubControl sc,
const QWidget *widget)
const
379 return comboBoxSubControlRect(option, sc, widget);
381 return scrollBarSubControlRect(option, sc, widget);
385 return QCommonStyle::subControlRect(cc, option, sc, widget);
391int QPixmapStyle::pixelMetric(PixelMetric metric,
const QStyleOption *option,
392 const QWidget *widget)
const
394 Q_D(
const QPixmapStyle);
397 case PM_ButtonShiftHorizontal:
398 case PM_ButtonShiftVertical:
400 case PM_DefaultFrameWidth:
401#if QT_CONFIG(textedit)
402 if (qobject_cast<
const QTextEdit*>(widget)) {
403 const QPixmapStyleDescriptor &desc = d->descriptors.value(LE_Enabled);
404 return qMax(qMax(desc.margins.left(), desc.margins.right()),
405 qMax(desc.margins.top(), desc.margins.bottom()));
409 case PM_IndicatorWidth:
410 return d->pixmaps.value(CB_Enabled).pixmap.width();
411 case PM_IndicatorHeight:
412 return d->pixmaps.value(CB_Enabled).pixmap.height();
413 case PM_CheckBoxLabelSpacing:
415 const QPixmapStylePixmap &pix = d->pixmaps.value(CB_Enabled);
416 return qMax(qMax(pix.margins.left(), pix.margins.right()),
417 qMax(pix.margins.top(), pix.margins.bottom()));
419 case PM_ExclusiveIndicatorWidth:
420 return d->pixmaps.value(RB_Enabled).pixmap.width();
421 case PM_ExclusiveIndicatorHeight:
422 return d->pixmaps.value(RB_Enabled).pixmap.height();
423 case PM_RadioButtonLabelSpacing:
425 const QPixmapStylePixmap &pix = d->pixmaps.value(RB_Enabled);
426 return qMax(qMax(pix.margins.left(), pix.margins.right()),
427 qMax(pix.margins.top(), pix.margins.bottom()));
430 case PM_SliderThickness:
431 if (
const QStyleOptionSlider *slider =
432 qstyleoption_cast<
const QStyleOptionSlider*>(option)) {
433 const QPixmapStyleDescriptor desc =
434 d->descriptors.value(slider->orientation == Qt::Horizontal
435 ? SG_HEnabled : SG_VEnabled);
436 return slider->orientation == Qt::Horizontal
437 ? desc.size.height() : desc.size.width();
440 case PM_SliderControlThickness:
441 if (
const QStyleOptionSlider *slider =
442 qstyleoption_cast<
const QStyleOptionSlider*>(option)) {
443 const QPixmapStylePixmap pix =
444 d->pixmaps.value(slider->orientation == Qt::Horizontal
445 ? SH_HEnabled : SH_VEnabled);
446 return slider->orientation == Qt::Horizontal
447 ? pix.pixmap.height() : pix.pixmap.width();
450 case PM_SliderLength:
451 if (
const QStyleOptionSlider *slider =
452 qstyleoption_cast<
const QStyleOptionSlider*>(option)) {
453 const QPixmapStylePixmap pix =
454 d->pixmaps.value(slider->orientation == Qt::Horizontal
455 ? SH_HEnabled : SH_VEnabled);
456 return slider->orientation == Qt::Horizontal
457 ? pix.pixmap.width() : pix.pixmap.height();
460 case PM_ScrollBarExtent:
461 if (
const QStyleOptionSlider *slider =
462 qstyleoption_cast<
const QStyleOptionSlider*>(option)) {
463 const QPixmapStyleDescriptor desc =
464 d->descriptors.value(slider->orientation == Qt::Horizontal
465 ? SB_Horizontal : SB_Vertical);
466 return slider->orientation == Qt::Horizontal
467 ? desc.size.height() : desc.size.width();
471 case PM_ScrollBarSliderMin:
476 return QCommonStyle::pixelMetric(metric, option, widget);
499QStyle::SubControl QPixmapStyle::hitTestComplexControl(QStyle::ComplexControl control,
500 const QStyleOptionComplex *option,
502 const QWidget *widget)
const
504 const SubControl sc = QCommonStyle::hitTestComplexControl(control, option, pos, widget);
505 if (control == CC_ScrollBar) {
506 if (sc == SC_ScrollBarAddLine)
507 return SC_ScrollBarAddPage;
508 else if (sc == SC_ScrollBarSubLine)
509 return SC_ScrollBarSubPage;
518bool QPixmapStyle::eventFilter(QObject *watched, QEvent *event)
522 if (QSlider *slider = qobject_cast<QSlider*>(watched)) {
523 switch (event->type()) {
524 case QEvent::MouseButtonPress:
525 case QEvent::MouseButtonRelease:
526 case QEvent::MouseMove:
533#if QT_CONFIG(combobox)
534 if (QComboBox *comboBox = qobject_cast<QComboBox*>(watched)) {
535 switch (event->type()) {
536 case QEvent::MouseButtonPress:
538 comboBox->setProperty(
"_pixmapstyle_combobox_pressed",
true);
541 case QEvent::MouseButtonRelease:
542 comboBox->setProperty(
"_pixmapstyle_combobox_pressed",
false);
544 if ( comboBox->view() ) {
545 if ( comboBox->view()->isVisible() || (!comboBox->isEnabled()))
546 comboBox->hidePopup();
548 comboBox->showPopup();
556 if (qstrcmp(watched->metaObject()->className(),
"QComboBoxPrivateContainer") == 0) {
557 if (event->type() == QEvent::Show) {
558 QWidget *widget = qobject_cast<QWidget*>(watched);
559 int yPopup = widget->geometry().top();
560 int yCombo = widget->parentWidget()->mapToGlobal(QPoint(0, 0)).y();
561 QRect geom = widget->geometry();
562 const QPixmapStyleDescriptor &desc = d->descriptors.value(DD_ButtonEnabled);
563 const bool up = yPopup < yCombo;
564 geom.moveTop(geom.top() + (up ? desc.margins.top() : -desc.margins.bottom()));
565 widget->setGeometry(geom);
566 widget->setProperty(
"_pixmapstyle_combobox_up", up);
567 widget->parentWidget()->setProperty(
"_pixmapstyle_combobox_up", up);
571 return QCommonStyle::eventFilter(watched, event);
588void QPixmapStyle::addDescriptor(QPixmapStyle::ControlDescriptor control,
const QString &fileName,
589 QMargins margins, QTileRules tileRules)
593 QPixmapStyleDescriptor desc;
594 QImage image(fileName);
599 desc.fileName = fileName;
600 desc.margins = margins;
601 desc.tileRules = tileRules;
602 desc.size = image.size();
604 d->descriptors[control] = desc;
685void QPixmapStyle::drawPushButton(
const QStyleOption *option,
686 QPainter *painter,
const QWidget *)
const
688 const bool checked = option->state & State_On;
689 const bool pressed = option->state & State_Sunken;
690 const bool enabled = option->state & State_Enabled;
692 ControlDescriptor control = PB_Enabled;
694 control = pressed ? PB_Pressed : (checked ? PB_Checked : PB_Enabled);
696 control = checked ? PB_PressedDisabled : PB_Disabled;
697 drawCachedPixmap(control, option->rect, painter);
700void QPixmapStyle::drawLineEdit(
const QStyleOption *option,
701 QPainter *painter,
const QWidget *widget)
const
704#if QT_CONFIG(combobox)
705 if (widget && qobject_cast<
const QComboBox*>(widget->parentWidget()))
710 const bool enabled = option->state & State_Enabled;
711 const bool focused = option->state & State_HasFocus;
712 ControlDescriptor control = enabled ? (focused ? LE_Focused : LE_Enabled) : LE_Disabled;
713 drawCachedPixmap(control, option->rect, painter);
725void QPixmapStyle::drawCheckBox(
const QStyleOption *option,
726 QPainter *painter,
const QWidget *)
const
728 Q_D(
const QPixmapStyle);
730 const QStyleOptionButton *button = qstyleoption_cast<
const QStyleOptionButton*>(option);
732 const bool down = button->state & State_Sunken;
733 const bool enabled = button->state & State_Enabled;
734 const bool on = button->state & State_On;
736 ControlPixmap control;
738 control = on ? (down ? CB_PressedChecked : CB_Checked) : (down ? CB_Pressed : CB_Enabled);
740 control = on ? CB_DisabledChecked : CB_Disabled;
741 painter->drawPixmap(button->rect, d->pixmaps.value(control).pixmap);
744void QPixmapStyle::drawRadioButton(
const QStyleOption *option,
745 QPainter *painter,
const QWidget *)
const
747 Q_D(
const QPixmapStyle);
749 const QStyleOptionButton *button = qstyleoption_cast<
const QStyleOptionButton*>(option);
751 const bool down = button->state & State_Sunken;
752 const bool enabled = button->state & State_Enabled;
753 const bool on = button->state & State_On;
755 ControlPixmap control;
757 control = on ? RB_Checked : (down ? RB_Pressed : RB_Enabled);
759 control = on ? RB_DisabledChecked : RB_Disabled;
760 painter->drawPixmap(button->rect, d->pixmaps.value(control).pixmap);
763void QPixmapStyle::drawPanelItemViewItem(
const QStyleOption *option, QPainter *painter,
764 const QWidget *widget)
const
766 Q_D(
const QPixmapStyle);
768 ControlPixmap cp = ID_Separator;
769 ControlDescriptor cd = ID_Selected;
771 if (widget && widget->property(
"_pixmap_combobox_list").toBool()) {
772 cp = DD_ItemSeparator;
773 cd = DD_ItemSelected;
776 QPixmap pix = d->pixmaps.value(cp).pixmap;
777 QRect rect = option->rect;
778 rect.setBottom(rect.top() + pix.height()-1);
779 painter->drawPixmap(rect, pix);
780 if (option->state & QStyle::State_Selected) {
782 rect.setTop(rect.top() + pix.height());
783 drawCachedPixmap(cd, rect, painter);
798void QPixmapStyle::drawProgressBarLabel(
const QStyleOption *option,
799 QPainter *painter,
const QWidget *)
const
801 if (
const QStyleOptionProgressBar *pb =
802 qstyleoption_cast<
const QStyleOptionProgressBar *>(option)) {
803 const bool vertical = !(pb->state & QStyle::State_Horizontal);
805 QPalette::ColorRole textRole = QPalette::ButtonText;
806 proxy()->drawItemText(painter, pb->rect,
807 Qt::AlignCenter | Qt::TextSingleLine, pb->palette,
808 pb->state & State_Enabled, pb->text, textRole);
813void QPixmapStyle::drawProgressBarFill(
const QStyleOption *option,
814 QPainter *painter,
const QWidget *)
const
816 const QStyleOptionProgressBar *pbar =
817 qstyleoption_cast<
const QStyleOptionProgressBar*>(option);
818 const bool vertical = !(pbar->state & QStyle::State_Horizontal);
819 const bool flip = (pbar->direction == Qt::RightToLeft) ^ pbar->invertedAppearance;
821 if (pbar->progress == pbar->maximum) {
822 drawCachedPixmap(vertical ? PB_VComplete : PB_HComplete, option->rect, painter);
825 if (pbar->progress == pbar->minimum)
827 const auto totalSteps = qint64(pbar->maximum) - pbar->minimum;
828 const auto progressSteps = qint64(pbar->progress) - pbar->minimum;
829 const auto availablePixels = vertical ? option->rect.height() : option->rect.width();
830 const auto pixelsPerStep =
double(availablePixels) / totalSteps;
832 const auto progress =
static_cast<
int>(progressSteps * pixelsPerStep);
834 QRect optRect = option->rect;
837 optRect.setBottom(optRect.top()+progress-1);
839 optRect.setTop(optRect.bottom()-progress+1);
842 optRect.setLeft(optRect.right()-progress+1);
844 optRect.setRight(optRect.left()+progress-1);
847 drawCachedPixmap(vertical ? PB_VContent : PB_HContent, optRect, painter);
851void QPixmapStyle::drawSlider(
const QStyleOptionComplex *option,
852 QPainter *painter,
const QWidget *widget)
const
855 Q_D(
const QPixmapStyle);
857 const QStyleOptionSlider *slider = qstyleoption_cast<
const QStyleOptionSlider*>(option);
861 const bool enabled = option->state & State_Enabled;
862 const bool pressed = option->state & State_Sunken;
863 const Qt::Orientation orient = slider->orientation;
865 const QRect handle = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget);
866 if (option->subControls & SC_SliderGroove) {
867 QRect groove = proxy()->subControlRect(CC_Slider, option, SC_SliderGroove, widget);
868 if (groove.isValid()) {
870 ControlDescriptor control;
871 if (orient == Qt::Horizontal)
872 control = enabled ? SG_HEnabled : SG_HDisabled;
874 control = enabled ? SG_VEnabled : SG_VDisabled;
875 drawCachedPixmap(control, groove, painter);
878 if (orient == Qt::Horizontal) {
879 control = enabled ? (pressed ? SG_HActivePressed : SG_HActiveEnabled )
880 : SG_HActiveDisabled;
882 control = enabled ? (pressed ? SG_VActivePressed : SG_VActiveEnabled )
883 : SG_VActiveDisabled;
885 const QPixmapStyleDescriptor &desc = d->descriptors.value(control);
886 const QPixmap pix = d->getCachedPixmap(control, desc, groove.size());
888 groove.setRight(orient == Qt::Horizontal
889 ? handle.center().x() : handle.center().y());
890 painter->drawPixmap(groove, pix, groove);
894 if (option->subControls & SC_SliderHandle) {
895 if (handle.isValid()) {
897 if (orient == Qt::Horizontal)
898 pix = enabled ? (pressed ? SH_HPressed : SH_HEnabled) : SH_HDisabled;
900 pix = enabled ? (pressed ? SH_VPressed : SH_VEnabled) : SH_VDisabled;
901 painter->drawPixmap(handle, d->pixmaps.value(pix).pixmap);
911void QPixmapStyle::drawComboBox(
const QStyleOptionComplex *option,
912 QPainter *painter,
const QWidget *widget)
const
914 Q_D(
const QPixmapStyle);
916 const bool enabled = option->state & State_Enabled;
917 const bool pressed = widget->property(
"_pixmapstyle_combobox_pressed").toBool();
918 const bool opened = option->state & State_On;
920 ControlDescriptor control =
921 enabled ? (pressed ? DD_ButtonPressed : DD_ButtonEnabled) : DD_ButtonDisabled;
922 drawCachedPixmap(control, option->rect, painter);
924 ControlPixmap cp = enabled ? (opened ? DD_ArrowOpen
925 : (pressed ? DD_ArrowPressed : DD_ArrowEnabled))
927 QPixmapStylePixmap pix = d->pixmaps.value(cp);
928 QRect rect = comboBoxSubControlRect(option, SC_ComboBoxArrow, widget);
929 painter->drawPixmap(rect, pix.pixmap);
932void QPixmapStyle::drawScrollBar(
const QStyleOptionComplex *option,
933 QPainter *painter,
const QWidget *widget)
const
936 if (
const QStyleOptionSlider *slider =
937 qstyleoption_cast<
const QStyleOptionSlider*>(option)) {
939 if (slider->minimum == slider->maximum)
942 QRect rect = scrollBarSubControlRect(option, SC_ScrollBarSlider, widget);
943 ControlDescriptor control = slider->orientation == Qt::Horizontal
944 ? SB_Horizontal : SB_Vertical;
945 drawCachedPixmap(control, rect, painter);
954QSize QPixmapStyle::pushButtonSizeFromContents(
const QStyleOption *option,
955 const QSize &contentsSize,
956 const QWidget *widget)
const
958 Q_D(
const QPixmapStyle);
960 const QPixmapStyleDescriptor &desc = d->descriptors.value(PB_Enabled);
961 const int bm = proxy()->pixelMetric(PM_ButtonMargin, option, widget);
963 int w = contentsSize.width();
964 int h = contentsSize.height();
965 w += desc.margins.left() + desc.margins.right() + bm;
966 h += desc.margins.top() + desc.margins.bottom() + bm;
968 return d->computeSize(desc, w, h);
971QSize QPixmapStyle::lineEditSizeFromContents(
const QStyleOption *option,
972 const QSize &contentsSize,
const QWidget *)
const
974 Q_D(
const QPixmapStyle);
976 const QPixmapStyleDescriptor &desc = d->descriptors.value(LE_Enabled);
977 const int border = 2 * proxy()->pixelMetric(PM_DefaultFrameWidth, option);
979 int w = contentsSize.width() + border + desc.margins.left() + desc.margins.right();
980 int h = contentsSize.height() + border + desc.margins.top() + desc.margins.bottom();
982 return d->computeSize(desc, w, h);
985QSize QPixmapStyle::progressBarSizeFromContents(
const QStyleOption *option,
986 const QSize &contentsSize,
987 const QWidget *widget)
const
989 Q_D(
const QPixmapStyle);
991 bool vertical =
false;
992 if (
const QStyleOptionProgressBar *pb =
993 qstyleoption_cast<
const QStyleOptionProgressBar *>(option)) {
994 vertical = !(pb->state & QStyle::State_Horizontal);
996 QSize result = QCommonStyle::sizeFromContents(CT_Slider, option, contentsSize, widget);
998 const QPixmapStyleDescriptor desc = d->descriptors.value(PB_VBackground);
999 return QSize(desc.size.height(), result.height());
1001 const QPixmapStyleDescriptor desc = d->descriptors.value(PB_HBackground);
1002 return QSize(result.width(), desc.size.height());
1006QSize QPixmapStyle::sliderSizeFromContents(
const QStyleOption *option,
1007 const QSize &contentsSize,
1008 const QWidget *widget)
const
1010#if QT_CONFIG(slider)
1011 Q_D(
const QPixmapStyle);
1013 const QStyleOptionSlider *slider = qstyleoption_cast<
const QStyleOptionSlider*>(option);
1017 QSize result = QCommonStyle::sizeFromContents(CT_Slider, option, contentsSize, widget);
1019 const QPixmapStyleDescriptor desc = d->descriptors.value(slider->orientation == Qt::Horizontal
1020 ? SG_HEnabled : SG_VEnabled);
1022 if (slider->orientation == Qt::Horizontal)
1023 return QSize(result.width(), desc.size.height());
1025 return QSize(desc.size.width(), result.height());
1028 Q_UNUSED(contentsSize);
1046QSize QPixmapStyle::itemViewSizeFromContents(
const QStyleOption *option,
1047 const QSize &contentsSize,
1048 const QWidget *widget)
const
1050 Q_D(
const QPixmapStyle);
1052 QSize size = QCommonStyle::sizeFromContents(CT_ItemViewItem, option, contentsSize, widget);
1054 ControlPixmap cp = ID_Separator;
1055 ControlDescriptor cd = ID_Selected;
1056 if (widget && widget->property(
"_pixmap_combobox_list").toBool()) {
1057 cp = DD_ItemSeparator;
1058 cd = DD_ItemSelected;
1061 const QPixmapStyleDescriptor &desc = d->descriptors.value(cd);
1062 const QPixmapStylePixmap &pix = d->pixmaps.value(cp);
1063 size.setHeight(qMax(size.height(),
1064 desc.size.height() + pix.pixmap.height()));
1068QRect QPixmapStyle::comboBoxSubControlRect(
const QStyleOptionComplex *option,
1069 QStyle::SubControl sc,
const QWidget *)
const
1071 Q_D(
const QPixmapStyle);
1073 QRect r = option->rect;
1074 const QPixmapStylePixmap &pix = d->pixmaps.value(DD_ArrowEnabled);
1075 const QPixmapStyleDescriptor &desc = d->descriptors.value(DD_ButtonEnabled);
1078 case SC_ComboBoxArrow:
1079 r.setRect(r.right() - pix.margins.right() - pix.pixmap.width(),
1080 r.top() + pix.margins.top(),
1081 pix.pixmap.width(), pix.pixmap.height());
1083 case SC_ComboBoxEditField:
1084 r.adjust(desc.margins.left(), desc.margins.right(),
1085 -desc.margins.right(), -desc.margins.bottom());
1086 r.setRight(r.right() - pix.margins.right() - pix.margins.left() - pix.pixmap.width());
1092 r = visualRect(option->direction, option->rect, r);
1096QRect QPixmapStyle::scrollBarSubControlRect(
const QStyleOptionComplex *option,
1097 QStyle::SubControl sc,
const QWidget *)
const
1099#if QT_CONFIG(slider)
1100 if (
const QStyleOptionSlider *slider =
1101 qstyleoption_cast<
const QStyleOptionSlider*>(option)) {
1102 int length = (slider->orientation == Qt::Horizontal)
1103 ? slider->rect.width() : slider->rect.height();
1104 int page = length * slider->pageStep
1105 / (slider->maximum - slider->minimum + slider->pageStep);
1106 int pos = length * slider->sliderValue
1107 / (slider->maximum - slider->minimum + slider->pageStep);
1108 pos = qMin(pos+page, length) - page;
1110 QRect rect = slider->rect;
1112 if (slider->orientation == Qt::Horizontal) {
1114 case SC_ScrollBarAddPage:
1115 rect.setLeft(pos+page);
1117 case SC_ScrollBarSubPage:
1120 case SC_ScrollBarGroove:
1122 case SC_ScrollBarSlider:
1124 rect.setRight(pos+page);
1130 case SC_ScrollBarAddPage:
1131 rect.setTop(pos+page);
1133 case SC_ScrollBarSubPage:
1134 rect.setBottom(pos);
1136 case SC_ScrollBarGroove:
1138 case SC_ScrollBarSlider:
1140 rect.setBottom(pos+page);
1155 QPixmap result(w, h);
1157 const QColor transparent(0, 0, 0, 0);
1158 result.fill( transparent );
1159 QPainter p( &result );
1160 const QMargins margins = desc.margins;
1161 qDrawBorderPixmap(&p, result.rect(), margins, pixmap,
1162 pixmap.rect(), margins, desc.tileRules);
1169 const QSize &size)
const
1171 Q_Q(
const QPixmapStyle);
1173 const QString sizeString = QString::number(size.width()) % u'*'
1174 % QString::number(size.height());
1175 const QString key = QLatin1StringView(q->metaObject()->className()) % QString::number(control)
1176 % u'@' % sizeString;
1180 if (!QPixmapCache::find( key, &result)) {
1181 QPixmap source(desc.fileName);
1182 result = scale(size.width(), size.height(), source, desc);
1183 QPixmapCache::insert(key, result);