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: