[qet] [1142] The user can now specify his own name/value pairs at three levels:

[ Thread Index | Date Index | More lists.tuxfamily.org/qet Archives ]


Revision: 1142
Author:   xavier
Date:     2011-01-09 16:16:51 +0100 (Sun, 09 Jan 2011)
Log Message:
-----------
The user can now specify his own name/value pairs at three levels:
  * user configuration level (qelectrotech.conf): default configuration for new projects
  * project level (.qet file): default configuration for new diagrams
  * diagram level (title block properties): names and values may be used by the title block template

Modified Paths:
--------------
    branches/0.3/sources/bordertitleblock.cpp
    branches/0.3/sources/bordertitleblock.h
    branches/0.3/sources/diagramcontext.cpp
    branches/0.3/sources/diagramcontext.h
    branches/0.3/sources/templateeditor.cpp
    branches/0.3/sources/titleblockproperties.cpp
    branches/0.3/sources/titleblockproperties.h
    branches/0.3/sources/titleblockpropertieswidget.cpp
    branches/0.3/sources/titleblockpropertieswidget.h

Modified: branches/0.3/sources/bordertitleblock.cpp
===================================================================
--- branches/0.3/sources/bordertitleblock.cpp	2011-01-09 00:01:38 UTC (rev 1141)
+++ branches/0.3/sources/bordertitleblock.cpp	2011-01-09 15:16:51 UTC (rev 1142)
@@ -18,7 +18,6 @@
 #include <QPainter>
 #include "titleblocktemplate.h"
 #include "titleblocktemplaterenderer.h"
-#include "diagramcontext.h"
 #include "bordertitleblock.h"
 #include "diagramposition.h"
 #include "qetapp.h"
@@ -94,16 +93,7 @@
 	@param xml_elmt the XML element attributes will be added to
 */
 void BorderTitleBlock::titleBlockToXml(QDomElement &xml_elmt) {
-	if (!author().isNull())    xml_elmt.setAttribute("author",   author());
-	if (!date().isNull())      xml_elmt.setAttribute("date",     date().toString("yyyyMMdd"));
-	if (!title().isNull())     xml_elmt.setAttribute("title",    title());
-	if (!fileName().isNull())  xml_elmt.setAttribute("filename", fileName());
-	if (!folio().isNull())     xml_elmt.setAttribute("folio",    folio());
-	
-	QString current_template_name = titleBlockTemplateName();
-	if (!current_template_name.isEmpty()) {
-		xml_elmt.setAttribute("titleblocktemplate", current_template_name);
-	}
+	exportTitleBlock().toXml(xml_elmt);
 }
 
 /**
@@ -111,12 +101,9 @@
 	@param xml_elmt the XML element values will be read from
 */
 void BorderTitleBlock::titleBlockFromXml(const QDomElement &xml_elmt) {
-	setAuthor(xml_elmt.attribute("author"));
-	setTitle(xml_elmt.attribute("title"));
-	setDate(QDate::fromString(xml_elmt.attribute("date"), "yyyyMMdd"));
-	setFileName(xml_elmt.attribute("filename"));
-	setFolio(xml_elmt.attribute("folio"));
-	needTitleBlockTemplate(xml_elmt.attribute("titleblocktemplate", ""));
+	TitleBlockProperties tbp;
+	tbp.fromXml(xml_elmt);
+	importTitleBlock(tbp);
 }
 
 /**
@@ -177,12 +164,15 @@
 */
 TitleBlockProperties BorderTitleBlock::exportTitleBlock() {
 	TitleBlockProperties ip;
-	ip.author = bi_author;
-	ip.date = bi_date;
-	ip.title = bi_title;
-	ip.folio = bi_folio;
-	ip.filename = bi_filename;
+	
+	ip.author = author();
+	ip.date = date();
+	ip.title = title();
+	ip.filename = fileName();
+	ip.folio = folio();
 	ip.template_name = titleBlockTemplateName();
+	ip.context = additional_fields_;
+	
 	return(ip);
 }
 
@@ -190,13 +180,15 @@
 	@param ip les nouvelles proprietes du cartouche
 */
 void BorderTitleBlock::importTitleBlock(const TitleBlockProperties &ip) {
-	bi_author = ip.author;
-	bi_date = ip.date;
+	setAuthor(ip.author);
+	setDate(ip.date);
 	setTitle(ip.title);
-	bi_folio = ip.folio;
-	bi_filename = ip.filename;
-	updateDiagramContextForTitleBlock();
+	setFileName(ip.filename);
+	setFolio(ip.folio);
+	additional_fields_ = ip.context;
+	
 	emit(needFolioData());
+	updateDiagramContextForTitleBlock();
 	emit(needTitleBlockTemplate(ip.template_name));
 }
 
@@ -577,7 +569,10 @@
 	DiagramContext object.
 */
 void BorderTitleBlock::updateDiagramContextForTitleBlock() {
-	DiagramContext context;
+	// our final DiagramContext object is the "additional fields" one
+	DiagramContext context = additional_fields_;
+	
+	// ... overridden by the historical and/or dynamically generated fields
 	context.addValue("author",      bi_author);
 	context.addValue("date",        bi_date.toString("dd/MM/yyyy"));
 	context.addValue("title",       bi_title);

Modified: branches/0.3/sources/bordertitleblock.h
===================================================================
--- branches/0.3/sources/bordertitleblock.h	2011-01-09 00:01:38 UTC (rev 1141)
+++ branches/0.3/sources/bordertitleblock.h	2011-01-09 15:16:51 UTC (rev 1142)
@@ -17,6 +17,7 @@
 */
 #ifndef BORDERTITLEBLOCK_H
 #define BORDERTITLEBLOCK_H
+#include "diagramcontext.h"
 #include "titleblockproperties.h"
 #include "borderproperties.h"
 #include <QObject>
@@ -216,6 +217,7 @@
 	int folio_index_;
 	int folio_total_;
 	QString bi_filename;
+	DiagramContext additional_fields_;
 	
 	// dimensions du cadre (lignes et colonnes)
 	// colonnes : nombres et dimensions

Modified: branches/0.3/sources/diagramcontext.cpp
===================================================================
--- branches/0.3/sources/diagramcontext.cpp	2011-01-09 00:01:38 UTC (rev 1141)
+++ branches/0.3/sources/diagramcontext.cpp	2011-01-09 15:16:51 UTC (rev 1142)
@@ -55,6 +55,14 @@
 	return(false);
 }
 
+bool DiagramContext::operator==(const DiagramContext &dc) const {
+	return(content_ == dc.content_);
+}
+
+bool DiagramContext::operator!=(const DiagramContext &dc) const {
+	return(!(*this == dc));
+}
+
 /**
 	@param key a key string
 	@return true if that key is acceptable, false otherwise

Modified: branches/0.3/sources/diagramcontext.h
===================================================================
--- branches/0.3/sources/diagramcontext.h	2011-01-09 00:01:38 UTC (rev 1141)
+++ branches/0.3/sources/diagramcontext.h	2011-01-09 15:16:51 UTC (rev 1142)
@@ -32,6 +32,9 @@
 	const QVariant operator[](const QString &) const;
 	bool addValue(const QString &, const QVariant &);
 	
+	bool operator==(const DiagramContext &) const;
+	bool operator!=(const DiagramContext &) const;
+	
 	private:
 	bool keyIsAcceptable(const QString &) const;
 	/// Diagram context data (key/value pairs)

Modified: branches/0.3/sources/templateeditor.cpp
===================================================================
--- branches/0.3/sources/templateeditor.cpp	2011-01-09 00:01:38 UTC (rev 1141)
+++ branches/0.3/sources/templateeditor.cpp	2011-01-09 15:16:51 UTC (rev 1142)
@@ -100,7 +100,7 @@
 		QMessageBox::critical(
 			this,
 			tr("Code XML non valide"),
-			tr("Le code XML du mod\350le ne semble pas \320tre valide. Impossible d'enregistrer le mod\350le.")
+			tr("Le code XML du mod\350le ne semble pas \352tre valide. Impossible d'enregistrer le mod\350le.")
 		);
 		return;
 	}

Modified: branches/0.3/sources/titleblockproperties.cpp
===================================================================
--- branches/0.3/sources/titleblockproperties.cpp	2011-01-09 00:01:38 UTC (rev 1141)
+++ branches/0.3/sources/titleblockproperties.cpp	2011-01-09 15:16:51 UTC (rev 1142)
@@ -16,6 +16,7 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "titleblockproperties.h"
+#include "qet.h"
 
 /**
 	Constructeur. Initialise un objet TitleBlockProperties avec tous les champs
@@ -44,7 +45,8 @@
 		ip.date == date &&\
 		ip.filename == filename &&\
 		ip.folio == folio &&\
-		ip.template_name == template_name
+		ip.template_name == template_name &&\
+		ip.context == context
 	);
 }
 
@@ -70,19 +72,40 @@
 	if (!template_name.isEmpty()) {
 		e.setAttribute("titleblocktemplate", template_name);
 	}
+	
+	if (context.keys().count()) {
+		QDomElement properties = e.ownerDocument().createElement("properties");
+		foreach (QString key, context.keys()) {
+			QDomElement property = e.ownerDocument().createElement("property");
+			property.setAttribute("name", key);
+			QDomText value = e.ownerDocument().createTextNode(context[key].toString());
+			property.appendChild(value);
+			properties.appendChild(property);
+		}
+		e.appendChild(properties);
+	}
 }
 
 /**
 	Importe le cartouche a partir des attributs XML de l'element e
 	@param e Element XML dont les attributs seront lus
 */
-void TitleBlockProperties::fromXml(QDomElement &e) {
+void TitleBlockProperties::fromXml(const QDomElement &e) {
+	// reads the historical fields
 	if (e.hasAttribute("author"))      author   = e.attribute("author");
 	if (e.hasAttribute("title"))       title    = e.attribute("title");
 	if (e.hasAttribute("filename"))    filename = e.attribute("filename");
 	if (e.hasAttribute("folio"))       folio    = e.attribute("folio");
 	if (e.hasAttribute("date"))        setDateFromString(e.attribute("date"));
+	
+	// reads the template used to render the title block
 	if (e.hasAttribute("titleblocktemplate")) template_name = e.attribute("titleblocktemplate");
+	
+	// reads the additional fields used to fill the title block
+	foreach (QDomElement property, QET::findInDomElement(e, "properties", "property")) {
+		if (!property.hasAttribute("name")) continue;
+		context.addValue(property.attribute("name"), QVariant(property.text()));
+	}
 }
 
 /**
@@ -96,6 +119,15 @@
 	settings.setValue(prefix + "filename", filename);
 	settings.setValue(prefix + "folio",    folio);
 	settings.setValue(prefix + "date",     exportDate());
+	
+	settings.beginWriteArray(prefix + "properties");
+	int i = 0;
+	foreach (QString key, context.keys()) {
+		settings.setArrayIndex(i);
+		settings.setValue("name", key);
+		settings.setValue("value", context[key].toString());
+	}
+	settings.endArray();
 }
 
 /**
@@ -109,6 +141,15 @@
 	filename = settings.value(prefix + "filename").toString();
 	folio    = settings.value(prefix + "folio", "%id/%total").toString();
 	setDateFromString(settings.value(prefix + "date").toString());
+	
+	int size = settings.beginReadArray(prefix + "properties");
+	for (int i = 0 ; i < size; ++ i) {
+		settings.setArrayIndex(i);
+		QString key = settings.value("name").toString();
+		if (key.isEmpty()) continue;
+		context.addValue(key, settings.value("value").toString());
+	}
+	settings.endArray();
 }
 
 /**

Modified: branches/0.3/sources/titleblockproperties.h
===================================================================
--- branches/0.3/sources/titleblockproperties.h	2011-01-09 00:01:38 UTC (rev 1141)
+++ branches/0.3/sources/titleblockproperties.h	2011-01-09 15:16:51 UTC (rev 1142)
@@ -19,6 +19,7 @@
 #define TITLEBLOCK_PROPERTIES_H
 #include <QtCore>
 #include <QtXml>
+#include "diagramcontext.h"
 /**
 	Cette classe est un conteneur pour les proprietes d'un cartouche de schema
 	: titre, auteur, date, nom de fichier et folio
@@ -37,7 +38,7 @@
 	bool operator!=(const TitleBlockProperties &);
 	
 	void toXml(QDomElement &) const;
-	void fromXml(QDomElement &);
+	void fromXml(const QDomElement &);
 	void toSettings(QSettings &, const QString & = QString()) const;
 	void fromSettings(QSettings &, const QString & = QString());
 	
@@ -51,6 +52,7 @@
 	QString folio;            ///< Folio affiche par le cartouche
 	DateManagement useDate;   ///< Indique s'il faut utiliser ou non l'attribut date
 	QString template_name;    ///< Name of the template used to render the title block - an empty string means "the default template provided by the application"
+	DiagramContext context;   ///< Container for the additional, user-defined fields
 	
 	private:
 	QString exportDate() const;

Modified: branches/0.3/sources/titleblockpropertieswidget.cpp
===================================================================
--- branches/0.3/sources/titleblockpropertieswidget.cpp	2011-01-09 00:01:38 UTC (rev 1141)
+++ branches/0.3/sources/titleblockpropertieswidget.cpp	2011-01-09 15:16:51 UTC (rev 1142)
@@ -25,71 +25,16 @@
 	@param current true pour afficher l'option "Date courante"
 	@param parent QWidget parent
 */
-TitleBlockPropertiesWidget::TitleBlockPropertiesWidget(const TitleBlockProperties &titleblock, bool current, QWidget *parent) : QWidget(parent), display_current_date(false) {
+TitleBlockPropertiesWidget::TitleBlockPropertiesWidget(const TitleBlockProperties &titleblock, bool current, QWidget *parent) :
+	QWidget(parent),
+	display_current_date(false)
+{
+	initWidgets(titleblock);
+	initLayouts();
+	connect(tabbar, SIGNAL(currentChanged(int)), stack_layout, SLOT(setCurrentIndex(int)));
 	
-	QVBoxLayout *this_layout = new QVBoxLayout(this);
-	this_layout -> setContentsMargins(0, 0, 0, 0);
-	QGroupBox *titleblock_infos = new QGroupBox(tr("Informations du cartouche"), this);
-	titleblock_infos -> setMinimumSize(300, 330);
-	this_layout -> addWidget(titleblock_infos);
-	
-	titleblock_template_label = new QLabel(tr("Mod\350le :"));
-	titleblock_template_name = new QComboBox();
-	
-	titleblock_title = new QLineEdit(this);
-	titleblock_author = new QLineEdit(this);
-	
-	QButtonGroup *date_policy_group = new QButtonGroup(this);
-	titleblock_no_date = new QRadioButton(tr("Pas de date"), this);
-	titleblock_current_date = new QRadioButton(tr("Date courante"), this);
-	titleblock_fixed_date = new QRadioButton(tr("Date fixe : "), this);
-	date_policy_group -> addButton(titleblock_no_date);
-	date_policy_group -> addButton(titleblock_current_date);
-	date_policy_group -> addButton(titleblock_fixed_date);
-	titleblock_date = new QDateEdit(QDate::currentDate(), this);
-	titleblock_date -> setEnabled(titleblock_fixed_date -> isChecked());
-	titleblock_current_date -> setVisible(display_current_date);
-	connect(titleblock_fixed_date, SIGNAL(toggled(bool)), titleblock_date, SLOT(setEnabled(bool)));
-	titleblock_date -> setCalendarPopup(true);
-	
-	QGridLayout *layout_date = new QGridLayout();
-	layout_date -> addWidget(titleblock_no_date,      0, 0);
-	layout_date -> addWidget(titleblock_current_date, 1, 0);
-	layout_date -> addWidget(titleblock_fixed_date,   2, 0);
-	layout_date -> addWidget(titleblock_date,         2, 1);
-	layout_date -> setColumnStretch(0, 1);
-	layout_date -> setColumnStretch(1, 500);
-	
-	titleblock_filename = new QLineEdit(this);
-	titleblock_folio = new QLineEdit(this);
-	QLabel *folio_tip = new QLabel(
-		tr(
-			"Les variables suivantes sont utilisables dans le champ Folio :\n"
-			"  - %id : num\351ro du sch\351ma courant dans le projet\n"
-			"  - %total : nombre total de sch\351mas dans le projet"
-		)
-	);
-	folio_tip -> setWordWrap(true);
-	
-	QGridLayout *layout_champs = new QGridLayout(titleblock_infos);
-	layout_champs -> addWidget(titleblock_template_label,    0, 0);
-	layout_champs -> addWidget(titleblock_template_name,     0, 1);
-	layout_champs -> addWidget(new QLabel(tr("Titre : ")),   1, 0);
-	layout_champs -> addWidget(titleblock_title,             1, 1);
-	layout_champs -> addWidget(new QLabel(tr("Auteur : ")),  2, 0);
-	layout_champs -> addWidget(titleblock_author,            2, 1);
-	layout_champs -> addWidget(new QLabel(tr("Date : ")),    3, 0, Qt::AlignTop);
-	layout_champs -> addLayout(layout_date,                  3, 1);
-	layout_champs -> addWidget(new QLabel(tr("Fichier : ")), 4, 0);
-	layout_champs -> addWidget(titleblock_filename,          4, 1);
-	layout_champs -> addWidget(new QLabel(tr("Folio : ")),   5, 0);
-	layout_champs -> addWidget(titleblock_folio,             5, 1);
-	layout_champs -> addWidget(folio_tip,                    6, 1, Qt::AlignTop);
-	layout_champs -> setRowStretch(5, 500);
-	
 	titleblock_current_date -> setVisible(display_current_date = current);
 	setTitleBlockProperties(titleblock);
-	setLayout(this_layout);
 	
 	// by default, we do not display the template combo box
 	titleblock_template_label -> setVisible(false);
@@ -125,6 +70,18 @@
 		prop.template_name = titleblock_template_name -> itemData(index).toString();
 	}
 	
+	for (int i = 0 ; i < additional_fields_table -> rowCount() ; ++ i) {
+		QTableWidgetItem *qtwi_name  = additional_fields_table -> item(i, 0);
+		QTableWidgetItem *qtwi_value = additional_fields_table -> item(i, 1);
+		if (!qtwi_name || !qtwi_value) continue;
+		
+		QString key = qtwi_name -> text();
+		if (key.isEmpty()) continue;
+		
+		QString value = qtwi_value -> text();
+		prop.context.addValue(key, value);
+	}
+	
 	return(prop);
 }
 
@@ -196,8 +153,8 @@
 	titleblock_no_date      -> setDisabled(ro);
 	titleblock_current_date -> setDisabled(ro);
 	titleblock_fixed_date   -> setDisabled(ro);
-	titleblock_template_label -> setDisabled(ro);
-	titleblock_template_name  -> setDisabled(ro);
+	titleblock_template_name -> setDisabled(ro);
+	additional_fields_table  -> setDisabled(ro);
 }
 
 /**
@@ -220,3 +177,159 @@
 	titleblock_template_name  -> setVisible(visible);
 	titleblock_template_label -> setVisible(visible);
 }
+
+/**
+	Adds a row in the additional fields table if needed.
+*/
+void TitleBlockPropertiesWidget::checkTableRows() {
+	if (!nameLessRowsCount()) {
+		int new_idx = additional_fields_table -> rowCount();
+		additional_fields_table -> setRowCount(new_idx + 1);
+		additional_fields_table -> setItem(new_idx, 0, new QTableWidgetItem(""));
+		additional_fields_table -> setItem(new_idx, 1, new QTableWidgetItem(""));
+	}
+}
+
+/**
+	Builds the various child widgets for this widget
+*/
+void TitleBlockPropertiesWidget::initWidgets(const TitleBlockProperties &titleblock) {
+	titleblock_template_label = new QLabel(tr("Mod\350le :"), this);
+	titleblock_template_name = new QComboBox(this);
+	
+	titleblock_title    = new QLineEdit(this);
+	titleblock_author   = new QLineEdit(this);
+	titleblock_filename = new QLineEdit(this);
+	
+	titleblock_folio = new QLineEdit(this);
+	folio_tip = new QLabel(
+		tr(
+			"Les variables suivantes sont utilisables dans le champ Folio :\n"
+			"  - %id : num\351ro du sch\351ma courant dans le projet\n"
+			"  - %total : nombre total de sch\351mas dans le projet"
+		)
+	);
+	folio_tip -> setWordWrap(true);
+	
+	QButtonGroup *date_policy_group = new QButtonGroup(this);
+	titleblock_no_date = new QRadioButton(tr("Pas de date"), this);
+	titleblock_current_date = new QRadioButton(tr("Date courante"), this);
+	titleblock_fixed_date = new QRadioButton(tr("Date fixe : "), this);
+	date_policy_group -> addButton(titleblock_no_date);
+	date_policy_group -> addButton(titleblock_current_date);
+	date_policy_group -> addButton(titleblock_fixed_date);
+	titleblock_date = new QDateEdit(QDate::currentDate(), this);
+	titleblock_date -> setEnabled(titleblock_fixed_date -> isChecked());
+	titleblock_current_date -> setVisible(display_current_date);
+	connect(titleblock_fixed_date, SIGNAL(toggled(bool)), titleblock_date, SLOT(setEnabled(bool)));
+	titleblock_date -> setCalendarPopup(true);
+	
+	additional_fields_label = new QLabel(
+		tr(
+			"Vous pouvez d\xE9finir ici vos propres associations noms/valeurs pour"
+			" que le cartouche en tienne compte. Exemple : associer le nom "
+			"\"volta\" et la valeur \"1745\" remplacera %volta par 1745 dans le "
+			"cartouche."
+		)
+	);
+	additional_fields_label -> setWordWrap(true);
+	additional_fields_label -> setAlignment(Qt::AlignJustify);
+	int num_rows = titleblock.context.keys().count() + 1;
+	additional_fields_table = new QTableWidget(num_rows, 2);
+	additional_fields_table -> setHorizontalHeaderLabels(QStringList() << tr("Nom") << tr("Valeur"));
+	additional_fields_table -> horizontalHeader() -> setStretchLastSection(true);
+	
+	int i = 0;
+	foreach (QString key, titleblock.context.keys()) {
+		additional_fields_table -> setItem(i, 0, new QTableWidgetItem(key));
+		additional_fields_table -> setItem(i, 1, new QTableWidgetItem(titleblock.context[key].toString()));
+		++ i;
+	}
+	
+	connect(additional_fields_table, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(checkTableRows()));
+	
+	tabbar = new QTabBar(this);
+	tabbar -> addTab(tr("Principales"));
+	tabbar -> addTab(tr("Personnalis\xE9es"));
+	tabbar -> setShape(QTabBar::RoundedSouth);
+}
+
+/**
+	Builds the various layouts for this widget
+*/
+void TitleBlockPropertiesWidget::initLayouts() {
+	// layouts for tab #0
+	QGridLayout *layout_date = new QGridLayout();
+	layout_date -> addWidget(titleblock_no_date,      0, 0);
+	layout_date -> addWidget(titleblock_current_date, 1, 0);
+	layout_date -> addWidget(titleblock_fixed_date,   2, 0);
+	layout_date -> addWidget(titleblock_date,         2, 1);
+	layout_date -> setColumnStretch(0, 1);
+	layout_date -> setColumnStretch(1, 500);
+	
+	QWidget *widget_main_fields = new QWidget(this);
+	QGridLayout *layout_main_fields = new QGridLayout(widget_main_fields);
+	layout_main_fields -> addWidget(new QLabel(tr("Titre : ")),   0, 0);
+	layout_main_fields -> addWidget(titleblock_title,             0, 1);
+	layout_main_fields -> addWidget(new QLabel(tr("Auteur : ")),  1, 0);
+	layout_main_fields -> addWidget(titleblock_author,            1, 1);
+	layout_main_fields -> addWidget(new QLabel(tr("Date : ")),    2, 0, Qt::AlignTop);
+	layout_main_fields -> addLayout(layout_date,                  2, 1);
+	layout_main_fields -> addWidget(new QLabel(tr("Fichier : ")), 3, 0);
+	layout_main_fields -> addWidget(titleblock_filename,          3, 1);
+	layout_main_fields -> addWidget(new QLabel(tr("Folio : ")),   4, 0);
+	layout_main_fields -> addWidget(titleblock_folio,             4, 1);
+	layout_main_fields -> addWidget(folio_tip,                    5, 1, Qt::AlignTop);
+	layout_main_fields -> setContentsMargins(0, 0, 0, 0);
+	layout_main_fields -> setRowStretch(5, 500);
+	
+	// layouts for tab #1
+	QWidget *widget_user_fields = new QWidget(this);
+	QVBoxLayout *layout_user_fields = new QVBoxLayout(widget_user_fields);
+	layout_user_fields -> addWidget(additional_fields_label);
+	layout_user_fields -> addWidget(additional_fields_table);
+	layout_user_fields -> setContentsMargins(0, 0, 0, 0);
+	
+	// stacked layout
+	stack_layout = new QStackedLayout();
+	stack_layout -> addWidget(widget_main_fields);
+	stack_layout -> addWidget(widget_user_fields);
+	stack_layout -> setContentsMargins(0, 0, 0, 0);
+	stack_layout -> setCurrentIndex(0);
+	
+	// template layout
+	QHBoxLayout *template_layout = new QHBoxLayout();
+	template_layout -> addWidget(titleblock_template_label);
+	template_layout -> addWidget(titleblock_template_name);
+	template_layout -> setStretch(0, 1);
+	template_layout -> setStretch(1, 500);
+	
+	// groupbox layout
+	QVBoxLayout *groupbox_layout = new QVBoxLayout();
+	groupbox_layout -> addLayout(template_layout);
+	groupbox_layout -> addLayout(stack_layout);
+	groupbox_layout -> addWidget(tabbar);
+	
+	// groupbox
+	QGroupBox *titleblock_infos = new QGroupBox(tr("Informations du cartouche"), this);
+	titleblock_infos -> setLayout(groupbox_layout);
+	titleblock_infos -> setMinimumSize(300, 330);
+	
+	// widget layout
+	QVBoxLayout *this_layout = new QVBoxLayout();
+	this_layout -> setContentsMargins(0, 0, 0, 0);
+	this_layout -> addWidget(titleblock_infos);
+	setLayout(this_layout);
+}
+
+/**
+	@return The count of name-less rows in the additional fields table.
+*/
+int TitleBlockPropertiesWidget::nameLessRowsCount() const {
+	int name_less_rows_count = 0;
+	for (int i = 0 ; i < additional_fields_table -> rowCount() ; ++ i) {
+		QTableWidgetItem *qtwi_name  = additional_fields_table -> item(i, 0);
+		if (qtwi_name && qtwi_name -> text().isEmpty()) ++ name_less_rows_count;
+	}
+	return(name_less_rows_count);
+}

Modified: branches/0.3/sources/titleblockpropertieswidget.h
===================================================================
--- branches/0.3/sources/titleblockpropertieswidget.h	2011-01-09 00:01:38 UTC (rev 1141)
+++ branches/0.3/sources/titleblockpropertieswidget.h	2011-01-09 15:16:51 UTC (rev 1142)
@@ -42,18 +42,33 @@
 	void setTitleBlockTemplatesList(const QList<QString> &);
 	void setTitleBlockTemplatesVisible(bool);
 	
+	// slots:
+	private slots:
+	void checkTableRows();
+	
+	// private methods
+	private:
+	void initWidgets(const TitleBlockProperties &);
+	void initLayouts();
+	int nameLessRowsCount() const;
+	
 	// attributs
 	private:
+	QStackedLayout *stack_layout;
+	QLabel       *titleblock_template_label;
+	QComboBox    *titleblock_template_name;
 	QLineEdit    *titleblock_title;
 	QLineEdit    *titleblock_author;
 	QDateEdit    *titleblock_date;
 	QLineEdit    *titleblock_filename;
 	QLineEdit    *titleblock_folio;
+	QLabel       *folio_tip;
 	QRadioButton *titleblock_no_date;
 	QRadioButton *titleblock_current_date;
 	QRadioButton *titleblock_fixed_date;
 	bool display_current_date;
-	QLabel       *titleblock_template_label;
-	QComboBox    *titleblock_template_name;
+	QLabel       *additional_fields_label;
+	QTableWidget *additional_fields_table;
+	QTabBar      *tabbar;
 };
 #endif


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/