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

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

327 lines
12 KiB
QML
Raw Normal View History

/*
2021-03-01 20:03:25 +00:00
* SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
*
2021-03-01 20:03:25 +00:00
* SPDX-License-Identifier: LGPL-2.0-or-later
*/
2019-09-04 16:39:31 +00:00
import QtQuick 2.12
2020-07-22 15:17:10 +00:00
import QtQuick.Window 2.12
2015-02-25 18:38:34 +00:00
import QtQuick.Layouts 1.1
2019-09-04 16:39:31 +00:00
import QtGraphicalEffects 1.0
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
2019-09-04 16:39:31 +00:00
import org.kde.plasma.components 3.0 as PlasmaComponents
import org.kde.draganddrop 2.0 as DragDrop
2019-09-04 16:39:31 +00:00
import "launcher" as Launcher
//TODO: everything using this will eventually move in Launcher
import "launcher/private" as LauncherPrivate
2019-09-04 16:39:31 +00:00
import org.kde.plasma.private.containmentlayoutmanager 1.0 as ContainmentLayoutManager
import org.kde.phone.homescreen 1.0
2020-07-22 15:17:10 +00:00
import org.kde.plasma.private.mobileshell 1.0 as MobileShell
2021-03-18 17:34:37 +00:00
FocusScope {
id: root
2019-09-04 16:39:31 +00:00
width: 640
height: 480
property Item toolBox
2015-06-20 23:08:46 +00:00
//BEGIN functions
2015-07-09 11:29:26 +00:00
2019-09-04 16:39:31 +00:00
function recalculateMaxFavoriteCount() {
if (!componentComplete) {
return;
2015-10-15 13:26:23 +00:00
}
plasmoid.nativeInterface.applicationListModel.maxFavoriteCount = Math.max(4, Math.floor(Math.min(width, height) / appletsLayout.cellWidth));
2015-06-20 23:08:46 +00:00
}
2019-09-04 16:39:31 +00:00
//END functions
2015-06-20 23:08:46 +00:00
2019-09-04 16:39:31 +00:00
property bool componentComplete: false
onWidthChanged: recalculateMaxFavoriteCount()
onHeightChanged:recalculateMaxFavoriteCount()
Component.onCompleted: {
2020-07-22 15:17:10 +00:00
if (plasmoid.screen == 0) {
MobileShell.HomeScreenControls.homeScreen = root
MobileShell.HomeScreenControls.homeScreenWindow = root.Window.window
}
2019-09-04 16:39:31 +00:00
componentComplete = true;
recalculateMaxFavoriteCount()
}
2020-07-22 15:17:10 +00:00
Plasmoid.onScreenChanged: {
if (plasmoid.screen == 0) {
MobileShell.HomeScreenControls.homeScreen = root
MobileShell.HomeScreenControls.homeScreenWindow = root.Window.window
}
}
Window.onWindowChanged: {
if (plasmoid.screen == 0) {
MobileShell.HomeScreenControls.homeScreenWindow = root.Window.window
}
}
Connections {
property real lastRequestedPosition: 0
2020-07-22 15:17:10 +00:00
target: MobileShell.HomeScreenControls
function onResetHomeScreenPosition() {
scrollAnim.to = 0;
scrollAnim.restart();
appDrawer.close();
2020-07-22 15:17:10 +00:00
}
function onSnapHomeScreenPosition() {
if (lastRequestedPosition > 0) {
appDrawer.open();
} else {
appDrawer.close();
}
}
function onRequestHomeScreenPosition(y) {
appDrawer.offset += y;
lastRequestedPosition = y;
}
2020-07-22 15:17:10 +00:00
}
2019-09-04 16:39:31 +00:00
Connections {
target: plasmoid
function onEditModeChanged() {
2019-09-04 16:39:31 +00:00
appletsLayout.editMode = plasmoid.editMode
}
}
2019-09-04 16:39:31 +00:00
Launcher.LauncherDragManager {
id: launcherDragManager
anchors.fill: parent
2019-09-04 16:39:31 +00:00
z: 2
appletsLayout: appletsLayout
favoriteStrip: favoriteStrip
}
2021-03-19 16:30:43 +00:00
Launcher.FlickablePages {
2019-09-04 16:39:31 +00:00
id: mainFlickable
2019-09-04 16:39:31 +00:00
anchors {
fill: parent
topMargin: plasmoid.availableScreenRect.y
2020-02-06 20:21:08 +00:00
bottomMargin: favoriteStrip.height + plasmoid.screenGeometry.height - plasmoid.availableScreenRect.height - plasmoid.availableScreenRect.y
2015-03-18 14:45:48 +00:00
}
2020-08-13 09:17:06 +00:00
appDrawer: appDrawer
contentWidth: Math.max(width, width * Math.ceil(appletsLayout.childrenRect.width/width)) + (launcherDragManager.active ? width : 0)
// TODO: span on multiple pages
DragDrop.DropArea {
id: dropArea
width: mainFlickable.width * 100
//width: Math.max(mainFlickable.width, mainFlickable.width * Math.ceil(appletsLayout.childrenRect.width/mainFlickable.width))
height: mainFlickable.height + favoriteStrip.height + units.gridUnit
2015-04-11 09:26:55 +00:00
onDragEnter: {
event.accept(event.proposedAction);
launcherDragManager.active = true;
2020-07-23 15:12:19 +00:00
}
onDragMove: {
let posInFavorites = favoriteStrip.mapFromItem(this, event.x, event.y);
if (posInFavorites.y > 0) {
if (plasmoid.nativeInterface.applicationListModel.favoriteCount >= plasmoid.nativeInterface.applicationListModel.maxFavoriteCount ) {
launcherDragManager.hideSpacer();
} else {
launcherDragManager.showSpacerAtPos(event.x, event.y, favoriteStrip);
}
appletsLayout.hidePlaceHolder();
} else {
2019-09-04 16:39:31 +00:00
appletsLayout.showPlaceHolderAt(
Qt.rect(event.x - appletsLayout.defaultItemWidth / 2,
event.y - appletsLayout.defaultItemHeight / 2,
appletsLayout.defaultItemWidth,
appletsLayout.defaultItemHeight)
);
launcherDragManager.hideSpacer();
2019-09-04 16:39:31 +00:00
}
}
onDragLeave: {
appletsLayout.hidePlaceHolder();
launcherDragManager.active = false;
}
preventStealing: true
onDrop: {
launcherDragManager.active = false;
if (event.mimeData.formats[0] === "text/x-plasma-phone-homescreen-launcher") {
let storageId = event.mimeData.getDataAsByteArray("text/x-plasma-phone-homescreen-launcher");
let posInFavorites = favoriteStrip.flow.mapFromItem(this, event.x, event.y);
if (posInFavorites.y > 0) {
if (plasmoid.nativeInterface.applicationListModel.favoriteCount >= plasmoid.nativeInterface.applicationListModel.maxFavoriteCount ) {
return;
}
let pos = Math.min(plasmoid.nativeInterface.applicationListModel.count, Math.floor(posInFavorites.x/favoriteStrip.cellWidth))
plasmoid.nativeInterface.applicationListModel.addFavorite(storageId, pos, ApplicationListModel.Favorites)
let item = launcherRepeater.itemAt(pos);
if (item) {
item.x = posInFavorites.x;
item.y = 0//posInFavorites.y;
//launcherDragManager.showSpacer(item, item.width/2, item.height/2);
launcherDragManager.dropItem(item, item.width/2, item.height/2);
}
return;
}
2019-09-04 16:39:31 +00:00
let pos = plasmoid.nativeInterface.applicationListModel.count;
plasmoid.nativeInterface.applicationListModel.addFavorite(storageId, pos, ApplicationListModel.Desktop)
let item = launcherRepeater.itemAt(pos);
event.accept(event.proposedAction);
if (item) {
item.x = appletsLayout.placeHolder.x;
item.y = appletsLayout.placeHolder.y;
appletsLayout.hidePlaceHolder();
launcherDragManager.dropItem(item, appletsLayout.placeHolder.x + appletsLayout.placeHolder.width/2, appletsLayout.placeHolder.y + appletsLayout.placeHolder.height/2);
}
appletsLayout.hidePlaceHolder();
} else {
2019-09-04 16:39:31 +00:00
plasmoid.processMimeData(event.mimeData,
event.x - appletsLayout.placeHolder.width / 2, event.y - appletsLayout.placeHolder.height / 2);
event.accept(event.proposedAction);
appletsLayout.hidePlaceHolder();
}
}
PlasmaCore.Svg {
id: arrowsSvg
imagePath: "widgets/arrows"
colorGroup: PlasmaCore.Theme.ComplementaryColorGroup
}
ContainmentLayoutManager.AppletsLayout {
id: appletsLayout
2019-09-04 16:39:31 +00:00
anchors {
fill: parent
bottomMargin: favoriteStrip.height
}
signal appletsLayoutInteracted
2021-03-18 17:27:18 +00:00
TapHandler {
target: mainFlickable
enabled: appDrawer.status !== Launcher.AppDrawer.Status.Open
onTapped: {
//Hides icons close button
appletsLayout.appletsLayoutInteracted();
appletsLayout.editMode = false;
}
onLongPressed: appletsLayout.editMode = true;
onPressedChanged: root.focus = true;
}
2015-02-25 18:38:34 +00:00
cellWidth: favoriteStrip.cellWidth
cellHeight: Math.floor(height / Math.floor(height / favoriteStrip.cellHeight))
2015-03-05 15:53:58 +00:00
configKey: width > height ? "ItemGeometriesHorizontal" : "ItemGeometriesVertical"
containment: plasmoid
editModeCondition: plasmoid.immutable
? ContainmentLayoutManager.AppletsLayout.Manual
: ContainmentLayoutManager.AppletsLayout.AfterPressAndHold
2015-03-11 12:10:43 +00:00
// Sets the containment in edit mode when we go in edit mode as well
onEditModeChanged: plasmoid.editMode = editMode
2019-09-04 16:39:31 +00:00
minimumItemWidth: units.gridUnit * 3
minimumItemHeight: minimumItemWidth
2019-09-04 16:39:31 +00:00
defaultItemWidth: units.gridUnit * 6
defaultItemHeight: defaultItemWidth
2019-09-04 16:39:31 +00:00
acceptsAppletCallback: function(applet, x, y) {
print("Applet: "+applet+" "+x+" "+y)
return true;
}
2019-09-04 16:39:31 +00:00
appletContainerComponent: ContainmentLayoutManager.BasicAppletContainer {
id: appletContainer
configOverlayComponent: ConfigOverlay {}
2019-09-04 16:39:31 +00:00
onEditModeChanged: {
launcherDragManager.active = dragActive || editMode;
}
onDragActiveChanged: {
launcherDragManager.active = dragActive || editMode;
}
}
2015-03-13 13:58:18 +00:00
placeHolder: ContainmentLayoutManager.PlaceHolder {}
//FIXME: move
PlasmaComponents.Label {
id: metrics
text: "M\nM"
visible: false
font.pointSize: theme.defaultFont.pointSize * 0.9
}
Launcher.LauncherRepeater {
id: launcherRepeater
cellWidth: appletsLayout.cellWidth
cellHeight: appletsLayout.cellHeight
appletsLayout: appletsLayout
favoriteStrip: favoriteStrip
onScrollLeftRequested: mainFlickable.scrollLeft()
onScrollRightRequested: mainFlickable.scrollRight()
onStopScrollRequested: mainFlickable.stopScroll()
2020-07-16 12:51:58 +00:00
}
2015-03-05 16:28:24 +00:00
}
}
}
2019-09-04 16:39:31 +00:00
Launcher.AppDrawer {
id: appDrawer
anchors.fill: parent
topPadding: plasmoid.availableScreenRect.y
bottomPadding: favoriteStrip.height + plasmoid.screenGeometry.height - plasmoid.availableScreenRect.height - plasmoid.availableScreenRect.y
2019-09-04 16:39:31 +00:00
}
2019-09-04 16:39:31 +00:00
Launcher.FavoriteStrip {
id: favoriteStrip
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
bottomMargin: plasmoid.screenGeometry.height - plasmoid.availableScreenRect.height - plasmoid.availableScreenRect.y
}
appletsLayout: appletsLayout
2021-03-18 17:27:18 +00:00
LauncherPrivate.DragGestureHandler {
target: favoriteStrip
2021-03-18 17:27:18 +00:00
appDrawer: appDrawer
mainFlickable: mainFlickable
enabled: root.focus && appDrawer.status !== Launcher.AppDrawer.Status.Open && !appletsLayout.editMode && !plasmoid.editMode && !launcherDragManager.active
onSnapPage: mainFlickable.snapPage();
}
TapHandler {
target: favoriteStrip
onTapped: {
//Hides icons close button
appletsLayout.appletsLayoutInteracted();
appletsLayout.editMode = false;
}
onLongPressed: appletsLayout.editMode = true;
onPressedChanged: root.focus = true;
}
2019-09-04 16:39:31 +00:00
}
}
2019-09-04 16:39:31 +00:00