main.qml 7.59 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
    readonly property bool showingApp: tasksModel.activeTask && tasksModel.activeTask.valid && !tasksModel.data(tasksModel.activeTask, TaskManager.AbstractTasksModel.IsFullScreen) || NanoShell.StartupFeedback.visible
41

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

53
54
55
56
57
58
59
60
61
62
    TaskManager.TasksModel {
        id: tasksModel
        sortMode: TaskManager.TasksModel.SortVirtualDesktop
        groupMode: TaskManager.TasksModel.GroupDisabled

        screenGeometry: plasmoid.screenGeometry
        filterByScreen: plasmoid.configuration.showForCurrentScreenOnly

    }

Marco Martin's avatar
Marco Martin committed
63
64
    MouseArea {
        id: mainMouseArea
Marco Martin's avatar
Marco Martin committed
65
        anchors.fill: parent
Marco Martin's avatar
Marco Martin committed
66
        property int oldMouseY: 0
Marco Martin's avatar
Marco Martin committed
67
68
        property int startMouseY: 0
        property bool isDragging: false
Marco Martin's avatar
Marco Martin committed
69
        drag.filterChildren: true
Marco Martin's avatar
Marco Martin committed
70
71
        function managePressed(mouse) {
            startMouseY = oldMouseY = mouse.y;
Marco Martin's avatar
Marco Martin committed
72
73
            taskSwitcher.offset = -taskSwitcher.height
        }
Marco Martin's avatar
Marco Martin committed
74
        onPressed: managePressed(mouse);
Marco Martin's avatar
Marco Martin committed
75
        onPositionChanged: {
Marco Martin's avatar
Marco Martin committed
76
77
78
79
80
81
82
            if (!isDragging && Math.abs(startMouseY - oldMouseY) < root.height) {
                oldMouseY = mouse.y;
                return;
            } else {
                isDragging = true;
            }

Marco Martin's avatar
Marco Martin committed
83
84
            taskSwitcher.offset = taskSwitcher.offset - (mouse.y - oldMouseY);
            oldMouseY = mouse.y;
Marco Martin's avatar
Marco Martin committed
85
86
            if (taskSwitcher.visibility == Window.Hidden && taskSwitcher.offset > -taskSwitcher.height + units.gridUnit && taskSwitcher.tasksCount) {
                taskSwitcher.visible = true;
Marco Martin's avatar
Marco Martin committed
87
88
89
            }
        }
        onReleased: {
Marco Martin's avatar
Marco Martin committed
90
91
92
93
            if (!isDragging) {
                return;
            }

Marco Martin's avatar
Marco Martin committed
94
95
96
97
            if (taskSwitcher.visibility == Window.Hidden) {
                return;
            }
            if (taskSwitcher.offset > -taskSwitcher.height/2) {
Marco Martin's avatar
Marco Martin committed
98
                taskSwitcher.currentTaskIndex = -1
Marco Martin's avatar
Marco Martin committed
99
100
101
                taskSwitcher.show();
            } else {
                taskSwitcher.hide();
102
                taskSwitcher.setSingleActiveWindow(taskSwitcher.currentTaskIndex);
Marco Martin's avatar
Marco Martin committed
103
104
            }
        }
Marco Martin's avatar
Marco Martin committed
105

Marco Martin's avatar
Marco Martin committed
106
107
        DropShadow {
            anchors.fill: icons
Jonah Brüchert's avatar
Jonah Brüchert committed
108
            visible: !showingApp
Marco Martin's avatar
Marco Martin committed
109
            cached: true
Marco Martin's avatar
Marco Martin committed
110
111
112
113
114
115
116
            horizontalOffset: 0
            verticalOffset: 1
            radius: 4.0
            samples: 17
            color: Qt.rgba(0,0,0,0.8)
            source: icons
        }
117
        Item {
Marco Martin's avatar
Marco Martin committed
118
            id: icons
Marco Martin's avatar
Marco Martin committed
119
            anchors.fill: parent
Marco Martin's avatar
Marco Martin committed
120

121
            visible: plasmoid.configuration.PanelButtonsVisible
Marco Martin's avatar
Marco Martin committed
122
/*
123
124
125
            Rectangle {
                anchors.fill: parent
                color: root.backgroundColor
Marco Martin's avatar
Marco Martin committed
126
                opacity: showingApp ? 1 : 0
127
128
129
130
131
132
133
134
135
136
                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
137
138
139
140
141
142
143
144
145
146
            }*/
            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
147
                        color: showingApp ? PlasmaCore.ColorScope.backgroundColor : Qt.rgba(0, 0, 0, 0.05)
Marco Martin's avatar
Marco Martin committed
148
149
                    }
                }
