diff --git a/sources/qetapp.cpp b/sources/qetapp.cpp index a88785917..bcd65673b 100644 --- a/sources/qetapp.cpp +++ b/sources/qetapp.cpp @@ -24,7 +24,6 @@ #include "elementscollectioncache.h" #include "fileelementscollection.h" #include "titleblocktemplate.h" -#include "templateeditor.h" #include "qettemplateeditor.h" #include "qetproject.h" #include "qtextorientationspinboxwidget.h" @@ -178,7 +177,7 @@ void QETApp::systray(QSystemTrayIcon::ActivationReason reason) { case QSystemTrayIcon::DoubleClick: case QSystemTrayIcon::Trigger: // reduction ou restauration de l'application - fetchWindowStats(diagramEditors(), elementEditors()); + fetchWindowStats(diagramEditors(), elementEditors(), titleBlockTemplateEditors()); if (every_editor_reduced) restoreEveryEditor(); else reduceEveryEditor(); break; case QSystemTrayIcon::Unknown: @@ -191,6 +190,7 @@ void QETApp::systray(QSystemTrayIcon::ActivationReason reason) { void QETApp::reduceEveryEditor() { reduceDiagramEditors(); reduceElementEditors(); + reduceTitleBlockTemplateEditors(); every_editor_reduced = true; } @@ -198,27 +198,38 @@ void QETApp::reduceEveryEditor() { void QETApp::restoreEveryEditor() { restoreDiagramEditors(); restoreElementEditors(); + restoreTitleBlockTemplateEditors(); every_editor_reduced = false; } /// Reduit tous les editeurs de schemas dans le systray void QETApp::reduceDiagramEditors() { - foreach(QETDiagramEditor *e, diagramEditors()) setMainWindowVisible(e, false); + setMainWindowsVisible(false); } /// Restaure tous les editeurs de schemas dans le systray void QETApp::restoreDiagramEditors() { - foreach(QETDiagramEditor *e, diagramEditors()) setMainWindowVisible(e, true); + setMainWindowsVisible(true); } /// Reduit tous les editeurs d'element dans le systray void QETApp::reduceElementEditors() { - foreach(QETElementEditor *e, elementEditors()) setMainWindowVisible(e, false); + setMainWindowsVisible(false); } /// Restaure tous les editeurs d'element dans le systray void QETApp::restoreElementEditors() { - foreach(QETElementEditor *e, elementEditors()) setMainWindowVisible(e, true); + setMainWindowsVisible(true); +} + +/// Reduce all known template editors +void QETApp::reduceTitleBlockTemplateEditors() { + setMainWindowsVisible(false); +} + +/// Restore all known template editors +void QETApp::restoreTitleBlockTemplateEditors() { + setMainWindowsVisible(true); } /// lance un nouvel editeur de schemas @@ -517,14 +528,43 @@ QFont QETApp::diagramTextsFont(qreal size) { @return les editeurs de schemas */ QList QETApp::diagramEditors() { - return(static_cast(qApp) -> detectDiagramEditors()); + return(QETApp::instance() -> detectWindows()); } /** @return les editeurs d'elements */ QList QETApp::elementEditors() { - return(static_cast(qApp) -> detectElementEditors()); + return(QETApp::instance() -> detectWindows()); +} + +/** + @return the title block template editors +*/ +QList QETApp::titleBlockTemplateEditors() { + return(QETApp::instance() -> detectWindows()); +} + +/** + @param project Opened project object. + @return the list of title block template editors which are currently + editing a template embedded within \a project. +*/ +QList QETApp::titleBlockTemplateEditors(QETProject *project) { + QList editors; + if (!project) return(editors); + + // foreach known template editor + foreach (QETTitleBlockTemplateEditor *tbt_editor, titleBlockTemplateEditors()) { + // retrieve the location of the currently edited template + TitleBlockTemplateLocation tbt_editor_loc(tbt_editor -> location()); + + if (tbt_editor_loc.project() == project) { + editors << tbt_editor; + } + } + + return(editors); } /** @@ -596,28 +636,29 @@ void QETApp::cleanup() { qsti -> hide(); } -/// @return les editeurs de schemas ouverts -QList QETApp::detectDiagramEditors() const { - QList diagram_editors; - foreach(QWidget *qw, topLevelWidgets()) { - if (!qw -> isWindow()) continue; - if (QETDiagramEditor *de = qobject_cast(qw)) { - diagram_editors << de; +/** + @param T a class inheriting QMainWindow + @return the list of windows of type T +*/ +template QList QETApp::detectWindows() const { + QList windows; + foreach(QWidget *widget, topLevelWidgets()) { + if (!widget -> isWindow()) continue; + if (T *window = qobject_cast(widget)) { + windows << window; } } - return(diagram_editors); + return(windows); } -/// @return les editeurs d'elements ouverts -QList QETApp::detectElementEditors() const { - QList element_editors; - foreach(QWidget *qw, topLevelWidgets()) { - if (!qw -> isWindow()) continue; - if (QETElementEditor *ee = qobject_cast(qw)) { - element_editors << ee; - } +/** + @param T a class inheriting QMainWindow + @param visible whether detected main windows should be visible +*/ +template void QETApp::setMainWindowsVisible(bool visible) { + foreach(T *e, detectWindows()) { + setMainWindowVisible(e, visible); } - return(element_editors); } /** @@ -1075,6 +1116,8 @@ void QETApp::initSystemTray() { restore_diagrams = new QAction(QET::Icons::Restore, tr("&Restaurer tous les \351diteurs de sch\351ma"), this); reduce_elements = new QAction(QET::Icons::Hide, tr("&Masquer tous les \351diteurs d'\351l\351ment"), this); restore_elements = new QAction(QET::Icons::Restore, tr("&Restaurer tous les \351diteurs d'\351l\351ment"), this); + reduce_templates = new QAction(QET::Icons::Hide, tr("&Masquer tous les \351diteurs de cartouche", "systray submenu entry"), this); + restore_templates = new QAction(QET::Icons::Restore, tr("&Restaurer tous les \351diteurs de cartouche", "systray submenu entry"), this); new_diagram = new QAction(QET::Icons::WindowNew, tr("&Nouvel \351diteur de sch\351ma"), this); new_element = new QAction(QET::Icons::WindowNew, tr("&Nouvel \351diteur d'\351l\351ment"), this); @@ -1089,6 +1132,8 @@ void QETApp::initSystemTray() { 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(reduce_templates, SIGNAL(triggered()), this, SLOT(reduceTitleBlockTemplateEditors())); + connect(restore_templates,SIGNAL(triggered()), this, SLOT(restoreTitleBlockTemplateEditors())); connect(new_diagram, SIGNAL(triggered()), this, SLOT(newDiagramEditor())); connect(new_element, SIGNAL(triggered()), this, SLOT(newElementEditor())); @@ -1100,6 +1145,25 @@ void QETApp::initSystemTray() { qsti -> show(); } +/** + Add a list of \a windows to \a menu. + This template function assumes it will be given a QList of pointers to + objects inheriting the QMainWindow class. + @param T the class inheriting QMainWindow + @param menu the menu windows will be added to + @param windows A list of top-level windows. +*/ +template void QETApp::addWindowsListToMenu(QMenu *menu, const QList &windows) { + menu -> addSeparator(); + foreach (QMainWindow *window, windows) { + QAction *current_menu = menu -> addAction(window -> windowTitle()); + current_menu -> setCheckable(true); + current_menu -> setChecked(window -> isVisible()); + connect(current_menu, SIGNAL(triggered()), &signal_map, SLOT(map())); + signal_map.setMapping(current_menu, window); + } +} + /// construit le menu de l'icone dans le systray void QETApp::buildSystemTrayMenu() { menu_systray -> clear(); @@ -1107,7 +1171,8 @@ void QETApp::buildSystemTrayMenu() { // recupere les editeurs QList diagrams = diagramEditors(); QList elements = elementEditors(); - fetchWindowStats(diagrams, elements); + QList tbtemplates = titleBlockTemplateEditors(); + fetchWindowStats(diagrams, elements, tbtemplates); // ajoute le bouton reduire / restaurer au menu menu_systray -> addAction(every_editor_reduced ? restore_appli : reduce_appli); @@ -1119,14 +1184,7 @@ void QETApp::buildSystemTrayMenu() { 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); - } + addWindowsListToMenu(diagrams_submenu, diagrams); // ajoute les editeurs d'elements au menu QMenu *elements_submenu = menu_systray -> addMenu(tr("\311diteurs d'\351l\351ment")); @@ -1136,13 +1194,15 @@ void QETApp::buildSystemTrayMenu() { 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); - } + addWindowsListToMenu(elements_submenu, elements); + + // add title block template editors in a submenu + QMenu *tbtemplates_submenu = menu_systray -> addMenu(tr("\311diteurs de cartouche", "systray menu entry")); + tbtemplates_submenu -> addAction(reduce_templates); + tbtemplates_submenu -> addAction(restore_templates); + reduce_templates -> setEnabled(!tbtemplates.isEmpty() && !every_template_reduced); + restore_templates -> setEnabled(!tbtemplates.isEmpty() && !every_template_visible); + addWindowsListToMenu(tbtemplates_submenu, tbtemplates); // ajoute le bouton quitter au menu menu_systray -> addSeparator(); @@ -1150,7 +1210,11 @@ void QETApp::buildSystemTrayMenu() { } /// Met a jour les booleens concernant l'etat des fenetres -void QETApp::fetchWindowStats(const QList &diagrams, const QList &elements) { +void QETApp::fetchWindowStats( + const QList &diagrams, + const QList &elements, + const QList &tbtemplates +) { // compte le nombre de schemas visibles int visible_diagrams = 0; foreach(QMainWindow *w, diagrams) if (w -> isVisible()) ++ visible_diagrams; @@ -1163,6 +1227,14 @@ void QETApp::fetchWindowStats(const QList &diagrams, const Q every_element_reduced = !visible_elements; every_element_visible = visible_elements == elements.count(); + // count visible template editors + int visible_templates = 0; + foreach(QMainWindow *window, tbtemplates) { + if (window -> isVisible()) ++ visible_templates; + } + every_template_reduced = !visible_templates; + every_template_visible = visible_templates == tbtemplates.count(); + // determine si tous les elements sont reduits every_editor_reduced = every_element_reduced && every_diagram_reduced; } diff --git a/sources/qetapp.h b/sources/qetapp.h index f95102801..25cec8f70 100644 --- a/sources/qetapp.h +++ b/sources/qetapp.h @@ -33,6 +33,7 @@ class ElementsCategory; class ElementDefinition; class TitleBlockTemplate; class QETProject; +class QETTitleBlockTemplateEditor; class QTextOrientationSpinBoxWidget; class RecentFiles; /** @@ -99,6 +100,8 @@ class QETApp : public QETSingleApplication { static QList diagramEditors(); static QList elementEditors(); static QList elementEditors(QETProject *); + static QList titleBlockTemplateEditors(); + static QList titleBlockTemplateEditors(QETProject *); static QTextOrientationSpinBoxWidget *createTextOrientationSpinBoxWidget(); static TitleBlockTemplate *defaultTitleBlockTemplate(); @@ -121,6 +124,8 @@ class QETApp : public QETSingleApplication { QAction *restore_diagrams; QAction *reduce_elements; QAction *restore_elements; + QAction *reduce_templates; + QAction *restore_templates; QAction *new_diagram; QAction *new_element; QHash window_geometries; @@ -130,6 +135,8 @@ class QETApp : public QETSingleApplication { bool every_diagram_visible; bool every_element_reduced; bool every_element_visible; + bool every_template_reduced; + bool every_template_visible; QSignalMapper signal_map; QSettings *qet_settings; QETArguments qet_arguments_; ///< Analyseur d'arguments @@ -154,6 +161,8 @@ class QETApp : public QETSingleApplication { void restoreDiagramEditors(); void reduceElementEditors(); void restoreElementEditors(); + void reduceTitleBlockTemplateEditors(); + void restoreTitleBlockTemplateEditors(); void newDiagramEditor(); void newElementEditor(); bool closeEveryEditor(); @@ -176,8 +185,8 @@ class QETApp : public QETSingleApplication { void cleanup(); private: - QList detectDiagramEditors() const; - QList detectElementEditors() const; + template QList detectWindows() const; + template void setMainWindowsVisible(bool); QList floatingToolbarsAndDocksForMainWindow(QMainWindow *) const; void parseArguments(); void initSplashScreen(); @@ -187,7 +196,12 @@ class QETApp : public QETSingleApplication { void initConfiguration(); void initSystemTray(); void buildSystemTrayMenu(); - void fetchWindowStats(const QList &diagrams, const QList &elements); + void fetchWindowStats( + const QList &, + const QList &, + const QList & + ); + template void addWindowsListToMenu(QMenu *, const QList &); }; /** diff --git a/sources/titleblock/qettemplateeditor.cpp b/sources/titleblock/qettemplateeditor.cpp index 413ec2d0f..35a6fb18f 100644 --- a/sources/titleblock/qettemplateeditor.cpp +++ b/sources/titleblock/qettemplateeditor.cpp @@ -36,6 +36,9 @@ QETTitleBlockTemplateEditor::QETTitleBlockTemplateEditor(QWidget *parent) : tb_template_(0), logo_manager_(0) { + setWindowIcon(QET::Icons::QETLogo); + setAttribute(Qt::WA_DeleteOnClose); + initWidgets(); initActions(); initMenus();