/*
* toolbar.cpp
*
* Created on: 21.01.2013
* Author: sr
*/
#include "toolbar.h"
#include "../../shared/settings.h"
#include "../net/serverconnection.h"
#include "../vnc/vncwindow.h"
#include "../vnc/vncserver.h"
Toolbar::Toolbar(QWidget *parent) :
QWidget(parent), _location(POSITION_TOP_CENTER), _hideTimer(0), _connection(NULL)
{
setupUi(this);
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint | Qt::FramelessWindowHint);
setAttribute(Qt::WA_AlwaysShowToolTips);
setAttribute(Qt::WA_QuitOnClose);
setVisible(true);
// VNC Window
_vnc = new VncWindow(NULL);
// Connect window
_connectWindow = new ConnectWindow(NULL);
connect(_connectWindow, SIGNAL(disconnect()), this, SLOT(onDoDisconnect()));
connect(_connectWindow, SIGNAL(connected(ServerConnection*)), this, SLOT(onConnected(ServerConnection*)));
//
setupMenu();
setLocation();
hideBar();
}
void Toolbar::setupMenu()
{
_menu = new QMenu(this);
// setup actions
_acnDisconnect = new QAction(tr("&Connect"), this);
//_acnDisconnect->setEnabled(false);
_acnQuit = new QAction(tr("&Quit"), this);
// setup menu
_menu->addAction(_acnDisconnect);
_menu->addSeparator();
_menu->addAction(_acnQuit);
cmdMenu->setMenu(_menu);
connect(_acnQuit, SIGNAL(triggered()), this, SLOT(onQuit()));
connect(_acnDisconnect, SIGNAL(triggered()), _connectWindow, SLOT(show()));
}
Toolbar::~Toolbar()
{
VncServer::instance()->stop();
_vnc->deleteLater();
_connectWindow->deleteLater();
}
//###########\\/\/
void Toolbar::setLocation()
{
const QDesktopWidget desktop;
const QRect primaryScreen = desktop.screenGeometry();
switch (_location)
{
case POSITION_TOP_LEFT:
move(primaryScreen.left(), primaryScreen.top());
break;
case POSITION_TOP_CENTER:
move((primaryScreen.width() - this->width()) / 2 + primaryScreen.left(), primaryScreen.top());
break;
case POSITION_TOP_RIGHT:
move(primaryScreen.right() - width(), primaryScreen.top());
break;
case POSITION_BOTTOM_LEFT:
move(primaryScreen.left(), primaryScreen.bottom() - height());
break;
case POSITION_BOTTOM_CENTER:
move((primaryScreen.width() - this->width()) / 2 + primaryScreen.left(), primaryScreen.bottom() - height());
break;
case POSITION_BOTTOM_RIGHT:
move(primaryScreen.right() - width(), primaryScreen.bottom() - height());
break;
default:
break;
}
}
void Toolbar::setBarVisible(bool shown)
{
const QDesktopWidget desktop;
const QRect primaryScreen = desktop.screenGeometry();
if (!shown)
{
if (_location <= POSITION_TOP_RIGHT)
move(x(), primaryScreen.top() + 2 - height());
else
move(x(), primaryScreen.bottom() - 2);
}
else
{
if (_location <= POSITION_TOP_RIGHT)
move(x(), primaryScreen.top());
else
move(x(), primaryScreen.bottom() - height());
}
}
bool Toolbar::hideBar()
{
if (_menu->isVisible()) // Don't hide window if any menu is open
return false;
setBarVisible(false);
return true;
}
/*
* Override
*/
void Toolbar::leaveEvent(QEvent* e)
{
if (_hideTimer == 0)
_hideTimer = startTimer(100);
_hideDelay = 6;
QWidget::leaveEvent(e);
}
void Toolbar::enterEvent(QEvent* e)
{
if (_hideTimer != 0)
{
killTimer(_hideTimer);
_hideTimer = 0;
}
setBarVisible(true);
QWidget::enterEvent(e);
}
void Toolbar::timerEvent(QTimerEvent* event)
{
if (event->timerId() == _hideTimer)
{
if (--_hideDelay <= 0)
{
if (hideBar())
{
killTimer(_hideTimer);
_hideTimer = 0;
}
}
}
}
/*
* Slots
*/
void Toolbar::onDisconnected()
{
_connectWindow->setConnected(false);
if (_connection != NULL)
_connection->blockSignals(true);
_connection = NULL;
lblStatus->setStyleSheet("color:red");
lblStatus->setText(tr("Offline"));
}
void Toolbar::onConnected(ServerConnection* connection)
{
lblStatus->setStyleSheet("color:green");
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)));
_connectWindow->setConnected(true);
}
void Toolbar::onDoDisconnect()
{
if (_connection != NULL)
_connection->disconnectFromServer();
}
void Toolbar::onQuit()
{
QApplication::exit(0);
}