Add ButtonRow and ButtonColumn
- Add ButtonGroup.js which contains the logic behind ButtonRow/Column - Code taken from desktop qt-components Signed-off-by: Daker Fernandes Pinheiro <dakerfp@gmail.com>
This commit is contained in:
parent
69670fcd56
commit
00576442cc
85
declarativeimports/plasmacomponents/ButtonColumn.qml
Normal file
85
declarativeimports/plasmacomponents/ButtonColumn.qml
Normal file
@ -0,0 +1,85 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of the Qt Components project.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import Qt 4.7
|
||||
import "ButtonGroup.js" as Behavior
|
||||
|
||||
/*
|
||||
Class: ButtonColumn
|
||||
A ButtonColumn allows you to group Buttons in a column. It provides a selection-behavior as well.
|
||||
|
||||
Note: This component don't support the enabled property.
|
||||
If you need to disable it you should disable all the buttons inside it.
|
||||
|
||||
<code>
|
||||
ButtonColumn {
|
||||
Button { text: "Top" }
|
||||
Button { text: "Bottom" }
|
||||
}
|
||||
</code>
|
||||
*/
|
||||
Column {
|
||||
id: root
|
||||
|
||||
/*
|
||||
* Property: exclusive
|
||||
* [bool=true] Specifies the grouping behavior. If enabled, the checked property on buttons contained
|
||||
* in the group will be exclusive.
|
||||
*
|
||||
* Note that a button in an exclusive group will allways be checkable
|
||||
*/
|
||||
property bool exclusive: true
|
||||
|
||||
/*
|
||||
* Property: checkedButton
|
||||
* [string] Contains the last checked Button.
|
||||
*/
|
||||
property Item checkedButton;
|
||||
|
||||
Component.onCompleted: {
|
||||
Behavior.create(root, {direction: Qt.Vertical});
|
||||
}
|
||||
|
||||
Component.onDestruction: {
|
||||
Behavior.destroy();
|
||||
}
|
||||
|
||||
}
|
178
declarativeimports/plasmacomponents/ButtonGroup.js
Normal file
178
declarativeimports/plasmacomponents/ButtonGroup.js
Normal file
@ -0,0 +1,178 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of the Qt Components project.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
var self;
|
||||
var checkHandlers = [];
|
||||
var visibleButtons = [];
|
||||
var nonVisibleButtons = [];
|
||||
var direction;
|
||||
|
||||
function create(that, options) {
|
||||
self = that;
|
||||
direction = options.direction || Qt.Horizontal;
|
||||
self.childrenChanged.connect(rebuild);
|
||||
// self.widthChanged.connect(resizeChildren);
|
||||
build();
|
||||
}
|
||||
|
||||
function isButton(item) {
|
||||
if (item && item.hasOwnProperty("__position"))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function hasChecked(item) {
|
||||
return (item && item.hasOwnProperty("checked"));
|
||||
}
|
||||
|
||||
function destroy() {
|
||||
self.childrenChanged.disconnect(rebuild);
|
||||
// self.widthChanged.disconnect(resizeChildren);
|
||||
cleanup();
|
||||
}
|
||||
|
||||
function build() {
|
||||
visibleButtons = [];
|
||||
nonVisibleButtons = [];
|
||||
|
||||
for (var i = 0, item; (item = self.children[i]); i++) {
|
||||
if (!hasChecked(item))
|
||||
continue;
|
||||
|
||||
item.visibleChanged.connect(rebuild); // Not optimal, but hardly a bottleneck in your app
|
||||
if (!item.visible) {
|
||||
nonVisibleButtons.push(item);
|
||||
continue;
|
||||
}
|
||||
visibleButtons.push(item);
|
||||
|
||||
if (self.exclusive && item.hasOwnProperty("checkable"))
|
||||
item.checkable = true;
|
||||
|
||||
if (self.exclusive) {
|
||||
item.checked = false;
|
||||
checkHandlers.push(checkExclusive(item));
|
||||
item.checkedChanged.connect(checkHandlers[checkHandlers.length - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
var nrButtons = visibleButtons.length;
|
||||
if (nrButtons == 0)
|
||||
return;
|
||||
|
||||
if (self.checkedButton)
|
||||
self.checkedButton.checked = true;
|
||||
else if (self.exclusive) {
|
||||
self.checkedButton = visibleButtons[0];
|
||||
self.checkedButton.checked = true;
|
||||
}
|
||||
|
||||
if (nrButtons == 1) {
|
||||
finishButton(visibleButtons[0], "only");
|
||||
} else {
|
||||
finishButton(visibleButtons[0], direction == Qt.Horizontal ? "leftmost" : "top");
|
||||
for (var i = 1; i < nrButtons - 1; i++)
|
||||
finishButton(visibleButtons[i], direction == Qt.Horizontal ? "h_middle": "v_middle");
|
||||
finishButton(visibleButtons[nrButtons - 1], direction == Qt.Horizontal ? "rightmost" : "bottom");
|
||||
}
|
||||
}
|
||||
|
||||
function finishButton(button, position) {
|
||||
if (isButton(button)) {
|
||||
button.__position = position;
|
||||
if (direction == Qt.Vertical) {
|
||||
button.anchors.left = self.left //mm How to make this not cause binding loops? see QTBUG-17162
|
||||
button.anchors.right = self.right
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function cleanup() {
|
||||
visibleButtons.forEach(function(item, i) {
|
||||
if (checkHandlers[i])
|
||||
item.checkedChanged.disconnect(checkHandlers[i]);
|
||||
item.visibleChanged.disconnect(rebuild);
|
||||
});
|
||||
checkHandlers = [];
|
||||
|
||||
nonVisibleButtons.forEach(function(item, i) {
|
||||
item.visibleChanged.disconnect(rebuild);
|
||||
});
|
||||
}
|
||||
|
||||
function rebuild() {
|
||||
if (self == undefined)
|
||||
return;
|
||||
|
||||
cleanup();
|
||||
build();
|
||||
}
|
||||
|
||||
function resizeChildren() {
|
||||
if (direction != Qt.Horizontal)
|
||||
return;
|
||||
|
||||
var extraPixels = self.width % visibleButtons;
|
||||
var buttonSize = (self.width - extraPixels) / visibleButtons;
|
||||
visibleButtons.forEach(function(item, i) {
|
||||
if (!item || !item.visible)
|
||||
return;
|
||||
item.width = buttonSize + (extraPixels > 0 ? 1 : 0);
|
||||
if (extraPixels > 0)
|
||||
extraPixels--;
|
||||
});
|
||||
}
|
||||
|
||||
function checkExclusive(item) {
|
||||
var button = item;
|
||||
return function() {
|
||||
for (var i = 0, ref; (ref = visibleButtons[i]); i++) {
|
||||
if (ref.checked == (button === ref))
|
||||
continue;
|
||||
|
||||
// Disconnect the signal to avoid recursive calls
|
||||
ref.checkedChanged.disconnect(checkHandlers[i]);
|
||||
ref.checked = !ref.checked;
|
||||
ref.checkedChanged.connect(checkHandlers[i]);
|
||||
}
|
||||
self.checkedButton = button;
|
||||
}
|
||||
}
|
84
declarativeimports/plasmacomponents/ButtonRow.qml
Normal file
84
declarativeimports/plasmacomponents/ButtonRow.qml
Normal file
@ -0,0 +1,84 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of the Qt Components project.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 1.1
|
||||
import "ButtonGroup.js" as Behavior
|
||||
|
||||
/*
|
||||
Class: ButtonRow
|
||||
A ButtonRow allows you to group Buttons in a row. It provides a selection-behavior as well.
|
||||
|
||||
Note: This component don't support the enabled property.
|
||||
If you need to disable it you should disable all the buttons inside it.
|
||||
|
||||
<code>
|
||||
ButtonRow {
|
||||
Button { text: "Left" }
|
||||
Button { text: "Right" }
|
||||
}
|
||||
</code>
|
||||
*/
|
||||
Row {
|
||||
id: root
|
||||
|
||||
/*
|
||||
* Property: exclusive
|
||||
* [bool=true] Specifies the grouping behavior. If enabled, the checked property on buttons contained
|
||||
* in the group will be exclusive.
|
||||
*
|
||||
* Note that a button in an exclusive group will allways be checkable
|
||||
*/
|
||||
property bool exclusive: true
|
||||
|
||||
/*
|
||||
* Property: checkedButton
|
||||
* [string] Contains the last checked Button.
|
||||
*/
|
||||
property Item checkedButton;
|
||||
|
||||
Component.onCompleted: {
|
||||
Behavior.create(root, {direction: Qt.Horizontal});
|
||||
}
|
||||
|
||||
Component.onDestruction: {
|
||||
Behavior.destroy();
|
||||
}
|
||||
}
|
@ -1,5 +1,8 @@
|
||||
BusyIndicator 0.1 BusyIndicator.qml
|
||||
Button 0.1 Button.qml
|
||||
ButtonGroup 0.1 ButtonGroup.js
|
||||
ButtonRow 0.1 ButtonRow.qml
|
||||
ButtonColumn 0.1 ButtonColumn.qml
|
||||
CheckBox 0.1 CheckBox.qml
|
||||
DualStateButton 0.1 DualStateButton.qml
|
||||
FlashingLabel 0.1 FlashingLabel.qml
|
||||
|
@ -249,6 +249,34 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
spacing: 20
|
||||
|
||||
Text {
|
||||
font.pixelSize: 20
|
||||
text: "Button Row"
|
||||
}
|
||||
|
||||
PlasmaComponents.ButtonRow {
|
||||
spacing: 20
|
||||
PlasmaComponents.RadioButton { text: "A" }
|
||||
PlasmaComponents.RadioButton { text: "B" }
|
||||
PlasmaComponents.RadioButton { text: "C" }
|
||||
}
|
||||
|
||||
Text {
|
||||
font.pixelSize: 20
|
||||
text: "Button Column"
|
||||
}
|
||||
|
||||
PlasmaComponents.ButtonColumn {
|
||||
spacing: 20
|
||||
PlasmaComponents.RadioButton { text: "Alice" }
|
||||
PlasmaComponents.RadioButton { text: "Bob" }
|
||||
PlasmaComponents.RadioButton { text: "Charles" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user