[qet] qet/qet: [5195] User can export / import the configuration of the texts and texts group of an element.

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


Revision: 5195
Author:   blacksun
Date:     2017-12-30 15:41:25 +0100 (Sat, 30 Dec 2017)
Log Message:
-----------
User can export / import the configuration of the texts and texts group of an element.

Modified Paths:
--------------
    trunk/sources/qet.h
    trunk/sources/qetgraphicsitem/element.cpp
    trunk/sources/qetgraphicsitem/elementtextitemgroup.cpp
    trunk/sources/qetgraphicsitem/elementtextitemgroup.h
    trunk/sources/ui/dynamicelementtextitemeditor.cpp
    trunk/sources/ui/dynamicelementtextitemeditor.h
    trunk/sources/ui/dynamicelementtextitemeditor.ui
    trunk/sources/undocommand/addelementtextcommand.cpp
    trunk/sources/undocommand/addelementtextcommand.h

Added Paths:
-----------
    trunk/sources/elementtextpattern.cpp
    trunk/sources/elementtextpattern.h

Added: trunk/sources/elementtextpattern.cpp
===================================================================
--- trunk/sources/elementtextpattern.cpp	                        (rev 0)
+++ trunk/sources/elementtextpattern.cpp	2017-12-30 14:41:25 UTC (rev 5195)
@@ -0,0 +1,250 @@
+/*
+	Copyright 2006-2017 The QElectroTech Team
+	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 "elementtextpattern.h"
+#include "qetapp.h"
+#include "element.h"
+#include "qet.h"
+#include "dynamicelementtextitem.h"
+#include "elementtextitemgroup.h"
+#include "addelementtextcommand.h"
+#include "diagram.h"
+
+#include <QDir>
+#include <QInputDialog>
+#include <QGraphicsScene>
+#include <QMessageBox>
+#include <QObject>
+#include <QGraphicsView>
+#include <QStringList>
+
+/**
+ * @brief ExportElementTextPattern::ExportElementTextPattern
+ * Constructor
+ * @param elmt
+ */
+ExportElementTextPattern::ExportElementTextPattern(Element *elmt) :
+	m_element(elmt)
+{
+		//Create the conf dir if not yet.
+	QDir dir(QETApp::configDir()+ "/element_texts_pattern");
+	if(!dir.exists())
+	{
+		dir.cdUp();
+		dir.mkdir("element_texts_pattern");
+		dir.cd("element_texts_pattern");
+	}
+	
+		//Get the name of conf
+	bool ok;
+	m_name = getName(ok);
+	if(ok == false)
+		return;
+	
+		//Check if a conf with the same name already exist
+	if (QFileInfo::exists(dir.absoluteFilePath(m_name + ".xml")))
+	{
+		bool r = QMessageBox::question(parentWidget(),
+									   QObject::tr("Configuration de textes"),
+									   QObject::tr("Une configuration de textes nommé << %1 >> existe déjà.\n"
+												   "Voulez-vous la remplacer ?").arg(m_name));
+		
+		if(r == false)
+			return;
+	}
+	
+	QDomDocument doc = xmlConf();
+	QET::writeXmlFile(doc, dir.absoluteFilePath(m_name + ".xml"));
+}
+
+/**
+ * @brief ExportElementTextConf::getName
+ * Open a dialog to let user set the name of the conf and return it
+ * @return 
+ */
+QString ExportElementTextPattern::getName(bool &ok) const
+{	
+	QString text = QInputDialog::getText(parentWidget(),
+										 QObject::tr("Nom de la configuration"),
+										 QObject::tr("Entrer le nom de la configuration à créer"),
+										 QLineEdit::Normal,
+										 QString(),
+										 &ok);
+	
+	text.replace(" ", "_");
+	text.replace(".","");
+	return text;
+}
+
+QWidget *ExportElementTextPattern::parentWidget() const
+{
+	QWidget *parent = nullptr;
+	if(m_element->scene() && !m_element->scene()->views().isEmpty())
+		parent = m_element->scene()->views().first();
+	
+	return parent;
+}
+
+QDomDocument ExportElementTextPattern::xmlConf() const
+{
+	QDomDocument doc;
+	QDomElement root = doc.createElement("Element_texts_pattern");
+	root.setAttribute("name", m_name);
+	doc.appendChild(root);
+	
+	QHash<Terminal *, int> H;
+	QDomElement elmt = m_element->toXml(doc, H);
+	QDomElement texts = elmt.firstChildElement("dynamic_texts");
+	QDomElement groups = elmt.firstChildElement("texts_groups");
+	
+	if(texts.tagName() == "dynamic_texts")
+		root.appendChild(texts);
+	if(groups.tagName() == "texts_groups")
+		root.appendChild(groups);
+	
+	return doc;
+}
+
+//*******************//
+//******IMPORT*******//
+//*******************//
+
+ImportElementTextPattern::ImportElementTextPattern(Element *elmt):
+	m_element(elmt)
+{
+	bool exist = true;
+	QDir dir(QETApp::configDir()+ "/element_texts_pattern");
+	
+	if(!dir.exists())
+		exist = false;
+
+	QStringList entry = dir.entryList(QDir::Files | QDir::NoDotAndDotDot);
+	QStringList result = entry.filter(".xml");
+	if(result.isEmpty())
+		exist = false;
+	
+	if(!exist)
+	{
+		QMessageBox::information(parentWidget(),
+								 QObject::tr("Configurtaion de textes"),
+								 QObject::tr("Aucune configuration de textes existante."));
+		return;
+	}
+	
+	bool ok=false;
+		//Remove the .xml extention of the files
+	result.replaceInStrings(".xml", "");
+	QString name = getName(result, ok);
+	
+	if(!ok || name.isEmpty())
+		return;
+	else
+		apply(name);
+}
+
+/**
+ * @brief ImportElementTextPattern::getName
+ * Open a dialog to let user select a conf
+ * @param ok
+ * @return 
+ */
+QString ImportElementTextPattern::getName(QStringList list, bool &ok) const
+{
+	return QInputDialog::getItem(parentWidget(),
+								 QObject::tr("Séléctionner une configuration de textes"),
+								 QObject::tr("Séléctionner la configuration de textes à ajouter à l'élément"),
+								 list,
+								 0,
+								 false,
+								 &ok);
+}
+
+QWidget *ImportElementTextPattern::parentWidget() const
+{
+	QWidget *parent = nullptr;
+	if(m_element->scene() && !m_element->scene()->views().isEmpty())
+		parent = m_element->scene()->views().first();
+	
+	return parent;
+}
+
+/**
+ * @brief ImportElementTextPattern::apply
+ * Apply the user choice
+ * @param name : the name of the selected pattern
+ */
+void ImportElementTextPattern::apply(QString name) const
+{
+	if(!name.endsWith(".xml"))
+		name.append(".xml");
+	
+	QFile conf_file(QETApp::configDir() + "/element_texts_pattern/" + name);
+	if(!conf_file.open(QIODevice::ReadOnly | QIODevice::Text))
+		return;
+	
+		//Load the content of the xml file
+	QDomDocument xml_conf;
+	if(!xml_conf.setContent(&conf_file))
+		return;
+	
+	QDomElement root = xml_conf.firstChildElement("Element_texts_pattern");
+		
+		//Get the text
+	QList <QDomElement> texts = QET::findInDomElement(root, "dynamic_texts", "dynamic_elmt_text");
+	if (texts.isEmpty())
+		return;
+	
+		//Replace the original uuid of texts in the xml description, by a new one for every texts
+	QHash<QUuid, QUuid> uuid_hash;
+	for(QDomElement text : texts)
+	{
+		QUuid original_uuid(text.attribute("uuid"));
+		QUuid new_uuid = QUuid::createUuid();
+		text.setAttribute("uuid", new_uuid.toString());
+		
+		uuid_hash.insert(original_uuid, new_uuid);
+	}
+	
+		//In each group of the xml description, replace the original uuids, by the news created upper. 
+	QList <QDomElement> groups = QET::findInDomElement(root, "texts_groups", "texts_group");
+	for(QDomElement group : groups)
+	{
+		for(QDomElement text : QET::findInDomElement(group, "texts", "text"))
+		{
+			QUuid original_uuid(text.attribute("uuid"));
+			QUuid new_uuid = uuid_hash.value(original_uuid);
+			if(!new_uuid.isNull())
+				text.setAttribute("uuid", new_uuid.toString());
+		}
+	}
+	
+	QUndoStack &undo_stack = m_element->diagram()->undoStack();
+	undo_stack.beginMacro(QObject::tr("Importer la configuration de texte : %1").arg(name.remove(".xml")));
+	
+		//Add the texts to element
+	for(QDomElement text : texts)
+	{
+		DynamicElementTextItem *deti = new DynamicElementTextItem(m_element);
+		undo_stack.push(new AddElementTextCommand(m_element, deti));
+		deti->fromXml(text);
+	}
+		//Add the groups to element
+	for(QDomElement xml_group : groups)
+		undo_stack.push(new AddTextsGroupCommand(m_element, xml_group));
+	
+	undo_stack.endMacro();
+}

