aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets')
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.cpp58
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.h8
-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
8 files changed, 246 insertions, 22 deletions
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.cpp
index 44b2d715..86dd8482 100644
--- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.cpp
@@ -6,11 +6,34 @@
//===========================================
#include "NativeWindow.h"
+#include <QWidget>
+#include <QWindow>
+
// === PUBLIC ===
NativeWindow::NativeWindow( NativeWindowObject *obj ) : QFrame(0, Qt::Window | Qt::FramelessWindowHint){
WIN = obj;
createFrame();
- WIN->addFrameWinID(this->winId());
+ WIN->addFrameWinID(container->winId());
+}
+
+NativeWindow::~NativeWindow(){
+ vlayout->deleteLater();
+ toolbarL->deleteLater();
+}
+
+QPoint NativeWindow::relativeOrigin(){
+ //Update all the margins for the frame
+ /*QList<int> frame = WIN->property(NativeWindowObject::FrameExtents).value<QList<int> >();
+ //QList<int> : [Left, Right, Top, Bottom] in pixels
+ int topM = frame[2] - titleLabel->fontMetrics().height(); //figure out how much extra we have to work with
+ if(topM<0){ topM = 0; }
+ int botM = topM/2.0;
+ QPoint containerCorner(frame[0], topM-botM);
+ return containerCorner;*/
+ return QPoint(0,0);
+}
+
+void NativeWindow::initProperties(){
//Setup all the property connections
connect(WIN, SIGNAL(winImageChanged()), this, SLOT(syncWinImage()) );
connect(WIN, SIGNAL(nameChanged()), this, SLOT(syncName()) );
@@ -21,28 +44,24 @@ NativeWindow::NativeWindow( NativeWindowObject *obj ) : QFrame(0, Qt::Window | Q
connect(WIN, SIGNAL(winTypeChanged()), this, SLOT(syncWinType()) );
connect(WIN, SIGNAL(geomChanged()), this, SLOT(syncGeom()) );
connect(WIN, SIGNAL(WindowClosed(WId)), this, SLOT(deleteLater()) );
+
+ //Setup all the button connections
+ connect(minB, SIGNAL(clicked()), WIN, SLOT(toggleVisibility()) );
+ connect(maxB, SIGNAL(clicked()), WIN, SLOT(toggleMaximize()) );
+ connect(closeB, SIGNAL(clicked()), WIN, SLOT(requestClose()) );
+
//Now Perform the initial property loads
syncWinImage();
syncName();
syncTitle();
syncIcon();
syncSticky();
- syncVisibility();
syncWinType();
syncGeom();
- //Setup all the button connections
- connect(minB, SIGNAL(clicked()), WIN, SLOT(toggleVisibility()) );
- connect(maxB, SIGNAL(clicked()), WIN, SLOT(toggleMaximize()) );
- connect(closeB, SIGNAL(clicked()), WIN, SLOT(requestClose()) );
-
+ syncVisibility(true); //init visibility - force it visible to start with
}
-NativeWindow::~NativeWindow(){
- vlayout->deleteLater();
- toolbarL->deleteLater();
-}
-
// === PRIVATE ===
void NativeWindow::createFrame(){
//Initialize the widgets
@@ -62,7 +81,8 @@ void NativeWindow::createFrame(){
vlayout->setSpacing(0);
toolbarL = new QHBoxLayout();
toolbarL->setSpacing(0);
-
+ container = QWidget::createWindowContainer(QWindow::fromWinId(WIN->id()), this);
+ container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
//vlayout.align
titleLabel = new QLabel(this);
titleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
@@ -75,7 +95,7 @@ void NativeWindow::createFrame(){
toolbarL->addWidget(maxB);
toolbarL->addWidget(closeB);
vlayout->addLayout(toolbarL);
- vlayout->addStretch();
+ vlayout->addWidget(container);
this->setLayout(vlayout);
// Load the icons for the buttons
loadIcons();
@@ -112,9 +132,13 @@ void NativeWindow::syncSticky(){
qDebug() << "Got Sticky Change:" << WIN->isSticky();
}
-void NativeWindow::syncVisibility(){
- qDebug() << "Sync Visibility:" << WIN->isVisible();
- this->setVisible(WIN->isVisible());
+void NativeWindow::syncVisibility(bool init){
+ if(init){
+ WIN->setProperty(NativeWindowObject::Visible, true, true); //force it
+ }else{
+ qDebug() << "Sync Visibility:" << WIN->isVisible();
+ this->setVisible(WIN->isVisible());
+ }
}
void NativeWindow::syncWinType(){
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.h
index 1d87ed71..f2fd822c 100644
--- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.h
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.h
@@ -16,6 +16,11 @@ public:
NativeWindow(NativeWindowObject *obj);
~NativeWindow();
+ QPoint relativeOrigin(); //origin of the embedded window relative to the frame
+
+public slots:
+ void initProperties();
+
private:
//Core object
NativeWindowObject *WIN;
@@ -27,6 +32,7 @@ private:
QHBoxLayout *toolbarL;
QVBoxLayout *vlayout;
QLabel *titleLabel;
+ QWidget *container;
// Info cache variables
QRect oldgeom;
@@ -38,7 +44,7 @@ private slots:
void syncTitle();
void syncIcon();
void syncSticky();
- void syncVisibility();
+ void syncVisibility(bool init = false);
void syncWinType();
void syncGeom();
};
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