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

299 lines
10 KiB
QML
Raw Normal View History

/*
2021-03-01 20:03:25 +00:00
* SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
*
2021-03-01 20:03:25 +00:00
* SPDX-License-Identifier: GPL-2.0-or-later
*/
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
2020-07-22 15:17:10 +00:00
import org.kde.plasma.private.mobileshell 1.0 as MobileShell
2015-06-18 23:31:26 +00:00
PlasmaCore.ColorScope {
id: root
width: 600
2015-06-18 23:31:26 +00:00
height: 480
colorGroup: showingApp ? PlasmaCore.Theme.HeaderColorGroup : PlasmaCore.Theme.ComplementaryColorGroup
2015-06-18 23:31:26 +00:00
Plasmoid.backgroundHints: PlasmaCore.Types.NoBackground
readonly property color backgroundColor: NanoShell.StartupFeedback.visible ? NanoShell.StartupFeedback.backgroundColor : PlasmaCore.ColorScope.backgroundColor
readonly property bool showingApp: !plasmoid.nativeInterface.allMinimized
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?
2020-07-22 15:17:10 +00:00
Connections {
target: plasmoid.nativeInterface
2020-07-23 11:47:40 +00:00
function onAllMinimizedChanged() {
MobileShell.HomeScreenControls.homeScreenVisible = plasmoid.nativeInterface.allMinimized
2020-07-22 15:17:10 +00:00
}
}
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
2020-07-31 12:20:55 +00:00
property Button activeButton
onPressed: {
startMouseY = oldMouseY = mouse.y;
2020-07-31 12:20:55 +00:00
taskSwitcher.offset = -taskSwitcher.height;
activeButton = icons.childAt(mouse.x, mouse.y);
}
onPositionChanged: {
2020-07-31 12:20:55 +00:00
let newButton = icons.childAt(mouse.x, mouse.y);
if (newButton != activeButton) {
activeButton = null;
}
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;
2015-10-01 15:40:26 +00:00
if (taskSwitcher.visibility == Window.Hidden && taskSwitcher.offset > -taskSwitcher.height + units.gridUnit && taskSwitcher.tasksCount) {
2020-07-31 12:20:55 +00:00
activeButton = null;
2020-07-17 09:17:18 +00:00
taskSwitcher.showFullScreen();
//no tasks, let's scroll up the homescreen instead
} else if (taskSwitcher.tasksCount === 0) {
MobileShell.HomeScreenControls.requestHomeScreenPosition(MobileShell.HomeScreenControls.homeScreenPosition - (mouse.y - oldMouseY));
}
oldMouseY = mouse.y;
}
onReleased: {
if (taskSwitcher.visibility == Window.Hidden) {
if (taskSwitcher.tasksCount === 0) {
MobileShell.HomeScreenControls.snapHomeScreenPosition();
}
2020-07-31 12:20:55 +00:00
if (activeButton) {
activeButton.clicked();
}
return;
}
2020-07-31 12:20:55 +00:00
if (!isDragging) {
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-10-24 16:46:45 +00:00
PlasmaCore.Svg {
id: panelSvg
imagePath: "icons/mobile"
colorGroup: root.showingApp ? PlasmaCore.Theme.NormalColorGroup : PlasmaCore.Theme.ComplementaryColorGroup
}
PlasmaCore.Svg {
id: startSvg
imagePath: "icons/start"
colorGroup: root.showingApp ? PlasmaCore.Theme.NormalColorGroup : PlasmaCore.Theme.ComplementaryColorGroup
}
2020-02-06 14:39:25 +00:00
Rectangle {
anchors.fill: parent
gradient: Gradient {
GradientStop {
position: 0
color: showingApp ? root.backgroundColor : "transparent"
2020-02-06 14:39:25 +00:00
}
GradientStop {
position: 1
color: showingApp ? root.backgroundColor : Qt.rgba(0, 0, 0, 0.1)
2020-02-06 14:39:25 +00:00
}
}
}
2015-06-18 23:31:26 +00:00
Button {
2020-10-24 16:46:45 +00:00
anchors {
verticalCenter: parent.verticalCenter
left: parent.left
leftMargin: parent.width * 0.1
}
height: parent.height
2020-10-24 16:46:45 +00:00
width: parent.width*0.8/3
2020-07-31 12:20:55 +00:00
mouseArea: mainMouseArea
enabled: root.hasTasks
onClicked: {
2020-07-31 12:20:55 +00:00
if (!enabled) {
2020-07-23 11:47:40 +00:00
return;
}
plasmoid.nativeInterface.showDesktop = false;
taskSwitcher.visible ? taskSwitcher.hide() : taskSwitcher.show();
}
2020-10-24 16:46:45 +00:00
PlasmaCore.SvgItem {
anchors.centerIn: parent
implicitHeight: 0.75 * parent.height * 0.6 // 0.75 sizing adjustment fix needed
implicitWidth: implicitHeight
opacity: parent.enabled ? 1 : 0.5
svg: panelSvg
elementId: "mobile-task-switcher"
Behavior on opacity {
NumberAnimation { duration: units.shortDuration }
}
}
2015-06-18 23:31:26 +00:00
}
Button {
id: showDesktopButton
2020-10-24 16:46:45 +00:00
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
height: parent.height
2020-10-24 16:46:45 +00:00
width: parent.width*0.8/3
2020-07-31 12:20:55 +00:00
mouseArea: mainMouseArea
enabled: !taskSwitcher.visible && (root.showingApp || MobileShell.HomeScreenControls.homeScreenPosition != 0)
2020-07-22 15:17:10 +00:00
onClicked: {
2020-07-31 12:20:55 +00:00
if (!enabled) {
2020-07-23 11:47:40 +00:00
return;
}
root.minimizeAll();
2020-07-23 11:47:40 +00:00
MobileShell.HomeScreenControls.resetHomeScreenPosition();
plasmoid.nativeInterface.allMinimizedChanged();
}
2020-10-24 16:46:45 +00:00
PlasmaCore.SvgItem {
anchors.centerIn: parent
implicitHeight: parent.height * 0.6
implicitWidth: implicitHeight
opacity: parent.enabled ? 1 : 0.5
svg: startSvg
elementId: "16-16-start-here-kde"
Behavior on opacity {
NumberAnimation { duration: units.shortDuration }
}
}
}
2015-06-11 22:50:38 +00:00
Button {
2020-10-24 16:46:45 +00:00
anchors {
verticalCenter: parent.verticalCenter
right: parent.right
rightMargin: parent.width * 0.1
}
height: parent.height
2020-10-24 16:46:45 +00:00
width: parent.width*0.8/3
2020-07-31 12:20:55 +00:00
mouseArea: mainMouseArea
enabled: plasmoid.nativeInterface.hasCloseableActiveWindow && !taskSwitcher.visible
2016-06-28 12:37:41 +00:00
onClicked: {
2020-07-31 12:20:55 +00:00
if (!enabled) {
2020-07-23 11:47:40 +00:00
return;
}
if (!plasmoid.nativeInterface.hasCloseableActiveWindow) {
return;
}
2016-06-28 12:37:41 +00:00
var index = taskSwitcher.model.activeTask;
if (index) {
taskSwitcher.model.requestClose(index);
}
}
2020-10-24 16:46:45 +00:00
PlasmaCore.SvgItem {
anchors.centerIn: parent
implicitHeight: 0.75 * parent.height * 0.6 // 0.75 sizing adjustment fix needed
implicitWidth: implicitHeight
opacity: parent.enabled ? 1 : 0.5
svg: panelSvg
elementId: "mobile-close-app"
Behavior on opacity {
NumberAnimation { duration: units.shortDuration }
}
}
}
2015-06-18 23:31:26 +00:00
}
}
}