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
}