From 8e59ada22ee36f9d5624fdbe1c3a10bc0536f3fb Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Wed, 17 Jun 2015 14:59:12 -0700 Subject: [PATCH 01/23] fix build --- containments/taskpanel/taskpanel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containments/taskpanel/taskpanel.cpp b/containments/taskpanel/taskpanel.cpp index 5c0fd801..f82b9c68 100644 --- a/containments/taskpanel/taskpanel.cpp +++ b/containments/taskpanel/taskpanel.cpp @@ -72,7 +72,7 @@ void TaskPanel::loadScriptFinishedSlot(QDBusPendingCallWatcher *watcher) QDBusConnection::sessionBus().connect(s_kwinService, "/" + QString::number(id), QString(), "printError", this, SLOT(print(QString))); QDBusMessage message = QDBusMessage::createMethodCall(s_kwinService, "/" + QString::number(id), QString(), "run"); //fire blindly the call for now - reply = QDBusConnection::sessionBus().asyncCall(message); + QDBusConnection::sessionBus().asyncCall(message); } } From 35fa1e62c8156be6083809e7cea062823a0c0ef5 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Wed, 17 Jun 2015 15:25:56 -0700 Subject: [PATCH 02/23] show if showOnCurrentPlatform (flip condition) --- containments/homescreen/applicationlistmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containments/homescreen/applicationlistmodel.cpp b/containments/homescreen/applicationlistmodel.cpp index a14adc86..2dcee31a 100644 --- a/containments/homescreen/applicationlistmodel.cpp +++ b/containments/homescreen/applicationlistmodel.cpp @@ -110,7 +110,7 @@ void ApplicationListModel::loadApplications() KService::Ptr service(static_cast(entry.data())); if (service->isApplication() && !blacklist.contains(service->desktopEntryName() + QStringLiteral(".desktop")) && - !service->showOnCurrentPlatform() && + service->showOnCurrentPlatform() && !service->property("Terminal", QVariant::Bool).toBool()) { data.name = service->name(); From 578f998f38a88ffccdabdbab4ed8d2bcf3abc2fc Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Wed, 17 Jun 2015 23:00:56 -0700 Subject: [PATCH 03/23] fix the math for unlocking --- containments/homescreen/package/contents/ui/main.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containments/homescreen/package/contents/ui/main.qml b/containments/homescreen/package/contents/ui/main.qml index e712fb7c..2ae0ebd1 100644 --- a/containments/homescreen/package/contents/ui/main.qml +++ b/containments/homescreen/package/contents/ui/main.qml @@ -404,7 +404,7 @@ MouseEventListener { //scrolling up } else if (verticalVelocity < 0 && contentY < -headerItem.height + root.height && - contentY < (-headerItem.height + root.height/6)) { + contentY < (-headerItem.height + root.height/6*5)) { scrollAnim.to = -headerItem.height; scrollAnim.running = true; return; From 69b7459f10f44bfd1178f32b9bd56da70676d9eb Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 11:43:20 -0700 Subject: [PATCH 04/23] Add a fake startup notification window add a window shown when an application is started hide the window when a new one appears. it's an approximation, we still need a real startup notification system --- .../package/contents/ui/FeedbackWindow.qml | 101 ++++++++++++++++++ .../homescreen/package/contents/ui/main.qml | 4 + 2 files changed, 105 insertions(+) create mode 100644 containments/homescreen/package/contents/ui/FeedbackWindow.qml diff --git a/containments/homescreen/package/contents/ui/FeedbackWindow.qml b/containments/homescreen/package/contents/ui/FeedbackWindow.qml new file mode 100644 index 00000000..da91e8ab --- /dev/null +++ b/containments/homescreen/package/contents/ui/FeedbackWindow.qml @@ -0,0 +1,101 @@ +/* + * Copyright 2015 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.0 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.2 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents + +Window { + id: window + + property alias state: background.state + width: Screen.width + height: Screen.height + color: "transparent" + onVisibleChanged: { + if (!visible) { + background.state = "closed"; + } + } + onActiveChanged: { + if (!active) { + background.state = "closed"; + } + } + + Rectangle { + id: background + color: Qt.rgba(0, 0, 0, 0.8) + width: window.width + height: window.height + state: "closed" + + PlasmaCore.ColorScope { + anchors.fill: parent + colorGroup: PlasmaCore.Theme.ComplementaryColorGroup + PlasmaComponents.BusyIndicator { + anchors.centerIn: parent + } + } + + states: [ + State { + name: "closed" + PropertyChanges { + target: background + scale: 0 + } + PropertyChanges { + target: window + visible: false + } + }, + State { + name: "open" + PropertyChanges { + target: background + scale: 1 + } + PropertyChanges { + target: window + visible: true + } + } + ] + + transitions: [ + Transition { + from: "closed" + SequentialAnimation { + ScriptAction { + script: window.visible = true; + } + PropertyAnimation { + target: background + duration: units.longDuration + easing.type: Easing.InOutQuad + properties: "scale" + } + } + } + ] + } +} diff --git a/containments/homescreen/package/contents/ui/main.qml b/containments/homescreen/package/contents/ui/main.qml index 2ae0ebd1..93171728 100644 --- a/containments/homescreen/package/contents/ui/main.qml +++ b/containments/homescreen/package/contents/ui/main.qml @@ -256,6 +256,7 @@ MouseEventListener { return; } + feedbackWindow.state = "open"; plasmoid.nativeInterface.applicationListModel.runApplication(item.modelData.ApplicationStorageIdRole); clickFedbackAnimation.target = item; clickFedbackAnimation.running = true; @@ -281,6 +282,9 @@ MouseEventListener { easing.type: Easing.InOutQuad } } + FeedbackWindow { + id: feedbackWindow + } PlasmaCore.ColorScope { anchors.fill: parent //TODO: decide what color we want applets From 7d8e4e0d8ca5375e344b768b901077432ee03467 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 12:13:56 -0700 Subject: [PATCH 05/23] same title on the transient window --- containments/homescreen/package/contents/ui/main.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/containments/homescreen/package/contents/ui/main.qml b/containments/homescreen/package/contents/ui/main.qml index 93171728..4882ed9b 100644 --- a/containments/homescreen/package/contents/ui/main.qml +++ b/containments/homescreen/package/contents/ui/main.qml @@ -256,6 +256,7 @@ MouseEventListener { return; } + feedbackWindow.title = item.modelData.ApplicationNameRole; feedbackWindow.state = "open"; plasmoid.nativeInterface.applicationListModel.runApplication(item.modelData.ApplicationStorageIdRole); clickFedbackAnimation.target = item; From 89935a1d21478e0a6a4ac4672b20c5939bcad5bf Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 12:17:53 -0700 Subject: [PATCH 06/23] don't reset homescreen scroll position --- containments/homescreen/package/contents/ui/main.qml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/containments/homescreen/package/contents/ui/main.qml b/containments/homescreen/package/contents/ui/main.qml index 4882ed9b..7d0e2fb2 100644 --- a/containments/homescreen/package/contents/ui/main.qml +++ b/containments/homescreen/package/contents/ui/main.qml @@ -41,12 +41,6 @@ MouseEventListener { LayoutManager.save(); } - Plasmoid.onFocusChanged: { - if (!plasmoid.focus && applicationsView.contentY > -(applicationsView.headerItem.height - root.height/2)) { - applicationsView.contentY = -root.height; - } - } - function addApplet(applet, x, y) { var container = appletContainerComponent.createObject(appletsSpace.layout) container.visible = true From 15803f7672d27f0d7df1ee6ef82c71a45c28d498 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 13:40:36 -0700 Subject: [PATCH 07/23] adjust centering of bookmark icons --- containments/homescreen/package/contents/ui/HomeLauncher.qml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/containments/homescreen/package/contents/ui/HomeLauncher.qml b/containments/homescreen/package/contents/ui/HomeLauncher.qml index ffd23976..1aa8629b 100644 --- a/containments/homescreen/package/contents/ui/HomeLauncher.qml +++ b/containments/homescreen/package/contents/ui/HomeLauncher.qml @@ -15,7 +15,10 @@ Item { PlasmaCore.IconItem { id: icon - anchors.centerIn: parent + anchors { + centerIn: parent + verticalCenterOffset: -theme.mSize(theme.defaultFont).height + } width: parent.height / 2 height: width source: modelData.ApplicationIconRole From 608be69047eb01c26c9c4c53598bcc1cef769536 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 16:31:26 -0700 Subject: [PATCH 08/23] stub for the task manager --- .../package/contents/ui/TaskSwitcher.qml | 129 ++++++++++++++++++ .../taskpanel/package/contents/ui/main.qml | 73 ++++++---- 2 files changed, 174 insertions(+), 28 deletions(-) create mode 100644 containments/taskpanel/package/contents/ui/TaskSwitcher.qml diff --git a/containments/taskpanel/package/contents/ui/TaskSwitcher.qml b/containments/taskpanel/package/contents/ui/TaskSwitcher.qml new file mode 100644 index 00000000..959612cf --- /dev/null +++ b/containments/taskpanel/package/contents/ui/TaskSwitcher.qml @@ -0,0 +1,129 @@ +/* + * Copyright 2015 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.0 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.2 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents + +Window { + id: window + + visible: false + width: Screen.width + height: Screen.height + property int offset: 0 + property int overShoot: units.gridUnit * 2 + + color: Qt.rgba(0, 0, 0, 0.6 * (Math.min(tasksView.contentY + window.height, window.height) / window.height)) + + function show() { + visible = true; + scrollAnim.to = 0; + scrollAnim.running = true; + } + function hide() { + scrollAnim.to = -tasksView.headerItem.height; + scrollAnim.running = true; + } + + SequentialAnimation { + id: scrollAnim + property alias to: internalAnim.to + ScriptAction { + script: window.visible = true; + } + NumberAnimation { + id: internalAnim + target: tasksView + properties: "contentY" + duration: units.longDuration + easing.type: Easing.InOutQuad + } + ScriptAction { + script: { + if (tasksView.contentY <= -tasksView.headerItem.height) { + window.visible = false; + } + } + } + } + GridView { + id: tasksView + width: window.width + height: window.height + cellWidth: window.width/2 + cellHeight: window.height/2 + onFlickingChanged: { + if (!draggingVertically && contentY < -headerItem.height + window.height) { + scrollAnim.to = Math.round(contentY/window.height) * window.height + scrollAnim.running = true; + } + } + onDraggingVerticallyChanged: { + if (draggingVertically) { + return; + } + + //manage separately the first page, the lockscreen + //scrolling down + if (verticalVelocity > 0 && contentY < -headerItem.height + window.height && + contentY > (-headerItem.height + window.height/6)) { + show(); + return; + + //scrolling up + } else if (verticalVelocity < 0 && contentY < -headerItem.height + window.height && + contentY < (-headerItem.height + window.height/6*5)) { + hide(); + return; + } + + if (contentY < 0) { + show(); + } + } + + model: 10 + header: Item { + width: window.width + height: window.height + } + delegate: Item { + width: window.width/2 + height: window.height/2 + Rectangle { + anchors { + fill: parent + margins: units.gridUnit + } + radius: units.gridUnit + opacity: 0.8 + PlasmaComponents.Label { + anchors { + bottom: parent.bottom + horizontalCenter: parent.horizontalCenter + } + text: "Task " + modelData + } + } + } + } +} diff --git a/containments/taskpanel/package/contents/ui/main.qml b/containments/taskpanel/package/contents/ui/main.qml index 506bab38..30e38b11 100644 --- a/containments/taskpanel/package/contents/ui/main.qml +++ b/containments/taskpanel/package/contents/ui/main.qml @@ -24,39 +24,56 @@ import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as PlasmaComponents import org.kde.kquickcontrolsaddons 2.0 -Rectangle { - anchors.fill: parent - //TODO: decide what color we want applets - color: theme.backgroundColor - +PlasmaCore.ColorScope { + id: root width: 600 - height: 40 + height: 480 + colorGroup: PlasmaCore.Theme.ComplementaryColorGroup - property Item toolBox - - PlasmaComponents.ToolButton { - id: showDesktopButton - height: parent.height - width: height - anchors.horizontalCenter: parent.horizontalCenter - iconSource: "go-home" - checkable: true - onCheckedChanged: { - plasmoid.nativeInterface.showDesktop = checked; + TaskSwitcher { + id: taskSwitcher + } + Rectangle { + anchors.fill: parent + color: root.backgroundColor + + width: 600 + height: 40 + + property Item toolBox + + Button { + anchors.left: parent.left + height: parent.height + width: parent.width/3 + iconSource: "applications-other" + onClicked: taskSwitcher.visible ? taskSwitcher.hide() : taskSwitcher.show(); } - Connections { - target: plasmoid.nativeInterface - onShowingDesktopChanged: { - showDesktopButton.checked = plasmoid.nativeInterface.showDesktop; + + Button { + id: showDesktopButton + height: parent.height + width: parent.width/3 + anchors.horizontalCenter: parent.horizontalCenter + iconSource: "go-home" + checkable: true + onCheckedChanged: {print (checked) + plasmoid.nativeInterface.showDesktop = checked; + } + Connections { + target: plasmoid.nativeInterface + onShowingDesktopChanged: { + showDesktopButton.checked = plasmoid.nativeInterface.showDesktop; + } } } - } - PlasmaComponents.ToolButton { - height: parent.height - width: height - anchors.right: parent.right - iconSource: "window-close" - onClicked: plasmoid.nativeInterface.executeScript("close"); + Button { + height: parent.height + width: parent.width/3 + anchors.right: parent.right + iconSource: "window-close" + onClicked: plasmoid.nativeInterface.executeScript("close"); + } } } From df0fd34bc1db57dc013a056b520aecc2611de8e5 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Fri, 19 Jun 2015 01:31:44 +0200 Subject: [PATCH 09/23] Rename satellite to plasma.phone All interfaces are now consistent and start with 'org.kde.plasma.phone' Reviewed-By: Marco Martin --- CMakeLists.txt | 8 ++++---- README.md | 2 +- .../quicksettings/package/contents/ui/main.qml | 2 +- bin/plasma-phone.cmake | 2 +- dbus/CMakeLists.txt | 10 +++++----- look-and-feel/metadata.desktop | 4 ++-- packaging/plasma-phone-components.spec | 2 +- services/CMakeLists.txt | 18 +++++++++--------- services/plasma-phone-compositor.service.cmake | 2 +- services/plasma-phone-ui.service.cmake | 2 +- settingsmodules/CMakeLists.txt | 2 +- settingsmodules/wireless/metadata.desktop | 2 +- shell/contents/defaults | 2 +- shell/contents/layout.js | 2 +- shell/contents/loader.qml | 2 +- shell/metadata.desktop | 2 +- wallpaper/metadata.desktop | 4 ++-- 17 files changed, 34 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 70e0afc7..28ac378c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,12 +37,12 @@ feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAG include(CheckIncludeFiles) -plasma_install_package(look-and-feel org.kde.satellite.phone look-and-feel) -plasma_install_package(shell org.kde.satellite.phone shells) -install(DIRECTORY wallpaper/ DESTINATION "${WALLPAPER_INSTALL_DIR}/org.kde.satellite.lockers") +plasma_install_package(look-and-feel org.kde.plasma.phone look-and-feel) +plasma_install_package(shell org.kde.plasma.phone shells) +install(DIRECTORY wallpaper/ DESTINATION "${WALLPAPER_INSTALL_DIR}/org.kde.plasma.phone.lockers") install(DIRECTORY compositor/ - DESTINATION ${DATA_INSTALL_DIR}/greenisland/org.kde.satellite.compositor.phone + DESTINATION ${DATA_INSTALL_DIR}/greenisland/org.kde.plasma.phone.compositor PATTERN .svn EXCLUDE PATTERN CMakeLists.txt EXCLUDE PATTERN Messages.sh EXCLUDE diff --git a/README.md b/README.md index f7137b63..ec7e46dc 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,6 @@ http://comments.gmane.org/gmane.comp.handhelds.ofono/12178 phonesim -p 12345 -gui /usr/share/phonesim/default.xml * from the oFono *source* directory, call /test/enable-modem to bring the modem up, the control UI should come up * call test/online-modem to activate the test phonesim modem -* start plasma with plasmashell -w -p org.kde.satellite.phone to start the phone homescreen in a window +* start plasma with plasmashell -w -p org.kde.plasma.phone to start the phone homescreen in a window Note that the oFono/phonesim part is necessary only if it's needed to test some part specific to telephony diff --git a/applets/quicksettings/package/contents/ui/main.qml b/applets/quicksettings/package/contents/ui/main.qml index 822858f5..d7cd163a 100644 --- a/applets/quicksettings/package/contents/ui/main.qml +++ b/applets/quicksettings/package/contents/ui/main.qml @@ -69,7 +69,7 @@ Item { text: "Wireless" icon: "network-wireless-on" enabled: true - settingsCommand: "active-settings -m org.kde.satellite.settings.wifi" + settingsCommand: "active-settings -m org.kde.plasma.phone.settings.wifi" } ListElement { text: "Alarms" diff --git a/bin/plasma-phone.cmake b/bin/plasma-phone.cmake index 0caae9a4..61c23cfc 100644 --- a/bin/plasma-phone.cmake +++ b/bin/plasma-phone.cmake @@ -39,4 +39,4 @@ init --user & mc-tool request ofono/ofono/account0 online paplay /usr/share/sounds/freedesktop/stereo/message.oga & -exec /usr/bin/plasmashell -p org.kde.satellite.phone 2>/tmp/plasmashell_logs +exec /usr/bin/plasmashell -p org.kde.plasma.phone 2>/tmp/plasmashell_logs diff --git a/dbus/CMakeLists.txt b/dbus/CMakeLists.txt index 30124367..4120cdc7 100644 --- a/dbus/CMakeLists.txt +++ b/dbus/CMakeLists.txt @@ -1,9 +1,9 @@ -macro(satellite_install_dbus_service name) +macro(plasma_phone_install_dbus_service name) install(FILES ${name}.service DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/dbus-1/session.d) endmacro() -satellite_install_dbus_service(org.kde.kde5) -satellite_install_dbus_service(org.kde.kglobalaccel) -satellite_install_dbus_service(org.kde.klauncher5) -satellite_install_dbus_service(org.kde.kuiserver) +plasma_phone_install_dbus_service(org.kde.kde5) +plasma_phone_install_dbus_service(org.kde.kglobalaccel) +plasma_phone_install_dbus_service(org.kde.klauncher5) +plasma_phone_install_dbus_service(org.kde.kuiserver) diff --git a/look-and-feel/metadata.desktop b/look-and-feel/metadata.desktop index c6316e90..348a5490 100644 --- a/look-and-feel/metadata.desktop +++ b/look-and-feel/metadata.desktop @@ -1,5 +1,5 @@ [Desktop Entry] -Name=Satellite +Name=Plasma Phone Comment=Plasma workspace for smartphones Keywords=Phone, Workspace, Look and Feel Type=Service @@ -10,7 +10,7 @@ X-KDE-PluginInfo-Author= X-KDE-PluginInfo-Category= X-KDE-PluginInfo-Email= X-KDE-PluginInfo-License=GPLv2+ -X-KDE-PluginInfo-Name=org.kde.plasma.satellite +X-KDE-PluginInfo-Name=org.kde.plasma.phone X-KDE-PluginInfo-Version=0.1 X-KDE-PluginInfo-Website= X-Plasma-MainScript=defaults diff --git a/packaging/plasma-phone-components.spec b/packaging/plasma-phone-components.spec index 03d4b648..7e0b217c 100644 --- a/packaging/plasma-phone-components.spec +++ b/packaging/plasma-phone-components.spec @@ -106,7 +106,7 @@ EOF cat > %{buildroot}%{_kf5_configdir}/kdeglobals < Date: Fri, 19 Jun 2015 01:41:51 +0200 Subject: [PATCH 10/23] Add README file for the systemd unit files --- services/README | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 services/README diff --git a/services/README b/services/README new file mode 100644 index 00000000..3cb51ba6 --- /dev/null +++ b/services/README @@ -0,0 +1,9 @@ +This files are for systemd units. + +Our current implemention is based on top of the Ubuntu phone which +still uses upstart. So these files do nothing, but we're still keeping +them over here for now. + +The situation should be revisited in about 6 months. + +- 19th June 2015 From 724389fac4abdf6a4d4e10aba0dada9549a7a714 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Fri, 19 Jun 2015 01:44:57 +0200 Subject: [PATCH 11/23] Remove the compositor Made obsolete by kwin --- CMakeLists.txt | 7 - compositor/ClientWindowWrapper.qml | 75 ---- compositor/Compositor.qml | 378 ------------------ compositor/ShellWindowWrapper.qml | 24 -- compositor/WindowManagement.js | 280 ------------- compositor/WindowWrapper.qml | 54 --- compositor/klogo.png | Bin 23345 -> 0 bytes services/CMakeLists.txt | 1 - .../plasma-phone-compositor.service.cmake | 22 - services/plasma-phone-ui.service.cmake | 4 +- 10 files changed, 2 insertions(+), 843 deletions(-) delete mode 100644 compositor/ClientWindowWrapper.qml delete mode 100644 compositor/Compositor.qml delete mode 100644 compositor/ShellWindowWrapper.qml delete mode 100644 compositor/WindowManagement.js delete mode 100644 compositor/WindowWrapper.qml delete mode 100644 compositor/klogo.png delete mode 100644 services/plasma-phone-compositor.service.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 28ac378c..c08b1212 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,13 +41,6 @@ plasma_install_package(look-and-feel org.kde.plasma.phone look-and-feel) plasma_install_package(shell org.kde.plasma.phone shells) install(DIRECTORY wallpaper/ DESTINATION "${WALLPAPER_INSTALL_DIR}/org.kde.plasma.phone.lockers") -install(DIRECTORY compositor/ - DESTINATION ${DATA_INSTALL_DIR}/greenisland/org.kde.plasma.phone.compositor - PATTERN .svn EXCLUDE - PATTERN CMakeLists.txt EXCLUDE - PATTERN Messages.sh EXCLUDE - PATTERN dummydata EXCLUDE) - kpackage_install_package(phonebook org.kde.phone.phonebook genericqml) install(FILES phonebook/metadata.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} RENAME org.kde.phone.phonebook.desktop) diff --git a/compositor/ClientWindowWrapper.qml b/compositor/ClientWindowWrapper.qml deleted file mode 100644 index b18cbb52..00000000 --- a/compositor/ClientWindowWrapper.qml +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2014 Pier Luigi Fiorini - * - * 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.0 -import org.kde.plasma.core 2.0 as PlasmaCore - -WindowWrapper { - id: window - objectName: "clientWindow" - onXChanged: { - if (compositorRoot.currentWindow == window) { - compositorRoot.layers.windows.contentX = x; - } - } - Behavior on y { - enabled: !mouse.active - SequentialAnimation { - NumberAnimation { - easing.type: "InOutQuad" - duration: units.longDuration - } - ScriptAction { - script: { - if (window.opacity < 0.3) { - window.close(); - } - } - } - } - } - opacity: 1 - (Math.abs(y) / height) - - MouseArea { - id: mouse - z: 99 - anchors.fill: parent - enabled: compositorRoot.layers.windows.switchMode - property bool active - onPressed: { - active = true; - } - onClicked: { - compositorRoot.currentWindow = window; - window.child.takeFocus(); - } - onReleased: { - active = false; - if (window.opacity < 0.3) { - window.y = (window.y > 0 ? +1 : -1) * window.height; - } else { - window.y = 0; - } - } - drag { - axis: Drag.YAxis - target: window - } - } -} diff --git a/compositor/Compositor.qml b/compositor/Compositor.qml deleted file mode 100644 index b44f8f0e..00000000 --- a/compositor/Compositor.qml +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Copyright 2014 Pier Luigi Fiorini - * - * 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.0 -import QtQuick.Layouts 1.0 -import QtQml.Models 2.1 -import org.kde.plasma.core 2.0 as PlasmaCore -import "WindowManagement.js" as WindowManagement - -Rectangle { - property alias showSplash: splash.visible - property bool showPanel: true - property alias showKeyboard: keyboardLayer.visible - readonly property alias layers: layers - readonly property real topBarHeight: units.iconSizes.small - readonly property real bottomBarHeight: units.iconSizes.medium - property var currentWindow: null - property var shellWindow: null; - - onCurrentWindowChanged: { - if (!currentWindow) { - compositorRoot.state = "homeScreen"; - return; - } - compositorRoot.state = "application"; - } - - id: compositorRoot - color: "black" - state: "homeScreen" - - Image { - id: splash - anchors.fill: parent - source: "klogo.png" - sourceSize.width: width - sourceSize.height: height - fillMode: Image.PreserveAspectFit - z: 1000 - } - - ListModel { - id: surfaceModel - } - - Connections { - target: compositor - onSurfaceMapped: WindowManagement.surfaceMapped(surface) - onSurfaceUnmapped: WindowManagement.surfaceUnmapped(surface) - onSurfaceDestroyed: WindowManagement.surfaceDestroyed(surface) - } - - QtObject { - readonly property alias desktop: desktopLayer - readonly property alias windows: windowsLayerBackground - readonly property alias panel: panelLayer - readonly property alias keyboard: keyboardLayer - - id: layers - } - - Item { - id: desktopLayer - anchors.fill: parent - visible: true - } - - Rectangle { - id: windowsLayerBackground - anchors { - fill: parent - topMargin: topBarHeight - bottomMargin: bottomBarHeight - } - color: Qt.rgba(0, 0, 0, 0.9) - function addWindow (window) { - window.parent = windowsLayout - } - property bool switchMode: windowsZoom.scale < 1 - - Item { - id: windowsZoom - anchors.fill: parent - Flickable { - id: windowsLayer - anchors.centerIn: parent - - flickableDirection: Flickable.HorizontalFlick - height: windowsZoom.height * 2 - width: windowsZoom.width * 2 - interactive: windowsLayerBackground.switchMode - contentWidth: windowsLayout.width - contentHeight: windowsLayout.height - - MouseArea { - height: windowsLayer.height - width: windowsLayout.width - onClicked: { - compositorRoot.state = "homeScreen"; - } - Row { - id: windowsLayout - anchors.centerIn: parent - height: windowsLayerBackground.height - transformOrigin: Item.Left - onChildrenChanged: { - if (children.length == 0) { - compositorRoot.state = "homeScreen"; - } - } - } - } - } - } - } - - Item { - id: panelLayer - anchors.fill: parent - visible: showPanel - z: 3 - } - - Item { - id: keyboardLayer - anchors.fill: parent - z: 800 - onVisibleChanged: { - if (!visible && compositorRoot.shellWindow) { - compositorRoot.shellWindow.child.takeFocus(); - } - } - } - - Rectangle { - id: bottomBar - z: 4 - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - height: bottomBarHeight - color: Qt.rgba(0, 0, 0, 0.9) - - Behavior on height { - NumberAnimation { - easing.type: "InOutQuad" - duration: units.shortDuration - } - } - - RowLayout { - anchors.fill: parent - - PlasmaCore.IconItem { - colorGroup: PlasmaCore.Theme.ComplementaryColorGroup - width: units.iconSizes.smallMedium - height: width - source: "distribute-horizontal-x" - enabled: compositorRoot.state != "switcher" && windowsLayout.children.length > 0 - opacity: enabled ? 1 : 0.2 - - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: units.iconSizes.medium - Layout.preferredHeight: units.iconSizes.medium - - MouseArea { - anchors.fill: parent - onClicked: { - compositorRoot.state = "switcher"; - } - } - } - PlasmaCore.IconItem { - colorGroup: PlasmaCore.Theme.ComplementaryColorGroup - width: units.iconSizes.smallMedium - height: width - source: "go-home" - enabled: compositorRoot.state != "homeScreen"; - opacity: enabled ? 1 : 0.2 - - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: units.iconSizes.medium - Layout.preferredHeight: units.iconSizes.medium - - MouseArea { - anchors.fill: parent - onClicked: { - compositorRoot.state = "homeScreen"; - } - } - } - PlasmaCore.IconItem { - colorGroup: PlasmaCore.Theme.ComplementaryColorGroup - width: units.iconSizes.smallMedium - height: width - source: "window-close" - enabled: compositorRoot.currentWindow - opacity: enabled ? 1 : 0.2 - - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: units.iconSizes.medium - Layout.preferredHeight: units.iconSizes.medium - - MouseArea { - anchors.fill: parent - onClicked: { - compositorRoot.state = "homeScreen"; - compositorRoot.currentWindow.close(); - } - } - } - } - } - - MouseArea { - id: taskSwitchEdge - z: 1000 - anchors { - left: parent.left - right: parent.right - bottom: parent.bottom - } - height: 8 - enabled: windowsLayout.children.length > 0 && compositorRoot.state != "switcher" - property int oldX: 0 - onPressed: { - oldX = mouse.x; - } - onPositionChanged: { - compositorRoot.state = "changing"; - compositorRoot.showKeyboard = false; - - var newScale = (1-Math.abs(mouse.y)/(compositorRoot.height/2)) - if (newScale > 0.3) { - windowsZoom.scale = newScale - } - windowsLayer.contentX -= (mouse.x - oldX); - oldX = mouse.x; - } - onReleased: { - if (windowsZoom.scale > 0.7) { - compositorRoot.state = compositorRoot.currentWindow ? "application" : "homeScreen"; - } else { - compositorRoot.state = "switcher"; - } - } - } - - states: [ - State { - name: "homeScreen" - PropertyChanges { - target: windowsLayerBackground - opacity: 0 - } - PropertyChanges { - target: windowsZoom - scale: 1 - } - }, - State { - name: "application" - PropertyChanges { - target: windowsLayerBackground - opacity: 1 - } - PropertyChanges { - target: windowsZoom - scale: 1 - } - PropertyChanges { - target: windowsLayer - contentX: compositorRoot.currentWindow ? compositorRoot.currentWindow.x - windowsLayerBackground.width/2 : 0 - } - }, - State { - name: "switcher" - PropertyChanges { - target: windowsLayerBackground - opacity: 1 - } - PropertyChanges { - target: windowsZoom - scale: 0.5 - } - PropertyChanges { - target: windowsLayer - contentX: compositorRoot.currentWindow ? compositorRoot.currentWindow.x - windowsLayerBackground.width/2 : 0 - } - }, - State { - name: "changing" - PropertyChanges { - target: windowsLayerBackground - opacity: 1 - } - PropertyChanges { - target: windowsLayer - contentX: compositorRoot.currentWindow ? compositorRoot.currentWindow.x - windowsLayerBackground.width/2 : 0 - } - } - ] - - transitions: [ - Transition { - to: "changing" - SequentialAnimation { - ScriptAction { - script: { - desktopLayer.z = 1 - windowsLayerBackground.z = 800 - } - } - PropertyAnimation { - target: windowsLayerBackground - duration: units.longDuration - easing.type: Easing.InOutQuad - properties: "opacity" - } - } - }, - Transition { - SequentialAnimation { - ParallelAnimation { - PropertyAnimation { - target: windowsLayerBackground - duration: units.longDuration - easing.type: Easing.InOutQuad - properties: "opacity" - } - PropertyAnimation { - target: windowsZoom - duration: units.shortDuration - easing.type: Easing.InOutQuad - properties: "scale" - } - PropertyAnimation { - target: windowsLayer - duration: units.shortDuration - easing.type: Easing.InOutQuad - properties: "contentX" - } - } - ScriptAction { - script: { - if (compositorRoot.state == "homeScreen") { - desktopLayer.z = 2; - windowsLayerBackground.z = 1; - compositorRoot.currentWindow = null; - } else { - desktopLayer.z = 1; - windowsLayerBackground.z = 800; - if (compositorRoot.currentWindow) { - compositorRoot.currentWindow.child.takeFocus(); - } - } - } - } - } - } - ] -} diff --git a/compositor/ShellWindowWrapper.qml b/compositor/ShellWindowWrapper.qml deleted file mode 100644 index 00e30cce..00000000 --- a/compositor/ShellWindowWrapper.qml +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2014 Pier Luigi Fiorini - * - * 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.0 - -WindowWrapper { - objectName: "shellWindow" -} diff --git a/compositor/WindowManagement.js b/compositor/WindowManagement.js deleted file mode 100644 index ba5d6c68..00000000 --- a/compositor/WindowManagement.js +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright 2014 Pier Luigi Fiorini - * - * 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. - */ - -/* - * Main procedures - */ - -function surfaceMapped(surface) { - // Determine if it's a shell window - var firstView = compositor.firstViewOf(surface); - var isShellWindow = - (typeof(firstView.role) != "undefined") || - (surface.className == "plasmashell.desktop"); - - // Print some information - if (surface.className == "maliit-server.desktop") { - console.debug("Keyboard surface", surface, "mapped"); - console.debug("\tappId:", surface.className); - console.debug("\ttitle:", surface.title); - console.debug("\tsize:", surface.size.width + "x" + surface.size.height); - } else if (isShellWindow) { - console.debug("Shell surface", surface, "mapped"); - console.debug("\trole:", firstView.role); - console.debug("\tsize:", surface.size.width + "x" + surface.size.height); - } else { - console.debug("Application surface", surface, "mapped"); - console.debug("\tappId:", surface.className); - console.debug("\ttitle:", surface.title); - console.debug("\tsize:", surface.size.width + "x" + surface.size.height); - } - - if (surface.className == "maliit-server.desktop") { - mapKeyboardSurface(surface); - // Call a specialized method to deal with application or - // shell windows - } else if (isShellWindow) - mapShellSurface(surface, firstView); - else - mapApplicationSurface(surface); -} - -function surfaceUnmapped(surface) { - // Determine if it's a shell window - var firstView = compositor.firstViewOf(surface); - var isShellWindow = - (typeof(firstView.role) != "undefined") || - (surface.className == "plasmashell.desktop"); - - // Print some information - if (typeof(firstView.role) == "undefined") { - console.debug("Shell surface", surface, "unmapped"); - console.debug("\trole:", firstView.role); - console.debug("\tsize:", surface.size.width + "x" + surface.size.height); - } else { - console.debug("Application surface", surface, "unmapped"); - console.debug("\tappId:", surface.className); - console.debug("\ttitle:", surface.title); - } - - //Is it maliit? - if (surface.className == "maliit-server.desktop") { - unmapKeyboardSurface(surface); - // Call a specialized method to deal with application or - // shell windows - } else if (isShellWindow) - unmapShellSurface(surface); - else - unmapApplicationSurface(surface); -} - -function surfaceDestroyed(surface) { - console.debug("Surface", surface, "destroyed"); - - // Remove surface from model - var i; - for (i = 0; i < surfaceModel.count; i++) { - var entry = surfaceModel.get(i); - - if (entry.surface === surface) { - // Destroy window representation and - // remove the surface from the model - if (entry.window.chrome) - entry.window.chrome.destroy(); - entry.window.destroy(); - surfaceModel.remove(i, 1); - break; - } - } -} - -/* - * Map surfaces - */ - -function mapApplicationSurface(surface) { - // Just exit if we already created a window representation - var i; - for (i = 0; i < surfaceModel.count; i++) { - var entry = surfaceModel.get(i); - - if (entry.surface === surface) { - // Ask the client to resize - surface.requestSize(window.parent.width, window.parent.height); - - return; - } - } - - // Create surface item - var component = Qt.createComponent("ClientWindowWrapper.qml"); - if (component.status !== Component.Ready) { - console.error(component.errorString()); - return; - } - - // Request a view for this output although with phones will - // likely have just one output - var child = compositor.viewForOutput(surface, _greenisland_output); - - child.resizeSurfaceToItem = true; - child.width = compositorRoot.layers.windows.width; - child.height = compositorRoot.layers.windows.height; - - // Create and setup window container - var window = component.createObject(compositorRoot.layers.windows, {"child": child}); - compositorRoot.layers.windows.addWindow(window); - window.child.parent = window; - window.child.touchEventsEnabled = true; - window.width = surface.size.width; - window.height = surface.size.height; - - // Switch to the applications layer and take focus - compositorRoot.state = "application"; - compositorRoot.currentWindow = window; - window.child.takeFocus(); - - // Run map animation - if (typeof(window.runMapAnimation) != "undefined") - window.runMapAnimation(); - - // Add surface to the model - surfaceModel.append({"surface": surface, "window": window}); -} - -function mapShellSurface(surface, child) { - // Shell surfaces have only one view which is passed to us - // as an argument, check whether it's a view for this output - // or not - if (child.output !== _greenisland_output) - return; - - // Just set z-index and exit if we already created a - // window representation - var i; - for (i = 0; i < surfaceModel.count; i++) { - var entry = surfaceModel.get(i); - - if (entry.surface === surface) { - // Switch to layer and take focus - if (surface.className == "plasmashell.desktop") { - compositorRoot.showPanel = true; - } else { - compositorRoot.state = "homeScreen"; - } - entry.window.child.takeFocus(); - - return; - } - } - - // Create surface item - var component = Qt.createComponent("ShellWindowWrapper.qml"); - if (component.status !== Component.Ready) { - console.error(component.errorString()); - return; - } - - // Create and setup window container - // XXX: We only support desktop roles for now - var window = component.createObject(compositorRoot, {"child": child}); - window.parent = (surface.className == "plasmashell.desktop") ? compositorRoot.layers.panel : compositorRoot.layers.desktop; - window.child.parent = window; - window.child.touchEventsEnabled = true; - window.x = window.y = 0; - window.width = surface.size.width; - window.height = surface.size.height; - - // Switch to the desktop layer and take focus - compositorRoot.showSplash = false; - if (surface.className == "plasmashell.desktop") { - compositorRoot.showPanel = true; - } else { - compositorRoot.state = "homeScreen"; - compositorRoot.shellWindow = window; - } - window.child.takeFocus(); - - // Add surface to the model - surfaceModel.append({"surface": surface, "window": window}); -} - -function mapKeyboardSurface(surface) { - // Just exit if we already created a window representation - var i; - for (i = 0; i < surfaceModel.count; i++) { - var entry = surfaceModel.get(i); - - if (entry.surface === surface) { - compositorRoot.showKeyboard = true; - - return; - } - } - - // Create surface item - var component = Qt.createComponent("ShellWindowWrapper.qml"); - if (component.status !== Component.Ready) { - console.error(component.errorString()); - return; - } - - // Request a view for this output although with phones will - // likely have just one output - var child = compositor.viewForOutput(surface, _greenisland_output); - - // Create and setup window container - var window = component.createObject(compositorRoot.layers.keyboard, {"child": child}); - window.parent = compositorRoot.layers.keyboard; - window.child.parent = window; - window.child.touchEventsEnabled = true; - window.width = surface.size.width; - window.height = surface.size.height; - window.y = compositorRoot.layers.keyboard.height - window.height; - - // Add surface to the model - surfaceModel.append({"surface": surface, "window": window}); - compositorRoot.showKeyboard = true; -} - - -/* - * Unmap surfaces - */ - -function unmapApplicationSurface(surface) { - // Reactivate home layer as soon as an application window is unmapped - compositorRoot.state = "homeScreen"; - compositorRoot.currentWindow = null; -} - -function unmapShellSurface(surface) { - // Hide panel layer if this is the sliding panel - if (surface.className == "plasmashell.desktop") { - compositorRoot.showPanel = false; - } -} - -function unmapKeyboardSurface(surface) { - if (compositorRoot.currentWindow) { - compositorRoot.currentWindow.child.height = compositorRoot.layers.windows.height; - } - - compositorRoot.showKeyboard = false; -} diff --git a/compositor/WindowWrapper.qml b/compositor/WindowWrapper.qml deleted file mode 100644 index 69d68ee9..00000000 --- a/compositor/WindowWrapper.qml +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2014 Pier Luigi Fiorini - * - * 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.0 -import QtCompositor 1.0 -import GreenIsland 1.0 - -Item { - property var child - property var role: child.surface.windowProperties.role - - id: window - onVisibleChanged: { - if (child) - child.surface.clientRenderingEnabled = visible; - } - - SurfaceRenderer { - anchors.fill: parent - source: child - } - - Connections { - target: child.surface - onSizeChanged: { - window.width = child.surface.size.width; - window.height = child.surface.size.height; - } - } - - function close() { - if (!child || !child.surface) - return; - - child.surface.client.close(); - window.destroy(); - } -} diff --git a/compositor/klogo.png b/compositor/klogo.png deleted file mode 100644 index b467f5072d44de4d1d9a5c9cd040a81d052b8de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23345 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 E1-QXljQ{`u diff --git a/services/CMakeLists.txt b/services/CMakeLists.txt index e6f2facd..f0122473 100644 --- a/services/CMakeLists.txt +++ b/services/CMakeLists.txt @@ -14,6 +14,5 @@ plasma_phone_install_service(kded5) plasma_phone_install_service(kdeinit5) plasma_phone_install_service(kglobalaccel5) plasma_phone_install_service(kuiserver5) -plasma_phone_install_service(plasma-phone-compositor) plasma_phone_install_service(plasma-phone-ui) plasma_phone_install_service(plasma-phone) diff --git a/services/plasma-phone-compositor.service.cmake b/services/plasma-phone-compositor.service.cmake deleted file mode 100644 index a10f52a8..00000000 --- a/services/plasma-phone-compositor.service.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (C) 2014 Pier Luigi Fiorini -# -# Starts Green Island with the phone compositor plugin. -# - -[Unit] -Description=Green Island -Requires=dbus.socket pre-user-session.target -After=pre-user-session.target -Conflicts=maui-bootsplash.service - -[Service] -Type=notify -Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=%t/dbus/user_bus_socket -EnvironmentFile=-/var/lib/environment/compositor/*.conf -EnvironmentFile=-/var/lib/environment/greenisland/*.conf -ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/greenisland $LIPSTICK_OPTIONS -p org.kde.plasma.compositor.phone -Restart=on-failure - -[Install] -WantedBy=user-session.target diff --git a/services/plasma-phone-ui.service.cmake b/services/plasma-phone-ui.service.cmake index 7c81c85c..8229f996 100644 --- a/services/plasma-phone-ui.service.cmake +++ b/services/plasma-phone-ui.service.cmake @@ -6,8 +6,8 @@ [Unit] Description=Plasma Phone UI -Requires=dbus.socket plasma-phone-compositor.service -After=plasma-phone-compositor.service +Requires=dbus.socket +After= [Service] Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=%t/dbus/user_bus_socket From c94b6c348ce46e79ff788a8ccdece0e6be92f40d Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Fri, 19 Jun 2015 01:46:51 +0200 Subject: [PATCH 12/23] Remove packaging for RPM --- packaging/plasma-phone-components.spec | 151 ------------------------- packaging/plasma-phone-components.yaml | 61 ---------- packaging/remotebuild | 2 - 3 files changed, 214 deletions(-) delete mode 100644 packaging/plasma-phone-components.spec delete mode 100644 packaging/plasma-phone-components.yaml delete mode 100755 packaging/remotebuild diff --git a/packaging/plasma-phone-components.spec b/packaging/plasma-phone-components.spec deleted file mode 100644 index 7e0b217c..00000000 --- a/packaging/plasma-phone-components.spec +++ /dev/null @@ -1,151 +0,0 @@ -# -# Do NOT Edit the Auto-generated Part! -# Generated by: spectacle version 0.27 -# - -Name: plasma-phone-components - -# >> macros -# << macros - -Summary: Plasma Phone Components -Version: 0.2.2 -Release: 1 -Group: System/GUI/Other -License: GPLv2+ -URL: http://www.kde.org -Source0: %{name}-%{version}.tar.xz -Source100: plasma-phone-components.yaml -Requires: greenisland -Requires: plasma-workspace -Requires: plasma-workspace-wallpaper-image -Requires: plasma-desktop -Requires: breeze-icon-theme -Requires: oxygen-fonts -Requires: frameworkintegration -Requires: libqofono-qt5 -Requires: libqofono-qt5-declarative -Requires: voicecall-qt5 -Requires: voicecall-qt5-plugin-ofono -Requires: nemo-qml-plugin-contextkit-qt5 -Requires: tone-generator -BuildRequires: pkgconfig(Qt5Core) -BuildRequires: pkgconfig(Qt5DBus) -BuildRequires: pkgconfig(Qt5Xml) -BuildRequires: pkgconfig(Qt5Network) -BuildRequires: pkgconfig(Qt5Gui) -BuildRequires: pkgconfig(Qt5Widgets) -BuildRequires: pkgconfig(Qt5Test) -BuildRequires: pkgconfig(Qt5Qml) -BuildRequires: pkgconfig(Qt5Quick) -BuildRequires: pkgconfig(systemd) -BuildRequires: extra-cmake-modules -BuildRequires: kf5-rpm-macros -BuildRequires: qt5-tools -BuildRequires: plasma-devel - -%description -Plasma Phone Components. - - -%prep -%setup -q -n %{name}-%{version} - -# >> setup -# << setup - -%build -# >> build pre -%kf5_make -# << build pre - - - -# >> build post -# << build post - -%install -rm -rf %{buildroot} -# >> install pre -%kf5_make_install -# << install pre - -# >> install post - -# Script that runs the UI -# File with environment variables, used by compositor systemd unit -mkdir -p %{buildroot}%{_sharedstatedir}/environment/greenisland -cat > %{buildroot}%{_sharedstatedir}/environment/greenisland/greenisland.conf < %{buildroot}%{_sharedstatedir}/environment/plasma-phone/plasma-phone.conf < %{buildroot}%{_kf5_configdir}/kded5rc << EOF -[General] -CheckSycoca=false -EOF - -cat > %{buildroot}%{_kf5_configdir}/kdeglobals <> files -# << files diff --git a/packaging/plasma-phone-components.yaml b/packaging/plasma-phone-components.yaml deleted file mode 100644 index a334d17c..00000000 --- a/packaging/plasma-phone-components.yaml +++ /dev/null @@ -1,61 +0,0 @@ -Name : plasma-phone-components -Version : 0.2.2 -Release : 1 -Group : System/GUI/Other -License : GPLv2+ -Summary : Plasma Phone Components -Description : | - Plasma Phone Components. -URL : http://www.kde.org -Sources : - - "%{name}-%{version}.tar.xz" -SetupOptions: -q -n %{name}-%{version} - -Requires: - - greenisland - - plasma-workspace - - plasma-workspace-wallpaper-image - - plasma-desktop - - breeze-icon-theme - - oxygen-fonts - - frameworkintegration - - libqofono-qt5 - - libqofono-qt5-declarative - - voicecall-qt5 - - voicecall-qt5-plugin-ofono - - nemo-qml-plugin-contextkit-qt5 - - tone-generator - -PkgBR: - - extra-cmake-modules - - kf5-rpm-macros - - qt5-tools - - plasma-devel -PkgConfigBR: - - Qt5Core - - Qt5DBus - - Qt5Xml - - Qt5Network - - Qt5Gui - - Qt5Widgets - - Qt5Test - - Qt5Qml - - Qt5Quick - - systemd - -Configure: none -Builder: none - -Files: - - "%config %{_kf5_configdir}/kdeglobals" - - "%config %{_kf5_configdir}/kded5rc" - - "%{_bindir}/plasma-phone" - - "%{_kf5_sharedir}/plasma/*" - - "%{_kf5_sharedir}/wallpapers/*" - - "%{_kf5_sharedir}/settingsmodules/*" - - "%{_kf5_servicesdir}/*.desktop" - - "%{_sharedstatedir}/environment/greenisland/*" - - "%{_sharedstatedir}/environment/plasma-phone/*" - - "%{_libdir}/systemd/user/*" - - "%{_libdir}/systemd/user/user-session.target.wants/*" - - "%{_libdir}/qt5/qml/*" diff --git a/packaging/remotebuild b/packaging/remotebuild deleted file mode 100755 index 008cb0cc..00000000 --- a/packaging/remotebuild +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -gbs remotebuild -T home:plfiorini:phone From e75c8005d314084d6f86f55dac1abde7eaa6ea1b Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 16:58:11 -0700 Subject: [PATCH 13/23] a KRun based way to launch apps needs the duplicate for now in order to test without breaking the image --- CMakeLists.txt | 2 +- containments/homescreen/CMakeLists.txt | 1 + containments/homescreen/applicationlistmodel.cpp | 13 +++++++++++++ containments/homescreen/applicationlistmodel.h | 2 ++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c08b1212..0aa899ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,7 @@ include(FeatureSummary) find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Core Gui Widgets Qml Quick Test) -find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Plasma Service Declarative I18n) +find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Plasma Service Declarative I18n KIO) find_package(KF5 REQUIRED COMPONENTS PlasmaQuick DBusAddons Notifications) find_package(KF5Wayland CONFIG) set_package_properties(KF5Wayland PROPERTIES diff --git a/containments/homescreen/CMakeLists.txt b/containments/homescreen/CMakeLists.txt index fe2649e2..8a4ffda4 100644 --- a/containments/homescreen/CMakeLists.txt +++ b/containments/homescreen/CMakeLists.txt @@ -13,6 +13,7 @@ target_link_libraries(plasma_containment_phone_homescreen Qt5::Qml KF5::I18n KF5::Service + KF5::KIOWidgets ) diff --git a/containments/homescreen/applicationlistmodel.cpp b/containments/homescreen/applicationlistmodel.cpp index 2dcee31a..cb35cc00 100644 --- a/containments/homescreen/applicationlistmodel.cpp +++ b/containments/homescreen/applicationlistmodel.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include ApplicationListModel::ApplicationListModel(QObject *parent) @@ -218,6 +219,7 @@ Q_INVOKABLE void ApplicationListModel::moveItem(int row, int destination) endMoveRows(); } +//TODO: the implementation of runApplicationKRun should be the only one remaining void ApplicationListModel::runApplication(const QString &storageId) { if (storageId.isEmpty()) { @@ -230,6 +232,17 @@ void ApplicationListModel::runApplication(const QString &storageId) QProcess::startDetached(service->exec().replace(QRegExp("%\\w"), "")); } +void ApplicationListModel::runApplicationKRun(const QString &storageId) +{ + if (storageId.isEmpty()) { + return; + } + + KService::Ptr service = KService::serviceByStorageId(storageId); + + KRun::run(*service, QList(), 0); +} + QStringList ApplicationListModel::appOrder() const { return m_appOrder; diff --git a/containments/homescreen/applicationlistmodel.h b/containments/homescreen/applicationlistmodel.h index a5094566..2d2da610 100644 --- a/containments/homescreen/applicationlistmodel.h +++ b/containments/homescreen/applicationlistmodel.h @@ -71,6 +71,8 @@ public: Q_INVOKABLE void runApplication(const QString &storageId); + Q_INVOKABLE void runApplicationKRun(const QString &storageId); + Q_INVOKABLE void loadApplications(); public Q_SLOTS: From bf4959d63eabaa072399baabfe3eba075bad8c5b Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 17:03:29 -0700 Subject: [PATCH 14/23] add missing file --- .../taskpanel/package/contents/ui/Button.qml | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 containments/taskpanel/package/contents/ui/Button.qml diff --git a/containments/taskpanel/package/contents/ui/Button.qml b/containments/taskpanel/package/contents/ui/Button.qml new file mode 100644 index 00000000..6794ab26 --- /dev/null +++ b/containments/taskpanel/package/contents/ui/Button.qml @@ -0,0 +1,51 @@ +/* + * Copyright 2015 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 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 + +MouseArea { + id: button + width: Math.min(parent.width, parent.height) + height: width + property alias iconSource: icon.source + property bool checked + property bool checkable + + Rectangle { + anchors.fill:parent + radius: width/4 + visible: button.checked + color: theme.highlightColor + } + PlasmaCore.IconItem { + id: icon + anchors.fill: parent + colorGroup: PlasmaCore.Theme.ComplementaryColorGroup//PlasmaCore.ColorContext.colorGroup + } + onClicked: { + if (checkable) { + checked = !checked; + } + } +} From 8f7f23321fc32404ebdcb3875d3b4d7c45eb6017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Fri, 19 Jun 2015 01:52:22 +0200 Subject: [PATCH 15/23] Use KWayland protocol to close the active window As a nice side-effect this allows us to enable/disable the close button depending on whether we have a window to close. --- .../taskpanel/package/contents/code/close.js | 2 - .../taskpanel/package/contents/ui/main.qml | 3 +- containments/taskpanel/taskpanel.cpp | 57 ++++++++----------- containments/taskpanel/taskpanel.h | 14 +++-- 4 files changed, 34 insertions(+), 42 deletions(-) delete mode 100644 containments/taskpanel/package/contents/code/close.js diff --git a/containments/taskpanel/package/contents/code/close.js b/containments/taskpanel/package/contents/code/close.js deleted file mode 100644 index 56f0ef10..00000000 --- a/containments/taskpanel/package/contents/code/close.js +++ /dev/null @@ -1,2 +0,0 @@ - -workspace.activeClient.closeWindow(); diff --git a/containments/taskpanel/package/contents/ui/main.qml b/containments/taskpanel/package/contents/ui/main.qml index 30e38b11..04ce5f5a 100644 --- a/containments/taskpanel/package/contents/ui/main.qml +++ b/containments/taskpanel/package/contents/ui/main.qml @@ -73,7 +73,8 @@ PlasmaCore.ColorScope { width: parent.width/3 anchors.right: parent.right iconSource: "window-close" - onClicked: plasmoid.nativeInterface.executeScript("close"); + enabled: plasmoid.nativeInterface.hasCloseableActiveWindow; + onClicked: plasmoid.nativeInterface.closeActiveWindow(); } } } diff --git a/containments/taskpanel/taskpanel.cpp b/containments/taskpanel/taskpanel.cpp index f82b9c68..a49ef718 100644 --- a/containments/taskpanel/taskpanel.cpp +++ b/containments/taskpanel/taskpanel.cpp @@ -21,10 +21,6 @@ #include #include -#include -#include -#include -#include #include @@ -47,35 +43,6 @@ TaskPanel::~TaskPanel() { } -void TaskPanel::executeScript(const QString &script) -{ - //Plasma::Package p = - QDBusMessage message = QDBusMessage::createMethodCall(s_kwinService, "/Scripting", QString(), "loadScript"); - QList arguments; - arguments << QVariant(package().filePath("scripts", script + ".js")); - message.setArguments(arguments); - QDBusPendingReply asyncCall = QDBusConnection::sessionBus().asyncCall(message); - - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(asyncCall, this); - QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), - this, SLOT(loadScriptFinishedSlot(QDBusPendingCallWatcher*))); -} - -void TaskPanel::loadScriptFinishedSlot(QDBusPendingCallWatcher *watcher) -{ - QDBusMessage reply = watcher->reply(); - if (reply.type() == QDBusMessage::ErrorMessage) { - qWarning() << reply.errorMessage(); - } else { - const int id = reply.arguments().first().toInt(); - QDBusConnection::sessionBus().connect(s_kwinService, "/" + QString::number(id), QString(), "print", this, SLOT(print(QString))); - QDBusConnection::sessionBus().connect(s_kwinService, "/" + QString::number(id), QString(), "printError", this, SLOT(print(QString))); - QDBusMessage message = QDBusMessage::createMethodCall(s_kwinService, "/" + QString::number(id), QString(), "run"); - //fire blindly the call for now - QDBusConnection::sessionBus().asyncCall(message); - } -} - void TaskPanel::requestShowingDesktop(bool showingDesktop) { if (!m_windowManagement) { @@ -108,11 +75,35 @@ void TaskPanel::initWayland() emit showingDesktopChanged(m_showingDesktop); } ); + connect(m_windowManagement, &PlasmaWindowManagement::activeWindowChanged, this, &TaskPanel::updateActiveWindow); + updateActiveWindow(); } ); registry->setup(); } +void TaskPanel::updateActiveWindow() +{ + if (!m_windowManagement) { + return; + } + m_activeWindow = m_windowManagement->activeWindow(); + // TODO: connect to closeableChanged, not needed right now as KWin doesn't provide this changeable + emit hasCloseableActiveWindowChanged(); +} + +bool TaskPanel::hasCloseableActiveWindow() const +{ + return m_activeWindow && m_activeWindow->isCloseable(); +} + +void TaskPanel::closeActiveWindow() +{ + if (m_activeWindow) { + m_activeWindow->requestClose(); + } +} + K_EXPORT_PLASMA_APPLET_WITH_JSON(taskpanel, TaskPanel, "metadata.json") #include "taskpanel.moc" diff --git a/containments/taskpanel/taskpanel.h b/containments/taskpanel/taskpanel.h index 7b73efdd..4e0ac3c7 100644 --- a/containments/taskpanel/taskpanel.h +++ b/containments/taskpanel/taskpanel.h @@ -24,13 +24,12 @@ #include -class QDBusPendingCallWatcher; - namespace KWayland { namespace Client { class PlasmaWindowManagement; +class PlasmaWindow; } } @@ -38,28 +37,31 @@ class TaskPanel : public Plasma::Containment { Q_OBJECT Q_PROPERTY(bool showDesktop READ isShowingDesktop WRITE requestShowingDesktop NOTIFY showingDesktopChanged) + Q_PROPERTY(bool hasCloseableActiveWindow READ hasCloseableActiveWindow NOTIFY hasCloseableActiveWindowChanged) public: TaskPanel( QObject *parent, const QVariantList &args ); ~TaskPanel(); - Q_INVOKABLE void executeScript(const QString &script); + Q_INVOKABLE void closeActiveWindow(); bool isShowingDesktop() const { return m_showingDesktop; } void requestShowingDesktop(bool showingDesktop); + bool hasCloseableActiveWindow() const; + Q_SIGNALS: void showingDesktopChanged(bool); - -private Q_SLOTS: - void loadScriptFinishedSlot(QDBusPendingCallWatcher *watcher); + void hasCloseableActiveWindowChanged(); private: void initWayland(); + void updateActiveWindow(); bool m_showingDesktop; KWayland::Client::PlasmaWindowManagement *m_windowManagement; + KWayland::Client::PlasmaWindow *m_activeWindow = nullptr; }; From 8bf2aebd2fd68edf68db256e5b6365a8c9717ec0 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 17:10:00 -0700 Subject: [PATCH 16/23] disable look for close --- containments/taskpanel/package/contents/ui/Button.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/containments/taskpanel/package/contents/ui/Button.qml b/containments/taskpanel/package/contents/ui/Button.qml index 6794ab26..d3b2bf46 100644 --- a/containments/taskpanel/package/contents/ui/Button.qml +++ b/containments/taskpanel/package/contents/ui/Button.qml @@ -41,7 +41,8 @@ MouseArea { PlasmaCore.IconItem { id: icon anchors.fill: parent - colorGroup: PlasmaCore.Theme.ComplementaryColorGroup//PlasmaCore.ColorContext.colorGroup + colorGroup: PlasmaCore.Theme.ComplementaryColorGroup + enabled: button.enabled } onClicked: { if (checkable) { From d2fe2bb82b8d7824b3fd1c53d6c6151d225fcdb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCgler?= Date: Thu, 18 Jun 2015 17:35:57 -0700 Subject: [PATCH 17/23] Remove legacy filtering of everything related to settings This is a remainder from old openSUSE systems, which would show yast modules otherwise. Fixes settings app not shown. Reviewed-by:notmart --- containments/homescreen/applicationlistmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containments/homescreen/applicationlistmodel.cpp b/containments/homescreen/applicationlistmodel.cpp index cb35cc00..f47b6abf 100644 --- a/containments/homescreen/applicationlistmodel.cpp +++ b/containments/homescreen/applicationlistmodel.cpp @@ -97,7 +97,7 @@ void ApplicationListModel::loadApplications() for(KServiceGroup::List::ConstIterator it = subGroupList.begin();it != subGroupList.end(); it++) { KSycocaEntry::Ptr groupEntry = (*it); - if (groupEntry->isType(KST_KServiceGroup) && groupEntry->name() != "System/" && groupEntry->name() != "Settingsmenu/") { + if (groupEntry->isType(KST_KServiceGroup)) { KServiceGroup::Ptr serviceGroup(static_cast(groupEntry.data())); if (!serviceGroup->noDisplay()) { From 58bc75eef418f6b0a01f1d6a29aa4bd318afacbe Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Fri, 19 Jun 2015 02:50:12 +0200 Subject: [PATCH 18/23] Add KRunner to the top of the homescreen The KRunner view is part of the containment as then it can always be on the top. This is the first iteration of the this design. --- .../package/contents/ui/KRunner.qml | 79 +++++++++++++++++++ .../homescreen/package/contents/ui/main.qml | 8 ++ 2 files changed, 87 insertions(+) create mode 100644 containments/homescreen/package/contents/ui/KRunner.qml diff --git a/containments/homescreen/package/contents/ui/KRunner.qml b/containments/homescreen/package/contents/ui/KRunner.qml new file mode 100644 index 00000000..18ae5cc4 --- /dev/null +++ b/containments/homescreen/package/contents/ui/KRunner.qml @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2015 Vishesh Handa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + */ + +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.1 + +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 org.kde.milou 0.1 as Milou + +PlasmaCore.FrameSvgItem { + imagePath: "widgets/background" + enabledBorders: PlasmaCore.FrameSvg.BottomBorder + height: childrenRect.height + margins.bottom + + ColumnLayout { + anchors { + left: parent.left + right: parent.right + top: parent.top + } + PlasmaComponents.TextField { + id: queryField + clearButtonShown: true + Layout.fillWidth: true + Layout.alignment: Qt.AlignTop + + Keys.onEscapePressed: runnerWindow.visible = false + placeholderText: "Search ..." + } + + Milou.ResultsView { + id: listView + queryString: queryField.text + visible: count > 0 + + Layout.fillWidth: true + Layout.preferredHeight: listView.contentHeight + Layout.alignment: Qt.AlignTop + + onActivated: queryField.text = "" + onUpdateQueryString: { + queryField.text = text + queryField.cursorPosition = cursorPosition + } + } + + Keys.onReturnPressed: { + if (queryField.texr.length == 0) + runnerWindow.visible = false; + } + Keys.onEnterPressed: { + if (queryField.texr.length == 0) + runnerWindow.visible = false; + } + } +} + diff --git a/containments/homescreen/package/contents/ui/main.qml b/containments/homescreen/package/contents/ui/main.qml index 7d0e2fb2..7dda6ade 100644 --- a/containments/homescreen/package/contents/ui/main.qml +++ b/containments/homescreen/package/contents/ui/main.qml @@ -280,6 +280,14 @@ MouseEventListener { FeedbackWindow { id: feedbackWindow } + KRunner { + z: 1000 + anchors { + left: parent.left + right: parent.right + } + } + PlasmaCore.ColorScope { anchors.fill: parent //TODO: decide what color we want applets From c52a96e9846408cfbcaaa4480218a1cc438b765e Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 18:53:17 -0700 Subject: [PATCH 19/23] better layout when the space is scarce --- .../contents/ui/NotificationStripe.qml | 54 ++++++++++++++----- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/applets/notifications/contents/ui/NotificationStripe.qml b/applets/notifications/contents/ui/NotificationStripe.qml index f5719b73..e5c593fb 100644 --- a/applets/notifications/contents/ui/NotificationStripe.qml +++ b/applets/notifications/contents/ui/NotificationStripe.qml @@ -97,11 +97,8 @@ MouseArea { PlasmaComponents.Label { id: appLabel - anchors { - left: parent.left - verticalCenter: parent.verticalCenter - leftMargin: units.gridUnit * 3 - } + anchors.leftMargin: units.gridUnit * 3 + color: PlasmaCore.ColorScope.textColor text: model.appName } @@ -109,23 +106,24 @@ MouseArea { Column { id: messageLayout anchors { - left: appLabel.right - right: icon.left verticalCenter: parent.verticalCenter - rightMargin: units.smallSpacing + left: parent.left + right: icon.left + leftMargin: units.gridUnit * 3 } PlasmaComponents.Label { - anchors { - right: parent.right - left: parent.left - } + id: summaryLabel + anchors.right: parent.right + width: messageLayout.width - appLabel.width horizontalAlignment: Qt.AlignRight verticalAlignment: Qt.AlignVCenter text: summary + (!notificationItem.expanded && body ? "..." : "") wrapMode: Text.WordWrap } + PlasmaComponents.Label { + id: bodyLabel anchors { right: parent.right left: parent.left @@ -136,9 +134,9 @@ MouseArea { text: body wrapMode: Text.WordWrap } - } + PlasmaCore.IconItem { id: icon anchors { @@ -174,4 +172,34 @@ MouseArea { } } } + + states: [ + State { + name: "large" + when: appLabel.width + bodyLabel.paintedWidth < messageLayout.width + AnchorChanges { + target: appLabel + anchors { + verticalCenter: parent.verticalCenter + top: undefined + left: parent.left + } + } + PropertyChanges { + + } + }, + State { + name: "compact" + when: notificationItem.state != "large" + AnchorChanges { + target: appLabel + anchors { + verticalCenter: undefined + top: messageLayout.top + left: parent.left + } + } + } + ] } From a60b11dca773ca05806cac8e8506e25fdbd6d9c6 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 18:57:54 -0700 Subject: [PATCH 20/23] better expand animation --- .../contents/ui/NotificationStripe.qml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/applets/notifications/contents/ui/NotificationStripe.qml b/applets/notifications/contents/ui/NotificationStripe.qml index e5c593fb..69112a79 100644 --- a/applets/notifications/contents/ui/NotificationStripe.qml +++ b/applets/notifications/contents/ui/NotificationStripe.qml @@ -44,13 +44,6 @@ MouseArea { } } - Behavior on height { - NumberAnimation { - easing.type: Easing.InOutQuad - duration: units.longDuration - } - } - onReleased: { if (drag.active) { if (x > width / 4 || x < width / -4) { @@ -128,11 +121,19 @@ MouseArea { right: parent.right left: parent.left } - visible: notificationItem.expanded && body != undefined && body + visible: height > 0 + height: notificationItem.expanded && body != undefined && body ? implicitHeight : 0 + clip: true horizontalAlignment: Qt.AlignRight verticalAlignment: Qt.AlignVCenter text: body wrapMode: Text.WordWrap + Behavior on height { + NumberAnimation { + duration: units.longDuration + easing.type: Easing.InOutQuad + } + } } } From 9e7821c75f32e3d3f4699a8b96eefbb5e1c56291 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 19:22:35 -0700 Subject: [PATCH 21/23] dismiss view on task click --- containments/taskpanel/package/contents/ui/TaskSwitcher.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/containments/taskpanel/package/contents/ui/TaskSwitcher.qml b/containments/taskpanel/package/contents/ui/TaskSwitcher.qml index 959612cf..7272f574 100644 --- a/containments/taskpanel/package/contents/ui/TaskSwitcher.qml +++ b/containments/taskpanel/package/contents/ui/TaskSwitcher.qml @@ -123,6 +123,10 @@ Window { } text: "Task " + modelData } + MouseArea { + anchors.fill: parent + onClicked: window.hide(); + } } } } From ac6fa1866ef9b3b052344a13fa30440d6ee45913 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 19:27:22 -0700 Subject: [PATCH 22/23] try with opaque feedback --- .../homescreen/package/contents/ui/FeedbackWindow.qml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/containments/homescreen/package/contents/ui/FeedbackWindow.qml b/containments/homescreen/package/contents/ui/FeedbackWindow.qml index da91e8ab..b9b92f09 100644 --- a/containments/homescreen/package/contents/ui/FeedbackWindow.qml +++ b/containments/homescreen/package/contents/ui/FeedbackWindow.qml @@ -41,16 +41,17 @@ Window { } } - Rectangle { + PlasmaCore.ColorScope { id: background - color: Qt.rgba(0, 0, 0, 0.8) + anchors.fill: parent + colorGroup: PlasmaCore.Theme.ComplementaryColorGroup width: window.width height: window.height state: "closed" - - PlasmaCore.ColorScope { + Rectangle { anchors.fill: parent - colorGroup: PlasmaCore.Theme.ComplementaryColorGroup + color: background.backgroundColor + PlasmaComponents.BusyIndicator { anchors.centerIn: parent } From 8a55d4a28562dbe39063756ef4528ebbcb055fa1 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 18 Jun 2015 19:37:23 -0700 Subject: [PATCH 23/23] add some margins don't make the panel cover krunner --- containments/homescreen/package/contents/ui/KRunner.qml | 6 +++++- containments/homescreen/package/contents/ui/main.qml | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/containments/homescreen/package/contents/ui/KRunner.qml b/containments/homescreen/package/contents/ui/KRunner.qml index 18ae5cc4..80adf5d6 100644 --- a/containments/homescreen/package/contents/ui/KRunner.qml +++ b/containments/homescreen/package/contents/ui/KRunner.qml @@ -30,15 +30,19 @@ import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.milou 0.1 as Milou PlasmaCore.FrameSvgItem { + id: background imagePath: "widgets/background" enabledBorders: PlasmaCore.FrameSvg.BottomBorder - height: childrenRect.height + margins.bottom + height: childrenRect.height + fixedMargins.top/2 + fixedMargins.bottom ColumnLayout { anchors { left: parent.left right: parent.right top: parent.top + topMargin: background.fixedMargins.top / 2 + leftMargin: background.fixedMargins.left / 2 + rightMargin: background.fixedMargins.right / 2 } PlasmaComponents.TextField { id: queryField diff --git a/containments/homescreen/package/contents/ui/main.qml b/containments/homescreen/package/contents/ui/main.qml index 7dda6ade..9221eea2 100644 --- a/containments/homescreen/package/contents/ui/main.qml +++ b/containments/homescreen/package/contents/ui/main.qml @@ -283,8 +283,10 @@ MouseEventListener { KRunner { z: 1000 anchors { + top: parent.top left: parent.left right: parent.right + topMargin: plasmoid.availableScreenRect.y } }