shift-shell/containments/taskpanel/package/contents/ui/main.qml

246 lines
8.4 KiB
QML
Raw Normal View History

/*
* 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
import QtQuick.Window 2.2
2020-02-05 19:25:52 +00:00
import QtGraphicalEffects 1.12
import org.kde.taskmanager 0.1 as TaskManager
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
import org.kde.plasma.private.nanoshell 2.0 as NanoShell
2015-06-18 23:31:26 +00:00
PlasmaCore.ColorScope {
id: root
width: 600
2015-06-18 23:31:26 +00:00
height: 480
2020-02-05 19:25:52 +00:00
colorGroup: showingApp ? PlasmaCore.Theme.NormalColorGroup : PlasmaCore.Theme.ComplementaryColorGroup
2015-06-18 23:31:26 +00:00
Plasmoid.backgroundHints: PlasmaCore.Types.NoBackground
readonly property bool showingApp: !plasmoid.nativeInterface.showDesktop && (hasTasks || NanoShell.StartupFeedback.visible)
readonly property bool hasTasks: tasksModel.count > 0
property QtObject taskSwitcher: taskSwitcherLoader.item ? taskSwitcherLoader.item : null
Loader {
id: taskSwitcherLoader
2015-06-18 23:31:26 +00:00
}
//FIXME: why it crashes on startup if TaskSwitcher is loaded immediately?
Timer {
running: true
interval: 200
2020-07-17 12:13:35 +00:00
onTriggered: {
taskSwitcherLoader.setSource(Qt.resolvedUrl("TaskSwitcher.qml"), {"model": tasksModel});
}
}
function minimizeAll() {
for (var i = 0 ; i < tasksModel.count; i++) {
var idx = tasksModel.makeModelIndex(i);
if (!tasksModel.data(idx, TaskManager.AbstractTasksModel.IsMinimized)) {
tasksModel.requestToggleMinimized(idx);
}
}
}
function restoreAll() {
for (var i = 0 ; i < tasksModel.count; i++) {
var idx = tasksModel.makeModelIndex(i);
if (tasksModel.data(idx, TaskManager.AbstractTasksModel.IsMinimized)) {
tasksModel.requestToggleMinimized(idx);
}
}
}
TaskManager.TasksModel {
id: tasksModel
groupMode: TaskManager.TasksModel.GroupDisabled
screenGeometry: plasmoid.screenGeometry
sortMode: TaskManager.TasksModel.SortAlpha
virtualDesktop: virtualDesktopInfo.currentDesktop
activity: activityInfo.currentActivity
//FIXME: workaround
Component.onCompleted: tasksModel.countChanged();
}
TaskManager.VirtualDesktopInfo {
id: virtualDesktopInfo
}
TaskManager.ActivityInfo {
id: activityInfo
}
MouseArea {
id: mainMouseArea
2015-06-18 23:31:26 +00:00
anchors.fill: parent
property int oldMouseY: 0
property int startMouseY: 0
property bool isDragging: false
2020-07-17 16:12:07 +00:00
property bool opening: false
drag.filterChildren: true
function managePressed(mouse) {
startMouseY = oldMouseY = mouse.y;
taskSwitcher.offset = -taskSwitcher.height
}
onPressed: managePressed(mouse);
onPositionChanged: {
if (!isDragging && Math.abs(startMouseY - oldMouseY) < root.height) {
oldMouseY = mouse.y;
return;
} else {
isDragging = true;
}
taskSwitcher.offset = taskSwitcher.offset - (mouse.y - oldMouseY);
2020-07-17 16:12:07 +00:00
opening = oldMouseY > mouse.y;
oldMouseY = mouse.y;
2015-10-01 15:40:26 +00:00
if (taskSwitcher.visibility == Window.Hidden && taskSwitcher.offset > -taskSwitcher.height + units.gridUnit && taskSwitcher.tasksCount) {
2020-07-17 09:17:18 +00:00
taskSwitcher.showFullScreen();
}
}
onReleased: {
if (!isDragging) {
return;
}
if (taskSwitcher.visibility == Window.Hidden) {
return;
}
2020-07-17 16:12:07 +00:00
if (opening) {
taskSwitcher.show();
} else {
taskSwitcher.hide();
}
}
2015-06-18 23:31:26 +00:00
2020-02-05 19:25:52 +00:00
DropShadow {
anchors.fill: icons
2020-06-26 21:59:07 +00:00
visible: !showingApp
2020-02-12 08:57:40 +00:00
cached: true
2020-02-05 19:25:52 +00:00
horizontalOffset: 0
verticalOffset: 1
radius: 4.0
samples: 17
color: Qt.rgba(0,0,0,0.8)
source: icons
}
Item {
2020-02-05 19:25:52 +00:00
id: icons
anchors.fill: parent
2015-06-18 23:31:26 +00:00
visible: plasmoid.configuration.PanelButtonsVisible
2020-02-06 14:39:25 +00:00
/*
Rectangle {
anchors.fill: parent
color: root.backgroundColor
2020-02-05 19:25:52 +00:00
opacity: showingApp ? 1 : 0
Rectangle {
anchors {
left: parent.left
right: parent.right
top: parent.top
}
height: 1
color: PlasmaCore.ColorScope.textColor
opacity: 0.2
}
2020-02-06 14:39:25 +00:00
}*/
Rectangle {
anchors.fill: parent
gradient: Gradient {
GradientStop {
position: 0
color: showingApp ? PlasmaCore.ColorScope.backgroundColor : "transparent"
}
GradientStop {
position: 1
2020-02-12 08:59:18 +00:00
color: showingApp ? PlasmaCore.ColorScope.backgroundColor : Qt.rgba(0, 0, 0, 0.05)
2020-02-06 14:39:25 +00:00
}
}
}
2015-06-18 23:31:26 +00:00
Button {
anchors.left: parent.left
height: parent.height
width: parent.width/3
enabled: root.hasTasks
iconSource: "box"
onClicked: {
plasmoid.nativeInterface.showDesktop = false;
taskSwitcher.visible ? taskSwitcher.hide() : taskSwitcher.show();
}
onPressed: mainMouseArea.managePressed(mouse);
onPositionChanged: mainMouseArea.positionChanged(mouse);
onReleased: mainMouseArea.released(mouse);
2015-06-18 23:31:26 +00:00
}
Button {
id: showDesktopButton
height: parent.height
width: parent.width/3
anchors.horizontalCenter: parent.horizontalCenter
iconSource: "start-here-kde"
2020-02-07 12:38:02 +00:00
enabled: taskSwitcher && taskSwitcher.tasksCount > 0
checkable: true
onCheckedChanged: {
taskSwitcher.hide();
root.minimizeAll();
//plasmoid.nativeInterface.showDesktop = checked;
}
onPressed: mainMouseArea.managePressed(mouse);
onPositionChanged: mainMouseArea.positionChanged(mouse);
onReleased: mainMouseArea.released(mouse);
Connections {
target: root.taskSwitcher
onCurrentTaskIndexChanged: {
if (root.taskSwitcher.currentTaskIndex < 0) {
showDesktopButton.checked = false;
}
}
}
}
2015-06-11 22:50:38 +00:00
Button {
height: parent.height
width: parent.width/3
anchors.right: parent.right
iconSource: "paint-none"
2016-06-28 12:37:41 +00:00
//FIXME:Qt.UserRole+9 is IsWindow Qt.UserRole+15 is IsClosable. We can't reach that enum from QML
enabled: plasmoid.nativeInterface.hasCloseableActiveWindow
2016-06-28 12:37:41 +00:00
onClicked: {
var index = taskSwitcher.model.activeTask;
if (index) {
taskSwitcher.model.requestClose(index);
}
}
onPressed: mainMouseArea.managePressed(mouse);
onPositionChanged: mainMouseArea.positionChanged(mouse);
onReleased: mainMouseArea.released(mouse);
}
2015-06-18 23:31:26 +00:00
}
}
}