[qet] [878] L'application active desormais l'editeur d' element adequat au lieu de permettre l'ouverture d' un meme element plusieurs fois en simultane. |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
- To: qet@xxxxxxxxxxxxxxxxxxx
- Subject: [qet] [878] L'application active desormais l'editeur d' element adequat au lieu de permettre l'ouverture d' un meme element plusieurs fois en simultane.
- From: subversion@xxxxxxxxxxxxx
- Date: Thu, 04 Mar 2010 22:04:23 +0100
Revision: 878
Author: xavier
Date: 2010-03-04 22:04:23 +0100 (Thu, 04 Mar 2010)
Log Message:
-----------
L'application active desormais l'editeur d'element adequat au lieu de permettre l'ouverture d'un meme element plusieurs fois en simultane.
Modified Paths:
--------------
trunk/sources/editor/qetelementeditor.cpp
trunk/sources/editor/qetelementeditor.h
trunk/sources/elementspanelwidget.cpp
trunk/sources/qet.cpp
trunk/sources/qet.h
trunk/sources/qetapp.cpp
trunk/sources/qetapp.h
trunk/sources/qetdiagrameditor.cpp
Modified: trunk/sources/editor/qetelementeditor.cpp
===================================================================
--- trunk/sources/editor/qetelementeditor.cpp 2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/editor/qetelementeditor.cpp 2010-03-04 21:04:23 UTC (rev 878)
@@ -16,6 +16,7 @@
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "qetelementeditor.h"
+#include "qet.h"
#include "qetapp.h"
#include "elementscene.h"
#include "elementview.h"
@@ -838,6 +839,46 @@
}
/**
+ @param location Emplacement d'un element
+ @return true si cet editeur est en train d'editer l'element dont
+ l'emplacement est location, false sinon
+*/
+bool QETElementEditor::isEditing(const ElementsLocation &provided_location) {
+ if (opened_from_file) {
+ return(
+ QET::compareCanonicalFilePaths(
+ filename_,
+ QETApp::realPath(provided_location.toString())
+ )
+ );
+ } else {
+ return(provided_location == location_);
+ }
+}
+
+/**
+ @param provided_filepath Chemin d'un element sur un filesystem
+ @return true si cet editeur est en train d'editer l'element dont
+ le chemin est filepath, false sinon
+*/
+bool QETElementEditor::isEditing(const QString &provided_filepath) {
+ // determine le chemin canonique de l'element actuelle edite, si applicable
+ QString current_filepath;
+ if (opened_from_file) {
+ current_filepath = filename_;
+ } else {
+ current_filepath = QETApp::realPath(location_.toString());
+ }
+
+ return(
+ QET::compareCanonicalFilePaths(
+ current_filepath,
+ provided_filepath
+ )
+ );
+}
+
+/**
specifie si l'editeur d'element doit etre en mode lecture seule
@param ro true pour activer le mode lecture seule, false pour le desactiver
*/
@@ -872,9 +913,7 @@
// demande le chemin virtuel de l'element a ouvrir a l'utilisateur
ElementsLocation location = ElementDialog::getOpenElementLocation(this);
if (location.isNull()) return;
- QETElementEditor *cee = new QETElementEditor();
- cee -> fromLocation(location);
- cee -> show();
+ QETApp::instance() -> openElementLocations(QList<ElementsLocation>() << location);
}
/**
@@ -908,12 +947,11 @@
Cette methode ne controle pas si le fichier est deja ouvert
@param filepath Fichier a ouvrir
@see fromFile
+ @see QETApp::openElementFiles
*/
void QETElementEditor::openElement(const QString &filepath) {
if (filepath.isEmpty()) return;
- QETElementEditor *cee = new QETElementEditor();
- cee -> fromFile(filepath);
- cee -> show();
+ QETApp::instance() -> openElementFiles(QStringList() << filepath);
}
/**
Modified: trunk/sources/editor/qetelementeditor.h
===================================================================
--- trunk/sources/editor/qetelementeditor.h 2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/editor/qetelementeditor.h 2010-03-04 21:04:23 UTC (rev 878)
@@ -115,6 +115,8 @@
void fromLocation(const ElementsLocation &);
bool toFile(const QString &);
bool toLocation(const ElementsLocation &);
+ bool isEditing(const ElementsLocation &);
+ bool isEditing(const QString &);
ElementScene *elementScene() const;
void readSettings();
void writeSettings();
Modified: trunk/sources/elementspanelwidget.cpp
===================================================================
--- trunk/sources/elementspanelwidget.cpp 2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/elementspanelwidget.cpp 2010-03-04 21:04:23 UTC (rev 878)
@@ -255,9 +255,7 @@
// Ouverture de l'element dans l'editeur pour pouvoir ensuite l'enregistrer dans la categorie voulue
if (!fileName.isEmpty()) {
- QETElementEditor *editor = new QETElementEditor();
- editor -> fromFile(fileName);
- editor -> show();
+ QETApp::instance() -> openElementFiles(QStringList() << fileName);
}
}
@@ -530,9 +528,7 @@
@param location Emplacement de l'element a editer
*/
void ElementsPanelWidget::launchElementEditor(const ElementsLocation &location) {
- QETElementEditor *editor = new QETElementEditor();
- editor -> fromLocation(location);
- editor -> show();
+ QETApp::instance() -> openElementLocations(QList<ElementsLocation>() << location);
}
/**
Modified: trunk/sources/qet.cpp
===================================================================
--- trunk/sources/qet.cpp 2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/qet.cpp 2010-03-04 21:04:23 UTC (rev 878)
@@ -434,3 +434,25 @@
)
);
}
+
+/**
+ @param first Un premier chemin vers un fichier
+ @param second Un second chemin vers un fichier
+ @return true si les deux chemins existent existent et sont identiques
+ lorsqu'ils sont exprimes sous forme canonique
+*/
+bool QET::compareCanonicalFilePaths(const QString &first, const QString &second) {
+ QString first_canonical_path = QFileInfo(first).canonicalFilePath();
+ if (first_canonical_path.isEmpty()) return(false);
+
+ QString second_canonical_path = QFileInfo(second).canonicalFilePath();
+ if (second_canonical_path.isEmpty()) return(false);
+
+#ifdef Q_WS_WIN
+ // sous Windows, on ramene les chemins en minuscules
+ first_canonical_path = first_canonical_path.toLower();
+ second_canonical_path = second_canonical_path.toLower();
+#endif
+
+ return(first_canonical_path == second_canonical_path);
+}
Modified: trunk/sources/qet.h
===================================================================
--- trunk/sources/qet.h 2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/qet.h 2010-03-04 21:04:23 UTC (rev 878)
@@ -121,5 +121,6 @@
QString diagramAreaToString(const QET::DiagramArea &);
QET::DiagramArea diagramAreaFromString(const QString &);
QString pointerString(void *);
+ bool compareCanonicalFilePaths(const QString &, const QString &);
}
#endif
Modified: trunk/sources/qetapp.cpp
===================================================================
--- trunk/sources/qetapp.cpp 2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/qetapp.cpp 2010-03-04 21:04:23 UTC (rev 878)
@@ -730,14 +730,72 @@
void QETApp::openElementFiles(const QStringList &files_list) {
if (files_list.isEmpty()) return;
- // creation et affichage d'un ou plusieurs editeurs d'element
- foreach(QString element_file, files_list) {
- QETElementEditor *element_editor = new QETElementEditor();
- element_editor -> fromFile(element_file);
+ // evite autant que possible les doublons dans la liste fournie
+ QSet<QString> files_set;
+ foreach(QString file, files_list) {
+ QString canonical_filepath = QFileInfo(file).canonicalFilePath();
+ if (!canonical_filepath.isEmpty()) files_set << canonical_filepath;
}
+ // a ce stade, tous les fichiers dans le Set existent et sont a priori differents
+ if (files_set.isEmpty()) return;
+
+ // liste des editeurs d'element ouverts
+ QList<QETElementEditor *> element_editors = elementEditors();
+
+ // on traite les fichiers a la queue leu leu...
+ foreach(QString element_file, files_set) {
+ bool already_opened_in_existing_element_editor = false;
+ foreach(QETElementEditor *element_editor, element_editors) {
+ if (element_editor -> isEditing(element_file)) {
+ // ce fichier est deja ouvert dans un editeur
+ already_opened_in_existing_element_editor = true;
+ element_editor -> setVisible(true);
+ element_editor -> raise();
+ element_editor -> activateWindow();
+ break;
+ }
+ }
+ if (!already_opened_in_existing_element_editor) {
+ // ce fichier n'est ouvert dans aucun editeur
+ QETElementEditor *element_editor = new QETElementEditor();
+ element_editor -> fromFile(element_file);
+ }
+ }
}
/**
+ Ouvre les elements dont l'emplacement est passe en parametre. Si un element
+ est deja ouvert, la fentre qui l'edite est activee.
+ @param locations_list Emplacements a ouvrir
+*/
+void QETApp::openElementLocations(const QList<ElementsLocation> &locations_list) {
+ if (locations_list.isEmpty()) return;
+
+ // liste des editeurs d'element ouverts
+ QList<QETElementEditor *> element_editors = elementEditors();
+
+ // on traite les emplacements a la queue leu leu...
+ foreach(ElementsLocation element_location, locations_list) {
+ bool already_opened_in_existing_element_editor = false;
+ foreach(QETElementEditor *element_editor, element_editors) {
+ if (element_editor -> isEditing(element_location)) {
+ // cet emplacement est deja ouvert dans un editeur
+ already_opened_in_existing_element_editor = true;
+ element_editor -> setVisible(true);
+ element_editor -> raise();
+ element_editor -> activateWindow();
+ break;
+ }
+ }
+ if (!already_opened_in_existing_element_editor) {
+ // cet emplacement n'est ouvert dans aucun editeur
+ QETElementEditor *element_editor = new QETElementEditor();
+ element_editor -> fromLocation(element_location);
+ }
+ }
+}
+
+/**
Permet a l'utilisateur de configurer QET en lancant un dialogue approprie.
@see ConfigDialog
*/
Modified: trunk/sources/qetapp.h
===================================================================
--- trunk/sources/qetapp.h 2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/qetapp.h 2010-03-04 21:04:23 UTC (rev 878)
@@ -159,6 +159,7 @@
void openFiles(const QETArguments &);
void openProjectFiles(const QStringList &);
void openElementFiles(const QStringList &);
+ void openElementLocations(const QList<ElementsLocation> &);
void configureQET();
void aboutQET();
Modified: trunk/sources/qetdiagrameditor.cpp
===================================================================
--- trunk/sources/qetdiagrameditor.cpp 2010-03-04 18:58:30 UTC (rev 877)
+++ trunk/sources/qetdiagrameditor.cpp 2010-03-04 21:04:23 UTC (rev 878)
@@ -1757,12 +1757,9 @@
@param location Emplacement de l'element a editer
*/
void QETDiagramEditor::editElementInEditor(const ElementsLocation &location) {
- QETElementEditor *editor = new QETElementEditor();
- editor -> fromLocation(location);
- editor -> show();
+ QETApp::instance() -> openElementLocations(QList<ElementsLocation>() << location);
}
-
/**
@return Les proprietes par defaut pour le cartouche d'un schema
*/