main.qml 7.5 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
        DropShadow {
            anchors.fill: icons
            visible: !showinApp
Marco Martin's avatar
Marco Martin committed
107
            cached: true
Marco Martin's avatar
Marco Martin committed
108 109 110 111 112 113 114
            horizontalOffset: 0
            verticalOffset: 1
            radius: 4.0
            samples: 17
            color: Qt.rgba(0,0,0,0.8)
            source: icons
        }
115
        Item {
Marco Martin's avatar
Marco Martin committed
116
            id: icons
Marco Martin's avatar
Marco Martin committed
117
            anchors.fill: parent
Marco Martin's avatar
Marco Martin committed
118

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

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

            Button {
                id: showDesktopButton
                height: parent.height
                width: parent.width/3
                anchors.horizontalCenter: parent.horizontalCenter
Ilya Bizyaev's avatar
Ilya Bizyaev committed
170
                iconSource: "start-here-kde"
Aleix Pol Gonzalez's avatar
Aleix Pol Gonzalez committed
171
                enabled: taskSwitcher && taskSwitcher.tasksCount > 0
Marco Martin's avatar
Marco Martin committed
172 173
                checkable: true
                onCheckedChanged: {
Marco Martin's avatar
Marco Martin committed
174 175
                    taskSwitcher.hide();
                    plasmoid.nativeInterface.showDesktop = checked;
Marco Martin's avatar
Marco Martin committed
176
                }
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 181 182 183 184 185 186 187
                Connections {
                    target: root.taskSwitcher
                    onCurrentTaskIndexChanged: {
                        if (root.taskSwitcher.currentTaskIndex < 0) {
                            showDesktopButton.checked = false;
                        }
                    }
                }
188
            }
Marco Martin's avatar
Marco Martin committed
189

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