main.qml 7.73 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 *  Copyright 2015 Marco Martin <mart@kde.org>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  2.010-1301, USA.
 */

import QtQuick 2.4
import QtQuick.Layouts 1.1
Marco Martin's avatar
Marco Martin committed
21
import QtQuick.Window 2.2
Marco Martin's avatar
Marco Martin committed
22
import QtGraphicalEffects 1.12
23

Marco Martin's avatar
Marco Martin committed
24
import org.kde.taskmanager 0.1 as TaskManager
25
26
27
28
29
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.kquickcontrolsaddons 2.0

30
31
import org.kde.plasma.private.nanoshell 2.0 as NanoShell

Marco Martin's avatar
Marco Martin committed
32
33
PlasmaCore.ColorScope {
    id: root
34
    width: 600
Marco Martin's avatar
Marco Martin committed
35
    height: 480
Marco Martin's avatar
Marco Martin committed
36
    colorGroup: showingApp ? PlasmaCore.Theme.NormalColorGroup : PlasmaCore.Theme.ComplementaryColorGroup
Marco Martin's avatar
Marco Martin committed
37

38
39
    Plasmoid.backgroundHints: PlasmaCore.Types.NoBackground

40
41
42
    readonly property bool showingApp: !plasmoid.nativeInterface.showDesktop && (hasTasks || NanoShell.StartupFeedback.visible)

    readonly property bool hasTasks: tasksModel.count > 0
43

44
45
46
    property QtObject taskSwitcher: taskSwitcherLoader.item ? taskSwitcherLoader.item : null
    Loader {
        id: taskSwitcherLoader
Marco Martin's avatar
Marco Martin committed
47
    }
48
49
50
51
    //FIXME: why it crashes on startup if TaskSwitcher is loaded immediately?
    Timer {
        running: true
        interval: 200
Marco Martin's avatar
Marco Martin committed
52
53
54
        onTriggered: {
            taskSwitcherLoader.setSource(Qt.resolvedUrl("TaskSwitcher.qml"), {"model": tasksModel});
        }
55
56
    }

57
58
59
60
61
    TaskManager.TasksModel {
        id: tasksModel
        groupMode: TaskManager.TasksModel.GroupDisabled

        screenGeometry: plasmoid.screenGeometry
62
63
64
65
66
67
68
69
70
71
72
        sortMode: TaskManager.TasksModel.SortAlpha

        virtualDesktop: virtualDesktopInfo.currentDesktop
        activity: activityInfo.currentActivity
        //FIXME: workaround
        Component.onCompleted: tasksModel.countChanged();
    }

    TaskManager.VirtualDesktopInfo {
        id: virtualDesktopInfo
    }
73

74
75
    TaskManager.ActivityInfo {
        id: activityInfo
76
77
    }

Marco Martin's avatar
Marco Martin committed
78
79
    MouseArea {
        id: mainMouseArea
Marco Martin's avatar
Marco Martin committed
80
        anchors.fill: parent
Marco Martin's avatar
Marco Martin committed
81
        property int oldMouseY: 0
Marco Martin's avatar
Marco Martin committed
82
83
        property int startMouseY: 0
        property bool isDragging: false
Marco Martin's avatar
Marco Martin committed
84
        property bool opening: false
Marco Martin's avatar
Marco Martin committed
85
        drag.filterChildren: true
Marco Martin's avatar
Marco Martin committed
86
87
        function managePressed(mouse) {
            startMouseY = oldMouseY = mouse.y;
Marco Martin's avatar
Marco Martin committed
88
89
            taskSwitcher.offset = -taskSwitcher.height
        }
Marco Martin's avatar
Marco Martin committed
90
        onPressed: managePressed(mouse);
Marco Martin's avatar
Marco Martin committed
91
        onPositionChanged: {
Marco Martin's avatar
Marco Martin committed
92
93
94
95
96
97
98
            if (!isDragging && Math.abs(startMouseY - oldMouseY) < root.height) {
                oldMouseY = mouse.y;
                return;
            } else {
                isDragging = true;
            }

Marco Martin's avatar
Marco Martin committed
99
            taskSwitcher.offset = taskSwitcher.offset - (mouse.y - oldMouseY);
Marco Martin's avatar
Marco Martin committed
100
            opening = oldMouseY > mouse.y;
Marco Martin's avatar
Marco Martin committed
101
            oldMouseY = mouse.y;
Marco Martin's avatar
Marco Martin committed
102
            if (taskSwitcher.visibility == Window.Hidden && taskSwitcher.offset > -taskSwitcher.height + units.gridUnit && taskSwitcher.tasksCount) {
103
                taskSwitcher.showFullScreen();
Marco Martin's avatar
Marco Martin committed
104
105
106
            }
        }
        onReleased: {
Marco Martin's avatar
Marco Martin committed
107
108
109
110
            if (!isDragging) {
                return;
            }

Marco Martin's avatar
Marco Martin committed
111
112
113
            if (taskSwitcher.visibility == Window.Hidden) {
                return;
            }
Marco Martin's avatar
Marco Martin committed
114
            if (opening) {
Marco Martin's avatar
Marco Martin committed
115
116
117
118
119
                taskSwitcher.show();
            } else {
                taskSwitcher.hide();
            }
        }
Marco Martin's avatar
Marco Martin committed
120

Marco Martin's avatar
Marco Martin committed
121
122
        DropShadow {
            anchors.fill: icons
Jonah Brüchert's avatar
Jonah Brüchert committed
123
            visible: !showingApp
Marco Martin's avatar
Marco Martin committed
124
            cached: true
Marco Martin's avatar
Marco Martin committed
125
126
127
128
129
130
131
            horizontalOffset: 0
            verticalOffset: 1
            radius: 4.0
            samples: 17
            color: Qt.rgba(0,0,0,0.8)
            source: icons
        }
132
        Item {
Marco Martin's avatar
Marco Martin committed
133
            id: icons
Marco Martin's avatar
Marco Martin committed
134
            anchors.fill: parent
Marco Martin's avatar
Marco Martin committed
135

136
            visible: plasmoid.configuration.PanelButtonsVisible
Marco Martin's avatar
Marco Martin committed
137
/*
138
139
140
            Rectangle {
                anchors.fill: parent
                color: root.backgroundColor
Marco Martin's avatar
Marco Martin committed
141
                opacity: showingApp ? 1 : 0
142
143
144
145
146
147
148
149
150
151
                Rectangle {
                    anchors {
                        left: parent.left
                        right: parent.right
                        top: parent.top
                    }
                    height: 1
                    color: PlasmaCore.ColorScope.textColor
                    opacity: 0.2
                }
Marco Martin's avatar
Marco Martin committed
152
153
154
155
156
157
158
159
160
161
            }*/
            Rectangle {
                anchors.fill: parent
                gradient: Gradient {
                    GradientStop {
                        position: 0
                        color: showingApp ? PlasmaCore.ColorScope.backgroundColor : "transparent"
                    }
                    GradientStop {
                        position: 1
Marco Martin's avatar
Marco Martin committed
162
                        color: showingApp ? PlasmaCore.ColorScope.backgroundColor : Qt.rgba(0, 0, 0, 0.05)
Marco Martin's avatar
Marco Martin committed
163
164
                    }
                }
165
            }
Marco Martin's avatar
Marco Martin committed
166

Marco Martin's avatar
Marco Martin committed
167
168
169
170
            Button {
                anchors.left: parent.left
                height: parent.height
                width: parent.width/3
171
                enabled: root.hasTasks
Ilya Bizyaev's avatar
Ilya Bizyaev committed
172
                iconSource: "box"
Marco Martin's avatar
Marco Martin committed
173
                onClicked: {
Marco Martin's avatar
Marco Martin committed
174
                    plasmoid.nativeInterface.showDesktop = false;
Marco Martin's avatar
Marco Martin committed
175
176
177
                    taskSwitcher.visible ? taskSwitcher.hide() : taskSwitcher.show();
                }
                onPressed: mainMouseArea.managePressed(mouse);
178
179
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
180
            }
Marco Martin's avatar
Marco Martin committed
181
182
183
184
185
186

            Button {
                id: showDesktopButton
                height: parent.height
                width: parent.width/3
                anchors.horizontalCenter: parent.horizontalCenter
Ilya Bizyaev's avatar
Ilya Bizyaev committed
187
                iconSource: "start-here-kde"
Aleix Pol Gonzalez's avatar
Aleix Pol Gonzalez committed
188
                enabled: taskSwitcher && taskSwitcher.tasksCount > 0
Marco Martin's avatar
Marco Martin committed
189
190
                checkable: true
                onCheckedChanged: {
Marco Martin's avatar
Marco Martin committed
191
192
                    taskSwitcher.hide();
                    plasmoid.nativeInterface.showDesktop = checked;
Marco Martin's avatar
Marco Martin committed
193
                }
Marco Martin's avatar
Marco Martin committed
194
                onPressed: mainMouseArea.managePressed(mouse);
195
196
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
197
198
199
200
201
202
203
204
                Connections {
                    target: root.taskSwitcher
                    onCurrentTaskIndexChanged: {
                        if (root.taskSwitcher.currentTaskIndex < 0) {
                            showDesktopButton.checked = false;
                        }
                    }
                }
205
            }
Marco Martin's avatar
Marco Martin committed
206

Marco Martin's avatar
Marco Martin committed
207
208
209
210
            Button {
                height: parent.height
                width: parent.width/3
                anchors.right: parent.right
Ilya Bizyaev's avatar
Ilya Bizyaev committed
211
                iconSource: "paint-none"
Marco Martin's avatar
Marco Martin committed
212
                //FIXME:Qt.UserRole+9 is IsWindow Qt.UserRole+15 is IsClosable. We can't reach that enum from QML
Marco Martin's avatar
Marco Martin committed
213
                enabled: plasmoid.nativeInterface.hasCloseableActiveWindow
Marco Martin's avatar
Marco Martin committed
214
215
216
217
218
219
                onClicked: {
                    var index = taskSwitcher.model.activeTask;
                    if (index) {
                        taskSwitcher.model.requestClose(index);
                    }
                }
Marco Martin's avatar
Marco Martin committed
220
                onPressed: mainMouseArea.managePressed(mouse);
221
222
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
223
            }
Marco Martin's avatar
Marco Martin committed
224
        }
225
    }
226
}