summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2018-09-06 11:32:54 +0200
committerSimon Rettberg2018-09-06 11:32:54 +0200
commitcb93788148785758be72fcb2afe2039e7a882c53 (patch)
treec2095f4ac5995d53e62bd9e247345a1b60c3bf5a
parent[client] Fix memory leak (diff)
downloadpvs2-cb93788148785758be72fcb2afe2039e7a882c53.tar.gz
pvs2-cb93788148785758be72fcb2afe2039e7a882c53.tar.xz
pvs2-cb93788148785758be72fcb2afe2039e7a882c53.zip
[client] New addon system for buttons and menu
Instead of integrating workspace switching and screen locking directly into PVS2, introduce an addon system to insert new functionality into the toolbar, as buttons or menu entries.
-rw-r--r--gui/client/toolbar.ui396
-rw-r--r--src/client/addons/addons.cpp235
-rw-r--r--src/client/addons/addons.h25
-rw-r--r--src/client/toolbar/toolbar.cpp110
-rw-r--r--src/client/toolbar/toolbar.h11
5 files changed, 476 insertions, 301 deletions
diff --git a/gui/client/toolbar.ui b/gui/client/toolbar.ui
index cec570f..121961e 100644
--- a/gui/client/toolbar.ui
+++ b/gui/client/toolbar.ui
@@ -6,15 +6,15 @@
<rect>
<x>0</x>
<y>0</y>
- <width>440</width>
- <height>30</height>
+ <width>281</width>
+ <height>28</height>
</rect>
</property>
<property name="windowTitle">
- <string>Form</string>
+ <string notr="true">Form</string>
</property>
<property name="styleSheet">
- <string notr="true">QFrame {
+ <string notr="true">#Toolbar {
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #f6f7fa, stop: 1 #dadbde);
border-radius: 0px;
}
@@ -67,217 +67,191 @@ QCheckBox::indicator:checked:pressed {
</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
- <property name="margin">
- <number>0</number>
+ <property name="spacing">
+ <number>1</number>
</property>
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="cmdMenu">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>84</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Menu</string>
+ </property>
+ <property name="text">
+ <string>Menu</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="spacer_left">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="lblStatus">
+ <property name="styleSheet">
+ <string notr="true">color:red</string>
+ </property>
+ <property name="text">
+ <string notr="true">Offline</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>19</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="icon_cam">
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="icon_pvs">
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <italic>true</italic>
+ <bold>true</bold>
+ <kerning>true</kerning>
+ </font>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">color:#05f;</string>
+ </property>
+ <property name="text">
+ <string notr="true">PVS</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="spacer_right">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="buttonContainer"/>
+ </item>
<item>
- <widget class="QFrame" name="frame">
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
+ <widget class="QToolButton" name="btnAttention">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="sizeIncrement">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="icon">
+ <iconset resource="../../pvsclient.qrc">
+ <normaloff>:/hand-raise</normaloff>
+ <normalon>:/hand-raise-red</normalon>:/hand-raise</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
</property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
+ <property name="checked">
+ <bool>false</bool>
</property>
- <layout class="QHBoxLayout" name="horizontalLayout2">
- <property name="margin">
- <number>3</number>
- </property>
- <item>
- <widget class="QPushButton" name="cmdMenu">
- <property name="minimumSize">
- <size>
- <width>84</width>
- <height>24</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Menu</string>
- </property>
- <property name="text">
- <string>Menu</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="spacer_left">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="lblStatus">
- <property name="styleSheet">
- <string notr="true">color:red</string>
- </property>
- <property name="text">
- <string notr="true">Offline</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="icon_cam">
- <property name="minimumSize">
- <size>
- <width>16</width>
- <height>16</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16</width>
- <height>16</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="scaledContents">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="icon_pvs">
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- <weight>75</weight>
- <italic>true</italic>
- <bold>true</bold>
- <kerning>true</kerning>
- </font>
- </property>
- <property name="styleSheet">
- <string notr="true">color:#05f;</string>
- </property>
- <property name="text">
- <string notr="true">PVS</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="spacer_right">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="btnLockDesktop">
- <property name="minimumSize">
- <size>
- <width>84</width>
- <height>24</height>
- </size>
- </property>
- <property name="toolTip">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Lock this workstation&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Lock</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="btnManager">
- <property name="minimumSize">
- <size>
- <width>84</width>
- <height>24</height>
- </size>
- </property>
- <property name="text">
- <string>Switch</string>
- </property>
- <property name="checkable">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="btnAttention">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>30</width>
- <height>24</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>30</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="sizeIncrement">
- <size>
- <width>30</width>
- <height>0</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>30</width>
- <height>0</height>
- </size>
- </property>
- <property name="styleSheet">
- <string notr="true"/>
- </property>
- <property name="text">
- <string notr="true"/>
- </property>
- <property name="icon">
- <iconset resource="../../pvsclient.qrc">
- <normaloff>:/hand-raise</normaloff>
- <normalon>:/hand-raise-red</normalon>:/hand-raise</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>22</width>
- <height>22</height>
- </size>
- </property>
- <property name="checkable">
- <bool>true</bool>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- </layout>
</widget>
</item>
</layout>
diff --git a/src/client/addons/addons.cpp b/src/client/addons/addons.cpp
new file mode 100644
index 0000000..9f4a99f
--- /dev/null
+++ b/src/client/addons/addons.cpp
@@ -0,0 +1,235 @@
+#include "addons.h"
+
+#include <QDir>
+#include <QSettings>
+#include <QPushButton>
+#include <QAction>
+#include <QProcess>
+#include <QtDebug>
+#include <QRegularExpression>
+
+#define MKSTR(x) static const QString s_ ## x(#x)
+
+MKSTR(EVENT);
+MKSTR(ADDRESS);
+MKSTR(ISLOCAL);
+MKSTR(CHECKED);
+MKSTR(ENABLED);
+MKSTR(VISIBLE);
+MKSTR(connected);
+MKSTR(disconnected);
+MKSTR(init);
+MKSTR(clicked);
+MKSTR(true);
+MKSTR(false);
+
+static const QSize ICON_SIZE(20, 20);
+
+QList<Addon*> AddonManager::_addons;
+
+class Addon
+{
+public:
+ Addon() : button(nullptr), menu(nullptr), wantConnectInfo(false) {}
+ QPushButton *button;
+ QAction *menu;
+ QProcess process;
+ bool wantConnectInfo;
+ bool wantInit;
+ bool runAsync;
+ QList<QPair<QString, QString>> envir;
+};
+
+static inline bool toBool(const QString &string)
+{
+ return string.toLower() == s_true;
+}
+
+static void executeAddon(Addon *addon);
+
+static void setAddonVisible(Addon *addon, bool visible);
+
+static void handleAddonOutput(Addon *addon, QRegularExpressionMatchIterator &matches);
+
+void AddonManager::loadFromPath(const QString &path, QList<QPushButton*> &buttons, QList<QAction*> &menuEntries)
+{
+ QDir configDir(path);
+ QFileInfoList fileInfoList = configDir.entryInfoList(QDir::Files, QDir::Name);
+ QRegularExpression paramRegex("^([A-Z]+)=(.*)$", QRegularExpression::MultilineOption);
+
+ for (QFileInfo fileInfo : fileInfoList) {
+ QString filePath = fileInfo.absoluteFilePath();
+ QSettings setting(filePath, QSettings::IniFormat);
+ QString caption = setting.value("caption").toString(); // TODO: i18n
+ QString exec = setting.value("exec").toString();
+ QString type = setting.value("type").toString();
+ QString tooltip = setting.value("tooltip").toString();
+ QIcon icon(setting.value("icon").toString());
+ bool checkable = setting.value("checkable").toBool();
+ if (exec.isEmpty() || (caption.isEmpty() && icon.isNull())) {
+ qDebug() << "Ignoring" << filePath << "caption+icon or exec empty";
+ continue;
+ }
+ if (!QFileInfo(exec).isExecutable() || !QFileInfo(exec).isFile()) {
+ qDebug() << "Ignoring" << filePath << "since target" << exec << "doesn't exist or isn't an executable file";
+ continue;
+ }
+
+ // Alloc addon
+ Addon *addon = new Addon();
+ // Toggle/click callback
+ auto toggleFun = [=](bool value) {
+ addon->envir.append(qMakePair(s_EVENT, s_clicked));
+ addon->envir.append(qMakePair(s_CHECKED, (value ? s_true : s_false)));
+ executeAddon(addon);
+ };
+ if (type == "menu") {
+ addon->menu = new QAction(caption);
+ if (!icon.isNull()) {
+ addon->menu->setIcon(icon);
+ }
+ addon->menu->setCheckable(checkable);
+ addon->menu->setToolTip(tooltip);
+ menuEntries.append(addon->menu);
+ addon->menu->connect(addon->menu, &QAction::triggered, toggleFun);
+ } else if (type == "button") {
+ addon->button = new QPushButton(caption);
+ if (!icon.isNull()) {
+ addon->button->setIcon(icon);
+ addon->button->setIconSize(ICON_SIZE);
+ }
+ addon->button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding);
+ addon->button->setCheckable(checkable);
+ addon->button->setToolTip(tooltip);
+ buttons.append(addon->button);
+ addon->button->connect(addon->button, &QPushButton::clicked, toggleFun);
+ } else {
+ qDebug() << "Ignoring unknown addon type" << type;
+ delete addon;
+ continue;
+ }
+ _addons.append(addon);
+
+ addon->wantConnectInfo = setting.value("connection-events").toBool();
+ addon->wantInit = setting.value("init").toBool();
+ addon->runAsync = setting.value("async").toBool();
+ // Setup process
+ addon->process.setProgram(exec);
+ // Stdin for status updates
+ addon->process.connect(&addon->process, &QProcess::readyReadStandardOutput, [=]() {
+ auto lines = addon->process.readAllStandardOutput();
+ auto matches = paramRegex.globalMatch(lines);
+ handleAddonOutput(addon, matches);
+ });
+ // Stderr just for debugging
+ addon->process.connect(&addon->process, &QProcess::readyReadStandardError, [=]() {
+ qDebug() << exec << "stderr:" << QString::fromLocal8Bit(addon->process.readAllStandardError());
+ });
+ }
+}
+
+void AddonManager::initControls()
+{
+ // Call all init functions
+ for (auto addon : _addons) {
+ if (addon->wantInit) {
+ addon->envir.append(qMakePair(s_EVENT, s_init));
+ executeAddon(addon);
+ } else {
+ setAddonVisible(addon, true);
+ }
+ }
+}
+
+void AddonManager::connectEvent(bool isLocal, const QString &address)
+{
+ for (auto addon : _addons) {
+ if (!addon->wantConnectInfo)
+ continue;
+ addon->envir.append(qMakePair(s_EVENT, s_connected));
+ addon->envir.append(qMakePair(s_ADDRESS, address));
+ addon->envir.append(qMakePair(s_ISLOCAL, isLocal ? s_true : s_false));
+ executeAddon(addon);
+ }
+}
+
+void AddonManager::disconnectEvent()
+{
+ for (auto addon : _addons) {
+ if (!addon->wantConnectInfo)
+ continue;
+ addon->envir.append(qMakePair(s_EVENT, s_disconnected));
+ executeAddon(addon);
+ }
+}
+
+static void executeAddon(Addon *addon)
+{
+ // Set up environment
+ auto env = QProcessEnvironment::systemEnvironment();
+ for (auto e : addon->envir) {
+ env.insert(e.first, e.second);
+ }
+ addon->envir.clear();
+ if (!addon->runAsync) {
+ // Kill remains
+ if (addon->process.state() != QProcess::NotRunning) {
+ addon->process.waitForFinished(500);
+ }
+ if (addon->process.state() != QProcess::NotRunning) {
+ addon->process.close();
+ }
+ }
+ addon->process.setProcessEnvironment(env);
+ // Run
+ if (addon->runAsync) {
+ addon->process.startDetached(addon->process.program(), QStringList());
+ } else {
+ addon->process.start();
+ addon->process.closeWriteChannel();
+ }
+}
+
+static void setAddonVisible(Addon *addon, bool newValue)
+{
+ if (addon->button != nullptr) {
+ QWidget *p = addon->button->parentWidget();
+ bool wasVisible = p != nullptr && addon->button->isVisibleTo(p);
+ qDebug() << "Visibility" << wasVisible << "->" << newValue;
+ addon->button->setVisible(newValue);
+ if (p != nullptr && wasVisible != newValue) {
+ // Visibility changed -- adjust size of toolbar
+ int size = (addon->button->width() + 2) * (newValue ? 1 : -1);
+ qDebug() << "Adding" << size;
+ p->setFixedWidth(p->width() + size);
+ }
+ } else {
+ addon->menu->setVisible(newValue);
+ }
+}
+
+static void handleAddonOutput(Addon* addon, QRegularExpressionMatchIterator &matches)
+{
+ while (matches.hasNext()) {
+ auto m = matches.next();
+ qDebug() << "Match:" << m.captured(0);
+ auto key = m.captured(1);
+ auto val = m.captured(2);
+ bool newValue = toBool(val);
+ if (key == s_VISIBLE) {
+ setAddonVisible(addon, newValue);
+ } else if (key == s_CHECKED) {
+ if (addon->button != nullptr) {
+ addon->button->setChecked(newValue);
+ } else {
+ addon->menu->setChecked(newValue);
+ }
+ } else if (key == s_ENABLED) {
+ if (addon->button != nullptr) {
+ addon->button->setEnabled(newValue);
+ } else {
+ addon->menu->setEnabled(newValue);
+ }
+ }
+ }
+}
diff --git a/src/client/addons/addons.h b/src/client/addons/addons.h
new file mode 100644
index 0000000..185c399
--- /dev/null
+++ b/src/client/addons/addons.h
@@ -0,0 +1,25 @@
+#ifndef _ADDONS_H_
+#define _ADDONS_H_
+
+#include <QString>
+#include <QList>
+
+class Toolbar;
+class QPushButton;
+class QAction;
+
+class Addon;
+
+class AddonManager
+{
+public:
+ static void loadFromPath(const QString &path, QList<QPushButton*> &buttons, QList<QAction*> &menuEntries);
+ static void initControls();
+ static void connectEvent(bool isLocal, const QString &address);
+ static void disconnectEvent();
+
+private:
+ static QList<Addon*> _addons;
+};
+
+#endif
diff --git a/src/client/toolbar/toolbar.cpp b/src/client/toolbar/toolbar.cpp
index 1640c01..bec8586 100644
--- a/src/client/toolbar/toolbar.cpp
+++ b/src/client/toolbar/toolbar.cpp
@@ -1,12 +1,3 @@
-/*
- * toolbar.cpp
- *
- * Created on: 21.01.2013
- * Author: sr
- */
-#include <QtAlgorithms>
-#include <QNetworkInterface>
-#include <QProcess>
#include "../../shared/settings.h"
#include "../net/serverconnection.h"
#include "../vnc/vncwindow.h"
@@ -14,10 +5,15 @@
#include "../util/util.h"
#include "../informationdialog/informationdialog.h"
#include "../clientapp/clientapp.h"
+#include "../addons/addons.h"
#include "toolbar.h"
#include "ui_toolbar.h"
+#include <QtAlgorithms>
+#include <QNetworkInterface>
+#include <QProcess>
+
/**
* @brief
*
@@ -107,23 +103,9 @@ void Toolbar::init()
connect(clientApp->connectWindow(), SIGNAL(disconnect()), this, SLOT(onDoDisconnect()));
connect(clientApp->connectWindow(), SIGNAL(connected(ServerConnection*)), this, SLOT(onConnected(ServerConnection*)));
connect(_ui->btnAttention, SIGNAL(toggled(bool)), this, SLOT(onBtnAttention()));
- connect(_ui->btnManager, &QPushButton::toggled, [=](bool pressed) {
- this->toggleDesktop(pressed ? Desktop::Manager : Desktop::Primary);
- });
/* Setup menu */
- initMenu();
-
- updateButtonVisibility();
-
- /* setup lock desktop button*/
- bool showLock = clientApp->getSettings()->value("showLockDesktopButton").toBool();
- if (showLock) {
- connect(_ui->btnLockDesktop, SIGNAL(clicked()), this, SLOT(onBtnLockDesktop()));
- } else {
- setFixedWidth(width() - _ui->btnLockDesktop->width());
- _ui->btnLockDesktop->setVisible(false);
- }
+ initButtonsAndMenus();
/* hide attention button while disconnected */
_ui->btnAttention->setVisible(false);
@@ -160,8 +142,18 @@ void Toolbar::init()
* This function should be called once from the main init() function which in
* turn should only be called by the constructor.
**/
-void Toolbar::initMenu()
+void Toolbar::initButtonsAndMenus()
{
+ QList<QPushButton*> buttons;
+ QList<QAction*> menus;
+ auto settings = clientApp->getSettings();
+ AddonManager::loadFromPath(settings->value("addonConfigDir", "/opt/openslx/pvs2/addons").toString(), buttons, menus);
+ // Buttons
+ for (auto i : buttons) {
+ _ui->buttonContainer->addWidget(i);
+ i->setVisible(false);
+ }
+ // Menu
_menu = new QMenu(this);
_acnConnect = new QAction(tr("&Connect..."), this);
_acnDisconnect = new QAction(tr("&Disconnect"), this);
@@ -173,6 +165,10 @@ void Toolbar::initMenu()
_menu->addAction(_acnConnect);
_menu->addAction(_acnDisconnect);
_menu->addSeparator();
+ for (auto i : menus) {
+ _menu->addAction(i);
+ i->setVisible(false);
+ }
_menu->addAction(_acnInformation);
_menu->addAction(_acnAbout);
_menu->addSeparator();
@@ -181,7 +177,7 @@ void Toolbar::initMenu()
/* only add a "quit"-button when the configuration allows it. */
- bool allow = clientApp->getSettings()->value("allowClientQuit").toBool();
+ bool allow = settings->value("allowClientQuit").toBool();
_acnQuit->setVisible(allow);
// Connect the signals
@@ -191,26 +187,11 @@ void Toolbar::initMenu()
connect(_acnInformation, SIGNAL(triggered()), this, SLOT(showInformationDialog()));
connect(_acnAbout, SIGNAL(triggered()), this, SLOT(showAboutDialog()));
connect(_acnQuit, SIGNAL(triggered()), this, SLOT(exit()));
-}
-void Toolbar::updateButtonVisibility()
-{
- // "Toggle to manager view" (switch between desktop 1 and 2)
- bool showManagerToggle = clientApp->isConfiguredAsManager() || clientApp->isConnectedToLocalManager();
- if (showManagerToggle == _ui->btnManager->isHidden()) {
- // Visibility should change
- if (showManagerToggle) {
- _ui->btnManager->blockSignals(false);
- setFixedWidth(width() + _ui->btnManager->width());
- } else {
- // Hide "toggle manager" -- assume manager was closed, switch to first desktop where the VM should be running
- _ui->btnManager->blockSignals(true);
- _ui->btnManager->setChecked(false);
- setFixedWidth(width() - _ui->btnManager->width());
- toggleDesktop(Desktop::Primary);
- }
- _ui->btnManager->setVisible(showManagerToggle);
- }
+ // Delay until bar is visible
+ QTimer::singleShot(10, [=]() {
+ AddonManager::initControls();
+ });
}
/**
@@ -382,7 +363,7 @@ void Toolbar::onDisconnected(ServerConnection* connection)
_ui->btnAttention->setVisible(false);
onBtnAttention();
delayedHideBar();
- QTimer::singleShot(1, this, SLOT(updateButtonVisibility()));
+ AddonManager::disconnectEvent();
}
/**
@@ -401,7 +382,7 @@ void Toolbar::onConnected(ServerConnection* connection)
_ui->lblStatus->setText(tr("Online"));
/* connected, show button */
_ui->btnAttention->setVisible(true);
- QTimer::singleShot(1, this, SLOT(updateButtonVisibility()));
+ AddonManager::connectEvent(connection->isLocalConnection(), connection->getPeerAdress());
//
connect(connection, SIGNAL(disconnected(ServerConnection*)), this, SLOT(onDisconnected(ServerConnection*)));
connect(connection, SIGNAL(openVnc(const QString&, int, const QString&, bool, bool, const QString&, const int, const QByteArray&)),
@@ -501,6 +482,8 @@ void Toolbar::showInformationDialog()
InformationDialog* d = new InformationDialog();
d->exec();
d->deleteLater();
+ auto b = new QPushButton("sdfadsfgadfgadfgadg");
+ this->layout()->addWidget(b);
}
void Toolbar::onBtnAttention()
@@ -515,39 +498,6 @@ void Toolbar::onBtnAttention()
}
}
-/** call script to switch to workspace of the manager */
-void Toolbar::toggleDesktop(Desktop d)
-{
- QProcess switchP;
- if (d == Desktop::Manager) {
- switchP.start("/bin/sh", QStringList() << "/opt/openslx/pvs2/switchToManager.sh");
- } else if (d == Desktop::Primary) {
- switchP.start("/bin/sh", QStringList() << "/opt/openslx/pvs2/switchBack.sh");
- } else {
- qDebug() << "Invalid toggleDesktop call";
- return;
- }
- switchP.waitForFinished();
-}
-
-void Toolbar::onBtnLockDesktop()
-{
- if (this->lockDesktopP.state() == QProcess::NotRunning) {
- _ui->btnLockDesktop->setEnabled(false);
- this->lockDesktopP.start("/bin/sh", QStringList() << "/opt/openslx/pvs2/lockDesktop.sh");
-
- QTimer::singleShot(2 * 1000, this, SLOT(enableLockBtn()));
-
- } else {
- qDebug() << "trying to use lockDesktop-process while it is still running";
- }
-}
-
-void Toolbar::enableLockBtn()
-{
- _ui->btnLockDesktop->setEnabled(true);
-}
-
void Toolbar::setToolbarPosition(const QRect &availableGeometry)
{
const QRect primaryScreen = QGuiApplication::primaryScreen()->geometry();
diff --git a/src/client/toolbar/toolbar.h b/src/client/toolbar/toolbar.h
index 67e9347..48fbf03 100644
--- a/src/client/toolbar/toolbar.h
+++ b/src/client/toolbar/toolbar.h
@@ -27,11 +27,6 @@ namespace Ui
class Toolbar;
}
-enum class Desktop {
- Primary,
- Manager,
-};
-
class Toolbar : public QWidget
{
Q_OBJECT
@@ -69,8 +64,7 @@ private:
bool isManagerPc();
QString identifyMgrIP();
void init();
- void initMenu();
- void toggleDesktop(Desktop d);
+ void initButtonsAndMenus();
QProcess lockDesktopP;
@@ -80,7 +74,6 @@ private slots:
void onConnected(ServerConnection* connection);
void onServerAttentionChanged(const bool on);
void onDoDisconnect();
- void onBtnLockDesktop();
void onBtnAttention();
void exit();
void cameraBlink();
@@ -90,8 +83,6 @@ private slots:
void delayedHideBar();
void showAboutDialog();
void showInformationDialog();
- void enableLockBtn();
- void updateButtonVisibility();
void setToolbarPosition(const QRect &geometry);
};