mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-09-14 20:33:05 +02:00
-Cette ligne, et les suivantes ci-dessous, seront ignorées-- M sources/aboutqet.cpp M sources/bordertitleblock.cpp M sources/conductorproperties.h M sources/configdialog.cpp M sources/configpages.cpp M sources/configpages.h M sources/createdxf.h M sources/diagram.cpp M sources/diagram.h M sources/diagramcommands.cpp M sources/diagramcommands.h M sources/diagramprintdialog.cpp M sources/diagramprintdialog.h M sources/diagramschooser.cpp M sources/diagramschooser.h M sources/diagramview.cpp M sources/diagramview.h M sources/dvevent/dveventaddimage.cpp M sources/dvevent/dveventaddshape.cpp M sources/editor/arceditor.cpp M sources/editor/arceditor.h M sources/editor/editorcommands.cpp M sources/editor/editorcommands.h M sources/editor/elementitemeditor.h M sources/editor/elementprimitivedecorator.cpp M sources/editor/elementscene.cpp M sources/editor/elementscene.h M sources/editor/elementview.cpp M sources/editor/ellipseeditor.cpp M sources/editor/ellipseeditor.h M sources/editor/esevent/eseventaddtext.cpp M sources/editor/esevent/eseventaddtextfield.cpp M sources/editor/esevent/eseventinterface.cpp M sources/editor/graphicspart/customelementpart.h M sources/editor/graphicspart/parttext.cpp M sources/editor/graphicspart/parttext.h M sources/editor/graphicspart/parttextfield.cpp M sources/editor/graphicspart/parttextfield.h M sources/editor/lineeditor.cpp M sources/editor/lineeditor.h M sources/editor/polygoneditor.cpp M sources/editor/qetelementeditor.cpp M sources/editor/qetelementeditor.h M sources/editor/rectangleeditor.cpp M sources/editor/rectangleeditor.h M sources/editor/styleeditor.cpp M sources/editor/styleeditor.h M sources/editor/terminaleditor.cpp M sources/editor/terminaleditor.h M sources/editor/texteditor.cpp M sources/editor/texteditor.h M sources/editor/textfieldeditor.cpp M sources/editor/textfieldeditor.h M sources/editor/ui/elementpropertieseditorwidget.cpp M sources/elementdefinition.cpp M sources/elementdeleter.cpp M sources/elementdeleter.h M sources/elementdialog.cpp M sources/elementscategorieslist.h M sources/elementscategorieswidget.cpp M sources/elementscategorieswidget.h M sources/elementscategory.cpp M sources/elementscategorydeleter.cpp M sources/elementscategorydeleter.h M sources/elementscategoryeditor.cpp M sources/elementscategoryeditor.h M sources/elementscollection.cpp M sources/elementscollectioncache.cpp M sources/elementspanel.cpp M sources/elementspanel.h M sources/elementspanelwidget.cpp M sources/elementspanelwidget.h M sources/elementtextsmover.h M sources/exportdialog.cpp M sources/exportdialog.h M sources/exportproperties.cpp M sources/exportpropertieswidget.cpp M sources/exportpropertieswidget.h M sources/genericpanel.cpp M sources/integrationmoveelementshandler.cpp M sources/integrationmoveelementshandler.h M sources/interactivemoveelementshandler.cpp M sources/nameslistwidget.cpp M sources/nameslistwidget.h M sources/newelementwizard.cpp M sources/newelementwizard.h M sources/nomenclature.cpp M sources/nomenclature.h M sources/projectconfigpages.cpp M sources/projectview.cpp M sources/projectview.h M sources/qet.cpp M sources/qetapp.cpp M sources/qetapp.h M sources/qetdiagrameditor.cpp M sources/qetdiagrameditor.h M sources/qetgraphicsitem/conductor.cpp M sources/qetgraphicsitem/conductortextitem.cpp M sources/qetgraphicsitem/customelement.cpp M sources/qetgraphicsitem/diagramimageitem.cpp M sources/qetgraphicsitem/diagramtextitem.cpp M sources/qetgraphicsitem/diagramtextitem.h M sources/qetgraphicsitem/element.cpp M sources/qetgraphicsitem/ghostelement.cpp M sources/qetgraphicsitem/qetshapeitem.cpp M sources/qetgraphicsitem/terminal.cpp M sources/qetgraphicsitem/terminal.h M sources/qeticons.cpp M sources/qeticons.h M sources/qetmainwindow.cpp M sources/qetmessagebox.cpp M sources/qetmessagebox.h M sources/qetprintpreviewdialog.cpp M sources/qetprintpreviewdialog.h M sources/qetproject.cpp M sources/qetsingleapplication.cpp M sources/qettabbar.h M sources/qfilenameedit.cpp M sources/qtextorientationspinboxwidget.cpp M sources/qtextorientationspinboxwidget.h M sources/qtextorientationwidget.cpp M sources/qtextorientationwidget.h M sources/richtext/richtexteditor.cpp M sources/richtext/richtexteditor_p.h M sources/richtext/ui_addlinkdialog.h M sources/titleblock/dimensionwidget.h M sources/titleblock/gridlayoutanimation.h M sources/titleblock/helpercell.h M sources/titleblock/integrationmovetemplateshandler.cpp M sources/titleblock/integrationmovetemplateshandler.h M sources/titleblock/qettemplateeditor.cpp M sources/titleblock/qettemplateeditor.h M sources/titleblock/templatecellsset.h M sources/titleblock/templatecellwidget.cpp M sources/titleblock/templatecellwidget.h M sources/titleblock/templatecommands.cpp M sources/titleblock/templatedeleter.cpp M sources/titleblock/templatedeleter.h M sources/titleblock/templatelocationchooser.cpp M sources/titleblock/templatelocationchooser.h M sources/titleblock/templatelocationsaver.cpp M sources/titleblock/templatelocationsaver.h M sources/titleblock/templatelogomanager.cpp M sources/titleblock/templatelogomanager.h M sources/titleblock/templateview.cpp M sources/titleblock/templatevisualcell.h M sources/titleblockcell.cpp M sources/titleblocktemplate.cpp M sources/treecoloranimation.h M sources/ui/conductorpropertieswidget.cpp M sources/ui/diagrampropertiesdialog.cpp M sources/ui/diagramselection.cpp M sources/ui/dialogautonum.cpp M sources/ui/dialogwaiting.cpp M sources/ui/elementpropertieswidget.cpp M sources/ui/elementselectorwidget.cpp M sources/ui/linksingleelementwidget.cpp M sources/ui/masterpropertieswidget.cpp M sources/ui/potentialtextsdialog.cpp M sources/ui/projectpropertiesdialog.cpp M sources/ui/selectautonumw.cpp M sources/ui/titleblockpropertieswidget.cpp M sources/ui/xrefpropertieswidget.cpp M sources/undocommand/changeelementinformationcommand.cpp git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@3783 bfdf4180-ca20-0410-9c96-a3a8aa849046
390 lines
12 KiB
C++
390 lines
12 KiB
C++
/*
|
|
Copyright 2006-2015 The QElectroTech Team
|
|
This file is part of QElectroTech.
|
|
|
|
QElectroTech is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
QElectroTech is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include "interactivemoveelementshandler.h"
|
|
#include <QtWidgets>
|
|
#include "elementscategory.h"
|
|
#include "elementdefinition.h"
|
|
#include "qfilenameedit.h"
|
|
#include "qetmessagebox.h"
|
|
|
|
/**
|
|
Constructeur
|
|
@param parent QWidget parent a utiliser pour l'affichage des dialogues lors
|
|
des interactions avec l'utilisateur
|
|
*/
|
|
InteractiveMoveElementsHandler::InteractiveMoveElementsHandler(QWidget *parent) :
|
|
BasicMoveElementsHandler(parent),
|
|
parent_widget_(parent),
|
|
rename_(""),
|
|
always_erase_(false),
|
|
always_skip_(false),
|
|
aborted_(false),
|
|
conflict_dialog_(0)
|
|
{
|
|
}
|
|
|
|
/**
|
|
Destructeur
|
|
*/
|
|
InteractiveMoveElementsHandler::~InteractiveMoveElementsHandler() {
|
|
}
|
|
|
|
/**
|
|
@param src Categorie source
|
|
@param dst Categorie cible / destination
|
|
@return l'action a effectuer si la categorie cible existe deja
|
|
*/
|
|
QET::Action InteractiveMoveElementsHandler::categoryAlreadyExists(ElementsCategory *src, ElementsCategory *dst) {
|
|
// verifie si la reponse n'est pas systematique
|
|
if (aborted_) return(QET::Abort);
|
|
if (always_erase_) return(QET::Erase);
|
|
if (always_skip_) return(QET::Ignore);
|
|
|
|
// a ce stade, l'action a effectuer pour gerer le conflit doit etre
|
|
// demandee a l'utilisateur via un dialogue
|
|
initConflictDialog();
|
|
|
|
QString src_location(src -> location().toString());
|
|
QString dst_location(dst -> location().toString());
|
|
|
|
// prepare le dialogue
|
|
QString dialog_title(QString(tr("Copie de %1 vers %2", "dialog title")).arg(src_location).arg(dst_location));
|
|
|
|
QLabel *question_label = new QLabel(
|
|
QString(
|
|
tr(
|
|
"La catégorie « %1 » (%2) existe déjà. "
|
|
"Que souhaitez-vous faire ?",
|
|
"dialog content"
|
|
)
|
|
)
|
|
.arg(dst -> name())
|
|
.arg(dst_location)
|
|
);
|
|
question_label -> setWordWrap(true);
|
|
|
|
setConflictDialogTitle(dialog_title);
|
|
setConflictDialogMainWidget(question_label);
|
|
|
|
// execute le dialogue
|
|
conflict_dialog_ -> exec();
|
|
|
|
// enleve et detruit le widget principal
|
|
setConflictDialogMainWidget(0);
|
|
delete question_label;
|
|
|
|
// renvoie la reponse obtenue via le dialogue
|
|
return(conflict_result_);
|
|
}
|
|
|
|
/**
|
|
@param src Element source
|
|
@param dst Element cible / destination
|
|
@return l'action a effectuer si l'element cible existe deja
|
|
*/
|
|
QET::Action InteractiveMoveElementsHandler::elementAlreadyExists(ElementDefinition *src, ElementDefinition *dst) {
|
|
// verifie si la reponse n'est pas systematique
|
|
if (aborted_) return(QET::Abort);
|
|
if (always_erase_) return(QET::Erase);
|
|
if (always_skip_) return(QET::Ignore);
|
|
|
|
// a ce stade, l'action a effectuer pour gerer le conflit doit etre
|
|
// demandee a l'utilisateur via un dialogue
|
|
initConflictDialog();
|
|
|
|
QString src_location(src -> location().toString());
|
|
QString dst_location(dst -> location().toString());
|
|
|
|
// prepare le dialogue
|
|
QString dialog_title(QString(tr("Copie de %1 vers %2", "dialog title")).arg(src_location).arg(dst_location));
|
|
|
|
QLabel *question_label = new QLabel(
|
|
QString(
|
|
tr(
|
|
"L'élément « %1 » existe déjà. "
|
|
"Que souhaitez-vous faire ?",
|
|
"dialog content"
|
|
)
|
|
)
|
|
.arg(dst_location)
|
|
);
|
|
question_label -> setWordWrap(true);
|
|
|
|
setConflictDialogTitle(dialog_title);
|
|
setConflictDialogMainWidget(question_label);
|
|
|
|
// execute le dialogue
|
|
conflict_dialog_ -> exec();
|
|
|
|
// enleve et detruit le widget principal
|
|
setConflictDialogMainWidget(0);
|
|
delete question_label;
|
|
|
|
if (conflict_result_ == QET::Rename) {
|
|
if (!rename_.endsWith(".elmt")) rename_ += ".elmt";
|
|
}
|
|
|
|
// renvoie la reponse obtenue via le dialogue
|
|
return(conflict_result_);
|
|
}
|
|
|
|
/**
|
|
Cette methode permet de savoir comment agir lorsqu'une categorie n'est pas lisible
|
|
@param category La categorie qui n'est pas lisible
|
|
@return QET::Retry, QET::Ignore ou QET::Abort
|
|
*/
|
|
QET::Action InteractiveMoveElementsHandler::categoryIsNotReadable(ElementsCategory *category) {
|
|
QString message = QString(tr("La catégorie %1 n'est pas accessible en lecture.", "message box content")).arg(category -> location().toString());
|
|
return(retryErrorMessage(message));
|
|
}
|
|
|
|
/**
|
|
Cette methode permet de savoir comment agir lorsqu'un element n'est pas lisible
|
|
@param element L'element qui n'est pas lisible
|
|
@return QET::Retry, QET::Ignore ou QET::Abort
|
|
*/
|
|
QET::Action InteractiveMoveElementsHandler::elementIsNotReadable(ElementDefinition *element) {
|
|
QString message = QString(tr("L'élément %1 n'est pas accessible en lecture.", "message box content")).arg(element -> location().toString());
|
|
return(retryErrorMessage(message));
|
|
}
|
|
|
|
/**
|
|
Cette methode permet de savoir comment agir lorsqu'une categorie n'est pas accessible en ecriture
|
|
@param category La categorie qui n'est pas lisible
|
|
@return QET::Retry, QET::Ignore ou QET::Abort
|
|
*/
|
|
QET::Action InteractiveMoveElementsHandler::categoryIsNotWritable(ElementsCategory *category) {
|
|
QString message = QString(tr("La catégorie %1 n'est pas accessible en écriture.", "message box content")).arg(category -> location().toString());
|
|
return(retryErrorMessage(message));
|
|
}
|
|
|
|
/**
|
|
Cette methode permet de savoir comment agir lorsqu'un element n'est pas accessible en ecriture
|
|
@param element L'element qui n'est pas lisible
|
|
@return QET::Retry, QET::Ignore ou QET::Abort
|
|
*/
|
|
QET::Action InteractiveMoveElementsHandler::elementIsNotWritable(ElementDefinition *element) {
|
|
QString message = QString(tr("L'élément %1 n'est pas accessible en écriture.", "message box content")).arg(element -> location().toString());
|
|
return(retryErrorMessage(message));
|
|
}
|
|
|
|
/**
|
|
Affiche un message d'erreur relatif a une categorie
|
|
@param category La categorie concernee par l'erreur
|
|
@param message Le message d'erreur a afficher
|
|
@return toujours QET::Ignore
|
|
*/
|
|
QET::Action InteractiveMoveElementsHandler::errorWithACategory(ElementsCategory *category, const QString &message) {
|
|
QString category_location = category -> location().toString();
|
|
QString error_message = QString("Une erreur s'est produite avec la catégorie %1 : %2").arg(category_location).arg(message);
|
|
simpleErrorMessage(error_message);
|
|
return(QET::Ignore);
|
|
}
|
|
|
|
/**
|
|
Affiche un message d'erreur relatif a un element
|
|
@param element L'element concerne par l'erreur
|
|
@param message Le message d'erreur a afficher
|
|
@return toujours QET::Ignore
|
|
*/
|
|
QET::Action InteractiveMoveElementsHandler::errorWithAnElement(ElementDefinition *element, const QString &message) {
|
|
QString element_location = element -> location().toString();
|
|
QString error_message = QString("Une erreur s'est produite avec l'élément %1 : %2").arg(element_location).arg(message);
|
|
simpleErrorMessage(error_message);
|
|
return(QET::Ignore);
|
|
}
|
|
|
|
/**
|
|
@return le nom a utiliser pour le renommage si une methode de cet objet
|
|
a precedemment renvoye QET::Rename.
|
|
*/
|
|
QString InteractiveMoveElementsHandler::nameForRenamingOperation() {
|
|
return(rename_);
|
|
}
|
|
|
|
/**
|
|
Initialise le dialogue qui sera utilise pour les conflits
|
|
elements / categories.
|
|
*/
|
|
void InteractiveMoveElementsHandler::initConflictDialog() {
|
|
// n'agit qu'une seule fois
|
|
if (conflict_dialog_) return;
|
|
|
|
conflict_dialog_ = new QDialog(parent_widget_);
|
|
conflict_dialog_ -> setMaximumSize(600, 200);
|
|
|
|
// initialisation du champ de texte
|
|
rename_label_ = new QLabel("Nouveau nom :");
|
|
rename_textfield_ = new QFileNameEdit();
|
|
connect(
|
|
rename_textfield_,
|
|
SIGNAL(textEdited(const QString &)),
|
|
this,
|
|
SLOT(conflictDialogFileNameFieldChanged())
|
|
);
|
|
|
|
// initialisation des boutons
|
|
rename_button_ = new QPushButton(tr("Renommer"));
|
|
erase_button_ = new QPushButton(tr("Écraser"));
|
|
erase_all_button_ = new QPushButton(tr("Écraser tout"));
|
|
ignore_button_ = new QPushButton(tr("Ignorer"));
|
|
ignore_all_button_ = new QPushButton(tr("Ignorer tout"));
|
|
abort_button_ = new QPushButton(tr("Annuler"));
|
|
|
|
conflict_buttons_ = new QDialogButtonBox();
|
|
conflict_buttons_ -> addButton(rename_button_, QDialogButtonBox::ActionRole);
|
|
conflict_buttons_ -> addButton(erase_button_, QDialogButtonBox::AcceptRole);
|
|
conflict_buttons_ -> addButton(erase_all_button_, QDialogButtonBox::AcceptRole);
|
|
conflict_buttons_ -> addButton(ignore_button_, QDialogButtonBox::AcceptRole);
|
|
conflict_buttons_ -> addButton(ignore_all_button_, QDialogButtonBox::AcceptRole);
|
|
conflict_buttons_ -> addButton(abort_button_, QDialogButtonBox::AcceptRole);
|
|
|
|
rename_button_ -> setEnabled(false);
|
|
connect(
|
|
conflict_buttons_,
|
|
SIGNAL(clicked(QAbstractButton *)),
|
|
this,
|
|
SLOT(conflictDialogButtonClicked(QAbstractButton *))
|
|
);
|
|
|
|
// layout
|
|
conflict_layout1_ = new QHBoxLayout();
|
|
conflict_layout1_ -> addWidget(rename_label_);
|
|
conflict_layout1_ -> addWidget(rename_textfield_);
|
|
|
|
conflict_layout0_ = new QVBoxLayout(conflict_dialog_);
|
|
conflict_layout0_ -> insertLayout(1, conflict_layout1_);
|
|
conflict_layout0_ -> insertWidget(2, conflict_buttons_);
|
|
}
|
|
|
|
/**
|
|
Slot appele lorsque l'utilisateur modifie le contenu du champ
|
|
*/
|
|
void InteractiveMoveElementsHandler::conflictDialogFileNameFieldChanged() {
|
|
if (rename_textfield_ -> isValid()) {
|
|
/// @todo verifier que le nom n'est pas deja pris
|
|
rename_button_ -> setEnabled(true);
|
|
} else {
|
|
rename_button_ -> setEnabled(false);
|
|
}
|
|
}
|
|
|
|
/**
|
|
Slot appele lorsque l'utilisateur presse un des boutons du dialogue de
|
|
conflit.
|
|
@param button Bouton presse par l'utilisateur
|
|
*/
|
|
void InteractiveMoveElementsHandler::conflictDialogButtonClicked(QAbstractButton *button) {
|
|
conflict_dialog_ -> accept();
|
|
// change la valeur de l'attribut
|
|
if (button == rename_button_) {
|
|
rename_ = rename_textfield_ -> text();
|
|
conflict_result_= QET::Rename;
|
|
} else if (button == erase_button_) {
|
|
conflict_result_= QET::Erase;
|
|
} else if (button == erase_all_button_) {
|
|
always_erase_ = true;
|
|
conflict_result_= QET::Erase;
|
|
} else if (button == ignore_button_) {
|
|
conflict_result_= QET::Ignore;
|
|
} else if (button == ignore_all_button_) {
|
|
always_skip_ = true;
|
|
conflict_result_= QET::Ignore;
|
|
} else if (button == abort_button_) {
|
|
aborted_ = true;
|
|
conflict_result_= QET::Abort;
|
|
}
|
|
}
|
|
|
|
/**
|
|
Change le titre du dialogue de conflit
|
|
@param new_title Nouveau titre pour le dialogue de conflit
|
|
*/
|
|
void InteractiveMoveElementsHandler::setConflictDialogTitle(const QString &new_title) {
|
|
conflict_dialog_ -> setWindowTitle(new_title);
|
|
}
|
|
|
|
/**
|
|
@return le titre du dialogue de conflit
|
|
*/
|
|
QString InteractiveMoveElementsHandler::conflictDialogTitle() const {
|
|
return(conflict_dialog_ -> windowTitle());
|
|
}
|
|
|
|
/**
|
|
Change le widget affiche au centre du dialogue de conflit
|
|
@param widget Widget a inserer dans le dialogue de conflit
|
|
Si widget vaut 0, le widget central est retire.
|
|
*/
|
|
void InteractiveMoveElementsHandler::setConflictDialogMainWidget(QWidget *widget) {
|
|
// gere l'enlevement du widget principal
|
|
if (!widget) {
|
|
if (conflict_layout0_ -> count() != 3) return;
|
|
conflict_layout0_ -> removeItem(conflict_layout0_ -> itemAt(0));
|
|
} else {
|
|
conflict_layout0_ -> insertWidget(0, widget);
|
|
}
|
|
}
|
|
|
|
/**
|
|
@return le widget insere dans le dialogue de conflit, ou 0 s'il n'y en a
|
|
aucun.
|
|
*/
|
|
QWidget *InteractiveMoveElementsHandler::conflictDialogMainWidget() const {
|
|
if (conflict_layout0_ -> count() != 3) return(0);
|
|
return(conflict_layout0_ -> itemAt(0) -> widget());
|
|
}
|
|
|
|
/**
|
|
Affiche un message d'erreur en donnant la possibilite d'ignorer l'item en cours,
|
|
d'annuler tout le mouvement ou de le reessayer.
|
|
@param message Message d'erreur a afficher
|
|
@return L'action choisie par l'utilisateur
|
|
*/
|
|
QET::Action InteractiveMoveElementsHandler::retryErrorMessage(const QString &message) const {
|
|
int todo = QET::QetMessageBox::critical(
|
|
parent_widget_,
|
|
tr("Erreur", "message box title"),
|
|
message,
|
|
QMessageBox::Abort | QMessageBox::Retry | QMessageBox::Ignore,
|
|
QMessageBox::Ignore
|
|
);
|
|
|
|
if (todo == QMessageBox::Abort) {
|
|
return(QET::Abort);
|
|
} else if (todo == QMessageBox::Retry) {
|
|
return(QET::Retry);
|
|
} else {
|
|
return(QET::Ignore);
|
|
}
|
|
}
|
|
|
|
/**
|
|
Affiche un simple message d'erreur
|
|
@param message Message d'erreur a afficher
|
|
*/
|
|
void InteractiveMoveElementsHandler::simpleErrorMessage(const QString &message) const {
|
|
QET::QetMessageBox::critical(
|
|
parent_widget_,
|
|
tr("Erreur", "message box title"),
|
|
message,
|
|
QMessageBox::Ok,
|
|
QMessageBox::Ok
|
|
);
|
|
}
|