diff --git a/ico/window_new.png b/ico/window_new.png
new file mode 100755
index 000000000..4d0a40a0b
Binary files /dev/null and b/ico/window_new.png differ
diff --git a/main.cpp b/main.cpp
index c309b0a1a..a87977b0e 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,17 +1,10 @@
#include "qetapp.h"
-#include "qetdiagrameditor.h"
/**
Fonction principale du programme QElectroTech
@param argc nombre de parametres
@param argv parametres
*/
int main(int argc, char **argv) {
- // Creation de l'application
- QETApp app(argc, argv);
-
- // Creation et affichage d'un editeur de schema
- (new QETDiagramEditor()) -> show();
-
- // Execution de l'application
- return(app.exec());
+ // Creation et execution de l'application
+ return(QETApp(argc, argv).exec());
}
diff --git a/qelectrotech.qrc b/qelectrotech.qrc
index 67b1ed701..b995d0b5a 100644
--- a/qelectrotech.qrc
+++ b/qelectrotech.qrc
@@ -58,5 +58,6 @@
ico/viewmag.png
ico/viewmag+.png
ico/west.png
+ ico/window_new.png
diff --git a/qetapp.cpp b/qetapp.cpp
index 3142a1b68..1a1a225fa 100644
--- a/qetapp.cpp
+++ b/qetapp.cpp
@@ -1,43 +1,66 @@
#include "qetapp.h"
#include "qetdiagrameditor.h"
#include "qetelementeditor.h"
+
/**
Constructeur
@param argc Nombre d'arguments passes a l'application
@param argv Arguments passes a l'application
*/
QETApp::QETApp(int &argc, char **argv) : QApplication(argc, argv) {
- // QET se loge dans le systray et ne doit donc pas quitter des que toutes
- // les fenetres sont cachees
- //setQuitOnLastWindowClosed(false);
-
// selectionne le langage du systeme
QString system_language = QLocale::system().name().left(2);
setLanguage(system_language);
+ // nettoyage avant de quitter l'application
+ connect(this, SIGNAL(aboutToQuit()), this, SLOT(cleanup()));
+
// systray de l'application
- quitter_qet = new QAction(QIcon(":/ico/exit.png"), tr("&Quitter"), this);
- reduce_appli = new QAction(QIcon(":/ico/masquer.png"), tr("&Masquer"), this);
- restore_appli = new QAction(QIcon(":/ico/restaurer.png"), tr("&Restaurer"), this);
- quitter_qet -> setStatusTip(tr("Ferme l'application QElectroTech"));
- reduce_appli -> setToolTip(tr("Reduire QElectroTech dans le systray"));
- restore_appli -> setToolTip(tr("Restaurer QElectroTech"));
- connect(quitter_qet, SIGNAL(triggered()), this, SLOT(closeEveryEditor()));
- connect(reduce_appli, SIGNAL(triggered()), this, SLOT(systrayReduce()));
- connect(restore_appli, SIGNAL(triggered()), this, SLOT(systrayRestore()));
if (QSystemTrayIcon::isSystemTrayAvailable()) {
+ // initialisation des menus de l'icone dans le systray
+ menu_systray = new QMenu(tr("QElectroTech"));
+
+ quitter_qet = new QAction(QIcon(":/ico/exit.png"), tr("&Quitter"), this);
+ reduce_appli = new QAction(QIcon(":/ico/masquer.png"), tr("&Masquer"), this);
+ restore_appli = new QAction(QIcon(":/ico/restaurer.png"), tr("&Restaurer"), this);
+ reduce_diagrams = new QAction(QIcon(":/ico/masquer.png"), tr("&Masquer tous les \351diteurs de sch\351ma"), this);
+ restore_diagrams = new QAction(QIcon(":/ico/restaurer.png"), tr("&Restaurer tous les \351diteurs de sch\351ma"), this);
+ reduce_elements = new QAction(QIcon(":/ico/masquer.png"), tr("&Masquer tous les \351diteurs d'\351l\351ment"), this);
+ restore_elements = new QAction(QIcon(":/ico/restaurer.png"), tr("&Restaurer tous les \351diteurs d'\351l\351ment"), this);
+ new_diagram = new QAction(QIcon(":/ico/window_new.png"), tr("&Nouvel \351diteur de sch\351ma"), this);
+ new_element = new QAction(QIcon(":/ico/window_new.png"), tr("&Nouvel \351diteur d'\351l\351ment"), this);
+
+ quitter_qet -> setStatusTip(tr("Ferme l'application QElectroTech"));
+ reduce_appli -> setToolTip(tr("R\351duire QElectroTech dans le systray"));
+ restore_appli -> setToolTip(tr("Restaurer QElectroTech"));
+
+ connect(quitter_qet, SIGNAL(triggered()), this, SLOT(closeEveryEditor()));
+ connect(reduce_appli, SIGNAL(triggered()), this, SLOT(reduceEveryEditor()));
+ connect(restore_appli, SIGNAL(triggered()), this, SLOT(restoreEveryEditor()));
+ connect(reduce_diagrams, SIGNAL(triggered()), this, SLOT(reduceDiagramEditors()));
+ connect(restore_diagrams, SIGNAL(triggered()), this, SLOT(restoreDiagramEditors()));
+ connect(reduce_elements, SIGNAL(triggered()), this, SLOT(reduceElementEditors()));
+ connect(restore_elements, SIGNAL(triggered()), this, SLOT(restoreElementEditors()));
+ connect(new_diagram, SIGNAL(triggered()), this, SLOT(newDiagramEditor()));
+ connect(new_element, SIGNAL(triggered()), this, SLOT(newElementEditor()));
+
+ // connexion pour le signalmapper
+ connect(&signal_map, SIGNAL(mapped(QWidget *)), this, SLOT(invertMainWindowVisibility(QWidget *)));
+
+ // initialisation de l'icone du systray
qsti = new QSystemTrayIcon(QIcon(":/ico/qet.png"), this);
qsti -> setToolTip(tr("QElectroTech"));
connect(qsti, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(systray(QSystemTrayIcon::ActivationReason)));
- connect(this, SIGNAL(aboutToQuit()), this, SLOT(cleanup()));
- menu_systray = new QMenu(tr("QElectroTech"));
- menu_systray -> addAction(reduce_appli);
- menu_systray -> addAction(quitter_qet);
qsti -> setContextMenu(menu_systray);
qsti -> show();
- every_editor_reduced = false;
}
+ // Creation et affichage d'un editeur de schema
+ QStringList files;
+ foreach(QString argument, arguments()) {
+ if (QFileInfo(argument).exists()) files << argument;
+ }
+ new QETDiagramEditor(files);
}
/// Destructeur
@@ -74,12 +97,14 @@ void QETApp::systray(QSystemTrayIcon::ActivationReason reason) {
switch(reason) {
case QSystemTrayIcon::Context:
// affichage du menu
- (qsti -> contextMenu()) -> show();
+ buildSystemTrayMenu();
+ qsti -> contextMenu() -> show();
break;
case QSystemTrayIcon::DoubleClick:
case QSystemTrayIcon::Trigger:
// reduction ou restauration de l'application
- if (every_editor_reduced) systrayRestore(); else systrayReduce();
+ fetchWindowStats(diagramEditors(), elementEditors());
+ if (every_editor_reduced) restoreEveryEditor(); else reduceEveryEditor();
break;
case QSystemTrayIcon::Unknown:
default: // ne rien faire
@@ -87,30 +112,50 @@ void QETApp::systray(QSystemTrayIcon::ActivationReason reason) {
}
}
-/**
- Reduit toutes les fenetres de l'application dans le systray
-*/
-void QETApp::systrayReduce() {
- foreach(QETDiagramEditor *e, diagramEditors()) setMainWindowVisible(e, false);
- foreach(QETElementEditor *e, elementEditors()) setMainWindowVisible(e, false);
- // on ajoute le menu "Restaurer" et on enleve le menu "Masquer"
- menu_systray -> insertAction(reduce_appli, restore_appli);
- menu_systray -> removeAction(reduce_appli);
+/// Reduit toutes les fenetres de l'application dans le systray
+void QETApp::reduceEveryEditor() {
+ reduceDiagramEditors();
+ reduceElementEditors();
every_editor_reduced = true;
}
-/**
- Restaure toutes les fenetres de l'application dans le systray
-*/
-void QETApp::systrayRestore() {
- foreach(QETDiagramEditor *e, diagramEditors()) setMainWindowVisible(e, true);
- foreach(QETElementEditor *e, elementEditors()) setMainWindowVisible(e, true);
- // on ajoute le menu "Masquer" et on enleve le menu "Restaurer"
- menu_systray -> insertAction(restore_appli, reduce_appli);
- menu_systray -> removeAction(restore_appli);
+/// Restaure toutes les fenetres de l'application dans le systray
+void QETApp::restoreEveryEditor() {
+ restoreDiagramEditors();
+ restoreElementEditors();
every_editor_reduced = false;
}
+/// Reduit tous les editeurs de schemas dans le systray
+void QETApp::reduceDiagramEditors() {
+ foreach(QETDiagramEditor *e, diagramEditors()) setMainWindowVisible(e, false);
+}
+
+/// Restaure tous les editeurs de schemas dans le systray
+void QETApp::restoreDiagramEditors() {
+ foreach(QETDiagramEditor *e, diagramEditors()) setMainWindowVisible(e, true);
+}
+
+/// Reduit tous les editeurs d'element dans le systray
+void QETApp::reduceElementEditors() {
+ foreach(QETElementEditor *e, elementEditors()) setMainWindowVisible(e, false);
+}
+
+/// Restaure tous les editeurs d'element dans le systray
+void QETApp::restoreElementEditors() {
+ foreach(QETElementEditor *e, elementEditors()) setMainWindowVisible(e, true);
+}
+
+/// lance un nouvel editeur de schemas
+void QETApp::newDiagramEditor() {
+ new QETDiagramEditor();
+}
+
+/// lance un nouvel editeur d'element
+void QETApp::newElementEditor() {
+ new QETElementEditor();
+}
+
/**
Renvoie le dossier des elements communs, c-a-d le chemin du dossier dans
lequel QET doit chercher les definitions XML des elements de la collection QET.
@@ -196,7 +241,7 @@ QString QETApp::languagesPath() {
*/
void QETApp::closeEveryEditor() {
// s'assure que toutes les fenetres soient visibles avant de quitter
- systrayRestore();
+ restoreEveryEditor();
foreach(QETDiagramEditor *e, diagramEditors()) e -> close();
foreach(QETElementEditor *e, elementEditors()) e -> close();
}
@@ -249,11 +294,22 @@ void QETApp::setMainWindowVisible(QMainWindow *window, bool visible) {
}
} else {
window -> show();
+#ifndef Q_OS_WIN32
window -> restoreGeometry(window_geometries[window]);
+#endif
window -> restoreState(window_states[window]);
}
}
+/**
+ Affiche une fenetre (editeurs de schemas / editeurs d élements) si
+ celle-ci est cachee ou la cache si elle est affichee.
+ @param window fenetre a afficher / cacher
+*/
+void QETApp::invertMainWindowVisibility(QWidget *window) {
+ if (QMainWindow *w = qobject_cast(window)) setMainWindowVisible(w, !w -> isVisible());
+}
+
/**
@param window fenetre dont il faut trouver les barres d'outils et dock flottants
@return les barres d'outils et dock flottants de la fenetre
@@ -268,3 +324,70 @@ QList QETApp::floatingToolbarsAndDocksForMainWindow(QMainWindow *wind
}
return(widgets);
}
+
+/// construit le menu de l'icone dans le systray
+void QETApp::buildSystemTrayMenu() {
+ menu_systray -> clear();
+
+ // recupere les editeurs
+ QList diagrams = diagramEditors();
+ QList elements = elementEditors();
+ fetchWindowStats(diagrams, elements);
+
+ // ajoute le bouton reduire / restaurer au menu
+ menu_systray -> addAction(every_editor_reduced ? restore_appli : reduce_appli);
+
+ // ajoute les editeurs de schemas dans un sous-menu
+ QMenu *diagrams_submenu = menu_systray -> addMenu(tr("\311diteurs de sch\351mas"));
+ diagrams_submenu -> addAction(reduce_diagrams);
+ diagrams_submenu -> addAction(restore_diagrams);
+ diagrams_submenu -> addAction(new_diagram);
+ reduce_diagrams -> setEnabled(!diagrams.isEmpty() && !every_diagram_reduced);
+ restore_diagrams -> setEnabled(!diagrams.isEmpty() && !every_diagram_visible);
+ diagrams_submenu -> addSeparator();
+ foreach(QETDiagramEditor *diagram, diagrams) {
+ QAction *current_diagram_menu = diagrams_submenu -> addAction(diagram -> windowTitle());
+ current_diagram_menu -> setCheckable(true);
+ current_diagram_menu -> setChecked(diagram -> isVisible());
+ connect(current_diagram_menu, SIGNAL(triggered()), &signal_map, SLOT(map()));
+ signal_map.setMapping(current_diagram_menu, diagram);
+ }
+
+ // ajoute les editeurs d'elements au menu
+ QMenu *elements_submenu = menu_systray -> addMenu(tr("\311diteurs d'\351l\351ment"));
+ elements_submenu -> addAction(reduce_elements);
+ elements_submenu -> addAction(restore_elements);
+ elements_submenu -> addAction(new_element);
+ reduce_elements -> setEnabled(!elements.isEmpty() && !every_element_reduced);
+ restore_elements -> setEnabled(!elements.isEmpty() && !every_element_visible);
+ elements_submenu -> addSeparator();
+ foreach(QETElementEditor *element, elements) {
+ QAction *current_element_menu = elements_submenu -> addAction(element -> windowTitle());
+ current_element_menu -> setCheckable(true);
+ current_element_menu -> setChecked(element -> isVisible());
+ connect(current_element_menu, SIGNAL(triggered()), &signal_map, SLOT(map()));
+ signal_map.setMapping(current_element_menu, element);
+ }
+
+ // ajoute le bouton quitter au menu
+ menu_systray -> addSeparator();
+ menu_systray -> addAction(quitter_qet);
+}
+
+/// Met a jour les booleens concernant l'etat des fenetres
+void QETApp::fetchWindowStats(const QList &diagrams, const QList &elements) {
+ // compte le nombre de schemas visibles
+ int visible_diagrams = 0;
+ foreach(QMainWindow *w, diagrams) if (w -> isVisible()) ++ visible_diagrams;
+ every_diagram_reduced = !visible_diagrams;
+ every_diagram_visible = visible_diagrams == diagrams.count();
+
+ // compte le nombre de schemas visibles
+ int visible_elements = 0;
+ foreach(QMainWindow *w, elements) if (w -> isVisible()) ++ visible_elements;
+ every_element_reduced = !visible_elements;
+ every_element_visible = visible_elements == elements.count();
+
+ // determine si tous les elements sont reduits
+ every_editor_reduced = every_element_reduced && every_diagram_reduced;
+}
diff --git a/qetapp.h b/qetapp.h
index 559d73692..a08e54928 100644
--- a/qetapp.h
+++ b/qetapp.h
@@ -35,25 +35,38 @@ class QETApp : public QApplication {
QTranslator qtTranslator;
QTranslator qetTranslator;
QSystemTrayIcon *qsti;
- /// Elements de menus pour l'icone du systray
QMenu *menu_systray;
- QAction *systray_masquer;
- QAction *config_fullscreen;
- /// Geometrie de la fenetre principale
- QByteArray wg;
+ QAction *quitter_qet;
QAction *reduce_appli;
QAction *restore_appli;
- QAction *menu_systray_masquer_restaurer;
- QAction *quitter_qet;
+ QAction *reduce_diagrams;
+ QAction *restore_diagrams;
+ QAction *reduce_elements;
+ QAction *restore_elements;
+ QAction *new_diagram;
+ QAction *new_element;
QHash window_geometries;
QHash window_states;
bool every_editor_reduced;
+ bool every_diagram_reduced;
+ bool every_diagram_visible;
+ bool every_element_reduced;
+ bool every_element_visible;
+ QSignalMapper signal_map;
public slots:
void systray(QSystemTrayIcon::ActivationReason);
- void systrayReduce();
- void systrayRestore();
+ void reduceEveryEditor();
+ void restoreEveryEditor();
+ void reduceDiagramEditors();
+ void restoreDiagramEditors();
+ void reduceElementEditors();
+ void restoreElementEditors();
+ void newDiagramEditor();
+ void newElementEditor();
void closeEveryEditor();
+ void setMainWindowVisible(QMainWindow *, bool);
+ void invertMainWindowVisibility(QWidget *);
// methodes privees
private slots:
@@ -63,6 +76,7 @@ class QETApp : public QApplication {
QList diagramEditors() const;
QList elementEditors() const;
QList floatingToolbarsAndDocksForMainWindow(QMainWindow *) const;
- void setMainWindowVisible(QMainWindow *, bool);
+ void buildSystemTrayMenu();
+ void fetchWindowStats(const QList &diagrams, const QList &elements);
};
#endif
diff --git a/qetdiagrameditor.cpp b/qetdiagrameditor.cpp
index 1effae680..f0874e15d 100644
--- a/qetdiagrameditor.cpp
+++ b/qetdiagrameditor.cpp
@@ -6,9 +6,10 @@
/**
constructeur
+ @param files Liste de fichiers a ouvrir
@param parent le widget parent de la fenetre principale
*/
-QETDiagramEditor::QETDiagramEditor(QWidget *parent) : QMainWindow(parent) {
+QETDiagramEditor::QETDiagramEditor(const QStringList &files, QWidget *parent) : QMainWindow(parent) {
// cree les dossiers de configuration si necessaire
QDir config_dir(QETApp::configDir());
@@ -23,15 +24,6 @@ QETDiagramEditor::QETDiagramEditor(QWidget *parent) : QMainWindow(parent) {
// mise en place du signalmapper
connect(&windowMapper, SIGNAL(mapped(QWidget *)), &workspace, SLOT(setActiveWindow(QWidget *)));
- // recupere les arguments passes au programme
- QStringList args = QCoreApplication::arguments();
-
- // recupere les chemins de fichiers parmi les arguments
- QStringList files;
- for (int i = 1 ; i < args.size() ; ++ i) {
- if (QFileInfo(args.at(i)).exists()) files << args.at(i);
- }
-
// si des chemins de fichiers valides sont passes en arguments
QList diagram_views;
if (files.size()) {
@@ -84,6 +76,9 @@ QETDiagramEditor::QETDiagramEditor(QWidget *parent) : QMainWindow(parent) {
// connexions signaux / slots pour une interface sensee
connect(&workspace, SIGNAL(windowActivated(QWidget *)), this, SLOT(slot_updateActions()));
connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(slot_updateActions()));
+
+ // affichage
+ show();
}
/**
@@ -346,9 +341,9 @@ void QETDiagramEditor::menus() {
menu_fichier -> addAction(enr_fichier_sous);
menu_fichier -> addAction(fermer_fichier);
menu_fichier -> addSeparator();
- menu_fichier -> addAction(importer);
+ //menu_fichier -> addAction(importer);
menu_fichier -> addAction(exporter);
- menu_fichier -> addSeparator();
+ //menu_fichier -> addSeparator();
menu_fichier -> addAction(imprimer);
menu_fichier -> addSeparator();
menu_fichier -> addAction(quitter_qet);
diff --git a/qetdiagrameditor.h b/qetdiagrameditor.h
index 1c417600a..cd8d469d3 100644
--- a/qetdiagrameditor.h
+++ b/qetdiagrameditor.h
@@ -15,7 +15,7 @@ class QETDiagramEditor : public QMainWindow {
// constructeurs, destructeur
public:
- QETDiagramEditor(QWidget * = 0);
+ QETDiagramEditor(const QStringList & = QStringList(), QWidget * = 0);
virtual ~QETDiagramEditor();
private: