summaryrefslogtreecommitdiffstats
path: root/src/widgets/styles/qmacstyle_mac.mm
diff options
context:
space:
mode:
authorGabriel de Dietrich <gabriel.dedietrich@digia.com>2014-09-24 18:04:02 +0200
committerGabriel de Dietrich <gabriel.dedietrich@digia.com>2014-09-29 13:39:06 +0200
commitee6e9cbf36a189a4f59851ea3b069560e823b4ef (patch)
treef7061d09d50c970f4b5a9c6f9d07ee5694c74f24 /src/widgets/styles/qmacstyle_mac.mm
parent996054f5e65bc676aaea0743c2eacec51918e4aa (diff)
QMacStyle: Generalize Cocoa control rendering
So far, we were restricted by the values of ThemeButtonKind, which consist mostly of buttons. We want to generalize to other kind of controls when the time arrives. Already, QPushButton with pull- down menu is not possible to get from that enum, while its easy to get from NSPopupButton. Task-number: QTBUG-40833 Change-Id: I244c42c42ab595f4790050eb15ade70443e155b2 Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
Diffstat (limited to 'src/widgets/styles/qmacstyle_mac.mm')
-rw-r--r--src/widgets/styles/qmacstyle_mac.mm132
1 files changed, 83 insertions, 49 deletions
diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm
index 60e18eae5a..9bfa51094b 100644
--- a/src/widgets/styles/qmacstyle_mac.mm
+++ b/src/widgets/styles/qmacstyle_mac.mm
@@ -1717,7 +1717,7 @@ QMacStylePrivate::QMacStylePrivate()
QMacStylePrivate::~QMacStylePrivate()
{
- Q_FOREACH (NSView *b, buttons)
+ Q_FOREACH (NSView *b, cocoaControls)
[b release];
}
@@ -1738,43 +1738,92 @@ ThemeDrawState QMacStylePrivate::getDrawState(QStyle::State flags)
return tds;
}
-NSView *QMacStylePrivate::buttonOfKind(ThemeButtonKind kind, QPoint *offset) const
+static QCocoaWidget cocoaWidgetFromHIThemeButtonKind(ThemeButtonKind kind)
{
- NSView *bv = buttons[kind];
+ QCocoaWidget w;
+
+ switch (kind) {
+ case kThemePopupButton:
+ case kThemePopupButtonSmall:
+ case kThemePopupButtonMini:
+ w.first = QCocoaPopupButton;
+ break;
+ case kThemeComboBox:
+ w.first = QCocoaComboBox;
+ break;
+ case kThemeArrowButton:
+ w.first = QCocoaArrowButton;
+ break;
+ case kThemeCheckBox:
+ case kThemeCheckBoxSmall:
+ case kThemeCheckBoxMini:
+ w.first = QCocoaCheckBox;
+ break;
+ case kThemeRadioButton:
+ case kThemeRadioButtonSmall:
+ case kThemeRadioButtonMini:
+ w.first = QCocoaRadioButton;
+ break;
+ case kThemePushButton:
+ case kThemePushButtonSmall:
+ case kThemePushButtonMini:
+ w.first = QCocoaPushButton;
+ break;
+ default:
+ break;
+ }
+
+ switch (kind) {
+ case kThemePushButtonSmall:
+ case kThemePopupButtonSmall:
+ case kThemeCheckBoxSmall:
+ case kThemeRadioButtonSmall:
+ w.second = QAquaSizeSmall;
+ break;
+ case kThemePushButtonMini:
+ case kThemePopupButtonMini:
+ case kThemeCheckBoxMini:
+ case kThemeRadioButtonMini:
+ w.second = QAquaSizeMini;
+ break;
+ default:
+ w.second = QAquaSizeLarge;
+ break;
+ }
+
+ return w;
+}
+
+NSView *QMacStylePrivate::cocoaControl(QCocoaWidget widget, QPoint *offset) const
+{
+ NSView *bv = cocoaControls[widget];
if (!bv) {
- if (kind == kThemePopupButton
- || kind == kThemePopupButtonSmall
- || kind == kThemePopupButtonMini)
+
+ if (widget.first == QCocoaPopupButton)
bv = [[NSPopUpButton alloc] init];
- else if (kind == kThemeComboBox)
+ else if (widget.first == QCocoaComboBox)
bv = [[NSComboBox alloc] init];
else
bv = [[NSButton alloc] init];
- switch (kind) {
- case kThemeArrowButton: {
+ switch (widget.first) {
+ case QCocoaArrowButton: {
NSButton *bc = (NSButton *)bv;
bc.buttonType = NSOnOffButton;
bc.bezelStyle = NSDisclosureBezelStyle;
break;
}
- case kThemeCheckBox:
- case kThemeCheckBoxSmall:
- case kThemeCheckBoxMini: {
+ case QCocoaCheckBox: {
NSButton *bc = (NSButton *)bv;
bc.buttonType = NSSwitchButton;
break;
}
- case kThemeRadioButton:
- case kThemeRadioButtonSmall:
- case kThemeRadioButtonMini: {
+ case QCocoaRadioButton: {
NSButton *bc = (NSButton *)bv;
bc.buttonType = NSRadioButton;
break;
}
- case kThemePushButton:
- case kThemePushButtonSmall:
- case kThemePushButtonMini: {
+ case QCocoaPushButton: {
NSButton *bc = (NSButton *)bv;
bc.buttonType = NSMomentaryPushButton;
bc.bezelStyle = NSRoundedBezelStyle;
@@ -1787,19 +1836,15 @@ NSView *QMacStylePrivate::buttonOfKind(ThemeButtonKind kind, QPoint *offset) con
if ([bv isKindOfClass:[NSButton class]]) {
NSButton *bc = (NSButton *)bv;
bc.title = nil;
+ }
- NSCell *bcell = bc.cell;
- switch (kind) {
- case kThemePushButtonSmall:
- case kThemePopupButtonSmall:
- case kThemeCheckBoxSmall:
- case kThemeRadioButtonSmall:
+ if ([bv isKindOfClass:[NSControl class]]) {
+ NSCell *bcell = [(NSControl *)bv cell];
+ switch (widget.second) {
+ case QAquaSizeSmall:
bcell.controlSize = NSSmallControlSize;
break;
- case kThemePushButtonMini:
- case kThemePopupButtonMini:
- case kThemeCheckBoxMini:
- case kThemeRadioButtonMini:
+ case QAquaSizeMini:
bcell.controlSize = NSMiniControlSize;
break;
default:
@@ -1807,36 +1852,25 @@ NSView *QMacStylePrivate::buttonOfKind(ThemeButtonKind kind, QPoint *offset) con
}
}
- const_cast<QMacStylePrivate *>(this)->buttons.insert(kind, bv);
+ const_cast<QMacStylePrivate *>(this)->cocoaControls.insert(widget, bv);
}
if (offset) {
- switch (kind) {
- case kThemeRadioButton:
+ if (widget == QCocoaWidget(QCocoaRadioButton, QAquaSizeLarge))
offset->setY(2);
- break;
- case kThemeRadioButtonSmall:
+ else if (widget == QCocoaWidget(QCocoaRadioButton, QAquaSizeSmall))
*offset = QPoint(-1, 2);
- break;
- case kThemeRadioButtonMini:
+ else if (widget == QCocoaWidget(QCocoaRadioButton, QAquaSizeMini))
offset->setY(2);
- break;
- case kThemePopupButtonSmall:
- case kThemeCheckBox:
+ else if (widget == QCocoaWidget(QCocoaPopupButton, QAquaSizeSmall)
+ || widget == QCocoaWidget(QCocoaCheckBox, QAquaSizeLarge))
offset->setY(1);
- break;
- case kThemeCheckBoxSmall:
+ else if (widget == QCocoaWidget(QCocoaCheckBox, QAquaSizeSmall))
offset->setX(-1);
- break;
- case kThemeCheckBoxMini:
+ else if (widget == QCocoaWidget(QCocoaCheckBox, QAquaSizeMini))
*offset = QPoint(7, 5);
- break;
- case kThemePopupButtonMini:
+ else if (widget == QCocoaWidget(QCocoaPopupButton, QAquaSizeMini))
*offset = QPoint(2, -1);
- break;
- default:
- break;
- }
}
return bv;
@@ -1956,7 +1990,7 @@ void QMacStylePrivate::drawColorlessButton(const HIRect &macRect, HIThemeButtonD
pm = QPixmap::fromImage(image);
} else if ((usingYosemiteOrLater && combo && !editableCombo) || button) {
QPoint offset;
- NSButton *bc = (NSButton *)buttonOfKind(bdi->kind, &offset);
+ NSButton *bc = (NSButton *)cocoaControl(cocoaWidgetFromHIThemeButtonKind(bdi->kind), &offset);
[bc highlight:pressed];
bc.enabled = bdi->state != kThemeStateUnavailable && bdi->state != kThemeStateUnavailableInactive;
bc.allowsMixedState = YES;