Warning, /graphics/peruse/src/app/qml/PeruseContextDrawer.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * Copyright 2016 Dan Leinir Turthra Jensen <admin@leinir.dk>
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.12
0021 import QtQuick.Layouts 1.2
0022 import QtQuick.Controls 2.12 as QtControls
0023
0024 import org.kde.kirigami 2.7
0025
0026 // Modified version of the ContextDrawer component found in the Plasma Components
0027 // In addition to the original drawer, this will allow you to optionally insert an item
0028 // at the top of the menu, which can be any item, but originally designed for the thumbnail
0029 // navigation system for comic book pages found in Peruse.
0030 OverlayDrawer {
0031 id: root
0032
0033 /**
0034 * title: string
0035 * A title for the action list that will be shown to the user when opens the drawer
0036 */
0037 property string title: typeof i18n !== "undefined" ? i18n("Actions") : "Actions"
0038
0039 // This can be any list of objects which can be a child of a column
0040 property Item topContent: pageStack.layers.depth > 1
0041 ? (pageStack.layers.currentItem.contextualTopItems ? pageStack.layers.currentItem.contextualTopItems : null)
0042 : (pageStack.currentItem && pageStack.currentItem.contextualTopItems ? pageStack.currentItem.contextualTopItems : null);
0043
0044 /**
0045 * actions: list<Action>
0046 * This can be any type of object that a ListView can accept as model.
0047 * It expects items compatible with either QAction or Kirigami Action
0048 */
0049 property var actions: pageStack.layers.depth > 1
0050 ? pageStack.layers.currentItem.contextualActions
0051 : (pageStack.currentItem ? pageStack.currentItem.contextualActions : null)
0052 enabled: actions !== undefined && actions !== null && actions.length > 0;
0053 edge: Qt.RightEdge
0054 drawerOpen: false
0055
0056 //list items go to edges, have their own padding
0057 leftPadding: 0
0058 rightPadding: 0
0059 bottomPadding: 0
0060
0061 handleVisible: applicationWindow == undefined || applicationWindow().wideScreen == true ? false : applicationWindow().controlsVisible
0062
0063 contentItem: QtControls.StackView {
0064 id: sidebarStack;
0065 implicitWidth: Units.gridUnit * 20
0066 initialItem: sidebarPage;
0067 }
0068 Component {
0069 id: sidebarPage;
0070 Item {
0071 id: localRoot;
0072 implicitWidth: Units.gridUnit * 20
0073 property Item topContent: root.topContent;
0074 property var actions: root.actions;
0075 property int level: 0
0076 Item {
0077 id: topContainer;
0078 anchors {
0079 top: parent.top;
0080 left: parent.left;
0081 right: parent.right;
0082 bottom: menu.top;
0083 }
0084 children: localRoot.topContent;
0085 }
0086 Column {
0087 id: menu
0088 anchors {
0089 left: parent.left;
0090 right: parent.right;
0091 bottom: parent.bottom;
0092 }
0093 height: childrenRect.height;
0094 Item {
0095 height: localRoot.level === 0 ? heading.height : 0;
0096 visible: height > 0;
0097 width: menu.width
0098 Heading {
0099 id: heading
0100 anchors {
0101 left: parent.left
0102 right: parent.right
0103 margins: Units.largeSpacing
0104 }
0105 elide: Text.ElideRight
0106 level: 2
0107 text: root.title
0108 }
0109 }
0110 Repeater {
0111 model: localRoot.actions;
0112 delegate: Item {
0113 width: menu.width;
0114 height: listItemHeader.visible ? listItemHeader.height : (listItem.visible ? listItem.height : (modelData.trigger === undefined ? Units.largeSpacing : 0));
0115 Item {
0116 id: listItemHeader;
0117 anchors { top: parent.top; left: parent.left; }
0118 visible: modelData.trigger === undefined && heading.text !== "";
0119 width: menu.width
0120 height: heading.height;
0121 Heading {
0122 id: heading
0123 anchors {
0124 left: parent.left
0125 right: parent.right
0126 margins: Units.largeSpacing
0127 }
0128 elide: Text.ElideRight
0129 level: 2
0130 text: model && model.text ? model.text : (modelData.text ? modelData.text : "")
0131 }
0132 }
0133 BasicListItem {
0134 id: listItem;
0135 checked: modelData.checked
0136 icon: modelData.iconName
0137 supportsMouseEvents: true
0138 separatorVisible: false
0139 label: model ? (model.tooltip ? model.tooltip : model.text) : (modelData.tooltip ? modelData.tooltip : modelData.text)
0140 enabled: model && model.enabled !== undefined ? model.enabled : (modelData.enabled !== undefined ? modelData.enabled : true)
0141 visible: model && model.visible !== undefined ? model.visible : (modelData.visible !== undefined ? modelData.visible : true)
0142 opacity: enabled ? 1.0 : 0.6
0143 onClicked: {
0144 if (modelData.children!==undefined && modelData.children.length > 0) {
0145 sidebarStack.push(sidebarPage, { actions: modelData.children, "level": level + 1, topContent: null });
0146 } else if (modelData && modelData.trigger !== undefined) {
0147 modelData.trigger();
0148 // assume the model is a list of QAction or Action
0149 } else if (menu.model.length > index) {
0150 menu.model[index].trigger();
0151 } else {
0152 console.warning("Don't know how to trigger the action")
0153 }
0154 }
0155 Icon {
0156 Layout.alignment: Qt.AlignVCenter
0157 Layout.rightMargin: Settings.isMobile ? 0 : Units.gridUnit
0158 height: Units.iconSizes.smallMedium
0159 selected: listItem.checked || listItem.pressed
0160 width: height
0161 source: "go-next"
0162 visible: modelData.children!==undefined && modelData.children.length > 0
0163 }
0164 }
0165 }
0166 }
0167 BasicListItem {
0168 visible: level > 0
0169 supportsMouseEvents: true
0170 icon: "go-previous"
0171 label: typeof i18n !== "undefined" ? i18n("Back") : "Back"
0172 onClicked: sidebarStack.pop()
0173 }
0174 }
0175 }
0176 }
0177 }