Added: trunk/sources/elementtextpattern.h
===================================================================
--- trunk/sources/elementtextpattern.h	                        (rev 0)
+++ trunk/sources/elementtextpattern.h	2017-12-30 14:41:25 UTC (rev 5195)
@@ -0,0 +1,56 @@
+/*
+	Copyright 2006-2017 The QElectroTech Team
+	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 ELEMENTTEXTPATTERN_H
+#define ELEMENTTEXTPATTERN_H
+
+#include <QString>
+#include <QDomDocument>
+
+class Element;
+class QWidget;
+
+class ExportElementTextPattern
+{
+	public:
+		ExportElementTextPattern(Element *elmt);
+		
+	private:
+		QString getName(bool &ok) const;
+		QWidget *parentWidget() const;
+		QDomDocument xmlConf() const;
+		
+	private:
+		Element *m_element = nullptr;
+		QString m_name;
+};
+
+class ImportElementTextPattern
+{
+	public:
+		ImportElementTextPattern(Element *elmt);
+		
+	private:
+		QString getName(QStringList list, bool &ok) const;
+		QWidget *parentWidget() const;
+		void apply(QString name) const;
+		
+	private:
+		Element *m_element = nullptr;
+};
+
+#endif // ELEMENTTEXTCONFIGURATION_H

Modified: trunk/sources/qet.h
===================================================================
--- trunk/sources/qet.h	2017-12-29 23:13:35 UTC (rev 5194)
+++ trunk/sources/qet.h	2017-12-30 14:41:25 UTC (rev 5195)
@@ -160,7 +160,7 @@
 	qreal correctAngle(const qreal &);
 	bool compareCanonicalFilePaths(const QString &, const QString &);
 	QString titleBlockColumnLengthToString(const TitleBlockColumnLength  &);
-	bool writeXmlFile(QDomDocument &, const QString &, QString * = nullptr);
+	bool writeXmlFile(QDomDocument &xml_doc, const QString &filepath, QString * error_message= nullptr);
 	QPointF graphicsSceneEventPos(QEvent *);
 	bool eachStrIsEqual (const QStringList &qsl);
 }

Modified: trunk/sources/qetgraphicsitem/element.cpp
===================================================================
--- trunk/sources/qetgraphicsitem/element.cpp	2017-12-29 23:13:35 UTC (rev 5194)
+++ trunk/sources/qetgraphicsitem/element.cpp	2017-12-30 14:41:25 UTC (rev 5195)
@@ -488,16 +488,16 @@
 	for(DynamicElementTextItem *deti : m_dynamic_text_list)
 		delete deti;
 	m_dynamic_text_list.clear();
-	
+    
 		//************************//
 		//***Dynamic texts item***//
 		//************************//
