diff --git a/elementscategoryeditor.cpp b/elementscategoryeditor.cpp index ad4b4a5ae..19f973e14 100644 --- a/elementscategoryeditor.cpp +++ b/elementscategoryeditor.cpp @@ -1,5 +1,6 @@ #include "elementscategoryeditor.h" #include "elementscategory.h" +#include "nameslist.h" /** Constructeur fournissant un dialogue d'edition de categorie. @@ -17,24 +18,17 @@ ElementsCategoryEditor::ElementsCategoryEditor(const QString &category_path, boo connect(buttons, SIGNAL(accepted()), this, SLOT(acceptUpdate())); // edition de categorie = affichage des noms deja existants - QHash names = category -> categoryNames(); - foreach(QString lang, names.keys()) { - QStringList qsl; - qsl << lang << names[lang]; - QTreeWidgetItem *qtwi = new QTreeWidgetItem(qsl); - qtwi -> setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - category_names -> addTopLevelItem(qtwi); - } + QHash cat_names = category -> categoryNames(); + names_list -> setNames(cat_names); } else { setWindowTitle(tr("Cr\351er une nouvelle cat\351gorie")); connect(buttons, SIGNAL(accepted()), this, SLOT(acceptCreation())); // nouvelle categorie = une ligne pre-machee - QStringList qsl; - qsl << QLocale::system().name().left(2) << tr("Nom de la nouvelle cat\351gorie"); - QTreeWidgetItem *qtwi = new QTreeWidgetItem(qsl); - category_names -> addTopLevelItem(qtwi); - category_names -> openPersistentEditor(qtwi, 1); + QHash cat_names; + cat_names.insert(QLocale::system().name().left(2), tr("Nom de la nouvelle cat\351gorie")); + names_list -> setNames(cat_names); + //names_list -> openPersistentEditor(qtwi, 1); } } @@ -52,21 +46,13 @@ void ElementsCategoryEditor::buildDialog() { QVBoxLayout *editor_layout = new QVBoxLayout(); setLayout(editor_layout); - category_names = new QTreeWidget(); - category_names -> setColumnCount(2); - QStringList headers; - headers << tr("Langue") << tr("Nom"); - category_names -> setHeaderLabels(headers); - - button_add_line = new QPushButton(tr("Ajouter une ligne")); - connect(button_add_line, SIGNAL(released()), this, SLOT(addLine())); + names_list = new NamesList(); buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); editor_layout -> addWidget(new QLabel(tr("Vous pouvez sp\351cifier un nom par langue pour la cat\351gorie."))); - editor_layout -> addWidget(category_names); - editor_layout -> addWidget(button_add_line); + editor_layout -> addWidget(names_list); editor_layout -> addWidget(buttons); } @@ -76,19 +62,17 @@ void ElementsCategoryEditor::buildDialog() { */ void ElementsCategoryEditor::acceptCreation() { // il doit y avoir au moins un nom - if (!checkOneName()) return; + if (!names_list -> checkOneName()) return; // chargement des noms category -> clearNames(); - int names_count = category_names -> topLevelItemCount(); - for (int i = 0 ; i < names_count ; ++ i) { - QString lang = category_names -> topLevelItem(i) -> text(0); - QString value = category_names -> topLevelItem(i) -> text(1); - if (lang != "" && value != "") category -> addName(lang, value); + QHash names = names_list -> names(); + foreach(QString lang, names.keys()) { + category -> addName(lang, names[lang]); } // cree un nom de dossier a partir du 1er nom de la categorie - QString dirname = category_names -> topLevelItem(0) -> text(1).toLower().replace(" ", "_"); + QString dirname = names[names.keys().first()].toLower().replace(" ", "_"); category -> setPath(category -> path() + "/" + dirname); category -> write(); @@ -101,72 +85,16 @@ void ElementsCategoryEditor::acceptCreation() { */ void ElementsCategoryEditor::acceptUpdate() { // il doit y avoir au moins un nom - if (!checkOneName()) return; + if (!names_list -> checkOneName()) return; // chargement des noms category -> clearNames(); - int names_count = category_names -> topLevelItemCount(); - for (int i = 0 ; i < names_count ; ++ i) { - QString lang = category_names -> topLevelItem(i) -> text(0); - QString value = category_names -> topLevelItem(i) -> text(1); - if (lang != "" && value != "") category -> addName(lang, value); + QHash names = names_list -> names(); + foreach(QString lang, names.keys()) { + category -> addName(lang, names[lang]); } category -> write(); QDialog::accept(); } - -/** - Nettoie la liste des noms en enlevant les lignes vides -*/ -void ElementsCategoryEditor::clean() { - int names_count = category_names -> topLevelItemCount() - 1; - for (int i = names_count ; i >= 0 ; -- i) { - if ( - category_names -> topLevelItem(i) -> text(0) == QString() &&\ - category_names -> topLevelItem(i) -> text(1) == QString() - ) { - category_names -> takeTopLevelItem(i); - } - } -} - -/** - Ajoute une ligne a l'editeur -*/ -void ElementsCategoryEditor::addLine() { - clean(); - QTreeWidgetItem *qtwi = new QTreeWidgetItem(); - qtwi -> setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - category_names -> addTopLevelItem(qtwi); -} - -/** - Verifie qu'il y a au moins un nom -*/ -bool ElementsCategoryEditor::checkOneName() { - updateHash(); - if (!hash_names.size()) { - QMessageBox::critical( - this, - tr("La cat\351gorie doit avoir au moins un nom."), - tr("Vous devez entrer au moins un nom pour la cat\351gorie.") - ); - return(false); - } - return(true); -} - -/** - Lit les noms valides dans hash_names -*/ -void ElementsCategoryEditor::updateHash() { - hash_names.clear(); - int names_count = category_names -> topLevelItemCount(); - for (int i = 0 ; i < names_count ; ++ i) { - QString lang = category_names -> topLevelItem(i) -> text(0); - QString value = category_names -> topLevelItem(i) -> text(1); - if (lang != "" && value != "") hash_names.insert(lang, value); - } -} diff --git a/elementscategoryeditor.h b/elementscategoryeditor.h index 30bd23333..9d56a1f7a 100644 --- a/elementscategoryeditor.h +++ b/elementscategoryeditor.h @@ -6,6 +6,7 @@ categorie. */ class ElementsCategory; +class NamesList; class ElementsCategoryEditor : public QDialog { Q_OBJECT //Constructeurs, destructeur @@ -16,23 +17,18 @@ class ElementsCategoryEditor : public QDialog { // attributs private: - QTreeWidget *category_names; ElementsCategory *category; QDialogButtonBox *buttons; - QPushButton *button_add_line; - QHash hash_names; - + NamesList *names_list; bool mode_edit; + // methodes private: void buildDialog(); - void clean(); - bool checkOneName(); - void updateHash(); public slots: void acceptCreation(); void acceptUpdate(); - void addLine(); + }; #endif diff --git a/nameslist.cpp b/nameslist.cpp new file mode 100644 index 000000000..bd932c881 --- /dev/null +++ b/nameslist.cpp @@ -0,0 +1,107 @@ +#include "nameslist.h" + +/** + Constructeur + @param parent QWidget parent de la liste de noms +*/ +NamesList::NamesList(QWidget *parent) : QWidget(parent) { + QVBoxLayout *names_list_layout = new QVBoxLayout(); + setLayout(names_list_layout); + + tree_names = new QTreeWidget(); + tree_names -> setColumnCount(2); + QStringList headers; + headers << tr("Langue") << tr("Nom"); + tree_names -> setHeaderLabels(headers); + + button_add_line = new QPushButton(tr("Ajouter une ligne")); + connect(button_add_line, SIGNAL(released()), this, SLOT(addLine())); + + names_list_layout -> addWidget(tree_names); + names_list_layout -> addWidget(button_add_line); +} + +/** + Destructeur +*/ +NamesList::~NamesList() { + +} + +/** + Ajoute une ligne a l'editeur +*/ +void NamesList::addLine() { + clean(); + QTreeWidgetItem *qtwi = new QTreeWidgetItem(); + qtwi -> setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); + tree_names -> addTopLevelItem(qtwi); +} + +/** + Verifie qu'il y a au moins un nom +*/ +bool NamesList::checkOneName() { + updateHash(); + if (!hash_names.size()) { + QMessageBox::critical( + this, + tr("La cat\351gorie doit avoir au moins un nom."), + tr("Vous devez entrer au moins un nom pour la cat\351gorie.") + ); + return(false); + } + return(true); +} + +/** + Lit les noms valides dans hash_names +*/ +void NamesList::updateHash() { + hash_names.clear(); + 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); + } +} + +/** + Nettoie la liste des noms en enlevant les lignes vides +*/ +void NamesList::clean() { + int names_count = tree_names -> topLevelItemCount() - 1; + for (int i = names_count ; i >= 0 ; -- i) { + if ( + tree_names -> topLevelItem(i) -> text(0) == QString() &&\ + tree_names -> topLevelItem(i) -> text(1) == QString() + ) { + tree_names -> takeTopLevelItem(i); + } + } +} + +/** + @return Les noms entres dans la Names List +*/ +QHash NamesList::names() { + updateHash(); + return(hash_names); +} + +/** + Specifie les noms que la liste doit afficher + @param provided_names Hash des noms a afficher +*/ +void NamesList::setNames(QHash &provided_names) { + foreach(QString lang, provided_names.keys()) { + QString value = provided_names[lang]; + if (lang == "" || value == "") continue; + QStringList values; + values << lang << value; + QTreeWidgetItem *qtwi = new QTreeWidgetItem(values); + qtwi -> setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); + tree_names -> addTopLevelItem(qtwi); + } +} diff --git a/nameslist.h b/nameslist.h new file mode 100644 index 000000000..8387a5203 --- /dev/null +++ b/nameslist.h @@ -0,0 +1,33 @@ +#ifndef NAMES_LIST_H +#define NAMES_LIST_H +#include +/** + Cette classe represente une interface permettant de saisir les noms des + categories et elements. +*/ +class NamesList : public QWidget { + Q_OBJECT + //Constructeur, destructeur + public: + NamesList(QWidget * = 0); + ~NamesList(); + + // attributs + private: + QTreeWidget *tree_names; + QPushButton *button_add_line; + QHash hash_names; + + // methodes + public: + bool checkOneName(); + QHash names(); + void setNames(QHash &); + private: + void clean(); + void updateHash(); + + public slots: + void addLine(); +}; +#endif diff --git a/newelementwizard.cpp b/newelementwizard.cpp index 9c643ed7f..55e9b689d 100644 --- a/newelementwizard.cpp +++ b/newelementwizard.cpp @@ -1,8 +1,11 @@ #include "newelementwizard.h" #include "elementscategorieswidget.h" #include "elementscategorieslist.h" +#include "nameslist.h" +#include "diagram.h" NewElementWizard::NewElementWizard(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { + setFixedSize(480, 280); QVBoxLayout *dialog_layout = new QVBoxLayout(); setLayout(dialog_layout); @@ -141,7 +144,11 @@ void NewElementWizard::buildStep3() { step3 = new QWidget(this); QVBoxLayout *step3_layout = new QVBoxLayout(); step3_layout -> addWidget(new QLabel(tr("\311tape 3/5 : Indiquez le ou les noms de l'\351l\351ment."))); - /// @todo + element_names = new NamesList(); + QHash hash_name; + hash_name.insert(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); } @@ -150,23 +157,67 @@ void NewElementWizard::buildStep3() { */ void NewElementWizard::buildStep4() { step4 = new QWidget(this); - sb_largeur = new QSpinBox(); - sb_largeur -> setMinimum(1); - sb_hauteur = new QSpinBox(); - sb_hauteur -> setMinimum(1); + sb_width = new QSpinBox(); + sb_width -> setMinimum(1); + sb_width -> setValue(3); + sb_width -> setSuffix(tr(" \32710 px")); + sb_height = new QSpinBox(); + sb_height -> setMinimum(1); + sb_height -> setValue(7); + sb_height -> setSuffix(tr(" \32710 px")); + + sb_hotspot_x = new QSpinBox(); + sb_hotspot_x -> setValue(15); + sb_hotspot_x -> setSuffix(tr(" px")); + sb_hotspot_y = new QSpinBox(); + sb_hotspot_y -> setValue(35); + sb_hotspot_y -> setSuffix(tr(" px")); + + diagram_scene = new Diagram(); + diagram_scene -> border_and_inset.setNbColumns(4); + diagram_scene -> border_and_inset.setColumnsHeight(140); + diagram_scene -> border_and_inset.displayInset(false); + diagram_view = new QGraphicsView(diagram_scene); + diagram_view -> setMaximumSize( + static_cast((5 * diagram_scene -> border_and_inset.columnsWidth()) + (3 * MARGIN)), + 300 + ); + diagram_view -> setTransformationAnchor(QGraphicsView::AnchorUnderMouse); + diagram_view -> setResizeAnchor(QGraphicsView::AnchorUnderMouse); + diagram_view -> setAlignment(Qt::AlignLeft | Qt::AlignTop); + + connect(sb_width, SIGNAL(valueChanged(int)), this, SLOT(updateHotspotLimits())); + connect(sb_height, SIGNAL(valueChanged(int)), this, SLOT(updateHotspotLimits())); + connect(sb_width, SIGNAL(valueChanged(int)), this, SLOT(updateScene())); + connect(sb_height, SIGNAL(valueChanged(int)), this, SLOT(updateScene())); + connect(sb_hotspot_x, SIGNAL(valueChanged(int)), this, SLOT(updateScene())); + connect(sb_hotspot_y, SIGNAL(valueChanged(int)), this, SLOT(updateScene())); QGridLayout *grid_layout = new QGridLayout(); - grid_layout -> addWidget(new QLabel(tr("Largeur :")), 0, 0); - grid_layout -> addWidget(sb_largeur, 0, 1); - grid_layout -> addWidget(new QLabel(tr("\327 10 px")), 0, 2); - grid_layout -> addWidget(new QLabel(tr("Hauteur :")), 1, 0); - grid_layout -> addWidget(sb_hauteur, 1, 1); - grid_layout -> addWidget(new QLabel(tr("\327 10 px")), 1, 2); + grid_layout -> addWidget(new QLabel(tr("Dimensions")), 0, 0); + grid_layout -> addWidget(new QLabel(tr("Largeur :")), 1, 0); + grid_layout -> addWidget(sb_width, 1, 1); + grid_layout -> addWidget(new QLabel(tr("Hauteur :")), 2, 0); + grid_layout -> addWidget(sb_height, 2, 1); + grid_layout -> addWidget(new QLabel(tr("Hotspot")), 3, 0); + grid_layout -> addWidget(new QLabel(tr("Abscisse :")), 4, 0); + grid_layout -> addWidget(sb_hotspot_x, 4, 1); + grid_layout -> addWidget(new QLabel(tr("Ordonn\351e :")), 5, 0); + grid_layout -> addWidget(sb_hotspot_y, 5, 1); + + QHBoxLayout *step4_hlayout = new QHBoxLayout(); + + step4_hlayout -> addLayout(grid_layout); + step4_hlayout -> addWidget(diagram_view); + QVBoxLayout *step4_layout = new QVBoxLayout(); - step4_layout -> addWidget(new QLabel(tr("\311tape 4/5 : Saisissez la largeur et la hauteur du nouvel \351l\351ment"))); - step4_layout -> addLayout(grid_layout); + step4_layout -> addWidget(new QLabel(tr("\311tape 4/5 : Saisissez les dimensions du nouvel \351l\351ment ainsi\n que la position du hotspot (point de saisie de l'\351l\351ment \340 la souris)"))); + step4_layout -> addLayout(step4_hlayout); step4 -> setLayout(step4_layout); + + updateScene(); + updateHotspotLimits(); } /** @@ -207,6 +258,8 @@ bool NewElementWizard::validStep2() { return(false); } + if (!file_name.endsWith(".elmt")) file_name += ".elmt"; + // le fichier existe peut etre deja if (QFileInfo(dir_path + "/" + file_name).exists()) { QMessageBox::StandardButton answer = QMessageBox::question( @@ -223,7 +276,7 @@ bool NewElementWizard::validStep2() { } bool NewElementWizard::validStep3() { - return(true); + return(element_names -> checkOneName()); } bool NewElementWizard::validStep4() { @@ -234,3 +287,43 @@ bool NewElementWizard::validStep5() { return(true); } +void NewElementWizard::updateScene() { + foreach (QGraphicsItem *qgi, diagram_scene -> items()) { + diagram_scene -> removeItem(qgi); + delete qgi; + } + int elmt_width = sb_width -> value() * 10; + int elmt_height = sb_height -> value() * 10; + int hotspot_x = sb_hotspot_x -> value(); + int hotspot_y = sb_hotspot_y -> value(); + int margin_x = 10; + int margin_y = 30; + diagram_scene -> addRect(QRectF(margin_x, margin_y, sb_width -> value() * 10.0, sb_height -> value() * 10.0)); + QPen hotspot_pen(Qt::red); + QGraphicsLineItem *line_hotspot_x = diagram_scene -> addLine( + QLine( + margin_x, + margin_y + hotspot_y, + margin_x + elmt_width, + margin_y + hotspot_y + ), + hotspot_pen + ); + QGraphicsLineItem *line_hotspot_y = diagram_scene -> addLine( + QLine( + margin_x + hotspot_x, + margin_y, + margin_x + hotspot_x, + margin_y + elmt_height + ), + hotspot_pen + ); + line_hotspot_x -> setZValue(10); + line_hotspot_y -> setZValue(10); + diagram_scene -> setSceneRect(QRect(0, 0, elmt_width + 10, elmt_height + 10)); +} + +void NewElementWizard::updateHotspotLimits() { + sb_hotspot_x -> setMaximum(sb_width -> value() * 10); + sb_hotspot_y -> setMaximum(sb_height -> value() * 10); +} diff --git a/newelementwizard.h b/newelementwizard.h index aeee5614a..a0ceaf6e0 100644 --- a/newelementwizard.h +++ b/newelementwizard.h @@ -10,6 +10,8 @@ - et euh... pleins de choses interessantes */ class ElementsCategoriesWidget; +class NamesList; +class Diagram; class NewElementWizard : public QDialog { Q_OBJECT // Constructeur, destructeur @@ -24,12 +26,16 @@ class NewElementWizard : public QDialog { QWidget *step1, *step2, *step3, *step4, *step5; ElementsCategoriesWidget* categories_list; QLineEdit *qle_filename; - QSpinBox *sb_largeur; - QSpinBox *sb_hauteur; - + QSpinBox *sb_width; + QSpinBox *sb_height; + QSpinBox *sb_hotspot_x; + QSpinBox *sb_hotspot_y; + NamesList *element_names; QPushButton *button_previous; QPushButton *button_next; WizardState current_state; + QGraphicsView *diagram_view; + Diagram *diagram_scene; // methodes private: @@ -47,5 +53,7 @@ class NewElementWizard : public QDialog { public slots: void previous(); void next(); + void updateScene(); + void updateHotspotLimits(); }; #endif diff --git a/qelectrotech.pro b/qelectrotech.pro index 090498bf5..b733e70d1 100644 --- a/qelectrotech.pro +++ b/qelectrotech.pro @@ -1,5 +1,5 @@ ###################################################################### -# Automatically generated by qmake (2.01a) mer. avr. 4 03:03:56 2007 +# Automatically generated by qmake (2.01a) ven. avr. 6 18:45:47 2007 ###################################################################### TEMPLATE = app @@ -18,16 +18,17 @@ HEADERS += aboutqet.h \ element.h \ elementscategorieslist.h \ elementscategorieswidget.h \ + elementscategory.h \ + elementscategoryeditor.h \ elementspanel.h \ elementspanelwidget.h \ elementtextitem.h \ exportdialog.h \ fixedelement.h \ + nameslist.h \ newelementwizard.h \ qetapp.h \ - terminal.h \ - elementscategoryeditor.h \ - elementscategory.h + terminal.h SOURCES += aboutqet.cpp \ borderinset.cpp \ conducer.cpp \ @@ -38,17 +39,18 @@ SOURCES += aboutqet.cpp \ element.cpp \ elementscategorieslist.cpp \ elementscategorieswidget.cpp \ + elementscategory.cpp \ + elementscategoryeditor.cpp \ elementspanel.cpp \ elementspanelwidget.cpp \ elementtextitem.cpp \ exportdialog.cpp \ fixedelement.cpp \ main.cpp \ + nameslist.cpp \ newelementwizard.cpp \ qetapp.cpp \ - terminal.cpp \ - elementscategoryeditor.cpp \ - elementscategory.cpp + terminal.cpp RESOURCES += qelectrotech.qrc TRANSLATIONS += lang/qet_en.ts lang/qt_fr.ts CONFIG += debug warn_on