From b0ff172ee73e09ea3317573762fd251d7d84e97f Mon Sep 17 00:00:00 2001 From: xavierqet Date: Wed, 4 Apr 2007 02:13:14 +0000 Subject: [PATCH] git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@77 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- conducer.cpp | 1 + diagramview.cpp | 3 + elementscategorieslist.cpp | 136 +++++++++++++++++++++++++++++++++++ elementscategorieslist.h | 30 ++++++++ elementscategorieswidget.cpp | 41 +++++++++++ elementscategorieswidget.h | 30 ++++++++ elementspanelwidget.cpp | 7 ++ elementspanelwidget.h | 3 + newelementwizard.cpp | 103 ++++++++++++++++++++++++++ newelementwizard.h | 40 +++++++++++ qelectrotech.pro | 24 ++++--- 11 files changed, 410 insertions(+), 8 deletions(-) create mode 100644 elementscategorieslist.cpp create mode 100644 elementscategorieslist.h create mode 100644 elementscategorieswidget.cpp create mode 100644 elementscategorieswidget.h create mode 100644 newelementwizard.cpp create mode 100644 newelementwizard.h diff --git a/conducer.cpp b/conducer.cpp index 069f7e7ae..3c16bacb6 100644 --- a/conducer.cpp +++ b/conducer.cpp @@ -2,6 +2,7 @@ #include "conducer.h" #include "conducersegment.h" #include "element.h" +#define PR(x) qDebug() << #x " = " << x; bool Conducer::pen_and_brush_initialized = false; QPen Conducer::conducer_pen = QPen(); diff --git a/diagramview.cpp b/diagramview.cpp index 6d5f5173a..c1a46c6a5 100644 --- a/diagramview.cpp +++ b/diagramview.cpp @@ -423,6 +423,9 @@ void DiagramView::dialogPrint() { qprin.setOutputFormat(QPrinter::PdfFormat); qprin.setOrientation(QPrinter::Landscape); qprin.setPageSize(QPrinter::A4); +#ifdef Q_WS_X11 +// qprin.setPrintProgram("lpr"); +#endif QPrintDialog qpd(&qprin, this); if (qpd.exec() == QDialog::Accepted) { diff --git a/elementscategorieslist.cpp b/elementscategorieslist.cpp new file mode 100644 index 000000000..0a25fb841 --- /dev/null +++ b/elementscategorieslist.cpp @@ -0,0 +1,136 @@ +#include +#include "elementscategorieslist.h" +#include "qetapp.h" + +/** + Constructeur + @param parent QWidget parent de ce widget +*/ +ElementsCategoriesList::ElementsCategoriesList(QWidget *parent) : QTreeWidget(parent) { + // selection unique + setSelectionMode(QAbstractItemView::SingleSelection); + setColumnCount(1); + header() -> hide(); + + // charge les categories + reload(); +} + +/** + Destructeur +*/ +ElementsCategoriesList::~ElementsCategoriesList() { + +} + +/** + Recharge l'arbre des categories +*/ +void ElementsCategoriesList::reload() { + // vide l'arbre + while (takeTopLevelItem(0)); + + // chargement des elements de la collection utilisateur + addDir(invisibleRootItem(), QETApp::customElementsDir(), tr("Collection utilisateur")); +} + +/** + Methode privee permettant d'ajouter un dossier au panel d'appareils + @param qtwi_parent QTreeWidgetItem parent sous lequel sera insere l'element + @param dossier Chemin absolu du dossier a inserer + @param nom Parametre facultatif permettant de forcer le nom du dossier. + S'il n'est pas precise, la fonction ouvre le fichier qet_directory situe + dans le dossier et y lit le nom du dossier ; si ce fichier n'existe pas ou + est invalide, la fonction utilise le nom du dossier. +*/ +void ElementsCategoriesList::addDir(QTreeWidgetItem *qtwi_parent, QString adr_dossier, QString nom) { + QDir dossier(adr_dossier); + if (!dossier.exists()) return; + adr_dossier = dossier.canonicalPath() + "/"; + + // recupere le nom de la categorie + QString nom_categorie = (nom != QString()) ? nom : categoryName(dossier); + + // creation du QTreeWidgetItem representant le dossier + QTreeWidgetItem *qtwi_dossier = new QTreeWidgetItem(qtwi_parent, QStringList(nom_categorie)); + qtwi_dossier -> setData(0, Qt::UserRole, dossier.absolutePath()); + qtwi_dossier -> setExpanded(true); + + // ajout des sous-categories / sous-dossiers + QStringList dossiers = dossier.entryList(QStringList(), QDir::AllDirs | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDir::Name); + foreach(QString dossier, dossiers) addDir(qtwi_dossier, adr_dossier + dossier); +} + +/** + Methode permettant d'obtenir le nom affichable d'une categorie etant donne + son chemin (dossier). + @param directory le chemin du dossier representant la categorie + @return Le nom affichable de la categorie +*/ +QString ElementsCategoriesList::categoryName(QDir &directory) { + // en cas d'echec de la lecture du fichier de configuration + // "qet_directory", le nom du dossier est retourne + QString category_name = directory.dirName(); + // repere le chemin du fichier de configuration de la categorie + QFile directory_conf(directory.canonicalPath() + "/qet_directory"); + // verifie l'existence du fichier + if (directory_conf.exists()) { + // ouvre le fichier + if (directory_conf.open(QIODevice::ReadOnly | QIODevice::Text)) { + // recupere les deux premiers caracteres de la locale en cours du systeme + QString system_language = QLocale::system().name().left(2); + // lit le contenu du fichier dans un QDomDocument XML + QDomDocument document; + if (document.setContent(&directory_conf)) { + /* parcourt le document XML a la recherche d'un nom + par ordre de preference, on prendra : + - le nom dans la langue du systeme + - le nom en anglais + - le nom du dossier + */ + QDomElement root = document.documentElement(); + if (root.tagName() == "qet-directory") { + bool name_found = false; + // 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; + if (name.attribute("lang") == system_language) { + category_name = name.text(); + name_found = true; + break; + } else if (name.attribute("lang") == "en") { + category_name = name.text(); + } + } + if (name_found) break; + } + } + } + directory_conf.close(); + } + } + return(category_name); +} + +/** + @return Le dossier de la categorie selectionnee +*/ +QString ElementsCategoriesList::selectedCategoryPath() { + QTreeWidgetItem *qtwi = currentItem(); + if (qtwi) return(qtwi -> data(0, Qt::UserRole).toString()); + else return(NULL); +} + +/** + @return Le nom de la categorie selectionnee +*/ +QString ElementsCategoriesList::selectedCategoryName() { + QTreeWidgetItem *qtwi = currentItem(); + if (qtwi) return(qtwi -> data(0, Qt::DisplayRole).toString()); + else return(NULL); +} diff --git a/elementscategorieslist.h b/elementscategorieslist.h new file mode 100644 index 000000000..1f27c0045 --- /dev/null +++ b/elementscategorieslist.h @@ -0,0 +1,30 @@ +#ifndef ELEMENTS_CATEGORIES_LIST_H +#define ELEMENTS_CATEGORIES_LIST_H +#include +/** + Cette classe fournit une liste graphique des categories d'elements de + l'utilisateur. +*/ +class ElementsCategoriesList : public QTreeWidget { + Q_OBJECT + // Constructeur, destructeur + public: + ElementsCategoriesList(QWidget * = 0); + ~ElementsCategoriesList(); + + // attributs + + + // methodes + private: + void addDir(QTreeWidgetItem *, QString, QString = QString()); + QString categoryName(QDir &); + + public: + QString selectedCategoryPath(); + QString selectedCategoryName(); + + public slots: + void reload(); +}; +#endif diff --git a/elementscategorieswidget.cpp b/elementscategorieswidget.cpp new file mode 100644 index 000000000..6be910c82 --- /dev/null +++ b/elementscategorieswidget.cpp @@ -0,0 +1,41 @@ +#include "elementscategorieswidget.h" +#include "elementscategorieslist.h" + +ElementsCategoriesWidget::ElementsCategoriesWidget() { + // initialise la liste des categories + elementscategorieslist = new ElementsCategoriesList(this); + + // initialise la barre d'outils + toolbar = new QToolBar(this); + toolbar -> setMovable(false); + toolbar -> addAction(QIcon(":/ico/reload.png"), tr("Recharger les cat\351gories"), elementscategorieslist, SLOT(reload()) ); + toolbar -> addAction(QIcon(":/ico/new.png"), tr("Nouvelle cat\351gorie"), this, SLOT(newCategory()) ); + toolbar -> addAction(QIcon(":/ico/open.png"), tr("\311diter la cat\351gorie"), this, SLOT(editCategory()) ); + toolbar -> addAction(QIcon(":/ico/editdelete.png"), tr("Supprimer la cat\351gorie"), this, SLOT(removeCategory())); + + // disposition verticale + QVBoxLayout *vlayout = new QVBoxLayout(this); + vlayout -> setMargin(0); + vlayout -> setSpacing(0); + vlayout -> addWidget(toolbar); + vlayout -> addWidget(elementscategorieslist); + vlayout -> setStretchFactor(elementscategorieslist, 75000); + setLayout(vlayout); +} + +ElementsCategoriesWidget::~ElementsCategoriesWidget() { + +} + +void ElementsCategoriesWidget::newCategory() { + +} + +void ElementsCategoriesWidget::editCategory() { + +} + +void ElementsCategoriesWidget::removeCategory() { + qDebug() << elementscategorieslist -> selectedCategoryName(); + qDebug() << elementscategorieslist -> selectedCategoryPath(); +} diff --git a/elementscategorieswidget.h b/elementscategorieswidget.h new file mode 100644 index 000000000..97f1e2e78 --- /dev/null +++ b/elementscategorieswidget.h @@ -0,0 +1,30 @@ +#ifndef ELEMENTS_CATEGORIES_WIDGET_H +#define ELEMENTS_CATEGORIES_WIDGET_H +#include +/** + Cette classe represente un widget integrant la liste des categories + de l'utilisteur surplombee de boutons permettant d'ajouter +*/ +class ElementsCategoriesList; +class ElementsCategoriesWidget : public QWidget { + Q_OBJECT + // Constructeur, destructeur + public: + ElementsCategoriesWidget(); + ~ElementsCategoriesWidget(); + + // attributs + private: + ElementsCategoriesList *elementscategorieslist; + QToolBar *toolbar; + + // methodes + public: + inline ElementsCategoriesList &elementsCategoriesList() const { return(*elementscategorieslist); } + + public slots: + void newCategory(); + void editCategory(); + void removeCategory(); +}; +#endif diff --git a/elementspanelwidget.cpp b/elementspanelwidget.cpp index 534989a5a..4d723684b 100644 --- a/elementspanelwidget.cpp +++ b/elementspanelwidget.cpp @@ -1,4 +1,5 @@ #include "elementspanelwidget.h" +#include "newelementwizard.h" ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) { // initalise le panel d'elements @@ -8,6 +9,7 @@ ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) { toolbar = new QToolBar(this); toolbar -> setMovable(false); toolbar -> addAction(QIcon(":/ico/reload.png"), tr("Recharger les collections"), elements_panel, SLOT(reload())); + toolbar -> addAction(QIcon(":/ico/new.png"), tr("Nouvel \351l\351ment"), this, SLOT(newElement())); // disposition verticale QVBoxLayout *vlayout = new QVBoxLayout(this); @@ -18,3 +20,8 @@ ElementsPanelWidget::ElementsPanelWidget(QWidget *parent) : QWidget(parent) { vlayout -> setStretchFactor(elements_panel, 75000); setLayout(vlayout); } + +void ElementsPanelWidget::newElement() { + NewElementWizard *new_element_wizard = new NewElementWizard(); + new_element_wizard -> exec(); +} diff --git a/elementspanelwidget.h b/elementspanelwidget.h index 5c9e53de3..e7ca1982e 100644 --- a/elementspanelwidget.h +++ b/elementspanelwidget.h @@ -17,5 +17,8 @@ // methodes public: inline ElementsPanel &elementsPanel() const { return(*elements_panel); } + + public slots: + void newElement(); }; #endif diff --git a/newelementwizard.cpp b/newelementwizard.cpp new file mode 100644 index 000000000..302256dcd --- /dev/null +++ b/newelementwizard.cpp @@ -0,0 +1,103 @@ +#include "newelementwizard.h" +#include "elementscategorieswidget.h" + +NewElementWizard::NewElementWizard(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { + QVBoxLayout *dialog_layout = new QVBoxLayout(); + setLayout(dialog_layout); + + // 1ere etape : dimensions + etape1 = new QWidget(this); + sb_largeur = new QSpinBox(); + sb_largeur -> setMinimum(1); + sb_hauteur = new QSpinBox(); + sb_hauteur -> setMinimum(1); + + 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); + + QVBoxLayout *etape1_layout = new QVBoxLayout(); + etape1_layout -> addWidget(new QLabel(tr("Saisissez la largeur et la hauteur du nouvel \351l\351ment"))); + etape1_layout -> addLayout(grid_layout); + etape1 -> setLayout(etape1_layout); + + // 2eme etape : enregistrement + etape2 = new QWidget(this); + QVBoxLayout *etape2_layout = new QVBoxLayout(); + etape2_layout -> addWidget(new QLabel(tr("Entrez un nom et une cat\351gorie dans laquelle enregistrer le nouvel \351l\351ment."))); + qle_nom_element = new QLineEdit(); + etape2_layout -> addWidget(qle_nom_element); + categories_list = new ElementsCategoriesWidget(); + etape2_layout -> addWidget(categories_list); + etape2 -> setLayout(etape2_layout); + + + // dialogue itself + setWindowTitle(tr("Cr\351er un nouvel \351l\351ment : Assistant")); + + dialog_layout -> addWidget(etape1); + dialog_layout -> addWidget(etape2); + etape2 -> hide(); + + // boutons + QDialogButtonBox *boutons = new QDialogButtonBox(QDialogButtonBox::Cancel); + button_previous = new QPushButton(tr("Pr\351c\351dent"), this); + button_previous -> setEnabled(false); + button_next = new QPushButton(tr("Suivant"), this); + boutons -> addButton(button_previous, QDialogButtonBox::ActionRole); + boutons -> addButton(button_next, QDialogButtonBox::ActionRole); + connect(button_previous, SIGNAL(released()), this, SLOT(previous())); + connect(button_next, SIGNAL(released()), this, SLOT(next())); + connect(boutons, SIGNAL(rejected()), this, SLOT(accept())); + dialog_layout -> addWidget(boutons); + current_state = Dimensions; + +} + +NewElementWizard::~NewElementWizard() { +} + +void NewElementWizard::previous() { + switch(current_state) { + case Dimensions: + return; + case Enregistrement: + current_state = Dimensions; + etape1 -> show(); + etape2 -> hide(); + button_next -> setText(tr("Suivant")); + button_previous -> setEnabled(false); + } +} + +void NewElementWizard::next() { + switch(current_state) { + case Dimensions: + current_state = Enregistrement; + etape1 -> hide(); + etape2 -> show(); + button_next -> setText(tr("Valider")); + button_previous -> setEnabled(true); + break; + case Enregistrement: + valid(); + } +} + +void NewElementWizard::valid() { + return; + switch(current_state) { + case Dimensions: + + case Enregistrement: + + current_state = Dimensions; + button_next -> setText(tr("Suivant")); + } +} + + diff --git a/newelementwizard.h b/newelementwizard.h new file mode 100644 index 000000000..2f0309221 --- /dev/null +++ b/newelementwizard.h @@ -0,0 +1,40 @@ +/** + Cette classe represente un dialogue qui permet a l'utilisateur de specifier + les premiers parametres de l'element qu'il va construire. + Ces parametres sont : + - la largeur + - la hauteur + - et euh... pleins de choses interessantes +*/ + +#include +class ElementsCategoriesWidget; +class NewElementWizard : public QDialog { + Q_OBJECT + // Constructeur, destructeur + public: + NewElementWizard(QWidget * = 0, Qt::WindowFlags = 0); + ~NewElementWizard(); + + // attributs + private: + enum WizardState { Dimensions, Enregistrement }; + QSpinBox *sb_largeur; + QSpinBox *sb_hauteur; + QWidget *etape1; + QWidget *etape2; + QLineEdit *qle_nom_element; + QPushButton *button_previous; + QPushButton *button_next; + ElementsCategoriesWidget* categories_list; + WizardState current_state; + + // methodes + public: + + // slots + public slots: + void previous(); + void next(); + void valid(); +}; diff --git a/qelectrotech.pro b/qelectrotech.pro index 1a7314a4f..723eea36a 100644 --- a/qelectrotech.pro +++ b/qelectrotech.pro @@ -1,5 +1,5 @@ ###################################################################### -# Automatically generated by qmake (2.01a) sam. oct. 28 15:30:56 2006 +# Automatically generated by qmake (2.01a) mer. avr. 4 03:03:56 2007 ###################################################################### TEMPLATE = app @@ -11,35 +11,43 @@ INCLUDEPATH += . HEADERS += aboutqet.h \ borderinset.h \ conducer.h \ + conducersegment.h \ customelement.h \ diagram.h \ diagramview.h \ element.h \ + elementscategorieslist.h \ + elementscategorieswidget.h \ elementspanel.h \ + elementspanelwidget.h \ + elementtextitem.h \ exportdialog.h \ fixedelement.h \ + newelementwizard.h \ qetapp.h \ terminal.h \ - conducersegment.h \ - elementtextitem.h \ - elementspanelwidget.h + ui_export_fichier.h SOURCES += aboutqet.cpp \ borderinset.cpp \ conducer.cpp \ + conducersegment.cpp \ customelement.cpp \ diagram.cpp \ diagramview.cpp \ element.cpp \ + elementscategorieslist.cpp \ + elementscategorieswidget.cpp \ elementspanel.cpp \ + elementspanelwidget.cpp \ + elementtextitem.cpp \ exportdialog.cpp \ fixedelement.cpp \ main.cpp \ + newelementwizard.cpp \ qetapp.cpp \ - terminal.cpp \ - conducersegment.cpp \ - elementtextitem.cpp \ - elementspanelwidget.cpp + terminal.cpp RESOURCES += qelectrotech.qrc TRANSLATIONS += lang/qet_en.ts lang/qt_fr.ts +CONFIG += debug warn_on QT += xml