main.qml 5.48 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 23 24 25 26 27

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
28 29
PlasmaCore.ColorScope {
    id: root
30
    width: 600
Marco Martin's avatar
Marco Martin committed
31 32 33
    height: 480
    colorGroup: PlasmaCore.Theme.ComplementaryColorGroup

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

Marco Martin's avatar
Marco Martin committed
46 47
    MouseArea {
        id: mainMouseArea
Marco Martin's avatar
Marco Martin committed
48
        anchors.fill: parent
Marco Martin's avatar
Marco Martin committed
49
        property int oldMouseY: 0
Marco Martin's avatar
Marco Martin committed
50 51
        property int startMouseY: 0
        property bool isDragging: false
Marco Martin's avatar
Marco Martin committed
52
        drag.filterChildren: true
Marco Martin's avatar
Marco Martin committed
53 54
        function managePressed(mouse) {
            startMouseY = oldMouseY = mouse.y;
Marco Martin's avatar
Marco Martin committed
55 56
            taskSwitcher.offset = -taskSwitcher.height
        }
Marco Martin's avatar
Marco Martin committed
57
        onPressed: managePressed();
Marco Martin's avatar
Marco Martin committed
58
        onPositionChanged: {
Marco Martin's avatar
Marco Martin committed
59 60 61 62 63 64 65
            if (!isDragging && Math.abs(startMouseY - oldMouseY) < root.height) {
                oldMouseY = mouse.y;
                return;
            } else {
                isDragging = true;
            }

Marco Martin's avatar
Marco Martin committed
66 67
            taskSwitcher.offset = taskSwitcher.offset - (mouse.y - oldMouseY);
            oldMouseY = mouse.y;
Marco Martin's avatar
Marco Martin committed
68 69
            if (taskSwitcher.visibility == Window.Hidden && taskSwitcher.offset > -taskSwitcher.height + units.gridUnit && taskSwitcher.tasksCount) {
                taskSwitcher.visible = true;
Marco Martin's avatar
Marco Martin committed
70
            }
71
            taskSwitcher.setSingleActiveWindow(-1);
Marco Martin's avatar
Marco Martin committed
72 73
        }
        onReleased: {
Marco Martin's avatar
Marco Martin committed
74 75 76 77
            if (!isDragging) {
                return;
            }

Marco Martin's avatar
Marco Martin committed
78 79 80 81
            if (taskSwitcher.visibility == Window.Hidden) {
                return;
            }
            if (taskSwitcher.offset > -taskSwitcher.height/2) {
Marco Martin's avatar
Marco Martin committed
82
                taskSwitcher.currentTaskIndex = -1
Marco Martin's avatar
Marco Martin committed
83 84 85
                taskSwitcher.show();
            } else {
                taskSwitcher.hide();
86
                taskSwitcher.setSingleActiveWindow(taskSwitcher.currentTaskIndex);
Marco Martin's avatar
Marco Martin committed
87 88
            }
        }
Marco Martin's avatar
Marco Martin committed
89

Marco Martin's avatar
Marco Martin committed
90 91 92
        Rectangle {
            anchors.fill: parent
            color: root.backgroundColor
Marco Martin's avatar
Marco Martin committed
93

Marco Martin's avatar
Marco Martin committed
94 95
            width: 600
            height: 40
Marco Martin's avatar
Marco Martin committed
96

Marco Martin's avatar
Marco Martin committed
97
            property Item toolBox
Marco Martin's avatar
Marco Martin committed
98

Marco Martin's avatar
Marco Martin committed
99 100 101 102
            Button {
                anchors.left: parent.left
                height: parent.height
                width: parent.width/3
103
                enabled: taskSwitcher.tasksCount > 0;
104
                iconSource: "window-list"
Marco Martin's avatar
Marco Martin committed
105 106 107 108 109
                onClicked: {
                    taskSwitcher.currentTaskIndex = -1;
                    taskSwitcher.visible ? taskSwitcher.hide() : taskSwitcher.show();
                }
                onPressed: mainMouseArea.managePressed(mouse);
110 111
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
112
            }
Marco Martin's avatar
Marco Martin committed
113 114 115 116 117 118 119

            Button {
                id: showDesktopButton
                height: parent.height
                width: parent.width/3
                anchors.horizontalCenter: parent.horizontalCenter
                iconSource: "go-home"
Marco Martin's avatar
Marco Martin committed
120 121 122 123 124 125 126 127
                enabled: taskSwitcher.tasksCount > 0
                checkable: true
                onCheckedChanged: {
                    if (checked) {
                        root.taskSwitcher.setSingleActiveWindow(-1);
                    } else {
                        root.taskSwitcher.setSingleActiveWindow(root.taskSwitcher.currentTaskIndex);
                    }
Marco Martin's avatar
Marco Martin committed
128
                }
Marco Martin's avatar
Marco Martin committed
129
                onPressed: mainMouseArea.managePressed(mouse);
130 131
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
132 133 134 135 136 137 138 139
                Connections {
                    target: root.taskSwitcher
                    onCurrentTaskIndexChanged: {
                        if (root.taskSwitcher.currentTaskIndex < 0) {
                            showDesktopButton.checked = false;
                        }
                    }
                }
140
            }
Marco Martin's avatar
Marco Martin committed
141

Marco Martin's avatar
Marco Martin committed
142 143 144 145 146 147 148
            Button {
                height: parent.height
                width: parent.width/3
                anchors.right: parent.right
                iconSource: "window-close"
                enabled: plasmoid.nativeInterface.hasCloseableActiveWindow;
                onClicked: plasmoid.nativeInterface.closeActiveWindow();
Marco Martin's avatar
Marco Martin committed
149
                onPressed: mainMouseArea.managePressed(mouse);
150 151
                onPositionChanged: mainMouseArea.positionChanged(mouse);
                onReleased: mainMouseArea.released(mouse);
Marco Martin's avatar
Marco Martin committed
152
            }
Marco Martin's avatar
Marco Martin committed
153
        }
154
    }
155
}