diff --git a/clients/aurorae/src/decorationoptions.cpp b/clients/aurorae/src/decorationoptions.cpp index 1e8af591f9..11f0895bcc 100644 --- a/clients/aurorae/src/decorationoptions.cpp +++ b/clients/aurorae/src/decorationoptions.cpp @@ -69,22 +69,34 @@ QFont DecorationOptions::titleFont() const return KDecoration::options()->font(m_active); } -QString DecorationOptions::titleButtonsLeft() const +QList DecorationOptions::titleButtonsLeft() const { + QList buttons; if (KDecoration::options()->customButtonPositions()) { - return KDecoration::options()->titleButtonsLeft(); + buttons = KDecoration::options()->titleButtonsLeft(); } else { - return KDecorationOptions::defaultTitleButtonsLeft(); + buttons = KDecorationOptions::defaultTitleButtonsLeft(); } + QList ret; + for (auto it : buttons) { + ret << static_cast(it); + } + return ret; } -QString DecorationOptions::titleButtonsRight() const +QList DecorationOptions::titleButtonsRight() const { + QList buttons; if (KDecoration::options()->customButtonPositions()) { - return KDecoration::options()->titleButtonsRight(); + buttons = KDecoration::options()->titleButtonsRight(); } else { - return KDecorationOptions::defaultTitleButtonsRight(); + buttons = KDecorationOptions::defaultTitleButtonsRight(); } + QList ret; + for (auto it : buttons) { + ret << static_cast(it); + } + return ret; } QObject *DecorationOptions::decoration() const diff --git a/clients/aurorae/src/decorationoptions.h b/clients/aurorae/src/decorationoptions.h index ee2d01b0a1..5dcd59c988 100644 --- a/clients/aurorae/src/decorationoptions.h +++ b/clients/aurorae/src/decorationoptions.h @@ -52,6 +52,7 @@ class DecorationOptions : public QObject { Q_OBJECT Q_ENUMS(BorderSize) + Q_ENUMS(DecorationButton) /** * The decoration Object for which this set of options should be used. The decoration is * required to get the correct colors and fonts depending on whether the decoration represents @@ -90,28 +91,12 @@ class DecorationOptions : public QObject Q_PROPERTY(QFont titleFont READ titleFont NOTIFY fontChanged) /** * The buttons to be positioned on the left side of the titlebar from left to right. - * - * Characters in the returned string have the following meaning: - *
    - *
  • 'M' menu button
  • - *
  • 'S' on all desktops button
  • - *
  • 'H' quickhelp button
  • - *
  • 'I' minimize button
  • - *
  • 'A' maximize button
  • - *
  • 'X' close button
  • - *
  • 'F' keep above button
  • - *
  • 'B' keep below button
  • - *
  • 'L' shade button
  • - *
  • '_' explicit spacer
  • - *
- * @todo: make this a list of enum values **/ - Q_PROPERTY(QString titleButtonsLeft READ titleButtonsLeft NOTIFY titleButtonsChanged) + Q_PROPERTY(QList titleButtonsLeft READ titleButtonsLeft NOTIFY titleButtonsChanged) /** * The buttons to be positioned on the right side of the titlebar from left to right. - * @see titleButtonsRight **/ - Q_PROPERTY(QString titleButtonsRight READ titleButtonsRight NOTIFY titleButtonsChanged) + Q_PROPERTY(QList titleButtonsRight READ titleButtonsRight NOTIFY titleButtonsChanged) public: enum BorderSize { BorderTiny, ///< Minimal borders @@ -124,6 +109,34 @@ public: BorderNoSides, ///< No borders on sides BorderNone ///< No borders except title }; + /** + * Enum values to identify the decorations buttons which should be used + * by the decoration. + * + */ + enum DecorationButton { + /** + * Invalid button value. A decoration should not create a button for + * this type. + */ + DecorationButtonNone, + DecorationButtonMenu, + DecorationButtonApplicationMenu, + DecorationButtonOnAllDesktops, + DecorationButtonQuickHelp, + DecorationButtonMinimize, + DecorationButtonMaximizeRestore, + DecorationButtonClose, + DecorationButtonKeepAbove, + DecorationButtonKeepBelow, + DecorationButtonShade, + DecorationButtonResize, + /** + * The decoration should create an empty spacer instead of a button for + * this type. + */ + DecorationButtonExplicitSpacer + }; explicit DecorationOptions(QObject *parent = 0); virtual ~DecorationOptions(); @@ -134,8 +147,8 @@ public: QColor borderColor() const; QColor resizeHandleColor() const; QFont titleFont() const; - QString titleButtonsLeft() const; - QString titleButtonsRight() const; + QList titleButtonsLeft() const; + QList titleButtonsRight() const; QObject *decoration() const; void setDecoration(QObject *decoration); diff --git a/clients/aurorae/src/qml/AppMenuButton.qml b/clients/aurorae/src/qml/AppMenuButton.qml index 79689a842f..4bb8e9b611 100644 --- a/clients/aurorae/src/qml/AppMenuButton.qml +++ b/clients/aurorae/src/qml/AppMenuButton.qml @@ -16,10 +16,11 @@ along with this program. If not, see . *********************************************************************/ import QtQuick 2.0 import org.kde.qtextracomponents 2.0 as QtExtra +import org.kde.kwin.decoration 0.1 DecorationButton { id: appMenuButton - buttonType: "N" + buttonType: DecorationOptions.DecorationButtonApplicationMenu visible: decoration.appMenu QtExtra.QIconItem { icon: decoration.icon diff --git a/clients/aurorae/src/qml/AuroraeButton.qml b/clients/aurorae/src/qml/AuroraeButton.qml index 9905c29786..c2a835faba 100644 --- a/clients/aurorae/src/qml/AuroraeButton.qml +++ b/clients/aurorae/src/qml/AuroraeButton.qml @@ -16,38 +16,39 @@ along with this program. If not, see . *********************************************************************/ import QtQuick 2.0 import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.kwin.decoration 0.1 DecorationButton { function widthForButton() { switch (buttonType) { - case "M": + case DecorationOptions.DecorationButtonMenu: // menu return auroraeTheme.buttonWidthMenu; - case "N": + case DecorationOptions.DecorationButtonApplicationMenu: // app menu return auroraeTheme.buttonWidthAppMenu; - case "S": + case DecorationOptions.DecorationButtonOnAllDesktops: // all desktops return auroraeTheme.buttonWidthAllDesktops; - case "H": + case DecorationOptions.DecorationButtonQuickHelp: // help return auroraeTheme.buttonWidthHelp; - case "I": + case DecorationOptions.DecorationButtonMinimize: // minimize return auroraeTheme.buttonWidthMinimize; - case "A": + case DecorationOptions.DecorationButtonMaximizeRestore: // maximize return auroraeTheme.buttonWidthMaximizeRestore; - case "X": + case DecorationOptions.DecorationButtonClose: // close return auroraeTheme.buttonWidthClose; - case "F": + case DecorationOptions.DecorationButtonKeepAbove: // keep above return auroraeTheme.buttonWidthKeepAbove; - case "B": + case DecorationOptions.DecorationButtonKeepBelow: // keep below return auroraeTheme.buttonWidthKeepBelow; - case "L": + case DecorationOptions.DecorationButtonShade: // shade return auroraeTheme.buttonWidthShade; default: @@ -56,31 +57,31 @@ DecorationButton { } function pathForButton() { switch (buttonType) { - case "S": + case DecorationOptions.DecorationButtonOnAllDesktops: // all desktops return auroraeTheme.allDesktopsButtonPath; - case "H": + case DecorationOptions.DecorationButtonQuickHelp: // help return auroraeTheme.helpButtonPath; - case "I": + case DecorationOptions.DecorationButtonMinimize: // minimize return auroraeTheme.minimizeButtonPath; - case "A": + case DecorationOptions.DecorationButtonMaximizeRestore: // maximize return auroraeTheme.maximizeButtonPath; - case "R": + case DecorationOptions.DecorationButtonMaximizeRestore + 100: // maximize return auroraeTheme.restoreButtonPath; - case "X": + case DecorationOptions.DecorationButtonClose: // close return auroraeTheme.closeButtonPath; - case "F": + case DecorationOptions.DecorationButtonKeepAbove: // keep above return auroraeTheme.keepAboveButtonPath; - case "B": + case DecorationOptions.DecorationButtonKeepBelow: // keep below return auroraeTheme.keepBelowButtonPath; - case "L": + case DecorationOptions.DecorationButtonShade: // shade return auroraeTheme.shadeButtonPath; default: @@ -205,7 +206,7 @@ DecorationButton { } } Component.onCompleted: { - if (buttonType == "H" && !decoration.providesContextHelp) { + if (buttonType == DecorationOptions.DecorationButtonQuickHelp && !decoration.providesContextHelp) { visible = false; } else { visible = buttonSvg.imagePath != ""; diff --git a/clients/aurorae/src/qml/AuroraeButtonGroup.qml b/clients/aurorae/src/qml/AuroraeButtonGroup.qml index cf0f9d7968..e2f171e1c2 100644 --- a/clients/aurorae/src/qml/AuroraeButtonGroup.qml +++ b/clients/aurorae/src/qml/AuroraeButtonGroup.qml @@ -16,30 +16,31 @@ along with this program. If not, see . *********************************************************************/ import QtQuick 2.0 import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.kwin.decoration 0.1 Item { function createButtons() { var component = Qt.createComponent("AuroraeButton.qml"); for (var i=0; i. *********************************************************************/ import QtQuick 2.0 +import org.kde.kwin.decoration 0.1 Item { id: button @@ -23,7 +24,7 @@ Item { AuroraeButton { id: maximizeButton anchors.fill: parent - buttonType: "A" + buttonType: DecorationOptions.DecorationButtonMaximizeRestore opacity: (!decoration.maximized || auroraeTheme.restoreButtonPath == "") ? 1 : 0 Behavior on opacity { NumberAnimation { @@ -34,7 +35,7 @@ Item { AuroraeButton { id: restoreButton anchors.fill: parent - buttonType: "R" + buttonType: DecorationOptions.DecorationButtonMaximizeRestore + 100 opacity: (decoration.maximized && auroraeTheme.restoreButtonPath != "") ? 1 : 0 Behavior on opacity { NumberAnimation { diff --git a/clients/aurorae/src/qml/ButtonGroup.qml b/clients/aurorae/src/qml/ButtonGroup.qml index 693ab2a9a3..92703966c8 100644 --- a/clients/aurorae/src/qml/ButtonGroup.qml +++ b/clients/aurorae/src/qml/ButtonGroup.qml @@ -15,43 +15,44 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ import QtQuick 2.0 +import org.kde.kwin.decoration 0.1 Item { function createButtons() { for (var i=0; i. *********************************************************************/ import QtQuick 2.0 +import org.kde.kwin.decoration 0.1 Item { id: button - property string buttonType : "" + property int buttonType : DecorationOptions.DecorationButtonNone property bool hovered: false property bool pressed: false property bool toggled: false enabled: { switch (button.buttonType) { - case "X": + case DecorationOptions.DecorationButtonClose: return decoration.closeable; - case "A": - case "R": + case DecorationOptions.DecorationButtonMaximizeRestore: return decoration.maximizeable; - case "I": + case DecorationOptions.DecorationButtonMinimize: return decoration.minimizeable; - case "_": + case DecorationOptions.DecorationButtonExplicitSpacer: return false; default: return true; @@ -41,10 +41,9 @@ Item { anchors.fill: parent acceptedButtons: { switch (button.buttonType) { - case "M": + case DecorationOptions.DecorationButtonMenu: return Qt.LeftButton | Qt.RightButton; - case "A": - case "R": + case DecorationOptions.DecorationButtonMaximizeRestore: return Qt.LeftButton | Qt.RightButton | Qt.MiddleButton; default: return Qt.LeftButton; @@ -57,67 +56,66 @@ Item { onReleased: button.pressed = false onClicked: { switch (button.buttonType) { - case "M": + case DecorationOptions.DecorationButtonMenu: // menu decoration.menuClicked(); break; - case "N": + case DecorationOptions.DecorationButtonApplicationMenu: // app menu decoration.appMenuClicked(); break; - case "S": + case DecorationOptions.DecorationButtonOnAllDesktops: // all desktops decoration.toggleOnAllDesktops(); break; - case "H": + case DecorationOptions.DecorationButtonQuickHelp: // help decoration.showContextHelp(); break; - case "I": + case DecorationOptions.DecorationButtonMinimize: // minimize decoration.minimize(); break; - case "A": - case "R": + case DecorationOptions.DecorationButtonMaximizeRestore: // maximize decoration.maximize(mouse.button); break; - case "X": + case DecorationOptions.DecorationButtonClose: // close decoration.closeWindow(); break; - case "F": + case DecorationOptions.DecorationButtonKeepAbove: // keep above decoration.toggleKeepAbove(); break; - case "B": + case DecorationOptions.DecorationButtonKeepBelow: // keep below decoration.toggleKeepBelow(); break; - case "L": + case DecorationOptions.DecorationButtonShade: // shade decoration.toggleShade(); break; } } onDoubleClicked: { - if (button.buttonType == "M") { + if (button.buttonType == DecorationOptions.DecorationButtonMenu) { decoration.closeWindow(); } } Component.onCompleted: { switch (button.buttonType) { - case "S": + case DecorationOptions.DecorationButtonOnAllDesktops: // all desktops button.toggled = decoration.onAllDesktops; break; - case "F": + case DecorationOptions.DecorationButtonKeepAbove: button.toggled = decoration.keepAbove; break; - case "B": + case DecorationOptions.DecorationButtonKeepBelow: button.toggled = decoration.keepBelow; break; - case "L": + case DecorationOptions.DecorationButtonShade: button.toggled = decoration.shade; break; } @@ -125,25 +123,25 @@ Item { Connections { target: decoration onShadeChanged: { - if (button.buttonType != "L") { + if (button.buttonType != DecorationOptions.DecorationButtonShade) { return; } button.toggled = decoration.shade; } onKeepBelowChanged: { - if (button.buttonType != "B") { + if (button.buttonType != DecorationOptions.DecorationButtonKeepBelow) { return; } button.toggled = decoration.keepBelow; } onKeepAboveChanged: { - if (button.buttonType != "F") { + if (button.buttonType != DecorationOptions.DecorationButtonKeepAbove) { return; } button.toggled = decoration.keepAbove; } onDesktopChanged: { - if (button.buttonType != "S") { + if (button.buttonType != DecorationOptions.DecorationButtonOnAllDesktops) { return; } button.toggled = decoration.onAllDesktops; diff --git a/clients/aurorae/src/qml/MenuButton.qml b/clients/aurorae/src/qml/MenuButton.qml index 1345cd2eb8..c62b7542fc 100644 --- a/clients/aurorae/src/qml/MenuButton.qml +++ b/clients/aurorae/src/qml/MenuButton.qml @@ -16,11 +16,12 @@ along with this program. If not, see . *********************************************************************/ import QtQuick 2.0 import org.kde.qtextracomponents 2.0 as QtExtra +import org.kde.kwin.decoration 0.1 DecorationButton { property bool closeOnDoubleClick: true id: menuButton - buttonType: "M" + buttonType: DecorationOptions.DecorationButtonMenu QtExtra.QIconItem { icon: decoration.icon anchors.fill: parent diff --git a/clients/aurorae/themes/plastik/code/plastikbutton.cpp b/clients/aurorae/themes/plastik/code/plastikbutton.cpp index df4bb5f34a..29f6cc6c2f 100644 --- a/clients/aurorae/themes/plastik/code/plastikbutton.cpp +++ b/clients/aurorae/themes/plastik/code/plastikbutton.cpp @@ -55,45 +55,55 @@ QPixmap PlastikButtonProvider::requestPixmap(const QString &id, QSize *size, con shadow = true; } ButtonIcon button; - if (idParts[0] == QStringLiteral("X")) { + switch (static_cast(idParts[0].toInt())) { + case KDecorationDefines::DecorationButtonClose: button = CloseIcon; - } else if (idParts[0] == QStringLiteral("A")) { + break; + case KDecorationDefines::DecorationButtonMaximizeRestore: if (toggled) { button = MaxRestoreIcon; } else { button = MaxIcon; } - } else if (idParts[0] == QStringLiteral("I")) { + break; + case KDecorationDefines::DecorationButtonMinimize: button = MinIcon; - } else if (idParts[0] == QStringLiteral("H")) { + break; + case KDecorationDefines::DecorationButtonQuickHelp: button = HelpIcon; - } else if (idParts[0] == QStringLiteral("S")) { + break; + case KDecorationDefines::DecorationButtonOnAllDesktops: if (toggled) { button = NotOnAllDesktopsIcon; } else { button = OnAllDesktopsIcon; } - } else if (idParts[0] == QStringLiteral("F")) { + break; + case KDecorationDefines::DecorationButtonKeepAbove: if (toggled) { button = NoKeepAboveIcon; } else { button = KeepAboveIcon; } - } else if (idParts[0] == QStringLiteral("B")) { + break; + case KDecorationDefines::DecorationButtonKeepBelow: if (toggled) { button = NoKeepBelowIcon; } else { button = KeepBelowIcon; } - } else if (idParts[0] == QStringLiteral("L")) { + break; + case KDecorationDefines::DecorationButtonShade: if (toggled) { button = UnShadeIcon; } else { button = ShadeIcon; } - } else if (idParts[0] == QStringLiteral("N")) { + break; + case KDecorationDefines::DecorationButtonApplicationMenu: button = AppMenuIcon; - } else { + break; + default: // not recognized icon return QQuickImageProvider::requestPixmap(id, size, requestedSize); } diff --git a/clients/aurorae/themes/plastik/package/contents/ui/PlastikButton.qml b/clients/aurorae/themes/plastik/package/contents/ui/PlastikButton.qml index cf70f68eef..f22f17e46b 100644 --- a/clients/aurorae/themes/plastik/package/contents/ui/PlastikButton.qml +++ b/clients/aurorae/themes/plastik/package/contents/ui/PlastikButton.qml @@ -23,7 +23,7 @@ DecorationButton { function colorize() { var highlightColor = null; if (button.pressed) { - if (button.buttonType == "X") { + if (button.buttonType == DecorationOptions.DecorationButtonClose) { highlightColor = colorHelper.foreground(decoration.active, ColorHelper.NegativeText); } else { highlightColor = options.titleBarColor; @@ -31,7 +31,7 @@ DecorationButton { highlightColor = colorHelper.shade(highlightColor, ColorHelper.ShadowShade); highlightColor = colorHelper.multiplyAlpha(highlightColor, 0.3); } else if (button.hovered) { - if (button.buttonType == "X") { + if (button.buttonType == DecorationOptions.DecorationButtonClose) { highlightColor = colorHelper.foreground(decoration.active, ColorHelper.NegativeText); } else { highlightColor = options.titleBarColor; @@ -140,10 +140,10 @@ DecorationButton { } Component.onCompleted: { colorize(); - if (buttonType == "H") { + if (buttonType == DecorationOptions.DecorationButtonQuickHelp) { visible = decoration.providesContextHelp; } - if (buttonType == "N") { + if (buttonType == DecorationOptions.DecorationButtonApplicationMenu) { visible = decoration.appMenu; } } @@ -153,7 +153,7 @@ DecorationButton { target: decoration onActiveChanged: button.colorize() onAppMenuChanged: { - if (buttonType == "N") { + if (buttonType == DecorationOptions.DecorationButtonApplicationMenu) { visible = decoration.appMenu; } } diff --git a/clients/aurorae/themes/plastik/package/contents/ui/main.qml b/clients/aurorae/themes/plastik/package/contents/ui/main.qml index 528ddc8292..4f0d80c2b7 100644 --- a/clients/aurorae/themes/plastik/package/contents/ui/main.qml +++ b/clients/aurorae/themes/plastik/package/contents/ui/main.qml @@ -349,56 +349,56 @@ Decoration { Component { id: maximizeButtonComponent PlastikButton { - buttonType: "A" + buttonType: DecorationOptions.DecorationButtonMaximizeRestore size: root.buttonSize } } Component { id: keepBelowButtonComponent PlastikButton { - buttonType: "B" + buttonType: DecorationOptions.DecorationButtonKeepBelow size: root.buttonSize } } Component { id: keepAboveButtonComponent PlastikButton { - buttonType: "F" + buttonType: DecorationOptions.DecorationButtonKeepAbove size: root.buttonSize } } Component { id: helpButtonComponent PlastikButton { - buttonType: "H" + buttonType: DecorationOptions.DecorationButtonQuickHelp size: root.buttonSize } } Component { id: minimizeButtonComponent PlastikButton { - buttonType: "I" + buttonType: DecorationOptions.DecorationButtonMinimize size: root.buttonSize } } Component { id: shadeButtonComponent PlastikButton { - buttonType: "L" + buttonType: DecorationOptions.DecorationButtonShade size: root.buttonSize } } Component { id: stickyButtonComponent PlastikButton { - buttonType: "S" + buttonType: DecorationOptions.DecorationButtonOnAllDesktops size: root.buttonSize } } Component { id: closeButtonComponent PlastikButton { - buttonType: "X" + buttonType: DecorationOptions.DecorationButtonClose size: root.buttonSize } } @@ -412,7 +412,7 @@ Decoration { Component { id: appMenuButtonComponent PlastikButton { - buttonType: "N" + buttonType: DecorationOptions.DecorationButtonApplicationMenu size: root.buttonSize } }