Warning, /pim/merkuro/src/contacts/qml/Sidebar.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2021 Carl Schwan <carlschwan@kde.org>
0002 // SPDX-License-Identifier: LGPL-3.0-or-later
0003 
0004 import QtQuick 2.15
0005 import QtQuick.Controls 2.15 as QQC2
0006 import QtQuick.Layouts 1.15
0007 import org.kde.kirigami 2.20 as Kirigami
0008 import org.kde.kirigamiaddons.delegates 1.0 as Delegates
0009 import org.kde.merkuro.contact 1.0 as Contact
0010 import org.kde.akonadi 1.0 as Akonadi
0011 import org.kde.merkuro.components 1.0
0012 import Qt.labs.qmlmodels 1.0
0013 import org.kde.kitemmodels 1.0
0014 
0015 Kirigami.OverlayDrawer {
0016     id: root
0017 
0018     signal collectionCheckChanged
0019     signal closeParentDrawer
0020     signal deleteCollection(int collectionId, var collectionDetails)
0021 
0022     property Akonadi.AgentConfiguration agentConfiguration: Akonadi.AgentConfiguration {}
0023 
0024     edge: Qt.application.layoutDirection === Qt.RightToLeft ? Qt.RightEdge : Qt.LeftEdge
0025     modal: !enabled || Kirigami.Settings.isMobile || (applicationWindow().width < Kirigami.Units.gridUnit * 50 && !collapsed) // Only modal when not collapsed, otherwise collapsed won't show.
0026     onModalChanged: drawerOpen = !modal;
0027 
0028     z: modal ? Math.round(position * 10000000) : 100
0029 
0030     drawerOpen: !Kirigami.Settings.isMobile && enabled
0031 
0032     handleClosedIcon.source: modal ? null : "sidebar-expand-left"
0033     handleOpenIcon.source: modal ? null : "sidebar-collapse-left"
0034     handleVisible: modal && enabled
0035 
0036     width: Kirigami.Units.gridUnit * 16
0037     Behavior on width {
0038         NumberAnimation {
0039             duration: Kirigami.Units.longDuration
0040             easing.type: Easing.InOutQuad
0041         }
0042     }
0043 
0044     Kirigami.Theme.colorSet: Kirigami.Theme.View
0045     Kirigami.Theme.inherit: false
0046 
0047     leftPadding: 0
0048     rightPadding: 0
0049     topPadding: 0
0050     bottomPadding: 0
0051 
0052     contentItem: ColumnLayout {
0053         id: container
0054 
0055         spacing: 0
0056         clip: true
0057 
0058         QQC2.ToolBar {
0059             id: toolbar
0060 
0061             Layout.fillWidth: true
0062             Layout.preferredHeight: pageStack.globalToolBar.preferredHeight
0063 
0064             leftPadding: root.collapsed ? 0 : Kirigami.Units.smallSpacing
0065             rightPadding: root.collapsed ? Kirigami.Units.smallSpacing / 2 : Kirigami.Units.smallSpacing
0066             topPadding: 0
0067             bottomPadding: 0
0068 
0069             contentItem: RowLayout {
0070                 Kirigami.SearchField {
0071                     Layout.fillWidth: true
0072 
0073                     opacity: root.collapsed ? 0 : 1
0074                     onTextChanged: Contact.ContactManager.filteredContacts.setFilterFixedString(text)
0075 
0076                     Behavior on opacity {
0077                         OpacityAnimator {
0078                             duration: Kirigami.Units.longDuration
0079                             easing.type: Easing.InOutQuad
0080                         }
0081                     }
0082                 }
0083             }
0084         }
0085 
0086         QQC2.ScrollView {
0087             Layout.fillWidth: true
0088             Layout.fillHeight: true
0089 
0090             ListView {
0091                 id: collectionList
0092 
0093                 activeFocusOnTab: true
0094                 currentIndex: -1
0095                 onActiveFocusChanged: if (currentIndex === -1 && activeFocus) {
0096                     currentIndex = 0;
0097                 }
0098 
0099                 header: Delegates.RoundedItemDelegate {
0100                     id: collectionHeadingItem
0101 
0102                     hoverEnabled: false
0103                     width: parent.width
0104                     text: i18n("Contacts")
0105 
0106                     contentItem: RowLayout {
0107                         Kirigami.Icon {
0108                             implicitWidth: Kirigami.Units.iconSizes.smallMedium
0109                             implicitHeight: Kirigami.Units.iconSizes.smallMedium
0110                             source: "view-pim-contacts"
0111                             isMask: true
0112                             color: Kirigami.Theme.disabledTextColor
0113                         }
0114 
0115                         Kirigami.Heading {
0116                             level: 4
0117                             text: collectionHeadingItem.text
0118                             color: Kirigami.Theme.disabledTextColor
0119                             Layout.fillWidth: true
0120                         }
0121                     }
0122                 }
0123 
0124                 model: KDescendantsProxyModel {
0125                     model: Contact.ContactManager.contactCollections
0126                 }
0127 
0128                 delegate: DelegateChooser {
0129                     role: 'kDescendantExpandable'
0130 
0131                     DelegateChoice {
0132                         roleValue: true
0133 
0134                         Delegates.RoundedItemDelegate {
0135                             id: collectionSourceItem
0136 
0137                             required property int index
0138                             required property var decoration
0139                             required property var model
0140                             required property var collection
0141                             required property int kDescendantLevel
0142                             required property bool kDescendantExpanded
0143                             required property int collectionId
0144                             required property var checkState
0145                             required property color collectionColor
0146 
0147                             topInset: 2 * Kirigami.Units.largeSpacing + Math.round(Kirigami.Units.smallSpacing / 2)
0148                             topPadding: 2 * Kirigami.Units.largeSpacing + verticalPadding
0149                             leftInset: Qt.application.layoutDirection !== Qt.RightToLeft ? (kDescendantLevel - 1) * padding * 2 + Kirigami.Units.smallSpacing : 0
0150                             leftPadding: (Qt.application.layoutDirection !== Qt.RightToLeft ? (kDescendantLevel - 1) * padding * 2 + Math.round(Kirigami.Units.smallSpacing / 2) : 0) + Kirigami.Units.smallSpacing
0151 
0152                             rightInset: (Qt.application.layoutDirection === Qt.RightToLeft ? (kDescendantLevel - 1) * padding * 2  + horizontalPadding : 0) + Kirigami.Units.smallSpacing
0153                             rightPadding: (Qt.application.layoutDirection === Qt.RightToLeft ? (kDescendantLevel - 1) * padding * 2 + horizontalPadding : 0) + Math.round(Kirigami.Units.smallSpacing * 2.5)
0154 
0155                             text: model.display
0156                             highlighted: activeFocus
0157 
0158                             hoverEnabled: false
0159                             Accessible.checkable: true
0160                             Accessible.checked: collectionSourceItem.kDescendantExpanded
0161 
0162                             onClicked: collectionList.model.toggleChildren(collectionSourceItem.index)
0163 
0164                             contentItem: RowLayout {
0165                                 Kirigami.Icon {
0166                                     implicitWidth: Kirigami.Units.iconSizes.smallMedium
0167                                     implicitHeight: Kirigami.Units.iconSizes.smallMedium
0168                                     isMask: true
0169                                     source: collectionSourceItem.decoration
0170                                     color: Kirigami.Theme.disabledTextColor
0171                                     Layout.leftMargin: Math.round(Kirigami.Units.smallSpacing / 2)
0172                                 }
0173 
0174                                 Kirigami.Heading {
0175                                     text: collectionSourceItem.text
0176                                     elide: Text.ElideRight
0177                                     color: Kirigami.Theme.disabledTextColor
0178                                     level: 4
0179 
0180                                     Layout.fillWidth: true
0181                                 }
0182 
0183                                 QQC2.BusyIndicator {
0184                                     id: loadingIndicator
0185                                     Layout.fillHeight: true
0186                                     padding: 0
0187                                     visible: false
0188                                     running: visible
0189                                 }
0190 
0191                                 Kirigami.Icon {
0192                                     implicitWidth: Kirigami.Units.iconSizes.small
0193                                     implicitHeight: Kirigami.Units.iconSizes.small
0194                                     source: collectionSourceItem.kDescendantExpanded ? 'arrow-up' : 'arrow-down'
0195                                     isMask: true
0196                                 }
0197 
0198                                 ColoredCheckbox {
0199                                     id: collectionCheckbox
0200 
0201                                     visible: model.checkState != null
0202                                     color: collectionSourceItem.collectionColor ?? Kirigami.Theme.highlightedTextColor
0203                                     checked: model.checkState === 2
0204                                     onCheckedChanged: root.collectionCheckChanged()
0205                                     onClicked: {
0206                                         model.checkState = model.checkState === 0 ? 2 : 0
0207                                         root.collectionCheckChanged()
0208                                     }
0209 
0210                                     Layout.alignment: Qt.AlignVCenter
0211                                 }
0212                             }
0213 
0214                             Connections {
0215                                 target: root.agentConfiguration
0216 
0217                                 function onAgentProgressChanged(agentData) {
0218                                     if (agentData.instanceId === collectionSourceItem.collection.resource &&
0219                                         agentData.status === Akonadi.AgentConfiguration.Running) {
0220 
0221                                         loadingIndicator.visible = true;
0222                                     } else if (agentData.instanceId === collectionSourceItem.collection.resource) {
0223                                         loadingIndicator.visible = false;
0224                                     }
0225                                 }
0226                             }
0227                         }
0228                     }
0229 
0230                     DelegateChoice {
0231                         roleValue: false
0232 
0233                         Delegates.RoundedItemDelegate {
0234                             id: collectionItem
0235 
0236                             required property int index
0237                             required property var decoration
0238                             required property var model
0239                             required property var collection
0240                             required property int kDescendantLevel
0241                             required property bool kDescendantExpanded
0242                             required property int collectionId
0243                             required property var checkState
0244                             required property color collectionColor
0245 
0246                             text: model.display
0247                             enabled: !root.drawerCollapsed
0248                             highlighted: activeFocus
0249 
0250                             leftInset: Qt.application.layoutDirection !== Qt.RightToLeft ? Math.max(0, kDescendantLevel - 2) * padding * 2 + Kirigami.Units.smallSpacing : 0
0251                             leftPadding: (Qt.application.layoutDirection !== Qt.RightToLeft ? Math.max(0, kDescendantLevel - 2) * padding * 2 + Math.round(Kirigami.Units.smallSpacing / 2) : 0) + Kirigami.Units.smallSpacing
0252 
0253                             rightInset: (Qt.application.layoutDirection === Qt.RightToLeft ? Math.max(0, kDescendantLevel - 2) * padding * 2  + horizontalPadding : 0) + Kirigami.Units.smallSpacing
0254                             rightPadding: (Qt.application.layoutDirection === Qt.RightToLeft ? Math.max(0, kDescendantLevel - 2) * padding * 2 + horizontalPadding : 0) + Math.round(Kirigami.Units.smallSpacing * 2.5)
0255 
0256                             Accessible.checkable: true
0257                             Accessible.checked: model.checkState === 2
0258                             Accessible.onToggleAction: clicked()
0259 
0260                             contentItem: RowLayout {
0261                                 Kirigami.Icon {
0262                                     implicitWidth: Kirigami.Units.iconSizes.smallMedium
0263                                     implicitHeight: Kirigami.Units.iconSizes.smallMedium
0264                                     source: collectionItem.decoration
0265                                     Layout.leftMargin: Math.round(Kirigami.Units.smallSpacing / 2)
0266                                 }
0267 
0268                                 QQC2.Label {
0269                                     text: collectionItem.text
0270                                     elide: Text.ElideRight
0271                                     Layout.fillWidth: true
0272                                 }
0273 
0274                                 ColoredCheckbox {
0275                                     id: collectionCheckbox
0276 
0277                                     Layout.alignment: Qt.AlignVCenter
0278                                     visible: model.checkState != null
0279                                     color: collectionItem.collectionColor
0280                                     checked: model.checkState === 2
0281                                     onCheckedChanged: root.collectionCheckChanged()
0282                                     activeFocusOnTab: false
0283                                     onClicked: {
0284                                         model.checkState = model.checkState === 0 ? 2 : 0
0285                                         root.collectionCheckChanged()
0286                                     }
0287                                 }
0288                             }
0289 
0290                             onClicked: {
0291                                 collectionItem.model.checkState = collectionItem.checkState === 0 ? 2 : 0
0292                                 root.collectionCheckChanged()
0293                             }
0294                         }
0295                     }
0296                 }
0297             }
0298         }
0299     }
0300 }