-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMainwindow.cpp
More file actions
291 lines (250 loc) · 12.3 KB
/
Mainwindow.cpp
File metadata and controls
291 lines (250 loc) · 12.3 KB
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
// -------------------------------------------------------------------------------------------- //
// ----- Fichier : MainWindow.cpp ----- //
// ----- Type : source ----- //
// ----- Auteur : Jérémy ----- //
// ----- Description : Permet de crée une fenêtre graphique ----- //
// -------------------------------------------------------------------------------------------- //
#include "Mainwindow.hpp"
// Constructeur
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
this->setWindowTitle("Savanna Simulator"); // Nom de la fenêtre
// Création du widget et du layout
widget_general = new QWidget;
QVBoxLayout *qbl_general = new QVBoxLayout;
// Initialisation du widget et du layout
widget_general->setLayout(qbl_general);
this->setCentralWidget(widget_general);
// Fenêtre de statistiques
statistiquesWindow = new Statistiques;
// Création de la scène de simulation
simulation = new Simulation(statistiquesWindow, this);
simulation->setBackgroundBrush(QColor(47, 139, 14));
myview = new QGraphicsView(simulation, this);
// Ajout des contrôles et de la simulation au layout
qbl_general->addWidget(BuildGroupBoxControle());
qbl_general->addWidget(myview);
}
// Création du groupe box de contrôle
QGroupBox *MainWindow::BuildGroupBoxControle() {
// Groupe Box contenant tous les contôles
// VOIR SCHEMA DETAILLE
group_box = new QGroupBox(tr("Contrôle"));
// Layout Box orienté de gauche à droite
// Contient tous les layouts
box_layout = new QBoxLayout(QBoxLayout::LeftToRight);
// Layout contenant : simulation, stats, plein écran et quitter
QBoxLayout *box_layout_controle = new QBoxLayout(QBoxLayout::LeftToRight);
// Layout contenant : box_layout_controle + le label de signature
QBoxLayout *box_layout_controle_signature = new QBoxLayout(QBoxLayout::TopToBottom);
// ------ Layout Box --------------------------------------------------------------- //
// Contient les sliders : nombre d'animaux, proportion lion/gazelle, vitesse.
simu_controle1 = new QVBoxLayout;
// Contient les sliders : energie, taille en X et Y.
simu_controle2 = new QVBoxLayout;
// Contient les boutons : démarrage / arrêt de la simulation et la fenêtre des statistiques.
simu_controle3 = new QVBoxLayout;
// Contient la check box plein écran et le bouton d'arrêt du programme.
box_control = new QVBoxLayout;
// Contient la signature
QHBoxLayout* box_signature = new QHBoxLayout;
// -------------------------------------------------------------------------------------------- //
// ------ Création des sliders : -------------------------------------------------------------- //
// 1) Label du slider
// 2) Création du slider horizontal
// 3) Initialisation des valeurs minimum et maximum du slider
// 4) Initialisation d'une valeur pour le slider
// Slider : nombre d'animaux
nb_animaux_label = new QLabel("Nombres d'animaux initials", this);
nb_animaux_simu = new QSlider(Qt::Horizontal);
nb_animaux_simu->setRange(10, 200);
// Slider : proportion lion / gazelle
proportion_label = new QLabel("Proportion Lions / Gazelles", this);
proportion_simu = new QSlider(Qt::Horizontal);
proportion_simu->setRange(2, 20);
// Slider : vitesse de la simulation
vitesse_label = new QLabel("Vitesse de la simulation", this);
vitesse_simu = new QSlider(Qt::Horizontal);
vitesse_simu->setRange(1, 1000);
// Slider : energie initiale
energie_label = new QLabel("Energie initiale", this);
energie_simu = new QSlider(Qt::Horizontal);
energie_simu->setRange(100, 1000);
// Slider : taille en X du terrain de la simulation
tailleX_label = new QLabel("Taille Horizontale", this);
tailleX_simu = new QSlider(Qt::Horizontal);
tailleX_simu->setRange(100, 1300);
// Slider : taille en Y du terrain de la simulation
tailleY_label = new QLabel("Taille Verticale", this);
tailleY_simu = new QSlider(Qt::Horizontal);
tailleY_simu->setRange(100, 550);
// -------------------------------------------------------------------------------------------- //
// Bouton Simulation : 2 Fonctions
// 1) Démarre la simulation
// 2) Arrête la simulation
simulation_bouton = new QPushButton("Simulation", this);
// Bouton pour afficher ou quitter la fenêtre des statistiques
statistiques = new QPushButton("Statistiques", this);
// Bouton pour choisir un fichier de config
config = new QPushButton("Configuration", this);
// Check Box pour activer / désactiver le plein écran
plein_ecran = new QCheckBox("Plein Ecran", this);
// Bouton pour quitter le programme
quitter = new QPushButton("Quitter", this);
// Label de signature
signature = new QLabel("</> Jeremy </>", this);
// ------ Ajout de tous les widgets (label, slider, bouton) à leurs layouts respectifs -------- //
simu_controle1->addWidget(nb_animaux_label);
simu_controle1->addWidget(nb_animaux_simu);
simu_controle1->addWidget(proportion_label);
simu_controle1->addWidget(proportion_simu);
simu_controle1->addWidget(vitesse_label);
simu_controle1->addWidget(vitesse_simu);
simu_controle2->addWidget(energie_label);
simu_controle2->addWidget(energie_simu);
simu_controle2->addWidget(tailleX_label);
simu_controle2->addWidget(tailleX_simu);
simu_controle2->addWidget(tailleY_label);
simu_controle2->addWidget(tailleY_simu);
simu_controle3->addWidget(simulation_bouton);
simu_controle3->addWidget(statistiques);
simu_controle3->addWidget(config);
box_control->addWidget(plein_ecran);
box_control->addWidget(quitter);
box_signature->addWidget(signature);
box_signature->setAlignment(signature, Qt::AlignHCenter);
// -------------------------------------------------------------------------------------------- //
// Ajout de layouts
box_layout_controle->addLayout(simu_controle3);
box_layout_controle->addLayout(box_control);
box_layout_controle_signature->addLayout(box_layout_controle);
box_layout_controle_signature->addLayout(box_signature);
// ------ Ajout des 4 layouts au Layout principal
box_layout->addLayout(simu_controle1);
box_layout->addLayout(simu_controle2);
box_layout->addLayout(box_layout_controle_signature);
// -------------------------------------------------------------------------------------------- //
// Enfin : Ajout du layout principal à la groupe box
group_box->setLayout(box_layout);
// -------------------------------------------------------------------------------------------- //
// ------ Connexion de tous les contrôles ----------------------------------------------------- //
// -------------------------------------------------------------------------------------------- //
// 1) nombres d'animaux
connect(nb_animaux_simu, SIGNAL(valueChanged(int)), simulation, SLOT(slot_nb_animaux(int)));
// 2) proportion lion / gazelle
connect(proportion_simu, SIGNAL(valueChanged(int)), simulation, SLOT(slot_setProportion(int)));
// 3) vitesse de la simulation
connect(vitesse_simu, SIGNAL(valueChanged(int)), simulation, SLOT(slot_vitesse(int)));
// 4) energie initiale
connect(energie_simu, SIGNAL(valueChanged(int)), simulation, SLOT(slot_setEnergie(int)));
// 5) taille en X
connect(tailleX_simu, SIGNAL(valueChanged(int)), simulation, SLOT(slot_setTailleX(int)));
// 6) taille en Y
connect(tailleY_simu, SIGNAL(valueChanged(int)), simulation, SLOT(slot_setTailleY(int)));
// 7) démarre / arrête la simulation
connect(simulation_bouton, SIGNAL(clicked()), simulation, SLOT(slot_simulation()));
// 8) affiche / quitte la fenêtre de statistiques
connect(statistiques, SIGNAL(clicked()), this, SLOT(slot_statistiques()));
// 9) Permet de choisir un fichier de Configuration
connect(config, SIGNAL(clicked()), this, SLOT(slot_configuration()));
// 10) type d'affichage de la fenêtre principale
connect(plein_ecran, SIGNAL(clicked()), this, SLOT(slot_pleinecran()));
// 11) quitte le programme
connect(quitter, SIGNAL(clicked()), qApp, SLOT(quit()));
// -------------------------------------------------------------------------------------------- //
// -------------------------------------------------------------------------------------------- //
// -------------------------------------------------------------------------------------------- //
// On donne un valeur à chaque slider
// Astuce : les slots liés aux sliders vont se déclencher
// Tous les données vont donc s'afficher dans la console
nb_animaux_simu->setValue(50);
proportion_simu->setValue(2);
vitesse_simu->setValue(980);
energie_simu->setValue(200);
tailleX_simu->setValue(500);
tailleY_simu->setValue(300);
// -------------------------------------------------------------------------------------------- //
// On retourne la groupe box pour l'afficher dans le widget principal du programme
return group_box;
}
// ---------------------------------------------------------------------------------------------- //
// ------ SLOT : Change le mode de la fenêtre principale ---------------------------------------- //
// ------ Plein écran / fenêtré ----------------------------------------------------------------- //
// ---------------------------------------------------------------------------------------------- //
void MainWindow::slot_pleinecran() {
if(plein_ecran->isChecked()) qDebug() << "[INFO] : Plein écran activé !";
else qDebug() << "[INFO] : Plein écran désactivé !";
// Change l'état de la fenêtre
this->setWindowState(this->windowState() ^ Qt::WindowFullScreen);
}
// ---------------------------------------------------------------------------------------------- //
// ------ SLOT : Ouvre ou ferme la fenêtre de statistiques -------------------------------------- //
// ---------------------------------------------------------------------------------------------- //
void MainWindow::slot_statistiques() {
if (statistiquesWindow->isVisible()) {
statistiquesWindow->hide();
qDebug() << "[INFO] : Fermeture de la fenêtre de statistiques !";
} else {
statistiquesWindow->show();
qDebug() << "[INFO] : Ouverture de la fenêtre de statistiques !";
}
}
// ---------------------------------------------------------------------------------------------- //
// ------ SLOT : Ouvre une petite fenêtre qui demande le fichier de config ---------------------- //
// ---------------------------------------------------------------------------------------------- //
void MainWindow::slot_configuration() {
// Variables utilisées
QString file, texte;
int compteur = 0;
// Ouverture d'une petite fenêtre qui demande le nom du fichier
file = QInputDialog::getText(NULL,"Fichier","Choississez un fichier de configuration !");
// On crée un QFile avec le nom du fichier et on lui ajout ".conf"
QFile fichier(file + ".conf");
// Si on réussi à ouvrir le fichier en lecture seulement
if(fichier.open(QIODevice::ReadOnly | QIODevice::Text)) {
// Création d'un flux permet de parcourir le fichier
QTextStream flux(&fichier);
// Pour chaque ligne (21 nombres de ligne dans les fichiers de configuration)
for (int i = 0; i < 21; i++) {
// On lit la ligne
texte = flux.readLine();
// Si la ligne commence par un #
// On ne fait rien c'est un commentaire
if (!texte.startsWith("#")) {
// Récuperation de la valeur
// On la convertie en entier
bool ok;
int value = texte.toInt(&ok, 10);
// On appel la fonction qui met à jour les sliders
setValueSlider(value, compteur);
// Ce compteur permet de savoir quel valeur on modifie
compteur++;
}
}
}
// On ferme le fichier
fichier.close();
}
// Fonction qui met à jour les sliders en fonction d'un fichier .conf
void MainWindow::setValueSlider(int value, int i) {
// Argument la valeur à modifer et l'ordre du slider
switch (i) {
case 0:
nb_animaux_simu->setValue(value);
break;
case 1:
proportion_simu->setValue(value);
break;
case 2:
vitesse_simu->setValue(value);
break;
case 3:
energie_simu->setValue(value);
break;
case 4:
tailleX_simu->setValue(value);
break;
case 5:
tailleY_simu->setValue(value);
break;
}
}