summaryrefslogblamecommitdiffstats
path: root/src/client/toolbar/toolbar.cpp
blob: 00360fdecae25468a3aa5ef0ea0cc1d4adb8e020 (plain) (tree)
1
2
3
4
5
6
7
8





                          
                            
 



                                    
                         
 


                       
 
                                                                                
         








                                                                              
                                                                                     
 
                                                

               
                                                          







                                                                                


                                                                              
   

                                                                                     

                                          
               

                          
                                          
                                                

                                                                    
         





                                                                                






                                                                              






                                                                                     
 

                              
                                

                           
                                   


                                                                                                            
 
                                   
                                   

                                       
                                                 
 


                                                                                                                  
 
                        
                                
                                                                  
                                                          
                                                  

                                         

                                    
                                   
                                     
 

                                                                     
                                                                                     
                                                                               
                                                                   
 
                                                 
                                                                                                                        
 
                          





                                                                                                                   
                                    

                                                                       
                         
                         
                                                                



                                                                            

 




                                                                                




                                      
                   

 
  

           






                                                                                

                                   
                           


                               






                                                                                

                                   

                          


                               


                                


                                                   
                          


                                                               
                             






                                                           
                                  

























                                                                                                                                           
                  

 
  


        
                                                                                


                                                                              

                           

                                    
         

                                                        


            

                                                                                            
         

 
                                                                                




                                                                         
 
                       
                                    
                                                           
                                                         

                          
                                   
                                                    



                                                             

 



                                                                                
                              
 
                                
                                                
                           

                                                   

 





                                                                                

                                                       

                                                     


                                
                                                                                              



                                                    
                                                                                   



                                                                                                                              

 


                                                                                





                                                    



                                                                                
                       
 
                                                                                           




                                                                              

 
                                                                                





                                                    




                                                                                                                 







                                                                                                      

                                                       




                                                             
 
/*
 * 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)
	: QWidget(parent), _hideTimer(this), _blinkTimer(this), _beWatchedEye(":eye")
{
	qDebug() << "sessionName - constructor";
	init();

	_connectWindow->connectToSession(sessionName, "");
}

/***************************************************************************//**
 * @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)
	: QWidget(parent), _hideTimer(this), _blinkTimer(this), _beWatchedEye(":eye")
{
	qDebug() << "auto - constructor!";
	init();

	if (autoConnect) {
		// Try getting manager ip.
		QString mgrIp = identifyMgrIP();
		if (!mgrIp.isEmpty())
			_connectWindow->connectToSession("", mgrIp);
	}
}

/***************************************************************************//**
 * @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), _hideTimer(this), _blinkTimer(this), _beWatchedEye(":eye")
{
	init();
}

void Toolbar::init()
{
	_ui = new Ui::Toolbar;
	_connection = NULL;
	/* 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("&What's this?"), 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(doShow()));
	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);
	activateWindow();
	_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 "";
	}

	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 "";
		}

		// 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 "";
}

/*
 * 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(QPixmap());
		_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("About PVS Client"),
				tr("The PVS - client is part of a software system for managing the "\
					 "virtual data traffic within the computer pools, between the tutor's "\
					 "and student's PCs. It has been developed to simplify the information "\
					 "traffic in seminars and general eLearning."),
				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());
}