Warning, /libraries/kirigami-addons/src/settings/CategorizedSettings.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2020 Tobias Fella <fella@posteo.de>
0002 // SPDX-FileCopyrightText: 2021 Carl Schwan <carl@carlschwan.eu>
0003 // SPDX-FileCopyrightText: 2021 Felipe Kinoshita <kinofhek@gmail.com>
0004 // SPDX-FileCopyrightText: 2021 Marco Martin <mart@kde.org>
0005 // SPDX-License-Identifier: LGPL-2.0-or-later
0006
0007 import QtQml 2.15
0008 import QtQuick 2.15
0009 import QtQuick.Controls 2.15 as QQC2
0010 import QtQuick.Layouts 1.15
0011 import org.kde.kirigami 2.20 as Kirigami
0012 import org.kde.kirigamiaddons.delegates 1.0 as Delegates
0013
0014 /**
0015 * A container for setting actions showing them in a list view and displaying
0016 * the actual page next to it.
0017 *
0018 * To open a setting page, you should use `PageRow::pushDialogLayers`
0019 *
0020 * @since KirigamiAddons 0.11.0
0021 * @inherit kde::org::kirigami::PageRow
0022 */
0023 Kirigami.PageRow {
0024 id: root
0025
0026 /**
0027 * @brief The default page that will be shown when opened.
0028 *
0029 * This only applies when the categorized settings object is wide enough to
0030 * show multiple pages.
0031 *
0032 * @see actions
0033 */
0034 property string defaultPage
0035
0036 /**
0037 * @brief The list of pages for the settings
0038 */
0039 property list<Kirigami.PagePoolAction> actions
0040
0041 property alias _stack: root
0042 property Kirigami.PagePool _pool: Kirigami.PagePool {}
0043
0044 readonly property string title: root.depth < 2 ? i18ndc("kirigami-addons6", "@title:window", "Settings") :i18ndc("kirigami-addons6", "@title:window", "Settings — %1", root.get(1).title)
0045
0046 property bool completed: false
0047
0048 bottomPadding: 0
0049 leftPadding: 0
0050 rightPadding: 0
0051 topPadding: 0
0052
0053 // Hack to not base all calculation based on main popup
0054 function applicationWindow() {
0055 return _fakeApplicationWindow;
0056 }
0057
0058 readonly property QtObject _fakeApplicationWindow: QtObject {
0059 readonly property Kirigami.PageRow pageStack: root
0060 readonly property bool controlsVisible: true
0061 readonly property QtObject globalDrawer: null
0062 readonly property QtObject contextDrawer: null
0063 readonly property double width: root.width
0064 readonly property double height: root.height
0065 readonly property var overlay: root
0066 }
0067
0068 globalToolBar {
0069 style: Kirigami.ApplicationHeaderStyle.ToolBar
0070 showNavigationButtons: if (root.currentIndex > 0) {
0071 Kirigami.ApplicationHeaderStyle.ShowBackButton
0072 } else {
0073 0
0074 }
0075 }
0076
0077 signal backRequested(var event)
0078 onBackRequested: event => {
0079 if (root.depth > 1 && !root.wideMode && root.currentIndex !== 0) {
0080 event.accepted = true;
0081 root.pop();
0082 }
0083 }
0084
0085 columnView.columnWidth: Kirigami.Units.gridUnit * 13
0086
0087 initialPage: Kirigami.ScrollablePage {
0088 bottomPadding: 0
0089 leftPadding: 0
0090 rightPadding: 0
0091 topPadding: 0
0092
0093 titleDelegate: Kirigami.SearchField {
0094 Layout.fillWidth: true
0095 onTextChanged: listview.filterText = text.toLowerCase();
0096 }
0097
0098 ListView {
0099 id: listview
0100
0101 property string filterText: ""
0102 property bool initDone: false
0103
0104 currentIndex: -1
0105 topMargin: Math.round(Kirigami.Units.smallSpacing / 2)
0106 bottomMargin: Math.round(Kirigami.Units.smallSpacing / 2)
0107
0108 onWidthChanged: if (!initDone && root.width >= columnView.columnWidth) {
0109 let defaultAction = getActionByName(defaultPage);
0110 if (defaultAction) {
0111 defaultAction.trigger();
0112 listview.currentIndex = indexOfAction(defaultAction);
0113 } else {
0114 actions[0].trigger();
0115 listview.currentIndex = 0;
0116 if (root.currentItem.title.length === 0) {
0117 root.currentItem.title = actions[0].text;
0118 }
0119 }
0120 initDone = true;
0121 }
0122 model: {
0123 const isFiltering = filterText.length !== 0;
0124 let filteredActions = [];
0125 for (let i in actions) {
0126 const action = actions[i];
0127 const actionPassesFilter = action.text.toLowerCase().includes(filterText);
0128 if (action.visible && (isFiltering ? actionPassesFilter : true)) {
0129 filteredActions.push(action);
0130 }
0131 }
0132 return filteredActions;
0133 }
0134 delegate: Delegates.RoundedItemDelegate {
0135 id: settingDelegate
0136
0137 required property int index
0138 required property var modelData
0139
0140 action: modelData
0141 checked: ListView.view.currentIndex === settingDelegate.index
0142
0143 onClicked: {
0144 ListView.view.currentIndex = settingDelegate.index;
0145 if (root.currentItem.title.length === 0) {
0146 root.currentItem.title = text;
0147 }
0148 }
0149 }
0150 }
0151 }
0152
0153 Component.onCompleted: {
0154 root.completed = true;
0155 }
0156
0157 function getActionByName(actionName) {
0158 for (let i in actions) {
0159 if (actions[i].actionName == actionName) {
0160 return actions[i];
0161 }
0162 }
0163 }
0164
0165 function indexOfAction(action) {
0166 for (let i in actions) {
0167 if (actions[i] == action) {
0168 return i;
0169 }
0170 }
0171 }
0172 }
0173