diff options
author | Ken Moore <ken@ixsystems.com> | 2018-04-09 14:30:07 -0400 |
---|---|---|
committer | Ken Moore <ken@ixsystems.com> | 2018-04-09 14:30:07 -0400 |
commit | fcc83830947c56b04680fa18b97a5b0b05097e04 (patch) | |
tree | f14068ea39ab2bc17e1ecceaa9fab806315eb8a6 | |
parent | Removed dangling code (diff) | |
download | lumina-fcc83830947c56b04680fa18b97a5b0b05097e04.tar.gz lumina-fcc83830947c56b04680fa18b97a5b0b05097e04.tar.bz2 lumina-fcc83830947c56b04680fa18b97a5b0b05097e04.zip |
Add in the widgets-based version of panels.
This seems to be working fine right now - just need to "turn on" the plugins later once we have a couple for testing.
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 |