kwin/clients/aurorae/themes/plastik/package/contents/ui/main.qml
Martin Gräßlin d81df32a4f Support for Plastik's configuration options
Adding a KConfigXT xml file and an ui file to configure the QML
variant of Plastik.

Currently supported options:
* title alignment
* title shadow
* animation of buttons

Missing option:
* colored borders
2012-08-26 20:59:37 +02:00

388 lines
13 KiB
QML

/********************************************************************
Copyright (C) 2012 Martin Gräßlin <mgraesslin@kde.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
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 1.1
import org.kde.kwin.decoration 0.1
import org.kde.kwin.decorations.plastik 1.0
Decoration {
function readConfig() {
switch (decoration.readConfig("BorderSize", DecorationOptions.BorderNormal)) {
case DecorationOptions.BorderTiny:
root.borderSize = 3;
break;
case DecorationOptions.BorderLarge:
root.borderSize = 8;
break;
case DecorationOptions.BorderVeryLarge:
root.borderSize = 12;
break;
case DecorationOptions.BorderHuge:
root.borderSize = 18;
break;
case DecorationOptions.BorderVeryHuge:
root.borderSize = 27;
break;
case DecorationOptions.BorderOversized:
root.borderSize = 40;
break;
case DecorationOptions.BorderNormal: // fall through to default
default:
root.borderSize = 4;
break;
}
var titleAlignLeft = decoration.readConfig("titleAlignLeft", true);
var titleAlignCenter = decoration.readConfig("titleAlignCenter", false);
var titleAlignRight = decoration.readConfig("titleAlignRight", false);
if (titleAlignRight) {
root.titleAlignment = Text.AlignRight;
} else if (titleAlignCenter) {
root.titleAlignment = Text.AlignHCenter;
} else {
if (!titleAlignLeft) {
console.log("Error reading title alignment: all alignment options are false");
}
root.titleAlignment = Text.AlignLeft;
}
root.animateButtons = decoration.readConfig("animateButtons", true);
root.titleShadow = decoration.readConfig("titleShadow", true);
}
ColorHelper {
id: colorHelper
}
DecorationOptions {
id: options
deco: decoration
}
property alias buttonSize: titleRow.captionHeight
property alias titleAlignment: caption.horizontalAlignment
property color titleBarColor: options.titleBarColor
property int animationDuration: 150
property bool animateButtons: true
property bool titleShadow: true
Behavior on titleBarColor {
ColorAnimation {
duration: root.animationDuration
}
}
property int borderSize: 4
id: root
borderLeft: borderSize
borderRight: borderSize
borderTop: top.normalHeight
borderBottom: borderSize
borderLeftMaximized: 0
borderRightMaximized: 0
borderBottomMaximized: 0
borderTopMaximized: top.maximizedHeight
paddingLeft: 0
paddingRight: 0
paddingBottom: 0
paddingTop: 0
Rectangle {
color: root.titleBarColor
anchors {
fill: parent
}
border {
width: decoration.maximized ? 0 : 2
color: colorHelper.shade(root.titleBarColor, ColorHelper.DarkShade)
}
Rectangle {
id: borderLeft
anchors {
left: parent.left
top: parent.top
bottom: parent.bottom
leftMargin: 1
bottomMargin: 1
topMargin: 1
}
visible: !decoration.maximized
width: root.borderLeft
color: root.titleBarColor
Rectangle {
width: 1
anchors {
left: parent.left
top: parent.top
bottom: parent.bottom
}
color: colorHelper.shade(root.titleBarColor, ColorHelper.LightShade, colorHelper.contrast - (decoration.active ? 0.4 : 0.8))
}
}
Rectangle {
id: borderRight
anchors {
right: parent.right
top: parent.top
bottom: parent.bottom
rightMargin: 1
bottomMargin: 1
topMargin: 1
}
visible: !decoration.maximzied
width: root.borderRight -1
color: root.titleBarColor
Rectangle {
width: 1
anchors {
bottom: parent.bottom
top: parent.top
}
x: parent.x + parent.width - 1
color: colorHelper.shade(root.titleBarColor, ColorHelper.DarkShade, colorHelper.contrast - (decoration.active ? 0.4 : 0.8))
}
}
Rectangle {
id: borderBottom
anchors {
left: parent.right
right: parent.left
bottom: parent.bottom
leftMargin: 1
rightMargin: 1
}
height: root.borderBottom
visible: !decoration.maximzied
color: root.titleBarColor
Rectangle {
height: 1
anchors {
left: parent.left
right: parent.right
}
y: parent.y + parent.height - 1
color: colorHelper.shade(root.titleBarColor, ColorHelper.DarkShade, colorHelper.contrast - (decoration.active ? 0.4 : 0.8))
}
}
Rectangle {
id: top
property int topMargin: 1
property real normalHeight: titleRow.normalHeight + topMargin + 1
property real maximizedHeight: titleRow.maximizedHeight
height: decoration.maximized ? maximizedHeight : normalHeight
anchors {
left: parent.left
right: parent.right
top: parent.top
topMargin: decoration.maximized ? 0 : top.topMargin
leftMargin: decoration.maximized ? 0 : 2
rightMargin: decoration.maximized ? 0 : 2
}
gradient: Gradient {
id: topGradient
GradientStop {
position: 0.0
color: colorHelper.shade(root.titleBarColor, ColorHelper.MidlightShade, colorHelper.contrast - 0.4)
}
GradientStop {
id: middleGradientStop
position: 4.0/(decoration.maximized ? top.maximizedHeight : top.normalHeight)
color: colorHelper.shade(root.titleBarColor, ColorHelper.MidShade, colorHelper.contrast - 0.4)
}
GradientStop {
position: 1.0
color: root.titleBarColor
}
}
Rectangle {
height: 1
anchors {
top: top.top
left: top.left
right: top.right
}
visible: !decoration.maximized
color: colorHelper.shade(root.titleBarColor, ColorHelper.LightShade, colorHelper.contrast - (decoration.active ? 0.4 : 0.8))
}
MouseArea {
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
anchors.fill: parent
onDoubleClicked: decoration.titlebarDblClickOperation()
onPressed: {
if (mouse.button == Qt.LeftButton) {
mouse.accepted = false;
} else {
decoration.titlePressed(mouse.button, mouse.buttons);
}
}
onReleased: decoration.titleReleased(mouse.button, mouse.buttons)
}
Item {
id: titleRow
property real captionHeight: caption.implicitHeight + 4
property int topMargin: 4
property int bottomMargin: 2
property real normalHeight: captionHeight + bottomMargin + topMargin
property real maximizedHeight: captionHeight + bottomMargin
anchors {
left: parent.left
right: parent.right
top: parent.top
topMargin: decoration.maximized ? 0 : titleRow.topMargin
leftMargin: decoration.maximized ? 0 : 6
rightMargin: decoration.maximized ? 0 : 6
bottomMargin: titleRow.bottomMargin
}
ButtonGroup {
id: leftButtonGroup
spacing: 1
explicitSpacer: root.buttonSize
menuButton: menuButtonComponent
minimizeButton: minimizeButtonComponent
maximizeButton: maximizeButtonComponent
keepBelowButton: keepBelowButtonComponent
keepAboveButton: keepAboveButtonComponent
helpButton: helpButtonComponent
shadeButton: shadeButtonComponent
allDesktopsButton: stickyButtonComponent
closeButton: closeButtonComponent
buttons: options.titleButtonsLeft
anchors {
top: parent.top
left: parent.left
}
}
Text {
id: caption
anchors {
top: parent.top
left: leftButtonGroup.right
right: rightButtonGroup.left
rightMargin: 5
leftMargin: 5
}
color: options.fontColor
Behavior on color {
ColorAnimation { duration: root.animationDuration }
}
text: decoration.caption
font: options.titleFont
style: root.titleShadow ? Text.Raised : Text.Normal
styleColor: colorHelper.shade(color, ColorHelper.ShadowShade)
elide: Text.ElideMiddle
}
ButtonGroup {
id: rightButtonGroup
spacing: 1
explicitSpacer: root.buttonSize
menuButton: menuButtonComponent
minimizeButton: minimizeButtonComponent
maximizeButton: maximizeButtonComponent
keepBelowButton: keepBelowButtonComponent
keepAboveButton: keepAboveButtonComponent
helpButton: helpButtonComponent
shadeButton: shadeButtonComponent
allDesktopsButton: stickyButtonComponent
closeButton: closeButtonComponent
buttons: options.titleButtonsRight
anchors {
top: parent.top
right: parent.right
}
}
}
}
Rectangle {
id: innerBorder
anchors {
fill: parent
leftMargin: root.borderLeft - 1
rightMargin: root.borderRight
topMargin: root.borderTop - 1
bottomMargin: root.borderBottom
}
border {
width: 1
color: colorHelper.shade(root.titleBarColor, ColorHelper.MidShade)
}
color: root.titleBarColor
}
}
Component {
id: maximizeButtonComponent
PlastikButton {
buttonType: "A"
size: root.buttonSize
}
}
Component {
id: keepBelowButtonComponent
PlastikButton {
buttonType: "B"
size: root.buttonSize
}
}
Component {
id: keepAboveButtonComponent
PlastikButton {
buttonType: "F"
size: root.buttonSize
}
}
Component {
id: helpButtonComponent
PlastikButton {
buttonType: "H"
size: root.buttonSize
}
}
Component {
id: minimizeButtonComponent
PlastikButton {
buttonType: "I"
size: root.buttonSize
}
}
Component {
id: shadeButtonComponent
PlastikButton {
buttonType: "L"
size: root.buttonSize
}
}
Component {
id: stickyButtonComponent
PlastikButton {
buttonType: "S"
size: root.buttonSize
}
}
Component {
id: closeButtonComponent
PlastikButton {
buttonType: "X"
size: root.buttonSize
}
}
Component {
id: menuButtonComponent
MenuButton {
width: root.buttonSize
height: root.buttonSize
}
}
Component.onCompleted: readConfig()
Connections {
target: decoration
onConfigChanged: readConfig()
}
}