-	for(QDomElement qde : QET::findInDomElement(e, "dynamic_texts", DynamicElementTextItem::xmlTaggName()))
-	{
-		DynamicElementTextItem *deti = new DynamicElementTextItem(this);
-		addDynamicTextItem(deti);
-		deti->fromXml(qde);
-	}
+    for (QDomElement qde : QET::findInDomElement(e, "dynamic_texts", DynamicElementTextItem::xmlTaggName()))
+    {
+        DynamicElementTextItem *deti = new DynamicElementTextItem(this);
+        addDynamicTextItem(deti);
+        deti->fromXml(qde);
+    }
 	
 
 		//************************//
@@ -584,7 +584,7 @@
 		}
 	}
 	
-	for (QDomElement qde : QET::findInDomElement(e, "texts_group", ElementTextItemGroup::xmlTaggName()))
+	for (QDomElement qde : QET::findInDomElement(e, "texts_groups", ElementTextItemGroup::xmlTaggName()))
 	{
 		ElementTextItemGroup *group = addTextGroup("loaded_from_xml_group");
 		group->fromXml(qde);
@@ -626,7 +626,7 @@
 			}
 		}
 	}
-
+    
 	return(true);
 }
 
@@ -658,7 +658,7 @@
 	QDomElement seq = m_autoNum_seq.toXml(document);
 	if (seq.hasChildNodes())
 		element.appendChild(seq);
