mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-29 15:03:09 +00:00
Initial splashscreen rework (!31)
This commit is contained in:
parent
08e1e3a44c
commit
2291872e23
7 changed files with 184 additions and 21 deletions
|
|
@ -1,6 +1,7 @@
|
|||
set(homescreen_SRCS
|
||||
homescreen.cpp
|
||||
applicationlistmodel.cpp
|
||||
colouraverage.cpp
|
||||
)
|
||||
|
||||
add_library(plasma_containment_phone_homescreen MODULE ${homescreen_SRCS})
|
||||
|
|
|
|||
57
containments/homescreen/colouraverage.cpp
Normal file
57
containments/homescreen/colouraverage.cpp
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
/***************************************************************************
|
||||
* Copyright (C) 2019 Carson Black <uhhadd@gmail.com> *
|
||||
* *
|
||||
* 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 <QObject>
|
||||
#include <QColor>
|
||||
#include <QImage>
|
||||
#include <QDebug>
|
||||
#include <signal.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
30
containments/homescreen/colouraverage.h
Normal file
30
containments/homescreen/colouraverage.h
Normal file
|
|
@ -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 <QObject>
|
||||
#include <QColor>
|
||||
#include <QImage>
|
||||
|
||||
class ColourAverage : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ColourAverage(QObject* parent = nullptr);
|
||||
Q_INVOKABLE QColor averageColour(QImage img);
|
||||
};
|
||||
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
#include "homescreen.h"
|
||||
#include "applicationlistmodel.h"
|
||||
#include "colouraverage.h"
|
||||
|
||||
#include <QtQml>
|
||||
#include <QDebug>
|
||||
|
|
@ -28,6 +29,13 @@ HomeScreen::HomeScreen(QObject *parent, const QVariantList &args)
|
|||
: Plasma::Containment(parent, args)
|
||||
{
|
||||
qmlRegisterUncreatableType<ApplicationListModel>("org.kde.phone.homescreen", 1, 0, "ApplicationListModel", QStringLiteral("Cannot create item of type ApplicationListModel"));
|
||||
qmlRegisterSingletonType<ColourAverage>("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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue