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






                          




                                    


                       
                                                                                


















                                                                                






                                                                              
                                   
                                                                                   
                                                                     
 
                                

                           
                                   



                                                                                                            
 
                                   
                                   

                                       
                                                 
 


                                                                                                                  
 
                        
                                
                                                                  
                                                  


                                         
                                     



                                                                                   
 
                                                 
                                                                                                                        
 
                          





                                                                                                                   
                                    


                                                                       



                                                                            

 




                                                                                




                                      
                   

 
  

           






                                                                                

                                   
                           


                               






                                                                                

                                   

                          


                               
  


        
                                                                                


                                                                              

                           

                                    
         

                                                        


            

                                                                                            
         

 
                                                                                




                                                                         
 
                       
                                    
                                                           
                                                         

                          
                                   
                                                 



                                                             

 



                                                                                
                              
 
                                
                                                
                           

                                                   

 





                                                                                

                                                       

                                                     


                                
                                                                                              



                                                    
                                                                                   



                                                                                                                              

 


                                                                                





                                                    



                                                                                
                       
 
                                                                                           




                                                                              

 


                                                                                




                                                             
 
/*
 * toolbar.cpp
 *
 *  Created on: 21.01.2013
 *      Author: sr
 */

#include "../../shared/settings.h"
#include "../net/serverconnection.h"
#include "../vnc/vncwindow.h"
#include "../vnc/vncserver.h"

#include "toolbar.h"
#include "ui_toolbar.h"

/***************************************************************************//**
 * @brief Constructor of the Toolbar.
 *
 * 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)
{
	_connectWindow->connectToSession(sessionName);
}

/***************************************************************************//**
 * @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);
	setVisible(true);

	/* 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);
	_acnQuit = new QAction(tr("&Quit"), this);
	_menu->addAction(_acnDisconnect);
	_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(_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()));
	_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);
}

/*
 * 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());
}

/***************************************************************************//**
 * This slot shows the toolbar. Used after a hideBar().
 */
void Toolbar::showBar()
{
	const QDesktopWidget desktop;
	const QRect primaryScreen = desktop.screenGeometry();
	move(x(), primaryScreen.top());
}