mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 14:23:09 +00:00
210 lines
5.7 KiB
QML
210 lines
5.7 KiB
QML
/*
|
|
* SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
|
|
* SPDX-License-Identifier: LGPL-2.0-or-later
|
|
*/
|
|
|
|
import QtQuick 2.15
|
|
import QtQuick.Window 2.15
|
|
|
|
import org.kde.plasma.core 2.0 as PlasmaCore
|
|
import org.kde.plasma.plasmoid 2.0
|
|
import org.kde.taskmanager 0.1 as TaskManager
|
|
|
|
import org.kde.plasma.private.mobileshell 1.0 as MobileShell
|
|
|
|
/**
|
|
* The base homescreen component, implementing features that simplify
|
|
* homescreen implementation.
|
|
*/
|
|
Item {
|
|
id: root
|
|
|
|
/**
|
|
* Emitted when an action is triggered to open the homescreen.
|
|
*/
|
|
signal homeTriggered()
|
|
|
|
/**
|
|
* Emitted when resetting the homescreen position is requested.
|
|
*/
|
|
signal resetHomeScreenPosition()
|
|
|
|
/**
|
|
* Emitted when moving the homescreen position is requested.
|
|
*/
|
|
signal requestRelativeScroll(var pos)
|
|
|
|
/**
|
|
* The visual item that is the homescreen.
|
|
*/
|
|
property alias contentItem: itemContainer.contentItem
|
|
|
|
/**
|
|
* Whether a component is being shown on top of the homescreen within the same
|
|
* window.
|
|
*/
|
|
property bool overlayShown: taskSwitcher.visible || startupFeedback.visible
|
|
|
|
//BEGIN API implementation
|
|
Connections {
|
|
target: MobileShell.HomeScreenControls
|
|
|
|
function onOpenHomeScreen() {
|
|
if (!MobileShell.WindowUtil.allWindowsMinimized) {
|
|
itemContainer.zoomIn();
|
|
}
|
|
|
|
MobileShell.HomeScreenControls.resetHomeScreenPosition();
|
|
taskSwitcher.visible = false; // will trigger homescreen open
|
|
taskSwitcher.minimizeAll();
|
|
|
|
root.homeTriggered();
|
|
}
|
|
|
|
function onResetHomeScreenPosition() {
|
|
root.resetHomeScreenPosition();
|
|
}
|
|
|
|
function onRequestRelativeScroll(pos) {
|
|
// TODO
|
|
//homescreen.appDrawer.offset -= pos.y;
|
|
//lastRequestedPosition = pos.y;
|
|
}
|
|
|
|
function onOpenAppLaunchAnimation(splashIcon, title, x, y, sourceIconSize) {
|
|
startupFeedback.open(splashIcon, title, x, y, sourceIconSize);
|
|
}
|
|
|
|
function onCloseAppLaunchAnimation() {
|
|
startupFeedback.close();
|
|
}
|
|
}
|
|
|
|
Plasmoid.onScreenChanged: {
|
|
if (plasmoid.screen == 0) {
|
|
MobileShell.HomeScreenControls.taskSwitcher = taskSwitcher;
|
|
MobileShell.HomeScreenControls.homeScreenWindow = root.Window.window;
|
|
}
|
|
}
|
|
Window.onWindowChanged: {
|
|
if (plasmoid.screen == 0) {
|
|
MobileShell.HomeScreenControls.homeScreenWindow = root.Window.window;
|
|
}
|
|
}
|
|
|
|
//END API implementation
|
|
|
|
Component.onCompleted: {
|
|
// set API variables
|
|
if (plasmoid.screen == 0) {
|
|
MobileShell.HomeScreenControls.taskSwitcher = taskSwitcher;
|
|
MobileShell.HomeScreenControls.homeScreenWindow = root.Window.window;
|
|
}
|
|
}
|
|
|
|
// homescreen visual component
|
|
MobileShell.BaseItem {
|
|
id: itemContainer
|
|
anchors.fill: parent
|
|
|
|
// animations
|
|
opacity: 0
|
|
property real zoomScale: 0.8
|
|
|
|
Component.onCompleted: zoomIn()
|
|
|
|
function zoomIn() {
|
|
scaleAnim.to = 1;
|
|
scaleAnim.restart();
|
|
opacityAnim.to = 1;
|
|
opacityAnim.restart();
|
|
}
|
|
function zoomOut() {
|
|
scaleAnim.to = 0.8;
|
|
scaleAnim.restart();
|
|
opacityAnim.to = 0;
|
|
opacityAnim.restart();
|
|
}
|
|
|
|
NumberAnimation on opacity {
|
|
id: opacityAnim
|
|
duration: 300
|
|
running: false
|
|
}
|
|
|
|
NumberAnimation on zoomScale {
|
|
id: scaleAnim
|
|
duration: 600
|
|
running: false
|
|
easing.type: Easing.OutExpo
|
|
}
|
|
|
|
Connections {
|
|
target: MobileShell.WindowUtil
|
|
|
|
function onActiveWindowIsShellChanged() {
|
|
if (MobileShell.WindowUtil.activeWindowIsShell && !taskSwitcher.visible) {
|
|
itemContainer.zoomIn();
|
|
} else {
|
|
itemContainer.zoomOut();
|
|
}
|
|
}
|
|
}
|
|
|
|
transform: Scale {
|
|
origin.x: itemContainer.width / 2;
|
|
origin.y: itemContainer.height / 2;
|
|
xScale: itemContainer.zoomScale
|
|
yScale: itemContainer.zoomScale
|
|
}
|
|
}
|
|
|
|
// task switcher component
|
|
MobileShell.TaskSwitcher {
|
|
id: taskSwitcher
|
|
z: 999999
|
|
|
|
tasksModel: TaskManager.TasksModel {
|
|
groupMode: TaskManager.TasksModel.GroupDisabled
|
|
|
|
screenGeometry: plasmoid.screenGeometry
|
|
sortMode: TaskManager.TasksModel.SortAlpha
|
|
|
|
virtualDesktop: virtualDesktopInfo.currentDesktop
|
|
activity: activityInfo.currentActivity
|
|
}
|
|
|
|
TaskManager.VirtualDesktopInfo {
|
|
id: virtualDesktopInfo
|
|
}
|
|
|
|
TaskManager.ActivityInfo {
|
|
id: activityInfo
|
|
}
|
|
|
|
anchors.fill: parent
|
|
|
|
// hide homescreen elements to make use of wallpaper
|
|
onVisibleChanged: {
|
|
if (visible) {
|
|
startupFeedback.visible = false;
|
|
|
|
// hide immediately when going from homescreen
|
|
if (!taskSwitcher.wasInActiveTask) {
|
|
itemContainer.opacity = 0;
|
|
}
|
|
itemContainer.zoomOut();
|
|
|
|
} else {
|
|
itemContainer.zoomIn();
|
|
}
|
|
}
|
|
}
|
|
|
|
// start app animation component
|
|
MobileShell.StartupFeedback {
|
|
id: startupFeedback
|
|
z: 999999
|
|
anchors.fill: parent
|
|
}
|
|
}
|