304void QWindows11Style::drawComplexControl(ComplexControl control,
const QStyleOptionComplex *option,
305 QPainter *painter,
const QWidget *widget)
const
309 const auto drawTitleBarButton = [&](ComplexControl control, SubControl sc,
const QString &str) {
311 const QRect buttonRect = proxy()->subControlRect(control, option, sc, widget);
312 if (buttonRect.isValid()) {
313 const bool hover = option->activeSubControls == sc && isHover(option);
316 painter->setPen(option->palette.color(QPalette::WindowText));
317 painter->drawText(buttonRect, Qt::AlignCenter, str);
320 const auto drawTitleBarCloseButton = [&](ComplexControl control, SubControl sc,
const QString &str) {
322 const QRect buttonRect = proxy()->subControlRect(control, option, sc, widget);
323 if (buttonRect.isValid()) {
324 const auto state = (option->activeSubControls == sc) ? calcControlState(option)
325 : ControlState::Normal;
329 painter->fillRect(buttonRect, shellCaptionCloseFillColorPrimary);
330 pen = shellCaptionCloseTextFillColorPrimary;
333 painter->fillRect(buttonRect, shellCaptionCloseFillColorSecondary);
334 pen = shellCaptionCloseTextFillColorSecondary;
336 case ControlState::Disabled:
337 case ControlState::Normal:
338 pen = option->palette.color(QPalette::WindowText);
342 painter->drawText(buttonRect, Qt::AlignCenter, str);
347 State state = option->state;
348 SubControls sub = option->subControls;
349 State flags = option->state;
350 if (widget && widget->testAttribute(Qt::WA_UnderMouse) && widget->isActiveWindow())
351 flags |= State_MouseOver;
354 painter->setRenderHint(QPainter::Antialiasing);
355 if (d->transitionsEnabled() && option->styleObject) {
356 if (control == CC_Slider) {
357 if (
const auto *slider = qstyleoption_cast<
const QStyleOptionSlider *>(option)) {
358 QObject *styleObject = option->styleObject;
360 QRectF thumbRect = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget);
361 const qreal outerRadius = qMin(8.0, (slider->orientation == Qt::Horizontal ? thumbRect.height() / 2.0 : thumbRect.width() / 2.0) - 1);
362 bool isInsideHandle = option->activeSubControls == SC_SliderHandle;
364 bool oldIsInsideHandle = styleObject->property(
"_q_insidehandle").toBool();
365 State oldState = State(styleObject->property(
"_q_stylestate").toInt());
366 SubControls oldActiveControls = SubControls(styleObject->property(
"_q_stylecontrols").toInt());
368 QRectF oldRect = styleObject->property(
"_q_stylerect").toRect();
369 styleObject->setProperty(
"_q_insidehandle", isInsideHandle);
370 styleObject->setProperty(
"_q_stylestate",
int(state));
371 styleObject->setProperty(
"_q_stylecontrols",
int(option->activeSubControls));
372 styleObject->setProperty(
"_q_stylerect", option->rect);
373 if (option->styleObject->property(
"_q_end_radius").isNull())
374 option->styleObject->setProperty(
"_q_end_radius", outerRadius * 0.43);
376 bool doTransition = (((state & State_Sunken) != (oldState & State_Sunken)
377 || (oldIsInsideHandle != isInsideHandle)
378 || (oldActiveControls != option->activeSubControls))
379 && state & State_Enabled);
381 if (oldRect != option->rect) {
382 doTransition =
false;
383 d->stopAnimation(styleObject);
384 styleObject->setProperty(
"_q_inner_radius", outerRadius * 0.43);
388 QNumberStyleAnimation *t =
new QNumberStyleAnimation(styleObject);
389 t->setStartValue(styleObject->property(
"_q_inner_radius").toFloat());
390 t->setEndValue(outerRadius * sliderInnerRadius(state, isInsideHandle));
391 styleObject->setProperty(
"_q_end_radius", t->endValue());
393 t->setStartTime(d->animationTime());
395 d->startAnimation(t);
402#if QT_CONFIG(spinbox)
404 if (
const QStyleOptionSpinBox *sb = qstyleoption_cast<
const QStyleOptionSpinBox *>(option)) {
405 QCachedPainter cp(painter, QLatin1StringView(
"win11_spinbox") % HexString<uint8_t>(colorSchemeIndex),
406 sb, sb->rect.size());
407 if (cp.needsPainting()) {
408 const auto frameRect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
409 drawRoundedRect(cp.painter(), frameRect, Qt::NoPen, option->palette.brush(QPalette::Base));
411 if (sb->frame && (sub & SC_SpinBoxFrame))
412 drawLineEditFrame(cp.painter(), frameRect, option);
414 const bool isMouseOver = state & State_MouseOver;
415 const bool hasFocus = state & State_HasFocus;
416 if (isMouseOver && !hasFocus && !highContrastTheme)
417 drawRoundedRect(cp.painter(), frameRect, Qt::NoPen, winUI3Color(subtleHighlightColor));
419 const auto drawUpDown = [&](QStyle::SubControl sc) {
420 const bool isUp = sc == SC_SpinBoxUp;
421 const QRect rect = proxy()->subControlRect(CC_SpinBox, option, sc, widget);
422 if (sb->activeSubControls & sc)
423 drawRoundedRect(cp.painter(), rect.adjusted(1, 1, -1, -2), Qt::NoPen,
424 winUI3Color(subtleHighlightColor));
426 cp->setFont(d->assetFont);
427 cp->setPen(sb->palette.buttonText().color());
428 cp->setBrush(Qt::NoBrush);
429 cp->drawText(rect, Qt::AlignCenter, isUp ? ChevronUp : ChevronDown);
431 if (sub & SC_SpinBoxUp) drawUpDown(SC_SpinBoxUp);
432 if (sub & SC_SpinBoxDown) drawUpDown(SC_SpinBoxDown);
433 if (state & State_KeyboardFocusChange && state & State_HasFocus) {
434 QStyleOptionFocusRect fropt;
435 fropt.QStyleOption::operator=(*option);
436 proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, cp.painter(), widget);
444 if (
const auto *slider = qstyleoption_cast<
const QStyleOptionSlider *>(option)) {
445 const auto &slrect = slider->rect;
446 const bool isHorizontal = slider->orientation == Qt::Horizontal;
447 const QRectF handleRect(proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget));
448 const QPointF handleCenter(handleRect.center());
450 if (sub & SC_SliderGroove) {
451 QRectF rect = proxy()->subControlRect(CC_Slider, option, SC_SliderGroove, widget);
456 rect = QRectF(rect.left() + 2, rect.center().y() - 2, rect.width() - 2, 4);
457 leftRect = QRectF(rect.left(), rect.top(), handleCenter.x() - rect.left(),
459 rightRect = QRectF(handleCenter.x(), rect.top(),
460 rect.width() - handleCenter.x(),
463 rect = QRect(rect.center().x() - 2, rect.top() + 2, 4, rect.height() - 2);
464 leftRect = QRectF(rect.left(), rect.top(), rect.width(),
465 handleCenter.y() - rect.top());
466 rightRect = QRectF(rect.left(), handleCenter.y(), rect.width(),
467 rect.height() - handleCenter.y());
469 if (slider->upsideDown)
470 qSwap(leftRect, rightRect);
472 painter->setPen(Qt::NoPen);
473 painter->setBrush(calculateAccentColor(option));
474 painter->drawRoundedRect(leftRect,1,1);
475 painter->setBrush(WINUI3Colors[colorSchemeIndex][controlStrongFill]);
476 painter->drawRoundedRect(rightRect,1,1);
478 if (sub & SC_SliderTickmarks) {
479 int tickOffset = proxy()->pixelMetric(PM_SliderTickmarkOffset, slider, widget);
480 int ticks = slider->tickPosition;
481 int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider, widget);
482 int len = proxy()->pixelMetric(PM_SliderLength, slider, widget);
483 int available = proxy()->pixelMetric(PM_SliderSpaceAvailable, slider, widget);
484 int interval = slider->tickInterval;
486 interval = slider->singleStep;
487 if (QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, interval,
489 - QStyle::sliderPositionFromValue(slider->minimum, slider->maximum,
491 interval = slider->pageStep;
496 painter->setPen(slider->palette.text().color());
497 QVarLengthArray<QLineF, 32> lines;
498 int v = slider->minimum;
499 while (v <= slider->maximum + 1) {
500 if (v == slider->maximum + 1 && interval == 1)
502 const int v_ = qMin(v, slider->maximum);
503 int tickLength = (v_ == slider->minimum || v_ >= slider->maximum) ? 4 : 3;
504 int pos = QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, v_,
505 available, slider->upsideDown);
508 if (ticks & QSlider::TicksAbove) {
509 lines.append(QLineF(pos, tickOffset - 0.5,
510 pos, tickOffset - tickLength - 0.5));
513 if (ticks & QSlider::TicksBelow) {
514 lines.append(QLineF(pos, tickOffset + thickness + 0.5,
515 pos, tickOffset + thickness + tickLength + 0.5));
518 if (ticks & QSlider::TicksAbove) {
519 lines.append(QLineF(tickOffset - 0.5, pos,
520 tickOffset - tickLength - 0.5, pos));
523 if (ticks & QSlider::TicksBelow) {
524 lines.append(QLineF(tickOffset + thickness + 0.5, pos,
525 tickOffset + thickness + tickLength + 0.5, pos));
529 int nextInterval = v + interval;
530 if (nextInterval < v)
534 if (!lines.isEmpty()) {
536 painter->translate(slrect.topLeft());
537 painter->drawLines(lines.constData(), lines.size());
541 if (sub & SC_SliderHandle) {
542 const qreal outerRadius = qMin(8.0, (isHorizontal ? handleRect.height() / 2.0 : handleRect.width() / 2.0) - 1);
543 float innerRadius = outerRadius * 0.43;
545 if (option->styleObject) {
546 const QNumberStyleAnimation* animation = qobject_cast<QNumberStyleAnimation *>(d->animation(option->styleObject));
547 if (animation !=
nullptr) {
548 innerRadius = animation->currentValue();
549 option->styleObject->setProperty(
"_q_inner_radius", innerRadius);
551 bool isInsideHandle = option->activeSubControls == SC_SliderHandle;
552 innerRadius = outerRadius * sliderInnerRadius(state, isInsideHandle);
556 painter->setPen(Qt::NoPen);
557 painter->setBrush(winUI3Color(controlFillSolid));
558 painter->drawEllipse(handleCenter, outerRadius, outerRadius);
559 painter->setBrush(calculateAccentColor(option));
560 painter->drawEllipse(handleCenter, innerRadius, innerRadius);
562 painter->setPen(winUI3Color(controlStrokeSecondary));
563 painter->setBrush(Qt::NoBrush);
564 painter->drawEllipse(handleCenter, outerRadius + 0.5, outerRadius + 0.5);
566 if (slider->state & State_HasFocus) {
567 QStyleOptionFocusRect fropt;
568 fropt.QStyleOption::operator=(*slider);
569 fropt.rect = subElementRect(SE_SliderFocusRect, slider, widget);
570 proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
575#if QT_CONFIG(combobox)
577 if (
const QStyleOptionComboBox *combobox = qstyleoption_cast<
const QStyleOptionComboBox *>(option)) {
578 const auto frameRect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
579 drawRoundedRect(painter, frameRect, Qt::NoPen, option->palette.brush(QPalette::Base));
582 drawLineEditFrame(painter, frameRect, combobox, combobox->editable);
584 const bool hasFocus = state & State_HasFocus;
585 QStyleOption opt(*option);
586 opt.state.setFlag(QStyle::State_On,
false);
587 drawRoundedRect(painter, frameRect, Qt::NoPen, controlFillBrush(&opt, ControlType::Control));
589 if (sub & SC_ComboBoxArrow) {
590 QRectF rect = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxArrow, widget).adjusted(4, 0, -4, 1);
591 painter->setFont(d->assetFont);
592 painter->setPen(controlTextColor(option));
593 painter->drawText(rect, Qt::AlignCenter, ChevronDownMed);
595 if (state & State_KeyboardFocusChange && hasFocus) {
596 QStyleOptionFocusRect fropt;
597 fropt.QStyleOption::operator=(*option);
598 proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
604 if (
const QStyleOptionSlider *scrollbar = qstyleoption_cast<
const QStyleOptionSlider *>(option)) {
605 QCachedPainter cp(painter, QLatin1StringView(
"win11_scrollbar")
606 % HexString<uint8_t>(colorSchemeIndex)
607 % HexString<
int>(scrollbar->minimum)
608 % HexString<
int>(scrollbar->maximum)
609 % HexString<
int>(scrollbar->sliderPosition),
610 scrollbar, scrollbar->rect.size());
611 if (cp.needsPainting()) {
612 const bool vertical = scrollbar->orientation == Qt::Vertical;
613 const bool horizontal = scrollbar->orientation == Qt::Horizontal;
614 const bool isMouseOver = state & State_MouseOver;
615 const bool isRtl = option->direction == Qt::RightToLeft;
618 QRectF rect = scrollbar->rect;
619 const QPointF center = rect.center();
620 if (vertical && rect.width() > 24) {
621 rect.marginsRemoved(QMargins(0, 2, 2, 2));
622 rect.setWidth(rect.width() / 2);
623 }
else if (horizontal && rect.height() > 24) {
624 rect.marginsRemoved(QMargins(2, 0, 2, 2));
625 rect.setHeight(rect.height() / 2);
627 rect.moveCenter(center);
628 cp->setBrush(scrollbar->palette.base());
629 cp->setPen(Qt::NoPen);
630 cp->drawRoundedRect(rect, topLevelRoundingRadius, topLevelRoundingRadius);
631 rect = rect.marginsRemoved(QMarginsF(0.5, 0.5, 0.5, 0.5));
632 cp->setBrush(Qt::NoBrush);
633 cp->setPen(WINUI3Colors[colorSchemeIndex][frameColorLight]);
634 cp->drawRoundedRect(rect, topLevelRoundingRadius + 0.5, topLevelRoundingRadius + 0.5);
636 if (sub & SC_ScrollBarSlider) {
637 QRectF rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider, widget);
638 const QPointF center = rect.center();
640 rect.setWidth(isMouseOver ? rect.width() / 2 : 1);
642 rect.setHeight(isMouseOver ? rect.height() / 2 : 1);
643 rect.moveCenter(center);
644 cp->setBrush(Qt::gray);
645 cp->setPen(Qt::NoPen);
646 cp->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
648 if (sub & SC_ScrollBarAddLine) {
650 const QRectF rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarAddLine, widget);
651 QFont f = QFont(d->assetFont);
654 cp->setPen(Qt::gray);
657 cp->drawText(rect, Qt::AlignCenter, str);
660 if (sub & SC_ScrollBarSubLine) {
662 const QRectF rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSubLine, widget);
663 QFont f = QFont(d->assetFont);
666 cp->setPen(Qt::gray);
669 cp->drawText(rect, Qt::AlignCenter, str);
675 case CC_MdiControls:{
676 QFont buttonFont = QFont(d->assetFont);
677 buttonFont.setPointSize(8);
678 painter->setFont(buttonFont);
679 drawTitleBarCloseButton(CC_MdiControls, SC_MdiCloseButton,
ChromeClose);
680 drawTitleBarButton(CC_MdiControls, SC_MdiNormalButton,
ChromeRestore);
681 drawTitleBarButton(CC_MdiControls, SC_MdiMinButton,
ChromeMinimize);
685 if (
const auto* titlebar = qstyleoption_cast<
const QStyleOptionTitleBar*>(option)) {
686 painter->setPen(Qt::NoPen);
687 painter->setPen(WINUI3Colors[colorSchemeIndex][surfaceStroke]);
688 painter->setBrush(titlebar->palette.button());
689 painter->drawRect(titlebar->rect);
692 QRect textRect = proxy()->subControlRect(CC_TitleBar, titlebar, SC_TitleBarLabel, widget);
693 QColor textColor = titlebar->palette.color(titlebar->titleBarState & Qt::WindowActive ? QPalette::Active : QPalette::Disabled,QPalette::WindowText);
694 painter->setPen(textColor);
696 QString title = painter->fontMetrics().elidedText(titlebar->text, Qt::ElideRight, textRect.width() - 14);
697 painter->drawText(textRect.adjusted(1, 1, -1, -1), title, QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
699 QFont buttonFont = QFont(d->assetFont);
700 buttonFont.setPointSize(8);
701 painter->setFont(buttonFont);
702 auto shouldDrawButton = [titlebar](SubControl sc, Qt::WindowType flag) {
703 return (titlebar->subControls & sc) && (titlebar->titleBarFlags & flag);
707 if (shouldDrawButton(SC_TitleBarMinButton, Qt::WindowMinimizeButtonHint) &&
708 !(titlebar->titleBarState & Qt::WindowMinimized)) {
709 drawTitleBarButton(CC_TitleBar, SC_TitleBarMinButton,
ChromeMinimize);
713 if (shouldDrawButton(SC_TitleBarMaxButton, Qt::WindowMaximizeButtonHint) &&
714 !(titlebar->titleBarState & Qt::WindowMaximized)) {
715 drawTitleBarButton(CC_TitleBar, SC_TitleBarMaxButton,
ChromeMaximize);
719 if (shouldDrawButton(SC_TitleBarCloseButton, Qt::WindowSystemMenuHint))
720 drawTitleBarCloseButton(CC_TitleBar, SC_TitleBarCloseButton,
ChromeClose);
723 if ((titlebar->subControls & SC_TitleBarNormalButton) &&
724 (((titlebar->titleBarFlags & Qt::WindowMinimizeButtonHint) &&
725 (titlebar->titleBarState & Qt::WindowMinimized)) ||
726 ((titlebar->titleBarFlags & Qt::WindowMaximizeButtonHint) &&
727 (titlebar->titleBarState & Qt::WindowMaximized)))) {
728 drawTitleBarButton(CC_TitleBar, SC_TitleBarNormalButton,
ChromeRestore);
732 if (shouldDrawButton(SC_TitleBarContextHelpButton, Qt::WindowContextHelpButtonHint))
733 drawTitleBarButton(CC_TitleBar, SC_TitleBarContextHelpButton,
Help);
736 if (shouldDrawButton(SC_TitleBarShadeButton, Qt::WindowShadeButtonHint))
737 drawTitleBarButton(CC_TitleBar, SC_TitleBarShadeButton,
ChevronUpSmall);
740 if (shouldDrawButton(SC_TitleBarUnshadeButton, Qt::WindowShadeButtonHint))
741 drawTitleBarButton(CC_TitleBar, SC_TitleBarUnshadeButton,
ChevronDownSmall);
744 if (shouldDrawButton(SC_TitleBarSysMenu, Qt::WindowSystemMenuHint)) {
745 const QRect iconRect = proxy()->subControlRect(CC_TitleBar, titlebar, SC_TitleBarSysMenu, widget);
746 if (iconRect.isValid()) {
747 if (!titlebar->icon.isNull()) {
748 titlebar->icon.paint(painter, iconRect);
750 QStyleOption tool = *titlebar;
751 const auto extent = proxy()->pixelMetric(PM_SmallIconSize, &tool, widget);
752 const auto dpr = QStyleHelper::getDpr(widget);
753 const auto icon = proxy()->standardIcon(SP_TitleBarMenuButton, &tool, widget);
754 const auto pm = icon.pixmap(QSize(extent, extent), dpr);
755 proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pm);
762 QWindowsVistaStyle::drawComplexControl(control, option, painter, widget);
767void QWindows11Style::drawPrimitive(PrimitiveElement element,
const QStyleOption *option,
769 const QWidget *widget)
const {
772 int state = option->state;
774 painter->setRenderHint(QPainter::Antialiasing);
775 if (d->transitionsEnabled() && option->styleObject && (element == PE_IndicatorCheckBox || element == PE_IndicatorRadioButton)) {
776 QObject *styleObject = option->styleObject;
777 int oldState = styleObject->property(
"_q_stylestate").toInt();
778 styleObject->setProperty(
"_q_stylestate",
int(option->state));
779 styleObject->setProperty(
"_q_stylerect", option->rect);
780 bool doTransition = (((state & State_Sunken) != (oldState & State_Sunken)
781 || ((state & State_MouseOver) != (oldState & State_MouseOver))
782 || (state & State_On) != (oldState & State_On))
783 && state & State_Enabled);
785 if (element == PE_IndicatorRadioButton) {
786 QNumberStyleAnimation *t =
new QNumberStyleAnimation(styleObject);
787 t->setStartValue(styleObject->property(
"_q_inner_radius").toFloat());
788 t->setEndValue(radioButtonInnerRadius(state));
789 styleObject->setProperty(
"_q_end_radius", t->endValue());
790 t->setStartTime(d->animationTime());
792 d->startAnimation(t);
794 else if (element == PE_IndicatorCheckBox) {
795 if ((oldState & State_Off && state & State_On) || (oldState & State_NoChange && state & State_On)) {
796 QNumberStyleAnimation *t =
new QNumberStyleAnimation(styleObject);
797 t->setStartValue(0.0f);
798 t->setEndValue(1.0f);
799 t->setStartTime(d->animationTime());
801 d->startAnimation(t);
808 case PE_FrameFocusRect: {
809 if (
const QStyleOptionFocusRect *fropt = qstyleoption_cast<
const QStyleOptionFocusRect *>(option)) {
810 if (!(fropt->state & State_KeyboardFocusChange))
812 QRectF focusRect = option->rect;
813 focusRect = focusRect.marginsRemoved(QMarginsF(1.5,1.5,1.5,1.5));
814 painter->setPen(winUI3Color(focusFrameInnerStroke));
815 painter->drawRoundedRect(focusRect,4,4);
817 focusRect = focusRect.marginsAdded(QMarginsF(1.0,1.0,1.0,1.0));
818 painter->setPen(QPen(winUI3Color(focusFrameOuterStroke),1));
819 painter->drawRoundedRect(focusRect,4,4);
823 case PE_PanelTipLabel: {
824 const auto rect = QRectF(option->rect).marginsRemoved(QMarginsF(0.5, 0.5, 0.5, 0.5));
825 const auto pen = highContrastTheme ? option->palette.buttonText().color()
826 : winUI3Color(frameColorLight);
827 drawRoundedRect(painter, rect, pen, option->palette.toolTipBase());
830 case PE_FrameTabWidget:
831#if QT_CONFIG(tabwidget)
832 if (
const QStyleOptionTabWidgetFrame *frame = qstyleoption_cast<
const QStyleOptionTabWidgetFrame *>(option)) {
833 const auto rect = QRectF(option->rect).marginsRemoved(QMarginsF(0.5, 0.5, 0.5, 0.5));
834 const auto pen = highContrastTheme ? frame->palette.buttonText().color()
835 : winUI3Color(frameColorLight);
836 drawRoundedRect(painter, rect, pen, frame->palette.base());
840 case PE_FrameGroupBox:
841 if (
const QStyleOptionFrame *frame = qstyleoption_cast<
const QStyleOptionFrame *>(option)) {
842 const auto pen = highContrastTheme ? frame->palette.buttonText().color()
843 : winUI3Color(frameColorStrong);
844 if (frame->features & QStyleOptionFrame::Flat) {
845 painter->setBrush(Qt::NoBrush);
846 painter->setPen(pen);
847 const QRect &fr = frame->rect;
848 QPoint p1(fr.x(), fr.y() + 1);
849 QPoint p2(fr.x() + fr.width(), p1.y());
850 painter->drawLine(p1, p2);
852 const auto frameRect = QRectF(frame->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
853 drawRoundedRect(painter, frameRect, pen, Qt::NoBrush);
857 case PE_IndicatorHeaderArrow:
858 if (
const QStyleOptionHeader *header = qstyleoption_cast<
const QStyleOptionHeader *>(option)) {
859 QFont f(d->assetFont);
862 painter->setPen(header->palette.text().color());
863 QRectF rect = option->rect;
864 if (header->sortIndicator & QStyleOptionHeader::SortUp) {
866 }
else if (header->sortIndicator & QStyleOptionHeader::SortDown) {
871 case PE_IndicatorCheckBox: {
872 const bool isOn = option->state & State_On;
873 const bool isPartial = option->state & State_NoChange;
875 const QRectF rect = option->rect;
876 const QPointF center = rect.center();
878 drawRoundedRect(painter, option->rect, borderPenControlAlt(option),
879 controlFillBrush(option, ControlType::ControlAlt));
882 painter->setFont(d->assetFont);
883 painter->setPen(controlTextColor(option, QPalette::Window));
884 qreal clipWidth = 1.0;
885 QFontMetrics fm(d->assetFont);
887 if (d->transitionsEnabled() && option->styleObject) {
888 QNumberStyleAnimation *animation = qobject_cast<QNumberStyleAnimation *>(
889 d->animation(option->styleObject));
891 clipWidth = animation->currentValue();
894 clipRect.moveCenter(center);
895 clipRect.setLeft(rect.x() + (rect.width() - clipRect.width()) / 2.0 + 0.5);
896 clipRect.setWidth(clipWidth * clipRect.width());
897 painter->drawText(clipRect, Qt::AlignVCenter | Qt::AlignLeft,
AcceptMedium);
898 }
else if (isPartial) {
899 QFont f(d->assetFont);
902 painter->setPen(controlTextColor(option, QPalette::Window));
903 painter->drawText(rect, Qt::AlignCenter,
Dash12);
907 case PE_IndicatorBranch: {
908 if (option->state & State_Children) {
909 const bool isReverse = option->direction == Qt::RightToLeft;
910 const bool isOpen = option->state & QStyle::State_Open;
911 QFont f(d->assetFont);
914 painter->setPen(option->palette.color(isOpen ? QPalette::Active : QPalette::Disabled,
915 QPalette::WindowText));
917 painter->drawText(option->rect, Qt::AlignCenter, str);
921 case PE_IndicatorRadioButton: {
922 const bool isOn = option->state & State_On;
923 qreal innerRadius = radioButtonInnerRadius(state);
924 if (d->transitionsEnabled() && option->styleObject) {
925 if (option->styleObject->property(
"_q_end_radius").isNull())
926 option->styleObject->setProperty(
"_q_end_radius", innerRadius);
927 QNumberStyleAnimation *animation = qobject_cast<QNumberStyleAnimation *>(d->animation(option->styleObject));
928 innerRadius = animation ? animation->currentValue() : option->styleObject->property(
"_q_end_radius").toFloat();
929 option->styleObject->setProperty(
"_q_inner_radius", innerRadius);
932 const QRectF rect = option->rect;
933 const QPointF center = rect.center();
935 painter->setPen(borderPenControlAlt(option));
936 painter->setBrush(controlFillBrush(option, ControlType::ControlAlt));
939 path.addEllipse(center, 7.5, 7.5);
940 path.addEllipse(center, innerRadius, innerRadius);
941 painter->drawPath(path);
943 painter->setBrush(option->palette.window().color());
944 painter->drawEllipse(center, innerRadius, innerRadius);
946 painter->drawEllipse(center, 7.5, 7.5);
950 case PE_PanelButtonTool:
951 case PE_PanelButtonBevel:{
952 const bool isEnabled = state & QStyle::State_Enabled;
953 const bool isMouseOver = state & QStyle::State_MouseOver;
954 const bool isRaised = state & QStyle::State_Raised;
955 const QRectF rect = option->rect.marginsRemoved(QMargins(2,2,2,2));
956 if (element == PE_PanelButtonTool && ((!isMouseOver && !isRaised) || !isEnabled))
957 painter->setPen(Qt::NoPen);
959 painter->setPen(WINUI3Colors[colorSchemeIndex][controlStrokePrimary]);
960 painter->setBrush(controlFillBrush(option, ControlType::Control));
961 painter->drawRoundedRect(rect,
962 secondLevelRoundingRadius, secondLevelRoundingRadius);
966 painter->setPen(WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]);
967 painter->drawLine(rect.bottomLeft() + QPointF(sublineOffset, 0.5), rect.bottomRight() + QPointF(-sublineOffset, 0.5));
971 case PE_FrameDefaultButton:
972 painter->setPen(option->palette.accent().color());
973 painter->setBrush(Qt::NoBrush);
974 painter->drawRoundedRect(option->rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
979 const QRect rect = option->rect.marginsRemoved(QMargins(2, 2, 2, 2));
980 painter->setPen(highContrastTheme ? QPen(option->palette.windowText().color(), 2)
981 : winUI3Color(frameColorLight));
982 painter->setBrush(winUI3Color(menuPanelFill));
983 painter->drawRoundedRect(rect, topLevelRoundingRadius, topLevelRoundingRadius);
986 case PE_PanelLineEdit:
987 if (
const auto *panel = qstyleoption_cast<
const QStyleOptionFrame *>(option)) {
988 const auto frameRect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
989 drawRoundedRect(painter, frameRect, Qt::NoPen, option->palette.brush(QPalette::Base));
991 if (panel->lineWidth > 0)
992 proxy()->drawPrimitive(PE_FrameLineEdit, panel, painter, widget);
994 const bool isMouseOver = state & State_MouseOver;
995 const bool hasFocus = state & State_HasFocus;
996 if (isMouseOver && !hasFocus && !highContrastTheme)
997 drawRoundedRect(painter, frameRect, Qt::NoPen, winUI3Color(subtleHighlightColor));
1000 case PE_FrameLineEdit: {
1001 const auto frameRect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
1002 drawLineEditFrame(painter, frameRect, option);
1003 if (state & State_KeyboardFocusChange && state & State_HasFocus) {
1004 QStyleOptionFocusRect fropt;
1005 fropt.QStyleOption::operator=(*option);
1006 proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
1011 if (
const auto *frame = qstyleoption_cast<
const QStyleOptionFrame *>(option)) {
1012 const auto rect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
1013 if (qobject_cast<
const QComboBoxPrivateContainer *>(widget)) {
1015 if (highContrastTheme)
1016 pen = QPen(option->palette.windowText().color(), 2);
1019 drawRoundedRect(painter, rect, pen, WINUI3Colors[colorSchemeIndex][menuPanelFill]);
1021 drawRoundedRect(painter, rect, Qt::NoPen, option->palette.brush(QPalette::Base));
1023 if (frame->frameShape == QFrame::NoFrame)
1026 drawLineEditFrame(painter, rect, option, qobject_cast<
const QTextEdit *>(widget) !=
nullptr);
1030 case PE_PanelItemViewItem:
1031 if (
const QStyleOptionViewItem *vopt = qstyleoption_cast<
const QStyleOptionViewItem *>(option)) {
1032 if (vopt->backgroundBrush.style() != Qt::NoBrush) {
1033 QPainterStateGuard psg(
painter);
1034 painter->setBrushOrigin(vopt->rect.topLeft());
1035 painter->fillRect(vopt->rect, vopt->backgroundBrush);
1039 case PE_PanelItemViewRow:
1040 if (
const QStyleOptionViewItem *vopt = qstyleoption_cast<
const QStyleOptionViewItem *>(option)) {
1044 const QRect &rect = vopt->rect;
1045 const bool isRtl = option->direction == Qt::RightToLeft;
1046 if (rect.width() <= 0)
1049 if (vopt->features & QStyleOptionViewItem::Alternate) {
1050 QPalette::ColorGroup cg =
1051 (widget ? widget->isEnabled() : (vopt->state & QStyle::State_Enabled))
1053 : QPalette::Disabled;
1054 if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active))
1055 cg = QPalette::Inactive;
1056 painter->fillRect(rect, option->palette.brush(cg, QPalette::AlternateBase));
1059 if (option->state & State_Selected && !highContrastTheme) {
1061 const auto col = option->palette.accent().color();
1062 painter->setBrush(col);
1063 painter->setPen(col);
1064 const auto xPos = isRtl ? rect.right() - 4.5f : rect.left() + 3.5f;
1065 const auto yOfs = rect.height() / 4.;
1066 QRectF r(QPointF(xPos, rect.y() + yOfs),
1067 QPointF(xPos + 1, rect.y() + rect.height() - yOfs));
1068 painter->drawRoundedRect(r, 1, 1);
1071 const bool isTreeDecoration = vopt->features.testFlag(
1072 QStyleOptionViewItem::IsDecorationForRootColumn);
1073 if (isTreeDecoration && vopt->state.testAnyFlags(State_Selected | State_MouseOver) &&
1074 vopt->showDecorationSelected) {
1075 const bool onlyOne = vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne ||
1076 vopt->viewItemPosition == QStyleOptionViewItem::Invalid;
1077 bool isFirst = vopt->viewItemPosition == QStyleOptionViewItem::Beginning;
1078 bool isLast = vopt->viewItemPosition == QStyleOptionViewItem::End;
1088 const QAbstractItemView *view = qobject_cast<
const QAbstractItemView *>(widget);
1089 painter->setBrush(view->alternatingRowColors() ? vopt->palette.highlight() : WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
1090 painter->setPen(Qt::NoPen);
1093 painter->setClipRect(rect);
1094 painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, -secondLevelRoundingRadius, 2)),
1095 secondLevelRoundingRadius, secondLevelRoundingRadius);
1097 }
else if (isLast) {
1099 painter->setClipRect(rect);
1100 painter->drawRoundedRect(rect.marginsRemoved(QMargins(-secondLevelRoundingRadius, 2, 2, 2)),
1101 secondLevelRoundingRadius, secondLevelRoundingRadius);
1104 painter->drawRect(vopt->rect.marginsRemoved(QMargins(0, 2, 0, 2)));
1109 case QStyle::PE_Widget: {
1110 if (widget && widget->palette().isBrushSet(QPalette::Active, widget->backgroundRole())) {
1111 const QBrush bg = widget->palette().brush(widget->backgroundRole());
1112 auto wp = QWidgetPrivate::get(widget);
1113 QPainterStateGuard psg(
painter);
1114 wp->updateBrushOrigin(painter, bg);
1115 painter->fillRect(option->rect, bg);
1119 case QStyle::PE_FrameWindow:
1120 if (
const auto *frm = qstyleoption_cast<
const QStyleOptionFrame *>(option)) {
1122 QRectF rect= option->rect;
1123 int fwidth =
int((frm->lineWidth + frm->midLineWidth) / QWindowsStylePrivate::nativeMetricScaleFactor(widget));
1125 QRectF bottomLeftCorner = QRectF(rect.left() + 1.0,
1126 rect.bottom() - 1.0 - secondLevelRoundingRadius,
1127 secondLevelRoundingRadius,
1128 secondLevelRoundingRadius);
1129 QRectF bottomRightCorner = QRectF(rect.right() - 1.0 - secondLevelRoundingRadius,
1130 rect.bottom() - 1.0 - secondLevelRoundingRadius,
1131 secondLevelRoundingRadius,
1132 secondLevelRoundingRadius);
1135 if (widget !=
nullptr) {
1136 QBitmap mask(widget->width(), widget->height());
1140 maskPainter.setRenderHint(QPainter::Antialiasing);
1141 maskPainter.setBrush(Qt::color1);
1142 maskPainter.setPen(Qt::NoPen);
1143 maskPainter.drawRoundedRect(option->rect,secondLevelRoundingRadius,secondLevelRoundingRadius);
1144 const_cast<QWidget*>(widget)->setMask(mask);
1148 painter->setPen(QPen(frm->palette.base(), fwidth));
1149 painter->drawLine(QPointF(rect.left(), rect.top()),
1150 QPointF(rect.left(), rect.bottom() - fwidth));
1151 painter->drawLine(QPointF(rect.left() + fwidth, rect.bottom()),
1152 QPointF(rect.right() - fwidth, rect.bottom()));
1153 painter->drawLine(QPointF(rect.right(), rect.top()),
1154 QPointF(rect.right(), rect.bottom() - fwidth));
1156 painter->setPen(WINUI3Colors[colorSchemeIndex][surfaceStroke]);
1157 painter->drawLine(QPointF(rect.left() + 0.5, rect.top() + 0.5),
1158 QPointF(rect.left() + 0.5, rect.bottom() - 0.5 - secondLevelRoundingRadius));
1159 painter->drawLine(QPointF(rect.left() + 0.5 + secondLevelRoundingRadius, rect.bottom() - 0.5),
1160 QPointF(rect.right() - 0.5 - secondLevelRoundingRadius, rect.bottom() - 0.5));
1161 painter->drawLine(QPointF(rect.right() - 0.5, rect.top() + 1.5),
1162 QPointF(rect.right() - 0.5, rect.bottom() - 0.5 - secondLevelRoundingRadius));
1164 painter->setPen(Qt::NoPen);
1165 painter->setBrush(frm->palette.base());
1166 painter->drawPie(bottomRightCorner.marginsAdded(QMarginsF(2.5,2.5,0.0,0.0)),
1168 painter->drawPie(bottomLeftCorner.marginsAdded(QMarginsF(0.0,2.5,2.5,0.0)),
1171 painter->setPen(WINUI3Colors[colorSchemeIndex][surfaceStroke]);
1172 painter->setBrush(Qt::NoBrush);
1173 painter->drawArc(bottomRightCorner,
1175 painter->drawArc(bottomLeftCorner,
1180 QWindowsVistaStyle::drawPrimitive(element, option, painter, widget);
1188void QWindows11Style::drawControl(ControlElement element,
const QStyleOption *option,
1189 QPainter *painter,
const QWidget *widget)
const
1191 Q_D(
const QWindows11Style);
1192 State flags = option->state;
1195 painter->setRenderHint(QPainter::Antialiasing);
1197 case QStyle::CE_ComboBoxLabel:
1198#if QT_CONFIG(combobox)
1199 if (
const QStyleOptionComboBox *cb = qstyleoption_cast<
const QStyleOptionComboBox *>(option)) {
1200 painter->setPen(controlTextColor(option));
1201 QStyleOptionComboBox newOption = *cb;
1202 newOption.rect.adjust(4,0,-4,0);
1203 QCommonStyle::drawControl(element, &newOption, painter, widget);
1207 case QStyle::CE_TabBarTabShape:
1208#if QT_CONFIG(tabbar)
1209 if (
const QStyleOptionTab *tab = qstyleoption_cast<
const QStyleOptionTab *>(option)) {
1210 QRectF tabRect = tab->rect.marginsRemoved(QMargins(2,2,0,0));
1211 painter->setPen(Qt::NoPen);
1212 painter->setBrush(tab->palette.base());
1213 if (tab->state & State_MouseOver){
1214 painter->setBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
1215 }
else if (tab->state & State_Selected) {
1216 painter->setBrush(tab->palette.base());
1218 painter->setBrush(tab->palette.window());
1220 painter->drawRoundedRect(tabRect,2,2);
1222 painter->setBrush(Qt::NoBrush);
1223 painter->setPen(highContrastTheme ==
true ? tab->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorLight]);
1224 painter->drawRoundedRect(tabRect.adjusted(0.5,0.5,-0.5,-0.5),2,2);
1229 case CE_ToolButtonLabel:
1230#if QT_CONFIG(toolbutton)
1231 if (
const QStyleOptionToolButton *toolbutton
1232 = qstyleoption_cast<
const QStyleOptionToolButton *>(option)) {
1233 QRect rect = toolbutton->rect;
1236 if (toolbutton->state & (State_Sunken | State_On)) {
1237 shiftX = proxy()->pixelMetric(PM_ButtonShiftHorizontal, toolbutton, widget);
1238 shiftY = proxy()->pixelMetric(PM_ButtonShiftVertical, toolbutton, widget);
1241 bool hasArrow = toolbutton->features & QStyleOptionToolButton::Arrow;
1242 if (((!hasArrow && toolbutton->icon.isNull()) && !toolbutton->text.isEmpty())
1243 || toolbutton->toolButtonStyle == Qt::ToolButtonTextOnly) {
1244 int alignment = Qt::AlignCenter | Qt::TextShowMnemonic;
1245 if (!proxy()->styleHint(SH_UnderlineShortcut, toolbutton, widget))
1246 alignment |= Qt::TextHideMnemonic;
1247 rect.translate(shiftX, shiftY);
1248 painter->setFont(toolbutton->font);
1249 const QString text = d->toolButtonElideText(toolbutton, rect, alignment);
1251 painter->setPen(controlTextColor(option));
1252 proxy()->drawItemText(painter, rect, alignment, toolbutton->palette,
1253 toolbutton->state & State_Enabled, text);
1256 QSize pmSize = toolbutton->iconSize;
1257 if (!toolbutton->icon.isNull()) {
1258 QIcon::State state = toolbutton->state & State_On ? QIcon::On : QIcon::Off;
1260 if (!(toolbutton->state & State_Enabled))
1261 mode = QIcon::Disabled;
1262 else if ((toolbutton->state & State_MouseOver) && (toolbutton->state & State_AutoRaise))
1263 mode = QIcon::Active;
1265 mode = QIcon::Normal;
1266 pm = toolbutton->icon.pixmap(toolbutton->rect.size().boundedTo(toolbutton->iconSize), painter->device()->devicePixelRatio(),
1268 pmSize = pm.size() / pm.devicePixelRatio();
1271 if (toolbutton->toolButtonStyle != Qt::ToolButtonIconOnly) {
1272 painter->setFont(toolbutton->font);
1275 int alignment = Qt::TextShowMnemonic;
1276 if (!proxy()->styleHint(SH_UnderlineShortcut, toolbutton, widget))
1277 alignment |= Qt::TextHideMnemonic;
1279 if (toolbutton->toolButtonStyle == Qt::ToolButtonTextUnderIcon) {
1280 pr.setHeight(pmSize.height() + 4);
1281 tr.adjust(0, pr.height() - 1, 0, -1);
1282 pr.translate(shiftX, shiftY);
1284 proxy()->drawItemPixmap(painter, pr, Qt::AlignCenter, pm);
1286 drawArrow(proxy(), toolbutton, pr, painter, widget);
1288 alignment |= Qt::AlignCenter;
1290 pr.setWidth(pmSize.width() + 4);
1291 tr.adjust(pr.width(), 0, 0, 0);
1292 pr.translate(shiftX, shiftY);
1294 proxy()->drawItemPixmap(painter, QStyle::visualRect(toolbutton->direction, rect, pr), Qt::AlignCenter, pm);
1296 drawArrow(proxy(), toolbutton, pr, painter, widget);
1298 alignment |= Qt::AlignLeft | Qt::AlignVCenter;
1300 tr.translate(shiftX, shiftY);
1301 const QString text = d->toolButtonElideText(toolbutton, tr, alignment);
1302 painter->setPen(controlTextColor(option));
1303 proxy()->drawItemText(painter, QStyle::visualRect(toolbutton->direction, rect, tr), alignment, toolbutton->palette,
1304 toolbutton->state & State_Enabled, text);
1306 rect.translate(shiftX, shiftY);
1308 drawArrow(proxy(), toolbutton, rect, painter, widget);
1310 proxy()->drawItemPixmap(painter, rect, Qt::AlignCenter, pm);
1317 case QStyle::CE_ShapedFrame:
1318 if (
const QStyleOptionFrame *f = qstyleoption_cast<
const QStyleOptionFrame *>(option)) {
1319 int frameShape = f->frameShape;
1320 int frameShadow = QFrame::Plain;
1321 if (f->state & QStyle::State_Sunken)
1322 frameShadow = QFrame::Sunken;
1323 else if (f->state & QStyle::State_Raised)
1324 frameShadow = QFrame::Raised;
1326 int lw = f->lineWidth;
1327 int mlw = f->midLineWidth;
1329 switch (frameShape) {
1331 if (frameShadow == QFrame::Plain)
1332 qDrawPlainRoundedRect(painter, f->rect, secondLevelRoundingRadius, secondLevelRoundingRadius, highContrastTheme ==
true ? f->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorStrong], lw);
1334 qDrawShadeRect(painter, f->rect, f->palette, frameShadow == QFrame::Sunken, lw, mlw);
1337 if (frameShadow == QFrame::Plain)
1338 qDrawPlainRoundedRect(painter, f->rect, secondLevelRoundingRadius, secondLevelRoundingRadius, highContrastTheme ==
true ? f->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorStrong], lw);
1340 qDrawShadePanel(painter, f->rect, f->palette, frameShadow == QFrame::Sunken, lw);
1343 QWindowsVistaStyle::drawControl(element, option, painter, widget);
1347#if QT_CONFIG(progressbar)
1348 case CE_ProgressBarGroove:
1349 if (
const auto baropt = qstyleoption_cast<
const QStyleOptionProgressBar*>(option)) {
1350 QRect rect = option->rect;
1351 QPointF center = rect.center();
1352 if (baropt->state & QStyle::State_Horizontal) {
1354 rect.moveTop(center.y());
1357 rect.moveLeft(center.x());
1359 painter->setPen(Qt::NoPen);
1360 painter->setBrush(Qt::gray);
1361 painter->drawRect(rect);
1364 case CE_ProgressBarContents:
1365 if (
const auto baropt = qstyleoption_cast<
const QStyleOptionProgressBar *>(option)) {
1366 QPainterStateGuard psg(painter);
1367 QRectF rect = option->rect;
1368 painter->translate(rect.topLeft());
1369 rect.translate(-rect.topLeft());
1371 constexpr qreal progressBarThickness = 3;
1372 constexpr qreal progressBarHalfThickness = progressBarThickness / 2.0;
1374 const auto isIndeterminate = baropt->maximum == 0 && baropt->minimum == 0;
1375 const auto orientation =
1376 (baropt->state & QStyle::State_Horizontal) ? Qt::Horizontal : Qt::Vertical;
1377 const auto inverted = baropt->invertedAppearance;
1378 const auto reverse = (baropt->direction == Qt::RightToLeft) ^ inverted;
1382 if (orientation == Qt::Vertical) {
1383 rect = QRectF(rect.left(), rect.top(), rect.height(),
1388 m.translate(0, -rect.height() + 1);
1391 m.translate(-rect.width(), 0);
1393 painter->setTransform(m,
true);
1394 }
else if (reverse) {
1395 QTransform m = QTransform::fromScale(-1, 1);
1396 m.translate(-rect.width(), 0);
1397 painter->setTransform(m,
true);
1399 const qreal offset = (
int(rect.height()) % 2 == 0) ? 0.5f : 0.0f;
1401 if (isIndeterminate) {
1402 constexpr auto loopDurationMSec = 4000;
1403 const auto elapsedTime = std::chrono::time_point_cast<std::chrono::milliseconds>(
1404 std::chrono::system_clock::now());
1405 const auto elapsed = elapsedTime.time_since_epoch().count();
1406 const auto handleCenter = (elapsed % loopDurationMSec) /
float(loopDurationMSec);
1407 const auto isLongHandle = (elapsed / loopDurationMSec) % 2 == 0;
1408 const auto lengthFactor = (isLongHandle ? 33.0f : 25.0f) / 100.0f;
1409 const auto begin = qMax(handleCenter * (1 + lengthFactor) - lengthFactor, 0.0f);
1410 const auto end = qMin(handleCenter * (1 + lengthFactor), 1.0f);
1411 const auto barBegin = begin * rect.width();
1412 const auto barEnd = end * rect.width();
1413 rect = QRectF(QPointF(rect.left() + barBegin, rect.top()),
1414 QPointF(rect.left() + barEnd, rect.bottom()));
1415 const_cast<QWidget *>(widget)->update();
1417 const auto fillPercentage = (
float(baropt->progress - baropt->minimum))
1418 / (
float(baropt->maximum - baropt->minimum));
1419 rect.setWidth(rect.width() * fillPercentage);
1421 const QPointF center = rect.center();
1422 rect.setHeight(progressBarThickness);
1423 rect.moveTop(center.y() - progressBarHalfThickness - offset);
1424 drawRoundedRect(painter, rect, Qt::NoPen, baropt->palette.accent());
1427 case CE_ProgressBarLabel:
1428 if (
const auto baropt = qstyleoption_cast<
const QStyleOptionProgressBar *>(option)) {
1429 const bool vertical = !(baropt->state & QStyle::State_Horizontal);
1431 proxy()->drawItemText(painter, baropt->rect, Qt::AlignCenter | Qt::TextSingleLine,
1432 baropt->palette, baropt->state & State_Enabled, baropt->text,
1438 case CE_PushButtonLabel:
1439 if (
const QStyleOptionButton *btn = qstyleoption_cast<
const QStyleOptionButton *>(option)) {
1440 using namespace StyleOptionHelper;
1441 const bool isEnabled = !isDisabled(option);
1444 int tf = Qt::AlignCenter | Qt::TextShowMnemonic;
1445 if (!proxy()->styleHint(SH_UnderlineShortcut, btn, widget))
1446 tf |= Qt::TextHideMnemonic;
1448 if (!btn->icon.isNull()) {
1450 QIcon::Mode mode = isEnabled ? QIcon::Normal : QIcon::Disabled;
1451 if (mode == QIcon::Normal && btn->state & State_HasFocus)
1452 mode = QIcon::Active;
1453 QIcon::State state = isChecked(btn) ? QIcon::On : QIcon::Off;
1455 int iconSpacing = 4;
1457 QRect iconRect = QRect(textRect.x(), textRect.y(), btn->iconSize.width(), textRect.height());
1458 QRect vIconRect = visualRect(btn->direction, btn->rect, iconRect);
1459 textRect.setLeft(textRect.left() + iconRect.width() + iconSpacing);
1461 if (isChecked(btn) || isPressed(btn))
1462 vIconRect.translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, option, widget),
1463 proxy()->pixelMetric(PM_ButtonShiftVertical, option, widget));
1464 btn->icon.paint(painter, vIconRect, Qt::AlignCenter, mode, state);
1467 auto vTextRect = visualRect(btn->direction, btn->rect, textRect);
1468 painter->setPen(controlTextColor(option));
1469 proxy()->drawItemText(painter, vTextRect, tf, option->palette, isEnabled, btn->text);
1472 case CE_PushButtonBevel:
1473 if (
const QStyleOptionButton *btn = qstyleoption_cast<
const QStyleOptionButton *>(option)) {
1474 using namespace StyleOptionHelper;
1476 QRectF rect = btn->rect.marginsRemoved(QMargins(2, 2, 2, 2));
1477 painter->setPen(Qt::NoPen);
1478 if (btn->features.testFlag(QStyleOptionButton::Flat)) {
1479 painter->setBrush(btn->palette.button());
1480 painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
1481 if (flags & (State_Sunken | State_On)) {
1482 painter->setBrush(WINUI3Colors[colorSchemeIndex][subtlePressedColor]);
1484 else if (flags & State_MouseOver) {
1485 painter->setBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
1487 painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
1489 painter->setBrush(controlFillBrush(option, ControlType::Control));
1490 painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
1492 rect.adjust(0.5,0.5,-0.5,-0.5);
1493 const bool defaultButton = btn->features.testFlag(QStyleOptionButton::DefaultButton);
1494 painter->setBrush(Qt::NoBrush);
1495 painter->setPen(defaultButton ? option->palette.accent().color()
1496 : WINUI3Colors[colorSchemeIndex][controlStrokePrimary]);
1497 painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
1499 painter->setPen(defaultButton ? WINUI3Colors[colorSchemeIndex][controlStrokeOnAccentSecondary]
1500 : WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]);
1502 if (btn->features.testFlag(QStyleOptionButton::HasMenu)) {
1503 QPainterStateGuard psg(
painter);
1505 const bool isEnabled = !isDisabled(option);
1507 const auto indSize = proxy()->pixelMetric(PM_MenuButtonIndicator, btn, widget);
1508 const auto indRect =
1511 const auto vindRect = visualRect(btn->direction, btn->rect, indRect);
1512 textRect.setWidth(textRect.width() - indSize);
1514 int fontSize = painter->font().pointSize();
1515 QFont f(d->assetFont);
1516 f.setPointSize(qRound(fontSize * 0.9f));
1517 painter->setFont(f);
1518 QColor penColor = option->palette.color(
1519 isEnabled ? QPalette::Active : QPalette::Disabled, QPalette::Text);
1521 penColor.setAlpha(percentToAlpha(60.63));
1522 painter->setPen(penColor);
1527 case CE_MenuBarItem:
1528 if (
const auto *mbi = qstyleoption_cast<
const QStyleOptionMenuItem *>(option)) {
1529 using namespace StyleOptionHelper;
1531 constexpr int hPadding = 11;
1532 constexpr int topPadding = 4;
1533 constexpr int bottomPadding = 6;
1534 QStyleOptionMenuItem newMbi = *mbi;
1536 if (
auto mbiV2 = qstyleoption_cast<
const QStyleOptionMenuItemV2 *>(option))
1537 newMbi.state.setFlag(State_Sunken, mbiV2->mouseDown);
1539 newMbi.font.setPointSize(10);
1540 newMbi.palette.setColor(QPalette::ButtonText, controlTextColor(&newMbi));
1541 if (!isDisabled(&newMbi)) {
1542 QPen pen(Qt::NoPen);
1543 QBrush brush(Qt::NoBrush);
1544 if (highContrastTheme) {
1545 pen = QPen(newMbi.palette.highlight().color(), 2);
1546 brush = newMbi.palette.window();
1547 }
else if (isPressed(&newMbi)) {
1548 brush = winUI3Color(subtlePressedColor);
1549 }
else if (isHover(&newMbi)) {
1550 brush = winUI3Color(subtleHighlightColor);
1552 if (pen != Qt::NoPen || brush != Qt::NoBrush) {
1553 const QRect rect = mbi->rect.marginsRemoved(QMargins(5, 0, 5, 0));
1554 drawRoundedRect(painter, rect, pen, brush);
1557 newMbi.rect.adjust(hPadding,topPadding,-hPadding,-bottomPadding);
1558 painter->setFont(newMbi.font);
1559 QCommonStyle::drawControl(element, &newMbi, painter, widget);
1564 case CE_MenuEmptyArea:
1568 if (
const auto *menuitem = qstyleoption_cast<
const QStyleOptionMenuItem *>(option)) {
1569 const auto visualMenuRect = [&](
const QRect &rect) {
1570 return visualRect(option->direction, menuitem->rect, rect);
1572 bool dis = !(menuitem->state & State_Enabled);
1573 bool checked = menuitem->checkType != QStyleOptionMenuItem::NotCheckable
1574 ? menuitem->checked :
false;
1575 bool act = menuitem->state & State_Selected;
1577 const QRect rect = menuitem->rect.marginsRemoved(QMargins(2,2,2,2));
1578 if (act && dis ==
false) {
1579 drawRoundedRect(painter, rect, Qt::NoPen, highContrastTheme ? menuitem->palette.brush(QPalette::Highlight)
1580 : QBrush(winUI3Color(subtleHighlightColor)));
1582 if (menuitem->menuItemType == QStyleOptionMenuItem::Separator) {
1583 constexpr int yoff = 1;
1584 painter->setPen(highContrastTheme ? menuitem->palette.buttonText().color() : winUI3Color(dividerStrokeDefault));
1585 painter->drawLine(menuitem->rect.topLeft() + QPoint(0, yoff),
1586 menuitem->rect.topRight() + QPoint(0, yoff));
1590 int xOffset = contentHMargin;
1592 const auto checkMarkWidth = proxy()->pixelMetric(PM_IndicatorWidth, option, widget);
1594 QRect vRect(visualMenuRect(QRect(rect.x() + xOffset, rect.y(),
1595 checkMarkWidth, rect.height())));
1596 QPainterStateGuard psg(painter);
1597 painter->setFont(d->assetFont);
1598 painter->setPen(option->palette.text().color());
1599 const auto textToDraw = QStringLiteral(u"\uE73E");
1600 painter->drawText(vRect, Qt::AlignCenter, textToDraw);
1602 if (menuitem->menuHasCheckableItems)
1603 xOffset += checkMarkWidth + contentItemHMargin;
1604 if (!menuitem->icon.isNull()) {
1606 QRect vRect(visualMenuRect(QRect(rect.x() + xOffset,
1608 menuitem->maxIconWidth - 4,
1610 QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;
1612 mode = QIcon::Active;
1613 const auto size = proxy()->pixelMetric(PM_SmallIconSize, option, widget);
1614 QRect pmr(QPoint(0, 0), QSize(size, size));
1615 pmr.moveCenter(vRect.center());
1616 menuitem->icon.paint(painter, pmr, Qt::AlignCenter, mode,
1617 checked ? QIcon::On : QIcon::Off);
1619 if (menuitem->maxIconWidth > 0)
1620 xOffset += menuitem->maxIconWidth - 4 + contentItemHMargin;
1622 QStringView s(menuitem->text);
1624 QPoint tl(rect.left() + xOffset, rect.top());
1625 QPoint br(rect.right() - menuitem->reservedShortcutWidth - contentHMargin,
1627 QRect textRect(tl, br);
1628 QRect vRect(visualMenuRect(textRect));
1630 qsizetype t = s.indexOf(u'\t');
1631 int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
1632 if (!proxy()->styleHint(SH_UnderlineShortcut, menuitem, widget))
1633 text_flags |= Qt::TextHideMnemonic;
1634 text_flags |= Qt::AlignLeft;
1636 if (t >= 0 && menuitem->menuItemType != QStyleOptionMenuItem::SubMenu) {
1637 QRect shortcutRect(QPoint(textRect.right(), textRect.top()),
1638 QPoint(rect.right(), textRect.bottom()));
1639 QRect vShortcutRect(visualMenuRect(shortcutRect));
1641 if (highContrastTheme) {
1642 penColor = menuitem->palette.color(act ? QPalette::HighlightedText
1645 penColor = menuitem->palette.color(dis ? QPalette::Disabled
1646 : QPalette::Active, QPalette::Text);
1648 penColor.setAlpha(percentToAlpha(60.63));
1650 painter->setPen(penColor);
1651 const QString textToDraw = s.mid(t + 1).toString();
1652 painter->drawText(vShortcutRect, text_flags, textToDraw);
1655 QFont font = menuitem->font;
1656 if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem)
1658 painter->setFont(font);
1660 if (highContrastTheme && act)
1661 penColor = menuitem->palette.color(QPalette::HighlightedText);
1663 penColor = menuitem->palette.color(dis ? QPalette::Disabled
1664 : QPalette::Current, QPalette::Text);
1665 painter->setPen(penColor);
1666 const QString textToDraw = s.left(t).toString();
1667 painter->drawText(vRect, text_flags, textToDraw);
1669 if (menuitem->menuItemType == QStyleOptionMenuItem::SubMenu) {
1670 int fontSize = menuitem->font.pointSize();
1671 QFont f(d->assetFont);
1672 f.setPointSize(qRound(fontSize * 0.9f));
1673 painter->setFont(f);
1674 int yOfs = qRound(fontSize / 3.0f);
1675 QPoint tl(rect.right() - 2 * QWindowsStylePrivate::windowsArrowHMargin - contentItemHMargin,
1677 QRect submenuRect(tl, rect.bottomRight());
1678 QRect vSubMenuRect = visualMenuRect(submenuRect);
1679 painter->setPen(option->palette.text().color());
1680 const bool isReverse = option->direction == Qt::RightToLeft;
1681 const auto str = isReverse ? ChevronLeftMed : ChevronRightMed;
1682 painter->drawText(vSubMenuRect, Qt::AlignCenter, str);
1687 case CE_MenuBarEmptyArea: {
1690 case CE_HeaderEmptyArea:
1692 case CE_HeaderSection: {
1693 if (
const QStyleOptionHeader *header = qstyleoption_cast<
const QStyleOptionHeader *>(option)) {
1694 painter->setPen(Qt::NoPen);
1695 painter->setBrush(header->palette.button());
1696 painter->drawRect(header->rect);
1698 painter->setPen(highContrastTheme ==
true ? header->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorLight]);
1699 painter->setBrush(Qt::NoBrush);
1701 if (header->position == QStyleOptionHeader::OnlyOneSection) {
1704 else if (header->position == QStyleOptionHeader::Beginning) {
1705 painter->drawLine(QPointF(option->rect.topRight()) + QPointF(0.5,0.0),
1706 QPointF(option->rect.bottomRight()) + QPointF(0.5,0.0));
1708 else if (header->position == QStyleOptionHeader::End) {
1709 painter->drawLine(QPointF(option->rect.topLeft()) - QPointF(0.5,0.0),
1710 QPointF(option->rect.bottomLeft()) - QPointF(0.5,0.0));
1712 painter->drawLine(QPointF(option->rect.topRight()) + QPointF(0.5,0.0),
1713 QPointF(option->rect.bottomRight()) + QPointF(0.5,0.0));
1714 painter->drawLine(QPointF(option->rect.topLeft()) - QPointF(0.5,0.0),
1715 QPointF(option->rect.bottomLeft()) - QPointF(0.5,0.0));
1717 painter->drawLine(QPointF(option->rect.bottomLeft()) + QPointF(0.0,0.5),
1718 QPointF(option->rect.bottomRight()) + QPointF(0.0,0.5));
1722 case CE_ItemViewItem: {
1723 if (
const QStyleOptionViewItem *vopt = qstyleoption_cast<
const QStyleOptionViewItem *>(option)) {
1724 const auto p = proxy();
1725 QRect checkRect = p->subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget);
1726 QRect iconRect = p->subElementRect(SE_ItemViewItemDecoration, vopt, widget);
1727 QRect textRect = p->subElementRect(SE_ItemViewItemText, vopt, widget);
1730 proxy()->drawPrimitive(PE_PanelItemViewItem, option, painter, widget);
1732 const QRect &rect = vopt->rect;
1733 const bool isRtl = option->direction == Qt::RightToLeft;
1734 bool onlyOne = vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne ||
1735 vopt->viewItemPosition == QStyleOptionViewItem::Invalid;
1736 bool isFirst = vopt->viewItemPosition == QStyleOptionViewItem::Beginning;
1737 bool isLast = vopt->viewItemPosition == QStyleOptionViewItem::End;
1740 if (vopt->features.testFlag(QStyleOptionViewItem::IsDecoratedRootColumn) &&
1741 vopt->showDecorationSelected) {
1753 }
else if (isLast) {
1758 const bool highlightCurrent = vopt->state.testAnyFlags(State_Selected | State_MouseOver);
1759 if (highlightCurrent) {
1760 if (highContrastTheme) {
1761 painter->setBrush(vopt->palette.highlight());
1763 const QAbstractItemView *view = qobject_cast<
const QAbstractItemView *>(widget);
1764 painter->setBrush(view && view->alternatingRowColors()
1765 ? vopt->palette.highlight()
1766 : winUI3Color(subtleHighlightColor));
1769 painter->setBrush(vopt->backgroundBrush);
1771 painter->setPen(Qt::NoPen);
1774 painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, 2, 2)),
1775 secondLevelRoundingRadius, secondLevelRoundingRadius);
1776 }
else if (isFirst) {
1778 painter->setClipRect(rect);
1779 painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, -secondLevelRoundingRadius, 2)),
1780 secondLevelRoundingRadius, secondLevelRoundingRadius);
1782 }
else if (isLast) {
1784 painter->setClipRect(rect);
1785 painter->drawRoundedRect(rect.marginsRemoved(QMargins(-secondLevelRoundingRadius, 2, 2, 2)),
1786 secondLevelRoundingRadius, secondLevelRoundingRadius);
1789 painter->drawRect(rect.marginsRemoved(QMargins(0, 2, 0, 2)));
1793 if (vopt->features & QStyleOptionViewItem::HasCheckIndicator) {
1794 QStyleOptionViewItem option(*vopt);
1795 option.rect = checkRect;
1796 option.state = option.state & ~QStyle::State_HasFocus;
1798 switch (vopt->checkState) {
1800 option.state |= QStyle::State_Off;
1802 case Qt::PartiallyChecked:
1803 option.state |= QStyle::State_NoChange;
1806 option.state |= QStyle::State_On;
1809 proxy()->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &option, painter, widget);
1813 if (iconRect.isValid()) {
1814 QIcon::Mode mode = QIcon::Normal;
1815 if (!(vopt->state & QStyle::State_Enabled))
1816 mode = QIcon::Disabled;
1817 else if (vopt->state & QStyle::State_Selected)
1818 mode = QIcon::Selected;
1819 QIcon::State state = vopt->state & QStyle::State_Open ? QIcon::On : QIcon::Off;
1820 vopt->icon.paint(painter, iconRect, vopt->decorationAlignment, mode, state);
1823 painter->setPen(highlightCurrent && highContrastTheme ? vopt->palette.base().color()
1824 : vopt->palette.text().color());
1825 d->viewItemDrawText(painter, vopt, textRect);
1828 if (vopt->state & State_Selected && !highContrastTheme) {
1829 if (
const QListView *lv = qobject_cast<
const QListView *>(widget);
1830 lv && lv->viewMode() != QListView::IconMode) {
1831 const auto col = vopt->palette.accent().color();
1832 painter->setBrush(col);
1833 painter->setPen(col);
1834 const auto xPos = isRtl ? rect.right() - 4.5f : rect.left() + 3.5f;
1835 const auto yOfs = rect.height() / 4.;
1836 QRectF r(
QPointF(xPos, rect.y() + yOfs),
1837 QPointF(xPos + 1, rect.y() + rect.height() - yOfs));
1838 painter->drawRoundedRect(r, 1, 1);
1845 QWindowsVistaStyle::drawControl(element, option, painter, widget);
1942QRect QWindows11Style::subControlRect(ComplexControl control,
const QStyleOptionComplex *option,
1943 SubControl subControl,
const QWidget *widget)
const
1948#if QT_CONFIG(spinbox)
1950 if (
const QStyleOptionSpinBox *spinbox = qstyleoption_cast<
const QStyleOptionSpinBox *>(option)) {
1952 int fw = spinbox->frame ? proxy()->pixelMetric(PM_SpinBoxFrameWidth, spinbox, widget) : 0;
1953 bs.setHeight(qMax(8, spinbox->rect.height() - fw));
1955 int y = fw + spinbox->rect.y();
1957 x = spinbox->rect.x() + spinbox->rect.width() - fw - 2 * bs.width();
1960 switch (subControl) {
1962 if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
1964 ret = QRect(x, y, bs.width(), bs.height());
1966 case SC_SpinBoxDown:
1967 if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
1969 ret = QRect(x + bs.width(), y, bs.width(), bs.height());
1971 case SC_SpinBoxEditField:
1972 if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons) {
1973 ret = QRect(lx, fw, spinbox->rect.width() - 2*fw, spinbox->rect.height() - 2*fw);
1975 ret = QRect(lx, fw, rx, spinbox->rect.height() - 2*fw);
1978 case SC_SpinBoxFrame:
1979 ret = spinbox->rect;
1983 ret = visualRect(spinbox->direction, spinbox->rect, ret);
1987 if (
const QStyleOptionTitleBar *titlebar = qstyleoption_cast<
const QStyleOptionTitleBar *>(option)) {
1988 SubControl sc = subControl;
1989 ret = QCommonStyle::subControlRect(control, option, subControl, widget);
1990 static constexpr int indent = 3;
1991 static constexpr int controlWidthMargin = 2;
1992 const int controlHeight = titlebar->rect.height();
1993 const int controlWidth = 46;
1994 const int iconSize = proxy()->pixelMetric(QStyle::PM_TitleBarButtonIconSize, option, widget);
1995 int offset = -(controlWidthMargin + indent);
1997 bool isMinimized = titlebar->titleBarState & Qt::WindowMinimized;
1998 bool isMaximized = titlebar->titleBarState & Qt::WindowMaximized;
2001 case SC_TitleBarLabel:
2002 if (titlebar->titleBarFlags & (Qt::WindowTitleHint | Qt::WindowSystemMenuHint)) {
2003 ret = titlebar->rect;
2004 if (titlebar->titleBarFlags & Qt::WindowSystemMenuHint)
2005 ret.adjust(iconSize + controlWidthMargin + indent, 0, -controlWidth, 0);
2006 if (titlebar->titleBarFlags & Qt::WindowMinimizeButtonHint)
2007 ret.adjust(0, 0, -controlWidth, 0);
2008 if (titlebar->titleBarFlags & Qt::WindowMaximizeButtonHint)
2009 ret.adjust(0, 0, -controlWidth, 0);
2010 if (titlebar->titleBarFlags & Qt::WindowShadeButtonHint)
2011 ret.adjust(0, 0, -controlWidth, 0);
2012 if (titlebar->titleBarFlags & Qt::WindowContextHelpButtonHint)
2013 ret.adjust(0, 0, -controlWidth, 0);
2016 case SC_TitleBarContextHelpButton:
2017 if (titlebar->titleBarFlags & Qt::WindowContextHelpButtonHint)
2018 offset += controlWidth;
2020 case SC_TitleBarMinButton:
2021 if (!isMinimized && (titlebar->titleBarFlags & Qt::WindowMinimizeButtonHint))
2022 offset += controlWidth;
2023 else if (sc == SC_TitleBarMinButton)
2026 case SC_TitleBarNormalButton:
2027 if (isMinimized && (titlebar->titleBarFlags & Qt::WindowMinimizeButtonHint))
2028 offset += controlWidth;
2029 else if (isMaximized && (titlebar->titleBarFlags & Qt::WindowMaximizeButtonHint))
2030 offset += controlWidth;
2031 else if (sc == SC_TitleBarNormalButton)
2034 case SC_TitleBarMaxButton:
2035 if (!isMaximized && (titlebar->titleBarFlags & Qt::WindowMaximizeButtonHint))
2036 offset += controlWidth;
2037 else if (sc == SC_TitleBarMaxButton)
2040 case SC_TitleBarShadeButton:
2041 if (!isMinimized && (titlebar->titleBarFlags & Qt::WindowShadeButtonHint))
2042 offset += controlWidth;
2043 else if (sc == SC_TitleBarShadeButton)
2046 case SC_TitleBarUnshadeButton:
2047 if (isMinimized && (titlebar->titleBarFlags & Qt::WindowShadeButtonHint))
2048 offset += controlWidth;
2049 else if (sc == SC_TitleBarUnshadeButton)
2052 case SC_TitleBarCloseButton:
2053 if (titlebar->titleBarFlags & Qt::WindowSystemMenuHint)
2054 offset += controlWidth;
2055 else if (sc == SC_TitleBarCloseButton)
2057 ret.setRect(titlebar->rect.right() - offset, titlebar->rect.top(),
2058 controlWidth, controlHeight);
2060 case SC_TitleBarSysMenu:
2061 if (titlebar->titleBarFlags & Qt::WindowSystemMenuHint) {
2062 const auto yOfs = titlebar->rect.top() + (titlebar->rect.height() - iconSize) / 2;
2063 ret.setRect(titlebar->rect.left() + controlWidthMargin + indent, yOfs, iconSize,
2070 if (widget && isMinimized && titlebar->rect.width() < offset)
2071 const_cast<QWidget*>(widget)->resize(controlWidthMargin + indent + offset + iconSize + controlWidthMargin, controlWidth);
2072 ret = visualRect(titlebar->direction, titlebar->rect, ret);
2078 ret = QCommonStyle::subControlRect(control, option, subControl, widget);
2080 if (subControl == SC_ScrollBarAddLine || subControl == SC_ScrollBarSubLine) {
2081 if (
const QStyleOptionSlider *scrollbar = qstyleoption_cast<
const QStyleOptionSlider *>(option)) {
2082 if (scrollbar->orientation == Qt::Vertical)
2083 ret = ret.adjusted(2,2,-2,-3);
2085 ret = ret.adjusted(3,2,-2,-2);
2091 if (subControl == SC_ComboBoxArrow) {
2092 const auto indicatorWidth =
2093 proxy()->pixelMetric(PM_MenuButtonIndicator, option, widget);
2095 const int startX = endX - indicatorWidth;
2096 const QRect rect(
QPoint(startX, option->rect.top()),
2097 QPoint(endX, option->rect.bottom()));
2098 ret = visualRect(option->direction, option->rect, rect);
2100 ret = QWindowsVistaStyle::subControlRect(control, option, subControl, widget);
2104#if QT_CONFIG(groupbox)
2106 ret = QWindowsVistaStyle::subControlRect(control, option, subControl, widget);
2107 switch (subControl) {
2108 case SC_GroupBoxCheckBox:
2118 ret = QWindowsVistaStyle::subControlRect(control, option, subControl, widget);