Skip to content
Snippets Groups Projects
CommunitiesList.qml 6.16 KiB
Newer Older
Nicolas Werner's avatar
Nicolas Werner committed
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

import "./dialogs"
import Qt.labs.platform 1.1 as Platform
import QtQml 2.12
import QtQuick 2.12
import QtQuick.Controls 2.5
Nicolas Werner's avatar
Nicolas Werner committed
import QtQuick.Layouts 1.3
import im.nheko 1.0

Page {
    id: communitySidebar
Nicolas Werner's avatar
Nicolas Werner committed
    //leftPadding: Nheko.paddingSmall
    //rightPadding: Nheko.paddingSmall
    property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 1.6)
    property bool collapsed: false

    ListView {
        id: communitiesList

        anchors.left: parent.left
        anchors.right: parent.right
        height: parent.height
        model: Communities.filtered()
Nicolas Werner's avatar
Nicolas Werner committed

        ScrollHelper {
            flickable: parent
            anchors.fill: parent
            enabled: !Settings.mobileMode
        }

        Platform.Menu {
            id: communityContextMenu

Nicolas Werner's avatar
Nicolas Werner committed
            property string tagId
Nicolas Werner's avatar
Nicolas Werner committed

            function show(id_, tags_) {
Nicolas Werner's avatar
Nicolas Werner committed
                tagId = id_;
Nicolas Werner's avatar
Nicolas Werner committed
                open();
            }

            Platform.MenuItem {
Nicolas Werner's avatar
Nicolas Werner committed
                text: qsTr("Hide rooms with this tag or from this space by default.")
                onTriggered: Communities.toggleTagId(communityContextMenu.tagId)
        delegate: ItemDelegate {
Nicolas Werner's avatar
Nicolas Werner committed
            id: communityItem

            property color backgroundColor: Nheko.colors.window
Nicolas Werner's avatar
Nicolas Werner committed
            property color importantText: Nheko.colors.text
            property color unimportantText: Nheko.colors.buttonText
            property color bubbleBackground: Nheko.colors.highlight
            property color bubbleText: Nheko.colors.highlightedText

            height: avatarSize + 2 * Nheko.paddingMedium
            width: ListView.view.width
            state: "normal"
            ToolTip.visible: hovered && collapsed
Nicolas Werner's avatar
Nicolas Werner committed
            ToolTip.text: model.tooltip
Nicolas Werner's avatar
Nicolas Werner committed
            onClicked: Communities.setCurrentTagId(model.id)
            onPressAndHold: communityContextMenu.show(model.id)
Nicolas Werner's avatar
Nicolas Werner committed
            states: [
                State {
                    name: "highlight"
                    when: (communityItem.hovered || model.hidden) && !(Communities.currentTagId == model.id)
Nicolas Werner's avatar
Nicolas Werner committed

                    PropertyChanges {
                        target: communityItem
                        backgroundColor: Nheko.colors.dark
Nicolas Werner's avatar
Nicolas Werner committed
                        importantText: Nheko.colors.brightText
                        unimportantText: Nheko.colors.brightText
                        bubbleBackground: Nheko.colors.highlight
                        bubbleText: Nheko.colors.highlightedText
                    }

                },
                State {
                    name: "selected"
                    when: Communities.currentTagId == model.id

                    PropertyChanges {
                        target: communityItem
                        backgroundColor: Nheko.colors.highlight
Nicolas Werner's avatar
Nicolas Werner committed
                        importantText: Nheko.colors.highlightedText
                        unimportantText: Nheko.colors.highlightedText
                        bubbleBackground: Nheko.colors.highlightedText
                        bubbleText: Nheko.colors.highlight
                    }

                }
            ]

            Item {
                anchors.fill: parent
                TapHandler {
                    acceptedButtons: Qt.RightButton
                    onSingleTapped: communityContextMenu.show(model.id)
                    gesturePolicy: TapHandler.ReleaseWithinBounds
                    acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus | PointerDevice.TouchPad
                }
Nicolas Werner's avatar
Nicolas Werner committed
                spacing: Nheko.paddingMedium
                anchors.fill: parent
                anchors.margins: Nheko.paddingMedium
Nicolas Werner's avatar
Nicolas Werner committed
                anchors.leftMargin: Nheko.paddingMedium + (communitySidebar.collapsed ? 0 : (fontMetrics.lineSpacing * model.depth))

                ImageButton {
                    visible: !communitySidebar.collapsed && model.collapsible
                    Layout.preferredHeight: fontMetrics.lineSpacing
                    Layout.preferredWidth: fontMetrics.lineSpacing
                    Layout.alignment: Qt.AlignVCenter
                    height: fontMetrics.lineSpacing
                    width: fontMetrics.lineSpacing
                    image: model.collapsed ? ":/icons/icons/ui/collapsed.svg" : ":/icons/icons/ui/expanded.svg"
                    ToolTip.visible: hovered
                    ToolTip.text: model.collapsed ? qsTr("Expand") : qsTr("Collapse")
                    hoverEnabled: true

                    onClicked: model.collapsed = !model.collapsed
                }

                Item {
                    Layout.preferredWidth: fontMetrics.lineSpacing
                    visible: !communitySidebar.collapsed && !model.collapsible
                }
Nicolas Werner's avatar
Nicolas Werner committed

                Avatar {
                    id: avatar

                    enabled: false
                    Layout.alignment: Qt.AlignVCenter
                    height: avatarSize
                    width: avatarSize
                    url: {
Nicolas Werner's avatar
Nicolas Werner committed
                        if (model.avatarUrl.startsWith("mxc://"))
                            return model.avatarUrl.replace("mxc://", "image://MxcImage/");
                        else
                            return "image://colorimage/" + model.avatarUrl + "?" + communityItem.unimportantText;
                    roomid: model.id
Nicolas Werner's avatar
Nicolas Werner committed
                    displayName: model.displayName
                    color: communityItem.backgroundColor
Nicolas Werner's avatar
Nicolas Werner committed
                }

                ElidedLabel {
                    visible: !communitySidebar.collapsed
Nicolas Werner's avatar
Nicolas Werner committed
                    Layout.alignment: Qt.AlignVCenter
                    color: communityItem.importantText
Nicolas Werner's avatar
Nicolas Werner committed
                    Layout.fillWidth: true
                    elideWidth: width
Nicolas Werner's avatar
Nicolas Werner committed
                    fullText: model.displayName
                    textFormat: Text.PlainText
                }
Nicolas Werner's avatar
Nicolas Werner committed
                Item {
                    Layout.fillWidth: true
Nicolas Werner's avatar
Nicolas Werner committed
            background: Rectangle {
                color: backgroundColor
            }

Nicolas Werner's avatar
Nicolas Werner committed
        }

    }

    background: Rectangle {
        color: Nheko.theme.sidebarBackground
    }

}