Refactor Switch, CheckBox, RadioButton to extend a single DualStateButton

- To extend the dual state button, just add the visual component in the view property

Signed-off-by: Daker Fernandes Pinheiro <dakerfp@gmail.com>
This commit is contained in:
Daker Fernandes Pinheiro 2011-07-08 15:11:55 -03:00
parent a650da9ee5
commit 30889de6e7
5 changed files with 150 additions and 321 deletions

View File

@ -20,121 +20,11 @@
import QtQuick 1.0 import QtQuick 1.0
import org.kde.plasma.core 0.1 as PlasmaCore import org.kde.plasma.core 0.1 as PlasmaCore
Item { DualStateButton {
id: radiobutton id: checkBox
view: Rectangle {
// Common API
property bool checked
property alias pressed: mouseArea.pressed
signal clicked()
// Plasma API
property alias text: label.text // TODO: Not yet part of the common API
property QtObject theme: PlasmaCore.Theme { }
width: surface.width + label.paintedWidth
height: surface.height
function entered() {
shadow.opacity = 0;
hover.opacity = 1;
}
function released() {
radiobutton.checked = !radiobutton.checked;
radiobutton.clicked();
}
Keys.onSpacePressed: entered();
Keys.onReturnPressed: entered();
Keys.onReleased: {
if(event.key == Qt.Key_Space ||
event.key == Qt.Key_Return)
released();
}
PlasmaCore.FrameSvgItem {
id: hover
anchors {
fill: surface
leftMargin: -margins.left
topMargin: -margins.top
rightMargin: -margins.right
bottomMargin: -margins.bottom
}
opacity: 0
imagePath: "widgets/button"
prefix: "hover"
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
PlasmaCore.FrameSvgItem {
id: shadow
anchors {
fill: surface
leftMargin: -margins.left
topMargin: -margins.top
rightMargin: -margins.right
bottomMargin: -margins.bottom
}
imagePath: "widgets/button"
prefix: "shadow"
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
Image {
id: surface
anchors {
verticalCenter: parent.verticalCenter
left: parent.left
}
// XXX: debug solution until we have the resources
// source: checked ? "checked" : "unchecked"
width: 16 width: 16
height: 16 height: 16
Rectangle { anchors.fill: parent ; color: checked ? "green" : "red" } color: checked ? "green" : "blue"
} }
}
Text {
id: label
text: radiobutton.text
anchors {
top: parent.top
bottom: parent.bottom
left: surface.right
right: parent.right
// XXX: see how this margin will be set
leftMargin: hover.margins.right
}
color: theme.textColor
verticalAlignment: Text.AlignVCenter
}
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onReleased: radiobutton.released();
onEntered: radiobutton.entered();
onPressed: radiobutton.forceActiveFocus();
onExited: {
shadow.opacity = 1;
hover.opacity = 0;
}
}
}

View File

@ -0,0 +1,136 @@
/*
* Copyright (C) 2011 by Daker Fernandes Pinheiro <dakerfp@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, 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 Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import QtQuick 1.0
import org.kde.plasma.core 0.1 as PlasmaCore
Item {
id: dualButton
// Common API
property bool checked
property alias pressed: mouseArea.pressed
signal clicked()
// Plasma API
property alias text: label.text // TODO: Not yet part of the common API
property QtObject theme: PlasmaCore.Theme { }
property alias view: surface.sourceComponent
width: surface.width + label.paintedWidth
height: surface.height
function entered() {
shadow.opacity = 0;
hover.opacity = 1;
}
function released() {
dualButton.checked = !dualButton.checked;
dualButton.clicked();
}
Keys.onSpacePressed: entered();
Keys.onReturnPressed: entered();
Keys.onReleased: {
if(event.key == Qt.Key_Space ||
event.key == Qt.Key_Return)
released();
}
PlasmaCore.FrameSvgItem {
id: hover
anchors {
fill: surface
leftMargin: -margins.left
topMargin: -margins.top
rightMargin: -margins.right
bottomMargin: -margins.bottom
}
opacity: 0
imagePath: "widgets/button"
prefix: "hover"
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
PlasmaCore.FrameSvgItem {
id: shadow
anchors {
fill: surface
leftMargin: -margins.left
topMargin: -margins.top
rightMargin: -margins.right
bottomMargin: -margins.bottom
}
imagePath: "widgets/button"
prefix: "shadow"
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
Loader {
id: surface
anchors {
verticalCenter: parent.verticalCenter
left: text ? parent.left : undefined
horizontalCenter: text ? undefined : parent.horizontalCenter
}
}
Text {
id: label
text: dualButton.text
anchors {
top: parent.top
bottom: parent.bottom
left: surface.right
right: parent.right
// XXX: see how this margin will be set
leftMargin: hover.margins.right
}
color: theme.textColor
verticalAlignment: Text.AlignVCenter
}
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onReleased: dualButton.released();
onEntered: dualButton.entered();
onPressed: dualButton.forceActiveFocus();
onExited: {
shadow.opacity = 1;
hover.opacity = 0;
}
}
}

View File

@ -20,121 +20,11 @@
import QtQuick 1.0 import QtQuick 1.0
import org.kde.plasma.core 0.1 as PlasmaCore import org.kde.plasma.core 0.1 as PlasmaCore
Item { DualStateButton {
id: radiobutton id: radioButton
view: Rectangle {
// Common API
property bool checked
property alias pressed: mouseArea.pressed
signal clicked()
// Plasma API
property alias text: label.text // TODO: Not yet part of the common API
property QtObject theme: PlasmaCore.Theme { }
width: surface.width + label.paintedWidth
height: surface.height
function entered() {
shadow.opacity = 0;
hover.opacity = 1;
}
function released() {
radiobutton.checked = !radiobutton.checked;
radiobutton.clicked();
}
Keys.onSpacePressed: entered();
Keys.onReturnPressed: entered();
Keys.onReleased: {
if(event.key == Qt.Key_Space ||
event.key == Qt.Key_Return)
released();
}
PlasmaCore.FrameSvgItem {
id: hover
anchors {
fill: surface
leftMargin: -margins.left
topMargin: -margins.top
rightMargin: -margins.right
bottomMargin: -margins.bottom
}
opacity: 0
imagePath: "widgets/button"
prefix: "hover"
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
PlasmaCore.FrameSvgItem {
id: shadow
anchors {
fill: surface
leftMargin: -margins.left
topMargin: -margins.top
rightMargin: -margins.right
bottomMargin: -margins.bottom
}
imagePath: "widgets/button"
prefix: "shadow"
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
Image {
id: surface
anchors {
verticalCenter: parent.verticalCenter
left: parent.left
}
// XXX: debug solution until we have the resources
// source: checked ? "checked" : "unchecked"
width: 16 width: 16
height: 16 height: 16
Rectangle { anchors.fill: parent ; color: checked ? "green" : "red" } color: checked ? "green" : "blue"
} }
}
Text {
id: label
text: radiobutton.text
anchors {
top: parent.top
bottom: parent.bottom
left: surface.right
right: parent.right
// XXX: see how this margin will be set
leftMargin: hover.margins.right
}
color: theme.textColor
verticalAlignment: Text.AlignVCenter
}
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onReleased: radiobutton.released();
onEntered: radiobutton.entered();
onPressed: radiobutton.forceActiveFocus();
onExited: {
shadow.opacity = 1;
hover.opacity = 0;
}
}
}

View File

@ -20,83 +20,9 @@
import QtQuick 1.0 import QtQuick 1.0
import org.kde.plasma.core 0.1 as PlasmaCore import org.kde.plasma.core 0.1 as PlasmaCore
Item { DualStateButton {
id: switchItem id: switchItem
view: Rectangle {
// Common API
property bool checked
property alias pressed: mouseArea.pressed
signal clicked()
width: surface.width
height: surface.height
function entered() {
shadow.opacity = 0;
hover.opacity = 1;
}
function released() {
switchItem.checked = !switchItem.checked;
switchItem.clicked();
}
Keys.onSpacePressed: entered();
Keys.onReturnPressed: entered();
Keys.onReleased: {
if(event.key == Qt.Key_Space ||
event.key == Qt.Key_Return)
released();
}
PlasmaCore.FrameSvgItem {
id: hover
anchors {
fill: surface
leftMargin: -margins.left
topMargin: -margins.top
rightMargin: -margins.right
bottomMargin: -margins.bottom
}
opacity: 0
imagePath: "widgets/button"
prefix: "hover"
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
PlasmaCore.FrameSvgItem {
id: shadow
anchors {
fill: surface
leftMargin: -margins.left
topMargin: -margins.top
rightMargin: -margins.right
bottomMargin: -margins.bottom
}
imagePath: "widgets/button"
prefix: "shadow"
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
Image {
id: surface
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
// XXX: debug solution until we have the resources
// source: checked ? "checked" : "unchecked"
width: 32 width: 32
height: 16 height: 16
Rectangle { Rectangle {
@ -111,21 +37,7 @@ Item {
} }
color: "green" color: "green"
} }
} color: "grey"
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onReleased: switchItem.released();
onEntered: switchItem.entered();
onPressed: switchItem.forceActiveFocus();
onExited: {
shadow.opacity = 1;
hover.opacity = 0;
}
} }
} }

View File

@ -1,6 +1,7 @@
BusyIndicator 0.1 BusyIndicator.qml BusyIndicator 0.1 BusyIndicator.qml
Button 0.1 Button.qml Button 0.1 Button.qml
CheckBox 0.1 CheckBox.qml CheckBox 0.1 CheckBox.qml
DualStateButton 0.1 DualStateButton.qml
FlashingLabel 0.1 FlashingLabel.qml FlashingLabel 0.1 FlashingLabel.qml
Frame 0.1 Frame.qml Frame 0.1 Frame.qml
IconWidget 0.1 IconWidget.qml IconWidget 0.1 IconWidget.qml