Implemented the common and custom title block templates collections.

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/branches/0.3@1433 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavier
2012-01-08 17:04:34 +00:00
parent c86b064847
commit 91adb47b88
19 changed files with 1267 additions and 274 deletions

View File

@@ -9,6 +9,7 @@ unix {
INSTALL_PREFIX = '/usr/local/' INSTALL_PREFIX = '/usr/local/'
QET_BINARY_PATH = 'bin/' QET_BINARY_PATH = 'bin/'
QET_COMMON_COLLECTION_PATH = 'share/qelectrotech/elements/' QET_COMMON_COLLECTION_PATH = 'share/qelectrotech/elements/'
QET_COMMON_TBT_PATH = 'share/qelectrotech/titleblocks/'
QET_LANG_PATH = 'share/qelectrotech/lang/' QET_LANG_PATH = 'share/qelectrotech/lang/'
QET_EXAMPLES_PATH = 'share/qelectrotech/examples/' QET_EXAMPLES_PATH = 'share/qelectrotech/examples/'
QET_LICENSE_PATH = 'doc/qelectrotech/' QET_LICENSE_PATH = 'doc/qelectrotech/'
@@ -25,6 +26,7 @@ win32 {
INSTALL_PREFIX = './' INSTALL_PREFIX = './'
QET_BINARY_PATH = './' QET_BINARY_PATH = './'
QET_COMMON_COLLECTION_PATH = 'elements/' QET_COMMON_COLLECTION_PATH = 'elements/'
QET_COMMON_TBT_PATH = 'titleblocks/'
QET_LANG_PATH = 'lang/' QET_LANG_PATH = 'lang/'
QET_LICENSE_PATH = './' QET_LICENSE_PATH = './'
} }
@@ -34,6 +36,7 @@ macx {
INSTALL_PREFIX = '/usr/local/' INSTALL_PREFIX = '/usr/local/'
QET_BINARY_PATH = 'bin/' QET_BINARY_PATH = 'bin/'
QET_COMMON_COLLECTION_PATH = '../Resources/elements/' QET_COMMON_COLLECTION_PATH = '../Resources/elements/'
QET_COMMON_TBT_PATH = '../Resources/titleblocks/'
QET_LANG_PATH = '../Resources/lang/' QET_LANG_PATH = '../Resources/lang/'
QET_EXAMPLES_PATH = 'share/qelectrotech/examples/' QET_EXAMPLES_PATH = 'share/qelectrotech/examples/'
QET_LICENSE_PATH = 'doc/qelectrotech/' QET_LICENSE_PATH = 'doc/qelectrotech/'
@@ -47,6 +50,9 @@ macx {
# Commenter la ligne ci-dessous pour desactiver l'option --common-elements-dir # Commenter la ligne ci-dessous pour desactiver l'option --common-elements-dir
DEFINES += QET_ALLOW_OVERRIDE_CED_OPTION DEFINES += QET_ALLOW_OVERRIDE_CED_OPTION
# Comment the line below to disable the --common-tbt-dir option
DEFINES += QET_ALLOW_OVERRIDE_CTBTD_OPTION
# Commenter la ligne ci-dessous pour desactiver l'option --config-dir # Commenter la ligne ci-dessous pour desactiver l'option --config-dir
DEFINES += QET_ALLOW_OVERRIDE_CD_OPTION DEFINES += QET_ALLOW_OVERRIDE_CD_OPTION
@@ -88,6 +94,9 @@ target.path = $$join(INSTALL_PREFIX,,,$${QET_BINARY_PATH})
elements.path = $$join(INSTALL_PREFIX,,,$${QET_COMMON_COLLECTION_PATH}) elements.path = $$join(INSTALL_PREFIX,,,$${QET_COMMON_COLLECTION_PATH})
elements.files = elements/* elements.files = elements/*
tbt.path = $$join(INSTALL_PREFIX,,,$${QET_COMMON_TBT_PATH})
tbt.files = titleblocks/*
lang.path = $$join(INSTALL_PREFIX,,,$${QET_LANG_PATH}) lang.path = $$join(INSTALL_PREFIX,,,$${QET_LANG_PATH})
lang.files = $$replace(TRANSLATIONS, '.ts', '.qm') lang.files = $$replace(TRANSLATIONS, '.ts', '.qm')
@@ -136,6 +145,8 @@ unix {
# Chemin de la collection commune ; par defaut : elements/ dans le repertoire d'execution # Chemin de la collection commune ; par defaut : elements/ dans le repertoire d'execution
DEFINES += QET_COMMON_COLLECTION_PATH=$$join(COMPIL_PREFIX,,,$${QET_COMMON_COLLECTION_PATH}) DEFINES += QET_COMMON_COLLECTION_PATH=$$join(COMPIL_PREFIX,,,$${QET_COMMON_COLLECTION_PATH})
DEFINES += QET_COMMON_TBT_PATH=$$join(COMPIL_PREFIX,,,$${QET_COMMON_TBT_PATH})
} }
# Options de compilation specifiques a MacOS X # Options de compilation specifiques a MacOS X

View File

@@ -25,6 +25,7 @@
#include "fileelementscollection.h" #include "fileelementscollection.h"
#include "fileelementdefinition.h" #include "fileelementdefinition.h"
#include "qeticons.h" #include "qeticons.h"
#include "templatescollection.h"
/** /**
This class implements a thread reloading the following elements This class implements a thread reloading the following elements
@@ -204,8 +205,12 @@ bool ElementsPanel::itemIsWritable(QTreeWidgetItem *qtwi) const {
@param qtwi A QTreeWidgetItem @param qtwi A QTreeWidgetItem
@return true if the given QTreeWidgetItem represents a block templates directory @return true if the given QTreeWidgetItem represents a block templates directory
*/ */
bool ElementsPanel::itemIsATitleBlockTemplatesDirectory(QTreeWidgetItem *qtwi) const { bool ElementsPanel::itemIsATitleBlockTemplatesCollection(QTreeWidgetItem *qtwi) const {
return(title_blocks_directories_.contains(qtwi)); return(
qtwi == custom_tbt_collection_item_ ||
qtwi == common_tbt_collection_item_ ||
title_blocks_collections_.contains(qtwi)
);
} }
/** /**
@@ -213,9 +218,7 @@ bool ElementsPanel::itemIsATitleBlockTemplatesDirectory(QTreeWidgetItem *qtwi) c
@return true if the given QTreeWidgetItem represents a block template @return true if the given QTreeWidgetItem represents a block template
*/ */
bool ElementsPanel::itemIsATitleBlockTemplate(QTreeWidgetItem *qtwi) const { bool ElementsPanel::itemIsATitleBlockTemplate(QTreeWidgetItem *qtwi) const {
// does this QTreeWidgetItem have a parent? return(title_blocks_.contains(qtwi));
if (!qtwi -> parent()) return(false);
return(itemIsATitleBlockTemplatesDirectory(qtwi -> parent()));
} }
/** /**
@@ -333,7 +336,7 @@ bool ElementsPanel::selectedItemIsWritable() const {
templates directory templates directory
*/ */
bool ElementsPanel::selectedItemIsATitleBlockTemplatesDirectory() const { bool ElementsPanel::selectedItemIsATitleBlockTemplatesDirectory() const {
return(itemIsATitleBlockTemplatesDirectory(currentItem())); return(itemIsATitleBlockTemplatesCollection(currentItem()));
} }
/** /**
@@ -563,9 +566,9 @@ bool ElementsPanel::event(QEvent *event) {
@return Le QTreeWidgetItem insere le plus haut @return Le QTreeWidgetItem insere le plus haut
*/ */
QTreeWidgetItem *ElementsPanel::addProject(QTreeWidgetItem *qtwi_parent, QETProject *project) { QTreeWidgetItem *ElementsPanel::addProject(QTreeWidgetItem *qtwi_parent, QETProject *project) {
// le projet sera insere juste avant la collection commune // the project will be inserted right before the common tb templates collection
QTreeWidgetItem *last_project = 0; QTreeWidgetItem *last_project = 0;
if (int common_collection_item_idx = indexOfTopLevelItem(common_collection_item_)) { if (int common_collection_item_idx = indexOfTopLevelItem(common_tbt_collection_item_)) {
last_project = topLevelItem(common_collection_item_idx - 1); last_project = topLevelItem(common_collection_item_idx - 1);
} }
@@ -584,14 +587,10 @@ QTreeWidgetItem *ElementsPanel::addProject(QTreeWidgetItem *qtwi_parent, QETProj
addDiagram(qtwi_project, diagram); addDiagram(qtwi_project, diagram);
} }
// add the title blocks templates embedded within the project // add the embedded title block templates collection
updateProjectTemplates(project); addTitleBlockTemplatesCollection(qtwi_project, project -> embeddedTitleBlockTemplatesCollection());
connect(
project, SIGNAL(projectTemplatesChanged(QETProject *)),
this, SLOT (projectTemplatesChanged(QETProject *))
);
// ajoute la collection du projet // add the embedded elements collection
addCollection(qtwi_project, project -> embeddedCollection(), tr("Collection projet")); addCollection(qtwi_project, project -> embeddedCollection(), tr("Collection projet"));
return(qtwi_project); return(qtwi_project);
@@ -738,6 +737,64 @@ QTreeWidgetItem *ElementsPanel::addElement(QTreeWidgetItem *qtwi_parent, Element
return(qtwi); return(qtwi);
} }
/**
Adds \a collection under \a qtwi_parent with the given \a label and \a icon.
@param qtwi_parent Parent QTreeWidgetItem
@param collection Title block templates collection to be added to the panel
@param label Label for the returned QTreeWidgetItem
@param icon Label for the returned QTreeWidgetItem
@return the QTreeWidgetItem representing the collection
*/
QTreeWidgetItem *ElementsPanel::addTitleBlockTemplatesCollection(
QTreeWidgetItem *qtwi_parent,
TitleBlockTemplatesCollection *collection,
const QString &label,
const QIcon &icon
) {
if (!collection) return(0);
// check whether we have an item for the given collection
QTreeWidgetItem *qtwi_tbt_collection = title_blocks_collections_.key(collection);
if (!qtwi_tbt_collection) {
// the collection has not been added yet
QString final_label(label.isEmpty() ? tr("Mod\350les de cartouche") : label);
QIcon final_icon(icon.isNull() ? QET::Icons::TitleBlock : icon);
// create the QTreeWidgetItem representing the collection itself
qtwi_tbt_collection = new QTreeWidgetItem(qtwi_parent, QStringList(final_label));
qtwi_tbt_collection -> setIcon(0, final_icon);
qtwi_tbt_collection -> setToolTip(0, collection -> location().toString());
qtwi_tbt_collection -> setExpanded(true);
title_blocks_collections_.insert(qtwi_tbt_collection, collection);
// ensure the added collection will inform us about its changes
connect(
collection,
SIGNAL(changed(TitleBlockTemplatesCollection*, const QString &)),
this,
SLOT(titleBlockTemplatesCollectionChanged(TitleBlockTemplatesCollection*, const QString &))
);
} else {
// the collection has already been added
// remove the child title block templates
foreach(QTreeWidgetItem *qtwi_tbt, qtwi_tbt_collection -> takeChildren()) {
deleteItem(qtwi_tbt);
}
}
// add the templates
foreach (QString template_name, collection -> templates()) {
QString final_name = titleBlockTemplateNameToDisplay(template_name);
TitleBlockTemplateLocation template_location = collection -> location(template_name);
QTreeWidgetItem *qtwi_tbt = new QTreeWidgetItem(qtwi_tbt_collection, QStringList(final_name));
qtwi_tbt -> setToolTip(0, template_location.toString());
qtwi_tbt -> setIcon(0, QET::Icons::TitleBlock);
title_blocks_.insert(qtwi_tbt, template_location);
}
return(qtwi_tbt_collection);
}
/** /**
Reloads the following collections: Reloads the following collections:
* common collection * common collection
@@ -790,34 +847,49 @@ void ElementsPanel::reload(bool reload_collections) {
locations_.clear(); locations_.clear();
projects_.clear(); projects_.clear();
diagrams_.clear(); diagrams_.clear();
title_blocks_directories_.clear(); title_blocks_collections_.clear();
title_blocks_.clear();
common_collection_item_ = 0; common_collection_item_ = 0;
custom_collection_item_ = 0; custom_collection_item_ = 0;
QIcon system_icon(":/ico/16x16/qet.png");
QIcon user_icon(":/ico/16x16/go-home.png");
// estimates the number of categories and elements to load // estimates the number of categories and elements to load
int items_count = elementsCollectionItemsCount(); int items_count = elementsCollectionItemsCount();
emit(loadingProgressed(loading_progress_ = 0, items_count)); emit(loadingProgressed(loading_progress_ = 0, items_count));
// load the common title block templates collection
TitleBlockTemplatesCollection *common_tbt_collection = QETApp::commonTitleBlockTemplatesCollection();
common_tbt_collection_item_ = addTitleBlockTemplatesCollection(invisibleRootItem(), common_tbt_collection, common_tbt_collection -> title(), system_icon);
if (first_reload_) common_tbt_collection_item_ -> setExpanded(true);
// chargement des elements de la collection QET // chargement des elements de la collection QET
if (QETApp::commonElementsCollection()->rootCategory()) { if (QETApp::commonElementsCollection()->rootCategory()) {
common_collection_item_ = addCollection(invisibleRootItem(), QETApp::commonElementsCollection(), tr("Collection QET"), QIcon(":/ico/16x16/qet.png")); common_collection_item_ = addCollection(invisibleRootItem(), QETApp::commonElementsCollection(), tr("Collection QET"), system_icon);
if (first_reload_) common_collection_item_ -> setExpanded(true); if (first_reload_) common_collection_item_ -> setExpanded(true);
} }
// load the custom title block templates collection
TitleBlockTemplatesCollection *custom_tbt_collection = QETApp::customTitleBlockTemplatesCollection();
custom_tbt_collection_item_ = addTitleBlockTemplatesCollection(invisibleRootItem(), custom_tbt_collection, custom_tbt_collection -> title(), user_icon);
if (first_reload_) custom_tbt_collection_item_ -> setExpanded(true);
// chargement des elements de la collection utilisateur // chargement des elements de la collection utilisateur
if (QETApp::customElementsCollection()->rootCategory()) { if (QETApp::customElementsCollection()->rootCategory()) {
custom_collection_item_ = addCollection(invisibleRootItem(), QETApp::customElementsCollection(), tr("Collection utilisateur"), QIcon(":/ico/16x16/go-home.png")); custom_collection_item_ = addCollection(invisibleRootItem(), QETApp::customElementsCollection(), tr("Collection utilisateur"), user_icon);
if (first_reload_) custom_collection_item_ -> setExpanded(true); if (first_reload_) custom_collection_item_ -> setExpanded(true);
} }
// the first time, expand the first level of collections
if (first_reload_) first_reload_ = false;
// chargement des projets // chargement des projets
foreach(QETProject *project, projects_to_display_.values()) { foreach(QETProject *project, projects_to_display_.values()) {
addProject(invisibleRootItem(), project); addProject(invisibleRootItem(), project);
} }
// the first time, expand the first level of collections
if (first_reload_) first_reload_ = false;
// reselectionne le dernier element selectionne // reselectionne le dernier element selectionne
if (!last_selected_item.isNull()) { if (!last_selected_item.isNull()) {
QTreeWidgetItem *qtwi = findLocation(last_selected_item); QTreeWidgetItem *qtwi = findLocation(last_selected_item);
@@ -843,9 +915,7 @@ void ElementsPanel::slot_doubleClick(QTreeWidgetItem *qtwi, int) {
} else if (ElementsCollectionItem *item = collectionItemForItem(qtwi)) { } else if (ElementsCollectionItem *item = collectionItemForItem(qtwi)) {
emit(requestForCollectionItem(item)); emit(requestForCollectionItem(item));
} else if (itemIsATitleBlockTemplate(qtwi)) { } else if (itemIsATitleBlockTemplate(qtwi)) {
if (QETProject *project = projectForTitleBlockTemplate(qtwi)) { emit(requestForTitleBlockTemplate(title_blocks_[qtwi]));
emit(requestForTitleBlockTemplate(project, nameOfTitleBlockTemplate(qtwi)));
}
} }
} }
@@ -899,8 +969,10 @@ void ElementsPanel::deleteItem(QTreeWidgetItem *removed_item) {
diagrams_.remove(removed_item); diagrams_.remove(removed_item);
} else if (projects_.contains(removed_item)) { } else if (projects_.contains(removed_item)) {
projects_.remove(removed_item); projects_.remove(removed_item);
} else if (title_blocks_directories_.contains(removed_item)) { } else if (title_blocks_collections_.contains(removed_item)) {
title_blocks_directories_.remove(removed_item); title_blocks_collections_.remove(removed_item);
} else if (title_blocks_.contains(removed_item)) {
title_blocks_.remove(removed_item);
} }
// supprime les eventuels enfants de l'item // supprime les eventuels enfants de l'item
@@ -928,27 +1000,18 @@ ElementsCategory *ElementsPanel::categoryForPos(const QPoint &pos) {
} }
/** /**
@param qtwi A QTreeWidgetItem, supposed to represent a templates directory @param qtwi A QTreeWidgetItem, supposed to represent either a title block
@return the project that embeds the given templates directory, if @template or a title block templates collection. return the adequate title
applicable, 0 otherwise @block template location
*/ */
QETProject *ElementsPanel::projectForTitleBlockTemplatesDirectory(QTreeWidgetItem *qtwi) { TitleBlockTemplateLocation ElementsPanel::locationForTitleBlockTemplate(QTreeWidgetItem *qtwi) {
if (title_blocks_directories_.contains(qtwi)) { if (title_blocks_.contains(qtwi)) {
return(title_blocks_directories_[qtwi]); // the QTreeWidgetItem is a title block template
return(title_blocks_[qtwi]);
} else if (title_blocks_collections_.contains(qtwi)) {
return(title_blocks_collections_[qtwi] -> location());
} }
return(0); return(TitleBlockTemplateLocation());
}
/**
@param qtwi A QTreeWidgetItem, supposed to represent a title block template
@return the project that embeds the given template, if applicable, 0
otherwise
*/
QETProject *ElementsPanel::projectForTitleBlockTemplate(QTreeWidgetItem *qtwi) {
if (qtwi->parent()) {
return(projectForTitleBlockTemplatesDirectory(qtwi->parent()));
}
return(0);
} }
/** /**
@@ -956,8 +1019,8 @@ QETProject *ElementsPanel::projectForTitleBlockTemplate(QTreeWidgetItem *qtwi) {
@return the name of the given template, if applicable, 0 otherwise @return the name of the given template, if applicable, 0 otherwise
*/ */
QString ElementsPanel::nameOfTitleBlockTemplate(QTreeWidgetItem *qtwi) { QString ElementsPanel::nameOfTitleBlockTemplate(QTreeWidgetItem *qtwi) {
if (itemIsATitleBlockTemplate(qtwi)) { if (title_blocks_.contains(qtwi)) {
return(qtwi -> data(0, 42).toString()); return(title_blocks_[qtwi].name());
} }
return(QString()); return(QString());
} }
@@ -1034,11 +1097,16 @@ void ElementsPanel::projectInformationsChanged(QETProject *project) {
} }
/** /**
Handles the fact that the title block templates of a project changed. @param collection Title block templates collection that changed and should be updated
@param project the modified project @param template_name Name of the changed template (unused)
*/ */
void ElementsPanel::projectTemplatesChanged(QETProject *project) { void ElementsPanel::titleBlockTemplatesCollectionChanged(TitleBlockTemplatesCollection*collection, const QString &template_name) {
updateProjectTemplates(project); Q_UNUSED(template_name)
QTreeWidgetItem *qtwi_parent = title_blocks_collections_.key(collection);
if (!qtwi_parent) qtwi_parent = invisibleRootItem();
addTitleBlockTemplatesCollection(qtwi_parent, collection);
} }
/** /**
@@ -1156,7 +1224,7 @@ void ElementsPanel::updateProjectItemInformations(QETProject *project) {
// determine le nom et l'icone du projet // determine le nom et l'icone du projet
QString final_name(project -> pathNameTitle()); QString final_name(project -> pathNameTitle());
QString final_tooltip = project -> filePath(); QString final_tooltip = QDir::toNativeSeparators(project -> filePath());
if (final_tooltip.isEmpty()) { if (final_tooltip.isEmpty()) {
final_tooltip = tr( final_tooltip = tr(
"Pas de fichier", "Pas de fichier",
@@ -1173,7 +1241,7 @@ void ElementsPanel::updateProjectItemInformations(QETProject *project) {
(Re)generates the templates list of a given project. (Re)generates the templates list of a given project.
@param project the project we want to update the templates @param project the project we want to update the templates
*/ */
void ElementsPanel::updateProjectTemplates(QETProject *project) { /*void ElementsPanel::updateProjectTemplates(QETProject *project) {
// determine the QTWI for the templates directory of the given project // determine the QTWI for the templates directory of the given project
QTreeWidgetItem *qtwi_project = projects_.key(project); QTreeWidgetItem *qtwi_project = projects_.key(project);
if (!qtwi_project) return; if (!qtwi_project) return;
@@ -1194,13 +1262,18 @@ void ElementsPanel::updateProjectTemplates(QETProject *project) {
} }
// we can now populate the templates directory // we can now populate the templates directory
foreach (QString titleblock_name, project -> embeddedTitleBlockTemplates()) { TitleBlockTemplatesCollection *collection = project -> embeddedTitleBlockTemplatesCollection();
QString final_name = QString(tr("Mod\350le \"%1\"")).arg(titleblock_name); if (!collection) {
QTreeWidgetItem *titleblock_template_qtwi = new QTreeWidgetItem(titleblock_templates_qtwi, QStringList() << final_name); // this stinks...
return;
}
foreach (QString titleblock_name, collection -> templates()) {
QString final_name = titleBlockTemplateNameToDisplay(titleblock_name);
QTreeWidgetItem *titleblock_template_qtwi = new QTreeWidgetItem(titleblock_templates_qtwi, QStringList(final_name));
titleblock_template_qtwi -> setIcon(0, QET::Icons::TitleBlock); titleblock_template_qtwi -> setIcon(0, QET::Icons::TitleBlock);
titleblock_template_qtwi -> setData(0, 42, titleblock_name); // we store the original title block template name here, since the displayed one could be modified titleblocks_.insert(titleblock_template_qtwi, collection -> location(titleblock_name));
}
} }
}*/
/** /**
Updates the label of a diagram displayed by the elements panel Updates the label of a diagram displayed by the elements panel
@@ -1245,6 +1318,14 @@ QString ElementsPanel::diagramTitleToDisplay(Diagram *diagram) const {
return(displayed_label); return(displayed_label);
} }
/**
@param template_name Name of a title block template
@return a displayable title
*/
QString ElementsPanel::titleBlockTemplateNameToDisplay(const QString &template_name) const {
return(tr("Mod\350le \"%1\"", "used to display a title block template").arg(template_name));
}
/** /**
@param items une liste de QTreeWidgetItem pour lesquels il faut s'assurer @param items une liste de QTreeWidgetItem pour lesquels il faut s'assurer
que eux et leurs parents sont visibles que eux et leurs parents sont visibles

View File

@@ -19,6 +19,7 @@
#define PANELAPPAREILS_H #define PANELAPPAREILS_H
#include <QtGui> #include <QtGui>
#include "elementslocation.h" #include "elementslocation.h"
#include "templatelocation.h"
class QETProject; class QETProject;
class Diagram; class Diagram;
class ElementsCollection; class ElementsCollection;
@@ -26,6 +27,8 @@ class ElementsCollectionItem;
class ElementsCategory; class ElementsCategory;
class ElementDefinition; class ElementDefinition;
class ElementsCollectionCache; class ElementsCollectionCache;
class TitleBlockTemplatesFilesCollection;
/** /**
Cette classe represente le panel d'appareils (en tant qu'element Cette classe represente le panel d'appareils (en tant qu'element
graphique) dans lequel l'utilisateur choisit les composants de graphique) dans lequel l'utilisateur choisit les composants de
@@ -52,7 +55,7 @@ class ElementsPanel : public QTreeWidget {
bool itemIsADiagram(QTreeWidgetItem *) const; bool itemIsADiagram(QTreeWidgetItem *) const;
bool itemHasLocation(QTreeWidgetItem *) const; bool itemHasLocation(QTreeWidgetItem *) const;
bool itemIsWritable(QTreeWidgetItem *) const; bool itemIsWritable(QTreeWidgetItem *) const;
bool itemIsATitleBlockTemplatesDirectory(QTreeWidgetItem *) const; bool itemIsATitleBlockTemplatesCollection(QTreeWidgetItem *) const;
bool itemIsATitleBlockTemplate(QTreeWidgetItem *) const; bool itemIsATitleBlockTemplate(QTreeWidgetItem *) const;
// methodes pour obtenir ce que represente un item donne // methodes pour obtenir ce que represente un item donne
@@ -62,8 +65,7 @@ class ElementsPanel : public QTreeWidget {
ElementsLocation locationForItem(QTreeWidgetItem *) const; ElementsLocation locationForItem(QTreeWidgetItem *) const;
ElementsCategory *categoryForItem(QTreeWidgetItem *); ElementsCategory *categoryForItem(QTreeWidgetItem *);
ElementsCategory *categoryForPos(const QPoint &); ElementsCategory *categoryForPos(const QPoint &);
QETProject *projectForTitleBlockTemplatesDirectory(QTreeWidgetItem *); TitleBlockTemplateLocation locationForTitleBlockTemplate(QTreeWidgetItem *);
QETProject *projectForTitleBlockTemplate(QTreeWidgetItem *);
QString nameOfTitleBlockTemplate(QTreeWidgetItem *); QString nameOfTitleBlockTemplate(QTreeWidgetItem *);
// methodes pour determiner ce que represente l'item selectionne // methodes pour determiner ce que represente l'item selectionne
@@ -91,7 +93,7 @@ class ElementsPanel : public QTreeWidget {
void requestForDiagram(Diagram *); void requestForDiagram(Diagram *);
void requestForCollectionItem(ElementsCollectionItem *); void requestForCollectionItem(ElementsCollectionItem *);
void requestForMoveElements(ElementsCollectionItem *, ElementsCollectionItem *, QPoint); void requestForMoveElements(ElementsCollectionItem *, ElementsCollectionItem *, QPoint);
void requestForTitleBlockTemplate(QETProject *, const QString &); void requestForTitleBlockTemplate(const TitleBlockTemplateLocation &);
void readingAboutToBegin(); void readingAboutToBegin();
void readingFinished(); void readingFinished();
void loadingProgressed(int, int); void loadingProgressed(int, int);
@@ -103,7 +105,7 @@ class ElementsPanel : public QTreeWidget {
void projectWasOpened(QETProject *); void projectWasOpened(QETProject *);
void projectWasClosed(QETProject *); void projectWasClosed(QETProject *);
void projectInformationsChanged(QETProject *); void projectInformationsChanged(QETProject *);
void projectTemplatesChanged(QETProject *); void titleBlockTemplatesCollectionChanged(TitleBlockTemplatesCollection*, const QString & = QString());
void diagramWasAdded(QETProject *, Diagram *); void diagramWasAdded(QETProject *, Diagram *);
void diagramWasRemoved(QETProject *, Diagram *); void diagramWasRemoved(QETProject *, Diagram *);
void diagramTitleChanged(QETProject *, Diagram *); void diagramTitleChanged(QETProject *, Diagram *);
@@ -123,14 +125,15 @@ class ElementsPanel : public QTreeWidget {
QTreeWidgetItem *addCollection(QTreeWidgetItem *, ElementsCollection *, const QString & = QString(), const QIcon & = QIcon()); QTreeWidgetItem *addCollection(QTreeWidgetItem *, ElementsCollection *, const QString & = QString(), const QIcon & = QIcon());
QTreeWidgetItem *addCategory (QTreeWidgetItem *, ElementsCategory *, const QString & = QString(), const QIcon & = QIcon()); QTreeWidgetItem *addCategory (QTreeWidgetItem *, ElementsCategory *, const QString & = QString(), const QIcon & = QIcon());
QTreeWidgetItem *addElement (QTreeWidgetItem *, ElementDefinition *, const QString & = QString()); QTreeWidgetItem *addElement (QTreeWidgetItem *, ElementDefinition *, const QString & = QString());
QTreeWidgetItem *addTitleBlockTemplatesCollection(QTreeWidgetItem *, TitleBlockTemplatesCollection *, const QString & = QString(), const QIcon & = QIcon());
void saveExpandedCategories(); void saveExpandedCategories();
QTreeWidgetItem *findLocation(const ElementsLocation &) const; QTreeWidgetItem *findLocation(const ElementsLocation &) const;
QTreeWidgetItem *findLocation(const QString &) const; QTreeWidgetItem *findLocation(const QString &) const;
void deleteItem(QTreeWidgetItem *); void deleteItem(QTreeWidgetItem *);
void updateProjectItemInformations(QETProject *); void updateProjectItemInformations(QETProject *);
void updateProjectTemplates(QETProject *);
void updateDiagramLabel(QTreeWidgetItem *, int); void updateDiagramLabel(QTreeWidgetItem *, int);
QString diagramTitleToDisplay(Diagram *) const; QString diagramTitleToDisplay(Diagram *) const;
QString titleBlockTemplateNameToDisplay(const QString &) const;
void ensureHierarchyIsVisible(QList<QTreeWidgetItem *>); void ensureHierarchyIsVisible(QList<QTreeWidgetItem *>);
// attributs // attributs
@@ -138,12 +141,15 @@ class ElementsPanel : public QTreeWidget {
QStringList expanded_directories; QStringList expanded_directories;
QString last_selected_item; QString last_selected_item;
QHash<QTreeWidgetItem *, ElementsLocation> locations_; QHash<QTreeWidgetItem *, ElementsLocation> locations_;
QHash<QTreeWidgetItem *, TitleBlockTemplateLocation> title_blocks_;
QSet<QETProject *> projects_to_display_; QSet<QETProject *> projects_to_display_;
QHash<QTreeWidgetItem *, QETProject *> projects_; QHash<QTreeWidgetItem *, QETProject *> projects_;
QHash<QTreeWidgetItem *, Diagram *> diagrams_; QHash<QTreeWidgetItem *, Diagram *> diagrams_;
QHash<QTreeWidgetItem *, QETProject *> title_blocks_directories_; QHash<QTreeWidgetItem *, TitleBlockTemplatesCollection *> title_blocks_collections_;
QTreeWidgetItem *common_collection_item_; QTreeWidgetItem *common_collection_item_;
QTreeWidgetItem *common_tbt_collection_item_;
QTreeWidgetItem *custom_collection_item_; QTreeWidgetItem *custom_collection_item_;
QTreeWidgetItem *custom_tbt_collection_item_;
int loading_progress_; int loading_progress_;
bool first_activation_; bool first_activation_;
bool first_reload_; bool first_reload_;

View File

@@ -131,9 +131,9 @@ ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) {
); );
connect( connect(
elements_panel, elements_panel,
SIGNAL(requestForTitleBlockTemplate(QETProject *, const QString &)), SIGNAL(requestForTitleBlockTemplate(const TitleBlockTemplateLocation &)),
QETApp::instance(), QETApp::instance(),
SLOT(openTitleBlockTemplate(QETProject *, const QString &)) SLOT(openTitleBlockTemplate(const TitleBlockTemplateLocation &))
); );
connect(elements_panel, SIGNAL(loadingProgressed(int, int)), this, SLOT(updateProgressBar(int, int))); connect(elements_panel, SIGNAL(loadingProgressed(int, int)), this, SLOT(updateProgressBar(int, int)));
connect(elements_panel, SIGNAL(readingAboutToBegin()), this, SLOT(collectionsRead())); connect(elements_panel, SIGNAL(readingAboutToBegin()), this, SLOT(collectionsRead()));
@@ -263,15 +263,9 @@ void ElementsPanelWidget::addTitleBlockTemplate() {
QTreeWidgetItem *current_item = elements_panel -> currentItem(); QTreeWidgetItem *current_item = elements_panel -> currentItem();
if (!current_item) return; if (!current_item) return;
QETProject *parent_project = 0; if (elements_panel -> itemIsATitleBlockTemplatesCollection(current_item)) {
if (elements_panel -> itemIsATitleBlockTemplate(current_item)) { TitleBlockTemplateLocation location = elements_panel -> locationForTitleBlockTemplate(current_item);
parent_project = elements_panel -> projectForTitleBlockTemplate(current_item); QETApp::instance() -> openTitleBlockTemplate(location);
} else if (elements_panel -> itemIsATitleBlockTemplatesDirectory(current_item)) {
parent_project = elements_panel -> projectForTitleBlockTemplatesDirectory(current_item);
}
if (parent_project) {
QETApp::instance() -> openTitleBlockTemplate(parent_project);
} }
} }
@@ -281,9 +275,7 @@ void ElementsPanelWidget::addTitleBlockTemplate() {
void ElementsPanelWidget::editTitleBlockTemplate() { void ElementsPanelWidget::editTitleBlockTemplate() {
QTreeWidgetItem *current_item = elements_panel -> currentItem(); QTreeWidgetItem *current_item = elements_panel -> currentItem();
if (current_item && elements_panel -> itemIsATitleBlockTemplate(current_item)) { if (current_item && elements_panel -> itemIsATitleBlockTemplate(current_item)) {
QETProject *parent_project = elements_panel -> projectForTitleBlockTemplate(current_item); QETApp::instance() -> openTitleBlockTemplate(elements_panel -> locationForTitleBlockTemplate(current_item));
QString template_name = elements_panel -> nameOfTitleBlockTemplate(current_item);
QETApp::instance() -> openTitleBlockTemplate(parent_project, template_name);
} }
} }
@@ -293,11 +285,10 @@ void ElementsPanelWidget::editTitleBlockTemplate() {
void ElementsPanelWidget::removeTitleBlockTemplate() { void ElementsPanelWidget::removeTitleBlockTemplate() {
QTreeWidgetItem *current_item = elements_panel -> currentItem(); QTreeWidgetItem *current_item = elements_panel -> currentItem();
if (current_item && elements_panel -> itemIsATitleBlockTemplate(current_item)) { if (current_item && elements_panel -> itemIsATitleBlockTemplate(current_item)) {
QETProject *parent_project = elements_panel -> projectForTitleBlockTemplate(current_item); TitleBlockTemplateDeleter(
QString template_name = elements_panel -> nameOfTitleBlockTemplate(current_item); elements_panel -> locationForTitleBlockTemplate(current_item),
TitleBlockTemplateLocation template_location(parent_project, template_name); this
TitleBlockTemplateDeleter template_deleter(template_location, this); ).exec();
template_deleter.exec();
} }
} }
@@ -380,14 +371,19 @@ void ElementsPanelWidget::updateButtons() {
prj_move_diagram_up -> setEnabled(is_writable && diagram_position > 0); prj_move_diagram_up -> setEnabled(is_writable && diagram_position > 0);
prj_move_diagram_down -> setEnabled(is_writable && diagram_position < project_diagrams_count - 1); prj_move_diagram_down -> setEnabled(is_writable && diagram_position < project_diagrams_count - 1);
setElementsActionEnabled(false); setElementsActionEnabled(false);
} else if (elements_panel -> selectedItemIsATitleBlockTemplatesDirectory()) { } else if (
bool is_writable = !(elements_panel -> projectForTitleBlockTemplatesDirectory(elements_panel -> currentItem()) -> isReadOnly()); elements_panel -> selectedItemIsATitleBlockTemplatesDirectory() ||
elements_panel -> selectedItemIsATitleBlockTemplate()
) {
QTreeWidgetItem *item = elements_panel -> currentItem();
TitleBlockTemplateLocation location = elements_panel -> locationForTitleBlockTemplate(item);
bool is_writable;
if (location.isValid()) {
is_writable = !location.parentCollection() -> isReadOnly();
tbt_add -> setEnabled(is_writable); tbt_add -> setEnabled(is_writable);
setElementsActionEnabled(false);
} else if (elements_panel -> selectedItemIsATitleBlockTemplate()) {
bool is_writable = !(elements_panel -> projectForTitleBlockTemplate(elements_panel -> currentItem()) -> isReadOnly());
tbt_edit -> setEnabled(is_writable); tbt_edit -> setEnabled(is_writable);
tbt_remove -> setEnabled(is_writable); tbt_remove -> setEnabled(is_writable);
}
setElementsActionEnabled(false); setElementsActionEnabled(false);
} }
} }
@@ -474,7 +470,7 @@ void ElementsPanelWidget::handleContextMenu(const QPoint &pos) {
context_menu -> addAction(prj_del_diagram); context_menu -> addAction(prj_del_diagram);
context_menu -> addAction(prj_move_diagram_up); context_menu -> addAction(prj_move_diagram_up);
context_menu -> addAction(prj_move_diagram_down); context_menu -> addAction(prj_move_diagram_down);
} else if (elements_panel -> itemIsATitleBlockTemplatesDirectory(item)) { } else if (elements_panel -> itemIsATitleBlockTemplatesCollection(item)) {
context_menu -> addAction(tbt_add); context_menu -> addAction(tbt_add);
} else if (elements_panel -> itemIsATitleBlockTemplate(item)) { } else if (elements_panel -> itemIsATitleBlockTemplate(item)) {
context_menu -> addAction(tbt_edit); context_menu -> addAction(tbt_edit);

View File

@@ -29,6 +29,7 @@
#include "qtextorientationspinboxwidget.h" #include "qtextorientationspinboxwidget.h"
#include "recentfiles.h" #include "recentfiles.h"
#include "qeticons.h" #include "qeticons.h"
#include "templatescollection.h"
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
#define QUOTE(x) STRINGIFY(x) #define QUOTE(x) STRINGIFY(x)
@@ -37,12 +38,17 @@
#ifdef QET_ALLOW_OVERRIDE_CED_OPTION #ifdef QET_ALLOW_OVERRIDE_CED_OPTION
QString QETApp::common_elements_dir = QString(); QString QETApp::common_elements_dir = QString();
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
QString QETApp::common_tbt_dir_ = QString();
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
QString QETApp::config_dir = QString(); QString QETApp::config_dir = QString();
#endif #endif
QString QETApp::lang_dir = QString(); QString QETApp::lang_dir = QString();
FileElementsCollection *QETApp::common_collection = 0; FileElementsCollection *QETApp::common_collection = 0;
FileElementsCollection *QETApp::custom_collection = 0; FileElementsCollection *QETApp::custom_collection = 0;
TitleBlockTemplatesFilesCollection *QETApp::common_tbt_collection_;
TitleBlockTemplatesFilesCollection *QETApp::custom_tbt_collection_;
ElementsCollectionCache *QETApp::collections_cache_ = 0; ElementsCollectionCache *QETApp::collections_cache_ = 0;
QMap<uint, QETProject *> QETApp::registered_projects_ = QMap<uint, QETProject *>(); QMap<uint, QETProject *> QETApp::registered_projects_ = QMap<uint, QETProject *>();
uint QETApp::next_project_id = 0; uint QETApp::next_project_id = 0;
@@ -131,6 +137,8 @@ QETApp::~QETApp() {
delete qsti; delete qsti;
delete custom_collection; delete custom_collection;
delete common_collection; delete common_collection;
if (custom_tbt_collection_) delete custom_tbt_collection_;
if (common_tbt_collection_) delete common_tbt_collection_;
} }
/** /**
@@ -288,6 +296,49 @@ QList<ElementsCollection *> QETApp::availableCollections() {
return(coll_list); return(coll_list);
} }
/**
@return the common title block templates collection, i.e. the one provided
by QElecrotTech
*/
TitleBlockTemplatesFilesCollection *QETApp::commonTitleBlockTemplatesCollection() {
if (!common_tbt_collection_) {
common_tbt_collection_ = new TitleBlockTemplatesFilesCollection(QETApp::commonTitleBlockTemplatesDir());
common_tbt_collection_ -> setTitle(tr("Cartouches QET", "title of the title block templates collection provided by QElectroTech"));
common_tbt_collection_ -> setProtocol("commontbt");
}
return(common_tbt_collection_);
}
/**
@return the custom title block templates collection, i.e. the one managed
by the end user
*/
TitleBlockTemplatesFilesCollection *QETApp::customTitleBlockTemplatesCollection() {
if (!custom_tbt_collection_) {
custom_tbt_collection_ = new TitleBlockTemplatesFilesCollection(QETApp::customTitleBlockTemplatesDir());
custom_tbt_collection_ -> setTitle(tr("Cartouches utilisateur", "title of the user's title block templates collection"));
custom_tbt_collection_ -> setProtocol("customtbt");
}
return(custom_tbt_collection_);
}
/**
@return the list of all available title block tempaltes collections,
beginning with the common and custom ones, plus the projects-embedded ones.
*/
QList<TitleBlockTemplatesCollection *> QETApp::availableTitleBlockTemplatesCollections() {
QList<TitleBlockTemplatesCollection *> collections_list;
collections_list << common_tbt_collection_;
collections_list << custom_tbt_collection_;
foreach(QETProject *opened_project, registered_projects_) {
collections_list << opened_project -> embeddedTitleBlockTemplatesCollection();
}
return(collections_list);
}
/** /**
@return le nom de l'utilisateur courant @return le nom de l'utilisateur courant
*/ */
@@ -332,6 +383,36 @@ QString QETApp::customElementsDir() {
return(configDir() + "elements/"); return(configDir() + "elements/");
} }
/**
@return the path of the directory containing the common title block
templates collection.
*/
QString QETApp::commonTitleBlockTemplatesDir() {
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
if (common_tbt_dir_ != QString()) return(common_tbt_dir_);
#endif
#ifndef QET_COMMON_TBT_PATH
// without any compile-time option, use the "titleblocks" directory next to the executable binary
return(QCoreApplication::applicationDirPath() + "/titleblocks/");
#else
#ifndef QET_COMMON_COLLECTION_PATH_RELATIVE_TO_BINARY_PATH
// the compile-time option represents a usual path (be it absolute or relative)
return(QUOTE(QET_COMMON_TBT_PATH));
#else
// the compile-time option represents a path relative to the directory that contains the executable binary
return(QCoreApplication::applicationDirPath() + "/" + QUOTE(QET_COMMON_TBT_PATH));
#endif
#endif
}
/**
@return the path of the directory containing the custom title block
templates collection.
*/
QString QETApp::customTitleBlockTemplatesDir() {
return(configDir() + "titleblocks/");
}
/** /**
Renvoie le dossier de configuration de QET, c-a-d le chemin du dossier dans Renvoie le dossier de configuration de QET, c-a-d le chemin du dossier dans
lequel QET lira les informations de configuration et de personnalisation lequel QET lira les informations de configuration et de personnalisation
@@ -371,6 +452,10 @@ QString QETApp::realPath(const QString &sym_path) {
directory = commonElementsDir(); directory = commonElementsDir();
} else if (sym_path.startsWith("custom://")) { } else if (sym_path.startsWith("custom://")) {
directory = customElementsDir(); directory = customElementsDir();
} else if (sym_path.startsWith("commontbt://")) {
directory = commonTitleBlockTemplatesDir();
} else if (sym_path.startsWith("customtbt://")) {
directory = customTitleBlockTemplatesDir();
} else return(QString()); } else return(QString());
return(directory + QDir::toNativeSeparators(sym_path.right(sym_path.length() - 9))); return(directory + QDir::toNativeSeparators(sym_path.right(sym_path.length() - 9)));
} }
@@ -429,6 +514,20 @@ void QETApp::overrideCommonElementsDir(const QString &new_ced) {
} }
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
/**
Define the path of the directory containing the common title block
tempaltes collection.
*/
void QETApp::overrideCommonTitleBlockTemplatesDir(const QString &new_ctbtd) {
QFileInfo new_ctbtd_info(new_ctbtd);
if (new_ctbtd_info.isDir()) {
common_tbt_dir_ = new_ctbtd_info.absoluteFilePath();
if (!common_tbt_dir_.endsWith("/")) common_tbt_dir_ += "/";
}
}
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
/** /**
Redefinit le chemin du dossier de configuration Redefinit le chemin du dossier de configuration
@@ -556,10 +655,7 @@ QList<QETTitleBlockTemplateEditor *> QETApp::titleBlockTemplateEditors(QETProjec
// foreach known template editor // foreach known template editor
foreach (QETTitleBlockTemplateEditor *tbt_editor, titleBlockTemplateEditors()) { foreach (QETTitleBlockTemplateEditor *tbt_editor, titleBlockTemplateEditors()) {
// retrieve the location of the currently edited template if (tbt_editor -> location().parentProject() == project) {
TitleBlockTemplateLocation tbt_editor_loc(tbt_editor -> location());
if (tbt_editor_loc.project() == project) {
editors << tbt_editor; editors << tbt_editor;
} }
} }
@@ -903,9 +999,9 @@ void QETApp::openElementLocations(const QList<ElementsLocation> &locations_list)
If no template name is supplied, the method assumes the editor has to be If no template name is supplied, the method assumes the editor has to be
launched for a template creation. launched for a template creation.
*/ */
void QETApp::openTitleBlockTemplate(QETProject *project, const QString &template_name) { void QETApp::openTitleBlockTemplate(const TitleBlockTemplateLocation &location) {
QETTitleBlockTemplateEditor *qet_template_editor = new QETTitleBlockTemplateEditor(); QETTitleBlockTemplateEditor *qet_template_editor = new QETTitleBlockTemplateEditor();
qet_template_editor -> edit(project, template_name); qet_template_editor -> edit(location);
qet_template_editor -> showMaximized(); qet_template_editor -> showMaximized();
} }
@@ -1004,6 +1100,11 @@ void QETApp::parseArguments() {
overrideCommonElementsDir(qet_arguments_.commonElementsDir()); overrideCommonElementsDir(qet_arguments_.commonElementsDir());
} }
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
if (qet_arguments_.commonTitleBlockTemplatesDirSpecified()) {
overrideCommonTitleBlockTemplatesDir(qet_arguments_.commonTitleBlockTemplatesDir());
}
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
if (qet_arguments_.configDirSpecified()) { if (qet_arguments_.configDirSpecified()) {
overrideConfigDir(qet_arguments_.configDir()); overrideConfigDir(qet_arguments_.configDir());
@@ -1081,6 +1182,7 @@ void QETApp::initStyle() {
Cette methode creera, si necessaire : Cette methode creera, si necessaire :
* le dossier de configuration * le dossier de configuration
* le dossier de la collection perso * le dossier de la collection perso
* the directory for custom title blocks
*/ */
void QETApp::initConfiguration() { void QETApp::initConfiguration() {
// cree les dossiers de configuration si necessaire // cree les dossiers de configuration si necessaire
@@ -1090,6 +1192,9 @@ void QETApp::initConfiguration() {
QDir custom_elements_dir(QETApp::customElementsDir()); QDir custom_elements_dir(QETApp::customElementsDir());
if (!custom_elements_dir.exists()) custom_elements_dir.mkpath(QETApp::customElementsDir()); if (!custom_elements_dir.exists()) custom_elements_dir.mkpath(QETApp::customElementsDir());
QDir custom_tbt_dir(QETApp::customTitleBlockTemplatesDir());
if (!custom_tbt_dir.exists()) custom_tbt_dir.mkpath(QETApp::customTitleBlockTemplatesDir());
// lit le fichier de configuration // lit le fichier de configuration
qet_settings = new QSettings(configDir() + "qelectrotech.conf", QSettings::IniFormat, this); qet_settings = new QSettings(configDir() + "qelectrotech.conf", QSettings::IniFormat, this);
@@ -1271,6 +1376,9 @@ void QETApp::printHelp() {
#ifdef QET_ALLOW_OVERRIDE_CED_OPTION #ifdef QET_ALLOW_OVERRIDE_CED_OPTION
+ tr(" --common-elements-dir=DIR Definir le dossier de la collection d'elements\n") + tr(" --common-elements-dir=DIR Definir le dossier de la collection d'elements\n")
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
+ tr(" --common-tbt-dir=DIR Definir le dossier de la collection de modeles de cartouches\n")
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
+ tr(" --config-dir=DIR Definir le dossier de configuration\n") + tr(" --config-dir=DIR Definir le dossier de configuration\n")
#endif #endif

View File

@@ -21,6 +21,7 @@
#include <QTranslator> #include <QTranslator>
#include <QtGui> #include <QtGui>
#include "elementslocation.h" #include "elementslocation.h"
#include "templatelocation.h"
#include "qetarguments.h" #include "qetarguments.h"
class AboutQET; class AboutQET;
class QETDiagramEditor; class QETDiagramEditor;
@@ -32,6 +33,8 @@ class FileElementsCollection;
class ElementsCategory; class ElementsCategory;
class ElementDefinition; class ElementDefinition;
class TitleBlockTemplate; class TitleBlockTemplate;
class TitleBlockTemplatesCollection;
class TitleBlockTemplatesFilesCollection;
class QETProject; class QETProject;
class QETTitleBlockTemplateEditor; class QETTitleBlockTemplateEditor;
class QTextOrientationSpinBoxWidget; class QTextOrientationSpinBoxWidget;
@@ -65,9 +68,15 @@ class QETApp : public QETSingleApplication {
static ElementsCollection *customElementsCollection(); static ElementsCollection *customElementsCollection();
static QList<ElementsCollection *> availableCollections(); static QList<ElementsCollection *> availableCollections();
static TitleBlockTemplatesFilesCollection *commonTitleBlockTemplatesCollection();
static TitleBlockTemplatesFilesCollection *customTitleBlockTemplatesCollection();
static QList<TitleBlockTemplatesCollection *> availableTitleBlockTemplatesCollections();
static QString userName(); static QString userName();
static QString commonElementsDir(); static QString commonElementsDir();
static QString customElementsDir(); static QString customElementsDir();
static QString commonTitleBlockTemplatesDir();
static QString customTitleBlockTemplatesDir();
static bool registerProject(QETProject *); static bool registerProject(QETProject *);
static bool unregisterProject(QETProject *); static bool unregisterProject(QETProject *);
static QMap<uint, QETProject *> registeredProjects(); static QMap<uint, QETProject *> registeredProjects();
@@ -86,6 +95,12 @@ class QETApp : public QETSingleApplication {
private: private:
static QString common_elements_dir; ///< Dossier contenant la collection d'elements commune static QString common_elements_dir; ///< Dossier contenant la collection d'elements commune
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
public:
static void overrideCommonTitleBlockTemplatesDir(const QString &);
private:
static QString common_tbt_dir_; ///< Directory containing the common title block templates collection
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
public: public:
static void overrideConfigDir(const QString &); static void overrideConfigDir(const QString &);
@@ -145,6 +160,8 @@ class QETApp : public QETSingleApplication {
static FileElementsCollection *common_collection; static FileElementsCollection *common_collection;
static FileElementsCollection *custom_collection; static FileElementsCollection *custom_collection;
static TitleBlockTemplatesFilesCollection *common_tbt_collection_;
static TitleBlockTemplatesFilesCollection *custom_tbt_collection_;
static ElementsCollectionCache *collections_cache_; static ElementsCollectionCache *collections_cache_;
static QMap<uint, QETProject *> registered_projects_; static QMap<uint, QETProject *> registered_projects_;
static uint next_project_id; static uint next_project_id;
@@ -176,7 +193,7 @@ class QETApp : public QETSingleApplication {
void openProjectFiles(const QStringList &); void openProjectFiles(const QStringList &);
void openElementFiles(const QStringList &); void openElementFiles(const QStringList &);
void openElementLocations(const QList<ElementsLocation> &); void openElementLocations(const QList<ElementsLocation> &);
void openTitleBlockTemplate(QETProject *, const QString & = QString()); void openTitleBlockTemplate(const TitleBlockTemplateLocation &);
void configureQET(); void configureQET();
void aboutQET(); void aboutQET();

View File

@@ -56,6 +56,9 @@ QETArguments::QETArguments(const QETArguments &qet_arguments) :
#ifdef QET_ALLOW_OVERRIDE_CED_OPTION #ifdef QET_ALLOW_OVERRIDE_CED_OPTION
common_elements_dir_(qet_arguments.common_elements_dir_), common_elements_dir_(qet_arguments.common_elements_dir_),
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
common_tbt_dir_(qet_arguments.common_tbt_dir_),
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
config_dir_(qet_arguments.config_dir_), config_dir_(qet_arguments.config_dir_),
#endif #endif
@@ -78,6 +81,9 @@ QETArguments &QETArguments::operator=(const QETArguments &qet_arguments) {
#ifdef QET_ALLOW_OVERRIDE_CED_OPTION #ifdef QET_ALLOW_OVERRIDE_CED_OPTION
common_elements_dir_ = qet_arguments.common_elements_dir_; common_elements_dir_ = qet_arguments.common_elements_dir_;
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
common_tbt_dir_ = qet_arguments.common_tbt_dir_;
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
config_dir_ = qet_arguments.config_dir_; config_dir_ = qet_arguments.config_dir_;
#endif #endif
@@ -159,6 +165,9 @@ void QETArguments::clear() {
#ifdef QET_ALLOW_OVERRIDE_CED_OPTION #ifdef QET_ALLOW_OVERRIDE_CED_OPTION
common_elements_dir_.clear(); common_elements_dir_.clear();
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
common_tbt_dir_.clear();
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
config_dir_.clear(); config_dir_.clear();
#endif #endif
@@ -205,6 +214,7 @@ void QETArguments::handleFileArgument(const QString &file) {
Gere les arguments correspondant potentiellement a une option. Gere les arguments correspondant potentiellement a une option.
Les options reconnues sont : Les options reconnues sont :
* --common-elements-dir= * --common-elements-dir=
* --common-tbt-dir
* --config-dir= * --config-dir=
* --lang-dir= * --lang-dir=
* --help * --help
@@ -235,6 +245,13 @@ void QETArguments::handleOptionArgument(const QString &option) {
} }
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
QString ctbtd_arg("--common-tbt-dir=");
if (option.startsWith(ctbtd_arg)) {
common_tbt_dir_ = option.mid(ctbtd_arg.length());
return;
}
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
QString cd_arg("--config-dir="); QString cd_arg("--config-dir=");
if (option.startsWith(cd_arg)) { if (option.startsWith(cd_arg)) {
@@ -270,8 +287,26 @@ bool QETArguments::commonElementsDirSpecified() const {
QString QETArguments::commonElementsDir() const { QString QETArguments::commonElementsDir() const {
return(common_elements_dir_); return(common_elements_dir_);
} }
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
/**
@return true if the user has specified a directory for the common title
block templates collection
*/
bool QETArguments::commonTitleBlockTemplatesDirSpecified() const {
return(!common_tbt_dir_.isEmpty());
}
/**
@return the directory of the common title block templates collection
specified by the user. If none were specified, return an empty string.
*/
QString QETArguments::commonTitleBlockTemplatesDir() const {
return(common_tbt_dir_);
}
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
/** /**
@return true si l'utilisateur a specifie un dossier pour la configuration. @return true si l'utilisateur a specifie un dossier pour la configuration.

View File

@@ -46,6 +46,10 @@ class QETArguments : public QObject {
virtual bool commonElementsDirSpecified() const; virtual bool commonElementsDirSpecified() const;
virtual QString commonElementsDir() const; virtual QString commonElementsDir() const;
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
virtual bool commonTitleBlockTemplatesDirSpecified() const;
virtual QString commonTitleBlockTemplatesDir() const;
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
virtual bool configDirSpecified() const; virtual bool configDirSpecified() const;
virtual QString configDir() const; virtual QString configDir() const;
@@ -73,6 +77,9 @@ class QETArguments : public QObject {
#ifdef QET_ALLOW_OVERRIDE_CED_OPTION #ifdef QET_ALLOW_OVERRIDE_CED_OPTION
QString common_elements_dir_; QString common_elements_dir_;
#endif #endif
#ifdef QET_ALLOW_OVERRIDE_CTBTD_OPTION
QString common_tbt_dir_;
#endif
#ifdef QET_ALLOW_OVERRIDE_CD_OPTION #ifdef QET_ALLOW_OVERRIDE_CD_OPTION
QString config_dir_; QString config_dir_;
#endif #endif

View File

@@ -39,7 +39,8 @@ QETProject::QETProject(int diagrams, QObject *parent) :
QObject(parent), QObject(parent),
collection_(0), collection_(0),
project_qet_version_(-1), project_qet_version_(-1),
read_only_(false) read_only_(false),
titleblocks_(this)
{ {
// 0 a n schema(s) vide(s) // 0 a n schema(s) vide(s)
int diagrams_count = qMax(0, diagrams); int diagrams_count = qMax(0, diagrams);
@@ -55,6 +56,7 @@ QETProject::QETProject(int diagrams, QObject *parent) :
// une categorie dediee aux elements integres automatiquement // une categorie dediee aux elements integres automatiquement
ensureIntegrationCategoryExists(); ensureIntegrationCategoryExists();
setupTitleBlockTemplatesCollection();
} }
/** /**
@@ -66,7 +68,8 @@ QETProject::QETProject(const QString &path, QObject *parent) :
QObject(parent), QObject(parent),
collection_(0), collection_(0),
project_qet_version_(-1), project_qet_version_(-1),
read_only_(false) read_only_(false),
titleblocks_(this)
{ {
// ouvre le fichier // ouvre le fichier
QFile project_file(path); QFile project_file(path);
@@ -86,6 +89,8 @@ QETProject::QETProject(const QString &path, QObject *parent) :
// et construit le projet // et construit le projet
readProjectXml(); readProjectXml();
setupTitleBlockTemplatesCollection();
// passe le projet en lecture seule si le fichier l'est // passe le projet en lecture seule si le fichier l'est
QFileInfo project_file_info(path); QFileInfo project_file_info(path);
if (!project_file_info.isWritable()) { if (!project_file_info.isWritable()) {
@@ -101,13 +106,16 @@ QETProject::QETProject(const QDomElement &xml_element, QObject *parent) :
QObject(parent), QObject(parent),
collection_(0), collection_(0),
project_qet_version_(-1), project_qet_version_(-1),
read_only_(false) read_only_(false),
titleblocks_(this)
{ {
// copie le contenu XML // copie le contenu XML
document_root_.appendChild(document_root_.importNode(xml_element, true)); document_root_.appendChild(document_root_.importNode(xml_element, true));
// et construit le projet // et construit le projet
readProjectXml(); readProjectXml();
setupTitleBlockTemplatesCollection();
} }
/** /**
@@ -166,6 +174,13 @@ ElementsCollection *QETProject::embeddedCollection() const {
return(collection_); return(collection_);
} }
/**
@return the title block templates collection enbeedded within this project
*/
TitleBlockTemplatesProjectCollection *QETProject::embeddedTitleBlockTemplatesCollection() {
return(&titleblocks_);
}
/** /**
@return le chemin du fichier dans lequel ce projet est enregistre @return le chemin du fichier dans lequel ce projet est enregistre
*/ */
@@ -286,8 +301,8 @@ void QETProject::setTitle(const QString &title) {
/** /**
@return the list of the titleblock templates embedded within this project @return the list of the titleblock templates embedded within this project
*/ */
QList<QString> QETProject::embeddedTitleBlockTemplates() const { QList<QString> QETProject::embeddedTitleBlockTemplates() {
return(titleblock_templates_xml_.keys()); return(titleblocks_.templates());
} }
/** /**
@@ -296,24 +311,7 @@ QList<QString> QETProject::embeddedTitleBlockTemplates() const {
name within the project name within the project
*/ */
const TitleBlockTemplate *QETProject::getTemplateByName(const QString &template_name) { const TitleBlockTemplate *QETProject::getTemplateByName(const QString &template_name) {
// Do we have already loaded this template? return(titleblocks_.getTemplate(template_name));
if (titleblock_templates_.contains(template_name)) {
return(titleblock_templates_[template_name]);
}
// No? Do we even know of it?
if (!titleblock_templates_xml_.contains(template_name)) {
return(0);
}
// Ok, we have its XML description, we have to generate an TitleBlockTemplate object
TitleBlockTemplate *titleblock_template = new TitleBlockTemplate(this);
if (titleblock_template -> loadFromXmlElement(titleblock_templates_xml_[template_name])) {
titleblock_templates_.insert(template_name, titleblock_template);
return(titleblock_template);
} else {
return(0);
}
} }
/** /**
@@ -322,16 +320,12 @@ const TitleBlockTemplate *QETProject::getTemplateByName(const QString &template_
if the project does not have such an titleblock template if the project does not have such an titleblock template
*/ */
QDomElement QETProject::getTemplateXmlDescriptionByName(const QString &template_name) { QDomElement QETProject::getTemplateXmlDescriptionByName(const QString &template_name) {
if (titleblock_templates_xml_.contains(template_name)) { return(titleblocks_.getTemplateXmlDescription(template_name));
return(titleblock_templates_xml_[template_name]);
}
return(QDomElement());
} }
/** /**
This methods allows adding or modifying a template embedded within the This methods allows adding or modifying a template embedded within the
project. This method emits the signal projectTemplatesChanged() if project.
necessary.
@param template_name Name / Identifier of the template - will be used to @param template_name Name / Identifier of the template - will be used to
determine whether the given description will be added or will replace an determine whether the given description will be added or will replace an
existing one. existing one.
@@ -340,53 +334,15 @@ QDomElement QETProject::getTemplateXmlDescriptionByName(const QString &template_
@return false if a problem occured, true otherwise @return false if a problem occured, true otherwise
*/ */
bool QETProject::setTemplateXmlDescription(const QString &template_name, const QDomElement &xml_elmt) { bool QETProject::setTemplateXmlDescription(const QString &template_name, const QDomElement &xml_elmt) {
// checks basic stuff return(titleblocks_.setTemplateXmlDescription(template_name, xml_elmt));
if (xml_elmt.tagName() != "titleblocktemplate" || xml_elmt.attribute("name") != template_name) {
return(false);
}
// we import the provided XML element in the project document
QDomElement import = document_root_.importNode(xml_elmt, true).toElement();
// we either replace the previous description
if (titleblock_templates_xml_.contains(template_name)) {
QDomElement old_description = titleblock_templates_xml_[template_name];
if (!old_description.parentNode().isNull()) {
old_description.parentNode().replaceChild(import, old_description);
}
}
titleblock_templates_xml_.insert(template_name, import);
if (titleblock_templates_.contains(template_name)) {
titleblock_templates_[template_name] -> loadFromXmlElement(titleblock_templates_xml_[template_name]);
foreach (Diagram *diagram, diagrams_) {
diagram -> titleBlockTemplateChanged(template_name);
}
}
emit(projectTemplatesChanged(this));
return(true);
} }
/** /**
This methods allows removing a template embedded within the project. This This methods allows removing a template embedded within the project.
method emits the signal projectTemplatesChanged() if necessary.
@param template_name Name of the template to be removed @param template_name Name of the template to be removed
*/ */
void QETProject::removeTemplateByName(const QString &template_name) { void QETProject::removeTemplateByName(const QString &template_name) {
if (titleblock_templates_.contains(template_name)) { return(titleblocks_.removeTemplate(template_name));
// warn diagrams that the given template is about to be removed
foreach (Diagram *diagram, diagrams_) {
diagram -> titleBlockTemplateRemoved(template_name); /// TODO specify the default template of the project as a fallback
}
}
// remove the template itself
titleblock_templates_xml_.remove(template_name);
titleblock_templates_.remove(template_name);
// warn the rest of the world that the list of templates embedded within this project has changed
emit(projectTemplatesChanged(this));
} }
/** /**
@@ -451,11 +407,11 @@ QDomDocument QETProject::toXml() {
xml_doc.appendChild(project_root); xml_doc.appendChild(project_root);
// titleblock templates, if any // titleblock templates, if any
if (titleblock_templates_xml_.count()) { if (titleblocks_.templates().count()) {
qDebug() << qPrintable(QString("QETProject::toXml() : exporting %1 titleblock templates").arg(titleblock_templates_xml_.count()));
QDomElement titleblocktemplates_elmt = xml_doc.createElement("titleblocktemplates"); QDomElement titleblocktemplates_elmt = xml_doc.createElement("titleblocktemplates");
foreach (QDomElement e, titleblock_templates_xml_) { foreach (QString template_name, titleblocks_.templates()) {
titleblocktemplates_elmt.appendChild(e); QDomElement e = titleblocks_.getTemplateXmlDescription(template_name);
titleblocktemplates_elmt.appendChild(xml_doc.importNode(e, true));
} }
project_root.appendChild(titleblocktemplates_elmt); project_root.appendChild(titleblocktemplates_elmt);
} }
@@ -818,6 +774,25 @@ void QETProject::diagramOrderChanged(int old_index, int new_index) {
updateDiagramsFolioData(); updateDiagramsFolioData();
} }
/**
Set up signals/slots connections related to the title block templates
collection.
*/
void QETProject::setupTitleBlockTemplatesCollection() {
connect(
&titleblocks_,
SIGNAL(changed(TitleBlockTemplatesCollection *, const QString &)),
this,
SLOT(updateDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *, const QString &))
);
connect(
&titleblocks_,
SIGNAL(aboutToRemove(TitleBlockTemplatesCollection *, const QString &)),
this,
SLOT(removeDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *, const QString &))
);
}
/** /**
@return un pointeur vers la categorie racine de la collection embarquee, ou @return un pointeur vers la categorie racine de la collection embarquee, ou
0 si celle-ci n'est pas accessible. 0 si celle-ci n'est pas accessible.
@@ -923,18 +898,7 @@ void QETProject::readDiagramsXml() {
Loads the embedded template from the XML description of the project Loads the embedded template from the XML description of the project
*/ */
void QETProject::readEmbeddedTemplatesXml() { void QETProject::readEmbeddedTemplatesXml() {
foreach (QDomElement e, QET::findInDomElement(document_root_.documentElement(), "titleblocktemplates", "titleblocktemplate")) { titleblocks_.fromXml(document_root_.documentElement());
// each titleblock template must have a name
if (!e.hasAttribute("name")) continue;
QString titleblock_template_name = e.attribute("name");
// if several templates have the same name, we keep the first one encountered
if (titleblock_templates_xml_.contains(titleblock_template_name)) continue;
// we simply store the XML element describing the titleblock template,
// without any further analysis for the moment
titleblock_templates_xml_.insert(titleblock_template_name, e);
}
} }
/** /**
@@ -1148,6 +1112,33 @@ void QETProject::updateDiagramsFolioData() {
} }
} }
/**
Inform each diagram that the \a template_name title block changed.
@param collection Title block templates collection
@param template_name Name of the changed template
*/
void QETProject::updateDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *collection, const QString &template_name) {
Q_UNUSED(collection)
foreach (Diagram *diagram, diagrams_) {
diagram -> titleBlockTemplateChanged(template_name);
}
}
/**
Inform each diagram that the \a template_name title block is about to be removed.
@param collection Title block templates collection
@param template_name Name of the removed template
*/
void QETProject::removeDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *collection, const QString &template_name) {
Q_UNUSED(collection)
// warn diagrams that the given template is about to be removed
foreach (Diagram *diagram, diagrams_) {
diagram -> titleBlockTemplateRemoved(template_name);
}
}
/** /**
Copie l'element integ_elmt dans la categorie target_cat en utilisant le Copie l'element integ_elmt dans la categorie target_cat en utilisant le
gestionnaire handler ; en cas d'erreur, error_message est rempli. gestionnaire handler ; en cas d'erreur, error_message est rempli.

View File

@@ -24,6 +24,7 @@
#include "borderproperties.h" #include "borderproperties.h"
#include "conductorproperties.h" #include "conductorproperties.h"
#include "titleblockproperties.h" #include "titleblockproperties.h"
#include "templatescollection.h"
class Diagram; class Diagram;
class ElementsCollection; class ElementsCollection;
class ElementsCategory; class ElementsCategory;
@@ -75,6 +76,7 @@ class QETProject : public QObject {
QList<Diagram *> diagrams() const; QList<Diagram *> diagrams() const;
int folioIndex(const Diagram *) const; int folioIndex(const Diagram *) const;
ElementsCollection *embeddedCollection() const; ElementsCollection *embeddedCollection() const;
TitleBlockTemplatesProjectCollection *embeddedTitleBlockTemplatesCollection();
QString filePath(); QString filePath();
void setFilePath(const QString &); void setFilePath(const QString &);
QString currentDir() const; QString currentDir() const;
@@ -82,7 +84,7 @@ class QETProject : public QObject {
QString title() const; QString title() const;
qreal declaredQElectroTechVersion(); qreal declaredQElectroTechVersion();
void setTitle(const QString &); void setTitle(const QString &);
QList<QString> embeddedTitleBlockTemplates() const; QList<QString> embeddedTitleBlockTemplates();
const TitleBlockTemplate *getTemplateByName(const QString &template_name); const TitleBlockTemplate *getTemplateByName(const QString &template_name);
QDomElement getTemplateXmlDescriptionByName(const QString &); QDomElement getTemplateXmlDescriptionByName(const QString &);
bool setTemplateXmlDescription(const QString &, const QDomElement &); bool setTemplateXmlDescription(const QString &, const QDomElement &);
@@ -123,12 +125,14 @@ class QETProject : public QObject {
void diagramAdded(QETProject *, Diagram *); void diagramAdded(QETProject *, Diagram *);
void diagramRemoved(QETProject *, Diagram *); void diagramRemoved(QETProject *, Diagram *);
void readOnlyChanged(QETProject *, bool); void readOnlyChanged(QETProject *, bool);
void projectTemplatesChanged(QETProject *);
private slots: private slots:
void updateDiagramsFolioData(); void updateDiagramsFolioData();
void updateDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *, const QString &);
void removeDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *, const QString &);
private: private:
void setupTitleBlockTemplatesCollection();
ElementsCategory *rootCategory() const; ElementsCategory *rootCategory() const;
void readProjectXml(); void readProjectXml();
void readDiagramsXml(); void readDiagramsXml();
@@ -168,9 +172,7 @@ class QETProject : public QObject {
ConductorProperties default_conductor_properties_; ConductorProperties default_conductor_properties_;
/// Proprietes par defaut du cartouche pour les nouveaux schemas dans ce projet /// Proprietes par defaut du cartouche pour les nouveaux schemas dans ce projet
TitleBlockProperties default_titleblock_properties_; TitleBlockProperties default_titleblock_properties_;
/// XML descriptions of embedded titleblock templates /// Embedded title block templates collection
QHash<QString, QDomElement> titleblock_templates_xml_; TitleBlockTemplatesProjectCollection titleblocks_;
/// Already parsed embedded titleblock templates
QHash<QString, TitleBlockTemplate *> titleblock_templates_;
}; };
#endif #endif

View File

@@ -32,7 +32,6 @@
QETTitleBlockTemplateEditor::QETTitleBlockTemplateEditor(QWidget *parent) : QETTitleBlockTemplateEditor::QETTitleBlockTemplateEditor(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
read_only(false), read_only(false),
parent_project_(0),
tb_template_(0), tb_template_(0),
logo_manager_(0) logo_manager_(0)
{ {
@@ -54,7 +53,30 @@ QETTitleBlockTemplateEditor::~QETTitleBlockTemplateEditor() {
@return the location of the currently edited template @return the location of the currently edited template
*/ */
TitleBlockTemplateLocation QETTitleBlockTemplateEditor::location() const { TitleBlockTemplateLocation QETTitleBlockTemplateEditor::location() const {
return(TitleBlockTemplateLocation(parent_project_, template_name_)); return(location_);
}
/**
@param location Location of the tile block template to be edited.
*/
bool QETTitleBlockTemplateEditor::edit(const TitleBlockTemplateLocation &location) {
// the template name may be empty to create a new one
const TitleBlockTemplate *tb_template_orig;
if (location.name().isEmpty()) {
// loads the default title block template provided by the application
// it will be used as a start point to design the title block
tb_template_orig = QETApp::defaultTitleBlockTemplate();
} else {
tb_template_orig = location.getTemplate();
}
if (!tb_template_orig) {
/// TODO The TBT does not exist, manage error
return(false);
}
location_ = location;
editCopyOf(tb_template_orig);
return(true);
} }
/** /**
@@ -82,9 +104,42 @@ bool QETTitleBlockTemplateEditor::edit(QETProject *project, const QString &templ
return(false); return(false);
} }
tb_template_ = tb_template_orig -> clone(); location_.setParentCollection(project -> embeddedTitleBlockTemplatesCollection());
parent_project_ = project; location_.setName(template_name);
template_name_ = template_name; return(editCopyOf(tb_template_orig));
}
/**
@param file_path Path of the template file to edit.
@return false if a problem occured while opening the template, true otherwise.
*/
bool QETTitleBlockTemplateEditor::edit(const QString &file_path) {
// get title block template object from the file, edit it
TitleBlockTemplate *tbt = new TitleBlockTemplate();
bool loading = tbt -> loadFromXmlFile(file_path);
if (!loading) {
/// TODO the file opening failed, warn the user?
return(false);
}
return(edit(tbt));
}
/**
@param tbt Title block template to be edited
@return false if a problem occured while opening the template, true otherwise.
*/
bool QETTitleBlockTemplateEditor::editCopyOf(const TitleBlockTemplate *tbt) {
if (!tbt) return(false);
return(edit(tbt -> clone()));
}
/**
@param tbt Title block template to be directly edited
@return false if a problem occured while opening the template, true otherwise.
*/
bool QETTitleBlockTemplateEditor::edit(TitleBlockTemplate *tbt) {
if (!tbt) return(false);
tb_template_ = tbt;
template_edition_area_view_ -> setTitleBlockTemplate(tb_template_); template_edition_area_view_ -> setTitleBlockTemplate(tb_template_);
template_cell_editor_widget_ -> updateLogosComboBox(tb_template_); template_cell_editor_widget_ -> updateLogosComboBox(tb_template_);
updateEditorTitle(); updateEditorTitle();
@@ -242,6 +297,9 @@ void QETTitleBlockTemplateEditor::initWidgets() {
); );
} }
/**
Initialize the logo manager
*/
void QETTitleBlockTemplateEditor::initLogoManager() { void QETTitleBlockTemplateEditor::initLogoManager() {
logo_manager_ = new TitleBlockTemplateLogoManager(tb_template_); logo_manager_ = new TitleBlockTemplateLogoManager(tb_template_);
connect( connect(
@@ -302,7 +360,7 @@ void QETTitleBlockTemplateEditor::updateEditorTitle() {
); );
QString title; QString title;
if (template_name_.isEmpty()) { if (location_.name().isEmpty()) {
title = min_title; title = min_title;
} else { } else {
title = QString( title = QString(
@@ -310,38 +368,37 @@ void QETTitleBlockTemplateEditor::updateEditorTitle() {
"%1 - %2", "%1 - %2",
"window title: %1 is the base window title, %2 is a template name" "window title: %1 is the base window title, %2 is a template name"
) )
).arg(min_title).arg(template_name_); ).arg(min_title).arg(location_.name());
} }
setWindowTitle(title); setWindowTitle(title);
} }
/** /**
Save the template as \a name within \a project. Save the template under the provided location.
@see QETProject::setTemplateXmlDescription() @see QETProject::setTemplateXmlDescription()
@param project Parent project @param location Location where the title block template should be saved.
@param name Template name
*/ */
void QETTitleBlockTemplateEditor::saveAs(QETProject *project, const QString &name) { void QETTitleBlockTemplateEditor::saveAs(const TitleBlockTemplateLocation &location) {
if (!project || name.isEmpty()) return; TitleBlockTemplatesCollection *collection = location.parentCollection();
if (!collection) return;
QDomDocument doc; QDomDocument doc;
QDomElement elmt = doc.createElement("root"); QDomElement elmt = doc.createElement("root");
tb_template_ -> saveToXmlElement(elmt); tb_template_ -> saveToXmlElement(elmt);
elmt.setAttribute("name", name); elmt.setAttribute("name", location.name());
doc.appendChild(elmt); doc.appendChild(elmt);
project -> setTemplateXmlDescription(name, elmt); collection -> setTemplateXmlDescription(location.name(), elmt);
parent_project_ = project; location_ = location;
template_name_ = name;
} }
/** /**
Save the currently edited title block template back to its parent project. Save the currently edited title block template back to its parent project.
*/ */
void QETTitleBlockTemplateEditor::save() { void QETTitleBlockTemplateEditor::save() {
if (parent_project_ && !template_name_.isEmpty()) { if (location_.isValid()) {
saveAs(parent_project_, template_name_); saveAs(location_);
} else { } else {
saveAs(); saveAs();
} }
@@ -353,13 +410,14 @@ void QETTitleBlockTemplateEditor::save() {
void QETTitleBlockTemplateEditor::saveAs() { void QETTitleBlockTemplateEditor::saveAs() {
TitleBlockTemplateLocation location = getTitleBlockTemplateLocationFromUser(); TitleBlockTemplateLocation location = getTitleBlockTemplateLocationFromUser();
if (location.isValid()) { if (location.isValid()) {
saveAs(location.project(), location.name()); saveAs(location);
} }
} }
/** /**
Ask the user for a title block template location Ask the user for a title block template location @return The location chosen
@return The location chosen by the user, or an empty TitleBlockTemplateLocation if the user cancelled the dialog by the user, or an empty TitleBlockTemplateLocation if the user cancelled the
dialog
*/ */
TitleBlockTemplateLocation QETTitleBlockTemplateEditor::getTitleBlockTemplateLocationFromUser() { TitleBlockTemplateLocation QETTitleBlockTemplateEditor::getTitleBlockTemplateLocationFromUser() {
TitleBlockTemplateLocationChooser *chooser = new TitleBlockTemplateLocationChooser(location()); TitleBlockTemplateLocationChooser *chooser = new TitleBlockTemplateLocationChooser(location());

View File

@@ -51,10 +51,8 @@ class QETTitleBlockTemplateEditor : public QMainWindow {
/// actions /// actions
QAction *save_, *save_as_, *quit_, *configure_, *about_qt_, *about_qet_, *merge_cells_, *split_cell_; QAction *save_, *save_as_, *quit_, *configure_, *about_qt_, *about_qet_, *merge_cells_, *split_cell_;
QAction *zoom_in_, *zoom_out_, *zoom_fit_, *zoom_reset_; QAction *zoom_in_, *zoom_out_, *zoom_fit_, *zoom_reset_;
/// Parent project of the currently edited template /// Location of the currently edited template
QETProject *parent_project_; TitleBlockTemplateLocation location_;
/// Name of the currently edited template
QString template_name_;
/// Template Object edited /// Template Object edited
TitleBlockTemplate *tb_template_; TitleBlockTemplate *tb_template_;
/// Template preview /// Template preview
@@ -84,7 +82,11 @@ class QETTitleBlockTemplateEditor : public QMainWindow {
public slots: public slots:
void selectedCellsChanged(QList<TitleBlockCell *>); void selectedCellsChanged(QList<TitleBlockCell *>);
bool edit(const TitleBlockTemplateLocation &);
bool edit(QETProject *, const QString &); bool edit(QETProject *, const QString &);
bool edit(const QString &);
bool editCopyOf(const TitleBlockTemplate *);
bool edit(TitleBlockTemplate *);
void editLogos(); void editLogos();
void save(); void save();
void saveAs(); void saveAs();
@@ -96,7 +98,7 @@ class QETTitleBlockTemplateEditor : public QMainWindow {
void pushGridUndoCommand(TitleBlockTemplateCommand *); void pushGridUndoCommand(TitleBlockTemplateCommand *);
void pushUndoCommand(QUndoCommand *); void pushUndoCommand(QUndoCommand *);
void updateEditorTitle(); void updateEditorTitle();
void saveAs(QETProject *, const QString &); void saveAs(const TitleBlockTemplateLocation &);
}; };
#endif #endif

View File

@@ -43,10 +43,12 @@ TitleBlockTemplateDeleter::~TitleBlockTemplateDeleter() {
*/ */
bool TitleBlockTemplateDeleter::exec() { bool TitleBlockTemplateDeleter::exec() {
if (!template_location_.isValid()) return(false); if (!template_location_.isValid()) return(false);
QETProject *project = template_location_.project();
QString name = template_location_.name();
if (!project -> embeddedTitleBlockTemplates().contains(name)) { QString name = template_location_.name();
TitleBlockTemplatesCollection *collection = template_location_.parentCollection();
if (!collection) return(false);
if (!collection -> templates().contains(name)) {
return(false); return(false);
} }
@@ -65,6 +67,6 @@ bool TitleBlockTemplateDeleter::exec() {
if (answer != QMessageBox::Yes) return(false); if (answer != QMessageBox::Yes) return(false);
// delete the title block template // delete the title block template
project -> removeTemplateByName(name); collection -> removeTemplate(name);
return(true); return(true);
} }

View File

@@ -16,14 +16,16 @@
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>. along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "templatelocation.h" #include "templatelocation.h"
#include "templatescollection.h"
#include "qetapp.h"
/** /**
Constructor Constructor
@param project Parent project of the title block template @param collection Parent collection of the title block template
@param name Name of the title block template within its parent project or collection @param name Name of the title block template within its parent project or collection
*/ */
TitleBlockTemplateLocation::TitleBlockTemplateLocation(QETProject *project, const QString &name) : TitleBlockTemplateLocation::TitleBlockTemplateLocation(const QString &name, TitleBlockTemplatesCollection *collection) :
project_(project), collection_(collection),
name_(name) name_(name)
{ {
} }
@@ -35,18 +37,18 @@ TitleBlockTemplateLocation::~TitleBlockTemplateLocation() {
} }
/** /**
@return the parent project of the template, or 0 if none was defined @return the parent collection of the template, or 0 if none was defined
*/ */
QETProject *TitleBlockTemplateLocation::project() const { TitleBlockTemplatesCollection *TitleBlockTemplateLocation::parentCollection() const {
return(project_); return(collection_);
} }
/** /**
@param project The new parent project of the template, or 0 if none @param project The new parent collection of the template, or 0 if none
applies. applies.
*/ */
void TitleBlockTemplateLocation::setProject(QETProject *project) { void TitleBlockTemplateLocation::setParentCollection(TitleBlockTemplatesCollection *collection) {
project_ = project; collection_ = collection;
} }
/** /**
@@ -67,5 +69,43 @@ void TitleBlockTemplateLocation::setName(const QString &name) {
@return true if this location is null, false otherwise @return true if this location is null, false otherwise
*/ */
bool TitleBlockTemplateLocation::isValid() const { bool TitleBlockTemplateLocation::isValid() const {
return(project_ && !name_.isEmpty()); return(!name_.isEmpty());
}
/**
@return A string representation of the location
*/
QString TitleBlockTemplateLocation::toString() const {
return(protocol() + QString("://") + name_);
}
/**
This is a convenience method equivalent to
parentCollection() -> parentProject().
*/
QETProject *TitleBlockTemplateLocation::parentProject() const {
if (collection_) {
return(collection_ -> parentProject());
}
return(0);
}
/**
This is a convenience method equivalent to
parentCollection() -> protocol().
*/
QString TitleBlockTemplateLocation::protocol() const {
if (collection_) {
return(collection_ -> protocol());
}
return("unknown");
}
/**
This is a convenience method equivalent to
parentCollection() -> getTemplate(...).
*/
TitleBlockTemplate *TitleBlockTemplateLocation::getTemplate() const {
if (!collection_ || name_.isEmpty()) return(0);
return(collection_ -> getTemplate(name_));
} }

View File

@@ -19,6 +19,8 @@
#define TITLEBLOCK_SLASH_TEMPLATE_LOCATION_H #define TITLEBLOCK_SLASH_TEMPLATE_LOCATION_H
#include <QtCore> #include <QtCore>
class QETProject; class QETProject;
class TitleBlockTemplate;
class TitleBlockTemplatesCollection;
/** /**
This class represents the location of a title block template. This class represents the location of a title block template.
@@ -26,20 +28,24 @@ class QETProject;
class TitleBlockTemplateLocation { class TitleBlockTemplateLocation {
// constructor, destructor // constructor, destructor
public: public:
TitleBlockTemplateLocation(QETProject * = 0, const QString & = QString()); TitleBlockTemplateLocation(const QString & = QString(), TitleBlockTemplatesCollection * = 0);
virtual ~TitleBlockTemplateLocation(); virtual ~TitleBlockTemplateLocation();
// methods // methods
public: public:
QETProject *project() const; TitleBlockTemplatesCollection *parentCollection() const;
void setProject(QETProject *); void setParentCollection(TitleBlockTemplatesCollection *);
QString name() const; QString name() const;
void setName(const QString &); void setName(const QString &);
bool isValid() const; bool isValid() const;
QString toString() const;
QETProject *parentProject() const;
QString protocol() const;
TitleBlockTemplate *getTemplate() const;
// attributes // attributes
private: private:
QETProject *project_; ///< Parent project of the template, if any TitleBlockTemplatesCollection *collection_; ///< Collection the template belongs to
QString name_; ///< Name of the template QString name_; ///< Name of the template
}; };
#endif #endif

View File

@@ -1,6 +1,7 @@
#include "templatelocationchooser.h" #include "templatelocationchooser.h"
#include "qetapp.h" #include "qetapp.h"
#include "qetproject.h" #include "qetproject.h"
#include "templatescollection.h"
/** /**
Constructor Constructor
@@ -27,15 +28,14 @@ TitleBlockTemplateLocationChooser::~TitleBlockTemplateLocationChooser() {
@return the current location @return the current location
*/ */
TitleBlockTemplateLocation TitleBlockTemplateLocationChooser::location() const { TitleBlockTemplateLocation TitleBlockTemplateLocationChooser::location() const {
return(TitleBlockTemplateLocation(project(), name())); return(TitleBlockTemplateLocation(name(), collection()));
} }
/** /**
@return the currently selected project @return the currently selected collection
*/ */
QETProject *TitleBlockTemplateLocationChooser::project() const { TitleBlockTemplatesCollection *TitleBlockTemplateLocationChooser::collection() const {
uint project_id = projects_ -> itemData(projects_ -> currentIndex()).toUInt(); return(collections_index_[collections_ -> currentIndex()]);
return(QETApp::project(project_id));
} }
/** /**
@@ -51,15 +51,7 @@ QString TitleBlockTemplateLocationChooser::name() const {
@param location to be displayed by this widget @param location to be displayed by this widget
*/ */
void TitleBlockTemplateLocationChooser::setLocation(const TitleBlockTemplateLocation &location) { void TitleBlockTemplateLocationChooser::setLocation(const TitleBlockTemplateLocation &location) {
// we need a project id collections_ -> setCurrentIndex(collections_index_.keys(location.parentCollection()).first());
int project_id = QETApp::projectId(location.project());
if (project_id == -1) return;
// attempt to find this project id in our project combo box
int project_index = projects_ -> findData(QVariant(static_cast<uint>(project_id)));
if (project_index == -1) return;
projects_ -> setCurrentIndex(project_index);
if (!location.name().isEmpty()) { if (!location.name().isEmpty()) {
int template_index = templates_ -> findText(location.name()); int template_index = templates_ -> findText(location.name());
@@ -76,43 +68,64 @@ void TitleBlockTemplateLocationChooser::setLocation(const TitleBlockTemplateLoca
@param location Initial location displayed by the widget @param location Initial location displayed by the widget
*/ */
void TitleBlockTemplateLocationChooser::init() { void TitleBlockTemplateLocationChooser::init() {
projects_ = new QComboBox(); collections_ = new QComboBox();
templates_ = new QComboBox(); templates_ = new QComboBox();
new_name_ = new QLineEdit(); new_name_ = new QLineEdit();
QMap<uint, QETProject *> projects = QETApp::registeredProjects(); updateCollections();
foreach (uint project_id, projects.keys()) { connect(collections_, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTemplates()));
projects_ -> addItem(projects[project_id] -> title(), project_id); connect(templates_, SIGNAL(currentIndexChanged(int)), this, SLOT(updateNewName()));
}
updateTemplates();
connect(projects_, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTemplates()));
QFormLayout *form_layout = new QFormLayout(); QFormLayout *form_layout = new QFormLayout();
form_layout -> addRow(tr("Projet parent", "used in save as form"), projects_); form_layout -> addRow(tr("Collection parente", "used in save as form"), collections_);
form_layout -> addRow(tr("Mod<EFBFBD>le existant", "used in save as form"), templates_); form_layout -> addRow(tr("Mod<EFBFBD>le existant", "used in save as form"), templates_);
form_layout -> addRow(tr("ou nouveau nom", "used in save as form"), new_name_); form_layout -> addRow(tr("ou nouveau nom", "used in save as form"), new_name_);
setLayout(form_layout); setLayout(form_layout);
} }
/**
Update the collections list
*/
void TitleBlockTemplateLocationChooser::updateCollections() {
collections_ -> clear();
collections_index_.clear();
int index = 0;
foreach(TitleBlockTemplatesCollection *collection, QETApp::availableTitleBlockTemplatesCollections()) {
collections_ -> addItem(collection -> title());
collections_index_.insert(index, collection);
++ index;
}
updateTemplates();
}
/** /**
Update the templates list according to the selected project. Update the templates list according to the selected project.
*/ */
void TitleBlockTemplateLocationChooser::updateTemplates() { void TitleBlockTemplateLocationChooser::updateTemplates() {
int current_index = projects_ -> currentIndex(); TitleBlockTemplatesCollection *current_collection = collection();
if (current_index == -1) return; if (!current_collection) return;
uint project_id = projects_ -> itemData(current_index).toUInt();
QETProject *project = QETApp::project(project_id);
if (!project) return;
templates_ -> clear(); templates_ -> clear();
templates_ -> addItem(tr("Nouveau mod<6F>le (entrez son nom)", "combox box entry"), QVariant(false)); templates_ -> addItem(tr("Nouveau mod<6F>le (entrez son nom)", "combox box entry"), QVariant(false));
QStringList available_templates = project -> embeddedTitleBlockTemplates(); QStringList available_templates = current_collection -> templates();
if (available_templates.count()) { if (available_templates.count()) {
templates_ -> insertSeparator(1); templates_ -> insertSeparator(1);
foreach (QString template_name, available_templates) { foreach (QString template_name, available_templates) {
templates_ -> addItem(template_name, QVariant(true)); templates_ -> addItem(template_name, QVariant(true));
} }
} }
updateNewName();
}
/**
Enable or diable the "new name" text field depending of the selected
template.
*/
void TitleBlockTemplateLocationChooser::updateNewName() {
int template_index = templates_ -> currentIndex();
new_name_ -> setEnabled(!template_index);
} }

View File

@@ -19,6 +19,8 @@
#define TITLEBLOCK_SLASH_LOCATION_CHOOSER_H #define TITLEBLOCK_SLASH_LOCATION_CHOOSER_H
#include <QtGui> #include <QtGui>
#include "templatelocation.h" #include "templatelocation.h"
class TitleBlockTemplateCollection;
/** /**
This class is a widget that allows the user to choose a target title block This class is a widget that allows the user to choose a target title block
template. template.
@@ -35,7 +37,7 @@ class TitleBlockTemplateLocationChooser : public QWidget {
// methods // methods
public: public:
TitleBlockTemplateLocation location() const; TitleBlockTemplateLocation location() const;
QETProject *project() const; TitleBlockTemplatesCollection *collection() const;
QString name() const; QString name() const;
void setLocation(const TitleBlockTemplateLocation &); void setLocation(const TitleBlockTemplateLocation &);
private: private:
@@ -43,11 +45,15 @@ class TitleBlockTemplateLocationChooser : public QWidget {
// slots // slots
private slots: private slots:
void updateCollections();
void updateTemplates(); void updateTemplates();
void updateNewName();
// attributes // attributes
private: private:
QComboBox *projects_; ///< Projects combo box QComboBox *collections_; ///< Collections combo box
/// Collections index within the combo box
QHash<int, TitleBlockTemplatesCollection *> collections_index_;
QComboBox *templates_; ///< Existing templates combo box QComboBox *templates_; ///< Existing templates combo box
QLineEdit *new_name_; ///< New template name textfield QLineEdit *new_name_; ///< New template name textfield
}; };

View File

@@ -0,0 +1,464 @@
/*
Copyright 2006-2012 Xavier Guerrin
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "templatescollection.h"
#include "titleblocktemplate.h"
#include "qetapp.h"
#include "qetproject.h"
/**
Constructor
@param parent Parent QObject
*/
TitleBlockTemplatesCollection::TitleBlockTemplatesCollection(QObject *parent) :
QObject(parent),
protocol_("unknown")
{
}
/**
Destructor
*/
TitleBlockTemplatesCollection::~TitleBlockTemplatesCollection() {
}
/**
@return the title of this collection
*/
QString TitleBlockTemplatesCollection::title() const {
return(title_);
}
/**
@oaram title New title for this collection
*/
void TitleBlockTemplatesCollection::setTitle(const QString &title) {
title_ = title;
}
/**
@return the protocol used by this collection ; examples: commontbt,
customtbt, embedtbt, ...
*/
QString TitleBlockTemplatesCollection::protocol() const {
return(protocol_);
}
/**
Define the protocol for this collection
@param protocol New protocol for this collection
*/
void TitleBlockTemplatesCollection::setProtocol(const QString &protocol) {
if (!protocol.isEmpty()) protocol_ = protocol;
}
/**
@return the project this collection is affiliated to, or 0 if this
collection is not related to any project.
*/
QETProject *TitleBlockTemplatesCollection::parentProject() {
return(0);
}
/**
Constructor
@param project Parent project
@param parent Parent QObject
*/
TitleBlockTemplatesProjectCollection::TitleBlockTemplatesProjectCollection(QETProject *project, QObject *parent) :
TitleBlockTemplatesCollection(parent),
project_(project)
{
}
/**
Destructor
*/
TitleBlockTemplatesProjectCollection::~TitleBlockTemplatesProjectCollection() {
}
/**
@return a human readable title for this collection
*/
QString TitleBlockTemplatesProjectCollection::title() const {
if (!title_.isEmpty()) return(title_);
// if the title attribute is empty, we generate a suitable one using the
// parent project
QString final_title;
if (project_) {
QString project_title = project_ -> title();
if (project_title.isEmpty()) {
final_title = QString(
tr(
"Cartouches du projet sans titre (id %1)",
"collection title when the parent project has an empty title -- %1 is the project internal id"
)
);
final_title = final_title.arg(QETApp::projectId(project_));
} else {
final_title = QString(
tr(
"Cartouches du projet \"%1\"",
"collection title when the project has a suitble title -- %1 is the project title"
)
);
final_title = final_title.arg(project_title);
}
}
return(final_title);
}
/**
@return the protocol used to mention this collection
*/
QString TitleBlockTemplatesProjectCollection::protocol() const {
if (project_) {
int project_id = QETApp::projectId(project_);
if (project_id != -1) {
return(QString("project%1+embedtbt").arg(project_id));
}
}
// fall back on the parent method
return(TitleBlockTemplatesCollection::protocol());
}
/**
@return the parent project of this project collection
*/
QETProject *TitleBlockTemplatesProjectCollection::parentProject() {
return(project_);
}
/**
@return the list of title block templates embedded within the project.
*/
QStringList TitleBlockTemplatesProjectCollection::templates() {
return(titleblock_templates_xml_.keys());
}
/**
@param template_name Name of the requested template
@return the requested template, or 0 if there is no valid template of this
name within the project
*/
TitleBlockTemplate *TitleBlockTemplatesProjectCollection::getTemplate(const QString &template_name){
// Do we have already loaded this template?
if (titleblock_templates_.contains(template_name)) {
return(titleblock_templates_[template_name]);
}
// No? Do we even know of it?
if (!titleblock_templates_xml_.contains(template_name)) {
return(0);
}
// Ok, we have its XML description, we have to generate a TitleBlockTemplate object
TitleBlockTemplate *titleblock_template = new TitleBlockTemplate(this);
if (titleblock_template -> loadFromXmlElement(titleblock_templates_xml_[template_name])) {
titleblock_templates_.insert(template_name, titleblock_template);
return(titleblock_template);
} else {
return(0);
}
}
/**
@param template_name Name of the requested template
@return the XML description of the requested template, or a null QDomElement
if the project does not have such an titleblock template
*/
QDomElement TitleBlockTemplatesProjectCollection::getTemplateXmlDescription(const QString &template_name) {
if (titleblock_templates_xml_.contains(template_name)) {
return(titleblock_templates_xml_[template_name]);
}
return(QDomElement());
}
/**
This methods allows adding or modifying a template embedded within the
project. This method emits the signal changed() if
necessary.
@param template_name Name / Identifier of the template - will be used to
determine whether the given description will be added or will replace an
existing one.
@param xml_elmt An \<titleblocktemplate\> XML element describing the
template. Its "name" attribute must equal to template_name.
@return false if a problem occured, true otherwise
*/
bool TitleBlockTemplatesProjectCollection::setTemplateXmlDescription(const QString &template_name, const QDomElement &xml_elmt) {
// check basic stuff
if (xml_elmt.tagName() != "titleblocktemplate" || xml_elmt.attribute("name") != template_name) {
return(false);
}
// we *require* a project (at least for the moment...)
if (!project_) return(false);
// we import the provided XML element in the project document
QDomElement import = xml_document_.importNode(xml_elmt, true).toElement();
// we either replace the previous description
if (titleblock_templates_xml_.contains(template_name)) {
QDomElement old_description = titleblock_templates_xml_[template_name];
if (!old_description.parentNode().isNull()) {
old_description.parentNode().replaceChild(import, old_description);
}
}
titleblock_templates_xml_.insert(template_name, import);
if (titleblock_templates_.contains(template_name)) {
titleblock_templates_[template_name] -> loadFromXmlElement(titleblock_templates_xml_[template_name]);
}
emit(changed(this, template_name));
return(true);
}
/**
This methods allows removing a template embedded within the project. This
method emits the signal changed() if necessary.
@param template_name Name of the template to be removed
*/
void TitleBlockTemplatesProjectCollection::removeTemplate(const QString &template_name) {
emit(aboutToRemove(this, template_name));
// remove the template itself
titleblock_templates_xml_.remove(template_name);
titleblock_templates_.remove(template_name);
// warn the rest of the world that the list of templates embedded within this project has changed
emit(changed(this, template_name));
}
/**
@param template_name Name of the requested template
@return the location object for the requested template
*/
TitleBlockTemplateLocation TitleBlockTemplatesProjectCollection::location(const QString &template_name) {
return(TitleBlockTemplateLocation(template_name, this));
}
/**
@return true if this collection is read only
*/
bool TitleBlockTemplatesProjectCollection::isReadOnly() const {
if (project_) {
return(project_ -> isReadOnly());
}
return(false);
}
/**
@param xml_element XML element to be parsed to load title block templates
*/
void TitleBlockTemplatesProjectCollection::fromXml(const QDomElement &xml_element) {
foreach (QDomElement e, QET::findInDomElement(xml_element, "titleblocktemplates", "titleblocktemplate")) {
// each titleblock template must have a name
if (!e.hasAttribute("name")) continue;
QString titleblock_template_name = e.attribute("name");
// if several templates have the same name, we keep the first one encountered
if (titleblock_templates_xml_.contains(titleblock_template_name)) continue;
// we simply store the XML element describing the titleblock template,
// without any further analysis for the moment
titleblock_templates_xml_.insert(titleblock_template_name, e);
}
}
/**
Constructor
@param path Path of the directory containing the collection
@param parent Parent QObject
*/
TitleBlockTemplatesFilesCollection::TitleBlockTemplatesFilesCollection(const QString &path, QObject *parent) :
TitleBlockTemplatesCollection(parent),
dir_(
path,
QString("*%1").arg(TITLEBLOCKS_FILE_EXTENSION),
QDir::SortFlags(QDir::Name | QDir::IgnoreCase),
QDir::Readable | QDir::Files
)
{
if (dir_.exists()) {
watcher_.addPath(dir_.canonicalPath());
}
connect(&watcher_, SIGNAL(directoryChanged(const QString &)), this, SLOT(fileSystemChanged(const QString &)));
}
/**
Destructor
*/
TitleBlockTemplatesFilesCollection::~TitleBlockTemplatesFilesCollection() {
}
/**
@return the canonical path of the directory hosting this collection.
*/
QString TitleBlockTemplatesFilesCollection::path(const QString &template_name) const {
if (template_name.isEmpty()) {
return(dir_.canonicalPath());
} else {
return(dir_.absoluteFilePath(toFileName(template_name)));
}
}
/**
@return the list of templates contained in this collection
*/
QStringList TitleBlockTemplatesFilesCollection::templates() {
QStringList templates_names;
QRegExp replace_regexp(QString("%1$").arg(TITLEBLOCKS_FILE_EXTENSION));
foreach(QString name, dir_.entryList()) {
templates_names << name.replace(replace_regexp, "");
}
return(templates_names);
}
/**
@return the template which name is \a template_name, or 0 if the template
could not be loaded.
*/
TitleBlockTemplate *TitleBlockTemplatesFilesCollection::getTemplate(const QString &template_name) {
if (!templates().contains(template_name)) return(0);
TitleBlockTemplate *tbtemplate = new TitleBlockTemplate();
QString tbt_file_path = path(template_name);
bool loading = tbtemplate -> loadFromXmlFile(tbt_file_path);
if (!loading) {
delete tbtemplate;
return(0);
}
return(tbtemplate);
}
/**
@param template_name Name of a template (which has to already exist)
@return the XML description for the \a template_name template, or a null QDomElement if no such template exists.
*/
QDomElement TitleBlockTemplatesFilesCollection::getTemplateXmlDescription(const QString &template_name) {
QString xml_file_path = path(template_name);
QFileInfo xml_file_info(xml_file_path);
if (!xml_file_info.exists() || !xml_file_info.isReadable()) {
return(QDomElement());
}
QFile xml_file(xml_file_path);
if (!xml_file.open(QIODevice::ReadOnly)) {
return(QDomElement());
}
QDomDocument *xml_document = new QDomDocument();
bool xml_parsing = xml_document -> setContent(&xml_file);
if (!xml_parsing) {
delete xml_document;
return(QDomElement());
}
return(xml_document -> documentElement());
}
/**
Set the XML description of the \a template_name template to \a xml_element.
@param template_name Name of a template (which does not have to already exist)
@param xml_element XML element describing the template
*/
bool TitleBlockTemplatesFilesCollection::setTemplateXmlDescription(const QString &template_name, const QDomElement &xml_element) {
if (template_name.isEmpty()) return(false);
// prevent the watcher from emitting signals while we open and write to file
blockSignals(true);
QFile xml_file(path(template_name));
if (!xml_file.open(QIODevice::WriteOnly | QIODevice::Text)) {
return(false);
}
QDomDocument doc;
doc.appendChild(doc.importNode(xml_element, true));
QTextStream out(&xml_file);
out.setCodec("UTF-8");
out << doc.toString(4);
xml_file.close();
// emit a single signal for the change
blockSignals(false);
emit(changed(this, template_name));
return(true);
}
/**
Remove the \a template_name template.
*/
void TitleBlockTemplatesFilesCollection::removeTemplate(const QString &template_name) {
emit(aboutToRemove(this, template_name));
// prevent the watcher from emitting signals while we open and write to file
blockSignals(true);
dir_.remove(toFileName(template_name));
// emit a single signal for the removal
blockSignals(false);
emit(changed(this, template_name));
}
/**
@param template_name Name of a template supposed to be contained within
this collection.
@return
*/
TitleBlockTemplateLocation TitleBlockTemplatesFilesCollection::location(const QString &template_name) {
return(TitleBlockTemplateLocation(template_name, this));
}
/**
@return true if this collection is read only, false otherwise
*/
bool TitleBlockTemplatesFilesCollection::isReadOnly() const {
QFileInfo info(dir_.canonicalPath());
return(!info.isWritable());
}
/**
@param file_name A file name
@return the template name for \a file_name
*/
QString TitleBlockTemplatesFilesCollection::toTemplateName(const QString &file_name) {
static QRegExp replace_regexp(QString("%1$").arg(TITLEBLOCKS_FILE_EXTENSION));
QString template_name(file_name);
return(template_name.replace(replace_regexp, ""));
}
/**
@param template_name A template name
@return the file name for \a template_name
*/
QString TitleBlockTemplatesFilesCollection::toFileName(const QString &template_name) {
return(QString("%1%2").arg(template_name).arg(TITLEBLOCKS_FILE_EXTENSION));
}
/**
Handle the changes occuring on the file system.
@param str Path of the directory that changed.
*/
void TitleBlockTemplatesFilesCollection::fileSystemChanged(const QString &str) {
Q_UNUSED(str);
dir_.refresh();
emit(changed(this));
}

View File

@@ -0,0 +1,148 @@
/*
Copyright 2006-2012 Xavier Guerrin
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TITLEBLOCK_SLASH_TEMPLATES_COLLECTION_H
#define TITLEBLOCK_SLASH_TEMPLATES_COLLECTION_H
#define TITLEBLOCKS_FILE_EXTENSION ".titleblock"
#include <QtCore>
#include <QtXml>
#include "templatelocation.h"
class TitleBlockTemplate;
class QETProject;
/**
This abstract class represents a generic collection of title block templates.
Unlike elements collections, title block templates collections do not provide
a tree structure. Instead, they provide a simple, flat list of available
templates.
*/
class TitleBlockTemplatesCollection : public QObject {
Q_OBJECT
// Constructors, destructor
public:
TitleBlockTemplatesCollection(QObject *parent);
virtual ~TitleBlockTemplatesCollection();
private:
TitleBlockTemplatesCollection(const TitleBlockTemplatesCollection &);
// methods
public:
virtual QStringList templates() = 0;
virtual TitleBlockTemplate *getTemplate(const QString &) = 0;
virtual QDomElement getTemplateXmlDescription(const QString &) = 0;
virtual bool setTemplateXmlDescription(const QString &, const QDomElement &) = 0;
virtual void removeTemplate(const QString &) = 0;
virtual TitleBlockTemplateLocation location(const QString & = QString()) = 0;
virtual bool isReadOnly() const = 0;
virtual QString title() const;
virtual void setTitle(const QString &);
virtual QString protocol() const;
virtual void setProtocol(const QString &);
virtual QETProject *parentProject();
signals:
void changed(TitleBlockTemplatesCollection *, const QString & = QString());
void aboutToRemove(TitleBlockTemplatesCollection *, const QString &);
// attributes
protected:
/// Human-readable title for this collection
QString title_;
/// Protocol used to designate this collection
QString protocol_;
/// Already parsed embedded titleblock templates
QHash<QString, TitleBlockTemplate *> titleblock_templates_;
};
/**
This class represents a simple abastraction layer for a collection of title
block templates embedded within a project.
*/
class TitleBlockTemplatesProjectCollection : public TitleBlockTemplatesCollection {
Q_OBJECT
// Constructors, destructor
public:
TitleBlockTemplatesProjectCollection(QETProject *, QObject *parent = 0);
virtual ~TitleBlockTemplatesProjectCollection();
private:
TitleBlockTemplatesProjectCollection(const TitleBlockTemplatesProjectCollection &);
// methods
public:
virtual QString title() const;
virtual QString protocol() const;
virtual QETProject *parentProject();
virtual QStringList templates();
virtual TitleBlockTemplate *getTemplate(const QString &);
virtual QDomElement getTemplateXmlDescription(const QString &);
virtual bool setTemplateXmlDescription(const QString &, const QDomElement &);
virtual void removeTemplate(const QString &);
virtual TitleBlockTemplateLocation location(const QString & = QString());
virtual bool isReadOnly() const;
virtual void fromXml(const QDomElement &);
// attributes
private:
/// Parent project
QETProject *project_;
/// Parent QDomDocument for stored QDomElements
QDomDocument xml_document_;
/// XML descriptions of embedded titleblock templates
QHash<QString, QDomElement> titleblock_templates_xml_;
};
/**
This classe represents a simple abastraction layer for a file-based title
block templates directory.
*/
class TitleBlockTemplatesFilesCollection : public TitleBlockTemplatesCollection {
Q_OBJECT
// Constructors, destructor
public:
TitleBlockTemplatesFilesCollection(const QString &, QObject * = 0);
virtual ~TitleBlockTemplatesFilesCollection();
private:
TitleBlockTemplatesFilesCollection(const TitleBlockTemplatesFilesCollection &);
// methods
public:
QString path(const QString & = QString()) const;
virtual QStringList templates();
virtual TitleBlockTemplate *getTemplate(const QString &);
virtual QDomElement getTemplateXmlDescription(const QString &);
virtual bool setTemplateXmlDescription(const QString &, const QDomElement &);
virtual void removeTemplate(const QString &);
virtual TitleBlockTemplateLocation location(const QString & = QString());
virtual bool isReadOnly() const;
static QString toTemplateName(const QString &);
static QString toFileName(const QString &);
private slots:
void fileSystemChanged(const QString &str);
// attributes
private:
/// File System Watcher object to track the files changes made outside the application
QFileSystemWatcher watcher_;
/// Collection real directory
QDir dir_;
};
#endif