main.qml 7.84 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
52
53
54
    //FIXME: why it crashes on startup if TaskSwitcher is loaded immediately?
    Timer {
        running: true
        interval: 200
        onTriggered: taskSwitcherLoader.source = Qt.resolvedUrl("TaskSwitcher.qml")
    }

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

        screenGeometry: plasmoid.screenGeometry
        filterByScreen: plasmoid.configuration.showForCurrentScreenOnly
61
62
63
64
65
66
67
68
69
70
71
        sortMode: TaskManager.TasksModel.SortAlpha

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

    TaskManager.VirtualDesktopInfo {
        id: virtualDesktopInfo
    }
72

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

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

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

Marco Martin's avatar
Marco Martin committed
108
109
110
111
            if (taskSwitcher.visibility == Window.Hidden) {
                return;
            }
            if (taskSwitcher.offset > -taskSwitcher.height/2) {
Marco Martin's avatar
Marco Martin committed
112
                taskSwitcher.currentTaskIndex = -1
Marco Martin's avatar
Marco Martin committed
113
114
115
                taskSwitcher.show();
            } else {
                taskSwitcher.hide();
116
                taskSwitcher.setSingleActiveWindow(taskSwitcher.currentTaskIndex);
Marco Martin's avatar
Marco Martin committed
117
118
            }
        }
Marco Martin's avatar
Marco Martin committed
119

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

135
            visible: plasmoid.configuration.PanelButtonsVisible
Marco Martin's avatar
Marco Martin committed
136
/*
137
138
139
            Rectangle {
                anchors.fill: parent
                color: root.backgroundColor
Marco Martin's avatar
Marco Martin committed
140
                opacity: showingApp ? 1 : 0
141
142
143
144
145
146
147
148
149
150
                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
151
152
153
154
155
156
157
158
159
160
            }*/
            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
161
                        color: showingApp ? PlasmaCore.ColorScope.backgroundColor : Qt.rgba(0, 0, 0, 0.05)
Marco Martin's avatar
Marco Martin committed
162
163
                    }
                }
164
            }
Marco Martin's avatar
Marco Martin committed
165

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

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

Marco Martin's avatar
Marco Martin committed
206
207
208
209
            Button {
                height: parent.height
                width: parent.width/3
                anchors.right: parent.right
Ilya Bizyaev's avatar
Ilya Bizyaev committed
210
                iconSource: "paint-none"
Marco Martin's avatar
Marco Martin committed
211
                //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
212
                enabled: plasmoid.nativeInterface.hasCloseableActiveWindow
Marco Martin's avatar
Marco Martin committed
213
214
215
216
217
218
                onClicked: {
                    var index = taskSwitcher.model.activeTask;
                    if (index) {
                        taskSwitcher.model.requestClose(index);
                    }
                }
Marco Martin's avatar
Marco Martin committed
219
                onPressed: mainMouseArea.managePressed(mouse);
220
221
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
222
            }
Marco Martin's avatar
Marco Martin committed
223
        }
224
    }
225
}