-
+	
 	// position, selection et orientation
 	element.setAttribute("x", QString("%1").arg(pos().x()));
 	element.setAttribute("y", QString("%1").arg(pos().y()));
@@ -674,7 +674,7 @@
 		}
 		id_terminal = max_id_t + 1;
 	}
-
+	
 	// enregistrement des bornes de l'appareil
 	QDomElement xml_terminals = document.createElement("terminals");
 	// pour chaque enfant de l'element
@@ -686,7 +686,7 @@
 		xml_terminals.appendChild(terminal);
 	}
 	element.appendChild(xml_terminals);
-
+	
 	// enregistrement des champ de texte de l'appareil
 	QDomElement inputs = document.createElement("inputs");
 	foreach(ElementTextItem *eti, texts()) {
@@ -706,21 +706,21 @@
 		element.appendChild(links_uuids);
 	}
 
-	//save information of this element
+        //save information of this element
 	if (! m_element_informations.keys().isEmpty()) {
 		QDomElement infos = document.createElement("elementInformations");
 		m_element_informations.toXml(infos, "elementInformation");
 		element.appendChild(infos);
 	}
-
-	//Dynamic texts
-	QDomElement dyn_text = document.createElement("dynamic_texts");
-	for(DynamicElementTextItem *deti : m_dynamic_text_list)
-		dyn_text.appendChild(deti->toXml(document));
+    	
+        //Dynamic texts
+    QDomElement dyn_text = document.createElement("dynamic_texts");
+    for (DynamicElementTextItem *deti : m_dynamic_text_list)
+        dyn_text.appendChild(deti->toXml(document));
 	
-	QDomElement texts_group = document.createElement("texts_group");
+	QDomElement texts_group = document.createElement("texts_groups");
 	
