[qet] [4456] Element dialog : Remove ElementsCategoriesList and use QTreeView with ElementsCollectionModel instead |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
Revision: 4456
Author: blacksun
Date: 2016-04-19 11:29:40 +0200 (Tue, 19 Apr 2016)
Log Message:
-----------
Element dialog : Remove ElementsCategoriesList and use QTreeView with ElementsCollectionModel instead
Modified Paths:
--------------
trunk/sources/ElementsCollection/elementslocation.cpp
trunk/sources/ElementsCollection/xmlelementcollection.cpp
trunk/sources/ElementsCollection/xmlelementcollection.h
trunk/sources/editor/qetelementeditor.cpp
trunk/sources/elementdialog.cpp
trunk/sources/elementdialog.h
Modified: trunk/sources/ElementsCollection/elementslocation.cpp
===================================================================
--- trunk/sources/ElementsCollection/elementslocation.cpp 2016-04-18 21:30:45 UTC (rev 4455)
+++ trunk/sources/ElementsCollection/elementslocation.cpp 2016-04-19 09:29:40 UTC (rev 4456)
@@ -238,26 +238,8 @@
p = QETApp::customElementsDirN() + "/" + tmp_path;
}
- //This is an element
- if (path.endsWith(".elmt"))
- {
- QFile file(p);
- if (file.exists())
- {
- m_file_system_path = p;
- m_collection_path = path;
- }
- }
- //They must be a directory
- else
- {
- QDir dir(p);
- if(dir.exists())
- {
- m_file_system_path = p;
- m_collection_path = path;
- }
- }
+ m_file_system_path = p;
+ m_collection_path = path;
}
//In this case, the path is supposed to be relative to the file system.
else
@@ -567,22 +549,39 @@
QString error;
QETXML::writeXmlFile(xml_document, fileSystemPath(), &error);
- if (!error.isEmpty())
- {
+ if (!error.isEmpty()) {
qDebug() << "ElementsLocation::setXml error : " << error;
return false;
}
- else
+ else {
return true;
+ }
}
- else if (isProject() && exist())
+ else if (isProject())
{
- QDomElement dom_element = xml();
- QDomNode parent_node = dom_element.parentNode();
- parent_node.removeChild(dom_element);
- parent_node.appendChild(xml_document.documentElement().cloneNode(true));
+ //Element exist, we overwrite the existing element.
+ if (exist())
+ {
+ QDomElement dom_element = xml();
+ QDomNode parent_node = dom_element.parentNode();
+ parent_node.removeChild(dom_element);
+ parent_node.appendChild(xml_document.documentElement().cloneNode(true));
+ return true;
+ }
+ //Element doesn't exist, we create the element
+ else
+ {
+ QString path_ = collectionPath(false);
+ QRegExp rx ("^(.*)/(.*\\.elmt)$");
- return true;
+ if (rx.exactMatch(path_)) {
+ return project()->embeddedElementCollection()->addElementDefinition(rx.cap(1), rx.cap(2), xml_document.documentElement());
+ }
+ else {
+ qDebug() << "ElementsLocation::setXml : rx don't match";
+ }
+
+ }
}
return false;
Modified: trunk/sources/ElementsCollection/xmlelementcollection.cpp
===================================================================
--- trunk/sources/ElementsCollection/xmlelementcollection.cpp 2016-04-18 21:30:45 UTC (rev 4455)
+++ trunk/sources/ElementsCollection/xmlelementcollection.cpp 2016-04-19 09:29:40 UTC (rev 4456)
@@ -392,6 +392,44 @@
}
/**
+ * @brief XmlElementCollection::addElementDefinition
+ * Add the élément defintion @xml_definition in the directory at path @dir_path with the name @elmt_name.
+ * @param dir_path : the path of the directory where we must add the element.
+ * The path must be an existing directory of this collection.
+ * @param elmt_name : The name used to store the element (the name must end with .elmt, if not, .elmt will be append to @elmt_name)
+ * @param xml_definition : The xml definition of the element.
+ * The tag name of @xml_definition must be "definition".
+ * @return True if the element is added with success.
+ */
+bool XmlElementCollection::addElementDefinition(const QString &dir_path, const QString &elmt_name, const QDomElement &xml_definition)
+{
+ QDomElement dom_dir = directory(dir_path);
+ if (dom_dir.isNull()) {
+ qDebug() << "XmlElementCollection::addElementDefinition : No directory at path : " << dir_path;
+ return false;
+ }
+
+ if (xml_definition.tagName() != "definition") {
+ qDebug() << "XmlElementCollection::addElementDefinition : xml_defintion tag name is not \"definition\"";
+ return false;
+ }
+
+ QString name = elmt_name;
+ if (!name.endsWith(".elmt")) {
+ name += ".elmt";
+ }
+
+ QDomElement dom_elmt = m_dom_document.createElement("element");
+ dom_elmt.setAttribute("name", name);
+ dom_elmt.appendChild(xml_definition.cloneNode(true));
+ dom_dir.appendChild(dom_elmt);
+
+ emit elementAdded(dir_path + "/" + name);
+
+ return true;
+}
+
+/**
* @brief XmlElementCollection::copy
* Copy the content represented by source (an element or a directory) to destination.
* Destination must be a directory of this collection.
Modified: trunk/sources/ElementsCollection/xmlelementcollection.h
===================================================================
--- trunk/sources/ElementsCollection/xmlelementcollection.h 2016-04-18 21:30:45 UTC (rev 4455)
+++ trunk/sources/ElementsCollection/xmlelementcollection.h 2016-04-19 09:29:40 UTC (rev 4456)
@@ -47,6 +47,7 @@
QDomElement element(const QString &path);
QDomElement directory(const QString &path);
QString addElement (ElementsLocation &location);
+ bool addElementDefinition (const QString &dir_path, const QString &elmt_name, const QDomElement &xml_definition);
ElementsLocation copy (ElementsLocation &source, ElementsLocation &destination, QString rename = QString(), bool deep_copy = true);
bool exist (const QString &path);
Modified: trunk/sources/editor/qetelementeditor.cpp
===================================================================
--- trunk/sources/editor/qetelementeditor.cpp 2016-04-18 21:30:45 UTC (rev 4455)
+++ trunk/sources/editor/qetelementeditor.cpp 2016-04-19 09:29:40 UTC (rev 4456)
@@ -858,7 +858,6 @@
tr("Impossible d'enregistrer l'élément", "message box content"));
return(false);
}
-
return(true);
}
Modified: trunk/sources/elementdialog.cpp
===================================================================
--- trunk/sources/elementdialog.cpp 2016-04-18 21:30:45 UTC (rev 4455)
+++ trunk/sources/elementdialog.cpp 2016-04-19 09:29:40 UTC (rev 4456)
@@ -16,362 +16,283 @@
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "elementdialog.h"
-#include <QtWidgets>
#include "qetapp.h"
-#include "elementscategorieslist.h"
-#include "elementscollectionitem.h"
#include "qfilenameedit.h"
+#include "elementcollectionitem.h"
+#include "elementscollectionmodel.h"
#include "qetmessagebox.h"
/**
- Constructeur par defaut.
- Construit un dialogue permettant d'ouvrir un element
- @param mode Mode du dialogue
- @see ElementDialog::Mode
- @param parentWidget QWidget parent
- @param parent QObject parent
-
-*/
-ElementDialog::ElementDialog(uint mode, QWidget *parentWidget, QObject *parent) :
- QObject(parent),
- mode_(mode),
- buttons_(0),
- list_(0),
- textfield_(0)
+ * @brief ElementDialog::ElementDialog
+ * @param mode
+ * @param parent
+ */
+ElementDialog::ElementDialog(uint mode, QWidget *parent) :
+ QDialog(parent),
+ m_mode(mode)
{
- dialog_ = new QDialog(parentWidget);
- dialog_ -> setWindowModality(Qt::WindowModal);
+ setUpWidget();
+ setUpConnection();
+}
+
+/**
+ * @brief ElementDialog::setUpWidget
+ * Build and setup the widgets of this dialog
+ */
+void ElementDialog::setUpWidget()
+{
+ setWindowModality(Qt::WindowModal);
#ifdef Q_OS_MAC
- dialog_ -> setWindowFlags(Qt::Sheet);
+ setWindowFlags(Qt::Sheet);
#endif
- buttons_ = new QDialogButtonBox();
-
- // types selectionnables dans la liste
- bool display_elements = (mode_ == OpenElement || mode_ == SaveElement);
- int selectables = 0;
- switch(mode_) {
- case OpenElement: selectables = QET::Element; break;
- case SaveElement: selectables = QET::ElementsCollectionItem; break;
- case OpenCategory: selectables = QET::ElementsContainer; break;
- case SaveCategory: selectables = QET::ElementsContainer; break;
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+
+ QString title_, label_;
+ switch (m_mode)
+ {
+ case OpenElement:
+ title_ = tr("Ouvrir un élément", "dialog title");
+ label_ = tr("Choisissez l'élément que vous souhaitez ouvrir.", "dialog content");
+ break;
+ case SaveElement:
+ title_ = tr("Enregistrer un élément", "dialog title");
+ label_ = tr("Choisissez l'élément dans lequel vous souhaitez enregistrer votre définition.", "dialog content");
+ break;
+ case OpenCategory:
+ title_ = tr("Ouvrir une catégorie", "dialog title");
+ label_ = tr("Choisissez une catégorie.", "dialog content");
+ break;
+ case SaveCategory:
+ title_ = tr("Enregistrer une catégorie", "dialog title");
+ label_ = tr("Choisissez une catégorie.", "dialog content");
+ break;
+ default:
+ title_ = tr("Titre");
+ label_ = tr("Label");
+ break;
}
- list_ = new ElementsCategoriesList(display_elements, selectables);
- connect(list_, SIGNAL(locationChanged(const ElementsLocation &)), this, SLOT(locationChanged(const ElementsLocation &)));
-
- // titre et label
- if (!mode) {
- title_ = tr("Ouvrir un élément", "dialog title");
- label_ = tr("Choisissez l'élément que vous souhaitez ouvrir.", "dialog content");
- } else if (mode == 1) {
- title_ = tr("Enregistrer un élément", "dialog title");
- label_ = tr("Choisissez l'élément dans lequel vous souhaitez enregistrer votre définition.", "dialog content");
- } else if (mode == 2) {
- title_ = tr("Ouvrir une catégorie", "dialog title");
- label_ = tr("Choisissez une catégorie.", "dialog content");
- } else {
- title_ = tr("Enregistrer une catégorie", "dialog title");
- label_ = tr("Choisissez une catégorie.", "dialog content");
- }
-
- // mode ouverture / enregistrement
- if (mode_ == SaveCategory || mode_ == SaveElement) {
- buttons_ -> setStandardButtons(QDialogButtonBox::Save | QDialogButtonBox::Cancel);
- textfield_ = new QFileNameEdit();
- connect(textfield_, SIGNAL(textChanged(const QString &)), this, SLOT(textFieldChanged(const QString &)));
- } else {
- buttons_ -> setStandardButtons(QDialogButtonBox::Open | QDialogButtonBox::Cancel);
- }
-
- // connexions boutons -> dialogue
- connect(buttons_, SIGNAL(accepted()), this, SLOT(checkDialog()));
- connect(buttons_, SIGNAL(rejected()), dialog_, SLOT(reject()));
-
- // connexions dialogue -> classe
- connect(dialog_, SIGNAL(accepted()), this, SLOT(dialogAccepted()));
- connect(dialog_, SIGNAL(rejected()), this, SLOT(dialogRejected()));
-
- makeInterface();
-}
+ setWindowTitle(title_);
-/**
- Destructeur
-*/
-ElementDialog::~ElementDialog() {
- dialog_ -> setParent(0);
- delete dialog_;
-}
+ layout->addWidget(new QLabel(label_));
-/**
- Affiche un dialogue permettant a l'utilisateur de selectionner une categorie existant deja
- @param parentWidget QWidget parent
- @return le chemin virtuel de cette categorie
-*/
-ElementsLocation ElementDialog::getExistingCategoryLocation(QWidget *parentWidget) {
- return(ElementDialog::execConfiguredDialog(ElementDialog::OpenCategory, parentWidget));
-}
-/**
- Affiche un dialogue permettant a l'utilisateur de selectionner une nouvelle categorie
- @param parentWidget QWidget parent
- @return le chemin virtuel de cette categorie
-*/
-ElementsLocation ElementDialog::getNewCategoryLocation(QWidget *parentWidget) {
- return(ElementDialog::execConfiguredDialog(ElementDialog::SaveCategory, parentWidget));
-}
+ m_tree_view = new QTreeView(this);
-/**
- Affiche un dialogue permettant a l'utilisateur de selectionner un element a ouvrir
- @param parentWidget QWidget parent
- @return le chemin virtuel de cet element
-*/
-ElementsLocation ElementDialog::getOpenElementLocation(QWidget *parentWidget) {
- return(ElementDialog::execConfiguredDialog(ElementDialog::OpenElement, parentWidget));
-}
+ ElementsCollectionModel *model = new ElementsCollectionModel(m_tree_view);
+ if (m_mode == OpenElement) {model->addCommonCollection();}
+ model->addCustomCollection();
+ foreach (QETProject *project, QETApp::registeredProjects()) {
+ model->addProject(project);
+ }
-/**
- Affiche un dialogue permettant a l'utilisateur de selectionner un element (existant ou non)
- qu'il souhaite enregistrer
- @param parentWidget QWidget parent
- @return le chemin virtuel de cet element
-*/
-ElementsLocation ElementDialog::getSaveElementLocation(QWidget *parentWidget) {
- return(ElementDialog::execConfiguredDialog(ElementDialog::SaveElement, parentWidget));
-}
+ m_tree_view->setModel(model);
+ m_tree_view->setHeaderHidden(true);
+ layout->addWidget(m_tree_view);
-/**
- Lance un dialogue selon la configuration mode
- @param mode Mode du dialogue
- @param parentWidget QWidget parent
-*/
-ElementsLocation ElementDialog::execConfiguredDialog(int mode, QWidget *parentWidget) {
- ElementDialog element_dialog(mode, parentWidget);
- element_dialog.exec();
- return(element_dialog.location());
-}
-/**
- Assemble les widgets pour obtenir le dialogue final
-*/
-void ElementDialog::makeInterface() {
- dialog_ -> setWindowTitle(title_);
-
- // disposition verticale
- QVBoxLayout *layout = new QVBoxLayout(dialog_);
- layout -> addWidget(new QLabel(label_));
- layout -> addWidget(list_);
- if (textfield_) {
- QHBoxLayout *filename_layout = new QHBoxLayout();
- filename_layout -> addWidget(new QLabel(tr("Nom :")));
- filename_layout -> addWidget(textfield_);
- layout -> addLayout(filename_layout);
+ m_buttons_box = new QDialogButtonBox(this);
+
+ if (m_mode == SaveCategory || m_mode == SaveElement)
+ {
+ m_buttons_box->setStandardButtons(QDialogButtonBox::Save | QDialogButtonBox::Cancel);
+ m_buttons_box->button(QDialogButtonBox::Save)->setDisabled(true);
+
+ m_text_field = new QFileNameEdit();
+ m_text_field->setDisabled(true);
+ m_text_field->setPlaceholderText(m_mode == SaveCategory? tr("Nom du nouveau dossier") : tr("Nom du nouvel élément"));
+
+ layout->addWidget(m_text_field);
}
- layout -> addWidget(buttons_);
+ else
+ {
+ m_buttons_box->setStandardButtons(QDialogButtonBox::Open | QDialogButtonBox::Cancel);
+ m_buttons_box->button(QDialogButtonBox::Open)->setDisabled(true);
+ }
+
+ layout->addWidget(m_buttons_box);
}
/**
- Execute le dialogue
- @return QDialog::Accepted si le dialogue a ete accepte, false sinon
- @see DialogCode
-*/
-int ElementDialog::exec() {
- return(dialog_ -> exec());
+ * @brief ElementDialog::setUpConnection
+ * Setup connection of this dialog
+ */
+void ElementDialog::setUpConnection()
+{
+ connect(m_tree_view, &QTreeView::clicked, this, &ElementDialog::indexClicked);
+ connect(m_buttons_box, &QDialogButtonBox::accepted, this, &ElementDialog::checkAccept);
+ connect(m_buttons_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
+
+ if (m_text_field) { connect(m_text_field, &QFileNameEdit::textChanged, this, &ElementDialog::checkCurrentLocation); }
}
/**
- @return le chemin virtuel choisi via le dialogue
- Si l'utilisateur n'a pas pu faire son choix, une chaine vide est retournee.
-*/
-ElementsLocation ElementDialog::location() const {
- return(location_);
+ * @brief ElementDialog::indexClicked
+ * @param index
+ */
+void ElementDialog::indexClicked(const QModelIndex &index)
+{
+ ElementCollectionItem *eci = static_cast<ElementCollectionItem*> (index.internalPointer());
+ m_location = ElementsLocation(eci->collectionPath());
+ checkCurrentLocation();
}
/**
- gere le changement de chemin virtuel par l'utilisateur
- @param new_loc le nouveau chemin virtuel choisi par l'utilisateur
-*/
-void ElementDialog::locationChanged(const ElementsLocation &new_loc) {
- ElementsCollectionItem *item = QETApp::collectionItem(new_loc);
- if (!item) return;
- if (mode_ == OpenElement) {
- buttons_ -> button(QDialogButtonBox::Open) -> setEnabled(item -> isElement());
- } else if (mode_ == SaveElement) {
- // si l'utilisateur choisit un element existant, on desactive le champ
- textfield_ -> setEnabled(!item -> isElement());
- // il faut soit un element selectionne soit une categorie et un nom
- buttons_ -> button(QDialogButtonBox::Save) -> setEnabled(
- ((item -> isCategory() || item -> isCollection()) && !textfield_ -> text().isEmpty()) ||\
- item -> isElement()
- );
- } else if (mode_ == OpenCategory) {
- /// @todo
- } else if (mode_ == SaveCategory) {
- /// @todo
+ * @brief ElementDialog::checkCurrentLocation
+ * Update this dialog according to the current selected location and the current mode
+ */
+void ElementDialog::checkCurrentLocation()
+{
+ if (m_mode == OpenElement) {
+ m_buttons_box->button(QDialogButtonBox::Open)->setEnabled(m_location.isElement() && m_location.exist());
}
- location_ = new_loc;
-}
+ else if (m_mode == SaveElement)
+ {
+ m_buttons_box->button(QDialogButtonBox::Save)->setDisabled(true);
-/**
- Gere le changement de contenu dans le champ de texte
- @param text Contenu du champ de texte
-*/
-void ElementDialog::textFieldChanged(const QString &text) {
- ElementsCollectionItem *item = QETApp::collectionItem(list_ -> selectedLocation());
- if (!item) return;
- if (mode_ == SaveElement) {
- // il faut soit un element selectionne soit une categorie et un nom
- buttons_ -> button(QDialogButtonBox::Save) -> setEnabled(
- ((item -> isCategory() || item -> isCollection()) && !text.isEmpty()) ||\
- item -> isElement()
- );
- } else if (mode_ == SaveCategory) {
- // il faut forcement un nom pour la nouvelle categorie
- buttons_ -> button(QDialogButtonBox::Save) -> setEnabled(!text.isEmpty());
+ //Location doesn't exist
+ if (!m_location.exist()) { return; }
+
+ if (m_location.isElement())
+ {
+ m_text_field->setDisabled(true);
+ m_buttons_box->button(QDialogButtonBox::Save)->setEnabled(true);
+ }
+ else if (m_location.isDirectory())
+ {
+ m_text_field->setEnabled(true);
+
+ if (m_text_field->text().isEmpty()) { return; }
+
+ //Only enable save button if the location at path :
+ //m_location.collectionPath + m_text_filed.text doesn't exist.
+ QString new_path = m_text_field->text();
+ if (!new_path.endsWith(".elmt")) new_path += ".elmt";
+
+ ElementsLocation loc = m_location;
+ loc.addToPath(new_path);
+
+ m_buttons_box->button(QDialogButtonBox::Save)->setDisabled(loc.exist() ? true : false);
+ }
}
}
-/**
- Verifie l'etat du dialogue au moment ou l'utilisateur le valide.
-*/
-void ElementDialog::checkDialog() {
- // verifie si ce qui a ete selectionne par l'utilisateur correspond au mode du widget
- if (mode_ == OpenElement) {
- // l'utilisateur doit avoir choisi un element existant
-
- // on verifie d'abord que l'utilisateur a choisi quelque chose
- ElementsLocation location = list_ -> selectedLocation();
- if (location.isNull()) {
- QET::QetMessageBox::critical(
- dialog_,
- tr("Pas de sélection", "message box title"),
- tr("Vous devez sélectionner un élément.", "message box content")
- );
+void ElementDialog::checkAccept()
+{
+ ElementsLocation loc = location();
+
+ if (m_mode == OpenElement)
+ {
+ if (loc.isElement() && loc.exist()) {accept();}
+ if (!loc.exist())
+ {
+ QET::QetMessageBox::critical(this,
+ tr("Sélection inexistante", "message box title"),
+ tr("La sélection n'existe pas.", "message box content"));
return;
}
-
- // on verifie donc que la selection existe
- ElementsCollectionItem *item = QETApp::collectionItem(location);
- if (!item) {
- QET::QetMessageBox::critical(
- dialog_,
- tr("Sélection inexistante", "message box title"),
- tr("La sélection n'existe pas.", "message box content")
- );
+ else if (!loc.isElement())
+ {
+ QET::QetMessageBox::critical(this,
+ tr("Sélection incorrecte", "message box title"),
+ tr("La sélection n'est pas un élément.", "message box content"));
return;
}
-
- // puis on verifie qu'il s'agit bien d'un element
- if (!item -> isElement()) {
- QET::QetMessageBox::critical(
- dialog_,
- tr("Sélection incorrecte", "message box title"),
- tr("La sélection n'est pas un élément.", "message box content")
- );
- return;
+ }
+ else if (m_mode == SaveElement)
+ {
+ if (loc.isElement())
+ {
+ if (loc.exist())
+ {
+ QMessageBox::StandardButton answer = QET::QetMessageBox::question(this,
+ tr("Écraser l'élément ?", "message box title"),
+ tr("L'élément existe déjà. Voulez-vous l'écraser ?", "message box content"),
+ QMessageBox::Yes | QMessageBox::No,
+ QMessageBox::No);
+ if (answer == QMessageBox::Yes) {accept();}
+ else {return;}
+ }
+ else {accept();}
}
-
- location_ = location;
- } else if (mode_ == SaveElement) {
- /*
- l'utilisateur doit avoir choisi soit :
- -une categorie et un nom d'element
- -un element existant
- */
- ElementsLocation location = list_ -> selectedLocation();
- if (location.isNull()) {
- QET::QetMessageBox::critical(
- dialog_,
- tr("Pas de sélection", "message box title"),
- tr("Vous devez sélectionner une catégorie ou un élément.", "message box content")
- );
+ else
+ {
+ QET::QetMessageBox::critical(this,
+ tr("Sélection incorrecte", "message box title"),
+ tr("Vous devez sélectionner un élément ou une catégorie avec un nom pour l'élément.", "message box content"));
return;
}
-
- // on verifie donc que la selection existe
- ElementsCollectionItem *item = QETApp::collectionItem(location);
- if (!item) {
- QET::QetMessageBox::critical(
- dialog_,
- tr("Sélection inexistante", "message box title"),
- tr("La sélection n'existe pas.", "message box content")
- );
- return;
+ }
+}
+
+/**
+ * @brief ElementDialog::location
+ * @return The selected location or a null location if user has selected nothing
+ * or selection isn't compatible with the curent mode
+ */
+ElementsLocation ElementDialog::location() const
+{
+ if (m_mode == OpenElement)
+ {
+ if (m_location.isElement()) { return m_location; }
+ else {return ElementsLocation(); }
+ }
+
+ else if (m_mode == SaveElement)
+ {
+ //Current selected location is element, we return this location
+ if (m_location.isElement()) { return m_location; }
+
+ //Current selected location is directory, we return a location at path :
+ //m_location->collectionPath + m_text_field->text
+ else if (m_location.isDirectory())
+ {
+ QString new_path = m_text_field->text();
+ if (new_path.isEmpty()) { return ElementsLocation(); }
+
+ if (!new_path.endsWith(".elmt")) { new_path += ".elmt"; }
+
+ ElementsLocation loc = m_location;
+ loc.addToPath(new_path);
+ return loc;
}
-
- ElementsLocation final_location(location);
- if (!item -> isElement()) {
- QString element_name(textfield_ -> text());
- // si on a une categorie (ou une collection), il nous faut un nom d'element
- if (element_name.isEmpty()) {
- QET::QetMessageBox::critical(
- dialog_,
- tr("Nom manquant", "message box title"),
- tr("Vous devez entrer un nom pour l'élément", "message box content")
- );
- return;
- }
-
- // ce nom d'element doit etre valide
- if (QET::containsForbiddenCharacters(element_name)) {
- QET::QetMessageBox::critical(
- dialog_,
- tr("Nom invalide", "message box title"),
- QString(
- tr(
- "Vous ne pouvez pas utiliser les caractères "
- "suivants dans le nom de l'élément : %1"
- )
- ).arg(QET::forbiddenCharactersString(true))
- );
- return;
- }
-
- // ajoute .elmt a la fin du nom si necessaire
- if (!element_name.endsWith(".elmt", Qt::CaseInsensitive)) {
- element_name += ".elmt";
- }
- final_location.addToPath(element_name);
- }
-
- // determine si l'element n'existe pas deja
- bool element_already_exists = (
- item -> isElement() ||\
- QETApp::collectionItem(final_location)
- );
-
- // si l'element existe, on demande confirmation pour son ecrasement
- if (element_already_exists) {
- QMessageBox::StandardButton answer = QET::QetMessageBox::question(
- dialog_,
- tr("Écraser l'élément ?", "message box title"),
- tr("L'élément existe déjà. Voulez-vous l'écraser ?", "message box content"),
- QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,
- QMessageBox::No
- );
- if (answer != QMessageBox::Yes) return;
- }
-
- location_ = final_location;
- } else if (mode_ == OpenCategory) {
- // l'utilisateur doit avoir choisi une categorie ou une collection existante
- /// @todo effectuer les verifications necessaires
- } else if (mode_ == SaveCategory) {
- // l'utilisateur doit avoir choisi une categorie inexistante
- /// @todo effectuer les verifications necessaires
}
-
- // le dialogue est verifie, il peut etre accepte
- dialog_ -> accept();
+
+ return ElementsLocation();
}
/**
- Slot execute apres la validation du dialogue par l'utilisateur
-*/
-void ElementDialog::dialogAccepted() {
+ * @brief ElementDialog::getOpenElementLocation
+ * Display a dialog for open an element through her location
+ * @param parentWidget
+ * @return The location of the selected element
+ */
+ElementsLocation ElementDialog::getOpenElementLocation(QWidget *parentWidget) {
+ return(ElementDialog::execConfiguredDialog(ElementDialog::OpenElement, parentWidget));
}
/**
- Gere le rejet du dialogue par l'utilisateur.
-*/
-void ElementDialog::dialogRejected() {
- location_ = ElementsLocation();
+ * @brief ElementDialog::getSaveElementLocation
+ * Display a dialog that allow to user to select an element (existing or not) who he want to save
+ * @param parentWidget
+ * @return The location where the element must be save
+ */
+ElementsLocation ElementDialog::getSaveElementLocation(QWidget *parentWidget) {
+ return(ElementDialog::execConfiguredDialog(ElementDialog::SaveElement, parentWidget));
}
+
+/**
+ * @brief ElementDialog::execConfiguredDialog
+ * launch a dialog with the chosen mode
+ * @param mode : mode of the dialog
+ * @param parentWidget : parent widget of the dialog
+ * @return the chosen location
+ */
+ElementsLocation ElementDialog::execConfiguredDialog(int mode, QWidget *parentWidget)
+{
+ ElementDialog *element_dialog = new ElementDialog(mode, parentWidget);
+ element_dialog->exec();
+ ElementsLocation location = element_dialog->location();
+ delete element_dialog;
+ return(location);
+}
Modified: trunk/sources/elementdialog.h
===================================================================
--- trunk/sources/elementdialog.h 2016-04-18 21:30:45 UTC (rev 4455)
+++ trunk/sources/elementdialog.h 2016-04-19 09:29:40 UTC (rev 4456)
@@ -17,17 +17,19 @@
*/
#ifndef ELEMENT_DIALOG_H
#define ELEMENT_DIALOG_H
-#include <QtCore>
+
+#include <QDialog>
#include "elementslocation.h"
-class QDialog;
+
class QDialogButtonBox;
-class ElementsCategoriesList;
class QFileNameEdit;
+class QTreeView;
/**
This class provides several dialogs to select an element or a category
(e.g. new or existing, for opening or for saving...).
*/
-class ElementDialog : public QObject {
+class ElementDialog : public QDialog
+{
Q_OBJECT
// enumerations
/**
@@ -40,44 +42,36 @@
SaveCategory = 3 ///< The dialog should select a category for saving
};
- // constructors, destructor
+ // constructors, destructor
public:
- ElementDialog(uint = ElementDialog::OpenElement, QWidget * = 0, QObject * = 0);
- virtual ~ElementDialog();
+ ElementDialog(uint = ElementDialog::OpenElement, QWidget *parent = nullptr);
private:
- ElementDialog(const ElementDialog &);
-
- // methods
+ ElementDialog(const ElementDialog &);
+
public:
- int exec();
- ElementsLocation location() const;
- static ElementsLocation getExistingCategoryLocation(QWidget * = 0);
- static ElementsLocation getNewCategoryLocation(QWidget * = 0);
- static ElementsLocation getOpenElementLocation(QWidget * = 0);
- static ElementsLocation getSaveElementLocation(QWidget * = 0);
-
+ ElementsLocation location() const;
+
private:
- static ElementsLocation execConfiguredDialog(int, QWidget * = 0);
+ void setUpWidget();
+ void setUpConnection();
+ void indexClicked(const QModelIndex &index);
+ void updateWidget();
+ void checkCurrentLocation();
+ void checkAccept();
- private slots:
- void locationChanged(const ElementsLocation &);
- void textFieldChanged(const QString &);
- void dialogAccepted();
- void dialogRejected();
- void checkDialog();
-
+ // attributes
private:
- void makeInterface();
-
- // attributes
+ uint m_mode;
+ ElementsLocation m_location;
+ QDialogButtonBox *m_buttons_box = nullptr;
+ QFileNameEdit *m_text_field = nullptr;
+ QTreeView *m_tree_view = nullptr;
+
+ public:
+ static ElementsLocation getOpenElementLocation(QWidget *parent = nullptr);
+ static ElementsLocation getSaveElementLocation(QWidget *parent = nullptr);
private:
- uint mode_;
- ElementsLocation location_;
- QString title_;
- QString label_;
- QDialog *dialog_;
- QDialogButtonBox *buttons_;
- ElementsCategoriesList *list_;
- QFileNameEdit *textfield_;
+ static ElementsLocation execConfiguredDialog(int, QWidget *parent = nullptr);
+
};
#endif