/*
* toolbar.cpp
*
* Created on: 21.01.2013
* Author: sr
*/
#include <QNetworkInterface>
#include "../../shared/settings.h"
#include "../net/serverconnection.h"
#include "../vnc/vncwindow.h"
#include "../vnc/vncserver.h"
#include "../util/util.h"
#include "toolbar.h"
#include "ui_toolbar.h"
/***************************************************************************//**
* @brief
*
* Does exact teh same as Toolbar::Toolbar(QWidget *parent) but additionally
* instantly tries to connect to a pvsmgr with the given sessionName.
* @param sessionName The session to connect to.
* @param parent If parent is 0, the new widget becomes a window. If parent is
* another widget, this widget becomes a child window inside parent. The new
* widget is deleted when its parent is deleted.
*/
Toolbar::Toolbar(const QByteArray sessionName, QWidget *parent)
: Toolbar(parent)
{
qDebug() << "sessionName - constructor";
_connectWindow->connectToSession(sessionName, NULL);
}
/***************************************************************************//**
* @brief Constructor of the Toolbar.
*
* Does exact the same as Toolbar::Toolbar(QWidget *parent) but additionally
* instantly tries to connect to the pvsmgr in its room without sessionName.
* @param autoConnect
* @param parent If parent is 0, the new widget becomes a window. If parent is
* another widget, this widget becomes a child window inside parent. The new
* widget is deleted when its parent is deleted.
*/
Toolbar::Toolbar(const bool autoConnect, QWidget *parent) : Toolbar(parent)
{
qDebug() << "auto - constructor!";
if (autoConnect) {
// Try getting manager ip.
QString mgrIp = identifyMgrIP();
qDebug() << "mgrIP: " << mgrIp;
if (mgrIp != NULL) {
qDebug() << "Starting WITH specific mgrIP";
_connectWindow->connectToSession("", mgrIp);
} else {
qDebug() << "Starting WITHOUT specific mgrIP";
_connectWindow->connectToSession("", NULL);
}
} else {
_connectWindow->connectToSession("", NULL);
}
}
/***************************************************************************//**
* @brief Constructor of the Toolbar.
*
* Constructs a widget which is a child of parent.
* Initialize the GUI and sets up the menu, sets window properties, create the
* VNC- and connect-window, connects the necessary signals, sets the UI's
* position and configuires the timer for the UI to be hidden.
* @param parent If parent is 0, the new widget becomes a window. If parent is
* another widget, this widget becomes a child window inside parent. The new
* widget is deleted when its parent is deleted.
*/
Toolbar::Toolbar(QWidget *parent) :
QWidget(parent), _ui(new Ui::Toolbar), _hideTimer(this), _connection(NULL),
_blinkTimer(this),_cam32(":cam32.svg"), _beWatchedEye(":eye")
{
/* Initialize the GUI */
_ui->setupUi(this);
/* Set window properties */
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint | Qt::FramelessWindowHint);
setAttribute(Qt::WA_AlwaysShowToolTips);
setAttribute(Qt::WA_QuitOnClose);
/* Create the VNC Window */
_vnc = new VncWindow(NULL);
/* Create the connect window */
_connectWindow = new ConnectWindow(NULL);
// Connect the signals
connect(_connectWindow, SIGNAL(disconnect()), this, SLOT(onDoDisconnect()));
connect(_connectWindow, SIGNAL(connected(ServerConnection*)), this, SLOT(onConnected(ServerConnection*)));
/* Setup menu */
_menu = new QMenu(this);
_acnDisconnect = new QAction(tr("Set &session ID"), this);
_acnAbout= new QAction(tr("&Was ist das hier?"), this);
_acnQuit = new QAction(tr("&Quit"), this);
_menu->addAction(_acnDisconnect);
_menu->addSeparator();
_menu->addAction(_acnAbout);
_menu->addSeparator();
_menu->addAction(_acnQuit);
_ui->cmdMenu->setMenu(_menu);
// Connect the signals
connect(_menu, SIGNAL(aboutToHide()), this, SLOT(hideBar()));
connect(_acnDisconnect, SIGNAL(triggered()), _connectWindow, SLOT(show()));
connect(_acnAbout, SIGNAL(triggered()), this, SLOT(showAboutDialog()));
connect(_acnQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
/* Connect the signals from vnc server */
connect(VncServer::instance(), SIGNAL(started(int, QString&, QString&)), this, SLOT(onVncServerIsRunning(int)));
/* Set position */
const QDesktopWidget desktop;
const QRect primaryScreen = desktop.screenGeometry();
move(primaryScreen.left() + (primaryScreen.width() - this->width())/2 , primaryScreen.top());
qDebug() << primaryScreen.left() << primaryScreen.top() << primaryScreen.right() << primaryScreen.bottom();
/* Setup hide timer */
_hideTimer.setInterval(500);
_hideTimer.setSingleShot(true);
connect(&_hideTimer, SIGNAL(timeout()), this, SLOT(hideBar()));
setVisible(true);
_hideTimer.start(); // initially show PVS and hide later
/* Setup blink timer */
_blinkTimer.setInterval(500);
connect(&_blinkTimer, SIGNAL(timeout()), this, SLOT(cameraBlink()));
}
/***************************************************************************//**
* Destructor of the Toolbar. Destroys the widget. All this widget's children
* are deleted first.
*/
Toolbar::~Toolbar()
{
VncServer::instance()->stop();
_vnc->deleteLater();
_connectWindow->deleteLater();
delete _ui;
}
/*
* Override
*/
/***************************************************************************//**
* This event is reimplemented to receive widget leave events. When the mouse
* cursor leaves the widget, a timer gets started which, when timed out, hides
* the Toolbar.
* @param e The leave event (Mouse leaves widget's boundaries.)
*/
void Toolbar::leaveEvent(QEvent* e)
{
_hideTimer.start();
QWidget::leaveEvent(e);
}
/***************************************************************************//**
* This event is reimplemented to receive widget enter events. When the mouse
* cursor enters the widget, the timer which, when timed out, hides
* the Toolbar, gets stopped.
* @param e The enter event (Mouse enters widget's boundaries.)
*/
void Toolbar::enterEvent(QEvent* e)
{
_hideTimer.stop();
showBar();
QWidget::enterEvent(e);
}
QString Toolbar::identifyMgrIP()
{
SYSTEM_SETTINGS(conf);
if (!conf.contains("rooms")) {
qDebug() << "Invalid config file!";
return NULL;
}
QStringList rooms = conf.value("rooms").toStringList();
// qDebug() << rooms;
for (auto i : rooms)
{
qDebug() << "i: " << i;
conf.beginGroup(i);
if (!conf.contains("mgrIP")) {
qDebug() << "Invalid config file!";
return NULL;
}
// Find the managerIP of current room.
QString mgrIP = conf.value("mgrIP").toString();
foreach (const QHostAddress &address, QNetworkInterface::allAddresses())
{
int size = conf.beginReadArray("client");
for (int j = 0; j < size; ++j) {
conf.setArrayIndex(j);
/*
*
* CFG to test this
* http://git.openslx.org/tm-scripts.git/plain/server/modules/pvs2-freiburg/etc/xdg/openslx/pvs2client.ini
*
*/
QString ip = conf.value("ip").toString();
if (address != QHostAddress(QHostAddress::LocalHost) && ip == address.toString())
{
qDebug("Found this ip in config.");
return mgrIP;
}
}
conf.endArray();
}
conf.endGroup();
}
return NULL;
}
/*
* Slots
*/
/***************************************************************************//**
* A slot for changing the camera icon. This slot should be called permanently
* if the vnc server is recording the screen.
*/
void Toolbar::cameraBlink()
{
static bool showEye = false;
if (!showEye)
{
_ui->icon_cam->setPixmap(_beWatchedEye);
showEye = true;
}
else
{
_ui->icon_cam->setPixmap(QPixmap()); // set empty pixmap for blinking effect
showEye = false;
}
}
/***************************************************************************//**
* A slot for the VncServerIsRunning signal. This slot will change the UI
* according to the state fo the VncServer.
* @param[in] port Indicates the state of the VncServer.
*/
void Toolbar::onVncServerIsRunning(int port)
{
if (port > 0) {
_blinkTimer.start();
_ui->lblStatus->setStyleSheet("color:red");
_ui->lblStatus->setText(tr("Streaming"));
showBar();
} else {
_blinkTimer.stop();
_ui->icon_cam->setPixmap(_cam32);
_ui->lblStatus->setStyleSheet("color:green");
_ui->lblStatus->setText(tr("Online"));
hideBar();
}
}
/***************************************************************************//**
* A slot for the onDisconnected signal of the ConnectWindow. This slot will
* change the UI according to the state fo the connection.
*/
void Toolbar::onDisconnected()
{
if (_connection != NULL)
_connection->blockSignals(true);
_connection = NULL;
_ui->lblStatus->setStyleSheet("color:red");
_ui->lblStatus->setText(tr("Offline"));
}
/***************************************************************************//**
* A slot for the onConnected signal of the ConnectWindow. This slot will
* change the UI according to the state of the connection and connect the
* relevant signals and slots.
* @param connection Pointer to the ServerConnection
*/
void Toolbar::onConnected(ServerConnection* connection)
{
_ui->lblStatus->setStyleSheet("color:green");
_ui->lblStatus->setText(tr("Online"));
//
if (_connection != NULL)
{
disconnect(_connection, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
_connection->blockSignals(true);
_connection->disconnectFromServer();
}
_connection = connection;
connect(_connection, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
connect(_connection, SIGNAL(openVnc(const QString&, int, const QString&, bool, bool, const QString&, const int)),
_vnc, SLOT(open(const QString&, int, const QString&, bool, bool, const QString&, const int)));
connect(_connection, SIGNAL(closeVnc()), _vnc, SLOT(close()));
connect(_vnc, SIGNAL(running(const bool, const int)), _connection, SLOT(onVncViewerStartStop(const bool, const int)));
}
/***************************************************************************//**
*
*/
void Toolbar::onDoDisconnect()
{
if (_connection != NULL)
_connection->disconnectFromServer();
}
/***************************************************************************//**
* This slot hides the toolbar. Places the toolbar hidden behind the edge of the
* screen just showing 2 pixels.
*/
void Toolbar::hideBar()
{
// Don't hide window if any menu is open or VNC Server is running from this client.
if (_menu->isVisible() || VncServer::instance()->isVncServerRunning())
return;
const QDesktopWidget desktop;
const QRect primaryScreen = desktop.screenGeometry();
move(x(), primaryScreen.top() + 2 - height());
}
/***************************************************************************//**
* @brief Toolbar::showAboutDialog
*/
void Toolbar::showAboutDialog()
{
QMessageBox msgBox(
QMessageBox::NoIcon,
tr("Über PVS Client"),
tr("Der PVS Client ist Teil eines Softwaresystems zur Verwaltung "\
"des visuellen Datenverkehrs innerhalb der Poolräume zwischen "\
"Dozenten und Studenten-PCs und wurde zur Vereinfachung des "\
"Informationsflusses in Seminaren und allgemeinem eLearning "\
"entwickelt."),
QMessageBox::NoButton,
this,
Qt::Dialog|Qt::MSWindowsFixedSizeDialogHint|Qt::WindowStaysOnTopHint);
msgBox.setIconPixmap(QIcon(":cam32.svg").pixmap(64,64));
msgBox.exec();
}
/***************************************************************************//**
* This slot shows the toolbar. Used after a hideBar().
*/
void Toolbar::showBar()
{
const QDesktopWidget desktop;
const QRect primaryScreen = desktop.screenGeometry();
move(x(), primaryScreen.top());
}