diff --git a/containments/homescreen/package/contents/ui/launcher/Delegate.qml b/containments/homescreen/package/contents/ui/launcher/Delegate.qml index f0c1edd..301082c 100644 --- a/containments/homescreen/package/contents/ui/launcher/Delegate.qml +++ b/containments/homescreen/package/contents/ui/launcher/Delegate.qml @@ -1,165 +1,165 @@ /* * Copyright 2019 Marco Martin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. */ import QtQuick 2.4 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.phone.homescreen 1.0 ContainmentLayoutManager.ItemContainer { id: delegate z: dragActive ? 1 : 0 property var modelData: typeof model !== "undefined" ? model : null Layout.minimumWidth: launcherGrid.cellWidth Layout.minimumHeight: launcherGrid.cellHeight opacity: dragActive ? 0.4 : 1 key: model.ApplicationStorageIdRole property real dragCenterX property real dragCenterY editModeCondition: ContainmentLayoutManager.ItemContainer.AfterPressAndHold signal launch(int x, int y, var source, string title) 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; plasmoid.fullRepresentationItem.stopScroll(); launcherDragManager.currentlyDraggedDelegate = null; } } onUserDrag: { dragCenterX = dragCenter.x; dragCenterY = dragCenter.y; launcherDragManager.dragItem(delegate, dragCenter.x, dragCenter.y); delegate.width = launcherGrid.cellWidth; delegate.height = launcherGrid.cellHeight; var pos = plasmoid.fullRepresentationItem.mapFromItem(delegate, dragCenter.x, dragCenter.y); //SCROLL UP if (pos.y < plasmoid.availableScreenRect.y + units.gridUnit) { plasmoid.fullRepresentationItem.scrollUp(); //SCROLL DOWN } else if (pos.y > plasmoid.availableScreenRect.y + plasmoid.availableScreenRect.height - units.gridUnit) { plasmoid.fullRepresentationItem.scrollDown(); //DON't SCROLL } else { plasmoid.fullRepresentationItem.stopScroll(); } } contentItem: MouseArea { onClicked: { clickFedbackAnimation.target = delegate; clickFedbackAnimation.running = true; delegate.launch(delegate.x + (units.smallSpacing * 2), delegate.y + (units.smallSpacing * 2), icon.source, modelData.ApplicationNameRole) plasmoid.nativeInterface.applicationListModel.runApplication(modelData.ApplicationStorageIdRole); } //preventStealing: true ColumnLayout { anchors { fill: parent leftMargin: units.smallSpacing * 2 topMargin: units.smallSpacing * 2 rightMargin: units.smallSpacing * 2 bottomMargin: units.smallSpacing * 2 } spacing: 0 PlasmaCore.IconItem { id: icon Layout.alignment: Qt.AlignHCenter | Qt.AlignTop Layout.fillWidth: true Layout.minimumHeight: parent.height - root.reservedSpaceForLabel Layout.preferredHeight: Layout.minimumHeight source: modelData ? modelData.ApplicationIconRole : "" Behavior on scale { NumberAnimation { duration: units.longDuration easing.type: Easing.InOutQuad } } } PlasmaComponents.Label { id: label visible: text.length > 0 Layout.fillWidth: true Layout.preferredHeight: root.reservedSpaceForLabel wrapMode: Text.WordWrap Layout.leftMargin: -parent.anchors.leftMargin + units.smallSpacing Layout.rightMargin: -parent.anchors.rightMargin + units.smallSpacing horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignTop maximumLineCount: 2 //elide: Text.ElideRight elide: truncated ? Text.ElideLeft : Text.ElideRight text: { // This trick can get us a shorter text but without ... if (truncated) { return model.ApplicationNameRole + "\x9C" } else { return model.ApplicationNameRole; } } //FIXME: export smallestReadableFont font.pointSize: theme.defaultFont.pointSize * 0.9 - color: model.ApplicationLocationRole == ApplicationListModel.Desktop ? "white" : theme.textColor + color: "white"//model.ApplicationLocationRole == ApplicationListModel.Desktop ? "white" : theme.textColor - layer.enabled: model.ApplicationLocationRole == ApplicationListModel.Desktop + layer.enabled: true//model.ApplicationLocationRole == ApplicationListModel.Desktop layer.effect: DropShadow { horizontalOffset: 0 verticalOffset: 2 radius: 8.0 samples: 16 - color: Qt.rgba(0, 0, 0, 0.8) + color: Qt.rgba(0, 0, 0, 1) } } } } } diff --git a/containments/homescreen/package/contents/ui/launcher/LauncherContainer.qml b/containments/homescreen/package/contents/ui/launcher/LauncherContainer.qml index 17d14fe..532cdf9 100644 --- a/containments/homescreen/package/contents/ui/launcher/LauncherContainer.qml +++ b/containments/homescreen/package/contents/ui/launcher/LauncherContainer.qml @@ -1,102 +1,102 @@ /* * Copyright 2019 Marco Martin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. */ import QtQuick 2.4 import QtQuick.Layouts 1.1 import QtQuick.Controls 2.3 as Controls 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 Item { id: root readonly property int reservedSpaceForLabel: metrics.height property int availableCellHeight: units.iconSizes.huge + reservedSpaceForLabel property ContainmentLayoutManager.AppletsLayout appletsLayout property Item launcherGrid property Item favoriteStrip property alias frame: frame property alias flow: applicationsFlow implicitWidth: frame.implicitWidth - implicitHeight: frame.implicitHeight + implicitHeight: Math.max(units.gridUnit*3, frame.implicitHeight) Controls.Label { id: metrics text: "M\nM" visible: false font.pointSize: theme.defaultFont.pointSize * 0.9 } Item { id: spacer width: units.gridUnit * 4 height: width } Controls.Control { id: frame anchors.centerIn: parent implicitWidth: contentItem.implicitWidth + frameSvg.margins.top + frameSvg.margins.bottom implicitHeight: contentItem.implicitHeight + frameSvg.margins.top + frameSvg.margins.bottom leftPadding: frameSvg.margins.left topPadding: frameSvg.margins.top rightPadding: frameSvg.margins.right bottomPadding: frameSvg.margins.bottom background: PlasmaCore.FrameSvgItem { id: frameSvg - imagePath: "widgets/background" + //imagePath: "widgets/background" anchors.fill: parent } // With a mousearea, it will be possible to drag with touch also on empty places contentItem: MouseArea { implicitWidth: applicationsFlow.implicitWidth implicitHeight: applicationsFlow.implicitHeight Flow { id: applicationsFlow spacing: 0 anchors.fill: parent move: Transition { NumberAnimation { duration: units.longDuration easing.type: Easing.InOutQuad properties: "x,y" } } } } Behavior on implicitWidth { NumberAnimation { duration: units.longDuration easing.type: Easing.InOutQuad } } } } diff --git a/containments/homescreen/package/contents/ui/main.qml b/containments/homescreen/package/contents/ui/main.qml index e4aa75d..083bd41 100644 --- a/containments/homescreen/package/contents/ui/main.qml +++ b/containments/homescreen/package/contents/ui/main.qml @@ -1,336 +1,342 @@ /* * Copyright 2019 Marco Martin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import QtQuick 2.12 import QtQuick.Layouts 1.1 import QtGraphicalEffects 1.0 import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 3.0 as PlasmaComponents import org.kde.draganddrop 2.0 as DragDrop import "launcher" as Launcher import org.kde.plasma.private.containmentlayoutmanager 1.0 as ContainmentLayoutManager import org.kde.phone.homescreen 1.0 Item { id: root width: 640 height: 480 property Item toolBox //BEGIN functions //Autoscroll related functions function scrollUp() { autoScrollTimer.scrollDown = false; autoScrollTimer.running = true; scrollUpIndicator.opacity = 1; scrollDownIndicator.opacity = 0; } function scrollDown() { autoScrollTimer.scrollDown = true; autoScrollTimer.running = true; scrollUpIndicator.opacity = 0; scrollDownIndicator.opacity = 1; } function stopScroll() { autoScrollTimer.running = false; scrollUpIndicator.opacity = 0; scrollDownIndicator.opacity = 0; } function recalculateMaxFavoriteCount() { if (!componentComplete) { return; } plasmoid.nativeInterface.applicationListModel.maxFavoriteCount = Math.floor(Math.min(width, height) / launcher.cellWidth); } //END functions property bool componentComplete: false onWidthChanged: recalculateMaxFavoriteCount() onHeightChanged:recalculateMaxFavoriteCount() Component.onCompleted: { componentComplete = true; recalculateMaxFavoriteCount() } Timer { id: autoScrollTimer property bool scrollDown: true repeat: true interval: 1500 onTriggered: { scrollAnim.to = scrollDown ? //Scroll down Math.min(mainFlickable.contentItem.height - root.height, mainFlickable.contentY + root.height/2) : //Scroll up Math.max(0, mainFlickable.contentY - root.height/2); scrollAnim.running = true; } } Connections { target: plasmoid onEditModeChanged: { appletsLayout.editMode = plasmoid.editMode } } FeedbackWindow { id: feedbackWindow } SequentialAnimation { id: clickFedbackAnimation property Item target NumberAnimation { target: clickFedbackAnimation.target properties: "scale" to: 2 duration: units.longDuration easing.type: Easing.InOutQuad } PauseAnimation { duration: units.shortDuration } NumberAnimation { target: clickFedbackAnimation.target properties: "scale" to: 1 duration: units.longDuration easing.type: Easing.InOutQuad } } Launcher.LauncherDragManager { id: launcherDragManager anchors.fill: parent z: 2 appletsLayout: appletsLayout launcherGrid: launcher favoriteStrip: favoriteStrip } Flickable { id: mainFlickable width: parent.width + clip: true anchors { fill: parent topMargin: plasmoid.availableScreenRect.y - bottomMargin: plasmoid.screenGeometry.height - plasmoid.availableScreenRect.height - plasmoid.availableScreenRect.y + bottomMargin: favoriteStrip.height//plasmoid.screenGeometry.height - plasmoid.availableScreenRect.height - plasmoid.availableScreenRect.y } - bottomMargin: favoriteStrip.height + //bottomMargin: favoriteStrip.height contentWidth: width contentHeight: flickableContents.height interactive: !plasmoid.editMode && !launcherDragManager.active PlasmaComponents.ScrollBar.vertical: PlasmaComponents.ScrollBar { id: scrollabr opacity: mainFlickable.moving interactive: false Behavior on opacity { OpacityAnimator { duration: units.longDuration * 2 easing.type: Easing.InOutQuad } } } NumberAnimation { id: scrollAnim target: mainFlickable properties: "contentY" duration: units.longDuration easing.type: Easing.InOutQuad } Column { id: flickableContents width: mainFlickable.width - spacing: Math.max(0, favoriteStrip.frame.height + favoriteStrip.anchors.bottomMargin - mainFlickable.contentY) + spacing: 0 DragDrop.DropArea { anchors { left: parent.left right: parent.right } - height: mainFlickable.height - favoriteStrip.frame.height //TODO: multiple widgets pages + height: mainFlickable.height //TODO: multiple widgets pages onDragEnter: { event.accept(event.proposedAction); } onDragMove: { appletsLayout.showPlaceHolderAt( Qt.rect(event.x - appletsLayout.defaultItemWidth / 2, event.y - appletsLayout.defaultItemHeight / 2, appletsLayout.defaultItemWidth, appletsLayout.defaultItemHeight) ); } onDragLeave: { appletsLayout.hidePlaceHolder(); } preventStealing: true onDrop: { 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 } PlasmaCore.IconItem { z: 9 anchors { horizontalCenter: parent.horizontalCenter bottom: parent.bottom } source: "arrow-up" width: units.iconSizes.medium height: width colorGroup: PlasmaCore.Theme.ComplementaryColorGroup MouseArea { anchors { fill: parent margins: -units.smallSpacing } onClicked: mainFlickable.flick(0, -mainFlickable.height) } } ContainmentLayoutManager.AppletsLayout { id: appletsLayout anchors.fill: parent cellWidth: Math.floor(width / launcher.columns) cellHeight: launcher.cellHeight configKey: width > height ? "ItemGeometriesHorizontal" : "ItemGeometriesVertical" containment: plasmoid editModeCondition: plasmoid.immutable ? ContainmentLayoutManager.AppletsLayout.Manual : ContainmentLayoutManager.AppletsLayout.AfterPressAndHold // Sets the containment in edit mode when we go in edit mode as well onEditModeChanged: plasmoid.editMode = editMode minimumItemWidth: units.gridUnit * 3 minimumItemHeight: minimumItemWidth defaultItemWidth: units.gridUnit * 6 defaultItemHeight: defaultItemWidth //cellWidth: units.iconSizes.small //cellHeight: cellWidth acceptsAppletCallback: function(applet, x, y) { print("Applet: "+applet+" "+x+" "+y) return true; } appletContainerComponent: ContainmentLayoutManager.BasicAppletContainer { id: appletContainer configOverlayComponent: ConfigOverlay {} onEditModeChanged: { launcherDragManager.active = dragActive || editMode; } onDragActiveChanged: { launcherDragManager.active = dragActive || editMode; } } placeHolder: ContainmentLayoutManager.PlaceHolder {} } } Launcher.LauncherGrid { id: launcher anchors { left: parent.left right: parent.right } favoriteStrip: favoriteStrip appletsLayout: appletsLayout } } } ScrollIndicator { id: scrollUpIndicator anchors { top: parent.top topMargin: units.gridUnit * 2 } elementId: "up-arrow" } ScrollIndicator { id: scrollDownIndicator anchors { bottom: favoriteStrip.top bottomMargin: units.gridUnit } elementId: "down-arrow" } + Rectangle { + anchors { + left: parent.left + right: parent.right + bottom: favoriteStrip.top + leftMargin: units.gridUnit + rightMargin: units.gridUnit + } + height: 1 + opacity: mainFlickable.contentY > 0 ? 0.6 : 0 + Behavior on opacity { + OpacityAnimator { + duration: units.longDuration * 2 + easing.type: Easing.InOutQuad + } + } + } 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 launcherGrid: launcher //y: Math.max(krunner.inputHeight, root.height - height - mainFlickable.contentY) } - -// KRunner { -// id: krunner -// z: 998 -// height: plasmoid.availableScreenRect.height -// topPadding: plasmoid.availableScreenRect.y -// anchors { -// top: parent.top -// left: parent.left -// right: parent.right -// } -// } }