[aurorae] Use enum type for Decoration Buttons

Defines the DecorationButton type in DecorationOptions (needs to be
re-defined due to QML limitations) and exports the buttons as a
QList<int> property (again QML limitations).

All QML files are switched from string to the new enum type.
icc-effect-5.14.5
Martin Gräßlin 2013-10-10 15:40:25 +02:00
parent 07294b49f2
commit 73e0a6586c
12 changed files with 161 additions and 122 deletions

View File

@ -69,22 +69,34 @@ QFont DecorationOptions::titleFont() const
return KDecoration::options()->font(m_active);
}
QString DecorationOptions::titleButtonsLeft() const
QList<int> DecorationOptions::titleButtonsLeft() const
{
QList<KDecorationDefines::DecorationButton> buttons;
if (KDecoration::options()->customButtonPositions()) {
return KDecoration::options()->titleButtonsLeft();
buttons = KDecoration::options()->titleButtonsLeft();
} else {
return KDecorationOptions::defaultTitleButtonsLeft();
buttons = KDecorationOptions::defaultTitleButtonsLeft();
}
QList<int> ret;
for (auto it : buttons) {
ret << static_cast<int>(it);
}
return ret;
}
QString DecorationOptions::titleButtonsRight() const
QList<int> DecorationOptions::titleButtonsRight() const
{
QList<KDecorationDefines::DecorationButton> buttons;
if (KDecoration::options()->customButtonPositions()) {
return KDecoration::options()->titleButtonsRight();
buttons = KDecoration::options()->titleButtonsRight();
} else {
return KDecorationOptions::defaultTitleButtonsRight();
buttons = KDecorationOptions::defaultTitleButtonsRight();
}
QList<int> ret;
for (auto it : buttons) {
ret << static_cast<int>(it);
}
return ret;
}
QObject *DecorationOptions::decoration() const

View File

@ -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:
* <ul>
* <li>'M' menu button</li>
* <li>'S' on all desktops button</li>
* <li>'H' quickhelp button</li>
* <li>'I' minimize button</li>
* <li>'A' maximize button</li>
* <li>'X' close button</li>
* <li>'F' keep above button</li>
* <li>'B' keep below button</li>
* <li>'L' shade button</li>
* <li>'_' explicit spacer</li>
* </ul>
* @todo: make this a list of enum values
**/
Q_PROPERTY(QString titleButtonsLeft READ titleButtonsLeft NOTIFY titleButtonsChanged)
Q_PROPERTY(QList<int> 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<int> 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<int> titleButtonsLeft() const;
QList<int> titleButtonsRight() const;
QObject *decoration() const;
void setDecoration(QObject *decoration);

View File

@ -16,10 +16,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
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

View File

@ -16,38 +16,39 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
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 != "";

View File

@ -16,30 +16,31 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
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<buttons.length; i++) {
if (buttons.charAt(i) == "_") {
if (buttons[i] == DecorationOptions.DecorationButtonExplicitSpacer) {
Qt.createQmlObject("import QtQuick 2.0; Item { width: auroraeTheme.explicitButtonSpacer * auroraeTheme.buttonSizeFactor; height: auroraeTheme.buttonHeight * auroraeTheme.buttonSizeFactor }",
groupRow, "explicitSpacer" + buttons + i);
} else if (buttons.charAt(i) == "M") {
} else if (buttons[i] == DecorationOptions.DecorationButtonMenu) {
Qt.createQmlObject("import QtQuick 2.0; MenuButton { width: auroraeTheme.buttonWidthMenu * auroraeTheme.buttonSizeFactor; height: auroraeTheme.buttonHeight * auroraeTheme.buttonSizeFactor }",
groupRow, "menuButton" + buttons + i);
} else if (buttons.charAt(i) == "N") {
} else if (buttons[i] == DecorationOptions.DecorationButtonApplicationMenu) {
Qt.createQmlObject("import QtQuick 2.0; AppMenuButton { width: auroraeTheme.buttonWidthAppMenu * auroraeTheme.buttonSizeFactor; height: auroraeTheme.buttonHeight * auroraeTheme.buttonSizeFactor }",
groupRow, "appMenuButton" + buttons + i);
} else if (buttons.charAt(i) == "A") {
} else if (buttons[i] == DecorationOptions.DecorationButtonMaximizeRestore) {
var maximizeComponent = Qt.createComponent("AuroraeMaximizeButton.qml");
maximizeComponent.createObject(groupRow);
} else {
component.createObject(groupRow, {buttonType: buttons.charAt(i)});
component.createObject(groupRow, {buttonType: buttons[i]});
}
}
}
id: group
property string buttons
property var buttons
property bool animate: false
Row {

View File

@ -15,6 +15,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
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 {

View File

@ -15,43 +15,44 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
import QtQuick 2.0
import org.kde.kwin.decoration 0.1
Item {
function createButtons() {
for (var i=0; i<buttons.length; i++) {
var component = undefined;
switch (buttons.charAt(i)) {
case "_":
switch (buttons[i]) {
case DecorationOptions.DecorationButtonExplicitSpacer:
component = explicitSpacerComponent;
break;
case "A":
case DecorationOptions.DecorationButtonMaximizeRestore:
component = group.maximizeButton;
break;
case "B":
case DecorationOptions.DecorationButtonKeepBelow:
component = group.keepBelowButton;
break;
case "F":
case DecorationOptions.DecorationButtonKeepAbove:
component = group.keepAboveButton;
break;
case "H":
case DecorationOptions.DecorationButtonQuickHelp:
component = group.helpButton;
break;
case "I":
case DecorationOptions.DecorationButtonMinimize:
component = group.minimizeButton;
break;
case "L":
case DecorationOptions.DecorationButtonShade:
component = group.shadeButton;
break;
case "M":
case DecorationOptions.DecorationButtonMenu:
component = group.menuButton;
break;
case "N":
case DecorationOptions.DecorationButtonApplicationMenu:
component = group.appMenuButton;
break;
case "S":
case DecorationOptions.DecorationButtonOnAllDesktops:
component = group.allDesktopsButton;
break;
case "X":
case DecorationOptions.DecorationButtonClose:
component = group.closeButton;
break;
}
@ -63,7 +64,7 @@ Item {
}
}
id: group
property string buttons
property variant buttons
property int explicitSpacer
property alias spacing: groupRow.spacing

View File

@ -15,23 +15,23 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
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;

View File

@ -16,11 +16,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
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

View File

@ -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<KDecorationDefines::DecorationButton>(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);
}

View File

@ -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;
}
}

View File

@ -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
}
}