Introduction de la nouvelle classe NamesList

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@88 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavierqet
2007-04-13 15:48:00 +00:00
parent 6894a83ad5
commit 0816e0d07b
9 changed files with 189 additions and 50 deletions

View File

@@ -57,17 +57,7 @@ void ElementsCategory::loadNames() {
QDomElement root = document.documentElement(); QDomElement root = document.documentElement();
if (root.tagName() != "qet-directory") return; if (root.tagName() != "qet-directory") return;
// parcourt les "names" category_names.fromXml(root);
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());
}
}
// ferme le fichier // ferme le fichier
directory_conf.close(); directory_conf.close();
@@ -98,7 +88,7 @@ QString ElementsCategory::name() const {
/** /**
@return La liste des differents noms possibles pour la categorie @return La liste des differents noms possibles pour la categorie
*/ */
QHash<QString, QString> ElementsCategory::categoryNames() const { NamesList ElementsCategory::categoryNames() const {
return(category_names); return(category_names);
} }
@@ -106,7 +96,7 @@ QHash<QString, QString> ElementsCategory::categoryNames() const {
Vide la liste des noms de la categorie Vide la liste des noms de la categorie
*/ */
void ElementsCategory::clearNames() { void ElementsCategory::clearNames() {
category_names.clear(); category_names.clearNames();
} }
/** /**
@@ -116,7 +106,7 @@ void ElementsCategory::clearNames() {
@param value Le nom @param value Le nom
*/ */
void ElementsCategory::addName(const QString &lang, const QString &value) { 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; QDomDocument document;
QDomElement root = document.createElement("qet-directory"); QDomElement root = document.createElement("qet-directory");
document.appendChild(root); document.appendChild(root);
QDomElement names = document.createElement("names"); root.appendChild(category_names.toXml(document));
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);
}
// repere le chemin du fichier de configuration de la categorie // repere le chemin du fichier de configuration de la categorie
QFile directory_conf(canonicalPath() + "/qet_directory"); QFile directory_conf(canonicalPath() + "/qet_directory");

View File

@@ -1,6 +1,7 @@
#ifndef ELEMENTS_CATEGORY_H #ifndef ELEMENTS_CATEGORY_H
#define ELEMENTS_CATEGORY_H #define ELEMENTS_CATEGORY_H
#include <QtCore> #include <QtCore>
#include "nameslist.h"
/** /**
Cette classe represente une categorie d'elements. Cette classe represente une categorie d'elements.
Une categorie d'elements est en fait un dossier avec un fichier Une categorie d'elements est en fait un dossier avec un fichier
@@ -17,12 +18,12 @@ class ElementsCategory : public QDir {
// attributs // attributs
private: private:
QHash<QString, QString> category_names; NamesList category_names;
// methodes // methodes
public: public:
QString name() const; QString name() const;
QHash<QString, QString> categoryNames() const; NamesList categoryNames() const;
void clearNames(); void clearNames();
void addName(const QString &, const QString &); void addName(const QString &, const QString &);
bool write() const; bool write() const;

View File

@@ -18,15 +18,14 @@ ElementsCategoryEditor::ElementsCategoryEditor(const QString &category_path, boo
connect(buttons, SIGNAL(accepted()), this, SLOT(acceptUpdate())); connect(buttons, SIGNAL(accepted()), this, SLOT(acceptUpdate()));
// edition de categorie = affichage des noms deja existants // edition de categorie = affichage des noms deja existants
QHash<QString, QString> cat_names = category -> categoryNames(); names_list -> setNames(category -> categoryNames());
names_list -> setNames(cat_names);
} else { } else {
setWindowTitle(tr("Cr\351er une nouvelle cat\351gorie")); setWindowTitle(tr("Cr\351er une nouvelle cat\351gorie"));
connect(buttons, SIGNAL(accepted()), this, SLOT(acceptCreation())); connect(buttons, SIGNAL(accepted()), this, SLOT(acceptCreation()));
// nouvelle categorie = une ligne pre-machee // nouvelle categorie = une ligne pre-machee
QHash<QString, QString> cat_names; NamesList cat_names;
cat_names.insert(QLocale::system().name().left(2), tr("Nom de la nouvelle cat\351gorie")); cat_names.addName(QLocale::system().name().left(2), tr("Nom de la nouvelle cat\351gorie"));
names_list -> setNames(cat_names); names_list -> setNames(cat_names);
//names_list -> openPersistentEditor(qtwi, 1); //names_list -> openPersistentEditor(qtwi, 1);
} }
@@ -66,13 +65,13 @@ void ElementsCategoryEditor::acceptCreation() {
// chargement des noms // chargement des noms
category -> clearNames(); category -> clearNames();
QHash<QString, QString> names = names_list -> names(); NamesList names = names_list -> names();
foreach(QString lang, names.keys()) { foreach(QString lang, names.langs()) {
category -> addName(lang, names[lang]); category -> addName(lang, names[lang]);
} }
// cree un nom de dossier a partir du 1er nom de la categorie // 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 -> setPath(category -> path() + "/" + dirname);
category -> write(); category -> write();
@@ -89,8 +88,8 @@ void ElementsCategoryEditor::acceptUpdate() {
// chargement des noms // chargement des noms
category -> clearNames(); category -> clearNames();
QHash<QString, QString> names = names_list -> names(); NamesList names = names_list -> names();
foreach(QString lang, names.keys()) { foreach(QString lang, names.langs()) {
category -> addName(lang, names[lang]); category -> addName(lang, names[lang]);
} }

128
nameslist.cpp Normal file
View File

@@ -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<QString> 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<QString, QString> 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);
}

31
nameslist.h Normal file
View File

@@ -0,0 +1,31 @@
#ifndef NAMES_LIST_H
#define NAMES_LIST_H
#include <QtXml>
class NamesList {
// constructeurs, destructeur
public:
NamesList();
NamesList(const NamesList &);
virtual ~NamesList();
// attributs
private:
QHash<QString, QString> 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<QString> 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

View File

@@ -42,7 +42,7 @@ void NamesListWidget::addLine() {
*/ */
bool NamesListWidget::checkOneName() { bool NamesListWidget::checkOneName() {
updateHash(); updateHash();
if (!hash_names.size()) { if (!hash_names.count()) {
QMessageBox::critical( QMessageBox::critical(
this, this,
tr("La cat\351gorie doit avoir au moins un nom."), tr("La cat\351gorie doit avoir au moins un nom."),
@@ -57,12 +57,12 @@ bool NamesListWidget::checkOneName() {
Lit les noms valides dans hash_names Lit les noms valides dans hash_names
*/ */
void NamesListWidget::updateHash() { void NamesListWidget::updateHash() {
hash_names.clear(); hash_names.clearNames();
int names_count = tree_names -> topLevelItemCount(); int names_count = tree_names -> topLevelItemCount();
for (int i = 0 ; i < names_count ; ++ i) { for (int i = 0 ; i < names_count ; ++ i) {
QString lang = tree_names -> topLevelItem(i) -> text(0); QString lang = tree_names -> topLevelItem(i) -> text(0);
QString value = tree_names -> topLevelItem(i) -> text(1); 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 @return Les noms entres dans la Names List
*/ */
QHash<QString, QString> NamesListWidget::names() { NamesList NamesListWidget::names() {
updateHash(); updateHash();
return(hash_names); return(hash_names);
} }
/** void NamesListWidget::setNames(const NamesList &provided_names) {
Specifie les noms que la liste doit afficher foreach(QString lang, provided_names.langs()) {
@param provided_names Hash des noms a afficher
*/
void NamesListWidget::setNames(QHash<QString, QString> &provided_names) {
foreach(QString lang, provided_names.keys()) {
QString value = provided_names[lang]; QString value = provided_names[lang];
if (lang == "" || value == "") continue;
QStringList values; QStringList values;
values << lang << value; values << lang << value;
QTreeWidgetItem *qtwi = new QTreeWidgetItem(values); QTreeWidgetItem *qtwi = new QTreeWidgetItem(values);

View File

@@ -1,6 +1,7 @@
#ifndef NAMES_LIST_WIDGET_H #ifndef NAMES_LIST_WIDGET_H
#define NAMES_LIST_WIDGET_H #define NAMES_LIST_WIDGET_H
#include <QtGui> #include <QtGui>
#include "nameslist.h"
/** /**
Cette classe represente une interface permettant de saisir les noms des Cette classe represente une interface permettant de saisir les noms des
categories et elements. categories et elements.
@@ -20,13 +21,13 @@ class NamesListWidget : public QWidget {
private: private:
QTreeWidget *tree_names; QTreeWidget *tree_names;
QPushButton *button_add_line; QPushButton *button_add_line;
QHash<QString, QString> hash_names; NamesList hash_names;
// methodes // methodes
public: public:
bool checkOneName(); bool checkOneName();
QHash<QString, QString> names(); NamesList names();
void setNames(QHash<QString, QString> &); void setNames(const NamesList &);
private: private:
void clean(); void clean();

View File

@@ -175,8 +175,8 @@ void NewElementWizard::buildStep3() {
explication -> setWordWrap(true); explication -> setWordWrap(true);
step3_layout -> addWidget(explication); step3_layout -> addWidget(explication);
element_names = new NamesListWidget(); element_names = new NamesListWidget();
QHash<QString, QString> hash_name; NamesList hash_name;
hash_name.insert(QLocale::system().name().left(2), tr("Nom du nouvel \351l\351ment")); hash_name.addName(QLocale::system().name().left(2), tr("Nom du nouvel \351l\351ment"));
element_names -> setNames(hash_name); element_names -> setNames(hash_name);
step3_layout -> addWidget(element_names); step3_layout -> addWidget(element_names);
step3 -> setLayout(step3_layout); step3 -> setLayout(step3_layout);

View File

@@ -25,6 +25,7 @@ HEADERS += aboutqet.h \
elementtextitem.h \ elementtextitem.h \
exportdialog.h \ exportdialog.h \
fixedelement.h \ fixedelement.h \
nameslist.h \
nameslistwidget.h \ nameslistwidget.h \
newelementwizard.h \ newelementwizard.h \
qetapp.h \ qetapp.h \
@@ -47,6 +48,7 @@ SOURCES += aboutqet.cpp \
exportdialog.cpp \ exportdialog.cpp \
fixedelement.cpp \ fixedelement.cpp \
main.cpp \ main.cpp \
nameslist.cpp \
nameslistwidget.cpp \ nameslistwidget.cpp \
newelementwizard.cpp \ newelementwizard.cpp \
qetapp.cpp \ qetapp.cpp \