mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-28 06:33:09 +00:00
homescreens: Update API usage to match changes for Plasmoid & Containment
This commit is contained in:
parent
2b613a1c89
commit
8a577f9a57
3 changed files with 152 additions and 146 deletions
|
|
@ -1,7 +1,5 @@
|
||||||
/*
|
// SPDX-FileCopyrightText: 2021-2023 Devin Lin <devin@kde.org>
|
||||||
* SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
|
// SPDX-License-Identifier: LGPL-2.0-or-later
|
||||||
* SPDX-License-Identifier: LGPL-2.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Window
|
import QtQuick.Window
|
||||||
|
|
@ -20,6 +18,7 @@ import "../components" as Components
|
||||||
* The base homescreen component, implementing features that simplify
|
* The base homescreen component, implementing features that simplify
|
||||||
* homescreen implementation.
|
* homescreen implementation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
|
|
@ -27,17 +26,17 @@ Item {
|
||||||
* Emitted when an action is triggered to open the homescreen.
|
* Emitted when an action is triggered to open the homescreen.
|
||||||
*/
|
*/
|
||||||
signal homeTriggered()
|
signal homeTriggered()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Emitted when resetting the homescreen position is requested.
|
* Emitted when resetting the homescreen position is requested.
|
||||||
*/
|
*/
|
||||||
signal resetHomeScreenPosition()
|
signal resetHomeScreenPosition()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Emitted when moving the homescreen position is requested.
|
* Emitted when moving the homescreen position is requested.
|
||||||
*/
|
*/
|
||||||
signal requestRelativeScroll(var pos)
|
signal requestRelativeScroll(var pos)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The visual item that is the homescreen.
|
* The visual item that is the homescreen.
|
||||||
*/
|
*/
|
||||||
|
|
@ -48,7 +47,7 @@ Item {
|
||||||
* window.
|
* window.
|
||||||
*/
|
*/
|
||||||
readonly property bool overlayShown: startupFeedback.visible
|
readonly property bool overlayShown: startupFeedback.visible
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Margins for the homescreen, taking panels into account.
|
* Margins for the homescreen, taking panels into account.
|
||||||
*/
|
*/
|
||||||
|
|
@ -58,15 +57,15 @@ Item {
|
||||||
property real rightMargin
|
property real rightMargin
|
||||||
|
|
||||||
function evaluateMargins() {
|
function evaluateMargins() {
|
||||||
topMargin = plasmoid.availableScreenRect.y
|
topMargin = Plasmoid.availableScreenRect.y
|
||||||
// add a specific check for the nav panel for now, since the gesture mode still technically has height
|
// add a specific check for the nav panel for now, since the gesture mode still technically has height
|
||||||
bottomMargin = ShellSettings.Settings.navigationPanelEnabled ? root.height - (plasmoid.availableScreenRect.y + plasmoid.availableScreenRect.height) : 0;
|
bottomMargin = ShellSettings.Settings.navigationPanelEnabled ? root.height - (Plasmoid.availableScreenRect.y + Plasmoid.availableScreenRect.height) : 0;
|
||||||
leftMargin = plasmoid.availableScreenRect.x
|
leftMargin = Plasmoid.availableScreenRect.x
|
||||||
rightMargin = root.width - (plasmoid.availableScreenRect.x + plasmoid.availableScreenRect.width)
|
rightMargin = root.width - (Plasmoid.availableScreenRect.x + Plasmoid.availableScreenRect.width)
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: plasmoid
|
target: Plasmoid
|
||||||
|
|
||||||
// avoid binding loops with root.height and root.width changing along with the availableScreenRect
|
// avoid binding loops with root.height and root.width changing along with the availableScreenRect
|
||||||
function onAvailableScreenRectChanged() {
|
function onAvailableScreenRectChanged() {
|
||||||
|
|
@ -78,12 +77,12 @@ Item {
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: MobileShellState.ShellDBusClient
|
target: MobileShellState.ShellDBusClient
|
||||||
|
|
||||||
function onOpenHomeScreenRequested() {
|
function onOpenHomeScreenRequested() {
|
||||||
if (WindowPlugin.WindowMaximizedTracker.showingWindow) {
|
if (WindowPlugin.WindowMaximizedTracker.showingWindow) {
|
||||||
itemContainer.zoomIn();
|
itemContainer.zoomIn();
|
||||||
}
|
}
|
||||||
|
|
||||||
resetHomeScreenPosition();
|
resetHomeScreenPosition();
|
||||||
|
|
||||||
WindowPlugin.WindowUtil.unsetAllMinimizedGeometries(root);
|
WindowPlugin.WindowUtil.unsetAllMinimizedGeometries(root);
|
||||||
|
|
@ -91,15 +90,15 @@ Item {
|
||||||
|
|
||||||
root.homeTriggered();
|
root.homeTriggered();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onResetHomeScreenPositionRequested() {
|
function onResetHomeScreenPositionRequested() {
|
||||||
root.resetHomeScreenPosition();
|
root.resetHomeScreenPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onOpenAppLaunchAnimationRequested(splashIcon, title, x, y, sourceIconSize) {
|
function onOpenAppLaunchAnimationRequested(splashIcon, title, x, y, sourceIconSize) {
|
||||||
startupFeedback.open(splashIcon, title, x, y, sourceIconSize);
|
startupFeedback.open(splashIcon, title, x, y, sourceIconSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onCloseAppLaunchAnimationRequested() {
|
function onCloseAppLaunchAnimationRequested() {
|
||||||
startupFeedback.close();
|
startupFeedback.close();
|
||||||
}
|
}
|
||||||
|
|
@ -133,18 +132,18 @@ Item {
|
||||||
// determine the margins used
|
// determine the margins used
|
||||||
evaluateMargins();
|
evaluateMargins();
|
||||||
}
|
}
|
||||||
|
|
||||||
// homescreen visual component
|
// homescreen visual component
|
||||||
Components.BaseItem {
|
Components.BaseItem {
|
||||||
id: itemContainer
|
id: itemContainer
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
// animations
|
// animations
|
||||||
opacity: 0
|
opacity: 0
|
||||||
property real zoomScale: 1
|
property real zoomScale: 1
|
||||||
|
|
||||||
readonly property real zoomScaleOut: 0.8
|
readonly property real zoomScaleOut: 0.8
|
||||||
|
|
||||||
function zoomIn() {
|
function zoomIn() {
|
||||||
// don't use check animationsEnabled here, so we ensure the scale and opacity is always 1 when disabled
|
// don't use check animationsEnabled here, so we ensure the scale and opacity is always 1 when disabled
|
||||||
scaleAnim.to = 1;
|
scaleAnim.to = 1;
|
||||||
|
|
@ -166,13 +165,13 @@ Item {
|
||||||
zoomScale = zoomScaleOut;
|
zoomScale = zoomScaleOut;
|
||||||
opacity = 0;
|
opacity = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
NumberAnimation on opacity {
|
NumberAnimation on opacity {
|
||||||
id: opacityAnim
|
id: opacityAnim
|
||||||
duration: 300
|
duration: 300
|
||||||
running: false
|
running: false
|
||||||
}
|
}
|
||||||
|
|
||||||
NumberAnimation on zoomScale {
|
NumberAnimation on zoomScale {
|
||||||
id: scaleAnim
|
id: scaleAnim
|
||||||
duration: 600
|
duration: 600
|
||||||
|
|
@ -196,15 +195,15 @@ Item {
|
||||||
itemContainer.evaluateAnimChange();
|
itemContainer.evaluateAnimChange();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
transform: Scale {
|
transform: Scale {
|
||||||
origin.x: itemContainer.width / 2;
|
origin.x: itemContainer.width / 2;
|
||||||
origin.y: itemContainer.height / 2;
|
origin.y: itemContainer.height / 2;
|
||||||
xScale: itemContainer.zoomScale
|
xScale: itemContainer.zoomScale
|
||||||
yScale: itemContainer.zoomScale
|
yScale: itemContainer.zoomScale
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// start app animation component
|
// start app animation component
|
||||||
Components.StartupFeedback {
|
Components.StartupFeedback {
|
||||||
id: startupFeedback
|
id: startupFeedback
|
||||||
|
|
|
||||||
|
|
@ -18,28 +18,16 @@ import org.kde.plasma.private.mobileshell.state 1.0 as MobileShellState
|
||||||
import org.kde.private.mobile.homescreen.folio 1.0 as Folio
|
import org.kde.private.mobile.homescreen.folio 1.0 as Folio
|
||||||
import org.kde.plasma.private.mobileshell.windowplugin as WindowPlugin
|
import org.kde.plasma.private.mobileshell.windowplugin as WindowPlugin
|
||||||
|
|
||||||
MobileShell.HomeScreen {
|
|
||||||
id: root
|
|
||||||
width: 640
|
|
||||||
height: 480
|
|
||||||
|
|
||||||
onResetHomeScreenPosition: {
|
ContainmentItem {
|
||||||
homescreen.homeScreenState.animateGoToPageIndex(0, PlasmaCore.Units.longDuration);
|
id: root
|
||||||
homescreen.homeScreenState.closeAppDrawer();
|
|
||||||
}
|
|
||||||
|
|
||||||
onHomeTriggered: {
|
|
||||||
searchWidget.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
property bool componentComplete: false
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
// ensure the gestures work immediately on load
|
// ensure the gestures work immediately on load
|
||||||
forceActiveFocus();
|
forceActiveFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
Plasmoid.onActivated: {
|
Plasmoid.onActivated: {
|
||||||
// there's a couple of steps:
|
// there's a couple of steps:
|
||||||
// - minimize windows (only if we are in an app)
|
// - minimize windows (only if we are in an app)
|
||||||
// - open app drawer
|
// - open app drawer
|
||||||
|
|
@ -54,70 +42,84 @@ MobileShell.HomeScreen {
|
||||||
|| MobileShellState.ShellDBusClient.isActionDrawerOpen
|
|| MobileShellState.ShellDBusClient.isActionDrawerOpen
|
||||||
|| searchWidget.isOpen
|
|| searchWidget.isOpen
|
||||||
) {
|
) {
|
||||||
|
|
||||||
// Always close the search widget as well
|
// Always close the search widget as well
|
||||||
if (searchWidget.isOpen) {
|
if (searchWidget.isOpen) {
|
||||||
searchWidget.close();
|
searchWidget.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (homescreen.homeScreenState.currentView === HomeScreenState.PageView) {
|
} else if (folioHomeScreen.homeScreenState.currentView === HomeScreenState.PageView) {
|
||||||
homescreen.homeScreenState.openAppDrawer();
|
folioHomeScreen.homeScreenState.openAppDrawer();
|
||||||
} else {
|
} else {
|
||||||
homescreen.homeScreenState.closeAppDrawer();
|
folioHomeScreen.homeScreenState.closeAppDrawer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
contentItem: Item {
|
|
||||||
// homescreen component
|
|
||||||
HomeScreen {
|
|
||||||
id: homescreen
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
topMargin: root.topMargin
|
MobileShell.HomeScreen {
|
||||||
bottomMargin: root.bottomMargin
|
id: homeScreen
|
||||||
leftMargin: root.leftMargin
|
|
||||||
rightMargin: root.rightMargin
|
|
||||||
|
|
||||||
opacity: (1 - searchWidget.openFactor)
|
onResetHomeScreenPosition: {
|
||||||
|
folioHomeScreen.homeScreenState.animateGoToPageIndex(0, PlasmaCore.Units.longDuration);
|
||||||
|
folioHomeScreen.homeScreenState.closeAppDrawer();
|
||||||
|
}
|
||||||
|
|
||||||
// make the homescreen not interactable when task switcher or startup feedback is on
|
onHomeTriggered: {
|
||||||
interactive: !root.overlayShown
|
searchWidget.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
// search component
|
|
||||||
MobileShell.KRunnerWidget {
|
|
||||||
id: searchWidget
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
visible: openFactor > 0
|
|
||||||
|
|
||||||
topMargin: root.topMargin
|
property bool componentComplete: false
|
||||||
bottomMargin: root.bottomMargin
|
|
||||||
leftMargin: root.leftMargin
|
contentItem: Item {
|
||||||
rightMargin: root.rightMargin
|
// homescreen component
|
||||||
|
HomeScreen {
|
||||||
|
id: folioHomeScreen
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
topMargin: homeScreen.topMargin
|
||||||
|
bottomMargin: homeScreen.bottomMargin
|
||||||
|
leftMargin: homeScreen.leftMargin
|
||||||
|
rightMargin: homeScreen.rightMargin
|
||||||
|
|
||||||
|
opacity: (1 - searchWidget.openFactor)
|
||||||
|
|
||||||
|
// make the homescreen not interactable when task switcher or startup feedback is on
|
||||||
|
interactive: !homeScreen.overlayShown
|
||||||
|
}
|
||||||
|
|
||||||
|
// search component
|
||||||
|
MobileShell.KRunnerWidget {
|
||||||
|
id: searchWidget
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
visible: openFactor > 0
|
||||||
|
|
||||||
|
topMargin: homeScreen.topMargin
|
||||||
|
bottomMargin: homeScreen.bottomMargin
|
||||||
|
leftMargin: homeScreen.leftMargin
|
||||||
|
rightMargin: homeScreen.rightMargin
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
Connections {
|
||||||
Connections {
|
target: folioHomeScreen.homeScreenState
|
||||||
target: homescreen.homeScreenState
|
|
||||||
|
function onSwipeDownGestureBegin() {
|
||||||
function onSwipeDownGestureBegin() {
|
searchWidget.startGesture();
|
||||||
searchWidget.startGesture();
|
}
|
||||||
|
function onSwipeDownGestureEnd() {
|
||||||
|
searchWidget.endGesture();
|
||||||
|
}
|
||||||
|
function onSwipeDownGestureOffset(offset) {
|
||||||
|
searchWidget.updateGestureOffset(-offset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function onSwipeDownGestureEnd() {
|
|
||||||
searchWidget.endGesture();
|
// listen to app launch errors
|
||||||
}
|
Connections {
|
||||||
function onSwipeDownGestureOffset(offset) {
|
target: Folio.ApplicationListModel
|
||||||
searchWidget.updateGestureOffset(-offset);
|
function onLaunchError(msg) {
|
||||||
}
|
MobileShellState.ShellDBusClient.closeAppLaunchAnimation()
|
||||||
}
|
}
|
||||||
|
|
||||||
// listen to app launch errors
|
|
||||||
Connections {
|
|
||||||
target: Folio.ApplicationListModel
|
|
||||||
function onLaunchError(msg) {
|
|
||||||
MobileShellState.ShellDBusClient.closeAppLaunchAnimation()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,33 +14,15 @@ import org.kde.plasma.private.mobileshell.state as MobileShellState
|
||||||
import org.kde.private.mobile.homescreen.halcyon as Halcyon
|
import org.kde.private.mobile.homescreen.halcyon as Halcyon
|
||||||
import org.kde.plasma.private.mobileshell.windowplugin as WindowPlugin
|
import org.kde.plasma.private.mobileshell.windowplugin as WindowPlugin
|
||||||
|
|
||||||
MobileShell.HomeScreen {
|
ContainmentItem {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
onResetHomeScreenPosition: {
|
|
||||||
homescreen.triggerHomescreen();
|
|
||||||
}
|
|
||||||
|
|
||||||
onHomeTriggered: {
|
|
||||||
search.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
Halcyon.ApplicationListModel.loadApplications();
|
Halcyon.ApplicationListModel.loadApplications();
|
||||||
Halcyon.PinnedModel.applet = plasmoid.nativeInterface;
|
Halcyon.PinnedModel.applet = Plasmoid.nativeInterface;
|
||||||
forceActiveFocus();
|
forceActiveFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: darkenBackground
|
|
||||||
color: root.overlayShown ? 'transparent' : (homescreen.page == 1 ? Qt.rgba(0, 0, 0, 0.7) : Qt.rgba(0, 0, 0, 0.2))
|
|
||||||
anchors.fill: parent
|
|
||||||
z: -1
|
|
||||||
Behavior on color {
|
|
||||||
ColorAnimation { duration: PlasmaCore.Units.longDuration }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Plasmoid.onActivated: {
|
Plasmoid.onActivated: {
|
||||||
// there's a couple of steps:
|
// there's a couple of steps:
|
||||||
// - minimize windows (only if we are in an app)
|
// - minimize windows (only if we are in an app)
|
||||||
|
|
@ -58,45 +40,68 @@ MobileShell.HomeScreen {
|
||||||
search.close();
|
search.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
homescreen.page = 0;
|
halcyonHomeScreen.page = 0;
|
||||||
|
|
||||||
WindowPlugin.WindowUtil.isShowingDesktop = true;
|
WindowPlugin.WindowUtil.isShowingDesktop = true;
|
||||||
} else if (homescreen.page == 0) {
|
} else if (halcyonHomeScreen.page == 0) {
|
||||||
homescreen.page = 1;
|
halcyonHomeScreen.page = 1;
|
||||||
} else {
|
} else {
|
||||||
WindowPlugin.WindowUtil.isShowingDesktop = false;
|
WindowPlugin.WindowUtil.isShowingDesktop = false;
|
||||||
homescreen.page = 0;
|
halcyonHomeScreen.page = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// homescreen component
|
|
||||||
contentItem: Item {
|
|
||||||
HomeScreen {
|
|
||||||
id: homescreen
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
topMargin: root.topMargin
|
|
||||||
bottomMargin: root.bottomMargin
|
|
||||||
leftMargin: root.leftMargin
|
|
||||||
rightMargin: root.rightMargin
|
|
||||||
|
|
||||||
// make the homescreen not interactable when task switcher or startup feedback is on
|
Rectangle {
|
||||||
interactive: !root.overlayShown
|
id: darkenBackground
|
||||||
searchWidget: search
|
color: homeScreen.overlayShown ? 'transparent' : (halcyonHomeScreen.page == 1 ? Qt.rgba(0, 0, 0, 0.7) : Qt.rgba(0, 0, 0, 0.2))
|
||||||
|
anchors.fill: parent
|
||||||
|
z: -1
|
||||||
|
Behavior on color {
|
||||||
|
ColorAnimation { duration: PlasmaCore.Units.longDuration }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// search component
|
|
||||||
MobileShell.KRunnerWidget {
|
|
||||||
id: search
|
|
||||||
anchors.fill: parent
|
|
||||||
visible: openFactor > 0
|
|
||||||
|
|
||||||
onActionTriggered: search.close()
|
MobileShell.HomeScreen {
|
||||||
|
id: homeScreen
|
||||||
topMargin: root.topMargin
|
anchors.fill: parent
|
||||||
bottomMargin: root.bottomMargin
|
|
||||||
leftMargin: root.leftMargin
|
onResetHomeScreenPosition: {
|
||||||
rightMargin: root.rightMargin
|
halcyonHomeScreen.triggerHomescreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
onHomeTriggered: {
|
||||||
|
search.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// homescreen component
|
||||||
|
contentItem: Item {
|
||||||
|
HomeScreen {
|
||||||
|
id: halcyonHomeScreen
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
topMargin: homeScreen.topMargin
|
||||||
|
bottomMargin: homeScreen.bottomMargin
|
||||||
|
leftMargin: homeScreen.leftMargin
|
||||||
|
rightMargin: homeScreen.rightMargin
|
||||||
|
|
||||||
|
// make the homescreen not interactable when task switcher or startup feedback is on
|
||||||
|
interactive: !homeScreen.overlayShown
|
||||||
|
searchWidget: search
|
||||||
|
}
|
||||||
|
|
||||||
|
// search component
|
||||||
|
MobileShell.KRunnerWidget {
|
||||||
|
id: search
|
||||||
|
anchors.fill: parent
|
||||||
|
visible: openFactor > 0
|
||||||
|
|
||||||
|
onActionTriggered: search.close()
|
||||||
|
|
||||||
|
topMargin: homeScreen.topMargin
|
||||||
|
bottomMargin: homeScreen.bottomMargin
|
||||||
|
leftMargin: homeScreen.leftMargin
|
||||||
|
rightMargin: homeScreen.rightMargin
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue