diff --git a/sources/bordertitleblock.cpp b/sources/bordertitleblock.cpp index 8d77d6e08..4d25cfb0f 100644 --- a/sources/bordertitleblock.cpp +++ b/sources/bordertitleblock.cpp @@ -192,8 +192,8 @@ void BorderTitleBlock::importTitleBlock(const TitleBlockProperties &ip) { setFolio(ip.folio); additional_fields_ = ip.context; - emit(needFolioData()); - updateDiagramContextForTitleBlock(); + emit(needFolioData()); // Note: we expect additional data to be provided + // through setFolioData(), which in turn calls updateDiagramContextForTitleBlock(). emit(needTitleBlockTemplate(ip.template_name)); } @@ -572,10 +572,16 @@ DiagramPosition BorderTitleBlock::convertPosition(const QPointF &pos) { /** Update the informations given to the titleblock template by regenerating a DiagramContext object. + @param initial_context Base diagram context that will be overridden by + diagram-wide values */ -void BorderTitleBlock::updateDiagramContextForTitleBlock() { - // our final DiagramContext object is the "additional fields" one - DiagramContext context = additional_fields_; +void BorderTitleBlock::updateDiagramContextForTitleBlock(const DiagramContext &initial_context) { + // Our final DiagramContext is the initial one (which is supposed to bring + // project-wide properties), overridden by the "additional fields" one... + DiagramContext context = initial_context; + foreach (QString key, additional_fields_.keys()) { + context.addValue(key, additional_fields_[key]); + } // ... overridden by the historical and/or dynamically generated fields context.addValue("author", bi_author); @@ -609,8 +615,9 @@ QString BorderTitleBlock::incrementLetters(const QString &string) { /** @param index numero du schema (de 1 a total) @param total nombre total de schemas dans le projet + @param project_properties Project-wide properties, to be merged with diagram-wide ones. */ -void BorderTitleBlock::setFolioData(int index, int total) { +void BorderTitleBlock::setFolioData(int index, int total, const DiagramContext &project_properties) { if (index < 1 || total < 1 || index > total) return; // memorise les informations @@ -622,5 +629,5 @@ void BorderTitleBlock::setFolioData(int index, int total) { bi_final_folio.replace("%id", QString::number(folio_index_)); bi_final_folio.replace("%total", QString::number(folio_total_)); - updateDiagramContextForTitleBlock(); + updateDiagramContextForTitleBlock(project_properties); } diff --git a/sources/bordertitleblock.h b/sources/bordertitleblock.h index 8467061d5..adfe3d5dd 100644 --- a/sources/bordertitleblock.h +++ b/sources/bordertitleblock.h @@ -142,7 +142,7 @@ class BorderTitleBlock : public QObject { } /// @param folio le nouveau contenu du champ "Folio" void setFolio (const QString &folio) { bi_folio = folio; } - void setFolioData(int, int); + void setFolioData(int, int, const DiagramContext & = DiagramContext()); /// @param filename le nouveau contenu du champ "Fichier" void setFileName (const QString &filename) { bi_filename = filename; } @@ -172,7 +172,7 @@ class BorderTitleBlock : public QObject { private: void updateRectangles(); - void updateDiagramContextForTitleBlock(); + void updateDiagramContextForTitleBlock(const DiagramContext & = DiagramContext()); QString incrementLetters(const QString &); // signaux diff --git a/sources/projectconfigpages.cpp b/sources/projectconfigpages.cpp index 07a93dfff..c56a7246c 100644 --- a/sources/projectconfigpages.cpp +++ b/sources/projectconfigpages.cpp @@ -3,6 +3,7 @@ #include "qetproject.h" #include "borderpropertieswidget.h" #include "conductorpropertieswidget.h" +#include "diagramcontextwidget.h" #include "titleblockpropertieswidget.h" #include @@ -105,6 +106,7 @@ QIcon ProjectMainConfigPage::icon() const { */ void ProjectMainConfigPage::applyProjectConf() { project_ -> setTitle(title_value_ -> text()); + project_ -> setProjectProperties(project_variables_ -> context()); } /** @@ -120,6 +122,14 @@ QString ProjectMainConfigPage::projectTitle() const { void ProjectMainConfigPage::initWidgets() { title_label_ = new QLabel(tr("Titre du projet\240:", "label when configuring")); title_value_ = new QLineEdit(); + project_variables_label_ = new QLabel( + tr( + "Vous pouvez d\351finir ci-dessous des variables qui seront disponibles pour tous les sch\351mas de ce projet (typiquement pour les cartouches).", + "informative label" + ) + ); + project_variables_ = new DiagramContextWidget(); + project_variables_ -> setContext(DiagramContext()); } /** @@ -131,7 +141,8 @@ void ProjectMainConfigPage::initLayout() { title_layout0 -> addWidget(title_label_); title_layout0 -> addWidget(title_value_); main_layout0 -> addLayout(title_layout0); - main_layout0 -> addStretch(); + main_layout0 -> addWidget(project_variables_label_); + main_layout0 -> addWidget(project_variables_); setLayout(main_layout0); } @@ -140,6 +151,7 @@ void ProjectMainConfigPage::initLayout() { */ void ProjectMainConfigPage::readValuesFromProject() { title_value_ -> setText(project_ -> title()); + project_variables_ -> setContext(project_ -> projectProperties()); } /** diff --git a/sources/projectconfigpages.h b/sources/projectconfigpages.h index 97a1f9448..1070b5b25 100644 --- a/sources/projectconfigpages.h +++ b/sources/projectconfigpages.h @@ -7,6 +7,7 @@ class QETProject; class BorderPropertiesWidget; class TitleBlockPropertiesWidget; class ConductorPropertiesWidget; +class DiagramContextWidget; /** This class, derived from ConfigPage, aims at providing the basic skeleton @@ -88,6 +89,8 @@ class ProjectMainConfigPage : public ProjectConfigPage { protected: QLabel *title_label_; QLineEdit *title_value_; + QLabel *project_variables_label_; + DiagramContextWidget *project_variables_; }; /** diff --git a/sources/qetproject.cpp b/sources/qetproject.cpp index 52f8882a1..505432158 100644 --- a/sources/qetproject.cpp +++ b/sources/qetproject.cpp @@ -417,6 +417,11 @@ QDomDocument QETProject::toXml() { project_root.appendChild(titleblocktemplates_elmt); } + // project-wide properties + QDomElement project_properties = xml_doc.createElement("properties"); + writeProjectPropertiesXml(project_properties); + project_root.appendChild(project_properties); + // proprietes pour les nouveaux schemas QDomElement new_diagrams_properties = xml_doc.createElement("newdiagrams"); writeDefaultPropertiesXml(new_diagrams_properties); @@ -900,6 +905,9 @@ void QETProject::readProjectXml() { state_ = ProjectParsingFailed; } + // load the project-wide properties + readProjectPropertiesXml(); + // charge les proprietes par defaut pour les nouveaux schemas readDefaultPropertiesXml(); @@ -979,6 +987,22 @@ void QETProject::readElementsCollectionXml() { connect(collection_, SIGNAL(written()), this, SLOT(componentWritten())); } +/** + Load project properties from the XML description of the project +*/ +void QETProject::readProjectPropertiesXml() { + foreach (QDomElement e, QET::findInDomElement(document_root_.documentElement(), "properties")) { + project_properties_.fromXml(e); + } +} + +/** + Export project properties under the \a xml_element XML element. +*/ +void QETProject::writeProjectPropertiesXml(QDomElement &xml_element) { + project_properties_.toXml(xml_element); +} + /** Charge les proprietes par defaut des nouveaux schemas depuis la description XML du projet : @@ -1139,6 +1163,21 @@ bool QETProject::diagramsWereModified() { return(!(diagrams_[0] -> undoStack().isClean())); } +/** + @return the project-wide properties made available to child diagrams. +*/ +DiagramContext QETProject::projectProperties() { + return(project_properties_); +} + +/** + Use \a context as project-wide properties made available to child diagrams. +*/ +void QETProject::setProjectProperties(const DiagramContext &context) { + project_properties_ = context; + updateDiagramsFolioData(); +} + /** Cette methode sert a reperer un projet vide, c-a-d un projet identique a ce que l'on obtient en faisant Fichier > Nouveau. @@ -1166,7 +1205,7 @@ bool QETProject::projectWasModified() { void QETProject::updateDiagramsFolioData() { int total_folio = diagrams_.count(); for (int i = 0 ; i < total_folio ; ++ i) { - diagrams_[i] -> border_and_titleblock.setFolioData(i + 1, total_folio); + diagrams_[i] -> border_and_titleblock.setFolioData(i + 1, total_folio, project_properties_); } } diff --git a/sources/qetproject.h b/sources/qetproject.h index c84b5537a..890ee165a 100644 --- a/sources/qetproject.h +++ b/sources/qetproject.h @@ -115,6 +115,8 @@ class QETProject : public QObject { bool projectWasModified(); bool embeddedCollectionWasModified(); bool diagramsWereModified(); + DiagramContext projectProperties(); + void setProjectProperties(const DiagramContext &); public slots: void componentWritten(); @@ -146,6 +148,8 @@ class QETProject : public QObject { void readDiagramsXml(); void readElementsCollectionXml(); void readEmbeddedTemplatesXml(); + void readProjectPropertiesXml(); + void writeProjectPropertiesXml(QDomElement &); void readDefaultPropertiesXml(); void writeDefaultPropertiesXml(QDomElement &); void addDiagram(Diagram *); @@ -182,6 +186,8 @@ class QETProject : public QObject { TitleBlockProperties default_titleblock_properties_; /// Embedded title block templates collection TitleBlockTemplatesProjectCollection titleblocks_; + /// project-wide variables that will be made available to child diagrams + DiagramContext project_properties_; }; Q_DECLARE_METATYPE(QETProject *) #endif