53 #include <QMessageBox> 54 #include <QTextStream> 55 #include <QFileDialog> 57 #include <QModelIndex> 65 #define QET_MAX_PARTS_IN_ELEMENT_EDITOR_LIST 200 74 min_title(
tr(
"QElectroTech - Éditeur d'élément",
"window title")),
75 opened_from_file(false)
85 setMinimumSize(QSize(500, 350));
86 setWindowState(Qt::WindowMaximized);
129 bool must_be_read_only = !QFileInfo(
filename_).isWritable();
164 #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) 165 open_dxf -> setStatusTip(
tr(
"To install the plugin DXFtoQET\nVisit https://download.tuxfamily.org/qet/builds/dxf_to_elmt/\n" 167 ">> Install on Windows\n" 168 "Put DXFtoQET.exe binary on C:\\Users\\user_name\\AppData\\Roaming\\qet\\ directory \n" 170 #elif defined(Q_OS_MAC) 171 open_dxf -> setStatusTip(
tr(
"To install the plugin DXFtoQET\nVisit https://download.tuxfamily.org/qet/builds/dxf_to_elmt/\n" 173 ">> Install on macOSX\n" 174 "Put DXFtoQET.app binary on /Users/user_name/.qet/ directory \n" 177 open_dxf -> setStatusTip(
tr(
"To install the plugin DXFtoQET\nVisit https://download.tuxfamily.org/qet/builds/dxf_to_elmt/\n" 179 ">> Install on Linux\n" 180 "Put DXFtoQET binary on your /home/user_name/.qet/ directory\n" 181 "make it executable : chmod +x ./DXFtoQET\n" 185 open_dxf -> setWhatsThis (
tr(
"To install the plugin DXFtoQET\nVisit https://download.tuxfamily.org/qet/builds/dxf_to_elmt/\n" 187 ">> Install on Linux\n" 188 "Put DXFtoQET binary on your /home/user_name/.qet/ directory\n" 189 "make it executable : chmod +x ./DXFtoQET\n" 190 ">> Install on Windows\n" 191 "Put DXFtoQET.exe binary on C:\\Users\\user_name\\AppData\\Roaming\\qet\\ directory \n" 193 ">> Install on macOSX\n" 194 "Put DXFtoQET.app binary on /Users/user_name/.qet/ directory \n" 201 undo -> setShortcuts(QKeySequence::Undo);
202 redo -> setShortcuts(QKeySequence::Redo);
205 open -> setShortcut(QKeySequence::Open);
207 save -> setShortcut(QKeySequence::Save);
209 quit -> setShortcut(QKeySequence(
tr(
"Ctrl+Q")));
210 selectall -> setShortcut(QKeySequence::SelectAll);
211 deselectall -> setShortcut(QKeySequence(
tr(
"Ctrl+Shift+A")));
213 cut -> setShortcut(QKeySequence::Cut);
214 copy -> setShortcut(QKeySequence::Copy);
215 paste -> setShortcut(QKeySequence::Paste);
218 edit_delete -> setShortcut(QKeySequence(Qt::Key_Delete));
234 connect(
quit, SIGNAL(triggered()),
this, SLOT(close()));
275 zoom_fit -> setShortcut(QKeySequence(
tr(
"Ctrl+9")));
276 zoom_reset -> setShortcut(QKeySequence(
tr(
"Ctrl+0")));
278 connect(zoom_in, SIGNAL(triggered()),
m_view, SLOT(zoomIn() ));
279 connect(zoom_out, SIGNAL(triggered()),
m_view, SLOT(zoomOut() ));
280 connect(zoom_fit, SIGNAL(triggered()),
m_view, SLOT(zoomFit() ));
281 connect(zoom_reset, SIGNAL(triggered()),
m_view, SLOT(zoomReset() ));
288 parts =
new QActionGroup(
this);
299 foreach (QAction *action,
parts -> actions()) action -> setCheckable(
true);
301 connect(add_line, SIGNAL(triggered()),
this, SLOT(
addLine() ));
302 connect(add_rectangle, SIGNAL(triggered()),
this, SLOT(
addRect() ));
303 connect(add_ellipse, SIGNAL(triggered()),
this, SLOT(
addEllipse() ));
304 connect(add_polygon, SIGNAL(triggered()),
this, SLOT(
addPolygon() ));
305 connect(add_text, SIGNAL(triggered()),
this, SLOT(
addText() ));
306 connect(add_arc, SIGNAL(triggered()),
this, SLOT(
addArc() ));
307 connect(add_terminal, SIGNAL(triggered()),
this, SLOT(
addTerminal() ));
310 add_polygon ->setStatusTip(
tr(
"Double-click pour terminer la forme, Click droit pour annuler le dernier point"));
311 add_text ->setStatusTip(
tr(
"Ajouter un texte d'élément non éditable dans les schémas"));
312 add_dynamic_text_field ->setStatusTip(
tr(
"Ajouter un texte d'élément pouvant être édité dans les schémas"));
323 view_toolbar =
new QToolBar(
tr(
"Affichage",
"toolbar title"),
this);
351 connect(QApplication::clipboard(), SIGNAL(dataChanged()),
this, SLOT(
slot_updateMenus()));
435 menu.addActions(std::move(actions));
437 menu.addAction(
undo);
438 menu.addAction(
redo);
445 menu.addAction(
copy);
447 menu.addAction(
paste);
454 const QList<QAction *>menu_actions = menu.actions();
455 for(QAction *action : menu_actions)
457 if(!action->isEnabled())
458 menu.removeAction(action);
472 foreach (QAction *action,
parts -> actions()) {
483 cut -> setEnabled(selected_items);
484 copy -> setEnabled(selected_items);
487 action->setEnabled(selected_items);
490 paste -> setEnabled(clipboard_elmt);
506 if (!
m_elmt_scene -> undoStack().isClean()) title +=
tr(
"[Modifié]",
"window title tag");
508 if (
isReadOnly()) title +=
tr(
" [lecture seule]",
"window title tag");
509 setWindowTitle(title);
548 m_tools_dock =
new QDockWidget(
tr(
"Informations",
"dock title"),
this);
550 m_tools_dock -> setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
551 m_tools_dock -> setFeatures(QDockWidget::AllDockWidgetFeatures);
557 m_undo_dock =
new QDockWidget(
tr(
"Annulations",
"dock title"),
this);
559 m_undo_dock -> setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
560 m_undo_dock -> setFeatures(QDockWidget::AllDockWidgetFeatures);
562 addDockWidget(Qt::RightDockWidgetArea,
m_undo_dock);
563 QUndoView* undo_view =
new QUndoView(&(
m_elmt_scene -> undoStack()),
this);
564 undo_view -> setEmptyLabel(
tr(
"Aucune modification"));
569 m_parts_list -> setSelectionMode(QAbstractItemView::ExtendedSelection);
575 m_parts_dock =
new QDockWidget(
tr(
"Parties",
"dock title"),
this);
577 m_parts_dock -> setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
578 m_parts_dock -> setFeatures(QDockWidget::AllDockWidgetFeatures);
587 statusBar() -> showMessage(
tr(
"Éditeur d'éléments",
"status bar message"));
595 m_view -> setDragMode(QGraphicsView::RubberBandDrag);
602 m_view -> setDragMode(QGraphicsView::NoDrag);
612 QList<QGraphicsItem *> selected_qgis =
m_elmt_scene -> selectedItems();
613 QList<CustomElementPart *> cep_list;
614 bool style_editable =
false;
617 if (selected_qgis.size() >= 2)
619 style_editable =
true;
620 foreach (QGraphicsItem *qgi, selected_qgis)
625 style_editable =
false;
632 if(selected_qgis.size() == 1)
634 QGraphicsItem *qgi = selected_qgis.first();
641 if(editor->currentPart() == selection)
649 if (selected_qgis.size() == 1)
651 QGraphicsItem *qgi = selected_qgis.first();
657 if(editor->currentPart() == selection)
662 QString selection_xml_name = selection -> xmlName();
664 if (selection_editor)
666 if (selection_editor->
setPart(selection))
673 qDebug() <<
"Editor refused part.";
679 else if (style_editable)
683 if (selection_editor)
685 if (selection_editor -> setParts(cep_list))
692 qDebug() <<
"Editor refused part.";
702 selected_qgis.size()));
716 typedef QPair<QString, QString> QETWarning;
717 QList<QETWarning> warnings;
718 QList<QETWarning> errors;
724 warnings << qMakePair(
725 tr(
"Absence de borne",
"warning title"),
727 "<br>En l'absence de borne, l'élément ne pourra être" 728 " relié à d'autres éléments par l'intermédiaire de conducteurs.",
729 "warning description" 740 if (qgraphicsitem_cast<PartTerminal *>(qgi))
746 errors << qMakePair (
tr(
"Absence de borne"),
747 tr(
"<br><b>Erreur</b> :" 748 "<br>Les reports de folio doivent posséder une seul borne." 749 "<br><b>Solution</b> :" 750 "<br>Verifier que l'élément ne possède qu'une seul borne"));
754 if (!errors.count() && !warnings.count())
return(
true);
757 QString dialog_message =
tr(
"La vérification de cet élément a généré",
"message box content");
760 dialog_message += QString(
tr(
" %n erreur(s)",
"errors", errors.size()));
765 dialog_message += QString (
tr(
" et"));
767 dialog_message += QString (
tr(
" %n avertissement(s)",
"warnings", warnings.size()));
769 dialog_message +=
" :";
771 dialog_message +=
"<ol>";
772 QList<QETWarning> total = warnings << errors;
773 foreach(QETWarning
warning, total) {
774 dialog_message +=
"<li>";
775 dialog_message += QString(
776 tr(
"<b>%1</b> : %2",
"warning title: warning description")
778 dialog_message +=
"</li>";
780 dialog_message +=
"</ol>";
788 if (errors.count() == 0)
return(
true);
798 QString error_message;
801 QFileInfo infos_file(filepath);
802 if (!infos_file.exists() || !infos_file.isFile()) {
804 error_message = QString(
tr(
"Le fichier %1 n'existe pas.",
"message box content")).arg(filepath);
808 QFile file(filepath);
810 if (!file.open(QIODevice::ReadOnly)) {
812 error_message = QString(
tr(
"Impossible d'ouvrir le fichier %1.",
"message box content")).arg(filepath);
817 QDomDocument document_xml;
819 if (!document_xml.setContent(&file)) {
821 error_message =
tr(
"Ce fichier n'est pas un document XML valide",
"message box content");
836 if (!infos_file.isWritable()) {
839 tr(
"Édition en lecture seule",
"message box title"),
840 tr(
"Vous n'avez pas les privilèges nécessaires pour modifier cet élement. Il sera donc ouvert en lecture seule.",
"message box content")
870 tr(
"Erreur",
"message box title"),
871 tr(
"Impossible d'écrire dans ce fichier",
"message box content")
893 tr(
"Erreur",
"message box title"),
894 tr(
"Impossible d'enregistrer l'élément",
"message box content"));
925 QString current_filepath;
1029 foreach(QAction *action,
parts->actions()) action -> setChecked(
false);
1037 new_element_wizard.exec();
1074 if (qApp -> activeWindow() !=
this)
return;
1083 #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) 1084 QString program = (QDir::homePath() +
"/Application Data/qet/DXFtoQET.exe");
1085 #elif defined(Q_OS_MAC) 1086 QString program = (QDir::homePath() +
"/.qet/DXFtoQET.app");
1088 QString program = (QDir::homePath() +
"/.qet/DXFtoQET");
1090 QStringList arguments;
1091 QProcess *DXF =
new QProcess(qApp);
1092 DXF->start(program,arguments);
1104 if (filepath.isEmpty())
return;
1107 if (!QFile::exists(filepath)) {
1110 tr(
"Impossible d'ouvrir le fichier",
"message box title"),
1112 tr(
"Il semblerait que le fichier %1 que vous essayez d'ouvrir" 1113 " n'existe pas ou plus.")
1130 tr(
"Recharger l'élément",
"dialog title"),
1131 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"),
1134 if (answer != QMessageBox::Yes)
return;
1164 if (result_save)
m_elmt_scene -> undoStack().setClean();
1165 return(result_save);
1178 return(result_save);
1182 QMessageBox::critical(
this,
tr(
"Echec de l'enregistrement"),
tr(
"L'enregistrement à échoué,\nles conditions requises ne sont pas valides"));
1210 return(result_save);
1212 QMessageBox::critical(
this,
tr(
"Echec de l'enregistrement"),
tr(
"L'enregistrement à échoué,\nles conditions requises ne sont pas valides"));
1227 QString fn = QFileDialog::getSaveFileName(
1229 tr(
"Enregistrer sous",
"dialog title"),
1232 "Éléments QElectroTech (*.elmt)",
1233 "filetypes allowed when saving an element file" 1241 if (!fn.endsWith(
".elmt", Qt::CaseInsensitive))
1244 bool result_save =
toFile(fn);
1253 return(result_save);
1255 QMessageBox::critical(
this,
tr(
"Echec de l'enregistrement"),
tr(
"L'enregistrement à échoué,\nles conditions requises ne sont pas valides"));
1266 if (
m_elmt_scene -> undoStack().isClean())
return(
true);
1270 tr(
"Enregistrer l'élément en cours ?",
"dialog title"),
1273 "Voulez-vous enregistrer l'élément %1 ?",
1274 "dialog content - %1 is an element name" 1283 case QMessageBox::Yes: result =
slot_save();
break;
1284 default: result =
true;
1298 previous_widget -> setParent(
nullptr);
1299 previous_widget -> hide();
1300 return(previous_widget);
1313 QClipboard *clipboard = QApplication::clipboard();
1316 QString clipboard_content = xml_document.toString(4);
1319 if (clipboard -> supportsSelection()) {
1320 clipboard -> setText(clipboard_content, QClipboard::Selection);
1322 clipboard -> setText(clipboard_content);
1334 setAttribute(Qt::WA_DeleteOnClose);
1337 }
else qce -> ignore();
1345 QTimer::singleShot(250,
m_view, SLOT(zoomFit()));
1354 QList<QGraphicsItem *> qgis =
m_elmt_scene -> zItems();
1360 for (
int j = qgis.count() - 1 ; j >= 0 ; -- j) {
1361 QGraphicsItem *qgi = qgis[j];
1363 QString part_desc = cep -> name();
1364 QListWidgetItem *qlwi =
new QListWidgetItem(part_desc);
1366 v.setValue<QGraphicsItem *>(qgi);
1367 qlwi -> setData(42, v);
1369 qlwi -> setSelected(qgi -> isSelected());
1373 m_parts_list -> addItem(
new QListWidgetItem(
tr(
"Trop de primitives, liste non générée.")));
1388 QList<QGraphicsItem *> items =
m_elmt_scene -> zItems();
1389 for (
int j = items.count() - 1 ; j >= 0 ; -- j) {
1390 QGraphicsItem *qgi = items[j];
1392 if (qlwi) qlwi -> setSelected(qgi -> isSelected());
1408 QGraphicsItem *qgi = qlwi -> data(42).value<QGraphicsItem *>();
1410 qgi -> setSelected(qlwi -> isSelected());
1428 QVariant geometry = settings.value(
"elementeditor/geometry");
1429 if (geometry.isValid()) restoreGeometry(geometry.toByteArray());
1432 QVariant state = settings.value(
"elementeditor/state");
1433 if (state.isValid()) restoreState(state.toByteArray());
1436 m_elmt_scene -> setInformations(settings.value(
"elementeditor/default-informations",
"").toString());
1446 settings.setValue(
"elementeditor/geometry", saveGeometry());
1447 settings.setValue(
"elementeditor/state", saveState());
1455 QPointF paste_offset(5.0, 0.0);
1456 return(paste_offset);
1470 QString user_filename = QFileDialog::getOpenFileName(
1472 tr(
"Ouvrir un fichier",
"dialog title"),
1475 "Éléments QElectroTech (*.elmt);;" 1476 "Fichiers XML (*.xml);;" 1477 "Tous les fichiers (*)",
1478 "filetypes allowed when opening an element file" 1481 return(user_filename);
1494 tr(
"Élément inexistant.",
"message box title"),
1495 tr(
"Le chemin virtuel choisi ne correspond pas à un élément.",
"message box content"));
1501 tr(
"Élément inexistant.",
"message box title"),
1502 tr(
"L'élément n'existe pas.",
"message box content"));
1507 QDomDocument document_xml;
1508 QDomNode node = document_xml.importNode(
location.
xml(),
true);
1509 document_xml.appendChild(node);
1519 tr(
"Édition en lecture seule",
"message box title"),
1520 tr(
"Vous n'avez pas les privilèges nécessaires pour modifier cet élement. Il sera donc ouvert en lecture seule.",
"message box content"));
1538 if (element_file_path.isEmpty())
return;
1540 QString error_message;
1541 QDomDocument xml_document;
1542 QFile element_file(element_file_path);
1544 if (!element_file.open(QIODevice::ReadOnly)) {
1545 error_message = QString(
tr(
"Impossible d'ouvrir le fichier %1.",
"message box content")).arg(element_file_path);
1548 if (!xml_document.setContent(&element_file)) {
1549 error_message =
tr(
"Ce fichier n'est pas un document XML valide",
"message box content");
1551 element_file.close();
1554 if (!error_message.isEmpty()) {
1575 tr(
"Élément inexistant.",
"message box title"),
1576 tr(
"Le chemin virtuel choisi ne correspond pas à un élément.",
"message box content"));
1582 tr(
"Élément inexistant.",
"message box title"),
1583 tr(
"L'élément n'existe pas.",
"message box content"));
1588 QDomDocument document_xml;
1589 QDomNode node = document_xml.importNode(
location.
xml(),
true);
1590 document_xml.appendChild(node);
1605 current_editor -> updateForm();
~QETElementEditor() override
Destructeur.
void setEventInterface(ESEventInterface *event_interface)
ElementScene::setEventInterface Set a new event interface.
void slot_setNoDragToView()
The ESEventAddEllipse class This ESEvent manage creation of ellpise in an ElementScene.
void slot_setRubberBandToView()
QHash< QString, ElementItemEditor * > m_editors
Hash associating primitive names with their matching edition widget.
QToolBar * element_toolbar
void saveToLocation(ElementsLocation loc)
QString filename_
filename of the currently edited element
The RectangleEditor class This class provides a widget to edit rectangles within the element editor...
void addArc()
QETElementEditor::addArc Set arc creation interface to scene.
bool toLocation(const ElementsLocation &location)
QETElementEditor::toLocation Save the element to Location.
static QString customElementsDir()
QETApp::customElementsDir.
ElementsLocation location_
location of the currently edited element
void addEllipse()
QETElementEditor::addEllipse Set ellipse creation interface to scene.
ElementView * m_view
view widget for the editing scene
QActionGroup * m_depth_action_group
bool opened_from_file
whether the currently edited element comes from a file or a location
bool compareCanonicalFilePaths(const QString &, const QString &)
The ESEventAddPolygon class This ESEvent manage creation of polygon in an ElementScene.
QDockWidget * m_tools_dock
container for widgets dedicated to primitive edition
The DynamicTextFieldEditor class This class provide a widget used to edit the property of a dynamic t...
QMenu * settings_menu_
Settings menu.
ElementScene * m_elmt_scene
editing scene
void copyAndPasteXml(const QDomDocument &)
virtual const QDomDocument toXml(bool=true)
ElementScene::toXml Export this element as a xml file.
bool event(QEvent *) override
static bool isStyleEditable(QList< CustomElementPart *> cep_list)
StyleEditor::isStyleEditable.
void slot_updateSelectionFromPartsList()
ElementScene * elementScene() const
The ESEventAddDynamicTextField class This ESEvent manage creation of dynamic text field in an Element...
void UncheckAddPrimitive()
QETElementEditor::UncheckAddPrimitive Uncheck all action related to primitive.
bool read_only
whether the editor is "read-only"
void addLine()
QETElementEditor::addLine Set line creation interface to scene.
virtual bool setPart(CustomElementPart *)=0
void slot_updateInformations()
void addTerminal()
QETElementEditor::addTerminal Set terminal creation interface to scene.
The ESEventAddLine class This ESEvent manage creation of line in a ElementScene.
bool slot_saveAsFile()
QETElementEditor::slot_saveAsFile Ask a file to user and save the current edited element to this file...
void slot_openDxf()
QETElementEditor::slot_openDxf.
bool setXml(const QDomDocument &xml_document) const
ElementsLocation::setXml Replace the current xml description by ; The document element of must have ...
void setupMenus()
QETElementEditor::setupMenus.
QAction * new_element
actions for the "file" menu
void updateCurrentPartEditor()
bool checkElement()
QETElementEditor::checkElement Do several check about element. If error is occurred return false...
bool slot_saveAs()
QETElementEditor::slot_saveAs Ask a location to user and save the current edited element to this loca...
void addRect()
QETElementEditor::addRect Set rectangle creation interface to scene.
QETElementEditor(QWidget *=nullptr)
static bool clipboardMayContainElement()
#define QET_MAX_PARTS_IN_ELEMENT_EDITOR_LIST
The ESEventAddTerminal class This ESEvent manage creation of terminal in an ElementScene.
bool writeXmlFile(QDomDocument &xml_doc, const QString &filepath, QString *error_message=nullptr)
The ESEventAddArc class This ESEvent manage creation of arc in an ElementScene.
static QPointF pasteOffset()
DepthOption
List the various kind of changes for the zValue.
QDomElement xml() const
ElementsLocation::xml.
QActionGroup * parts
Action group.
The ESEventAddText class This ESEvent manage creation of text in an ElementScene. ...
void fromLocation(const ElementsLocation &)
QETElementEditor::fromLocation Location of the element to edit.
void clearEventInterface()
ElementScene::clearEventInterface Clear the current event interface.
void openElement(const QString &)
bool slot_save()
QETElementEditor::slot_save Save the current editing element. If the filepath or location is unknow...
void setLocation(const ElementsLocation &)
QETElementEditor::setLocation The new location to edit.
bool exist() const
ElementsLocation::exist.
QDockWidget * m_parts_dock
Container for the list of existing primitives.
QAction * selectall
actions for the "edit" menu
void openRecentFile(const QString &)
QDockWidget * m_undo_dock
container for the undo list
QAction * paste_from_elmt
void readSettings()
QETElementEditor::readSettings Read settings.
void closeEvent(QCloseEvent *) override
static QString getOpenElementFileName(QWidget *=nullptr, const QString &=QString())
QString min_title
minimum window title
QLabel * m_default_informations
label displayed when several primitives are selected
void slot_createPartsList()
void fromFile(const QString &)
QAction * m_edit_properties
void addDynamicTextField()
QETElementEditor::addDynamicTextField Set dynamic text field creation interface to scene...
QListWidget * m_parts_list
List of primitives.
void firstActivation(QEvent *) override
void addText()
QETElementEditor::addText Set text creation interface to scene.
void contextMenu(QPoint p, QList< QAction *> actions=QList< QAction *>())
QETElementEditor::contextMenu Display a context menu, with all available action.
void pasteFromElement()
QETElementEditor::pasteFromElement Ask an element to user, copy the xml definition of the element to ...
void addPolygon()
QETElementEditor::addPolygon Set polygon creation interface to scene.
bool toFile(const QString &)
QETElementEditor::toFile Save to file the drawed element.
void setupActions()
QETElementEditor::setupActions Create action used in Element editor.
QMessageBox::StandardButton question(QWidget *, const QString &, const QString &, QMessageBox::StandardButtons=QMessageBox::Ok, QMessageBox::StandardButton=QMessageBox::NoButton)
void insertMenu(QMenu *, QMenu *, bool=true)
QToolBar * parts_toolbar
toolbars
void slot_reload()
QETElementEditor::slot_reload Reload the element from the file or location.
bool isEditing(const ElementsLocation &)
bool isElement() const
ElementsLocation::isElement.
void setFileName(const QString &)
void writeSettings()
QETElementEditor::writeSettings Write the settings.
static RecentFiles * elementsRecentFiles()
QAction * paste_from_file
QMessageBox::StandardButton critical(QWidget *, const QString &, const QString &, QMessageBox::StandardButtons=QMessageBox::Ok, QMessageBox::StandardButton=QMessageBox::NoButton)
static ElementsLocation getOpenElementLocation(QWidget *parent=nullptr)
ElementDialog::getOpenElementLocation Display a dialog for open an element through her location...
QActionGroup * depthActionGroup(QObject *parent=nullptr)
QET::depthActionGroup.
QWidget * clearToolsDock()
ElementsLocation location() const
bool isWritable() const
ElementsLocation::isWritable.
static QETApp * instance()
void setupInterface()
QETElementEditor::setupInterface.
void slot_updatePartsList()
QMessageBox::StandardButton warning(QWidget *, const QString &, const QString &, QMessageBox::StandardButtons=QMessageBox::Ok, QMessageBox::StandardButton=QMessageBox::NoButton)
static ElementsLocation getSaveElementLocation(QWidget *parent=nullptr)
ElementDialog::getSaveElementLocation Display a dialog that allow to user to select an element (exist...
QStackedWidget * m_tools_dock_stack
Stack of widgets for tools_dock.
static QString realPath(const QString &)