From d15262b394b580f5ef7715cdff73e2dd246a295f Mon Sep 17 00:00:00 2001 From: Carson Black Date: Fri, 20 Dec 2019 12:14:15 +0530 Subject: [PATCH] Initial splashscreen rework (!31) --- containments/homescreen/CMakeLists.txt | 1 + containments/homescreen/colouraverage.cpp | 57 +++++++++++++++++++ containments/homescreen/colouraverage.h | 30 ++++++++++ containments/homescreen/homescreen.cpp | 8 +++ .../package/contents/ui/FeedbackWindow.qml | 46 +++++++++------ .../package/contents/ui/launcher/Delegate.qml | 7 ++- .../contents/ui/launcher/LauncherGrid.qml | 56 ++++++++++++++++++ 7 files changed, 184 insertions(+), 21 deletions(-) create mode 100644 containments/homescreen/colouraverage.cpp create mode 100644 containments/homescreen/colouraverage.h diff --git a/containments/homescreen/CMakeLists.txt b/containments/homescreen/CMakeLists.txt index 1e185c14..d9eedc67 100644 --- a/containments/homescreen/CMakeLists.txt +++ b/containments/homescreen/CMakeLists.txt @@ -1,6 +1,7 @@ set(homescreen_SRCS homescreen.cpp applicationlistmodel.cpp + colouraverage.cpp ) add_library(plasma_containment_phone_homescreen MODULE ${homescreen_SRCS}) diff --git a/containments/homescreen/colouraverage.cpp b/containments/homescreen/colouraverage.cpp new file mode 100644 index 00000000..b8e1a3f1 --- /dev/null +++ b/containments/homescreen/colouraverage.cpp @@ -0,0 +1,57 @@ +/*************************************************************************** + * Copyright (C) 2019 Carson Black * + * * + * 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 02110-1301 USA . * + ***************************************************************************/ + +#include +#include +#include +#include +#include + +#include "colouraverage.h" + +ColourAverage::ColourAverage(QObject* parent) : QObject(parent) {} + +QColor ColourAverage::averageColour(QImage img) { + int r = 0; + int g = 0; + int b = 0; + int c = 0; + + for (int i = 0; i < img.width(); i++) { + for (int ii = 0; ii < img.height(); ii++) { + QRgb pix = img.pixel(i, ii); + if (pix == 0) + continue; + + c++; + r += qRed(pix); + g += qGreen(pix); + b += qBlue(pix); + } + } + r = r / c; + g = g / c; + b = b / c; + + QColor color = QColor::fromRgb(r,g,b); + + color.setHsv(color.hue(), color.saturation() / 4, color.value()); + + return color; +} \ No newline at end of file diff --git a/containments/homescreen/colouraverage.h b/containments/homescreen/colouraverage.h new file mode 100644 index 00000000..a5bd4a72 --- /dev/null +++ b/containments/homescreen/colouraverage.h @@ -0,0 +1,30 @@ +/*************************************************************************** + * Copyright (C) 2019 Carson Black * + * * + * 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 02110-1301 USA . * + ***************************************************************************/ + +#include +#include +#include + +class ColourAverage : public QObject +{ + Q_OBJECT +public: + explicit ColourAverage(QObject* parent = nullptr); + Q_INVOKABLE QColor averageColour(QImage img); +}; \ No newline at end of file diff --git a/containments/homescreen/homescreen.cpp b/containments/homescreen/homescreen.cpp index 3ba96442..c006de8e 100644 --- a/containments/homescreen/homescreen.cpp +++ b/containments/homescreen/homescreen.cpp @@ -19,6 +19,7 @@ #include "homescreen.h" #include "applicationlistmodel.h" +#include "colouraverage.h" #include #include @@ -28,6 +29,13 @@ HomeScreen::HomeScreen(QObject *parent, const QVariantList &args) : Plasma::Containment(parent, args) { qmlRegisterUncreatableType("org.kde.phone.homescreen", 1, 0, "ApplicationListModel", QStringLiteral("Cannot create item of type ApplicationListModel")); + qmlRegisterSingletonType("org.kde.phone.homescreen", 1, 0, "ColourAverage", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * { + Q_UNUSED(engine); + Q_UNUSED(scriptEngine); + + ColourAverage *obj = new ColourAverage(); + return obj; + }); setHasConfigurationInterface(true); } diff --git a/containments/homescreen/package/contents/ui/FeedbackWindow.qml b/containments/homescreen/package/contents/ui/FeedbackWindow.qml index 15b92488..f5b3c3c6 100644 --- a/containments/homescreen/package/contents/ui/FeedbackWindow.qml +++ b/containments/homescreen/package/contents/ui/FeedbackWindow.qml @@ -23,6 +23,9 @@ import QtQuick.Window 2.2 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as PlasmaComponents import org.kde.plasma.extras 2.0 as PlasmaExtras +import QtGraphicalEffects 1.12 + +import org.kde.phone.homescreen 1.0 Window { id: window @@ -52,24 +55,26 @@ Window { state: "closed" Rectangle { anchors.fill: parent - color: background.backgroundColor - - ColumnLayout { + color: PlasmaCore.Theme.backgroundColor + Rectangle { + id: rect + anchors.fill: parent + } + PlasmaCore.IconItem { anchors.centerIn: parent - PlasmaCore.IconItem { - id: icon - colorGroup: PlasmaCore.Theme.ComplementaryColorGroup - Layout.preferredWidth: units.iconSizes.enormous - Layout.preferredHeight: Layout.preferredWidth - Layout.alignment: Qt.AlignCenter - } - PlasmaExtras.Heading { - text: window.title - Layout.alignment: Qt.AlignCenter - } - /* PlasmaComponents.BusyIndicator { - Layout.alignment: Qt.AlignCenter - }*/ + id: icon + colorGroup: PlasmaCore.Theme.ComplementaryColorGroup + width: units.iconSizes.enormous + height: width + } + DropShadow { + anchors.fill: icon + horizontalOffset: 0 + verticalOffset: 0 + radius: 8.0 + samples: 17 + color: "#80000000" + source: icon } } @@ -103,7 +108,12 @@ Window { from: "closed" SequentialAnimation { ScriptAction { - script: window.visible = true; + script: { + window.visible = true; + icon.grabToImage((img) => { + rect.color = ColourAverage.averageColour(img.image) + }) + } } PropertyAnimation { target: background diff --git a/containments/homescreen/package/contents/ui/launcher/Delegate.qml b/containments/homescreen/package/contents/ui/launcher/Delegate.qml index 9587c3f0..f0c1edd9 100644 --- a/containments/homescreen/package/contents/ui/launcher/Delegate.qml +++ b/containments/homescreen/package/contents/ui/launcher/Delegate.qml @@ -48,6 +48,8 @@ ContainmentLayoutManager.ItemContainer { editModeCondition: ContainmentLayoutManager.ItemContainer.AfterPressAndHold + signal launch(int x, int y, var source, string title) + onDragActiveChanged: { launcherDragManager.active = dragActive if (dragActive) { @@ -88,9 +90,8 @@ ContainmentLayoutManager.ItemContainer { onClicked: { clickFedbackAnimation.target = delegate; clickFedbackAnimation.running = true; - feedbackWindow.title = modelData.ApplicationNameRole; - feedbackWindow.icon = modelData.ApplicationIconRole; - feedbackWindow.state = "open"; + + delegate.launch(delegate.x + (units.smallSpacing * 2), delegate.y + (units.smallSpacing * 2), icon.source, modelData.ApplicationNameRole) plasmoid.nativeInterface.applicationListModel.runApplication(modelData.ApplicationStorageIdRole); } diff --git a/containments/homescreen/package/contents/ui/launcher/LauncherGrid.qml b/containments/homescreen/package/contents/ui/launcher/LauncherGrid.qml index 8cc91808..5d191b0c 100644 --- a/containments/homescreen/package/contents/ui/launcher/LauncherGrid.qml +++ b/containments/homescreen/package/contents/ui/launcher/LauncherGrid.qml @@ -39,6 +39,58 @@ LauncherContainer { frame.width: width + PlasmaCore.IconItem { + id: effect + height: 64 + width: 64 + visible: false + x: 0 + y: 0 + + source: "pattern-kde" + property string title + + SequentialAnimation { + id: woosh + ScriptAction { + script: effect.visible = true + } + ParallelAnimation { + NumberAnimation { + target: effect + property: "opacity" + from: 0.9 + to: 0 + duration: 200 + } + NumberAnimation { + target: effect + property: "scale" + from: 1 + to: 3 + duration: 200 + } + } + ScriptAction { + script: { + feedbackWindow.title = effect.title + feedbackWindow.icon = effect.source + feedbackWindow.state = "open" + effect.visible = false + } + } + } + + function swoosh(x, y, sauce, title) { + effect.x = x + effect.y = y + effect.source = sauce + effect.visible = true + effect.title = title + woosh.restart() + } + } + Repeater { parent: root.flow model: plasmoid.nativeInterface.applicationListModel @@ -63,6 +115,10 @@ LauncherContainer { appletsLayout.restoreItem(delegate); } } + onLaunch: (a, b, c, d) => { + print(a,b,c,d) + effect.swoosh(a, b, c, d) + } onParentFromLocationChanged: { if (!launcherDragManager.active && parent != parentFromLocation) { parent = parentFromLocation;