main.qml 7.47 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

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

36
37
38
    Plasmoid.backgroundHints: PlasmaCore.Types.NoBackground

    readonly property bool showingApp: tasksModel.activeTask && tasksModel.activeTask.valid && !tasksModel.data(tasksModel.activeTask, TaskManager.AbstractTasksModel.IsFullScreen)
39

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

51
52
53
54
55
56
57
58
59
60
    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
61
62
    MouseArea {
        id: mainMouseArea
Marco Martin's avatar
Marco Martin committed
63
        anchors.fill: parent
Marco Martin's avatar
Marco Martin committed
64
        property int oldMouseY: 0
Marco Martin's avatar
Marco Martin committed
65
66
        property int startMouseY: 0
        property bool isDragging: false
Marco Martin's avatar
Marco Martin committed
67
        drag.filterChildren: true
Marco Martin's avatar
Marco Martin committed
68
69
        function managePressed(mouse) {
            startMouseY = oldMouseY = mouse.y;
Marco Martin's avatar
Marco Martin committed
70
71
            taskSwitcher.offset = -taskSwitcher.height
        }
Marco Martin's avatar
Marco Martin committed
72
        onPressed: managePressed(mouse);
Marco Martin's avatar
Marco Martin committed
73
        onPositionChanged: {
Marco Martin's avatar
Marco Martin committed
74
75
76
77
78
79
80
            if (!isDragging && Math.abs(startMouseY - oldMouseY) < root.height) {
                oldMouseY = mouse.y;
                return;
            } else {
                isDragging = true;
            }

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

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

Marco Martin's avatar
Marco Martin committed
104
105
106
107
108
109
110
111
112
113
        DropShadow {
            anchors.fill: icons
            visible: !showinApp
            horizontalOffset: 0
            verticalOffset: 1
            radius: 4.0
            samples: 17
            color: Qt.rgba(0,0,0,0.8)
            source: icons
        }
114
        Item {
Marco Martin's avatar
Marco Martin committed
115
            id: icons
Marco Martin's avatar
Marco Martin committed
116
            anchors.fill: parent
Marco Martin's avatar
Marco Martin committed
117

118
            visible: plasmoid.configuration.PanelButtonsVisible
Marco Martin's avatar
Marco Martin committed
119
/*
120
121
122
            Rectangle {
                anchors.fill: parent
                color: root.backgroundColor
Marco Martin's avatar
Marco Martin committed
123
                opacity: showingApp ? 1 : 0
124
125
126
127
128
129
130
131
132
133
                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
134
135
136
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
                        color: showingApp ? PlasmaCore.ColorScope.backgroundColor : Qt.rgba(0, 0, 0, 0.2)
                    }
                }
147
            }
Marco Martin's avatar
Marco Martin committed
148

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

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

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