Warning, /multimedia/kid3/src/qml/app/AbstractSettingsPage.qml is written in an unsupported language. File is not indexed.

0001 /**
0002  * \file AbstractSettingsPage.qml
0003  * Base component for settings page.
0004  *
0005  * \b Project: Kid3
0006  * \author Urs Fleisch
0007  * \date 16 Feb 2015
0008  *
0009  * Copyright (C) 2015-2018  Urs Fleisch
0010  *
0011  * This program is free software; you can redistribute it and/or modify
0012  * it under the terms of the GNU Lesser General Public License as published by
0013  * the Free Software Foundation; version 3.
0014  *
0015  * This program is distributed in the hope that it will be useful,
0016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0018  * GNU Lesser General Public License for more details.
0019  *
0020  * You should have received a copy of the GNU Lesser General Public License
0021  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0022  */
0023 
0024 import QtQuick 2.11
0025 import QtQuick.Layouts 1.11
0026 import QtQuick.Controls 2.4
0027 
0028 Page {
0029   id: page
0030 
0031   signal clicked(int index)
0032   property list<SettingsElement> model
0033 
0034   function activateAll() {
0035     for (var i = 0; i < model.length; i++) {
0036       if (model[i].onActivated) {
0037         model[i].onActivated()
0038       }
0039     }
0040   }
0041 
0042   function deactivateAll() {
0043     for (var i = 0; i < model.length; i++) {
0044       if (model[i].onDeactivated) {
0045         model[i].onDeactivated()
0046       }
0047     }
0048   }
0049 
0050   header: ToolBar {
0051     IconButton {
0052       id: prevButton
0053       anchors.left: parent.left
0054       anchors.verticalCenter: parent.verticalCenter
0055       iconName: "go-previous"
0056       color: titleLabel.color
0057       width: visible ? height : 0
0058       visible: page.StackView.view && page.StackView.view.depth > 1
0059       onClicked: page.StackView.view.pop()
0060     }
0061     Label {
0062       id: titleLabel
0063       anchors.left: prevButton.right
0064       anchors.right: parent.right
0065       anchors.verticalCenter: parent.verticalCenter
0066       clip: true
0067       text: page.title
0068     }
0069   }
0070 
0071   Item {
0072     anchors.fill: parent
0073 
0074     Component {
0075       id: booleanDelegate
0076       SettingsItem {
0077         text: _modelData.name
0078         control: CheckBox {
0079           checked: _modelData.value
0080           onClicked: _modelData.value = checked
0081         }
0082       }
0083     }
0084     Component {
0085       id: booleanEditDelegate
0086       SettingsItem {
0087         id: settingsItem
0088         text: _modelData.name
0089         control: RowLayout {
0090           IconButton {
0091             iconName: "edit"
0092             color: settingsItem.labelColor
0093             onClicked: _modelData.onEdit()
0094           }
0095           CheckBox {
0096             checked: _modelData.value
0097             onClicked: _modelData.value = checked
0098           }
0099         }
0100       }
0101     }
0102     Component {
0103       id: stringDelegate
0104       SettingsItem {
0105         text: _modelData.name
0106         control: TextField {
0107           width: Math.min(_modelData.width || constants.gu(40), page.width - 2 * constants.margins)
0108           text: _modelData.value
0109           selectByMouse: true
0110           onAccepted: {
0111             focus = false
0112           }
0113           onActiveFocusChanged: {
0114             if (!activeFocus) {
0115               _modelData.value = text
0116             }
0117           }
0118         }
0119       }
0120     }
0121     Component {
0122       id: numberDelegate
0123       SettingsItem {
0124         text: _modelData.name
0125         control: TextField {
0126           width: Math.min(_modelData.width || constants.gu(40), page.width - 2 * constants.margins)
0127           text: _modelData.value
0128           selectByMouse: true
0129           onAccepted: {
0130             focus = false
0131           }
0132           onActiveFocusChanged: {
0133             if (!activeFocus) {
0134               var nr = parseInt(text)
0135               if (!isNaN(nr)) {
0136                 _modelData.value = nr
0137               }
0138             }
0139           }
0140         }
0141       }
0142     }
0143     Component {
0144       id: selectionDelegate
0145       SettingsItem {
0146         text: _modelData.name
0147         control: ComboBox {
0148           width: Math.min(_modelData.width || constants.gu(40), page.width - 2 * constants.margins)
0149           currentIndex: _modelData.value
0150           model: _modelData.dropDownModel
0151           onCurrentIndexChanged: _modelData.value = currentIndex
0152         }
0153       }
0154     }
0155     Component {
0156       id: selectionEditDelegate
0157       SettingsItem {
0158         id: settingsItem
0159         text: _modelData.name
0160         control: RowLayout {
0161           width: Math.min(_modelData.width || constants.gu(40), page.width - 2 * constants.margins)
0162           IconButton {
0163             iconName: "edit"
0164             color: settingsItem.labelColor
0165             onClicked: _modelData.onEdit()
0166           }
0167           ComboBox {
0168             Layout.fillWidth: true
0169             currentIndex: _modelData.value
0170             model: _modelData.dropDownModel
0171             onCurrentIndexChanged: _modelData.value = currentIndex
0172           }
0173         }
0174       }
0175     }
0176     Component {
0177       id: clickDelegate
0178       Standard {
0179         text: _modelData.name
0180         progression: true
0181         onClicked: {
0182           if (_modelData.onEdit) {
0183             _modelData.onEdit()
0184           } else {
0185             page.clicked(_index)
0186           }
0187         }
0188         ThinDivider {
0189           id: divider
0190           anchors {
0191             left: parent.left
0192             right: parent.right
0193             bottom: parent.bottom
0194           }
0195         }
0196       }
0197     }
0198 
0199     ListView {
0200       id: listView
0201 
0202       clip: true
0203       anchors.fill: parent
0204       model: page.model
0205       delegate: Loader {
0206         width: ListView.view.width
0207         property int _index: index
0208         property variant _modelData: modelData
0209         sourceComponent:
0210             if (modelData.dropDownModel)
0211               if (onEdit)
0212                 selectionEditDelegate
0213               else
0214                 selectionDelegate
0215             else if (typeof modelData.value === "boolean")
0216               if (onEdit)
0217                 booleanEditDelegate
0218               else
0219                 booleanDelegate
0220             else if (typeof modelData.value === "string")
0221               stringDelegate
0222             else if (typeof modelData.value === "number")
0223               numberDelegate
0224             else
0225               clickDelegate
0226       }
0227     }
0228   }
0229 }