ui experiment: keep all windows minimized

keep all windows minimized except the active one and minimize everything
when the task manager is open
This commit is contained in:
Marco Martin 2015-10-28 15:02:00 +01:00
parent f6419fc9d4
commit 8a45f67c4c
6 changed files with 150 additions and 6 deletions

View file

@ -11,6 +11,7 @@ target_link_libraries(plasma_containment_phone_taskpanel
Qt5::DBus Qt5::DBus
KF5::Plasma KF5::Plasma
Qt5::Qml Qt5::Qml
Qt5::Quick
KF5::I18n KF5::I18n
KF5::Service KF5::Service
KF5::WaylandClient KF5::WaylandClient

View file

@ -28,6 +28,23 @@ Item {
id: delegate id: delegate
width: window.width/2 width: window.width/2
height: window.height/2 height: window.height/2
//Workaround
property bool active: model.IsActive
onActiveChanged: {
if (model.IsActive) {
window.currentTaskIndex = index
}
}
Connections {
target: tasksView
onContentYChanged: {
var pos = delegate.mapToItem(tasksView, 0, 0);
plasmoid.nativeInterface.setTaskGeometry(filteredWindowModel.mapRowToSource(model.index), pos.x, pos.y, delegate.width, delegate.height);
}
}
Item { Item {
anchors { anchors {
fill: parent fill: parent

View file

@ -33,6 +33,7 @@ FullScreenPanel {
property int offset: 0 property int offset: 0
property int overShoot: units.gridUnit * 2 property int overShoot: units.gridUnit * 2
property int tasksCount: filteredWindowModel.count property int tasksCount: filteredWindowModel.count
property int currentTaskIndex: -1
color: Qt.rgba(0, 0, 0, 0.6 * Math.min( color: Qt.rgba(0, 0, 0, 0.6 * Math.min(
(Math.min(tasksView.contentY + tasksView.height, tasksView.height) / tasksView.height), (Math.min(tasksView.contentY + tasksView.height, tasksView.height) / tasksView.height),
@ -49,6 +50,7 @@ FullScreenPanel {
scrollAnim.from = tasksView.contentY; scrollAnim.from = tasksView.contentY;
scrollAnim.to = 0; scrollAnim.to = 0;
scrollAnim.running = true; scrollAnim.running = true;
setSingleActiveWindow(-1);
} }
function hide() { function hide() {
scrollAnim.from = tasksView.contentY; scrollAnim.from = tasksView.contentY;
@ -60,6 +62,24 @@ FullScreenPanel {
scrollAnim.running = true; scrollAnim.running = true;
} }
function setSingleActiveWindow(id) {
var task;
for (var i = 0; i < filteredWindowModel.count; ++i) {
task = filteredWindowModel.get(i);
if (i == id && task.IsMinimized) {
plasmoid.nativeInterface.windowModel.requestToggleMinimized(filteredWindowModel.mapRowToSource(i));
} else if (i != id && !task.IsMinimized) {
plasmoid.nativeInterface.windowModel.requestToggleMinimized(filteredWindowModel.mapRowToSource(i));
}
}
return;
if (id >= 0) {
plasmoid.nativeInterface.windowModel.requestActivate(filteredWindowModel.mapRowToSource(id));
}
currentTaskIndex = id;
}
onOffsetChanged: tasksView.contentY = offset onOffsetChanged: tasksView.contentY = offset
SequentialAnimation { SequentialAnimation {
@ -84,6 +104,7 @@ FullScreenPanel {
} }
} }
} }
GridView { GridView {
id: tasksView id: tasksView
width: window.width width: window.width
@ -163,4 +184,27 @@ FullScreenPanel {
} }
} }
} }
Rectangle {
color: theme.textColor
anchors {
fill: showDesktopButton
margins: -showDesktopButton.width/4
}
radius: width
}
Button {
id: showDesktopButton
height: units.iconSizes.medium
width: height
anchors {
horizontalCenter: parent.horizontalCenter
bottom: parent.bottom
}
iconSource: "go-home"
onClicked: {
window.hide();
}
}
Component.onCompleted: plasmoid.nativeInterface.panel = window;
} }

View file

@ -58,6 +58,7 @@ PlasmaCore.ColorScope {
if (taskSwitcher.visibility == Window.Hidden && taskSwitcher.offset > -taskSwitcher.height + units.gridUnit && taskSwitcher.tasksCount) { if (taskSwitcher.visibility == Window.Hidden && taskSwitcher.offset > -taskSwitcher.height + units.gridUnit && taskSwitcher.tasksCount) {
taskSwitcher.visible = true; taskSwitcher.visible = true;
} }
taskSwitcher.setSingleActiveWindow(-1);
} }
onReleased: { onReleased: {
if (taskSwitcher.visibility == Window.Hidden) { if (taskSwitcher.visibility == Window.Hidden) {
@ -67,6 +68,7 @@ PlasmaCore.ColorScope {
taskSwitcher.show(); taskSwitcher.show();
} else { } else {
taskSwitcher.hide(); taskSwitcher.hide();
taskSwitcher.setSingleActiveWindow(taskSwitcher.currentTaskIndex);
} }
} }
@ -95,13 +97,17 @@ PlasmaCore.ColorScope {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
iconSource: "go-home" iconSource: "go-home"
checkable: true checkable: true
onCheckedChanged: {print (checked) onCheckedChanged: {
plasmoid.nativeInterface.showDesktop = checked; if (checked) {
root.taskSwitcher.setSingleActiveWindow(-1);
} else {
root.taskSwitcher.setSingleActiveWindow(Math.max(0, root.taskSwitcher.currentTaskIndex));
}
} }
Connections { Connections {
target: plasmoid.nativeInterface target: root.taskSwitcher
onShowingDesktopChanged: { onCurrentTaskIndexChanged: {
showDesktopButton.checked = plasmoid.nativeInterface.showDesktop; showDesktopButton.checked = root.taskSwitcher.currentTaskIndex >= 0
} }
} }
} }

View file

@ -21,13 +21,17 @@
#include <QtQml> #include <QtQml>
#include <QDebug> #include <QDebug>
#include <QQuickItem>
#include <QQuickWindow>
#include <Plasma/Package> #include <Plasma/Package>
#include <KWayland/Client/connection_thread.h> #include <KWayland/Client/connection_thread.h>
#include <KWayland/Client/plasmawindowmanagement.h> #include <KWayland/Client/plasmawindowmanagement.h>
#include <KWayland/Client/plasmawindowmodel.h> #include <KWayland/Client/plasmawindowmodel.h>
#include <KWayland/Client/plasmashell.h>
#include <KWayland/Client/registry.h> #include <KWayland/Client/registry.h>
#include <KWayland/Client/surface.h>
static const QString s_kwinService = QStringLiteral("org.kde.KWin"); static const QString s_kwinService = QStringLiteral("org.kde.KWin");
@ -88,6 +92,21 @@ void TaskPanel::initWayland()
}); });
} }
); );
connect(registry, &Registry::plasmaShellAnnounced, this,
[this, registry] (quint32 name, quint32 version) {
m_shellInterface = registry->createPlasmaShell(name, version, this);
if (!m_panel) {
return;
}
Surface *s = Surface::fromWindow(m_panel);
if (!s) {
return;
}
m_shellSurface = m_shellInterface->createSurface(s, this);
}
);
registry->setup(); registry->setup();
} }
@ -96,6 +115,32 @@ QAbstractItemModel *TaskPanel::windowModel() const
return m_windowModel; return m_windowModel;
} }
QWindow *TaskPanel::panel()
{
return m_panel;
}
void TaskPanel::setPanel(QWindow *panel)
{
using namespace KWayland::Client;
if (panel == m_panel) {
return;
}
m_panel = panel;
emit panelChanged();
if (!m_shellSurface) {
return;
}
Surface *s = Surface::fromWindow(panel);
if (!s) {
return;
}
m_shellSurface = m_shellInterface->createSurface(s, this);
}
void TaskPanel::updateActiveWindow() void TaskPanel::updateActiveWindow()
{ {
if (!m_windowManagement) { if (!m_windowManagement) {
@ -118,6 +163,23 @@ void TaskPanel::closeActiveWindow()
} }
} }
void TaskPanel::setTaskGeometry(int row, int x, int y, int width, int height)
{
using namespace KWayland::Client;
if (!m_shellSurface) {
if (!m_shellInterface || !m_panel || !m_panel->isVisible()) {
return;
}
m_surface = Surface::fromWindow(m_panel);
if (!m_surface) {
return;
}
m_shellSurface = m_shellInterface->createSurface(m_surface, this);
}
m_windowModel->setMinimizedGeometry(row, m_surface, QRect(x, y, width, height));
}
K_EXPORT_PLASMA_APPLET_WITH_JSON(taskpanel, TaskPanel, "metadata.json") K_EXPORT_PLASMA_APPLET_WITH_JSON(taskpanel, TaskPanel, "metadata.json")
#include "taskpanel.moc" #include "taskpanel.moc"