-	//Dynamic texts owned by groups
+		//Dynamic texts owned by groups
 	for(ElementTextItemGroup *group : m_texts_group)
 	{
 			//temporarily remove the texts from group to get the pos relative to element and not group.
@@ -735,7 +735,7 @@
 			group->removeFromGroup(deti);
 		
 			//Save the texts to xml
-		for(DynamicElementTextItem *deti : deti_list)
+		for (DynamicElementTextItem *deti : deti_list)
 			dyn_text.appendChild(deti->toXml(document));
 		
 			//Re add texts to group
@@ -754,7 +754,7 @@
 		//Append the texts group to element
 	element.appendChild(texts_group);
 
-	return(element);
+    return(element);
 }
 
 /**
@@ -765,18 +765,18 @@
  */
 void Element::addDynamicTextItem(DynamicElementTextItem *deti)
 {
-	if (deti && !m_dynamic_text_list.contains(deti))
+    if (deti && !m_dynamic_text_list.contains(deti))
 	{
-		m_dynamic_text_list.append(deti);
+        m_dynamic_text_list.append(deti);
 		deti->setParentItem(this);
 		emit textAdded(deti);
 	}
-	else
-	{
-		DynamicElementTextItem *text = new DynamicElementTextItem(this);
-		m_dynamic_text_list.append(text);
+    else
+    {
+        DynamicElementTextItem *text = new DynamicElementTextItem(this);
+        m_dynamic_text_list.append(text);
 		emit textAdded(text);
-	}
+    }
 }
 
 /**
@@ -787,9 +787,9 @@
  */
 void Element::removeDynamicTextItem(DynamicElementTextItem *deti)
 {
-	if (m_dynamic_text_list.contains(deti))
+    if (m_dynamic_text_list.contains(deti))
 	{
-		m_dynamic_text_list.removeOne(deti);
+        m_dynamic_text_list.removeOne(deti);
 		deti->setParentItem(nullptr);
 		emit textRemoved(deti);
 		return;

Modified: trunk/sources/qetgraphicsitem/elementtextitemgroup.cpp
===================================================================
--- trunk/sources/qetgraphicsitem/elementtextitemgroup.cpp	2017-12-29 23:13:35 UTC (rev 5194)
+++ trunk/sources/qetgraphicsitem/elementtextitemgroup.cpp	2017-12-30 14:41:25 UTC (rev 5195)
@@ -179,13 +179,10 @@
  */
 void ElementTextItemGroup::setVerticalAdjustment(int v)
 {
-	if(m_vertical_adjustment != v)
-	{
-		prepareGeometryChange();
-		m_vertical_adjustment = v;
-		updateAlignment();
-		emit verticalAdjustmentChanged(v);
-	}
+	prepareGeometryChange();
+	m_vertical_adjustment = v;
+	updateAlignment();
+	emit verticalAdjustmentChanged(v);
 }
 
 /**
@@ -278,12 +275,12 @@
 		return;
 	}
 	
-	m_name = dom_element.attribute("name", "no name");
+	setName(dom_element.attribute("name", "no name"));
 	QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>();
-	m_alignment = Qt::Alignment(me.keyToValue(dom_element.attribute("alignment").toStdString().data()));
+	setAlignment(Qt::Alignment(me.keyToValue(dom_element.attribute("alignment").toStdString().data())));
 	
 	setRotation(dom_element.attribute("rotation", QString::number(0)).toDouble());
-	m_vertical_adjustment = dom_element.attribute("vertical_adjustment").toInt();
+	setVerticalAdjustment(dom_element.attribute("vertical_adjustment").toInt());
 	
 	if(parentElement())
 	{

Modified: trunk/sources/qetgraphicsitem/elementtextitemgroup.h
===================================================================
--- trunk/sources/qetgraphicsitem/elementtextitemgroup.h	2017-12-29 23:13:35 UTC (rev 5194)
+++ trunk/sources/qetgraphicsitem/elementtextitemgroup.h	2017-12-30 14:41:25 UTC (rev 5195)
@@ -67,7 +67,7 @@
 		
 		QDomElement toXml(QDomDocument &dom_document) const;
 		void fromXml(QDomElement &dom_element);
-		static QString xmlTaggName() {return QString("text_group");}
+		static QString xmlTaggName() {return QString("texts_group");}
 		
 		void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
 		QRectF boundingRect() const override;

Modified: trunk/sources/ui/dynamicelementtextitemeditor.cpp
===================================================================
--- trunk/sources/ui/dynamicelementtextitemeditor.cpp	2017-12-29 23:13:35 UTC (rev 5194)
+++ trunk/sources/ui/dynamicelementtextitemeditor.cpp	2017-12-30 14:41:25 UTC (rev 5195)
@@ -26,6 +26,7 @@
 #include "QPropertyUndoCommand/qpropertyundocommand.h"
 #include "elementtextitemgroup.h"
 #include "deleteqgraphicsitemcommand.h"
+#include "elementtextpattern.h"
 
 #include <QTreeView>
 #include <QUndoCommand>
@@ -40,9 +41,6 @@
 	ui->m_tree_view->installEventFilter(this);
 	ui->m_remove_selection->setDisabled(true);
 	
-	ui->m_export_pb->hide();
-	ui->m_import_pb->hide();
-	
     setElement(element);
 }
 
@@ -256,3 +254,13 @@
 	else
 		ui->m_remove_selection->setDisabled(true);
 }
+
+void DynamicElementTextItemEditor::on_m_export_pb_clicked()
+{
+    ExportElementTextPattern eetp(m_element);
+}
+
+void DynamicElementTextItemEditor::on_m_import_pb_clicked()
+{
+    ImportElementTextPattern ietp(m_element);
+}

Modified: trunk/sources/ui/dynamicelementtextitemeditor.h
===================================================================
--- trunk/sources/ui/dynamicelementtextitemeditor.h	2017-12-29 23:13:35 UTC (rev 5194)
+++ trunk/sources/ui/dynamicelementtextitemeditor.h	2017-12-30 14:41:25 UTC (rev 5195)
@@ -53,6 +53,8 @@
         void on_m_remove_selection_clicked();
 		void on_m_add_group_clicked();
 		void on_m_tree_view_clicked(const QModelIndex &index);
+		void on_m_export_pb_clicked();
+		void on_m_import_pb_clicked();
 		
 		private:
 		Ui::DynamicElementTextItemEditor *ui;

Modified: trunk/sources/ui/dynamicelementtextitemeditor.ui
===================================================================
--- trunk/sources/ui/dynamicelementtextitemeditor.ui	2017-12-29 23:13:35 UTC (rev 5194)
+++ trunk/sources/ui/dynamicelementtextitemeditor.ui	2017-12-30 14:41:25 UTC (rev 5195)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>400</width>
-    <height>300</height>
+    <width>226</width>
+    <height>234</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -17,7 +17,35 @@
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
-      <spacer name="horizontalSpacer">
+      <widget class="QToolButton" name="m_export_pb">
+       <property name="toolTip">
+        <string>Exporter l'actuelle configuration des textes</string>
+       </property>
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../../qelectrotech.qrc">
+         <normaloff>:/ico/16x16/document-save.png</normaloff>:/ico/16x16/document-save.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="m_import_pb">
+       <property name="toolTip">
+        <string>Importer une configuration de texte</string>
+       </property>
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../../qelectrotech.qrc">
+         <normaloff>:/ico/16x16/folder-open.png</normaloff>:/ico/16x16/folder-open.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_2">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
@@ -30,40 +58,40 @@
       </spacer>
      </item>
      <item>
-      <widget class="QPushButton" name="m_add_text">
+      <widget class="QToolButton" name="m_add_text">
        <property name="toolTip">
         <string>Ajouter un texte</string>
        </property>
        <property name="text">
-        <string>Texte</string>
+        <string>...</string>
        </property>
        <property name="icon">
         <iconset resource="../../qelectrotech.qrc">
-         <normaloff>:/ico/16x16/list-add.png</normaloff>:/ico/16x16/list-add.png</iconset>
+         <normaloff>:/ico/22x22/textfield.png</normaloff>:/ico/22x22/textfield.png</iconset>
        </property>
       </widget>
      </item>
      <item>
-      <widget class="QPushButton" name="m_add_group">
+      <widget class="QToolButton" name="m_add_group">
        <property name="toolTip">
         <string>Ajouter un groupe de textes</string>
        </property>
        <property name="text">
-        <string>Groupe</string>
+        <string>...</string>
        </property>
        <property name="icon">
         <iconset resource="../../qelectrotech.qrc">
-         <normaloff>:/ico/16x16/list-add.png</normaloff>:/ico/16x16/list-add.png</iconset>
+         <normaloff>:/ico/16x16/object-group.png</normaloff>:/ico/16x16/object-group.png</iconset>
        </property>
       </widget>
      </item>
      <item>
-      <widget class="QPushButton" name="m_remove_selection">
+      <widget class="QToolButton" name="m_remove_selection">
        <property name="toolTip">
         <string>Supprimer la sélection</string>
        </property>
        <property name="text">
-        <string/>
+        <string>...</string>
        </property>
        <property name="icon">
         <iconset resource="../../qelectrotech.qrc">
@@ -93,22 +121,7 @@
     </widget>
    </item>
    <item>
-    <layout class="QHBoxLayout" name="m_im_exp_layout">
-     <item>
-      <widget class="QPushButton" name="m_export_pb">
-       <property name="text">
-        <string>Exporter</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="m_import_pb">
-       <property name="text">
-        <string>Importer</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
+    <layout class="QHBoxLayout" name="m_im_exp_layout"/>
    </item>
   </layout>
  </widget>

Modified: trunk/sources/undocommand/addelementtextcommand.cpp
===================================================================
--- trunk/sources/undocommand/addelementtextcommand.cpp	2017-12-29 23:13:35 UTC (rev 5194)
+++ trunk/sources/undocommand/addelementtextcommand.cpp	2017-12-30 14:41:25 UTC (rev 5195)
@@ -76,6 +76,20 @@
 }
 
 /**
+ * @brief AddTextsGroupCommand::AddTextsGroupCommand
+ * @param element : The element to add a new group
+ * @param dom_element : the first time the group is created, we call the function fromXml of the group, and give @dom_element has argument.
+ * @param parent : parent undo
+ */
+AddTextsGroupCommand::AddTextsGroupCommand(Element *element, QDomElement dom_element, QUndoCommand *parent) :
+	QUndoCommand(parent),
+	m_element(element),
+	m_dom_element(dom_element)
+{
+		setText(QObject::tr("Ajouter un groupe de textes d'élément"));
+}
+
+/**
  * @brief AddTextsGroupCommand::~AddTextsGroupCommand
  * Destructor
  */
@@ -95,10 +109,22 @@
 		if(m_first_undo)
 		{
 			m_group = m_element.data()->addTextGroup(m_name);
+			if(!m_dom_element.isNull())
+			{
+				m_group.data()->fromXml(m_dom_element);
+					//We get the list of texts (if any) because when undo is called, all child text will be removed
+					//from the group, and reparented to m_elemeny.
+					//Then the next time redo is called, the texts will be added to the group
+				m_deti_list = m_group.data()->texts();
+			}
 			m_first_undo = false;
 		}
 		else if(m_group)
+		{
 			m_element.data()->addTextGroup(m_group.data());
+			for(DynamicElementTextItem *deti : m_deti_list)
+				m_element.data()->addTextToGroup(deti, m_group.data());
+		}
 	}
 }
 

Modified: trunk/sources/undocommand/addelementtextcommand.h
===================================================================
--- trunk/sources/undocommand/addelementtextcommand.h	2017-12-29 23:13:35 UTC (rev 5194)
+++ trunk/sources/undocommand/addelementtextcommand.h	2017-12-30 14:41:25 UTC (rev 5195)
@@ -20,6 +20,7 @@
 
 #include <QUndoCommand>
 #include <QPointer>
+#include <QDomElement>
 
 class Element;
 class DynamicElementTextItem;
@@ -51,6 +52,7 @@
 {
 	public:
 		AddTextsGroupCommand(Element *element, QString groupe_name, QUndoCommand *parent = nullptr);
+		AddTextsGroupCommand(Element *element, QDomElement dom_element, QUndoCommand *parent = nullptr);
 		~AddTextsGroupCommand() override;
 		
 		void undo() override;
@@ -59,6 +61,8 @@
 	private:
 		QPointer<Element> m_element;
 		QPointer<ElementTextItemGroup> m_group;
+		QList <DynamicElementTextItem *> m_deti_list;
+		QDomElement m_dom_element;
 		QString m_name;
 		bool m_first_undo = true;
 };


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