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();
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<QString, QString> ElementsCategory::categoryNames() const {
NamesList ElementsCategory::categoryNames() const {
return(category_names);
}
@@ -106,7 +96,7 @@ QHash<QString, QString> 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");

View File

@@ -1,6 +1,7 @@
#ifndef ELEMENTS_CATEGORY_H
#define ELEMENTS_CATEGORY_H
#include <QtCore>
#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<QString, QString> category_names;
NamesList category_names;
// methodes
public:
QString name() const;
QHash<QString, QString> categoryNames() const;
NamesList categoryNames() const;
void clearNames();
void addName(const QString &, const QString &);
bool write() const;

View File

@@ -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<QString, QString> 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<QString, QString> 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<QString, QString> 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<QString, QString> names = names_list -> names();
foreach(QString lang, names.keys()) {
NamesList names = names_list -> names();
foreach(QString lang, names.langs()) {
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() {
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<QString, QString> 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<QString, QString> &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);

View File

@@ -1,6 +1,7 @@
#ifndef NAMES_LIST_WIDGET_H
#define NAMES_LIST_WIDGET_H
#include <QtGui>
#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<QString, QString> hash_names;
NamesList hash_names;
// methodes
public:
bool checkOneName();
QHash<QString, QString> names();
void setNames(QHash<QString, QString> &);
NamesList names();
void setNames(const NamesList &);
private:
void clean();

View File

@@ -175,8 +175,8 @@ void NewElementWizard::buildStep3() {
explication -> setWordWrap(true);
step3_layout -> addWidget(explication);
element_names = new NamesListWidget();
QHash<QString, QString> 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);

View File

@@ -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 \