Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qmacstyle_mac_p_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QMACSTYLE_MAC_P_P_H
6#define QMACSTYLE_MAC_P_P_H
7
9
10#include <QtCore/qhash.h>
11#include <QtCore/qlist.h>
12#include <QtCore/qmap.h>
13#include <QtCore/qmath.h>
14#include <QtCore/qpointer.h>
15#include <QtCore/qtextstream.h>
16
17#include <QtGui/private/qpainter_p.h>
18
19#include <QtGui/qbitmap.h>
20#include <QtGui/qevent.h>
21#include <QtGui/qpaintdevice.h>
22#include <QtGui/qpainter.h>
23#include <QtGui/qpixmapcache.h>
24
25#include <QtWidgets/private/qapplication_p.h>
26#include <QtWidgets/private/qcommonstyle_p.h>
27#include <QtWidgets/private/qstylehelper_p.h>
28
29#include <QtWidgets/qapplication.h>
30#include <QtWidgets/qfocusframe.h>
31#include <QtWidgets/qformlayout.h>
32#include <QtWidgets/qlayout.h>
33#include <QtWidgets/qstyleoption.h>
34#include <QtWidgets/qtextedit.h>
35
36#if QT_CONFIG(checkbox)
37#include <QtWidgets/qcheckbox.h>
38#endif
39#if QT_CONFIG(combobox)
40#include <QtWidgets/private/qcombobox_p.h>
41#include <QtWidgets/qcombobox.h>
42#endif
43#if QT_CONFIG(datetimeedit)
44#include <QtWidgets/qdatetimeedit.h>
45#endif
46#if QT_CONFIG(dialogbuttonbox)
47#include <QtWidgets/qdialogbuttonbox.h>
48#endif
49#if QT_CONFIG(dockwidget)
50#include <QtWidgets/qdockwidget.h>
51#endif
52#if QT_CONFIG(graphicsview)
53#include <QtWidgets/qgraphicsproxywidget.h>
54#include <QtWidgets/qgraphicsview.h>
55#endif
56#if QT_CONFIG(groupbox)
57#include <QtWidgets/qgroupbox.h>
58#endif
59#if QT_CONFIG(itemviews)
60#include <QtWidgets/qheaderview.h>
61#endif
62#if QT_CONFIG(lineedit)
63#include <QtWidgets/qlineedit.h>
64#endif
65#if QT_CONFIG(listview)
66#include <QtWidgets/qlistview.h>
67#endif
68#if QT_CONFIG(mainwindow)
69#include <QtWidgets/qmainwindow.h>
70#endif
71#if QT_CONFIG(menubar)
72#include <QtWidgets/qmenubar.h>
73#endif
74#if QT_CONFIG(progressbar)
75#include <QtWidgets/qprogressbar.h>
76#endif
77#if QT_CONFIG(pushbutton)
78#include <QtWidgets/qpushbutton.h>
79#endif
80#include <QtWidgets/qradiobutton.h>
81#if QT_CONFIG(rubberband)
82#include <QtWidgets/qrubberband.h>
83#endif
84#if QT_CONFIG(sizegrip)
85#include <QtWidgets/qsizegrip.h>
86#endif
87#if QT_CONFIG(spinbox)
88#include <QtWidgets/qspinbox.h>
89#endif
90#if QT_CONFIG(splitter)
91#include <QtWidgets/qsplitter.h>
92#endif
93#if QT_CONFIG(tableview)
94#include <QtWidgets/qtableview.h>
95#endif
96#if QT_CONFIG(toolbar)
97#include <QtWidgets/qtoolbar.h>
98#endif
99#if QT_CONFIG(toolbutton)
100#include <QtWidgets/qtoolbutton.h>
101#endif
102#if QT_CONFIG(treeview)
103#include <QtWidgets/qtreeview.h>
104#endif
105
106//
107// W A R N I N G
108// -------------
109//
110// This file is not part of the Qt API. It exists purely as an
111// implementation detail. This header file may change from version to
112// version without notice, or even be removed.
113//
114// We mean it.
115//
116
118
121
122QT_BEGIN_NAMESPACE
123
124/*
125 AHIG:
126 macOS Human Interface Guidelines
127 https://developer.apple.com/macos/human-interface-guidelines/overview/themes/
128
129 Builder:
130 Interface Builder in Xcode 8 or later
131*/
132
133// this works as long as we have at most 16 different control types
134#define CT1(c) CT2(c, c)
135#define CT2(c1, c2) ((uint(c1) << 16) | uint(c2))
136
137#define SIZE(large, small, mini)
138 (controlSize == QStyleHelper::SizeLarge ? (large) : controlSize == QStyleHelper::SizeSmall ? (small) : (mini))
139
140// same as return SIZE(...) but optimized
141#define return_SIZE(large, small, mini)
142 do {
143 static const int sizes[] = { (large), (small), (mini) };
144 return sizes[controlSize];
145 } while (false)
146
147class QMacStylePrivate : public QCommonStylePrivate
148{
149 Q_DECLARE_PUBLIC(QMacStyle)
150public:
151 enum Direction {
152 North, South, East, West
153 };
154
155 enum CocoaControlType {
156 NoControl, // For when there's no such a control in Cocoa
157 Box, // QGroupBox
158 Box_Dark, // FIXME See render code in drawPrimitive(PE_FrameTabWidget)
159 Button_CheckBox,
160 Button_Disclosure, // Disclosure triangle, like in QTreeView
161 Button_PopupButton, // Non-editable QComboBox
162 Button_PullDown, // QPushButton with menu
163 Button_PushButton, // Plain QPushButton and QTabBar buttons
164 Button_RadioButton,
165 Button_SquareButton, // Oversized QPushButton
166 Button_WindowClose,
167 Button_WindowMiniaturize,
168 Button_WindowZoom,
169 ComboBox, // Editable QComboBox
170 ProgressIndicator_Determinate,
171 ProgressIndicator_Indeterminate,
172 Scroller_Horizontal,
173 Scroller_Vertical,
174 SegmentedControl_First, // QTabBar buttons focus ring
175 SegmentedControl_Middle,
176 SegmentedControl_Last,
177 SegmentedControl_Single,
178 Slider_Horizontal,
179 Slider_Vertical,
180 SplitView_Horizontal,
181 SplitView_Vertical,
182 Stepper, // QSpinBox buttons
183 TextField
184 };
185
186 struct CocoaControl {
187 CocoaControl();
188 CocoaControl(CocoaControlType t, QStyleHelper::WidgetSizePolicy s);
189
190 CocoaControlType type;
191 QStyleHelper::WidgetSizePolicy size;
192
193 bool operator==(const CocoaControl &other) const;
194
195 QSizeF defaultFrameSize() const;
196 QRectF adjustedControlFrame(const QRectF &rect) const;
197 QMarginsF titleMargins() const;
198
199 bool getCocoaButtonTypeAndBezelStyle(NSButtonType *buttonType, NSBezelStyle *bezelStyle) const;
200 };
201
202
203 typedef void (^DrawRectBlock)(CGContextRef, const CGRect &);
204
205 QMacStylePrivate();
206 ~QMacStylePrivate();
207
208 // Ideally these wouldn't exist, but since they already exist we need some accessors.
209 static const int PushButtonLeftOffset;
210 static const int PushButtonRightOffset;
211 static const int PushButtonContentPadding;
212
213 enum Animates { AquaPushButton, AquaProgressBar, AquaListViewItemOpen, AquaScrollBar };
214 QStyleHelper::WidgetSizePolicy aquaSizeConstrain(const QStyleOption *option, const QWidget *widg,
215 QStyle::ContentsType ct = QStyle::CT_CustomBase,
216 QSize szHint=QSize(-1, -1), QSize *insz = 0) const;
217 QStyleHelper::WidgetSizePolicy effectiveAquaSizeConstrain(const QStyleOption *option, const QWidget *widg,
218 QStyle::ContentsType ct = QStyle::CT_CustomBase,
219 QSize szHint=QSize(-1, -1), QSize *insz = 0) const;
220 inline int animateSpeed(Animates) const { return 33; }
221
222 // Utility functions
223 static CGRect comboboxInnerBounds(const CGRect &outterBounds, const CocoaControl &cocoaWidget);
224
225 static QRectF comboboxEditBounds(const QRectF &outterBounds, const CocoaControl &cw);
226
227 void setAutoDefaultButton(QObject *button) const;
228
229 NSView *cocoaControl(CocoaControl widget) const;
230 NSCell *cocoaCell(CocoaControl widget) const;
231
232 void setupNSGraphicsContext(CGContextRef cg, bool flipped) const;
233 void restoreNSGraphicsContext(CGContextRef cg) const;
234
235 void setupVerticalInvertedXform(CGContextRef cg, bool reverse, bool vertical, const CGRect &rect) const;
236
237 void drawNSViewInRect(NSView *view, const QRectF &rect, QPainter *p, __attribute__((noescape)) DrawRectBlock drawRectBlock = nil) const;
238 void resolveCurrentNSView(QWindow *window) const;
239
240 void drawProgressBar(QPainter *p, const QStyleOptionProgressBar *pb) const;
241 void drawFocusRing(QPainter *p, const QRectF &targetRect, int hMargin, int vMargin, const CocoaControl &cw) const;
242
243 void drawToolbarButtonArrow(const QStyleOption *opt, QPainter *p) const;
244
245 QPainterPath windowPanelPath(const QRectF &r) const;
246
247 CocoaControlType windowButtonCocoaControl(QStyle::SubControl sc) const;
248
249#if QT_CONFIG(tabbar)
250 void tabLayout(const QStyleOptionTab *opt, const QWidget *widget, QRect *textRect, QRect *iconRect) const override;
251 static Direction tabDirection(QTabBar::Shape shape);
252 static bool verticalTabs(QMacStylePrivate::Direction tabDirection);
253#endif
254
255public:
256 mutable QPointer<QObject> autoDefaultButton;
257 static QList<QPointer<QObject> > scrollBars;
258
259 mutable QPointer<QFocusFrame> focusWidget;
260 mutable NSView *backingStoreNSView;
261 mutable QHash<CocoaControl, NSView *> cocoaControls;
262 mutable QHash<CocoaControl, NSCell *> cocoaCells;
263
264 std::optional<QFont> smallSystemFont;
265
266};
267
268QT_END_NAMESPACE
269
270#endif // QMACSTYLE_MAC_P_P_H
virtual void drawItemText(QPainter *p, const QRect &r, int flags, const QPalette &pal, bool enabled, const QString &text, QPalette::ColorRole textRole=QPalette::NoRole) const
Draws the given text in the specified rectangle using the provided painter and palette.
int pixelMetric(PixelMetric pm, const QStyleOption *opt=0, const QWidget *widget=nullptr) const
\reimp
QSize sizeFromContents(ContentsType ct, const QStyleOption *opt, const QSize &contentsSize, const QWidget *w=nullptr) const
\reimp
void drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p, const QWidget *w=nullptr) const
\reimp
virtual int styleHint(StyleHint sh, const QStyleOption *opt=0, const QWidget *w=nullptr, QStyleHintReturn *shret=nullptr) const
\reimp
QRect subElementRect(SubElement r, const QStyleOption *opt, const QWidget *widget=nullptr) const
\reimp
QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc, const QWidget *w=nullptr) const
\reimp
SubControl hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, const QPoint &pt, const QWidget *w=nullptr) const
\reimp
void polish(QWidget *w)
\reimp
int layoutSpacing(QSizePolicy::ControlType control1, QSizePolicy::ControlType control2, Qt::Orientation orientation, const QStyleOption *option=nullptr, const QWidget *widget=nullptr) const
\reimp
void unpolish(QWidget *w)
\reimp
QPalette standardPalette() const
Returns the style's standard palette.
void polish(QPalette &pal)
\reimp
bool event(QEvent *e)
This virtual function receives events to an object and should return true if the event e was recogniz...
QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const
\reimp
static QMacStyle * create()
virtual ~QMacStyle()
void drawControl(ControlElement element, const QStyleOption *opt, QPainter *p, const QWidget *w=nullptr) const
\reimp
QPixmap standardPixmap(StandardPixmap sp, const QStyleOption *opt, const QWidget *widget=nullptr) const
\reimp
void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p, const QWidget *w=nullptr) const
\reimp
Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core")
Q_FORWARD_DECLARE_OBJC_CLASS(NSView)
const int macRightBorder
static const QColor lightMainWindowGradientEnd(200, 200, 200)
static QStyleHelper::WidgetSizePolicy getControlSize(const QStyleOption *option, const QWidget *widget)
#define QMAC_QAQUASTYLE_SIZE_CONSTRAIN
const int macItemFrame
static const int qt_mac_aqua_metrics[]
static QStyleHelper::WidgetSizePolicy qt_aqua_guess_size(const QWidget *widg, QSize large, QSize small, QSize mini)
static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QStyleOption *opt, const QWidget *widg, QSize szHint, QStyleHelper::WidgetSizePolicy sz)
static NSUserInterfaceLayoutDirection qt_macLayoutDirectionFromQt(Qt::LayoutDirection direction)
static const QColor lightMainWindowGradientBegin(240, 240, 240)
void adjustPushButtonShadowMargins(QRectF &rect, QStyleHelper::WidgetSizePolicy size)
static bool setupSlider(NSSlider *slider, const QStyleOptionSlider *sl)
void drawTickMarks(CGContextRef ctx, NSSlider *nsSlider, const QStyleOptionSlider *sliderOpt)
static const int toolButtonArrowMargin
static CGRect qt_alignmentRectForFrame(CGRect rect, QStyleHelper::WidgetSizePolicy size, QMacStylePrivate::CocoaControlType ct)
static bool isInMacUnifiedToolbarArea(QWindow *window, int windowY)
static const QMarginsF comboBoxFocusRingMargins[3]
const int pushButtonBevelRectOffsets[3]
static bool setupScroller(NSScroller *scroller, const QStyleOptionSlider *sb)
static QPixmap darkenPixmap(const QPixmap &pixmap)
static const QColor titlebarSeparatorLineActive(111, 111, 111)
void drawSliderKnob(CGContextRef ctx, NSSlider *slider)
size_t qHash(const QMacStylePrivate::CocoaControl &cw, size_t seed=0)
static const QMarginsF pushButtonShadowMargins[3]
static const int headerSectionArrowHeight
static const QColor darkMainWindowGradientBegin(47, 47, 47)
static const qreal titleBarIconTitleSpacing
static const QMarginsF pullDownButtonShadowMargins[3]
QAquaMetric
@ SmallRadioButtonWidth
@ MiniVSliderWidth
@ SmallHSliderHeight
@ VSliderWidth
@ MiniCheckBoxWidth
@ EditTextFrameOutset
@ RadioButtonHeight
@ SmallProgressBarShadowOutset
@ SmallVSliderWidth
@ SeparatorSize
@ SmallRadioButtonHeight
@ MiniRadioButtonWidth
@ MiniHSliderTickHeight
@ CheckBoxWidth
@ MiniHSliderHeight
@ HSliderHeight
@ PushButtonHeight
@ FocusRectOutset
@ SmallCheckBoxHeight
@ MiniVSliderTickWidth
@ MiniPushButtonHeight
@ VSliderTickWidth
@ LargeProgressBarThickness
@ SmallHSliderTickHeight
@ MiniRadioButtonHeight
@ SmallCheckBoxWidth
@ SmallVSliderTickWidth
@ MenuSeparatorHeight
@ PopupButtonHeight
@ ListHeaderHeight
@ MiniCheckBoxHeight
@ RadioButtonWidth
@ CheckBoxHeight
@ MiniPopupButtonHeight
@ HSliderTickHeight
@ ProgressBarShadowOutset
@ SmallPopupButtonHeight
@ NormalProgressBarThickness
@ SmallPushButtonHeight
static const qreal titleBarButtonSpacing
QMacStylePrivate::CocoaControlType cocoaControlType(const QStyleOption *opt, const QWidget *w)
static const QColor darkMainWindowGradientEnd(47, 47, 47)
static const qreal popupButtonDefaultHeight[3]
const int macItemHMargin
static const int headerSectionSeparatorInset
static const qreal titleBarTitleRightMargin
static const int DisclosureOffset
static QString qt_mac_removeMnemonics(const QString &original)
static void setLayoutItemMargins(int left, int top, int right, int bottom, QRect *rect, Qt::LayoutDirection dir)
static bool isDarkMode()
static int qt_mac_aqua_get_metric(QAquaMetric m)
static const qreal comboBoxDefaultHeight[3]
static const qreal pushButtonDefaultHeight[3]
static const qreal focusRingWidth
static const QColor darkModeSeparatorLine(88, 88, 88)
static const QColor titlebarSeparatorLineInactive(131, 131, 131)
static const int toolButtonArrowSize
static bool qt_macWindowMainWindow(const QWidget *window)
#define CT1(c)
#define return_SIZE(large, small, mini)
#define CT2(c1, c2)
Q_FORWARD_DECLARE_OBJC_CLASS(NSCell)
#define SIZE(large, small, mini)
Q_FORWARD_DECLARE_MUTABLE_CG_TYPE(CGContext)
#define M_PI_2
Definition qmath.h:204
#define M_PI
Definition qmath.h:200