Warning, /utilities/klimbgrades/src/Main.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * Copyright 2016 Marco Martin <mart@kde.org>
0003 *
0004 * This program is free software; you can redistribute it and/or modify
0005 * it under the terms of the GNU Library General Public License as
0006 * published by the Free Software Foundation; either version 2 or
0007 * (at your option) any later version.
0008 *
0009 * This program is distributed in the hope that it will be useful,
0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0012 * GNU Library General Public License for more details
0013 *
0014 * You should have received a copy of the GNU Library General Public
0015 * License along with this program; if not, write to the
0016 * Free Software Foundation, Inc.,
0017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
0018 */
0019
0020 import QtQuick 2.15
0021 import QtQuick.Layouts 1.15
0022 import QtQuick.Controls 2.15 as Controls
0023 import org.kde.kirigami 2.19 as Kirigami
0024
0025 Kirigami.ApplicationWindow {
0026 id: root
0027
0028 property bool french: true
0029 property bool yds: true
0030 property bool uiaa: true
0031
0032 minimumWidth: Kirigami.Units.gridUnit * 15
0033 minimumHeight: Kirigami.Units.gridUnit * 20
0034
0035 pageStack {
0036 defaultColumnWidth: Kirigami.Units.gridUnit * 30
0037 globalToolBar {
0038 canContainHandles: !Kirigami.Settings.isMobile
0039 style: Kirigami.Settings.isMobile ? Kirigami.ApplicationHeaderStyle.Titles : Kirigami.ApplicationHeaderStyle.ToolBar
0040 showNavigationButtons: false//applicationWindow().pageStack.currentIndex > 0 ? Kirigami.ApplicationHeaderStyle.ShowBackButton : 0
0041 // HACK: ApplicationHeaderStyle.None doesn't load fabs
0042 preferredHeight: Kirigami.Settings.isMobile && !root.pageStack.wideMode ? 0 : (Kirigami.Units.gridUnit * 1.8) + Kirigami.Units.smallSpacing * 2
0043 }
0044 initialPage: [leadPageComponent, boulderPageComponent]
0045 }
0046
0047 Component.onCompleted: pageStack.currentIndex = 0; //TODO: save the state
0048
0049 header: Controls.ToolBar {
0050 //TODO: make the behavior of abstractapplicationheader sliding away work again
0051 visible: Kirigami.Settings.isMobile && !root.pageStack.wideMode
0052 height: visible ? implicitHeight : 0
0053 contentItem: Kirigami.Heading {
0054 text: qsTr("Climbing Grades")
0055 }
0056 }
0057 footer: Controls.ToolBar {
0058 id: bottomNavigation
0059 //FIXME: Kirigami.NavigationTabBar needs the possibility of setting stuff on either side
0060 position: Controls.TabBar.Footer
0061 visible: Kirigami.Settings.isMobile && !root.pageStack.wideMode
0062 height: visible ? implicitHeight : 0
0063 Kirigami.Theme.inherit: false
0064 Kirigami.Theme.colorSet: Kirigami.Theme.Header
0065 contentItem: RowLayout {
0066 Item {
0067 id: leftAnchor
0068 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0069 Layout.preferredHeight: Layout.preferredWidth
0070 Binding {
0071 target: globalDrawer.handle
0072 property: "handleAnchor"
0073 value: leftAnchor
0074 when: bottomNavigation.visible
0075 }
0076 }
0077 Kirigami.NavigationTabBar {
0078 Layout.fillWidth: true
0079 background: null
0080 actions: [
0081 Kirigami.Action {
0082 text: qsTr("Lead")
0083 checked: root.pageStack.currentIndex === 0
0084 onTriggered: root.pageStack.currentIndex = 0
0085 },
0086 Kirigami.Action {
0087 text: qsTr("Boulder")
0088 checked: root.pageStack.currentIndex === 1
0089 onTriggered: root.pageStack.currentIndex = 1
0090 }
0091 ]
0092 }
0093 Item {
0094 id: rightAnchor
0095 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0096 Layout.preferredHeight: Layout.preferredWidth
0097 Binding {
0098 target: contextDrawer.handle
0099 property: "handleAnchor"
0100 value: rightAnchor
0101 when: bottomNavigation.visible
0102 }
0103 }
0104 }
0105 }
0106 Component {
0107 id: leadPageComponent
0108 Global {
0109 title: qsTr("Lead")
0110 model: dataStore.availableLeadModel
0111 defaultGrade: 45
0112 }
0113 }
0114 Component {
0115 id: boulderPageComponent
0116 Global {
0117 title: qsTr("Boulder")
0118 model: dataStore.availableBoulderModel
0119 defaultGrade: 65
0120 }
0121 }
0122
0123 contextDrawer: Kirigami.ContextDrawer {
0124 id: contextDrawer
0125 }
0126
0127 globalDrawer: Kirigami.OverlayDrawer {
0128 id: drawer
0129
0130 edge: Qt.application.layoutDirection === Qt.RightToLeft ? Qt.RightEdge : Qt.LeftEdge
0131 modal: Kirigami.Settings.isMobile || (applicationWindow().width < Kirigami.Units.gridUnit * 50 && !collapsed) // Only modal when not collapsed, otherwise collapsed won't show.
0132 z: modal ? Math.round(position * 10000000) : 100
0133 drawerOpen: !Kirigami.Settings.isMobile && enabled
0134 width: Kirigami.Units.gridUnit * 16
0135
0136 Kirigami.Theme.colorSet: Kirigami.Theme.View
0137 handleClosedIcon.source: modal ? null : "sidebar-expand-left"
0138 handleOpenIcon.source: modal ? null : "sidebar-collapse-left"
0139 handleVisible: modal
0140
0141 onModalChanged: if (!modal) {
0142 drawerOpen = true;
0143 }
0144
0145 leftPadding: 0
0146 rightPadding: 0
0147 topPadding: 0
0148 bottomPadding: 0
0149
0150 contentItem: ColumnLayout {
0151 Controls.ToolBar {
0152 Layout.fillWidth: true
0153 Layout.preferredHeight: pageStack.globalToolBar.preferredHeight > 0 ? pageStack.globalToolBar.preferredHeight : undefined
0154
0155 leftPadding: 3
0156 rightPadding: 3
0157 topPadding: 3
0158 bottomPadding: 3
0159
0160 contentItem: Kirigami.SearchField {
0161 id: filterField
0162 placeholderText: qsTr("Filter…")
0163 }
0164 }
0165 Kirigami.AbstractListItem {
0166 Layout.fillWidth: true
0167 contentItem: Kirigami.Heading {
0168 text: qsTr("Lead")
0169 level: 2
0170 color: parent.checked ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor
0171 }
0172 checkable: !root.pageStack.wideMode
0173 checked: checkable && root.pageStack.currentIndex === 0
0174 onClicked: root.pageStack.currentIndex = 0
0175 }
0176 Kirigami.Separator {
0177 Layout.fillWidth: true
0178 }
0179 Repeater {
0180 model: dataStore.availableLeadModel
0181 delegate: Controls.CheckDelegate {
0182 required property int index
0183 required property string name
0184 required property bool scaleEnabled
0185
0186 visible: name.toUpperCase().indexOf(filterField.text.toUpperCase()) !== -1
0187 Layout.fillWidth: true
0188 text: name
0189 checkState: scaleEnabled ? Qt.Checked : Qt.Unchecked
0190 onToggled: {
0191 dataStore.availableLeadModel.setScaleEnabled(index, checkState == Qt.Checked);
0192 root.pageStack.currentIndex = 0;
0193 }
0194 }
0195 }
0196 Kirigami.AbstractListItem {
0197 Layout.fillWidth: true
0198 contentItem: Kirigami.Heading {
0199 text: qsTr("Boulder")
0200 level: 2
0201 color: parent.checked ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor
0202 }
0203 checkable: !root.pageStack.wideMode
0204 checked: checkable && root.pageStack.currentIndex === 1
0205 onClicked: root.pageStack.currentIndex = 1
0206 }
0207 Kirigami.Separator {
0208 Layout.fillWidth: true
0209 }
0210 Repeater {
0211 model: dataStore.availableBoulderModel
0212 delegate: Controls.CheckDelegate {
0213 required property int index
0214 required property string name
0215 required property bool scaleEnabled
0216
0217 visible: name.toUpperCase().indexOf(filterField.text.toUpperCase()) !== -1
0218 Layout.fillWidth: true
0219 text: name
0220 checkState: scaleEnabled ? Qt.Checked : Qt.Unchecked
0221 onToggled: {
0222 dataStore.availableBoulderModel.setScaleEnabled(index, checkState == Qt.Checked);
0223 root.pageStack.currentIndex = 1;
0224 }
0225 }
0226 }
0227 Kirigami.Separator {
0228 Layout.fillWidth: true
0229 }
0230 Controls.SwitchDelegate {
0231 Layout.fillWidth: true
0232 text: qsTr("Link Lead and Boulder")
0233 checked: dataStore.leadAndBoulderLinked
0234 onToggled: dataStore.leadAndBoulderLinked = checked
0235 }
0236 Item {
0237 Layout.fillHeight: true
0238 }
0239 }
0240 }
0241
0242 Connections {
0243 target: dataStore.availableLeadModel
0244 function onCurrentGradeChanged() {
0245 if (dataStore.leadAndBoulderLinked) {
0246 dataStore.availableBoulderModel.currentGrade = dataStore.availableLeadModel.currentGrade;
0247 }
0248 }
0249 }
0250
0251 Connections {
0252 target: dataStore.availableBoulderModel
0253 function onCurrentGradeChanged() {
0254 if (dataStore.leadAndBoulderLinked) {
0255 dataStore.availableLeadModel.currentGrade = dataStore.availableBoulderModel.currentGrade;
0256 }
0257 }
0258 }
0259 }