mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 14:23:09 +00:00
Move most of the homescreen pieces in a QML import that can be reused making it easier to do alternative homescreens
127 lines
4.9 KiB
QML
127 lines
4.9 KiB
QML
/*
|
|
* SPDX-FileCopyrightText: 2021 Marco Martin <mart@kde.org>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
import QtQuick 2.14
|
|
import QtQuick.Layouts 1.1
|
|
import QtQuick.Controls 2.3 as Controls
|
|
import QtGraphicalEffects 1.6
|
|
|
|
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.containmentlayoutmanager 1.0 as ContainmentLayoutManager
|
|
import org.kde.plasma.private.mobileshell 1.0 as MobileShell
|
|
import org.kde.plasma.private.nanoshell 2.0 as NanoShell
|
|
import org.kde.kirigami 2.14 as Kirigami
|
|
import org.kde.plasma.private.mobilehomescreencomponents 0.1 as HomeScreenComponents
|
|
|
|
Repeater {
|
|
id: launcherRepeater
|
|
model: HomeScreenComponents.FavoritesModel
|
|
property ContainmentLayoutManager.AppletsLayout appletsLayout
|
|
property FavoriteStrip favoriteStrip
|
|
property int cellWidth
|
|
property int cellHeight
|
|
|
|
signal scrollLeftRequested
|
|
signal scrollRightRequested
|
|
signal stopScrollRequested
|
|
|
|
delegate: HomeDelegate {
|
|
id: delegate
|
|
width: launcherRepeater.cellWidth
|
|
height: Math.min(parent.height, launcherRepeater.cellHeight)
|
|
appletsLayout: launcherRepeater.appletsLayout
|
|
|
|
//just the normal inline binding in height: fails as it gets broken, make it explicit
|
|
Binding {
|
|
target: delegate
|
|
property: "height"
|
|
value: Math.min(delegate.parent.height, launcherRepeater.cellHeight)
|
|
}
|
|
parent: parentFromLocation
|
|
reservedSpaceForLabel: metrics.height
|
|
property Item parentFromLocation: {
|
|
switch (model.applicationLocation) {
|
|
case HomeScreenComponents.ApplicationListModel.Favorites:
|
|
return favoriteStrip.flow;
|
|
case HomeScreenComponents.ApplicationListModel.Desktop:
|
|
default:
|
|
return appletsLayout;
|
|
}
|
|
}
|
|
Component.onCompleted: {
|
|
if (model.applicationLocation === HomeScreenComponents.ApplicationListModel.Desktop) {
|
|
appletsLayout.restoreItem(delegate);
|
|
}
|
|
}
|
|
|
|
onUserDrag: {
|
|
dragCenterX = dragCenter.x;
|
|
dragCenterY = dragCenter.y;
|
|
launcherDragManager.dragItem(delegate, dragCenter.x, dragCenter.y);
|
|
|
|
delegate.width = appletsLayout.cellWidth;
|
|
delegate.height = appletsLayout.cellHeight;
|
|
|
|
var pos = plasmoid.fullRepresentationItem.mapFromItem(delegate, dragCenter.x, dragCenter.y);
|
|
|
|
//SCROLL LEFT
|
|
if (pos.x < units.gridUnit) {
|
|
launcherRepeater.scrollLeftRequested();
|
|
//SCROLL RIGHT
|
|
} else if (pos.x > mainFlickable.width - units.gridUnit) {
|
|
launcherRepeater.scrollRightRequested();
|
|
//DON't SCROLL
|
|
} else {
|
|
launcherRepeater.stopScrollRequested();
|
|
}
|
|
}
|
|
|
|
onDragActiveChanged: {
|
|
launcherDragManager.active = dragActive
|
|
if (dragActive) {
|
|
// Must be 0, 0 as at this point dragCenterX and dragCenterY are on the drag before"
|
|
launcherDragManager.startDrag(delegate);
|
|
launcherDragManager.currentlyDraggedDelegate = delegate;
|
|
} else {
|
|
launcherDragManager.dropItem(delegate, dragCenterX, dragCenterY);
|
|
plasmoid.editMode = false;
|
|
editMode = false;
|
|
launcherRepeater.stopScrollRequested();
|
|
launcherDragManager.currentlyDraggedDelegate = null;
|
|
forceActiveFocus();
|
|
}
|
|
}
|
|
|
|
onLaunch: (x, y, icon, title) => {
|
|
if (icon !== "") {
|
|
print(delegate.iconItem)
|
|
NanoShell.StartupFeedback.open(
|
|
icon,
|
|
title,
|
|
delegate.iconItem.Kirigami.ScenePosition.x + delegate.iconItem.width/2,
|
|
delegate.iconItem.Kirigami.ScenePosition.y + delegate.iconItem.height/2,
|
|
Math.min(delegate.iconItem.width, delegate.iconItem.height));
|
|
}
|
|
root.launched();
|
|
}
|
|
onParentFromLocationChanged: {
|
|
if (!launcherDragManager.active && parent != parentFromLocation) {
|
|
parent = parentFromLocation;
|
|
if (model.applicationLocation === HomeScreenComponents.ApplicationListModel.Favorites) {
|
|
plasmoid.nativeInterface.stackBefore(delegate, parentFromLocation.children[index]);
|
|
|
|
} else if (model.applicationLocation === HomeScreenComponents.ApplicationListModel.Grid) {
|
|
plasmoid.nativeInterface.stackBefore(delegate, parentFromLocation.children[Math.max(0, index - HomeScreenComponents.ApplicationListModel.favoriteCount)]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|