summary refs log tree commit diff
path: root/resources/qml/dialogs/PowerLevelEditor.qml
diff options
context:
space:
mode:
Diffstat (limited to 'resources/qml/dialogs/PowerLevelEditor.qml')
-rw-r--r--resources/qml/dialogs/PowerLevelEditor.qml347
1 files changed, 347 insertions, 0 deletions
diff --git a/resources/qml/dialogs/PowerLevelEditor.qml b/resources/qml/dialogs/PowerLevelEditor.qml
new file mode 100644
index 00000000..241585f9
--- /dev/null
+++ b/resources/qml/dialogs/PowerLevelEditor.qml
@@ -0,0 +1,347 @@
+// SPDX-FileCopyrightText: 2022 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import ".."
+import "../components"
+import QtQuick 2.12
+import QtQuick.Controls 2.5
+import QtQuick.Layouts 1.3
+import im.nheko 1.0
+
+
+ApplicationWindow {
+    id: plEditorW
+
+    property var roomSettings
+    property var editingModel: Nheko.editPowerlevels(roomSettings.roomId)
+
+    modality: Qt.NonModal
+    flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
+    minimumWidth: 300
+    minimumHeight: 400
+
+    title: qsTr("Permissions in %1").arg(roomSettings.roomName);
+
+//    Shortcut {
+//        sequence: StandardKey.Cancel
+//        onActivated: dbb.rejected()
+//    }
+
+    ColumnLayout {
+        anchors.margins: Nheko.paddingMedium
+        anchors.fill: parent
+        spacing: 0
+
+
+        MatrixText {
+            text: qsTr("Be careful when editing permissions. You can't lower the permissions of people with a same or higher level than you. Be careful when promoting others.")
+            font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 1.1)
+            Layout.fillWidth: true
+            Layout.fillHeight: false
+            color: Nheko.colors.text
+            Layout.bottomMargin: Nheko.paddingMedium
+        }
+
+        TabBar {
+            id: bar
+            width: parent.width
+            palette: Nheko.colors
+
+            component TabB : TabButton {
+                id: control
+
+                contentItem: Text {
+                    text: control.text
+                    font: control.font
+                    opacity: enabled ? 1.0 : 0.3
+                    color: control.down ? Nheko.colors.highlightedText : Nheko.colors.text
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
+                    elide: Text.ElideRight
+                }
+
+                background: Rectangle {
+                    border.color: control.down ? Nheko.colors.highlight : Nheko.theme.separator
+                    color: control.checked ? Nheko.colors.highlight : Nheko.colors.base
+                    border.width: 1
+                    radius: 2
+                }
+            }
+            TabB {
+                text: qsTr("Roles")
+            }
+            TabB {
+                text: qsTr("Users")
+            }
+        }
+        Rectangle {
+            Layout.fillWidth: true
+            Layout.fillHeight: true
+            color: Nheko.colors.alternateBase
+            border.width: 1
+            border.color: Nheko.theme.separator
+
+            StackLayout {
+                anchors.fill: parent
+                anchors.margins: Nheko.paddingMedium
+                currentIndex: bar.currentIndex
+
+
+                ColumnLayout {
+                    spacing: Nheko.paddingMedium
+
+                    MatrixText {
+                        text: qsTr("Move permissions between roles to change them")
+                        font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 1.1)
+                        Layout.fillWidth: true
+                        Layout.fillHeight: false
+                        color: Nheko.colors.text
+                    }
+
+                    ReorderableListview {
+                        Layout.fillWidth: true
+                        Layout.fillHeight: true
+
+                        model: editingModel.types
+
+                        delegate: RowLayout {
+                            Column {
+                                Layout.fillWidth: true
+
+                                Text { visible: model.isType; text: model.displayName; color: Nheko.colors.text}
+                                Text {
+                                    visible: !model.isType;
+                                    text: {
+                                        if (editingModel.adminLevel == model.powerlevel)
+                                        return qsTr("Administrator (%1)").arg(model.powerlevel)
+                                        else if (editingModel.moderatorLevel == model.powerlevel)
+                                        return qsTr("Moderator (%1)").arg(model.powerlevel)
+                                        else
+                                        return qsTr("Custom (%1)").arg(model.powerlevel)
+                                    }
+                                    color: Nheko.colors.text
+                                }
+                            }
+
+                            ImageButton {
+                                Layout.alignment: Qt.AlignRight
+                                Layout.rightMargin: 2
+                                image: model.isType ? ":/icons/icons/ui/dismiss.svg" : ":/icons/icons/ui/add-square-button.svg" 
+                                visible: !model.isType || model.removeable
+                                hoverEnabled: true
+                                ToolTip.visible: hovered
+                                ToolTip.text: model.isType ? qsTr("Remove event type") : qsTr("Add event type")
+                                onClicked: {
+                                    if (model.isType) {
+                                        editingModel.types.remove(index);
+                                    } else {
+                                        typeEntry.y = offset
+                                        typeEntry.visible = true
+                                        typeEntry.index = index;
+                                        typeEntry.forceActiveFocus()
+                                    }
+                                }
+                            }
+                        }
+                            MatrixTextField {
+                                id: typeEntry
+
+                                property int index
+
+                                width: parent.width
+                                z: 5
+                                visible: false
+
+                                color: Nheko.colors.text
+
+                                Keys.onPressed: {
+                                    if (typeEntry.text.includes('.') && event.matches(StandardKey.InsertParagraphSeparator)) {
+                                        editingModel.types.add(typeEntry.index, typeEntry.text)
+                                        typeEntry.visible = false;
+                                        typeEntry.clear();
+                                        event.accepted = true;
+                                    }
+                                    else if (event.matches(StandardKey.Cancel)) {
+                                        typeEntry.visible = false;
+                                        typeEntry.clear();
+                                        event.accepted = true;
+                                    }
+                                }
+                            }
+                    }
+
+                }
+                ColumnLayout {
+                    spacing: Nheko.paddingMedium
+
+                    MatrixText {
+                        text: qsTr("Move users up or down to change their permissions")
+                        font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 1.1)
+                        Layout.fillWidth: true
+                        Layout.fillHeight: false
+                    }
+
+                    ReorderableListview {
+                        Layout.fillWidth: true
+                        Layout.fillHeight: true
+
+                        model: editingModel.users
+
+                            Column{
+                                id: userEntryCompleter
+
+                                property int index: 0
+
+                                visible: false
+
+                                width: parent.width
+                                spacing: 1
+                                z: 5
+                            MatrixTextField {
+                                id: userEntry
+
+                                width: parent.width
+                                //font.pixelSize: Math.ceil(quickSwitcher.textHeight * 0.6)
+                                color: Nheko.colors.text
+                                onTextEdited: {
+                                    userCompleter.completer.searchString = text;
+                                }
+                                Keys.onPressed: {
+                                    if (event.key == Qt.Key_Up || event.key == Qt.Key_Backtab) {
+                                        event.accepted = true;
+                                        userCompleter.up();
+                                    } else if (event.key == Qt.Key_Down || event.key == Qt.Key_Tab) {
+                                        event.accepted = true;
+                                        if (event.key == Qt.Key_Tab && (event.modifiers & Qt.ShiftModifier))
+                                        userCompleter.up();
+                                        else
+                                        userCompleter.down();
+                                    } else if (event.matches(StandardKey.InsertParagraphSeparator)) {
+                                        userCompleter.finishCompletion();
+                                        event.accepted = true;
+                                    } else if (event.matches(StandardKey.Cancel)) {
+                                        typeEntry.visible = false;
+                                        typeEntry.clear();
+                                        event.accepted = true;
+                                    }
+                                }
+                            }
+
+
+                                Completer {
+                                    id: userCompleter
+
+                                    visible: userEntry.text.length > 0
+                                    width: parent.width
+                                    roomId: plEditorW.roomSettings.roomId
+                                    completerName: "user"
+                                    bottomToTop: false
+                                    fullWidth: true
+                                    avatarHeight: Nheko.avatarSize / 2
+                                    avatarWidth: Nheko.avatarSize / 2
+                                    centerRowContent: false
+                                    rowMargin: 2
+                                    rowSpacing: 2
+                                }
+                            }
+
+                            Connections {
+                                function onCompletionSelected(id) {
+                                    console.log("selected: " + id);
+                                    editingModel.users.add(userEntryCompleter.index, id);
+                                    userEntry.clear();
+                                    userEntryCompleter.visible = false;
+                                }
+
+                                function onCountChanged() {
+                                    if (userCompleter.count > 0 && (userCompleter.currentIndex < 0 || userCompleter.currentIndex >= userCompleter.count))
+                                    userCompleter.currentIndex = 0;
+
+                                }
+
+                                target: userCompleter
+                            }
+
+                            delegate: RowLayout {
+                                //anchors { fill: parent; margins: 2 }
+                                id: row
+
+                                Avatar {
+                                    id: avatar
+
+                                    Layout.preferredHeight: Nheko.avatarSize / 2
+                                    Layout.preferredWidth: Nheko.avatarSize / 2
+                                    Layout.leftMargin: 2
+                                    userid: model.mxid
+                                    url: {
+                                        if (model.isUser)
+                                        return model.avatarUrl.replace("mxc://", "image://MxcImage/")
+                                        else if (editingModel.adminLevel >= model.powerlevel)
+                                        return "image://colorimage/:/icons/icons/ui/ribbon_star.svg?" + Nheko.colors.buttonText;
+                                        else if (editingModel.moderatorLevel >= model.powerlevel)
+                                        return "image://colorimage/:/icons/icons/ui/ribbon.svg?" + Nheko.colors.buttonText;
+                                        else
+                                        return "image://colorimage/:/icons/icons/ui/person.svg?" + Nheko.colors.buttonText;
+                                    }
+                                    displayName: model.displayName
+                                    enabled: false
+                                }
+                                Column {
+                                    Layout.fillWidth: true
+
+                                    Text { visible: model.isUser; text: model.displayName; color: Nheko.colors.text}
+                                    Text { visible: model.isUser; text: model.mxid; color: Nheko.colors.text}
+                                    Text {
+                                        visible: !model.isUser;
+                                        text: {
+                                            if (editingModel.adminLevel == model.powerlevel)
+                                            return qsTr("Administrator (%1)").arg(model.powerlevel)
+                                            else if (editingModel.moderatorLevel == model.powerlevel)
+                                            return qsTr("Moderator (%1)").arg(model.powerlevel)
+                                            else
+                                            return qsTr("Custom (%1)").arg(model.powerlevel)
+                                        }
+                                        color: Nheko.colors.text
+                                    }
+                                }
+
+                                ImageButton {
+                                    Layout.alignment: Qt.AlignRight
+                                    Layout.rightMargin: 2
+                                    image: model.isUser ? ":/icons/icons/ui/dismiss.svg" : ":/icons/icons/ui/add-square-button.svg" 
+                                    visible: !model.isUser || model.removeable
+                                    hoverEnabled: true
+                                    ToolTip.visible: hovered
+                                    ToolTip.text: model.isUser ? qsTr("Remove user") : qsTr("Add user")
+                                    onClicked: {
+                                        if (model.isUser) {
+                                            editingModel.users.remove(index);
+                                        } else {
+                                            userEntryCompleter.y = offset
+                                            userEntryCompleter.visible = true
+                                            userEntryCompleter.index = index;
+                                            userEntry.forceActiveFocus()
+                                        }
+                                    }
+                                }
+                            }
+                        }
+
+                    }
+                }
+            }
+        }
+
+        footer: DialogButtonBox {
+            id: dbb
+
+            standardButtons: DialogButtonBox.Ok | DialogButtonBox.Cancel
+            onAccepted: {
+                editingModel.commit();
+                plEditorW.close();
+            }
+            onRejected: plEditorW.close();
+        }
+
+    }