summaryrefslogtreecommitdiffstats
path: root/src/server/mainwindow/mainwindow.h
blob: 4e9974796918b30bafb6ad10ebb62a6206cb2676 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#ifndef _MAINWINDOW_H_
#define _MAINWINDOW_H_

#include <QtWidgets>
#include <QMainWindow>
#include "../net/client.h"

class SessionNameWindow;
class ConnectionFrame;
class ListenServer;
class DiscoveryListener;
class HelpWindow;
class ReloadRoomWindow;

namespace Ui
{
class MainWindow;
}

/**
 * Initializing MainWindow.
 * Handle ButtonEvents and initialize ListenServer.
 */
class MainWindow : public QMainWindow
{
	Q_OBJECT

public:

	MainWindow(QWidget *parent = 0);
	~MainWindow();

	QRect calcFrameGeometry(ConnectionFrame* frame) const;

private:

	// Ui stuff
	Ui::MainWindow    *ui;
	SessionNameWindow *_sessionNameWindow;
	HelpWindow        *_helpWindow;
	ReloadRoomWindow	*_reloadWindow;
	QLabel            *_sessionNameLabel;
	int               _tbIconSize;
	Qt::ToolBarArea   _tbArea;
	int  _tilesX;
	int  _tilesY;
	QImage* _backgroundImage = NULL;
	QLabel* _examModeLabel = NULL;


	/* virtual columns to preserve the aspect ratio of the loaded room */
	int _virtCols;
	int _virtRows;

	// Button block stuff
	QTimer              *_buttonLockTimer;
	QList<QAction*>     _lockingButtons;
	static const qint64 _buttonBlockTime = 2000;

	/* Context-sensitive Buttons */
	QList<QAction*> _contextButtons;

	// Management stuff
	enum class Mode
	{
	    Broadcast,
	    Multicast,
	    Unicast,
	    LockedUnicast,
	    None
	} _mode;
	int _streamingSource;

	QList<ConnectionFrame*> _clientFrames;
	ListenServer            *_listenServer;
	DiscoveryListener       *_discoveryListener;

	int _lastClientCount;

	QPoint closestFreeSlot(QPoint preferredPixels, ConnectionFrame* toIgnore);
	void placeFrameInFreeSlot(ConnectionFrame* frame, QPoint preferred = QPoint(-1, -1));
	ConnectionFrame* createFrame(const QString &computerId = QString(), const QPoint *gridPosition = NULL, bool fromRoomplan = false);
	void savePosition(ConnectionFrame *cf);
	void startVncServerIfNecessary(int from);
	void tellClientCurrentSituation(Client* client);
	void reset(bool lock = false);
	Client* getClientFromId(int id);
	ConnectionFrame* getTutorFrame();
	ConnectionFrame* getSelectedFrame();

	void closeEvent(QCloseEvent *e);
	void changeEvent(QEvent *e);
	void resizeEvent(QResizeEvent *e);
	void mouseReleaseEvent(QMouseEvent* e);

	int getTileWidthPx() const;
	int getTileHeightPx() const;

	void lockContextButtons();
	void unlockContextButtons();

	void reloadCurrentRoom();

protected slots:
	void disableButtons();
	void enableButtons();
	void clientCountChanged();

	void onSessionNameClick();
	void onSessionNameUpdate();

	void onDeleteClient();

	void onButtonLock(bool checked);
	void onButtonLockSingle();
	void onButtonStudentToTutor();
	void onButtonStudentToTutorExclusive();
	void onButtonTutorToAll();
	void onButtonTutorToStudent();
	void onButtonStopProjection();

	void onButtonSetAsTutor();
	void onButtonReloadRoomConfig();
	void onReloadRoomOk();
	void onReloadRoomCancel();

	void onButtonExit();
	void onButtonHelp();
	// connection frame
	void onPlaceFrame(ConnectionFrame* frame);
	void onFrameClicked(ConnectionFrame* frame);
	// Net
	void onClientConnected(Client* client);
	void onClientAuthenticating(Client* client, ClientLogin* request);
	void onClientAuthenticated(Client* client);
	void onVncServerStateChange(Client* client);
	void onVncClientStateChange(Client* client);

};
#endif