Warning, /sdk/rust-qt-binding-generator/examples/todos/main.qml is written in an unsupported language. File is not indexed.

0001 import QtQuick 2.9
0002 import QtQuick.Controls 2.2
0003 import QtQuick.Layouts 1.3
0004 import RustCode 1.0;
0005 
0006 ApplicationWindow {
0007     visible: true
0008     width: 450
0009     height: 580
0010     header: ToolBar {
0011         Label {
0012             anchors.fill: parent
0013             text: qsTr("todos")
0014             font.pixelSize: 30
0015             horizontalAlignment: Text.AlignHCenter
0016             verticalAlignment: Text.AlignVCenter
0017         }
0018     }
0019 
0020     Component.onCompleted: {
0021         input.forceActiveFocus()
0022     }
0023 
0024     Todos {
0025         id: todoModel
0026 
0027         Component.onCompleted: {
0028             add("write bindings.json")
0029             add("run rust_qt_binding_generator")
0030             add("check bindings.h")
0031             add("check bindings.cpp")
0032             add("check interface.rs")
0033             add("write implementation.rs")
0034             add("write main.qml")
0035         }
0036     }
0037 
0038     Component {
0039         id: todoDelegate
0040         RowLayout {
0041             // the active tab determines if this item should be shown
0042             // 0: all, 1: active, 2: completed
0043             property bool show: filter.currentIndex === 0
0044                 || (filter.currentIndex === 1 && !completed)
0045                 || (filter.currentIndex === 2 && completed)
0046             visible: show
0047             width: parent.width
0048             height: show ? implicitHeight : 0
0049             CheckBox {
0050                 checked: completed
0051                 onToggled: todoModel.setCompleted(index, checked)
0052             }
0053             Item {
0054                 Layout.fillWidth: true
0055                 Layout.fillHeight: true
0056                 Label {
0057                     id: label
0058                     visible: !editInput.visible
0059                     text: description
0060                     anchors.fill: parent
0061                     verticalAlignment: Text.AlignVCenter
0062                     font.strikeout: completed
0063                     font.pixelSize: 20
0064                 }
0065                 MouseArea {
0066                     id: mouse
0067                     anchors.fill: parent
0068                     hoverEnabled: true
0069                     onDoubleClicked: {
0070                         editInput.text = label.text
0071                         editInput.visible = true
0072                         editInput.forceActiveFocus()
0073                     }
0074                 }
0075                 Button {
0076                     text: 'X'
0077                     visible: (mouse.containsMouse && !editInput.visible)
0078                              || closeMouse.containsMouse
0079                     anchors.right: parent.right
0080                     MouseArea {
0081                         id: closeMouse
0082                         anchors.fill: parent
0083                         hoverEnabled: true
0084                         onClicked: todoModel.remove(index)
0085                     }
0086                 }
0087                 TextField {
0088                     id: editInput
0089                     visible: false
0090                     anchors.fill: parent
0091                     text: description
0092                     font.pixelSize: label.font.pixelSize
0093                     onAccepted: {
0094                         todoModel.setDescription(index, text)
0095                         visible = false
0096                     }
0097                     onActiveFocusChanged: {
0098                         // hide when focus is lost
0099                         if (!activeFocus) {
0100                             visible = false
0101                         }
0102                     }
0103                     Keys.onPressed: {
0104                         // on escape, set value, hide (and lose focus)
0105                         if (event.key === Qt.Key_Escape) {
0106                             todoModel.setDescription(index, text)
0107                             visible = false
0108                             event.accepted = true
0109                         }
0110                     }
0111                 }
0112             }
0113         }
0114     }
0115 
0116     Pane {
0117         anchors.fill: parent
0118         leftPadding: 0
0119         Page {
0120             anchors.fill: parent
0121             header: RowLayout {
0122                 CheckBox {
0123                     tristate: true
0124                     // if there are no todos, do not show this checkbox
0125                     // but let it take up the same space
0126                     enabled: todoModel.count > 0
0127                     opacity: todoModel.count === 0 ? 0 : 1
0128                     checkState: {
0129                         if (todoModel.activeCount === 0) {
0130                             return Qt.Checked
0131                         } else if (todoModel.activeCount >= todoModel.count) {
0132                             return Qt.Unchecked
0133                         }
0134                         return Qt.PartiallyChecked
0135                     }
0136                     onCheckStateChanged: {
0137                         // if the change is triggered by a user action on this
0138                         // checkbox, check or uncheck all todos
0139                         // otherwise, do nothing
0140                         // (onToggle does not emit for tristate buttons)
0141                         if (activeFocus) {
0142                             var checked = checkState !== Qt.Unchecked
0143                             todoModel.setAll(checked)
0144                         }
0145                     }
0146                 }
0147                 TextField {
0148                     id: input
0149                     Layout.fillWidth: true
0150                     placeholderText: qsTr("What needs to be done?")
0151                     onAccepted: {
0152                         const todo = text.trim()
0153                         if (todo) {
0154                             todoModel.add(todo)
0155                         }
0156                         input.clear()
0157                     }
0158                 }
0159             }
0160             Flickable {
0161                 anchors.fill: parent
0162                 ListView {
0163                     anchors.fill: parent
0164                     model: todoModel
0165                     delegate: todoDelegate
0166                 }
0167             }
0168         }
0169     }
0170 
0171     footer: Pane {
0172         padding: 0
0173         ColumnLayout {
0174             width: parent.width
0175             TabBar {
0176                 id: filter
0177                 Layout.fillWidth: true
0178                 visible: todoModel.count > 0
0179                 TabButton {
0180                     text: qsTr("All")
0181                     checked: true
0182                 }
0183                 TabButton {
0184                     text: qsTr("Active")
0185                 }
0186                 TabButton {
0187                     text: qsTr("Completed")
0188                 }
0189             }
0190             RowLayout {
0191                 visible: todoModel.count > 0
0192                 width: parent.width
0193                 Label {
0194                     Layout.fillWidth: true
0195                     text: (todoModel.activeCount === 1)
0196                         ? qsTr("1 item left")
0197                         : todoModel.activeCount + qsTr(" items left")
0198                 }
0199                 Button {
0200                     enabled: todoModel.count > todoModel.activeCount
0201                     opacity: enabled
0202                     text: qsTr("Clear completed")
0203                     onClicked: todoModel.clearCompleted()
0204                 }
0205             }
0206         }
0207     }
0208 }