main.qml 6.57 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
22

Marco Martin's avatar
Marco Martin committed
23
import org.kde.taskmanager 0.1 as TaskManager
24
25
26
27
28
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
29
30
PlasmaCore.ColorScope {
    id: root
31
    width: 600
Marco Martin's avatar
Marco Martin committed
32
    height: 480
33
    //colorGroup: PlasmaCore.Theme.ComplementaryColorGroup
Marco Martin's avatar
Marco Martin committed
34

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

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

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

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

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

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

103
        Item {
Marco Martin's avatar
Marco Martin committed
104
            anchors.fill: parent
Marco Martin's avatar
Marco Martin committed
105

106
            visible: plasmoid.configuration.PanelButtonsVisible
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122

            Rectangle {
                anchors.fill: parent
                color: root.backgroundColor
                opacity: showingApp ? 1 : 0.9
                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
123

Marco Martin's avatar
Marco Martin committed
124
125
126
127
            Button {
                anchors.left: parent.left
                height: parent.height
                width: parent.width/3
128
                enabled: taskSwitcher.tasksCount > 0;
Ilya Bizyaev's avatar
Ilya Bizyaev committed
129
                iconSource: "box"
Marco Martin's avatar
Marco Martin committed
130
                onClicked: {
Marco Martin's avatar
Marco Martin committed
131
                    plasmoid.nativeInterface.showDesktop = false;
Marco Martin's avatar
Marco Martin committed
132
133
134
                    taskSwitcher.visible ? taskSwitcher.hide() : taskSwitcher.show();
                }
                onPressed: mainMouseArea.managePressed(mouse);
135
136
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
137
            }
Marco Martin's avatar
Marco Martin committed
138
139
140
141
142
143

            Button {
                id: showDesktopButton
                height: parent.height
                width: parent.width/3
                anchors.horizontalCenter: parent.horizontalCenter
Ilya Bizyaev's avatar
Ilya Bizyaev committed
144
                iconSource: "start-here-kde"
Marco Martin's avatar
Marco Martin committed
145
146
147
                enabled: taskSwitcher.tasksCount > 0
                checkable: true
                onCheckedChanged: {
Marco Martin's avatar
Marco Martin committed
148
149
                    taskSwitcher.hide();
                    plasmoid.nativeInterface.showDesktop = checked;
Marco Martin's avatar
Marco Martin committed
150
                }
Marco Martin's avatar
Marco Martin committed
151
                onPressed: mainMouseArea.managePressed(mouse);
152
153
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
154
155
156
157
158
159
160
161
                Connections {
                    target: root.taskSwitcher
                    onCurrentTaskIndexChanged: {
                        if (root.taskSwitcher.currentTaskIndex < 0) {
                            showDesktopButton.checked = false;
                        }
                    }
                }
162
            }
Marco Martin's avatar
Marco Martin committed
163

Marco Martin's avatar
Marco Martin committed
164
165
166
167
            Button {
                height: parent.height
                width: parent.width/3
                anchors.right: parent.right
Ilya Bizyaev's avatar
Ilya Bizyaev committed
168
                iconSource: "paint-none"
Marco Martin's avatar
Marco Martin committed
169
                //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
170
                enabled: plasmoid.nativeInterface.hasCloseableActiveWindow
Marco Martin's avatar
Marco Martin committed
171
172
173
174
175
176
                onClicked: {
                    var index = taskSwitcher.model.activeTask;
                    if (index) {
                        taskSwitcher.model.requestClose(index);
                    }
                }
Marco Martin's avatar
Marco Martin committed
177
                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
}