2007-12-01 10:47:15 +00:00
/*
2019-01-13 16:56:12 +00:00
Copyright 2006 - 2019 The QElectroTech Team
2007-12-01 10:47:15 +00:00
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/>.
*/
2007-08-25 03:43:05 +00:00
# include "qetelementeditor.h"
2010-03-28 16:27:48 +00:00
# include "qet.h"
2007-09-21 13:22:18 +00:00
# include "qetapp.h"
2007-08-25 03:43:05 +00:00
# include "elementscene.h"
# include "elementview.h"
2007-06-30 17:41:07 +00:00
# include "customelementpart.h"
# include "newelementwizard.h"
2007-11-07 20:23:24 +00:00
# include "elementitemeditor.h"
2009-04-03 19:30:25 +00:00
# include "elementdialog.h"
2008-07-30 11:51:27 +00:00
# include "recentfiles.h"
2009-05-01 14:41:33 +00:00
# include "qeticons.h"
2009-08-09 16:02:14 +00:00
# include "qetmessagebox.h"
2018-06-20 18:35:06 +00:00
# include "editorcommands.h"
2007-06-30 17:41:07 +00:00
2010-02-18 00:42:41 +00:00
// editeurs de primitives
# include "arceditor.h"
# include "ellipseeditor.h"
# include "lineeditor.h"
# include "polygoneditor.h"
# include "rectangleeditor.h"
# include "terminaleditor.h"
# include "texteditor.h"
2014-06-05 09:06:57 +00:00
# include "partterminal.h"
2015-02-15 10:21:32 +00:00
# include "styleeditor.h"
2017-09-25 17:44:02 +00:00
# include "dynamictextfieldeditor.h"
2014-06-05 09:06:57 +00:00
2014-11-04 22:23:27 +00:00
# include "eseventaddline.h"
2014-11-06 10:46:14 +00:00
# include "eseventaddrect.h"
2014-11-07 09:39:19 +00:00
# include "eseventaddellipse.h"
2014-11-08 11:14:56 +00:00
# include "eseventaddpolygon.h"
2014-11-09 21:58:46 +00:00
# include "eseventaddarc.h"
2014-11-09 23:11:17 +00:00
# include "eseventaddtext.h"
2014-11-10 21:47:28 +00:00
# include "eseventaddterminal.h"
2017-09-25 17:44:02 +00:00
# include "eseventadddynamictextfield.h"
2014-11-04 22:23:27 +00:00
2013-01-03 17:26:08 +00:00
# include <QMessageBox>
2016-03-01 19:02:20 +00:00
# include <QTextStream>
# include <QFileDialog>
# include <QFile>
# include <QModelIndex>
2018-07-19 14:14:31 +00:00
# include <utility>
2016-03-01 19:02:20 +00:00
2010-02-28 16:13:45 +00:00
/*
Nombre maximum de primitives affichees par la " liste des parties "
Au - dela , un petit message est affiche , indiquant que ce nombre a ete depasse
et que la liste ne sera donc pas mise a jour .
*/
# define QET_MAX_PARTS_IN_ELEMENT_EDITOR_LIST 200
2007-12-16 13:21:28 +00:00
/**
Constructeur
@ param parent QWidget parent
*/
2007-08-25 03:43:05 +00:00
QETElementEditor : : QETElementEditor ( QWidget * parent ) :
2012-02-13 22:13:19 +00:00
QETMainWindow ( parent ) ,
2007-06-30 17:41:07 +00:00
read_only ( false ) ,
2015-03-02 20:14:56 +00:00
min_title ( tr ( " QElectroTech - Éditeur d'élément " , " window title " ) ) ,
2009-04-03 19:30:25 +00:00
opened_from_file ( false )
2007-06-30 17:41:07 +00:00
{
setWindowTitle ( min_title ) ;
2009-05-01 14:41:33 +00:00
setWindowIcon ( QET : : Icons : : QETLogo ) ;
2007-06-30 17:41:07 +00:00
setupInterface ( ) ;
setupActions ( ) ;
setupMenus ( ) ;
2007-11-12 15:21:14 +00:00
// la fenetre est maximisee par defaut
setMinimumSize ( QSize ( 500 , 350 ) ) ;
setWindowState ( Qt : : WindowMaximized ) ;
// lecture des parametres
readSettings ( ) ;
2009-04-03 19:30:25 +00:00
slot_updateMenus ( ) ;
2007-11-12 15:21:14 +00:00
// affichage
show ( ) ;
2007-06-30 17:41:07 +00:00
}
2007-12-16 13:21:28 +00:00
/// Destructeur
2007-08-25 03:43:05 +00:00
QETElementEditor : : ~ QETElementEditor ( ) {
2009-04-04 18:29:53 +00:00
/*
2010-02-18 00:42:41 +00:00
retire le widget d ' edition de primitives affiche par le dock
cela evite qu ' il ne soit supprime par son widget parent
2009-04-04 18:29:53 +00:00
*/
clearToolsDock ( ) ;
2010-02-18 00:42:41 +00:00
// supprime les editeurs de primitives
2017-09-25 17:44:02 +00:00
qDeleteAll ( m_editors . begin ( ) , m_editors . end ( ) ) ;
m_editors . clear ( ) ;
2007-06-30 17:41:07 +00:00
}
2010-03-28 16:27:48 +00:00
/**
2016-03-31 17:28:44 +00:00
* @ brief QETElementEditor : : setLocation
* The new location to edit
* @ param el
*/
void QETElementEditor : : setLocation ( const ElementsLocation & el )
{
2010-03-28 16:27:48 +00:00
location_ = el ;
opened_from_file = false ;
2016-03-31 17:28:44 +00:00
setReadOnly ( ! location_ . isWritable ( ) ) ;
2010-03-28 16:27:48 +00:00
slot_updateTitle ( ) ;
}
/**
@ param fn Le nouveau nom de fichier de l ' element edite
*/
void QETElementEditor : : setFileName ( const QString & fn ) {
filename_ = fn ;
opened_from_file = true ;
// modifie le mode lecture seule si besoin
bool must_be_read_only = ! QFileInfo ( filename_ ) . isWritable ( ) ;
if ( isReadOnly ( ) ! = must_be_read_only ) {
setReadOnly ( must_be_read_only ) ;
}
slot_updateTitle ( ) ;
}
2007-12-16 13:21:28 +00:00
/**
2014-11-11 17:09:24 +00:00
* @ brief QETElementEditor : : setupActions
* Create action used in Element editor
*/
2007-08-25 03:43:05 +00:00
void QETElementEditor : : setupActions ( ) {
2014-06-03 20:21:19 +00:00
new_element = new QAction ( QET : : Icons : : DocumentNew , tr ( " &Nouveau " ) , this ) ;
2017-12-31 10:25:24 +00:00
open = new QAction ( QET : : Icons : : FolderOpen , tr ( " &Ouvrir " ) , this ) ;
open_file = new QAction ( QET : : Icons : : FolderOpen , tr ( " &Ouvrir depuis un fichier " ) , this ) ;
open_dxf = new QAction ( QET : : Icons : : RunDxf , tr ( " &Lancer le plugin convertisseur DXF " ) , this ) ;
2014-06-03 20:21:19 +00:00
save = new QAction ( QET : : Icons : : DocumentSave , tr ( " &Enregistrer " ) , this ) ;
save_as = new QAction ( QET : : Icons : : DocumentSaveAs , tr ( " Enregistrer sous " ) , this ) ;
save_as_file = new QAction ( QET : : Icons : : DocumentSaveAs , tr ( " Enregistrer dans un fichier " ) , this ) ;
reload = new QAction ( QET : : Icons : : ViewRefresh , tr ( " Recharger " ) , this ) ;
quit = new QAction ( QET : : Icons : : ApplicationExit , tr ( " &Quitter " ) , this ) ;
2016-08-30 22:42:23 +00:00
selectall = new QAction ( QET : : Icons : : EditSelectAll , tr ( " Tout sélectionner " ) , this ) ;
2017-12-31 10:25:24 +00:00
deselectall = new QAction ( QET : : Icons : : EditSelectNone , tr ( " Désélectionner tout " ) , this ) ;
2014-06-03 20:21:19 +00:00
cut = new QAction ( QET : : Icons : : EditCut , tr ( " Co&uper " ) , this ) ;
copy = new QAction ( QET : : Icons : : EditCopy , tr ( " Cop&ier " ) , this ) ;
paste = new QAction ( QET : : Icons : : EditPaste , tr ( " C&oller " ) , this ) ;
paste_in_area = new QAction ( QET : : Icons : : EditPaste , tr ( " C&oller dans la zone... " ) , this ) ;
paste_from_file = new QAction ( QET : : Icons : : XmlTextFile , tr ( " un fichier " ) , this ) ;
2016-08-30 22:42:23 +00:00
paste_from_elmt = new QAction ( QET : : Icons : : Element , tr ( " un élément " ) , this ) ;
2017-12-31 10:25:24 +00:00
inv_select = new QAction ( QET : : Icons : : EditSelectInvert , tr ( " Inverser la sélection " ) , this ) ;
2014-06-03 20:21:19 +00:00
edit_delete = new QAction ( QET : : Icons : : EditDelete , tr ( " &Supprimer " ) , this ) ;
2015-03-02 20:14:56 +00:00
edit_names = new QAction ( QET : : Icons : : Names , tr ( " Éditer le nom et les traductions de l'élément " ) , this ) ;
2016-08-30 22:42:23 +00:00
edit_author = new QAction ( QET : : Icons : : UserInformations , tr ( " Éditer les informations sur l'auteur " ) , this ) ;
m_edit_properties = new QAction ( QET : : Icons : : ElementEdit , tr ( " Éditer les propriétés de l'élément " ) , this ) ;
2007-06-30 17:41:07 +00:00
2019-05-19 19:47:32 +00:00
# if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
open_dxf - > setStatusTip ( tr ( " To install the plugin DXFtoQET \n Visit https://download.tuxfamily.org/qet/builds/dxf_to_elmt/ \n "
" \n "
" >> Install on Windows \n "
" Put DXFtoQET.exe binary on C: \\ Users \\ user_name \\ AppData \\ Roaming \\ qet \\ directory \n "
) ) ;
# elif defined(Q_OS_MAC)
open_dxf - > setStatusTip ( tr ( " To install the plugin DXFtoQET \n Visit https://download.tuxfamily.org/qet/builds/dxf_to_elmt/ \n "
" \n "
" >> Install on macOSX \n "
" Put DXFtoQET.app binary on /Users/user_name/.qet/ directory \n "
) ) ;
# else
open_dxf - > setStatusTip ( tr ( " To install the plugin DXFtoQET \n Visit https://download.tuxfamily.org/qet/builds/dxf_to_elmt/ \n "
" \n "
" >> Install on Linux \n "
" Put DXFtoQET binary on your /home/user_name/.qet/ directory \n "
" make it executable : chmod +x ./DXFtoQET \n "
) ) ;
# endif
2017-12-31 10:25:24 +00:00
open_dxf - > setWhatsThis ( tr ( " To install the plugin DXFtoQET \n Visit https://download.tuxfamily.org/qet/builds/dxf_to_elmt/ \n "
" \n "
" >> Install on Linux \n "
" Put DXFtoQET binary on your /home/user_name/.qet/ directory \n "
" make it executable : chmod +x ./DXFtoQET \n "
" >> Install on Windows \n "
" Put DXFtoQET.exe binary on C: \\ Users \\ user_name \\ AppData \\ Roaming \\ qet \\ directory \n "
" \n "
" >> Install on macOSX \n "
" Put DXFtoQET.app binary on /Users/user_name/.qet/ directory \n "
) ) ;
2017-07-31 17:41:48 +00:00
undo = m_elmt_scene - > undoStack ( ) . createUndoAction ( this , tr ( " Annuler " ) ) ;
redo = m_elmt_scene - > undoStack ( ) . createRedoAction ( this , tr ( " Refaire " ) ) ;
2009-05-01 14:41:33 +00:00
undo - > setIcon ( QET : : Icons : : EditUndo ) ;
redo - > setIcon ( QET : : Icons : : EditRedo ) ;
2007-08-25 04:33:32 +00:00
undo - > setShortcuts ( QKeySequence : : Undo ) ;
redo - > setShortcuts ( QKeySequence : : Redo ) ;
new_element - > setShortcut ( QKeySequence : : New ) ;
open - > setShortcut ( QKeySequence : : Open ) ;
2009-04-03 19:30:25 +00:00
open_file - > setShortcut ( tr ( " Ctrl+Shift+O " ) ) ;
2007-08-25 04:33:32 +00:00
save - > setShortcut ( QKeySequence : : Save ) ;
2009-04-03 19:30:25 +00:00
save_as_file - > setShortcut ( tr ( " Ctrl+Shift+S " ) ) ;
2007-08-25 04:33:32 +00:00
quit - > setShortcut ( QKeySequence ( tr ( " Ctrl+Q " ) ) ) ;
2007-06-30 17:41:07 +00:00
selectall - > setShortcut ( QKeySequence : : SelectAll ) ;
deselectall - > setShortcut ( QKeySequence ( tr ( " Ctrl+Shift+A " ) ) ) ;
inv_select - > setShortcut ( QKeySequence ( tr ( " Ctrl+I " ) ) ) ;
2009-04-03 19:30:25 +00:00
cut - > setShortcut ( QKeySequence : : Cut ) ;
copy - > setShortcut ( QKeySequence : : Copy ) ;
paste - > setShortcut ( QKeySequence : : Paste ) ;
paste_in_area - > setShortcut ( tr ( " Ctrl+Shift+V " ) ) ;
2015-03-02 20:14:56 +00:00
# ifndef Q_OS_MAC
2009-12-28 00:27:13 +00:00
edit_delete - > setShortcut ( QKeySequence ( Qt : : Key_Delete ) ) ;
2009-08-15 15:20:53 +00:00
# else
edit_delete - > setShortcut ( QKeySequence ( tr ( " Backspace " ) ) ) ;
# endif
2008-01-07 19:40:08 +00:00
2007-10-03 23:09:05 +00:00
edit_names - > setShortcut ( QKeySequence ( tr ( " Ctrl+E " ) ) ) ;
2010-02-14 16:28:45 +00:00
edit_author - > setShortcut ( tr ( " Ctrl+Y " ) ) ;
2007-06-30 17:41:07 +00:00
2009-11-22 16:12:22 +00:00
connect ( new_element , SIGNAL ( triggered ( ) ) , this , SLOT ( slot_new ( ) ) ) ;
connect ( open , SIGNAL ( triggered ( ) ) , this , SLOT ( slot_open ( ) ) ) ;
2016-02-28 14:50:14 +00:00
connect ( open_dxf , SIGNAL ( triggered ( ) ) , this , SLOT ( slot_openDxf ( ) ) ) ;
2009-11-22 16:12:22 +00:00
connect ( open_file , SIGNAL ( triggered ( ) ) , this , SLOT ( slot_openFile ( ) ) ) ;
connect ( save , SIGNAL ( triggered ( ) ) , this , SLOT ( slot_save ( ) ) ) ;
connect ( save_as , SIGNAL ( triggered ( ) ) , this , SLOT ( slot_saveAs ( ) ) ) ;
connect ( save_as_file , SIGNAL ( triggered ( ) ) , this , SLOT ( slot_saveAsFile ( ) ) ) ;
connect ( reload , SIGNAL ( triggered ( ) ) , this , SLOT ( slot_reload ( ) ) ) ;
connect ( quit , SIGNAL ( triggered ( ) ) , this , SLOT ( close ( ) ) ) ;
2017-07-31 17:41:48 +00:00
connect ( selectall , SIGNAL ( triggered ( ) ) , m_elmt_scene , SLOT ( slot_selectAll ( ) ) ) ;
connect ( deselectall , SIGNAL ( triggered ( ) ) , m_elmt_scene , SLOT ( slot_deselectAll ( ) ) ) ;
connect ( inv_select , SIGNAL ( triggered ( ) ) , m_elmt_scene , SLOT ( slot_invertSelection ( ) ) ) ;
2017-09-25 17:44:02 +00:00
connect ( cut , SIGNAL ( triggered ( ) ) , m_view , SLOT ( cut ( ) ) ) ;
connect ( copy , SIGNAL ( triggered ( ) ) , m_view , SLOT ( copy ( ) ) ) ;
connect ( paste , SIGNAL ( triggered ( ) ) , m_view , SLOT ( paste ( ) ) ) ;
connect ( paste_in_area , SIGNAL ( triggered ( ) ) , m_view , SLOT ( pasteInArea ( ) ) ) ;
2009-11-22 16:12:22 +00:00
connect ( paste_from_file , SIGNAL ( triggered ( ) ) , this , SLOT ( pasteFromFile ( ) ) ) ;
connect ( paste_from_elmt , SIGNAL ( triggered ( ) ) , this , SLOT ( pasteFromElement ( ) ) ) ;
2017-07-31 17:41:48 +00:00
connect ( edit_delete , SIGNAL ( triggered ( ) ) , m_elmt_scene , SLOT ( slot_delete ( ) ) ) ;
connect ( edit_names , SIGNAL ( triggered ( ) ) , m_elmt_scene , SLOT ( slot_editNames ( ) ) ) ;
connect ( edit_author , SIGNAL ( triggered ( ) ) , m_elmt_scene , SLOT ( slot_editAuthorInformations ( ) ) ) ;
connect ( m_edit_properties , SIGNAL ( triggered ( ) ) , m_elmt_scene , SLOT ( slot_editProperties ( ) ) ) ;
2014-11-10 22:57:32 +00:00
2018-06-20 18:35:06 +00:00
//Action related to change depth of primitive
m_depth_action_group = QET : : depthActionGroup ( this ) ;
connect ( m_depth_action_group , & QActionGroup : : triggered , [ this ] ( QAction * action ) {
this - > elementScene ( ) - > undoStack ( ) . push ( new ChangeZValueCommand ( this - > elementScene ( ) , action - > data ( ) . value < QET : : DepthOption > ( ) ) ) ;
emit ( this - > elementScene ( ) - > partsZValueChanged ( ) ) ;
} ) ;
2014-11-11 17:09:24 +00:00
depth_toolbar = addToolBar ( tr ( " Profondeur " , " toolbar title " ) ) ;
depth_toolbar - > setObjectName ( " depth_toolbar " ) ;
2018-06-20 18:35:06 +00:00
depth_toolbar - > addActions ( m_depth_action_group - > actions ( ) ) ;
2014-11-11 17:09:24 +00:00
addToolBar ( Qt : : TopToolBarArea , depth_toolbar ) ;
/*
* Action related to zoom
*/
m_zoom_ag = new QActionGroup ( this ) ;
QAction * zoom_in = new QAction ( QET : : Icons : : ZoomIn , tr ( " Zoom avant " ) , m_zoom_ag ) ;
2015-03-02 20:14:56 +00:00
QAction * zoom_out = new QAction ( QET : : Icons : : ZoomOut , tr ( " Zoom arrière " ) , m_zoom_ag ) ;
QAction * zoom_fit = new QAction ( QET : : Icons : : ZoomFitBest , tr ( " Zoom adapté " ) , m_zoom_ag ) ;
2014-11-11 17:09:24 +00:00
QAction * zoom_reset = new QAction ( QET : : Icons : : ZoomOriginal , tr ( " Pas de zoom " ) , m_zoom_ag ) ;
zoom_in - > setShortcut ( QKeySequence : : ZoomIn ) ;
zoom_out - > setShortcut ( QKeySequence : : ZoomOut ) ;
zoom_fit - > setShortcut ( QKeySequence ( tr ( " Ctrl+9 " ) ) ) ;
zoom_reset - > setShortcut ( QKeySequence ( tr ( " Ctrl+0 " ) ) ) ;
2017-09-25 17:44:02 +00:00
connect ( zoom_in , SIGNAL ( triggered ( ) ) , m_view , SLOT ( zoomIn ( ) ) ) ;
connect ( zoom_out , SIGNAL ( triggered ( ) ) , m_view , SLOT ( zoomOut ( ) ) ) ;
connect ( zoom_fit , SIGNAL ( triggered ( ) ) , m_view , SLOT ( zoomFit ( ) ) ) ;
connect ( zoom_reset , SIGNAL ( triggered ( ) ) , m_view , SLOT ( zoomReset ( ) ) ) ;
2014-11-11 17:09:24 +00:00
/*
* Action related to primitive creation
*/
2017-07-31 17:41:48 +00:00
connect ( m_elmt_scene , SIGNAL ( partsAdded ( ) ) , this , SLOT ( UncheckAddPrimitive ( ) ) ) ;
2014-11-11 17:09:24 +00:00
parts = new QActionGroup ( this ) ;
QAction * add_line = new QAction ( QET : : Icons : : PartLine , tr ( " Ajouter une ligne " ) , parts ) ;
QAction * add_rectangle = new QAction ( QET : : Icons : : PartRectangle , tr ( " Ajouter un rectangle " ) , parts ) ;
QAction * add_ellipse = new QAction ( QET : : Icons : : PartEllipse , tr ( " Ajouter une ellipse " ) , parts ) ;
QAction * add_polygon = new QAction ( QET : : Icons : : PartPolygon , tr ( " Ajouter un polygone " ) , parts ) ;
QAction * add_text = new QAction ( QET : : Icons : : PartText , tr ( " Ajouter du texte " ) , parts ) ;
QAction * add_arc = new QAction ( QET : : Icons : : PartArc , tr ( " Ajouter un arc de cercle " ) , parts ) ;
QAction * add_terminal = new QAction ( QET : : Icons : : Terminal , tr ( " Ajouter une borne " ) , parts ) ;
2017-09-25 17:44:02 +00:00
QAction * add_dynamic_text_field = new QAction ( QET : : Icons : : PartTextField , tr ( " Ajouter un champ texte dynamique " ) , parts ) ;
2014-11-11 17:09:24 +00:00
2017-02-05 16:18:50 +00:00
foreach ( QAction * action , parts - > actions ( ) ) action - > setCheckable ( true ) ;
2014-11-11 17:09:24 +00:00
connect ( add_line , SIGNAL ( triggered ( ) ) , this , SLOT ( addLine ( ) ) ) ;
connect ( add_rectangle , SIGNAL ( triggered ( ) ) , this , SLOT ( addRect ( ) ) ) ;
connect ( add_ellipse , SIGNAL ( triggered ( ) ) , this , SLOT ( addEllipse ( ) ) ) ;
connect ( add_polygon , SIGNAL ( triggered ( ) ) , this , SLOT ( addPolygon ( ) ) ) ;
connect ( add_text , SIGNAL ( triggered ( ) ) , this , SLOT ( addText ( ) ) ) ;
connect ( add_arc , SIGNAL ( triggered ( ) ) , this , SLOT ( addArc ( ) ) ) ;
connect ( add_terminal , SIGNAL ( triggered ( ) ) , this , SLOT ( addTerminal ( ) ) ) ;
2017-09-25 17:44:02 +00:00
connect ( add_dynamic_text_field , & QAction : : triggered , this , & QETElementEditor : : addDynamicTextField ) ;
2014-11-11 17:09:24 +00:00
2019-05-19 17:18:21 +00:00
add_polygon - > setStatusTip ( tr ( " Double-click pour terminer la forme, Click droit pour annuler le dernier point " ) ) ;
2019-05-19 18:28:39 +00:00
add_text - > setStatusTip ( tr ( " Ajouter un texte d'élément non éditable dans les schémas " ) ) ;
add_dynamic_text_field - > setStatusTip ( tr ( " Ajouter un texte d'élément pouvant être édité dans les schémas " ) ) ;
2007-06-30 17:41:07 +00:00
2014-11-11 17:09:24 +00:00
parts_toolbar = addToolBar ( tr ( " Parties " , " toolbar title " ) ) ;
2007-12-21 23:53:36 +00:00
parts_toolbar - > setAllowedAreas ( Qt : : AllToolBarAreas ) ;
2014-11-11 17:09:24 +00:00
parts_toolbar - > setObjectName ( " parts " ) ;
parts_toolbar - > addActions ( parts - > actions ( ) ) ;
addToolBar ( Qt : : LeftToolBarArea , parts_toolbar ) ;
2009-04-03 19:30:25 +00:00
main_toolbar = new QToolBar ( tr ( " Outils " , " toolbar title " ) , this ) ;
2008-01-07 18:51:18 +00:00
main_toolbar - > setObjectName ( " main_toolbar " ) ;
2009-04-03 19:30:25 +00:00
view_toolbar = new QToolBar ( tr ( " Affichage " , " toolbar title " ) , this ) ;
2008-01-07 19:40:08 +00:00
view_toolbar - > setObjectName ( " display " ) ;
2015-03-02 20:14:56 +00:00
element_toolbar = new QToolBar ( tr ( " Élément " , " toolbar title " ) , this ) ;
2008-01-07 18:51:18 +00:00
element_toolbar - > setObjectName ( " element_toolbar " ) ;
main_toolbar - > addAction ( new_element ) ;
main_toolbar - > addAction ( open ) ;
main_toolbar - > addAction ( save ) ;
main_toolbar - > addAction ( save_as ) ;
2013-07-28 21:55:02 +00:00
main_toolbar - > addAction ( reload ) ;
2008-01-07 18:51:18 +00:00
main_toolbar - > addSeparator ( ) ;
main_toolbar - > addAction ( undo ) ;
main_toolbar - > addAction ( redo ) ;
main_toolbar - > addSeparator ( ) ;
main_toolbar - > addAction ( edit_delete ) ;
2014-06-03 20:21:19 +00:00
2008-01-07 19:40:08 +00:00
view_toolbar - > addAction ( zoom_fit ) ;
view_toolbar - > addAction ( zoom_reset ) ;
2014-06-03 20:21:19 +00:00
2008-01-07 18:51:18 +00:00
element_toolbar - > addAction ( edit_names ) ;
2014-06-03 20:21:19 +00:00
element_toolbar - > addAction ( m_edit_properties ) ;
2008-01-07 18:51:18 +00:00
addToolBar ( Qt : : TopToolBarArea , main_toolbar ) ;
2008-01-07 19:40:08 +00:00
addToolBar ( Qt : : TopToolBarArea , view_toolbar ) ;
2008-01-07 18:51:18 +00:00
addToolBar ( Qt : : TopToolBarArea , element_toolbar ) ;
2007-06-30 17:41:07 +00:00
2017-07-31 17:41:48 +00:00
connect ( m_elmt_scene , SIGNAL ( selectionChanged ( ) ) , this , SLOT ( slot_updateInformations ( ) ) , Qt : : QueuedConnection ) ;
connect ( m_elmt_scene , SIGNAL ( selectionChanged ( ) ) , this , SLOT ( slot_updateMenus ( ) ) ) ;
2009-04-03 19:30:25 +00:00
connect ( QApplication : : clipboard ( ) , SIGNAL ( dataChanged ( ) ) , this , SLOT ( slot_updateMenus ( ) ) ) ;
2017-07-31 17:41:48 +00:00
connect ( & ( m_elmt_scene - > undoStack ( ) ) , SIGNAL ( cleanChanged ( bool ) ) , this , SLOT ( slot_updateMenus ( ) ) ) ;
connect ( & ( m_elmt_scene - > undoStack ( ) ) , SIGNAL ( cleanChanged ( bool ) ) , this , SLOT ( slot_updateTitle ( ) ) ) ;
2010-02-18 00:42:41 +00:00
// Annuler ou refaire une action met a jour la liste des primitives ; cela sert notamment pour les
// ajouts et suppressions de primitives ainsi que pour les actions entrainant un change
2017-07-31 17:41:48 +00:00
connect ( & ( m_elmt_scene - > undoStack ( ) ) , SIGNAL ( indexChanged ( int ) ) , this , SLOT ( slot_updatePartsList ( ) ) ) ;
2010-02-18 00:42:41 +00:00
// Annuler ou refaire une action met a jour les informations affichees sur les primitives selectionnees,
// celles-ci etant potentiellement impactees
2017-07-31 17:41:48 +00:00
connect ( & ( m_elmt_scene - > undoStack ( ) ) , SIGNAL ( indexChanged ( int ) ) , this , SLOT ( slot_updateInformations ( ) ) ) ;
2007-06-30 17:41:07 +00:00
}
2007-12-16 13:21:28 +00:00
/**
2014-11-11 17:09:24 +00:00
* @ brief QETElementEditor : : setupMenus
*/
2007-08-25 03:43:05 +00:00
void QETElementEditor : : setupMenus ( ) {
2010-03-28 16:27:48 +00:00
file_menu = new QMenu ( tr ( " &Fichier " ) , this ) ;
2015-03-02 20:14:56 +00:00
edit_menu = new QMenu ( tr ( " &Édition " ) , this ) ;
2010-03-28 16:27:48 +00:00
display_menu = new QMenu ( tr ( " Afficha&ge " ) , this ) ;
tools_menu = new QMenu ( tr ( " O&utils " ) , this ) ;
2007-06-30 17:41:07 +00:00
file_menu - > setTearOffEnabled ( true ) ;
edit_menu - > setTearOffEnabled ( true ) ;
display_menu - > setTearOffEnabled ( true ) ;
tools_menu - > setTearOffEnabled ( true ) ;
file_menu - > addAction ( new_element ) ;
file_menu - > addAction ( open ) ;
2009-04-03 19:30:25 +00:00
file_menu - > addAction ( open_file ) ;
2016-02-28 14:50:14 +00:00
file_menu - > addAction ( open_dxf ) ;
2015-03-02 20:14:56 +00:00
QMenu * recentfile = file_menu - > addMenu ( QET : : Icons : : DocumentOpenRecent , tr ( " &Récemment ouverts " ) ) ;
2014-11-03 01:22:10 +00:00
recentfile - > addActions ( QETApp : : elementsRecentFiles ( ) - > menu ( ) - > actions ( ) ) ;
2008-07-30 11:51:27 +00:00
connect ( QETApp : : elementsRecentFiles ( ) , SIGNAL ( fileOpeningRequested ( const QString & ) ) , this , SLOT ( openRecentFile ( const QString & ) ) ) ;
2007-06-30 17:41:07 +00:00
file_menu - > addAction ( save ) ;
file_menu - > addAction ( save_as ) ;
2009-04-03 19:30:25 +00:00
file_menu - > addAction ( save_as_file ) ;
2007-06-30 17:41:07 +00:00
file_menu - > addSeparator ( ) ;
2013-07-28 21:55:02 +00:00
file_menu - > addAction ( reload ) ;
2007-12-09 12:00:11 +00:00
file_menu - > addSeparator ( ) ;
2007-06-30 17:41:07 +00:00
file_menu - > addAction ( quit ) ;
2009-11-22 16:12:22 +00:00
paste_from_menu = new QMenu ( tr ( " Coller depuis... " ) ) ;
paste_from_menu - > setIcon ( QET : : Icons : : EditPaste ) ;
paste_from_menu - > addAction ( paste_from_file ) ;
paste_from_menu - > addAction ( paste_from_elmt ) ;
2013-09-15 11:21:07 +00:00
2007-08-23 15:33:55 +00:00
edit_menu - > addAction ( undo ) ;
edit_menu - > addAction ( redo ) ;
edit_menu - > addSeparator ( ) ;
2007-06-30 17:41:07 +00:00
edit_menu - > addAction ( selectall ) ;
edit_menu - > addAction ( deselectall ) ;
edit_menu - > addAction ( inv_select ) ;
edit_menu - > addSeparator ( ) ;
2009-04-03 19:30:25 +00:00
edit_menu - > addAction ( cut ) ;
edit_menu - > addAction ( copy ) ;
edit_menu - > addAction ( paste ) ;
edit_menu - > addAction ( paste_in_area ) ;
2009-11-22 16:12:22 +00:00
edit_menu - > addMenu ( paste_from_menu ) ;
2009-04-03 19:30:25 +00:00
edit_menu - > addSeparator ( ) ;
2007-06-30 17:41:07 +00:00
edit_menu - > addAction ( edit_delete ) ;
edit_menu - > addSeparator ( ) ;
edit_menu - > addAction ( edit_names ) ;
2010-02-14 16:28:45 +00:00
edit_menu - > addAction ( edit_author ) ;
2014-06-03 20:21:19 +00:00
edit_menu - > addAction ( m_edit_properties ) ;
2007-10-07 18:52:01 +00:00
edit_menu - > addSeparator ( ) ;
2018-06-20 18:35:06 +00:00
edit_menu - > addActions ( m_depth_action_group - > actions ( ) ) ;
2014-11-11 17:09:24 +00:00
display_menu - > addActions ( m_zoom_ag - > actions ( ) ) ;
2009-06-19 19:31:48 +00:00
2012-02-13 22:13:19 +00:00
insertMenu ( settings_menu_ , file_menu ) ;
insertMenu ( settings_menu_ , edit_menu ) ;
insertMenu ( settings_menu_ , display_menu ) ;
2007-06-30 17:41:07 +00:00
}
2013-09-14 13:11:32 +00:00
/**
2018-06-30 21:41:27 +00:00
* @ brief QETElementEditor : : contextMenu
* Display a context menu , with all available action .
* @ param p , the pos of the menu , in screen coordinate
* @ param actions , a list of actions who can be prepended to the context menu .
2013-09-14 13:11:32 +00:00
*/
2018-06-30 21:41:27 +00:00
void QETElementEditor : : contextMenu ( QPoint p , QList < QAction * > actions )
2018-03-31 11:21:55 +00:00
{
2013-09-17 20:14:30 +00:00
QMenu menu ( this ) ;
2018-07-19 14:14:31 +00:00
menu . addActions ( std : : move ( actions ) ) ;
2018-06-30 21:41:27 +00:00
menu . addSeparator ( ) ;
2013-09-17 20:14:30 +00:00
menu . addAction ( undo ) ;
menu . addAction ( redo ) ;
menu . addAction ( selectall ) ;
menu . addAction ( deselectall ) ;
menu . addAction ( inv_select ) ;
menu . addSeparator ( ) ;
menu . addAction ( edit_delete ) ;
menu . addAction ( cut ) ;
menu . addAction ( copy ) ;
menu . addSeparator ( ) ;
menu . addAction ( paste ) ;
menu . addAction ( paste_in_area ) ;
menu . addMenu ( paste_from_menu ) ;
menu . addSeparator ( ) ;
2018-06-20 18:35:06 +00:00
menu . addActions ( m_depth_action_group - > actions ( ) ) ;
2018-03-31 11:21:55 +00:00
//Remove from the context menu the actions which are disabled.
2018-06-30 21:41:27 +00:00
const QList < QAction * > menu_actions = menu . actions ( ) ;
for ( QAction * action : menu_actions )
2018-03-31 11:21:55 +00:00
{
if ( ! action - > isEnabled ( ) )
menu . removeAction ( action ) ;
}
2015-04-18 18:49:31 +00:00
menu . exec ( p ) ;
2018-06-30 21:41:27 +00:00
}
2013-09-14 13:11:32 +00:00
2007-12-16 13:21:28 +00:00
/**
Met a jour les menus
*/
2007-08-25 03:43:05 +00:00
void QETElementEditor : : slot_updateMenus ( ) {
2017-07-31 17:41:48 +00:00
bool selected_items = ! read_only & & ! m_elmt_scene - > selectedItems ( ) . isEmpty ( ) ;
2010-01-03 19:51:02 +00:00
bool clipboard_elmt = ! read_only & & ElementScene : : clipboardMayContainElement ( ) ;
// actions dependant seulement de l'etat "lecture seule" de l'editeur
2017-02-05 16:18:50 +00:00
foreach ( QAction * action , parts - > actions ( ) ) {
2010-01-03 19:51:02 +00:00
action - > setEnabled ( ! read_only ) ;
}
selectall - > setEnabled ( ! read_only ) ;
inv_select - > setEnabled ( ! read_only ) ;
paste_from_file - > setEnabled ( ! read_only ) ;
paste_from_elmt - > setEnabled ( ! read_only ) ;
2017-09-25 17:44:02 +00:00
m_parts_list - > setEnabled ( ! read_only ) ;
2010-01-03 19:51:02 +00:00
2014-11-11 17:09:24 +00:00
// Action enabled if primitive selected
2010-01-03 19:51:02 +00:00
deselectall - > setEnabled ( selected_items ) ;
cut - > setEnabled ( selected_items ) ;
copy - > setEnabled ( selected_items ) ;
edit_delete - > setEnabled ( selected_items ) ;
2018-06-20 18:35:06 +00:00
foreach ( QAction * action , m_depth_action_group - > actions ( ) )
2014-11-11 17:09:24 +00:00
action - > setEnabled ( selected_items ) ;
2010-01-03 19:51:02 +00:00
// actions dependant du contenu du presse-papiers
paste - > setEnabled ( clipboard_elmt ) ;
paste_in_area - > setEnabled ( clipboard_elmt ) ;
// actions dependant de l'etat de la pile d'annulation
2017-07-31 17:41:48 +00:00
save - > setEnabled ( ! read_only & & ! m_elmt_scene - > undoStack ( ) . isClean ( ) ) ;
undo - > setEnabled ( ! read_only & & m_elmt_scene - > undoStack ( ) . canUndo ( ) ) ;
redo - > setEnabled ( ! read_only & & m_elmt_scene - > undoStack ( ) . canRedo ( ) ) ;
2007-08-25 15:46:09 +00:00
}
2007-12-16 13:21:28 +00:00
/**
Met a jour le titre de la fenetre
*/
2007-08-25 15:46:09 +00:00
void QETElementEditor : : slot_updateTitle ( ) {
QString title = min_title ;
2017-07-31 17:41:48 +00:00
title + = " - " + m_elmt_scene - > names ( ) . name ( ) + " " ;
2009-04-03 19:30:25 +00:00
if ( ! filename_ . isEmpty ( ) | | ! location_ . isNull ( ) ) {
2017-07-31 17:41:48 +00:00
if ( ! m_elmt_scene - > undoStack ( ) . isClean ( ) ) title + = tr ( " [Modifié] " , " window title tag " ) ;
2007-08-25 15:46:09 +00:00
}
2009-04-03 19:30:25 +00:00
if ( isReadOnly ( ) ) title + = tr ( " [lecture seule] " , " window title tag " ) ;
2007-08-25 15:46:09 +00:00
setWindowTitle ( title ) ;
2007-06-30 17:41:07 +00:00
}
2007-12-16 13:21:28 +00:00
/**
2018-07-17 12:19:56 +00:00
* @ brief QETElementEditor : : setupInterface
*/
void QETElementEditor : : setupInterface ( )
{
// editeur
2017-07-31 17:41:48 +00:00
m_elmt_scene = new ElementScene ( this , this ) ;
2017-09-25 17:44:02 +00:00
m_view = new ElementView ( m_elmt_scene , this ) ;
2007-06-30 17:41:07 +00:00
slot_setRubberBandToView ( ) ;
2017-09-25 17:44:02 +00:00
setCentralWidget ( m_view ) ;
2007-06-30 17:41:07 +00:00
2018-07-17 12:19:56 +00:00
// widget par defaut dans le QDockWidget
2017-09-25 17:44:02 +00:00
m_default_informations = new QLabel ( ) ;
2007-06-30 17:41:07 +00:00
2018-07-17 12:19:56 +00:00
// ScrollArea pour accueillir un widget d'edition (change a la volee)
// m_tools_dock_scroll_area = new QScrollArea();
// m_tools_dock_scroll_area -> setFrameStyle(QFrame::NoFrame);
// m_tools_dock_scroll_area -> setAlignment(Qt::AlignHCenter|Qt::AlignTop);
2009-04-03 19:30:25 +00:00
2018-07-17 12:19:56 +00:00
// Pile de widgets pour accueillir les deux widgets precedents
2017-09-25 17:44:02 +00:00
m_tools_dock_stack = new QStackedWidget ( ) ;
m_tools_dock_stack - > insertWidget ( 0 , m_default_informations ) ;
2018-07-17 12:19:56 +00:00
// m_tools_dock_stack -> insertWidget(1, m_tools_dock_scroll_area);
2009-04-03 19:30:25 +00:00
2018-07-17 12:19:56 +00:00
// widgets d'editions pour les parties
2017-09-25 17:44:02 +00:00
m_editors [ " arc " ] = new ArcEditor ( this ) ;
m_editors [ " ellipse " ] = new EllipseEditor ( this ) ;
m_editors [ " line " ] = new LineEditor ( this ) ;
m_editors [ " polygon " ] = new PolygonEditor ( this ) ;
m_editors [ " rect " ] = new RectangleEditor ( this ) ;
m_editors [ " terminal " ] = new TerminalEditor ( this ) ;
m_editors [ " text " ] = new TextEditor ( this ) ;
m_editors [ " style " ] = new StyleEditor ( this ) ;
m_editors [ " dynamic_text " ] = new DynamicTextFieldEditor ( this ) ;
2010-02-18 00:42:41 +00:00
2007-08-23 15:33:55 +00:00
// panel sur le cote pour editer les parties
2017-09-25 17:44:02 +00:00
m_tools_dock = new QDockWidget ( tr ( " Informations " , " dock title " ) , this ) ;
m_tools_dock - > setObjectName ( " informations " ) ;
m_tools_dock - > setAllowedAreas ( Qt : : LeftDockWidgetArea | Qt : : RightDockWidgetArea ) ;
m_tools_dock - > setFeatures ( QDockWidget : : AllDockWidgetFeatures ) ;
//m_tools_dock -> setMinimumWidth(380);
addDockWidget ( Qt : : RightDockWidgetArea , m_tools_dock ) ;
m_tools_dock - > setWidget ( m_tools_dock_stack ) ;
2007-08-23 15:33:55 +00:00
// panel sur le cote pour les annulations
2017-09-25 17:44:02 +00:00
m_undo_dock = new QDockWidget ( tr ( " Annulations " , " dock title " ) , this ) ;
m_undo_dock - > setObjectName ( " undo " ) ;
m_undo_dock - > setAllowedAreas ( Qt : : LeftDockWidgetArea | Qt : : RightDockWidgetArea ) ;
m_undo_dock - > setFeatures ( QDockWidget : : AllDockWidgetFeatures ) ;
m_undo_dock - > setMinimumWidth ( 290 ) ;
addDockWidget ( Qt : : RightDockWidgetArea , m_undo_dock ) ;
2018-07-30 15:24:29 +00:00
QUndoView * undo_view = new QUndoView ( & ( m_elmt_scene - > undoStack ( ) ) , this ) ;
2007-11-09 15:16:54 +00:00
undo_view - > setEmptyLabel ( tr ( " Aucune modification " ) ) ;
2017-09-25 17:44:02 +00:00
m_undo_dock - > setWidget ( undo_view ) ;
2007-08-23 15:33:55 +00:00
2007-12-05 21:16:01 +00:00
// panel sur le cote pour la liste des parties
2017-09-25 17:44:02 +00:00
m_parts_list = new QListWidget ( this ) ;
m_parts_list - > setSelectionMode ( QAbstractItemView : : ExtendedSelection ) ;
2017-07-31 17:41:48 +00:00
connect ( m_elmt_scene , SIGNAL ( partsAdded ( ) ) , this , SLOT ( slot_createPartsList ( ) ) ) ;
connect ( m_elmt_scene , SIGNAL ( partsRemoved ( ) ) , this , SLOT ( slot_createPartsList ( ) ) ) ;
connect ( m_elmt_scene , SIGNAL ( partsZValueChanged ( ) ) , this , SLOT ( slot_createPartsList ( ) ) ) ;
connect ( m_elmt_scene , SIGNAL ( selectionChanged ( ) ) , this , SLOT ( slot_updatePartsList ( ) ) ) ;
2017-09-25 17:44:02 +00:00
connect ( m_parts_list , SIGNAL ( itemSelectionChanged ( ) ) , this , SLOT ( slot_updateSelectionFromPartsList ( ) ) ) ;
m_parts_dock = new QDockWidget ( tr ( " Parties " , " dock title " ) , this ) ;
m_parts_dock - > setObjectName ( " parts_list " ) ;
m_parts_dock - > setAllowedAreas ( Qt : : LeftDockWidgetArea | Qt : : RightDockWidgetArea ) ;
m_parts_dock - > setFeatures ( QDockWidget : : AllDockWidgetFeatures ) ;
m_parts_dock - > setMinimumWidth ( 290 ) ;
tabifyDockWidget ( m_undo_dock , m_parts_dock ) ;
m_parts_dock - > setWidget ( m_parts_list ) ;
2007-11-07 20:23:24 +00:00
2007-06-30 17:41:07 +00:00
slot_updateInformations ( ) ;
2007-11-07 20:23:24 +00:00
slot_createPartsList ( ) ;
2007-06-30 17:41:07 +00:00
// barre d'etat
2015-03-02 20:14:56 +00:00
statusBar ( ) - > showMessage ( tr ( " Éditeur d'éléments " , " status bar message " ) ) ;
2007-06-30 17:41:07 +00:00
}
2007-12-16 13:21:28 +00:00
/**
Passe l ' editeur d ' element en mode selection : le pointeur deplace les
elements selectionnes et il est possible d ' utiliser un rectangle de selection .
*/
2007-08-25 03:43:05 +00:00
void QETElementEditor : : slot_setRubberBandToView ( ) {
2017-09-25 17:44:02 +00:00
m_view - > setDragMode ( QGraphicsView : : RubberBandDrag ) ;
2007-06-30 17:41:07 +00:00
}
2007-12-16 13:21:28 +00:00
/**
Passe l ' editeur d ' element en mode immobile ( utilise pour la lecture seule )
*/
2007-08-25 03:43:05 +00:00
void QETElementEditor : : slot_setNoDragToView ( ) {
2017-09-25 17:44:02 +00:00
m_view - > setDragMode ( QGraphicsView : : NoDrag ) ;
2007-06-30 17:41:07 +00:00
}
2007-12-16 13:21:28 +00:00
/**
2010-02-18 00:42:41 +00:00
Met a jour la zone d ' information et d ' edition des primitives .
Si plusieurs primitives sont selectionnees , seule leur quantite est
affichee . Sinon , un widget d ' edition approprie est mis en place .
2007-12-16 13:21:28 +00:00
*/
2017-09-25 17:44:02 +00:00
void QETElementEditor : : slot_updateInformations ( )
{
2017-07-31 17:41:48 +00:00
QList < QGraphicsItem * > selected_qgis = m_elmt_scene - > selectedItems ( ) ;
2020-05-28 17:48:52 +02:00
if ( selected_qgis . isEmpty ( ) ) {
clearToolsDock ( ) ;
m_default_informations - > setText ( tr ( " %n partie(s) sélectionnée(s). " ,
" " ,
selected_qgis . size ( ) ) ) ;
m_default_informations - > setAlignment ( Qt : : AlignHCenter | Qt : : AlignTop ) ;
m_tools_dock_stack - > setCurrentIndex ( 0 ) ;
return ;
}
2015-02-15 10:21:32 +00:00
QList < CustomElementPart * > cep_list ;
2020-05-26 23:23:19 +02:00
CustomElementPart * part = dynamic_cast < CustomElementPart * > ( selected_qgis . first ( ) ) ;
2020-05-28 17:48:52 +02:00
QString selection_xml_name = part - > xmlName ( ) ;
bool same_xml_name = true ;
bool style_editable = true ;
for ( QGraphicsItem * qgi : selected_qgis ) {
if ( CustomElementPart * cep = dynamic_cast < CustomElementPart * > ( qgi ) ) {
cep_list < < cep ;
if ( cep - > xmlName ( ) ! = selection_xml_name )
2020-05-26 23:23:19 +02:00
same_xml_name = false ;
2020-05-28 20:48:56 +02:00
} else {
2020-05-28 17:48:52 +02:00
style_editable = false ;
2020-05-28 20:48:56 +02:00
same_xml_name = false ;
}
2020-05-28 17:48:52 +02:00
}
if ( style_editable )
style_editable = StyleEditor : : isStyleEditable ( cep_list ) ;
2020-05-26 23:23:19 +02:00
if ( same_xml_name ) {
2020-06-01 19:38:07 +02:00
if ( selection_xml_name = = " terminal " | |
selection_xml_name = = " text " | |
selection_xml_name = = " dynamic_text " ) {
2020-05-26 23:23:19 +02:00
clearToolsDock ( ) ;
//We add the editor widget
2020-05-28 20:48:56 +02:00
ElementItemEditor * editor = static_cast < ElementItemEditor * > ( m_editors [ selection_xml_name ] ) ;
2020-06-01 20:46:34 +02:00
// TODO: Check if it takes longer than setting the parts again to the editor.
bool equal = true ;
QList < CustomElementPart * > parts = editor - > currentParts ( ) ;
if ( parts . length ( ) = = cep_list . length ( ) ) {
for ( auto cep : cep_list ) {
bool part_found = false ;
for ( auto part : parts ) {
if ( part = = cep ) {
part_found = true ;
break ;
}
}
if ( ! part_found ) {
equal = false ;
break ;
}
}
} else
equal = false ;
2020-05-26 23:23:19 +02:00
if ( editor )
{
2020-06-01 20:46:34 +02:00
bool success = true ;
if ( equal = = false ) {
success = editor - > setParts ( cep_list ) ;
}
if ( success )
2020-05-26 23:23:19 +02:00
{
2020-05-28 17:48:52 +02:00
m_tools_dock_stack - > insertWidget ( 1 , editor ) ;
2020-05-26 23:23:19 +02:00
m_tools_dock_stack - > setCurrentIndex ( 1 ) ;
}
else
{
qDebug ( ) < < " Editor refused part. " ;
}
}
2020-05-28 17:48:52 +02:00
return ;
2020-05-26 23:23:19 +02:00
}
2020-05-28 17:48:52 +02:00
}
2015-02-15 10:21:32 +00:00
2020-05-28 17:48:52 +02:00
//There's several parts selecteds and all can be edited by style editor.
if ( style_editable )
2015-02-15 10:21:32 +00:00
{
2017-09-25 17:44:02 +00:00
clearToolsDock ( ) ;
ElementItemEditor * selection_editor = m_editors [ " style " ] ;
2015-02-15 10:21:32 +00:00
if ( selection_editor )
{
if ( selection_editor - > setParts ( cep_list ) )
{
2018-07-17 12:19:56 +00:00
m_tools_dock_stack - > insertWidget ( 1 , selection_editor ) ;
2017-09-25 17:44:02 +00:00
m_tools_dock_stack - > setCurrentIndex ( 1 ) ;
2015-02-15 10:21:32 +00:00
}
else
{
qDebug ( ) < < " Editor refused part. " ;
}
}
}
//Else we only display the number of selected items
else
{
2017-09-25 17:44:02 +00:00
clearToolsDock ( ) ;
m_default_informations - > setText ( tr ( " %n partie(s) sélectionnée(s). " ,
2015-02-15 10:21:32 +00:00
" " ,
selected_qgis . size ( ) ) ) ;
2017-09-25 17:44:02 +00:00
m_default_informations - > setAlignment ( Qt : : AlignHCenter | Qt : : AlignTop ) ;
m_tools_dock_stack - > setCurrentIndex ( 0 ) ;
2007-06-30 17:41:07 +00:00
}
}
2009-04-03 19:30:25 +00:00
/**
2014-06-03 20:21:19 +00:00
* @ brief QETElementEditor : : checkElement
* Do several check about element .
2019-07-20 14:27:52 +02:00
* If error is occurred return false
2014-06-03 20:21:19 +00:00
*/
2015-02-11 08:27:39 +00:00
bool QETElementEditor : : checkElement ( )
{
//List of warning and error
2009-06-01 02:05:20 +00:00
typedef QPair < QString , QString > QETWarning ;
QList < QETWarning > warnings ;
2014-06-03 20:21:19 +00:00
QList < QETWarning > errors ;
2015-02-11 08:27:39 +00:00
/// Warning #1: Element haven't got terminal
/// (except for report, because report must have one terminal and this checking is do below)
2017-07-31 17:41:48 +00:00
if ( ! m_elmt_scene - > containsTerminals ( ) & & ! m_elmt_scene - > elementType ( ) . contains ( " report " ) )
2015-02-11 08:27:39 +00:00
{
2009-06-01 02:05:20 +00:00
warnings < < qMakePair (
tr ( " Absence de borne " , " warning title " ) ,
tr (
2015-03-02 20:14:56 +00:00
" <br>En l'absence de borne, l'élément ne pourra être "
" relié à d'autres éléments par l'intermédiaire de conducteurs. " ,
2009-06-01 02:05:20 +00:00
" warning description "
)
) ;
}
2014-06-03 20:21:19 +00:00
2015-02-11 08:27:39 +00:00
/// Check folio report element
2017-07-31 17:41:48 +00:00
if ( m_elmt_scene - > elementType ( ) . contains ( " report " ) )
2015-02-11 08:27:39 +00:00
{
2018-03-11 15:11:08 +00:00
int terminal = 0 ;
2014-06-05 09:06:57 +00:00
2017-07-31 17:41:48 +00:00
foreach ( QGraphicsItem * qgi , m_elmt_scene - > items ( ) )
2018-03-11 15:11:08 +00:00
if ( qgraphicsitem_cast < PartTerminal * > ( qgi ) )
terminal + + ;
2014-06-05 09:06:57 +00:00
2018-03-11 15:11:08 +00:00
///Error folio report must have only one terminal
2015-02-11 08:27:39 +00:00
if ( terminal ! = 1 )
{
errors < < qMakePair ( tr ( " Absence de borne " ) ,
tr ( " <br><b>Erreur</b> : "
2015-03-02 20:14:56 +00:00
" <br>Les reports de folio doivent posséder une seul borne. "
2015-02-11 08:27:39 +00:00
" <br><b>Solution</b> : "
2015-03-02 20:14:56 +00:00
" <br>Verifier que l'élément ne possède qu'une seul borne " ) ) ;
2014-06-05 09:06:57 +00:00
}
}
2015-02-11 08:27:39 +00:00
2014-06-03 20:21:19 +00:00
if ( ! errors . count ( ) & & ! warnings . count ( ) ) return ( true ) ;
2015-02-11 08:27:39 +00:00
// Display warnings
2015-03-02 20:14:56 +00:00
QString dialog_message = tr ( " La vérification de cet élément a généré " , " message box content " ) ;
2015-02-11 08:27:39 +00:00
if ( errors . size ( ) )
dialog_message + = QString ( tr ( " %n erreur(s) " , " errors " , errors . size ( ) ) ) ;
if ( warnings . size ( ) )
{
if ( errors . size ( ) )
dialog_message + = QString ( tr ( " et " ) ) ;
2018-12-04 22:33:11 +00:00
dialog_message + = QString ( tr ( " %n avertissement(s) " , " warnings " , warnings . size ( ) ) ) ;
2015-02-11 08:27:39 +00:00
}
dialog_message + = " : " ;
dialog_message + = " <ol> " ;
2014-06-03 20:21:19 +00:00
QList < QETWarning > total = warnings < < errors ;
2017-02-05 16:18:50 +00:00
foreach ( QETWarning warning , total ) {
2015-02-11 08:27:39 +00:00
dialog_message + = " <li> " ;
dialog_message + = QString (
2015-03-02 20:14:56 +00:00
tr ( " <b>%1</b> : %2 " , " warning title: warning description " )
2009-06-01 02:05:20 +00:00
) . arg ( warning . first ) . arg ( warning . second ) ;
2015-02-11 08:27:39 +00:00
dialog_message + = " </li> " ;
2009-06-01 02:05:20 +00:00
}
2015-02-11 08:27:39 +00:00
dialog_message + = " </ol> " ;
2014-06-03 20:21:19 +00:00
2015-02-11 08:27:39 +00:00
if ( errors . size ( ) )
QMessageBox : : critical ( this , tr ( " Erreurs " ) , dialog_message ) ;
else
QMessageBox : : warning ( this , tr ( " Avertissements " ) , dialog_message ) ;
2014-06-03 20:21:19 +00:00
2015-02-11 08:27:39 +00:00
//if error == 0 that means they are only warning, we return true.
2014-06-03 20:21:19 +00:00
if ( errors . count ( ) = = 0 ) return ( true ) ;
return false ;
2009-04-03 19:30:25 +00:00
}
2007-12-16 13:21:28 +00:00
/**
Charge un fichier
@ param filepath Chemin du fichier a charger
*/
2007-08-25 03:43:05 +00:00
void QETElementEditor : : fromFile ( const QString & filepath ) {
2007-06-30 17:41:07 +00:00
bool state = true ;
QString error_message ;
// le fichier doit exister
QFileInfo infos_file ( filepath ) ;
if ( ! infos_file . exists ( ) | | ! infos_file . isFile ( ) ) {
state = false ;
2009-04-03 19:30:25 +00:00
error_message = QString ( tr ( " Le fichier %1 n'existe pas. " , " message box content " ) ) . arg ( filepath ) ;
2007-06-30 17:41:07 +00:00
}
// le fichier doit etre lisible
QFile file ( filepath ) ;
if ( state ) {
if ( ! file . open ( QIODevice : : ReadOnly ) ) {
state = false ;
2009-04-03 19:30:25 +00:00
error_message = QString ( tr ( " Impossible d'ouvrir le fichier %1. " , " message box content " ) ) . arg ( filepath ) ;
2007-06-30 17:41:07 +00:00
}
}
// le fichier doit etre un document XML
QDomDocument document_xml ;
if ( state ) {
if ( ! document_xml . setContent ( & file ) ) {
state = false ;
2009-04-03 19:30:25 +00:00
error_message = tr ( " Ce fichier n'est pas un document XML valide " , " message box content " ) ;
2007-06-30 17:41:07 +00:00
}
file . close ( ) ;
}
if ( ! state ) {
2015-03-02 20:14:56 +00:00
QET : : QetMessageBox : : critical ( this , tr ( " Erreur " , " toolbar title " ) , error_message ) ;
2007-06-30 17:41:07 +00:00
return ;
}
// chargement de l'element
2017-07-31 17:41:48 +00:00
m_elmt_scene - > fromXml ( document_xml ) ;
2007-11-07 20:23:24 +00:00
slot_createPartsList ( ) ;
2007-06-30 17:41:07 +00:00
// gestion de la lecture seule
if ( ! infos_file . isWritable ( ) ) {
2015-03-02 20:14:56 +00:00
QET : : QetMessageBox : : warning (
2007-06-30 17:41:07 +00:00
this ,
2015-03-02 20:14:56 +00:00
tr ( " Édition en lecture seule " , " message box title " ) ,
tr ( " Vous n'avez pas les privilèges nécessaires pour modifier cet élement. Il sera donc ouvert en lecture seule. " , " message box content " )
2007-06-30 17:41:07 +00:00
) ;
setReadOnly ( true ) ;
2010-01-03 19:51:02 +00:00
} else {
setReadOnly ( false ) ;
2007-06-30 17:41:07 +00:00
}
// memorise le fichier
2007-08-25 15:46:09 +00:00
setFileName ( filepath ) ;
2008-07-30 11:51:27 +00:00
QETApp : : elementsRecentFiles ( ) - > fileWasOpened ( filepath ) ;
2008-01-07 18:51:18 +00:00
slot_updateMenus ( ) ;
2007-06-30 17:41:07 +00:00
}
2007-12-16 13:21:28 +00:00
/**
2017-07-31 17:41:48 +00:00
* @ brief QETElementEditor : : toFile
* Save to file the drawed element .
* @ param fn : path of the file
* @ return : true if succesfully save .
*/
bool QETElementEditor : : toFile ( const QString & fn )
{
m_elmt_scene - > clearEventInterface ( ) ;
m_elmt_scene - > clearSelection ( ) ;
2017-07-31 17:54:22 +00:00
UncheckAddPrimitive ( ) ;
2017-07-31 17:41:48 +00:00
QDomDocument element_xml = m_elmt_scene - > toXml ( ) ;
2012-04-09 01:03:08 +00:00
bool writing = QET : : writeXmlFile ( element_xml , fn ) ;
if ( ! writing ) {
2015-03-02 20:14:56 +00:00
QET : : QetMessageBox : : warning (
2012-04-09 01:03:08 +00:00
this ,
tr ( " Erreur " , " message box title " ) ,
2015-03-02 20:14:56 +00:00
tr ( " Impossible d'écrire dans ce fichier " , " message box content " )
2012-04-09 01:03:08 +00:00
) ;
2007-06-30 17:41:07 +00:00
}
2012-04-09 01:03:08 +00:00
return ( writing ) ;
2007-06-30 17:41:07 +00:00
}
2016-03-31 17:28:44 +00:00
2009-04-03 19:30:25 +00:00
/**
2016-03-31 17:28:44 +00:00
* @ brief QETElementEditor : : toLocation
* Save the element to Location
* @ param location : location where we must save the current element
* @ return true if succesfully saved
*/
bool QETElementEditor : : toLocation ( const ElementsLocation & location )
{
2017-07-31 17:41:48 +00:00
m_elmt_scene - > clearEventInterface ( ) ;
m_elmt_scene - > clearSelection ( ) ;
2017-07-31 17:54:22 +00:00
UncheckAddPrimitive ( ) ;
2017-07-31 17:41:48 +00:00
if ( ! location . setXml ( m_elmt_scene - > toXml ( ) ) )
2016-03-31 17:28:44 +00:00
{
QET : : QetMessageBox : : critical ( this ,
tr ( " Erreur " , " message box title " ) ,
tr ( " Impossible d'enregistrer l'élément " , " message box content " ) ) ;
2009-04-03 19:30:25 +00:00
return ( false ) ;
}
return ( true ) ;
}
2010-03-28 16:27:48 +00:00
/**
@ param provided_location Emplacement d ' un element
@ return true si cet editeur est en train d ' editer l ' element dont
l ' emplacement est location , false sinon
*/
bool QETElementEditor : : isEditing ( const ElementsLocation & provided_location ) {
if ( opened_from_file ) {
return (
QET : : compareCanonicalFilePaths (
filename_ ,
QETApp : : realPath ( provided_location . toString ( ) )
)
) ;
} else {
return ( provided_location = = location_ ) ;
}
}
/**
@ param provided_filepath Chemin d ' un element sur un filesystem
@ return true si cet editeur est en train d ' editer l ' element dont
le chemin est filepath , false sinon
*/
bool QETElementEditor : : isEditing ( const QString & provided_filepath ) {
// determine le chemin canonique de l'element actuelle edite, si applicable
QString current_filepath ;
if ( opened_from_file ) {
current_filepath = filename_ ;
} else {
current_filepath = QETApp : : realPath ( location_ . toString ( ) ) ;
}
return (
QET : : compareCanonicalFilePaths (
current_filepath ,
provided_filepath
)
) ;
}
2007-06-30 17:41:07 +00:00
/**
specifie si l ' editeur d ' element doit etre en mode lecture seule
@ param ro true pour activer le mode lecture seule , false pour le desactiver
*/
2007-08-25 03:43:05 +00:00
void QETElementEditor : : setReadOnly ( bool ro ) {
2007-06-30 17:41:07 +00:00
read_only = ro ;
// active / desactive les interactions avec la scene
2017-09-25 17:44:02 +00:00
m_view - > setInteractive ( ! ro ) ;
2007-06-30 17:41:07 +00:00
2010-01-03 19:51:02 +00:00
slot_updateMenus ( ) ;
2007-06-30 17:41:07 +00:00
}
/**
@ return true si l ' editeur d ' element est en mode lecture seule
*/
2007-08-25 03:43:05 +00:00
bool QETElementEditor : : isReadOnly ( ) const {
2007-06-30 17:41:07 +00:00
return ( read_only ) ;
}
2014-11-04 22:23:27 +00:00
/**
* @ brief QETElementEditor : : addLine
* Set line creation interface to scene
*/
void QETElementEditor : : addLine ( ) {
2017-07-31 17:41:48 +00:00
m_elmt_scene - > setEventInterface ( new ESEventAddLine ( m_elmt_scene ) ) ;
2014-11-04 22:23:27 +00:00
}
2014-11-06 10:46:14 +00:00
/**
* @ brief QETElementEditor : : addRect
* Set rectangle creation interface to scene
*/
void QETElementEditor : : addRect ( ) {
2017-07-31 17:41:48 +00:00
m_elmt_scene - > setEventInterface ( new ESEventAddRect ( m_elmt_scene ) ) ;
2014-11-06 10:46:14 +00:00
}
2014-11-07 09:39:19 +00:00
/**
* @ brief QETElementEditor : : addEllipse
* Set ellipse creation interface to scene
*/
void QETElementEditor : : addEllipse ( ) {
2017-07-31 17:41:48 +00:00
m_elmt_scene - > setEventInterface ( new ESEventAddEllipse ( m_elmt_scene ) ) ;
2014-11-07 09:39:19 +00:00
}
2014-11-08 11:14:56 +00:00
/**
* @ brief QETElementEditor : : addPolygon
* Set polygon creation interface to scene
*/
void QETElementEditor : : addPolygon ( ) {
2017-07-31 17:41:48 +00:00
m_elmt_scene - > setEventInterface ( new ESEventAddPolygon ( m_elmt_scene ) ) ;
2014-11-08 11:14:56 +00:00
}
2014-11-09 21:58:46 +00:00
/**
* @ brief QETElementEditor : : addArc
* Set arc creation interface to scene
*/
void QETElementEditor : : addArc ( ) {
2017-07-31 17:41:48 +00:00
m_elmt_scene - > setEventInterface ( new ESEventAddArc ( m_elmt_scene ) ) ;
2014-11-09 21:58:46 +00:00
}
2014-11-09 23:11:17 +00:00
/**
* @ brief QETElementEditor : : addText
* Set text creation interface to scene
*/
void QETElementEditor : : addText ( ) {
2017-07-31 17:41:48 +00:00
m_elmt_scene - > setEventInterface ( new ESEventAddText ( m_elmt_scene ) ) ;
2014-11-09 23:11:17 +00:00
}
2014-11-10 21:47:28 +00:00
/**
* @ brief QETElementEditor : : addTerminal
* Set terminal creation interface to scene
*/
void QETElementEditor : : addTerminal ( ) {
2017-07-31 17:41:48 +00:00
m_elmt_scene - > setEventInterface ( new ESEventAddTerminal ( m_elmt_scene ) ) ;
2014-11-10 21:47:28 +00:00
}
2017-09-25 17:44:02 +00:00
/**
* @ brief QETElementEditor : : addDynamicTextField
* Set dynamic text field creation interface to scene
*/
void QETElementEditor : : addDynamicTextField ( ) {
m_elmt_scene - > setEventInterface ( new ESEventAddDynamicTextField ( m_elmt_scene ) ) ;
}
2014-11-10 22:57:32 +00:00
/**
* @ brief QETElementEditor : : UncheckAddPrimitive
* Uncheck all action related to primitive
*/
void QETElementEditor : : UncheckAddPrimitive ( ) {
2017-02-05 16:18:50 +00:00
foreach ( QAction * action , parts - > actions ( ) ) action - > setChecked ( false ) ;
2014-11-10 22:57:32 +00:00
}
2007-12-16 13:21:28 +00:00
/**
Lance l ' assistant de creation d ' un nouvel element .
*/
2007-08-25 03:43:05 +00:00
void QETElementEditor : : slot_new ( ) {
2008-08-17 20:41:37 +00:00
NewElementWizard new_element_wizard ( this ) ;
2007-06-30 17:41:07 +00:00
new_element_wizard . exec ( ) ;
}
2007-12-16 13:21:28 +00:00
/**
2009-04-03 19:30:25 +00:00
Ouvre un element
2007-12-16 13:21:28 +00:00
*/
2007-08-25 03:43:05 +00:00
void QETElementEditor : : slot_open ( ) {
2009-04-03 19:30:25 +00:00
// demande le chemin virtuel de l'element a ouvrir a l'utilisateur
2009-08-13 18:30:06 +00:00
ElementsLocation location = ElementDialog : : getOpenElementLocation ( this ) ;
2009-04-03 19:30:25 +00:00
if ( location . isNull ( ) ) return ;
2010-03-28 16:27:48 +00:00
QETApp : : instance ( ) - > openElementLocations ( QList < ElementsLocation > ( ) < < location ) ;
2009-04-03 19:30:25 +00:00
}
/**
Ouvre un fichier
Demande un fichier a l ' utilisateur et ouvre ce fichier
*/
void QETElementEditor : : slot_openFile ( ) {
2009-11-22 16:12:22 +00:00
// repertoire a afficher initialement dans le dialogue
QString open_dir = filename_ . isEmpty ( ) ? QETApp : : customElementsDir ( ) : QDir ( filename_ ) . absolutePath ( ) ;
2007-06-30 17:41:07 +00:00
// demande un nom de fichier a ouvrir a l'utilisateur
2009-11-22 16:12:22 +00:00
QString user_filename = QETElementEditor : : getOpenElementFileName ( this , open_dir ) ;
// ouvre l'element
2008-07-30 11:51:27 +00:00
openElement ( user_filename ) ;
}
/**
Slot utilise pour ouvrir un fichier recent .
Transfere filepath au slot openElement seulement si cet editeur est actif
@ param filepath Fichier a ouvrir
@ see openElement
*/
void QETElementEditor : : openRecentFile ( const QString & filepath ) {
2013-01-03 21:53:26 +00:00
// small hack to prevent all element editors from trying to topen the required
// recent file at the same time
2008-07-30 11:51:27 +00:00
if ( qApp - > activeWindow ( ) ! = this ) return ;
openElement ( filepath ) ;
}
2016-02-28 14:50:14 +00:00
/**
* @ brief QETElementEditor : : slot_openDxf
*/
void QETElementEditor : : slot_openDxf ( ) {
2016-08-30 23:47:25 +00:00
2019-05-19 19:47:32 +00:00
# if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
2017-12-31 09:25:32 +00:00
QString program = ( QDir : : homePath ( ) + " /Application Data/qet/DXFtoQET.exe " ) ;
2016-10-19 19:41:14 +00:00
# elif defined(Q_OS_MAC)
2017-12-31 09:25:32 +00:00
QString program = ( QDir : : homePath ( ) + " /.qet/DXFtoQET.app " ) ;
2016-10-19 19:41:14 +00:00
# else
2017-12-31 09:25:32 +00:00
QString program = ( QDir : : homePath ( ) + " /.qet/DXFtoQET " ) ;
2016-02-28 16:16:51 +00:00
# endif
2017-12-31 09:25:32 +00:00
QStringList arguments ;
2018-07-30 15:24:29 +00:00
QProcess * DXF = new QProcess ( qApp ) ;
2017-12-31 09:25:32 +00:00
DXF - > start ( program , arguments ) ;
2016-02-28 14:50:14 +00:00
}
2008-07-30 11:51:27 +00:00
/**
Ouvre un fichier element dans un nouvel editeur
Cette methode ne controle pas si le fichier est deja ouvert
@ param filepath Fichier a ouvrir
@ see fromFile
2010-03-28 16:27:48 +00:00
@ see QETApp : : openElementFiles
2008-07-30 11:51:27 +00:00
*/
void QETElementEditor : : openElement ( const QString & filepath ) {
if ( filepath . isEmpty ( ) ) return ;
2013-01-03 21:53:26 +00:00
// we have to test the file existence here because QETApp::openElementFiles()
// will discard non-existent files through QFileInfo::canonicalFilePath()
if ( ! QFile : : exists ( filepath ) ) {
2015-03-02 20:14:56 +00:00
QET : : QetMessageBox : : critical (
2013-01-03 21:53:26 +00:00
this ,
tr ( " Impossible d'ouvrir le fichier " , " message box title " ) ,
QString (
tr ( " Il semblerait que le fichier %1 que vous essayez d'ouvrir "
" n'existe pas ou plus. " )
) . arg ( filepath )
) ;
}
2010-03-28 16:27:48 +00:00
QETApp : : instance ( ) - > openElementFiles ( QStringList ( ) < < filepath ) ;
2007-06-30 17:41:07 +00:00
}
2007-12-09 12:00:11 +00:00
/**
2016-03-31 17:28:44 +00:00
* @ brief QETElementEditor : : slot_reload
* Reload the element from the file or location
*/
void QETElementEditor : : slot_reload ( )
{
//If user already edit the element, ask confirmation to reload
2017-07-31 17:41:48 +00:00
if ( ! m_elmt_scene - > undoStack ( ) . isClean ( ) )
2016-03-31 17:28:44 +00:00
{
QMessageBox : : StandardButton answer = QET : : QetMessageBox : : question ( this ,
tr ( " Recharger l'élément " , " dialog title " ) ,
tr ( " Vous avez efffectué des modifications sur cet élément. Si vous le rechargez, ces modifications seront perdues. Voulez-vous vraiment recharger l'élément ? " , " dialog content " ) ,
QMessageBox : : Yes | QMessageBox : : No | QMessageBox : : Cancel ,
QMessageBox : : Cancel ) ;
2007-12-09 12:00:11 +00:00
if ( answer ! = QMessageBox : : Yes ) return ;
}
2016-03-31 17:28:44 +00:00
//Reload the element
2017-07-31 17:41:48 +00:00
m_elmt_scene - > reset ( ) ;
2016-03-31 17:28:44 +00:00
if ( opened_from_file )
2009-04-03 19:30:25 +00:00
fromFile ( filename_ ) ;
2016-03-31 17:28:44 +00:00
else
fromLocation ( location_ ) ;
2007-12-09 12:00:11 +00:00
}
2007-12-16 13:21:28 +00:00
/**
2016-03-31 17:28:44 +00:00
* @ brief QETElementEditor : : slot_save
* Save the current editing element .
2019-11-18 12:53:05 +01:00
* If the filepath or location is unknown , use save_as instead
2016-03-31 17:28:44 +00:00
* @ return true if save with success
*/
bool QETElementEditor : : slot_save ( )
{
// Check element befor writing
if ( checkElement ( ) )
{
//If we don't know the name of the current file, use save as instead
if ( opened_from_file )
{
if ( filename_ . isEmpty ( ) )
return ( slot_saveAsFile ( ) ) ;
//Else wa save to the file at filename_ path
2014-06-03 20:21:19 +00:00
bool result_save = toFile ( filename_ ) ;
2017-07-31 17:41:48 +00:00
if ( result_save ) m_elmt_scene - > undoStack ( ) . setClean ( ) ;
2014-06-03 20:21:19 +00:00
return ( result_save ) ;
2016-03-31 17:28:44 +00:00
}
else
{
if ( location_ . isNull ( ) )
return ( slot_saveAs ( ) ) ;
//Else save to the known location
2014-06-03 20:21:19 +00:00
bool result_save = toLocation ( location_ ) ;
2016-06-17 08:41:09 +00:00
if ( result_save ) {
2017-07-31 17:41:48 +00:00
m_elmt_scene - > undoStack ( ) . setClean ( ) ;
2016-06-17 08:41:09 +00:00
emit saveToLocation ( location_ ) ;
}
2014-06-03 20:21:19 +00:00
return ( result_save ) ;
}
2009-04-03 19:30:25 +00:00
}
2016-03-31 17:28:44 +00:00
2015-03-02 20:14:56 +00:00
QMessageBox : : critical ( this , tr ( " Echec de l'enregistrement " ) , tr ( " L'enregistrement à échoué, \n les conditions requises ne sont pas valides " ) ) ;
2014-06-03 20:21:19 +00:00
return false ;
2009-04-03 19:30:25 +00:00
}
/**
2016-03-31 17:28:44 +00:00
* @ brief QETElementEditor : : slot_saveAs
* Ask a location to user and save the current edited element
* to this location
* @ return true if save with success
*/
2017-07-31 17:41:48 +00:00
bool QETElementEditor : : slot_saveAs ( )
{
2016-06-17 08:41:09 +00:00
// Check element befor writing
2017-07-31 17:41:48 +00:00
if ( checkElement ( ) )
{
2016-06-17 08:41:09 +00:00
//Ask a location to user
2014-06-03 20:21:19 +00:00
ElementsLocation location = ElementDialog : : getSaveElementLocation ( this ) ;
2017-07-31 17:41:48 +00:00
if ( location . isNull ( ) )
return ( false ) ;
2016-06-17 08:41:09 +00:00
2014-06-03 20:21:19 +00:00
bool result_save = toLocation ( location ) ;
2017-07-31 17:41:48 +00:00
if ( result_save )
{
2014-06-03 20:21:19 +00:00
setLocation ( location ) ;
2017-07-31 17:41:48 +00:00
m_elmt_scene - > undoStack ( ) . setClean ( ) ;
2016-06-17 08:41:09 +00:00
emit saveToLocation ( location ) ;
2014-06-03 20:21:19 +00:00
}
2016-06-17 08:41:09 +00:00
2014-06-03 20:21:19 +00:00
return ( result_save ) ;
}
2015-03-02 20:14:56 +00:00
QMessageBox : : critical ( this , tr ( " Echec de l'enregistrement " ) , tr ( " L'enregistrement à échoué, \n les conditions requises ne sont pas valides " ) ) ;
2014-06-03 20:21:19 +00:00
return ( false ) ;
2007-06-30 17:41:07 +00:00
}
2007-12-16 13:21:28 +00:00
/**
2016-03-31 17:28:44 +00:00
* @ brief QETElementEditor : : slot_saveAsFile
* Ask a file to user and save the current edited element to this file
* @ return true if save with success
*/
2017-07-31 17:41:48 +00:00
bool QETElementEditor : : slot_saveAsFile ( )
{
2016-06-17 08:41:09 +00:00
// Check element befor writing
2017-07-31 17:41:48 +00:00
if ( checkElement ( ) )
{
2016-06-17 08:41:09 +00:00
//Ask a filename to user, for save the element
2014-06-03 20:21:19 +00:00
QString fn = QFileDialog : : getSaveFileName (
this ,
tr ( " Enregistrer sous " , " dialog title " ) ,
filename_ . isEmpty ( ) ? QETApp : : customElementsDir ( ) : QDir ( filename_ ) . absolutePath ( ) ,
tr (
2015-03-02 20:14:56 +00:00
" Éléments QElectroTech (*.elmt) " ,
2014-06-03 20:21:19 +00:00
" filetypes allowed when saving an element file "
)
) ;
2016-06-17 08:41:09 +00:00
if ( fn . isEmpty ( ) )
return ( false ) ;
2020-02-26 14:50:56 +01:00
//If the name doesn't end by .elmt, we add it
if ( ! fn . endsWith ( " .elmt " , Qt : : CaseInsensitive ) )
fn + = " .elmt " ;
2016-06-17 08:41:09 +00:00
2014-06-03 20:21:19 +00:00
bool result_save = toFile ( fn ) ;
2016-06-17 08:41:09 +00:00
//If the save success, the filename is keep
2017-07-31 17:41:48 +00:00
if ( result_save )
{
2014-06-03 20:21:19 +00:00
setFileName ( fn ) ;
QETApp : : elementsRecentFiles ( ) - > fileWasOpened ( fn ) ;
2017-07-31 17:41:48 +00:00
m_elmt_scene - > undoStack ( ) . setClean ( ) ;
2014-06-03 20:21:19 +00:00
}
2016-06-17 08:41:09 +00:00
2014-06-03 20:21:19 +00:00
return ( result_save ) ;
2007-08-25 15:46:09 +00:00
}
2015-03-02 20:14:56 +00:00
QMessageBox : : critical ( this , tr ( " Echec de l'enregistrement " ) , tr ( " L'enregistrement à échoué, \n les conditions requises ne sont pas valides " ) ) ;
2014-06-03 20:21:19 +00:00
return false ;
2007-06-30 17:41:07 +00:00
}
2007-12-16 13:21:28 +00:00
/**
@ return true si l ' element peut etre ferme .
Un element peut etre ferme s ' il ne comporte aucune modification .
Si l ' element comporte des modifications , la question est posee a
l ' utilisateur .
*/
2007-09-21 18:07:05 +00:00
bool QETElementEditor : : canClose ( ) {
2017-07-31 17:41:48 +00:00
if ( m_elmt_scene - > undoStack ( ) . isClean ( ) ) return ( true ) ;
2007-06-30 17:41:07 +00:00
// demande d'abord a l'utilisateur s'il veut enregistrer l'element en cours
2015-03-02 20:14:56 +00:00
QMessageBox : : StandardButton answer = QET : : QetMessageBox : : question (
2007-06-30 17:41:07 +00:00
this ,
2015-03-02 20:14:56 +00:00
tr ( " Enregistrer l'élément en cours ? " , " dialog title " ) ,
2009-04-03 19:30:25 +00:00
QString (
tr (
2015-03-02 20:14:56 +00:00
" Voulez-vous enregistrer l'élément %1 ? " ,
2009-04-03 19:30:25 +00:00
" dialog content - %1 is an element name "
)
2017-07-31 17:41:48 +00:00
) . arg ( m_elmt_scene - > names ( ) . name ( ) ) ,
2009-04-03 19:30:25 +00:00
QMessageBox : : Yes | QMessageBox : : No | QMessageBox : : Cancel ,
2007-06-30 17:41:07 +00:00
QMessageBox : : Cancel
) ;
bool result ;
switch ( answer ) {
case QMessageBox : : Cancel : result = false ; break ; // l'utilisateur annule : echec de la fermeture
case QMessageBox : : Yes : result = slot_save ( ) ; break ; // l'utilisateur dit oui : la reussite depend de l'enregistrement
default : result = true ; // l'utilisateur dit non ou ferme le dialogue: c'est reussi
}
return ( result ) ;
}
2009-04-04 18:29:53 +00:00
/**
Enleve et cache le widget affiche par le dock permettant d ' editer les
parties .
@ return le widget enleve , ou 0 s ' il n ' y avait pas de widget a enlever
*/
QWidget * QETElementEditor : : clearToolsDock ( ) {
2018-07-17 12:19:56 +00:00
if ( QWidget * previous_widget = m_tools_dock_stack - > widget ( 1 ) )
{
m_tools_dock_stack - > removeWidget ( previous_widget ) ;
2017-08-05 02:06:59 +00:00
previous_widget - > setParent ( nullptr ) ;
2009-04-04 18:29:53 +00:00
previous_widget - > hide ( ) ;
return ( previous_widget ) ;
}
2017-08-05 02:06:59 +00:00
return ( nullptr ) ;
2009-04-04 18:29:53 +00:00
}
2009-11-22 16:12:22 +00:00
/**
Exporte le document XML xml_document vers le presse - papier puis declenche
son collage dans l ' editeur courant , avec selection de la zone de collage
@ param xml_document Document XML a copier / coller
@ see ElementView : : pasteInArea
*/
void QETElementEditor : : copyAndPasteXml ( const QDomDocument & xml_document ) {
// accede au presse-papier
QClipboard * clipboard = QApplication : : clipboard ( ) ;
// genere la description XML de la selection
QString clipboard_content = xml_document . toString ( 4 ) ;
// met la description XML dans le presse-papier
if ( clipboard - > supportsSelection ( ) ) {
clipboard - > setText ( clipboard_content , QClipboard : : Selection ) ;
}
clipboard - > setText ( clipboard_content ) ;
2017-09-25 17:44:02 +00:00
m_view - > pasteInArea ( ) ;
2009-11-22 16:12:22 +00:00
}
2007-06-30 17:41:07 +00:00
/**
Permet de quitter l ' editeur lors de la fermeture de la fenetre principale
@ param qce Le QCloseEvent correspondant a l ' evenement de fermeture
*/
2007-08-25 03:43:05 +00:00
void QETElementEditor : : closeEvent ( QCloseEvent * qce ) {
2007-09-21 18:07:05 +00:00
if ( canClose ( ) ) {
2007-11-12 15:21:14 +00:00
writeSettings ( ) ;
2007-09-21 18:07:05 +00:00
setAttribute ( Qt : : WA_DeleteOnClose ) ;
2017-07-31 17:41:48 +00:00
m_elmt_scene - > reset ( ) ;
2007-09-21 18:07:05 +00:00
qce - > accept ( ) ;
} else qce - > ignore ( ) ;
2007-06-30 17:41:07 +00:00
}
2007-11-07 20:23:24 +00:00
2012-03-16 18:01:32 +00:00
/**
2012-03-17 22:36:58 +00:00
Executed the first time the window editor is displayed .
2012-03-16 18:01:32 +00:00
*/
void QETElementEditor : : firstActivation ( QEvent * event ) {
Q_UNUSED ( event )
2017-09-25 17:44:02 +00:00
QTimer : : singleShot ( 250 , m_view , SLOT ( zoomFit ( ) ) ) ;
2012-03-16 18:01:32 +00:00
}
2007-11-07 20:23:24 +00:00
/**
Remplit la liste des parties
*/
void QETElementEditor : : slot_createPartsList ( ) {
2017-09-25 17:44:02 +00:00
m_parts_list - > blockSignals ( true ) ;
m_parts_list - > clear ( ) ;
2017-07-31 17:41:48 +00:00
QList < QGraphicsItem * > qgis = m_elmt_scene - > zItems ( ) ;
2010-02-28 16:13:45 +00:00
// on ne construit plus la liste a partir de 200 primitives
// c'est ingerable : la maj de la liste prend trop de temps et le resultat
// est inexploitable
if ( qgis . count ( ) < = QET_MAX_PARTS_IN_ELEMENT_EDITOR_LIST ) {
for ( int j = qgis . count ( ) - 1 ; j > = 0 ; - - j ) {
QGraphicsItem * qgi = qgis [ j ] ;
2018-07-30 15:24:29 +00:00
if ( CustomElementPart * cep = dynamic_cast < CustomElementPart * > ( qgi ) ) {
2010-02-28 16:13:45 +00:00
QString part_desc = cep - > name ( ) ;
2018-07-30 15:24:29 +00:00
QListWidgetItem * qlwi = new QListWidgetItem ( part_desc ) ;
2010-02-28 16:13:45 +00:00
QVariant v ;
v . setValue < QGraphicsItem * > ( qgi ) ;
qlwi - > setData ( 42 , v ) ;
2017-09-25 17:44:02 +00:00
m_parts_list - > addItem ( qlwi ) ;
2010-02-28 16:13:45 +00:00
qlwi - > setSelected ( qgi - > isSelected ( ) ) ;
}
2007-11-07 20:23:24 +00:00
}
2010-02-28 16:13:45 +00:00
} else {
2017-09-25 17:44:02 +00:00
m_parts_list - > addItem ( new QListWidgetItem ( tr ( " Trop de primitives, liste non générée. " ) ) ) ;
2007-11-07 20:23:24 +00:00
}
2017-09-25 17:44:02 +00:00
m_parts_list - > blockSignals ( false ) ;
2007-11-07 20:23:24 +00:00
}
/**
Met a jour la selection dans la liste des parties
*/
void QETElementEditor : : slot_updatePartsList ( ) {
2017-07-31 17:41:48 +00:00
int items_count = m_elmt_scene - > items ( ) . count ( ) ;
2017-09-25 17:44:02 +00:00
if ( m_parts_list - > count ( ) ! = items_count ) {
2007-12-15 18:59:57 +00:00
slot_createPartsList ( ) ;
2010-02-28 16:13:45 +00:00
} else if ( items_count < = QET_MAX_PARTS_IN_ELEMENT_EDITOR_LIST ) {
2017-09-25 17:44:02 +00:00
m_parts_list - > blockSignals ( true ) ;
2007-12-15 18:59:57 +00:00
int i = 0 ;
2017-07-31 17:41:48 +00:00
QList < QGraphicsItem * > items = m_elmt_scene - > zItems ( ) ;
2007-12-15 18:59:57 +00:00
for ( int j = items . count ( ) - 1 ; j > = 0 ; - - j ) {
QGraphicsItem * qgi = items [ j ] ;
2017-09-25 17:44:02 +00:00
QListWidgetItem * qlwi = m_parts_list - > item ( i ) ;
2007-12-15 18:59:57 +00:00
if ( qlwi ) qlwi - > setSelected ( qgi - > isSelected ( ) ) ;
+ + i ;
}
2017-09-25 17:44:02 +00:00
m_parts_list - > blockSignals ( false ) ;
2007-11-07 20:23:24 +00:00
}
}
/**
Met a jour la selection des parties de l ' element a partir de la liste des
parties
*/
void QETElementEditor : : slot_updateSelectionFromPartsList ( ) {
2017-07-31 17:41:48 +00:00
m_elmt_scene - > blockSignals ( true ) ;
2017-09-25 17:44:02 +00:00
m_parts_list - > blockSignals ( true ) ;
for ( int i = 0 ; i < m_parts_list - > count ( ) ; + + i ) {
QListWidgetItem * qlwi = m_parts_list - > item ( i ) ;
2018-07-30 15:24:29 +00:00
QGraphicsItem * qgi = qlwi - > data ( 42 ) . value < QGraphicsItem * > ( ) ;
2007-11-07 20:23:24 +00:00
if ( qgi ) {
qgi - > setSelected ( qlwi - > isSelected ( ) ) ;
}
}
2017-09-25 17:44:02 +00:00
m_parts_list - > blockSignals ( false ) ;
2017-07-31 17:41:48 +00:00
m_elmt_scene - > blockSignals ( false ) ;
2007-12-22 22:29:42 +00:00
slot_updateInformations ( ) ;
2009-04-03 19:30:25 +00:00
slot_updateMenus ( ) ;
2007-11-07 20:23:24 +00:00
}
2007-11-12 15:21:14 +00:00
2015-09-16 15:11:13 +00:00
/**
* @ brief QETElementEditor : : readSettings
* Read settings
*/
void QETElementEditor : : readSettings ( )
{
QSettings settings ;
2007-11-12 15:21:14 +00:00
// dimensions et position de la fenetre
QVariant geometry = settings . value ( " elementeditor/geometry " ) ;
if ( geometry . isValid ( ) ) restoreGeometry ( geometry . toByteArray ( ) ) ;
// etat de la fenetre (barres d'outils, docks...)
QVariant state = settings . value ( " elementeditor/state " ) ;
if ( state . isValid ( ) ) restoreState ( state . toByteArray ( ) ) ;
2010-02-14 16:28:45 +00:00
// informations complementaires de l'element : valeur par defaut
2017-07-31 17:41:48 +00:00
m_elmt_scene - > setInformations ( settings . value ( " elementeditor/default-informations " , " " ) . toString ( ) ) ;
2007-11-12 15:21:14 +00:00
}
2015-09-16 15:11:13 +00:00
/**
* @ brief QETElementEditor : : writeSettings
* Write the settings
*/
void QETElementEditor : : writeSettings ( )
{
QSettings settings ;
2007-11-12 15:21:14 +00:00
settings . setValue ( " elementeditor/geometry " , saveGeometry ( ) ) ;
settings . setValue ( " elementeditor/state " , saveState ( ) ) ;
}
2009-04-03 19:30:25 +00:00
/**
@ return les decalages horizontaux et verticaux ( sous la forme d ' un point ) a
utiliser lors d ' un copier / coller avec decalage .
*/
QPointF QETElementEditor : : pasteOffset ( ) {
QPointF paste_offset ( 5.0 , 0.0 ) ;
return ( paste_offset ) ;
}
2009-11-22 16:12:22 +00:00
/**
Demande a l ' utilisateur d ' ouvrir un fichier sense etre un element .
@ param parent QWidget parent du dialogue d ' ouverture de fichier
@ param initial_dir Repertoire a afficher initialement - si une chaine vide
est fournie , QETApp : : customElementsDir ( ) sera utilise .
@ return Le chemin du fichier choisi ou une chaine vide si l ' utilisateur a
clique sur le bouton " Annuler " .
@ see QETApp : : customElementsDir ( )
*/
QString QETElementEditor : : getOpenElementFileName ( QWidget * parent , const QString & initial_dir ) {
// demande un nom de fichier a ouvrir a l'utilisateur
QString user_filename = QFileDialog : : getOpenFileName (
parent ,
tr ( " Ouvrir un fichier " , " dialog title " ) ,
initial_dir . isEmpty ( ) ? QETApp : : customElementsDir ( ) : initial_dir ,
tr (
2015-03-02 20:14:56 +00:00
" Éléments QElectroTech (*.elmt);; "
2009-11-22 16:12:22 +00:00
" Fichiers XML (*.xml);; "
" Tous les fichiers (*) " ,
" filetypes allowed when opening an element file "
)
) ;
return ( user_filename ) ;
}
2009-04-03 19:30:25 +00:00
/**
2016-03-31 17:28:44 +00:00
* @ brief QETElementEditor : : fromLocation
* Location of the element to edit
* @ param location
*/
void QETElementEditor : : fromLocation ( const ElementsLocation & location )
{
if ( ! location . isElement ( ) )
{
QET : : QetMessageBox : : critical ( this ,
tr ( " Élément inexistant. " , " message box title " ) ,
tr ( " Le chemin virtuel choisi ne correspond pas à un élément. " , " message box content " ) ) ;
2009-04-03 19:30:25 +00:00
return ;
}
2016-03-31 17:28:44 +00:00
if ( ! location . exist ( ) )
{
QET : : QetMessageBox : : critical ( this ,
tr ( " Élément inexistant. " , " message box title " ) ,
tr ( " L'élément n'existe pas. " , " message box content " ) ) ;
2009-04-03 19:30:25 +00:00
return ;
}
2016-03-31 17:28:44 +00:00
//The file must be an xml document
2009-04-03 19:30:25 +00:00
QDomDocument document_xml ;
2016-03-31 17:28:44 +00:00
QDomNode node = document_xml . importNode ( location . xml ( ) , true ) ;
2009-04-03 19:30:25 +00:00
document_xml . appendChild ( node ) ;
2016-03-31 17:28:44 +00:00
//Load the element
2017-07-31 17:41:48 +00:00
m_elmt_scene - > fromXml ( document_xml ) ;
2009-04-03 19:30:25 +00:00
slot_createPartsList ( ) ;
2016-03-31 17:28:44 +00:00
//location is read only
if ( ! location . isWritable ( ) )
{
QET : : QetMessageBox : : warning ( this ,
tr ( " Édition en lecture seule " , " message box title " ) ,
tr ( " Vous n'avez pas les privilèges nécessaires pour modifier cet élement. Il sera donc ouvert en lecture seule. " , " message box content " ) ) ;
2009-04-03 19:30:25 +00:00
setReadOnly ( true ) ;
2016-03-31 17:28:44 +00:00
}
else {
2010-01-03 19:51:02 +00:00
setReadOnly ( false ) ;
2009-04-03 19:30:25 +00:00
}
2016-03-31 17:28:44 +00:00
2009-04-03 19:30:25 +00:00
setLocation ( location ) ;
slot_updateMenus ( ) ;
}
2009-11-22 16:12:22 +00:00
/**
Demande un fichier a l ' utilisateur , l ' ouvre en tant que fichier element ,
met son contenu dans le presse - papiers , et appelle ElementView : : PasteInArea
*/
void QETElementEditor : : pasteFromFile ( ) {
// demande le chemin du fichier a ouvrir a l'utilisateur
QString element_file_path = getOpenElementFileName ( this ) ;
if ( element_file_path . isEmpty ( ) ) return ;
QString error_message ;
QDomDocument xml_document ;
QFile element_file ( element_file_path ) ;
// le fichier doit etre lisible
if ( ! element_file . open ( QIODevice : : ReadOnly ) ) {
error_message = QString ( tr ( " Impossible d'ouvrir le fichier %1. " , " message box content " ) ) . arg ( element_file_path ) ;
} else {
// le fichier doit etre un document XML
if ( ! xml_document . setContent ( & element_file ) ) {
error_message = tr ( " Ce fichier n'est pas un document XML valide " , " message box content " ) ;
}
element_file . close ( ) ;
}
if ( ! error_message . isEmpty ( ) ) {
2015-03-02 20:14:56 +00:00
QET : : QetMessageBox : : critical ( this , tr ( " Erreur " , " toolbar title " ) , error_message ) ;
2009-11-22 16:12:22 +00:00
}
copyAndPasteXml ( xml_document ) ;
}
/**
2016-03-31 17:28:44 +00:00
* @ brief QETElementEditor : : pasteFromElement
* Ask an element to user , copy the xml definition of the element
* to the clipboard and call ElementView : : PasteInArea
*/
void QETElementEditor : : pasteFromElement ( )
{
//Ask for a location
2009-11-22 16:12:22 +00:00
ElementsLocation location = ElementDialog : : getOpenElementLocation ( this ) ;
2016-03-31 17:28:44 +00:00
if ( location . isNull ( ) )
return ;
if ( ! location . isElement ( ) )
{
QET : : QetMessageBox : : critical ( this ,
tr ( " Élément inexistant. " , " message box title " ) ,
tr ( " Le chemin virtuel choisi ne correspond pas à un élément. " , " message box content " ) ) ;
2009-11-22 16:12:22 +00:00
return ;
}
2016-03-31 17:28:44 +00:00
if ( ! location . exist ( ) )
{
QET : : QetMessageBox : : critical ( this ,
tr ( " Élément inexistant. " , " message box title " ) ,
tr ( " L'élément n'existe pas. " , " message box content " ) ) ;
2009-11-22 16:12:22 +00:00
return ;
}
2016-03-31 17:28:44 +00:00
//Create an xml document from the location xml
2009-11-22 16:12:22 +00:00
QDomDocument document_xml ;
2016-03-31 17:28:44 +00:00
QDomNode node = document_xml . importNode ( location . xml ( ) , true ) ;
2009-11-22 16:12:22 +00:00
document_xml . appendChild ( node ) ;
2016-03-31 17:28:44 +00:00
2009-11-22 16:12:22 +00:00
copyAndPasteXml ( document_xml ) ;
}
2010-02-18 00:42:41 +00:00
/**
Met a jour l ' editeur de primitive actuellement visible .
Si aucun editeur de primitive n ' est visible , ce slot ne fait rien .
*/
void QETElementEditor : : updateCurrentPartEditor ( ) {
// si aucun widget d'edition n'est affiche, on ne fait rien
2017-09-25 17:44:02 +00:00
if ( ! m_tools_dock_stack - > currentIndex ( ) ) return ;
2010-02-18 00:42:41 +00:00
// s'il y a un widget d'edition affiche, on le met a jour
2018-07-30 15:24:29 +00:00
if ( ElementItemEditor * current_editor = dynamic_cast < ElementItemEditor * > ( m_tools_dock_stack - > widget ( 1 ) ) ) {
2010-02-18 00:42:41 +00:00
current_editor - > updateForm ( ) ;
}
}