View file

@ -32,6 +32,9 @@ namespace Client
class PlasmaWindowManagement; class PlasmaWindowManagement;
class PlasmaWindow; class PlasmaWindow;
class PlasmaWindowModel; class PlasmaWindowModel;
class PlasmaShell;
class PlasmaShellSurface;
class Surface;
} }
} }
@ -41,6 +44,7 @@ class TaskPanel : public Plasma::Containment
Q_PROPERTY(QAbstractItemModel* windowModel READ windowModel NOTIFY windowModelChanged) Q_PROPERTY(QAbstractItemModel* windowModel READ windowModel NOTIFY windowModelChanged)
Q_PROPERTY(bool showDesktop READ isShowingDesktop WRITE requestShowingDesktop NOTIFY showingDesktopChanged) Q_PROPERTY(bool showDesktop READ isShowingDesktop WRITE requestShowingDesktop NOTIFY showingDesktopChanged)
Q_PROPERTY(bool hasCloseableActiveWindow READ hasCloseableActiveWindow NOTIFY hasCloseableActiveWindowChanged) Q_PROPERTY(bool hasCloseableActiveWindow READ hasCloseableActiveWindow NOTIFY hasCloseableActiveWindowChanged)
Q_PROPERTY(QWindow *panel READ panel WRITE setPanel NOTIFY panelChanged)
public: public:
TaskPanel( QObject *parent, const QVariantList &args ); TaskPanel( QObject *parent, const QVariantList &args );
@ -48,6 +52,9 @@ public:
QAbstractItemModel *windowModel() const; QAbstractItemModel *windowModel() const;
QWindow *panel();
void setPanel(QWindow *panel);
Q_INVOKABLE void closeActiveWindow(); Q_INVOKABLE void closeActiveWindow();
bool isShowingDesktop() const { bool isShowingDesktop() const {
@ -57,16 +64,23 @@ public:
bool hasCloseableActiveWindow() const; bool hasCloseableActiveWindow() const;
Q_INVOKABLE void setTaskGeometry(int row, int x, int y, int width, int height);
Q_SIGNALS: Q_SIGNALS:
void windowModelChanged(); void windowModelChanged();
void showingDesktopChanged(bool); void showingDesktopChanged(bool);
void hasCloseableActiveWindowChanged(); void hasCloseableActiveWindowChanged();
void panelChanged();
private: private:
void initWayland(); void initWayland();
void updateActiveWindow(); void updateActiveWindow();
bool m_showingDesktop; bool m_showingDesktop;
KWayland::Client::PlasmaWindowManagement *m_windowManagement; QWindow *m_panel = nullptr;
KWayland::Client::PlasmaShellSurface *m_shellSurface = nullptr;
KWayland::Client::Surface *m_surface = nullptr;
KWayland::Client::PlasmaShell *m_shellInterface = nullptr;
KWayland::Client::PlasmaWindowManagement *m_windowManagement = nullptr;
KWayland::Client::PlasmaWindowModel *m_windowModel = nullptr; KWayland::Client::PlasmaWindowModel *m_windowModel = nullptr;
KWayland::Client::PlasmaWindow *m_activeWindow = nullptr; KWayland::Client::PlasmaWindow *m_activeWindow = nullptr;
}; };