198 lines
6.9 KiB
QML
198 lines
6.9 KiB
QML
|
/****************************************************************************
|
||
|
**
|
||
|
** Copyright (C) 2016 The Qt Company Ltd.
|
||
|
** Contact: https://www.qt.io/licensing/
|
||
|
**
|
||
|
** This file is part of the Qt Quick Controls module of the Qt Toolkit.
|
||
|
**
|
||
|
** $QT_BEGIN_LICENSE:LGPL$
|
||
|
** Commercial License Usage
|
||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||
|
** accordance with the commercial license agreement provided with the
|
||
|
** Software or, alternatively, in accordance with the terms contained in
|
||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||
|
**
|
||
|
** GNU Lesser General Public License Usage
|
||
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||
|
** General Public License version 3 as published by the Free Software
|
||
|
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||
|
** packaging of this file. Please review the following information to
|
||
|
** ensure the GNU Lesser General Public License version 3 requirements
|
||
|
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||
|
**
|
||
|
** GNU General Public License Usage
|
||
|
** Alternatively, this file may be used under the terms of the GNU
|
||
|
** General Public License version 2.0 or (at your option) the GNU General
|
||
|
** Public license version 3 or any later version approved by the KDE Free
|
||
|
** Qt Foundation. The licenses are as published by the Free Software
|
||
|
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||
|
** included in the packaging of this file. Please review the following
|
||
|
** information to ensure the GNU General Public License requirements will
|
||
|
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||
|
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||
|
**
|
||
|
** $QT_END_LICENSE$
|
||
|
**
|
||
|
****************************************************************************/
|
||
|
|
||
|
import QtQuick 2.2
|
||
|
import QtQuick.Controls 1.2
|
||
|
import QtQuick.Controls.Private 1.0
|
||
|
|
||
|
/*!
|
||
|
\qmltype CheckBox
|
||
|
\inqmlmodule QtQuick.Controls
|
||
|
\since 5.1
|
||
|
\ingroup controls
|
||
|
\brief A checkbox with a text label.
|
||
|
|
||
|
\image checkbox.png
|
||
|
|
||
|
A CheckBox is an option button that can be toggled on (checked) or off
|
||
|
(unchecked). Checkboxes are typically used to represent features in an
|
||
|
application that can be enabled or disabled without affecting others.
|
||
|
|
||
|
The state of the checkbox can be set with the \l {AbstractCheckable::checked}{checked} property.
|
||
|
|
||
|
In addition to the checked and unchecked states, there is a third state:
|
||
|
partially checked. This state indicates that the
|
||
|
regular checked/unchecked state can not be determined; generally because of
|
||
|
other states that affect the checkbox. This state is useful when several
|
||
|
child nodes are selected in a treeview, for example.
|
||
|
|
||
|
The partially checked state can be made available to the user by setting
|
||
|
\l partiallyCheckedEnabled to \c true, or set directly by setting
|
||
|
\l checkedState to \c Qt.PartiallyChecked. \l checkedState behaves
|
||
|
identically to \l {AbstractCheckable::checked}{checked} when \l partiallyCheckedEnabled
|
||
|
is \c false; setting one will appropriately set the other.
|
||
|
|
||
|
The label is shown next to the checkbox, and you can set the label text using its
|
||
|
\l {AbstractCheckable::text}{text} property.
|
||
|
|
||
|
\qml
|
||
|
Column {
|
||
|
CheckBox {
|
||
|
text: qsTr("Breakfast")
|
||
|
checked: true
|
||
|
}
|
||
|
CheckBox {
|
||
|
text: qsTr("Lunch")
|
||
|
}
|
||
|
CheckBox {
|
||
|
text: qsTr("Dinner")
|
||
|
checked: true
|
||
|
}
|
||
|
}
|
||
|
\endqml
|
||
|
|
||
|
Whenever a CheckBox is clicked, it emits the \l {AbstractCheckable::clicked}{clicked()} signal.
|
||
|
|
||
|
You can create a custom appearance for a CheckBox by
|
||
|
assigning a \l {CheckBoxStyle}.
|
||
|
*/
|
||
|
|
||
|
AbstractCheckable {
|
||
|
id: checkBox
|
||
|
|
||
|
/*!
|
||
|
\qmlproperty enumeration CheckBox::checkedState
|
||
|
|
||
|
This property indicates the current checked state of the checkbox.
|
||
|
|
||
|
Possible values:
|
||
|
\c Qt.UnChecked - The checkbox is not checked (default).
|
||
|
\c Qt.Checked - The checkbox is checked.
|
||
|
\c Qt.PartiallyChecked - The checkbox is in a partially checked (or
|
||
|
"mixed") state.
|
||
|
|
||
|
The \l {AbstractCheckable::checked}{checked} property also determines whether
|
||
|
this property is \c Qt.Checked or \c Qt.UnChecked, and vice versa.
|
||
|
*/
|
||
|
property int checkedState: checked ? Qt.Checked : Qt.Unchecked
|
||
|
|
||
|
/*!
|
||
|
This property determines whether the \c Qt.PartiallyChecked state is
|
||
|
available.
|
||
|
|
||
|
A checkbox may be in a partially checked state when the regular checked
|
||
|
state can not be determined.
|
||
|
|
||
|
Setting \l checkedState to \c Qt.PartiallyChecked will implicitly set
|
||
|
this property to \c true.
|
||
|
|
||
|
If this property is \c true, \l {AbstractCheckable::checked}{checked} will be \c false.
|
||
|
|
||
|
By default, this property is \c false.
|
||
|
*/
|
||
|
property bool partiallyCheckedEnabled: false
|
||
|
|
||
|
/*!
|
||
|
\internal
|
||
|
True if onCheckedChanged should be ignored because we were reacting
|
||
|
to onCheckedStateChanged.
|
||
|
*/
|
||
|
property bool __ignoreChecked: false
|
||
|
|
||
|
/*!
|
||
|
\internal
|
||
|
True if onCheckedStateChanged should be ignored because we were reacting
|
||
|
to onCheckedChanged.
|
||
|
*/
|
||
|
property bool __ignoreCheckedState: false
|
||
|
|
||
|
style: Settings.styleComponent(Settings.style, "CheckBoxStyle.qml", checkBox)
|
||
|
|
||
|
activeFocusOnTab: true
|
||
|
|
||
|
Accessible.role: Accessible.CheckBox
|
||
|
Accessible.name: text
|
||
|
|
||
|
__cycleStatesHandler: __cycleCheckBoxStates
|
||
|
|
||
|
onCheckedChanged: {
|
||
|
if (!__ignoreChecked) {
|
||
|
__ignoreCheckedState = true;
|
||
|
checkedState = checked ? Qt.Checked : Qt.Unchecked;
|
||
|
__ignoreCheckedState = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
onCheckedStateChanged: {
|
||
|
__ignoreChecked = true;
|
||
|
if (checkedState === Qt.PartiallyChecked) {
|
||
|
partiallyCheckedEnabled = true;
|
||
|
checked = false;
|
||
|
} else if (!__ignoreCheckedState) {
|
||
|
checked = checkedState === Qt.Checked;
|
||
|
}
|
||
|
__ignoreChecked = false;
|
||
|
}
|
||
|
|
||
|
onPartiallyCheckedEnabledChanged: {
|
||
|
if (exclusiveGroup && partiallyCheckedEnabled) {
|
||
|
console.warn("Cannot have partially checked boxes in an ExclusiveGroup.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
onExclusiveGroupChanged: {
|
||
|
if (exclusiveGroup && partiallyCheckedEnabled) {
|
||
|
console.warn("Cannot have partially checked boxes in an ExclusiveGroup.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*! \internal */
|
||
|
function __cycleCheckBoxStates() {
|
||
|
if (!partiallyCheckedEnabled) {
|
||
|
checked = !checked;
|
||
|
} else {
|
||
|
switch (checkedState) {
|
||
|
case Qt.Unchecked: checkedState = Qt.Checked; break;
|
||
|
case Qt.Checked: checkedState = Qt.PartiallyChecked; break;
|
||
|
case Qt.PartiallyChecked: checkedState = Qt.Unchecked; break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|