150
            }
Marco Martin's avatar
Marco Martin committed
151

Marco Martin's avatar
Marco Martin committed
152
153
154
155
            Button {
                anchors.left: parent.left
                height: parent.height
                width: parent.width/3
Aleix Pol Gonzalez's avatar
Aleix Pol Gonzalez committed
156
                enabled: taskSwitcher && taskSwitcher.tasksCount > 0;
Ilya Bizyaev's avatar
Ilya Bizyaev committed
157
                iconSource: "box"
Marco Martin's avatar
Marco Martin committed
158
                onClicked: {
Marco Martin's avatar
Marco Martin committed
159
                    plasmoid.nativeInterface.showDesktop = false;
Marco Martin's avatar
Marco Martin committed
160
161
162
                    taskSwitcher.visible ? taskSwitcher.hide() : taskSwitcher.show();
                }
                onPressed: mainMouseArea.managePressed(mouse);
163
164
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
165
            }
Marco Martin's avatar
Marco Martin committed
166
167
168
169
170
171

            Button {
                id: showDesktopButton
                height: parent.height
                width: parent.width/3
                anchors.horizontalCenter: parent.horizontalCenter
Ilya Bizyaev's avatar
Ilya Bizyaev committed
172
                iconSource: "start-here-kde"
Aleix Pol Gonzalez's avatar
Aleix Pol Gonzalez committed
173
                enabled: taskSwitcher && taskSwitcher.tasksCount > 0
Marco Martin's avatar
Marco Martin committed
174
175
                checkable: true
                onCheckedChanged: {
Marco Martin's avatar
Marco Martin committed
176
177
                    taskSwitcher.hide();
                    plasmoid.nativeInterface.showDesktop = checked;
Marco Martin's avatar
Marco Martin committed
178
                }
Marco Martin's avatar
Marco Martin committed
179
                onPressed: mainMouseArea.managePressed(mouse);
180
181
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
182
183
184
185
186
187
188
189
                Connections {
                    target: root.taskSwitcher
                    onCurrentTaskIndexChanged: {
                        if (root.taskSwitcher.currentTaskIndex < 0) {
                            showDesktopButton.checked = false;
                        }
                    }
                }
190
            }
Marco Martin's avatar
Marco Martin committed
191

Marco Martin's avatar
Marco Martin committed
192
193
194
195
            Button {
                height: parent.height
                width: parent.width/3
                anchors.right: parent.right
Ilya Bizyaev's avatar
Ilya Bizyaev committed
196
                iconSource: "paint-none"
Marco Martin's avatar
Marco Martin committed
197
                //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
198
                enabled: plasmoid.nativeInterface.hasCloseableActiveWindow
Marco Martin's avatar
Marco Martin committed
199
200
201
202
203
204
                onClicked: {
                    var index = taskSwitcher.model.activeTask;
                    if (index) {
                        taskSwitcher.model.requestClose(index);
                    }
                }
Marco Martin's avatar
Marco Martin committed
205
                onPressed: mainMouseArea.managePressed(mouse);
206
207
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
208
            }
Marco Martin's avatar
Marco Martin committed
209
        }
210
    }
211
}