aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h1
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Panel.cpp87
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Panel.h38
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Plugin.h58
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.cpp10
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.h2
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/src-widgets.pri7
7 files changed, 199 insertions, 4 deletions
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h
index 945deec0..5ae75ea4 100644
--- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h
@@ -41,6 +41,7 @@ public:
Q_INVOKABLE int height();
Q_INVOKABLE bool isVertical();
Q_INVOKABLE QStringList plugins();
+ Q_INVOKABLE QRect geometry(){ return geom; }
public slots:
void setBackground(QString fileOrColor);
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Panel.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Panel.cpp
new file mode 100644
index 00000000..3f75e8c8
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Panel.cpp
@@ -0,0 +1,87 @@
+//===========================================
+// Lumina-desktop source code
+// Copyright (c) 2018, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "Panel.h"
+
+// PUBLIC
+Panel::Panel(PanelObject *pobj) : QWidget(0, Qt::Window | Qt::FramelessWindowHint){
+ this->setObjectName("LuminaPanelBackgroundWidget");
+ obj = pobj;
+ layout = new QBoxLayout(QBoxLayout::LeftToRight, this);
+ this->setBackgroundRole(QPalette::AlternateBase);
+ connect(obj, SIGNAL(backgroundChanged()), this, SLOT(updateBackground()) );
+ connect(obj, SIGNAL(geomChanged()), this, SLOT(updateGeom()) );
+ connect(obj, SIGNAL(pluginsChanged()), this, SLOT(updatePlugins()) );
+ connect(obj, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) );
+ updateGeom();
+ updateBackground();
+ updatePlugins();
+ this->showNormal();
+}
+
+Panel::~Panel(){
+
+}
+
+// PRIVATE
+Plugin* Panel::findPlugin(QString id){
+ for(int i=0; i<PLUGINS.count(); i++){
+ if(PLUGINS[i]->id()==id){ return PLUGINS[i]; }
+ }
+ return 0;
+}
+
+Plugin* Panel::createPlugin(QString id){
+
+ return 0;
+}
+
+// PRIVATE SLOTS
+void Panel::objectDestroyed(QObject *dobj){
+ if(dobj == Q_NULLPTR || dobj == obj){
+ //Make sure this widget is also cleaned up when the base object is deleted
+ this->deleteLater();
+ }
+}
+
+void Panel::updateGeom(){
+ this->setGeometry(obj->geometry());
+ this->setFixedSize(obj->geometry().size());
+ layout->setDirection( obj->isVertical() ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight );
+ for(int i=0; i<PLUGINS.length(); i++){
+ PLUGINS[i]->setVertical( obj->isVertical() );
+ }
+}
+
+void Panel::updateBackground(){
+ static QString PANELTEMPLATE = "QToolButton::menu-indicator{ image: none; } QWidget#LuminaPanelBackgroundWidget{ background: %1; }";
+ QString bg = obj->background();
+ //qDebug() << "Got panel BG:" << obj->name() << bg;
+ this->setStyleSheet(PANELTEMPLATE.arg(bg));
+}
+
+void Panel::updatePlugins(){
+ QStringList plugs = obj->plugins();
+ qDebug() << "Got panel plugins:" << obj->name() << plugs;
+ for(int i=0; i<plugs.length(); i++){
+ lastplugins.removeAll(plugs[i]); //remove this from the last list (handled)
+ Plugin *plug = findPlugin(plugs[i]);
+ if(plug==0){ plug = createPlugin(plugs[i]); }
+ if(plug==0){ continue; } //not a valid plugin - just skip it
+ //Now setup the order of the plugins properly
+ if( layout->indexOf(plug) >=0 ){
+ layout->removeWidget(plug); //remove from the layout for a moment
+ }
+ layout->insertWidget(i, plug);
+ }
+ //Now remove any plugins which were deleted from config
+ for(int i=0; i<lastplugins.length(); i++){
+ Plugin *plug = findPlugin(lastplugins[i]);
+ if(plug==0){ continue; }
+ plug->deleteLater();
+ }
+ lastplugins = plugs;
+}
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Panel.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Panel.h
new file mode 100644
index 00000000..64b0e239
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Panel.h
@@ -0,0 +1,38 @@
+//===========================================
+// Lumina-desktop source code
+// Copyright (c) 2018, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is the Widgets version of a floating, top-level panel
+//===========================================
+#ifndef _DESKTOP_WIDGETS_PANEL_H
+#define _DESKTOP_WIDGETS_PANEL_H
+
+#include <global-includes.h>
+#include <QBoxLayout>
+#include "Plugin.h"
+
+class Panel : public QWidget {
+ Q_OBJECT
+private:
+ PanelObject *obj;
+ QBoxLayout *layout;
+ QStringList lastplugins;
+ //Stuff for managing the plugins
+ QList<Plugin*> PLUGINS;
+ Plugin* findPlugin(QString id);
+ Plugin* createPlugin(QString id);
+
+public:
+ Panel(PanelObject *pobj);
+ ~Panel();
+
+private slots:
+ void objectDestroyed(QObject*);
+ void updateGeom();
+ void updateBackground();
+ void updatePlugins();
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Plugin.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Plugin.h
new file mode 100644
index 00000000..0934374f
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/Plugin.h
@@ -0,0 +1,58 @@
+//===========================================
+// Lumina-desktop source code
+// Copyright (c) 2018, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is the Widgets version of a generic plugin
+//===========================================
+#ifndef _DESKTOP_WIDGETS_GENERIC_PLUGIN_H
+#define _DESKTOP_WIDGETS_GENERIC_PLUGIN_H
+
+#include <global-includes.h>
+
+//Base plugin type for a canvas/widget
+class Plugin : public QWidget{
+ Q_OBJECT
+private:
+ bool isPanelPlugin;
+ bool isVertical; //only used for panel plugins
+ QString _id;
+
+signals:
+ void orientationChanged();
+
+public:
+ Plugin(QWidget *parent, QString id, bool panelplug = false) : QWidget(parent){
+ isPanelPlugin = panelplug;
+ isVertical = false;
+ _id = id;
+ }
+
+ void setVertical(bool set){
+ if(set!=isVertical){ isVertical = set; emit orientationChanged(); }
+ }
+
+ QString id(){ return _id; }
+
+private slots:
+
+};
+
+//Special subclass for a button-based plugin
+class PluginButton : public Plugin{
+ Q_OBJECT
+private:
+ QToolButton *button;
+
+public:
+ PluginButton(QWidget *parent, QString id, bool panelplug=false) : Plugin(parent, id, panelplug) {
+ button = new QToolButton(this);
+ this->setLayout( new QBoxLayout(QBoxLayout::LeftToRight) );
+ this->layout()->setContentsMargins(0,0,0,0);
+ this->layout()->addWidget(button);
+ }
+
+ ~PluginButton(){}
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.cpp
index 9e22a143..3c034dc6 100644
--- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.cpp
@@ -6,6 +6,7 @@
//===========================================
#include <global-objects.h>
#include "RootDesktop.h"
+#include "Panel.h"
// === PUBLIC ===
RootDesktop::RootDesktop(QWindow *) : QWidget(0, Qt::Widget | Qt::FramelessWindowHint | Qt::WindowStaysOnBottomHint){
@@ -66,7 +67,14 @@ void RootDesktop::on_screensChanged(){
}
void RootDesktop::on_panelsChanged(){
-
+ QStringList pans = RootDesktopObject::instance()->panels();
+ //Now find any new panels and create them as needed
+ for(int i=0; i<pans.length(); i++){
+ if(lastpanels.contains(pans[i])){ continue; } //already created
+ //Need to create a new panel widget (self-maintained)
+ new Panel( RootDesktopObject::instance()->panel(pans[i]) );
+ }
+ lastpanels = pans; //save this for the next time around
}
void RootDesktop::on_windowsChanged(){
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.h
index 16ce0e47..ff717074 100644
--- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.h
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.h
@@ -20,7 +20,7 @@ public:
private:
QImage bgimage;
- QStringList lastscreens;
+ QStringList lastscreens, lastpanels;
QTimer *bgTimer;
DesktopContextMenu *cmenu;
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/src-widgets.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/src-widgets.pri
index f1e200fd..7ed228f7 100644
--- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/src-widgets.pri
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/src-widgets.pri
@@ -3,8 +3,11 @@ INCLUDEPATH *= $${PWD}
SOURCES *= $${PWD}/RootDesktop.cpp \
$${PWD}/ContextMenu.cpp \
- $${PWD}/NativeWindow.cpp
+ $${PWD}/NativeWindow.cpp \
+ $${PWD}/Panel.cpp
HEADERS *= $${PWD}/RootDesktop.h \
$${PWD}/ContextMenu.h \
- $${PWD}/NativeWindow.h
+ $${PWD}/NativeWindow.h \
+ $${PWD}/Panel.h \
+ $${PWD}/Plugin.h
bgstack15