diff --git a/elementscategory.cpp b/elementscategory.cpp index 9ce43ba90..7a127229a 100644 --- a/elementscategory.cpp +++ b/elementscategory.cpp @@ -57,17 +57,7 @@ void ElementsCategory::loadNames() { QDomElement root = document.documentElement(); if (root.tagName() != "qet-directory") return; - // parcourt les "names" - for (QDomNode node = root.firstChild() ; !node.isNull() ; node = node.nextSibling()) { - QDomElement names = node.toElement(); - if (names.isNull() || names.tagName() != "names") continue; - // parcourt les "name" - for (QDomNode n = names.firstChild() ; !n.isNull() ; n = n.nextSibling()) { - QDomElement name = n.toElement(); - if (name.isNull() || name.tagName() != "name") continue; - category_names.insert(name.attribute("lang"), name.text()); - } - } + category_names.fromXml(root); // ferme le fichier directory_conf.close(); @@ -98,7 +88,7 @@ QString ElementsCategory::name() const { /** @return La liste des differents noms possibles pour la categorie */ -QHash ElementsCategory::categoryNames() const { +NamesList ElementsCategory::categoryNames() const { return(category_names); } @@ -106,7 +96,7 @@ QHash ElementsCategory::categoryNames() const { Vide la liste des noms de la categorie */ void ElementsCategory::clearNames() { - category_names.clear(); + category_names.clearNames(); } /** @@ -116,7 +106,7 @@ void ElementsCategory::clearNames() { @param value Le nom */ void ElementsCategory::addName(const QString &lang, const QString &value) { - category_names.insert(lang, value); + category_names.addName(lang, value); } /** @@ -132,15 +122,7 @@ bool ElementsCategory::write() const { QDomDocument document; QDomElement root = document.createElement("qet-directory"); document.appendChild(root); - QDomElement names = document.createElement("names"); - root.appendChild(names); - foreach(QString lang, category_names.keys()) { - QDomElement name = document.createElement("name"); - name.setAttribute("lang", lang); - QDomText name_value = document.createTextNode(category_names[lang]); - name.appendChild(name_value); - names.appendChild(name); - } + root.appendChild(category_names.toXml(document)); // repere le chemin du fichier de configuration de la categorie QFile directory_conf(canonicalPath() + "/qet_directory"); diff --git a/elementscategory.h b/elementscategory.h index 033a68f8a..fb2194169 100644 --- a/elementscategory.h +++ b/elementscategory.h @@ -1,6 +1,7 @@ #ifndef ELEMENTS_CATEGORY_H #define ELEMENTS_CATEGORY_H #include +#include "nameslist.h" /** Cette classe represente une categorie d'elements. Une categorie d'elements est en fait un dossier avec un fichier @@ -17,12 +18,12 @@ class ElementsCategory : public QDir { // attributs private: - QHash category_names; + NamesList category_names; // methodes public: QString name() const; - QHash categoryNames() const; + NamesList categoryNames() const; void clearNames(); void addName(const QString &, const QString &); bool write() const; diff --git a/elementscategoryeditor.cpp b/elementscategoryeditor.cpp index 339515af4..075570bc6 100644 --- a/elementscategoryeditor.cpp +++ b/elementscategoryeditor.cpp @@ -18,15 +18,14 @@ ElementsCategoryEditor::ElementsCategoryEditor(const QString &category_path, boo connect(buttons, SIGNAL(accepted()), this, SLOT(acceptUpdate())); // edition de categorie = affichage des noms deja existants - QHash cat_names = category -> categoryNames(); - names_list -> setNames(cat_names); + names_list -> setNames(category -> categoryNames()); } else { setWindowTitle(tr("Cr\351er une nouvelle cat\351gorie")); connect(buttons, SIGNAL(accepted()), this, SLOT(acceptCreation())); // nouvelle categorie = une ligne pre-machee - QHash cat_names; - cat_names.insert(QLocale::system().name().left(2), tr("Nom de la nouvelle cat\351gorie")); + NamesList cat_names; + cat_names.addName(QLocale::system().name().left(2), tr("Nom de la nouvelle cat\351gorie")); names_list -> setNames(cat_names); //names_list -> openPersistentEditor(qtwi, 1); } @@ -66,13 +65,13 @@ void ElementsCategoryEditor::acceptCreation() { // chargement des noms category -> clearNames(); - QHash names = names_list -> names(); - foreach(QString lang, names.keys()) { + NamesList names = names_list -> names(); + foreach(QString lang, names.langs()) { category -> addName(lang, names[lang]); } // cree un nom de dossier a partir du 1er nom de la categorie - QString dirname = names[names.keys().first()].toLower().replace(" ", "_"); + QString dirname = names[names.langs().first()].toLower().replace(" ", "_"); category -> setPath(category -> path() + "/" + dirname); category -> write(); @@ -89,8 +88,8 @@ void ElementsCategoryEditor::acceptUpdate() { // chargement des noms category -> clearNames(); - QHash names = names_list -> names(); - foreach(QString lang, names.keys()) { + NamesList names = names_list -> names(); + foreach(QString lang, names.langs()) { category -> addName(lang, names[lang]); } diff --git a/nameslist.cpp b/nameslist.cpp new file mode 100644 index 000000000..6d66b4678 --- /dev/null +++ b/nameslist.cpp @@ -0,0 +1,128 @@ +#include "nameslist.h" + +/** + Constructeur + @param parent QObject parent +*/ +NamesList::NamesList() { +} + +/** + Constructeur de copie + @param other La NamesList a copie +*/ +NamesList::NamesList(const NamesList &other) : hash_names(other.hash_names) { +} + +/** + Destructeur +*/ +NamesList::~NamesList() { +} + +/** + Ajoute un nom a la liste + @param lang Sigle de deux lettres representant une langue. Si cela n'est + pas respecte, l'insertion n'est pas effectuee. + @param name Nom lui-meme. Ce ne doit pas etre une chaine de caractere vide. + Si cela n'est pas respecte, l'insertion n'est pas effectuee. +*/ +void NamesList::addName(const QString &lang, const QString &name) { + if (lang.length() != 2) return; + hash_names.insert(lang, name); +} + +/** + Enleve le nom dont une langue donnee + @param lang la langue pour laquelle il faut supprimer le nom +*/ +void NamesList::removeName(const QString &lang) { + hash_names.remove(lang); +} + +/** + Supprime tous les noms +*/ +void NamesList::clearNames() { + hash_names.clear(); +} + +/** + @return La liste de toutes les langues disponibles +*/ +QList NamesList::langs() const { + return(hash_names.keys()); +} + +/** + @return true si la liste de noms est vide, false sinon +*/ +bool NamesList::isEmpty() const { + return(hash_names.isEmpty()); +} + +/** + @return Le nombre de noms dans la liste +*/ +int NamesList::count() const { + return(hash_names.count()); +} + +/** + @param lang une langue + @return Le nom dans la langue donnee ou QString() si ce nom n'est pas + defini +*/ +QString &NamesList::operator[](const QString &lang) { + return(hash_names[lang]); +} + +/** + @param lang une langue + @return Le nom dans la langue donnee ou QString() si ce nom n'est pas + defini +*/ +const QString NamesList::operator[](const QString &lang) const { + return(hash_names.value(lang)); +} + +/** + Charge la liste de noms depuis un element XML. Cet element est sense etre + le parent d'un element "names", qui contient lui meme les "name". + Les noms precedemment contenus dans la liste ne sont pas effaces mais + peuvent etre ecrases. + @param xml_element L'element XML a analyser +*/ +void NamesList::fromXml(const QDomElement &xml_element) { + // parcourt les enfants "names" de l'element XML + for (QDomNode node = xml_element.firstChild() ; !node.isNull() ; node = node.nextSibling()) { + QDomElement names = node.toElement(); + if (names.isNull() || names.tagName() != "names") continue; + // parcourt les petits-enfants "name" + for (QDomNode n = names.firstChild() ; !n.isNull() ; n = n.nextSibling()) { + QDomElement name = n.toElement(); + if (name.isNull() || name.tagName() != "name") continue; + addName(name.attribute("lang"), name.text()); + } + } +} + +/** + Exporte la liste des noms vers un element XML. Veillez a verifier que la + liste de noms n'est pas vide avant de l'exporter. + @param xml_document Le document XML dans lequel l'element XML sera insere + @return L'element XML correspondant a la section "names" + @see count() +*/ +QDomElement NamesList::toXml(QDomDocument &xml_document) const { + QDomElement names_elmt = xml_document.createElement("names"); + QHashIterator names_iterator(hash_names); + while (names_iterator.hasNext()) { + names_iterator.next(); + QDomElement name_elmt = xml_document.createElement("name"); + name_elmt.setAttribute("lang", names_iterator.key()); + name_elmt.appendChild(xml_document.createTextNode(names_iterator.value())); + names_elmt.appendChild(name_elmt); + } + return(names_elmt); +} diff --git a/nameslist.h b/nameslist.h new file mode 100644 index 000000000..40b8eb125 --- /dev/null +++ b/nameslist.h @@ -0,0 +1,31 @@ +#ifndef NAMES_LIST_H +#define NAMES_LIST_H +#include +class NamesList { + // constructeurs, destructeur + public: + NamesList(); + NamesList(const NamesList &); + virtual ~NamesList(); + + // attributs + private: + QHash hash_names; + + // methodes + public: + // methodes relatives a la gestion de la liste + void addName(const QString &, const QString &); + void removeName(const QString &); + void clearNames(); + QList langs() const; + bool isEmpty() const; + int count() const; + QString &operator[](const QString &); + const QString operator[](const QString &) const; + + // methodes relatives a XML + void fromXml(const QDomElement &); + QDomElement toXml(QDomDocument &) const; +}; +#endif diff --git a/nameslistwidget.cpp b/nameslistwidget.cpp index c77cff1b2..605546db4 100644 --- a/nameslistwidget.cpp +++ b/nameslistwidget.cpp @@ -42,7 +42,7 @@ void NamesListWidget::addLine() { */ bool NamesListWidget::checkOneName() { updateHash(); - if (!hash_names.size()) { + if (!hash_names.count()) { QMessageBox::critical( this, tr("La cat\351gorie doit avoir au moins un nom."), @@ -57,12 +57,12 @@ bool NamesListWidget::checkOneName() { Lit les noms valides dans hash_names */ void NamesListWidget::updateHash() { - hash_names.clear(); + hash_names.clearNames(); int names_count = tree_names -> topLevelItemCount(); for (int i = 0 ; i < names_count ; ++ i) { QString lang = tree_names -> topLevelItem(i) -> text(0); QString value = tree_names -> topLevelItem(i) -> text(1); - if (lang != "" && value != "") hash_names.insert(lang, value); + hash_names.addName(lang, value); } } @@ -84,19 +84,14 @@ void NamesListWidget::clean() { /** @return Les noms entres dans la Names List */ -QHash NamesListWidget::names() { +NamesList NamesListWidget::names() { updateHash(); return(hash_names); } -/** - Specifie les noms que la liste doit afficher - @param provided_names Hash des noms a afficher -*/ -void NamesListWidget::setNames(QHash &provided_names) { - foreach(QString lang, provided_names.keys()) { +void NamesListWidget::setNames(const NamesList &provided_names) { + foreach(QString lang, provided_names.langs()) { QString value = provided_names[lang]; - if (lang == "" || value == "") continue; QStringList values; values << lang << value; QTreeWidgetItem *qtwi = new QTreeWidgetItem(values); diff --git a/nameslistwidget.h b/nameslistwidget.h index 00690e1cf..a7c478206 100644 --- a/nameslistwidget.h +++ b/nameslistwidget.h @@ -1,6 +1,7 @@ #ifndef NAMES_LIST_WIDGET_H #define NAMES_LIST_WIDGET_H #include +#include "nameslist.h" /** Cette classe represente une interface permettant de saisir les noms des categories et elements. @@ -20,13 +21,13 @@ class NamesListWidget : public QWidget { private: QTreeWidget *tree_names; QPushButton *button_add_line; - QHash hash_names; + NamesList hash_names; // methodes public: bool checkOneName(); - QHash names(); - void setNames(QHash &); + NamesList names(); + void setNames(const NamesList &); private: void clean(); diff --git a/newelementwizard.cpp b/newelementwizard.cpp index dece19b30..b3d9dc279 100644 --- a/newelementwizard.cpp +++ b/newelementwizard.cpp @@ -175,8 +175,8 @@ void NewElementWizard::buildStep3() { explication -> setWordWrap(true); step3_layout -> addWidget(explication); element_names = new NamesListWidget(); - QHash hash_name; - hash_name.insert(QLocale::system().name().left(2), tr("Nom du nouvel \351l\351ment")); + NamesList hash_name; + hash_name.addName(QLocale::system().name().left(2), tr("Nom du nouvel \351l\351ment")); element_names -> setNames(hash_name); step3_layout -> addWidget(element_names); step3 -> setLayout(step3_layout); diff --git a/qelectrotech.pro b/qelectrotech.pro index df2a69818..198e77019 100644 --- a/qelectrotech.pro +++ b/qelectrotech.pro @@ -25,6 +25,7 @@ HEADERS += aboutqet.h \ elementtextitem.h \ exportdialog.h \ fixedelement.h \ + nameslist.h \ nameslistwidget.h \ newelementwizard.h \ qetapp.h \ @@ -47,6 +48,7 @@ SOURCES += aboutqet.cpp \ exportdialog.cpp \ fixedelement.cpp \ main.cpp \ + nameslist.cpp \ nameslistwidget.cpp \ newelementwizard.cpp \ qetapp.cpp \