summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/dms/Widgets/AppLauncherListDelegate.qml
blob: 281ad60d13c34be3894eef18456056d67a1bbdce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import QtQuick
import qs.Common
import qs.Widgets

Rectangle {
    id: root

    LayoutMirroring.enabled: I18n.isRtl
    LayoutMirroring.childrenInherit: true

    required property var model
    required property int index
    required property var listView
    property int itemHeight: 60
    property int iconSize: 40
    property bool showDescription: true
    property bool hoverUpdatesSelection: true
    property bool keyboardNavigationActive: false
    property bool isCurrentItem: false
    property bool isPlugin: model?.isPlugin || false
    property real mouseAreaLeftMargin: 0
    property real mouseAreaRightMargin: 0
    property real mouseAreaBottomMargin: 0
    property real iconMargins: 0
    property real iconFallbackLeftMargin: 0
    property real iconFallbackRightMargin: 0
    property real iconFallbackBottomMargin: 0
    property real iconMaterialSizeAdjustment: Theme.spacingM
    property real iconUnicodeScale: 0.7

    signal itemClicked(int index, var modelData)
    signal itemRightClicked(int index, var modelData, real mouseX, real mouseY)
    signal keyboardNavigationReset

    width: listView.width
    height: itemHeight
    radius: Theme.cornerRadius
    color: isCurrentItem ? Theme.primaryPressed : mouseArea.containsMouse ? Theme.primaryPressed : "transparent"

    Row {
        anchors.fill: parent
        anchors.margins: Theme.spacingM
        spacing: Theme.spacingL

        AppIconRenderer {
            width: root.iconSize
            height: root.iconSize
            anchors.verticalCenter: parent.verticalCenter
            iconValue: (model.icon && model.icon !== "") ? model.icon : ""
            iconSize: root.iconSize
            fallbackText: (model.name && model.name.length > 0) ? model.name.charAt(0).toUpperCase() : "A"
            iconMargins: root.iconMargins
            fallbackLeftMargin: root.iconFallbackLeftMargin
            fallbackRightMargin: root.iconFallbackRightMargin
            fallbackBottomMargin: root.iconFallbackBottomMargin
            materialIconSizeAdjustment: root.iconMaterialSizeAdjustment
            unicodeIconScale: root.iconUnicodeScale
        }

        Column {
            anchors.verticalCenter: parent.verticalCenter
            width: (model.icon !== undefined && model.icon !== "") ? (parent.width - root.iconSize - Theme.spacingL) : parent.width
            spacing: Theme.spacingXS

            Row {
                width: parent.width
                spacing: Theme.spacingXS

                StyledText {
                    width: parent.width - (pinIcon.visible ? pinIcon.width + Theme.spacingXS : 0)
                    text: model.name || ""
                    font.pixelSize: Theme.fontSizeLarge
                    color: Theme.surfaceText
                    font.weight: Font.Medium
                    elide: Text.ElideRight
                    horizontalAlignment: Text.AlignLeft
                    wrapMode: Text.NoWrap
                    maximumLineCount: 1
                    anchors.verticalCenter: parent.verticalCenter
                }

                DankIcon {
                    id: pinIcon
                    visible: model.pinned === true
                    name: "push_pin"
                    size: Theme.fontSizeMedium
                    color: Theme.primary
                    anchors.verticalCenter: parent.verticalCenter
                }
            }

            StyledText {
                width: parent.width
                text: model.comment || "Application"
                font.pixelSize: Theme.fontSizeMedium
                color: Theme.surfaceVariantText
                elide: Text.ElideRight
                horizontalAlignment: Text.AlignLeft
                maximumLineCount: 1
                visible: root.showDescription && model.comment && model.comment.length > 0
            }
        }
    }

    MouseArea {
        id: mouseArea

        anchors.fill: parent
        anchors.leftMargin: root.mouseAreaLeftMargin
        anchors.rightMargin: root.mouseAreaRightMargin
        anchors.bottomMargin: root.mouseAreaBottomMargin
        hoverEnabled: true
        cursorShape: Qt.PointingHandCursor
        acceptedButtons: Qt.LeftButton | Qt.RightButton
        z: 10
        onEntered: {
            if (root.hoverUpdatesSelection && !root.keyboardNavigationActive)
                root.listView.currentIndex = root.index;
        }
        onPositionChanged: {
            root.keyboardNavigationReset();
        }
        onClicked: mouse => {
            if (mouse.button === Qt.LeftButton) {
                root.itemClicked(root.index, root.model);
            }
        }
        onPressAndHold: mouse => {
            const globalPos = mapToItem(null, mouse.x, mouse.y);
            root.itemRightClicked(root.index, root.model, globalPos.x, globalPos.y);
        }
        onPressed: mouse => {
            if (mouse.button === Qt.RightButton) {
                const globalPos = mapToItem(null, mouse.x, mouse.y);
                root.itemRightClicked(root.index, root.model, globalPos.x, globalPos.y);
                mouse.accepted = true;
            }
        }
    }
}