Warning, /office/klevernotes/src/contents/ui/sideBar/Sidebar.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 // SPDX-FileCopyrightText: 2022 Louis Schul <schul9louis@gmail.com>
0003 
0004 /*
0005  * BASED ON :
0006  * https://invent.kde.org/graphics/koko/-/blob/master/src/qml/Sidebar.qml
0007  * 2017 Atul Sharma <atulsharma406@gmail.com>
0008  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0009 */
0010 
0011 import QtQuick 2.15
0012 import QtQuick.Layouts 1.3
0013 import QtQuick.Controls 2.15 as Controls
0014 
0015 import org.kde.kirigamiaddons.delegates 1.0 as Delegates
0016 import org.kde.kirigami 2.5 as Kirigami
0017 
0018 import org.kde.Klever 1.0
0019 
0020 Kirigami.OverlayDrawer {
0021     id: drawer
0022 
0023     readonly property NoteMapper noteMapper: applicationWindow().noteMapper
0024     readonly property NoteTreeModel treeModel: treeview.model
0025     readonly property string storagePath: Config.storagePath
0026 
0027     width: Kirigami.Units.gridUnit * 15
0028 
0029     leftPadding: 0
0030     rightPadding: 0
0031     topPadding: 0
0032     bottomPadding: 0
0033 
0034     edge: Qt.application.layoutDirection == Qt.RightToLeft ? Qt.RightEdge : Qt.LeftEdge
0035     handleClosedIcon.source: null
0036     handleOpenIcon.source: null
0037     handleVisible: applicationWindow().isMainPage() && modal
0038 
0039     modal: Kirigami.Settings.isMobile 
0040     // Prevent it to being close while in wideScreen
0041     closePolicy: modal ? Controls.Popup.CloseOnReleaseOutside : Controls.Popup.NoAutoClose
0042 
0043     contentItem: ColumnLayout {
0044         id: column
0045 
0046         ActionBar {
0047             id: actionBar
0048 
0049             treeView: treeview
0050 
0051             Layout.fillWidth: true
0052             Layout.preferredHeight: pageStack.globalToolBar.preferredHeight
0053         }
0054 
0055         TreeView {
0056             id: treeview
0057 
0058             model: NoteTreeModel {
0059                 id: noteTreeModel
0060 
0061                 noteMapEnabled: Config.noteMapEnabled
0062 
0063                 onNewGlobalPathFound: function (path) {
0064                     drawer.noteMapper.addGlobalPath(path)
0065                 }
0066                 onGlobalPathUpdated: function (oldPath, newPath) {
0067                     drawer.noteMapper.updateGlobalPath(oldPath, newPath)
0068                 }
0069                 onGlobalPathRemoved: function (path) {
0070                     drawer.noteMapper.removeGlobalPath(path)
0071                 }
0072                 onInitialGlobalPathsSent: function (initialGlobalPaths) {
0073                     drawer.noteMapper.addInitialGlobalPaths(initialGlobalPaths)
0074                 }
0075                 onErrorOccurred: function (errorMessage) {
0076                     applicationWindow().showPassiveNotification(errorMessage)
0077                 }
0078             }
0079 
0080             Layout.fillWidth: true
0081             Layout.fillHeight: true
0082 
0083             onItemRightClicked: function (clickedItem) {
0084                 const tempModelIndex = treeview.getModelIndex(clickedItem.index)
0085                 actionBar.setClickedItemInfo(clickedItem, tempModelIndex)
0086             }
0087             onCurrentItemChanged: {
0088                 const currentModelIndex = treeview.getModelIndex(treeview.currentIndex)
0089                 actionBar.setClickedItemInfo(treeview.currentItem, currentModelIndex)
0090             }
0091         }
0092 
0093         Controls.ToolSeparator {
0094             orientation: Qt.Horizontal
0095 
0096             Layout.fillWidth: true
0097         }
0098 
0099         Delegates.RoundedItemDelegate {
0100             text: i18n("Cheat sheet")
0101             icon.name: "text-markdown"
0102 
0103             Layout.fillWidth: true
0104 
0105             onClicked: {
0106                 applicationWindow().showCheatSheet()
0107                 if (drawer.modal) drawer.close()
0108             }
0109         }
0110 
0111         Delegates.RoundedItemDelegate {
0112             text: i18n("Settings")
0113             icon.name: "settings-configure"
0114 
0115             Layout.fillWidth: true
0116 
0117             onClicked: {
0118                 applicationWindow().switchToPage('Settings')
0119             }
0120         }
0121 
0122         Delegates.RoundedItemDelegate {
0123             text: i18n("About KleverNotes")
0124             icon.name: "help-about"
0125 
0126             Layout.fillWidth: true
0127 
0128             onClicked: {
0129                 applicationWindow().switchToPage('About')
0130             }
0131         }
0132     }
0133 
0134     onStoragePathChanged: if (storagePath !== "None") {
0135         noteTreeModel.initModel()
0136     }
0137     Component.onCompleted: {
0138         if (storagePath === "None"){
0139             let component = Qt.createComponent("qrc:/contents/ui/dialogs/StorageDialog.qml")
0140 
0141             if (component.status == Component.Ready) {
0142                 var dialog = component.createObject(applicationWindow());
0143                 dialog.open()
0144             }
0145         }
0146     }
0147 
0148     ContextMenu {
0149         id: contextMenu
0150 
0151         treeView: treeview
0152         actionBar: actionBar
0153     }
0154 
0155     Timer {
0156         id: focusTimer
0157 
0158         property var focusModelIndex
0159 
0160         repeat: false
0161         interval: Kirigami.Units.shortDuration
0162 
0163         onTriggered: if (focusModelIndex) {
0164             focusModelIndex.model.askForFocus(focusModelIndex)
0165             focusModelIndex = undefined
0166         }
0167     }
0168 
0169     Timer {
0170         id: timer
0171 
0172         property var modelIndex
0173 
0174         repeat: false
0175         interval: Kirigami.Units.shortDuration
0176 
0177         onTriggered: if (modelIndex) {
0178             modelIndex.model.askForExpand(modelIndex)
0179             modelIndex = undefined
0180             interval = Kirigami.Units.shortDuration
0181             focusTimer.start()
0182         }
0183     }
0184 
0185     function askForFocus(modelIndex) {
0186         let parentRowsList = []
0187         let currentModelIndex = modelIndex
0188         while (currentModelIndex.parent.row !== -1) {
0189             const nextModelIndex = currentModelIndex.parent
0190             parentRowsList.push(nextModelIndex)
0191             currentModelIndex = nextModelIndex
0192         }
0193 
0194         const firstModelIndex = parentRowsList[parentRowsList.length - 1]
0195 
0196         firstModelIndex.model.askForExpand(firstModelIndex)
0197         // This might be the exact same as "firstModelIndex" but is still needed for Category notes
0198         timer.modelIndex = parentRowsList[0]
0199         timer.start()
0200 
0201         focusTimer.focusModelIndex = modelIndex
0202     }
0203 }