homescreens: Update API usage to match changes for Plasmoid & Containment

This commit is contained in:
Devin Lin 2023-06-12 19:58:17 -04:00
parent 2b613a1c89
commit 8a577f9a57
3 changed files with 152 additions and 146 deletions

View file

@ -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

View file

@ -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()
} }
} }
} }

View file

@ -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
}
} }
} }
} }