diff --git a/cmake/qet_compilation_vars.cmake b/cmake/qet_compilation_vars.cmake index 3bb29d113..207a2719b 100644 --- a/cmake/qet_compilation_vars.cmake +++ b/cmake/qet_compilation_vars.cmake @@ -685,6 +685,8 @@ set(QET_SRC_FILES ${QET_DIR}/sources/ui/configpage/generalconfigurationpage.h ${QET_DIR}/sources/ui/configpage/projectconfigpages.cpp ${QET_DIR}/sources/ui/configpage/projectconfigpages.h + ${QET_DIR}/sources/ui/configpage/guidespropertieswidget.cpp + ${QET_DIR}/sources/ui/configpage/guidespropertieswidget.h ${QET_DIR}/sources/undocommand/addelementtextcommand.cpp ${QET_DIR}/sources/undocommand/addelementtextcommand.h diff --git a/ico/22x22/guides.png b/ico/22x22/guides.png new file mode 100644 index 000000000..d6d8a1e69 Binary files /dev/null and b/ico/22x22/guides.png differ diff --git a/qelectrotech.qrc b/qelectrotech.qrc index 4d324408f..7b506d46c 100644 --- a/qelectrotech.qrc +++ b/qelectrotech.qrc @@ -222,6 +222,7 @@ ico/24x16/dk.png ico/24x16/br.png ico/22x22/grid.png + ico/22x22/guides.png ico/22x22/terminalstrip.png ico/16x16/diagram.png ico/16x16/edit-clear-locationbar-rtl.png diff --git a/sources/SearchAndReplace/searchandreplaceworker.cpp b/sources/SearchAndReplace/searchandreplaceworker.cpp index ed442893e..9f74248d7 100644 --- a/sources/SearchAndReplace/searchandreplaceworker.cpp +++ b/sources/SearchAndReplace/searchandreplaceworker.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "searchandreplaceworker.h" - +#include "../qetproject.h" #include "../QPropertyUndoCommand/qpropertyundocommand.h" #include "../diagram.h" #include "../diagramcommands.h" diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp index 56a87af1c..c6e8a3842 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "terminalstripitem.h" - +#include "../../qetproject.h" #include "../diagram.h" #include "../../project/projectpropertieshandler.h" diff --git a/sources/TerminalStrip/ui/addterminalstripitemdialog.cpp b/sources/TerminalStrip/ui/addterminalstripitemdialog.cpp index c11a39f4b..c61b67ad6 100644 --- a/sources/TerminalStrip/ui/addterminalstripitemdialog.cpp +++ b/sources/TerminalStrip/ui/addterminalstripitemdialog.cpp @@ -17,7 +17,7 @@ */ #include "addterminalstripitemdialog.h" #include "ui_addterminalstripitemdialog.h" - +#include "../../qetproject.h" #include "../../undocommand/addgraphicsobjectcommand.h" #include "../terminalstrip.h" #include "../GraphicsItem/terminalstripitem.h" diff --git a/sources/autoNum/assignvariables.cpp b/sources/autoNum/assignvariables.cpp index 80929e4fc..c4810906e 100644 --- a/sources/autoNum/assignvariables.cpp +++ b/sources/autoNum/assignvariables.cpp @@ -23,7 +23,7 @@ #include "../qetgraphicsitem/conductor.h" #include "../qetgraphicsitem/element.h" #include "../qetxml.h" - +#include "../qetproject.h" #include #include #include diff --git a/sources/cli_export.cpp b/sources/cli_export.cpp index c5215e9bb..56b049581 100644 --- a/sources/cli_export.cpp +++ b/sources/cli_export.cpp @@ -116,9 +116,12 @@ void renderDiagram(Diagram *diagram, QPainter &painter, const QRectF &target) // draw_grid_ is set (default true), so toggle it off around the render // and restore it afterwards. const bool was_drawing_grid = diagram->displayGrid(); + const bool was_drawing_guides = diagram->displayGuides(); diagram->setDisplayGrid(false); + diagram->setDisplayGuides(false); diagram->render(&painter, target, source, Qt::KeepAspectRatio); diagram->setDisplayGrid(was_drawing_grid); + diagram->setDisplayGuides(was_drawing_guides); } int exportPdf(QETProject &project, const QString &output) diff --git a/sources/conductorautonumerotation.cpp b/sources/conductorautonumerotation.cpp index c43efd70a..0f53c870d 100644 --- a/sources/conductorautonumerotation.cpp +++ b/sources/conductorautonumerotation.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "conductorautonumerotation.h" - +#include "qetproject.h" #include "QPropertyUndoCommand/qpropertyundocommand.h" #include "autoNum/assignvariables.h" #include "autoNum/numerotationcontextcommands.h" diff --git a/sources/conductornumexport.cpp b/sources/conductornumexport.cpp index d46f5ecbd..23adb23ed 100644 --- a/sources/conductornumexport.cpp +++ b/sources/conductornumexport.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "conductornumexport.h" - +#include "qetproject.h" #include "qetapp.h" #include "diagram.h" #include "diagramcontent.h" diff --git a/sources/diagram.cpp b/sources/diagram.cpp index e875c30d2..7072a95d6 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -39,7 +39,7 @@ #include "qetxml.h" #include "undocommand/addelementtextcommand.h" #include "qetinformation.h" - +#include "qetproject.h" #include #include @@ -65,7 +65,6 @@ QColor Diagram::background_color = Qt::white; Diagram::Diagram(QETProject *project) : QGraphicsScene (project), m_project (project), - draw_grid_ (true), use_border_ (true), draw_terminals_ (true), draw_colored_conductors_ (true), @@ -73,6 +72,11 @@ Diagram::Diagram(QETProject *project) : m_freeze_new_elements (false), m_freeze_new_conductors_ (false) { + + QSettings settings; + draw_grid_ = settings.value(QStringLiteral("diagrameditor/grid_display_startup"), true).toBool(); + draw_guides_ = settings.value(QStringLiteral("diagrameditor/guides_display_startup"), false).toBool(); + setItemIndexMethod(QGraphicsScene::NoIndex); /* Set to no index, * because they can be the source of the crash with conductor and shape ghost. @@ -121,8 +125,30 @@ Diagram::Diagram(QETProject *project) : connect(this, &Diagram::diagramActivated, this, &Diagram::loadCndFolioSeq); adjustSceneRect(); -} + m_guides_list.clear(); + if (m_project) { + for (const auto &pg : m_project->defaultGuides()) { + Diagram::Guide g; + g.orientation = static_cast(pg.orientation); + g.position = pg.position; + g.color = pg.color; + m_guides_list.append(g); + } + } else { + QSettings settings; + int size = settings.beginReadArray(QStringLiteral("diagrameditor/defaultguides")); + for (int i = 0; i < size; ++i) { + settings.setArrayIndex(i); + Diagram::Guide g; + g.orientation = static_cast(settings.value(QStringLiteral("orientation"), 0).toInt()); + g.position = settings.value(QStringLiteral("position"), 0.0).toReal(); + g.color = QColor(settings.value(QStringLiteral("color"), QStringLiteral("#ff0000")).toString()); + m_guides_list.append(g); + } + settings.endArray(); + } +} /** @brief Diagram::~Diagram Destructor @@ -186,6 +212,14 @@ void Diagram::drawBackground(QPainter *p, const QRectF &r) { p -> setBrush(Diagram::background_color); p -> drawRect(r); + QSettings settings; + QRectF rect = settings.value( + QStringLiteral("diagrameditor/zoom-out-beyond-of-folio"), + false).toBool() ? r + : border_and_titleblock + .insideBorderRect() + .intersected(r); + if (draw_grid_) { /* Draw the points of the grid * if background color is black, @@ -200,19 +234,10 @@ void Diagram::drawBackground(QPainter *p, const QRectF &r) { p -> setBrush(Qt::NoBrush); - // If user allow zoom out beyond of folio, - // we draw grid outside of border. - QSettings settings; int xGrid = settings.value(QStringLiteral("diagrameditor/Xgrid"), Diagram::xGrid).toInt(); int yGrid = settings.value(QStringLiteral("diagrameditor/Ygrid"), Diagram::yGrid).toInt(); - QRectF rect = settings.value( - QStringLiteral("diagrameditor/zoom-out-beyond-of-folio"), - false).toBool() ? r - : border_and_titleblock - .insideBorderRect() - .intersected(r); qreal limit_x = rect.x() + rect.width(); qreal limit_y = rect.y() + rect.height(); @@ -252,7 +277,23 @@ void Diagram::drawBackground(QPainter *p, const QRectF &r) { p -> drawPoints(points); } - if (use_border_) border_and_titleblock.draw(p); + if (draw_guides_) { + for (const Diagram::Guide &guide : m_guides_list) { + QPen guidePen(guide.color, 1, Qt::DashLine); + guidePen.setCosmetic(true); + p->setPen(guidePen); + + if (guide.orientation == Diagram::Guide::Vertical) { + p->drawLine(guide.position, rect.top(), guide.position, rect.bottom()); + } else { + p->drawLine(rect.left(), guide.position, rect.right(), guide.position); + } + } + } + if (use_border_) { + border_and_titleblock.draw(p); + } + p -> restore(); } @@ -2274,6 +2315,7 @@ ExportProperties Diagram::applyProperties( // exporte les options de rendu en cours ExportProperties old_properties; old_properties.draw_grid = displayGrid(); + old_properties.draw_guides = displayGuides(); old_properties.draw_border = border_and_titleblock.borderIsDisplayed(); old_properties.draw_titleblock = border_and_titleblock.titleBlockIsDisplayed(); old_properties.draw_terminals = drawTerminals(); @@ -2287,6 +2329,7 @@ ExportProperties Diagram::applyProperties( setDrawTerminals (new_properties.draw_terminals); setDrawColoredConductors (new_properties.draw_colored_conductors); setDisplayGrid (new_properties.draw_grid); + setDisplayGuides (new_properties.draw_guides); border_and_titleblock.displayBorder(new_properties.draw_border); border_and_titleblock.displayTitleBlock (new_properties.draw_titleblock); @@ -2635,3 +2678,24 @@ void Diagram::restoreText(Element* elmt) } } } + +QUndoStack &Diagram::undoStack() { + return *(project()->undoStack()); +} + +/** + * @brief Diagram::updateProjectGuides + * Aktualisiert die internen Hilfslinien dieses Schaltplans + * basierend auf den Projekt-Einstellungen und erzwingt ein Neuzeichnen. + */ +void Diagram::updateProjectGuides(const QList &guides) { + m_guides_list.clear(); + for (const GuideProperties &pg : guides) { + Diagram::Guide g; + g.orientation = static_cast(pg.orientation); + g.position = pg.position; + g.color = pg.color; + m_guides_list.append(g); + } + update(); +} diff --git a/sources/diagram.h b/sources/diagram.h index cc988165f..7a884f6de 100644 --- a/sources/diagram.h +++ b/sources/diagram.h @@ -24,7 +24,6 @@ #include "elementtextsmover.h" #include "exportproperties.h" #include "properties/xrefproperties.h" -#include "qetproject.h" #include "qgimanager.h" #include @@ -39,12 +38,11 @@ class DiagramPosition; class DiagramTextItem; class Element; class ElementsLocation; -class QETProject; -class Terminal; class DiagramImageItem; class DiagramEventInterface; class DiagramFolioList; class QETProject; +struct GuideProperties; /** @brief The Diagram class @@ -67,6 +65,13 @@ class Diagram : public QGraphicsScene // ATTRIBUTES public: + struct Guide { + enum Orientation { Horizontal, Vertical }; + Orientation orientation; + qreal position; + QColor color; + }; + /** @brief The BorderOptions enum Represents available options when rendering a particular diagram: @@ -119,6 +124,8 @@ class Diagram : public QGraphicsScene bool draw_grid_; bool use_border_; + bool draw_guides_; + QList m_guides_list; bool draw_terminals_; bool draw_colored_conductors_; @@ -207,6 +214,9 @@ class Diagram : public QGraphicsScene ExportProperties applyProperties(const ExportProperties &); void setDisplayGrid(bool); bool displayGrid(); + void setDisplayGuides(bool); + bool displayGuides(); + void updateProjectGuides(const QList &guides); void setUseBorder(bool); bool useBorder(); void setBorderOptions(BorderOptions); @@ -341,6 +351,16 @@ inline bool Diagram::displayGrid() { return(draw_grid_); } +inline void Diagram::setDisplayGuides(bool dg) { + if (draw_guides_ != dg) { + draw_guides_ = dg; + update(); + } +} + +inline bool Diagram::displayGuides() { + return(draw_guides_); +} /** @brief Diagram::setUseBorder Set whether the diagram border (including rows/columns headers and the title @@ -389,14 +409,6 @@ inline Diagram::BorderOptions Diagram::borderOptions() { return(options); } -/** - @brief Diagram::undoStack - @return the diagram undo stack -*/ -inline QUndoStack &Diagram::undoStack() { - return *(project()->undoStack()); -} - /** @brief Diagram::qgiManager @return the diagram graphics item manager diff --git a/sources/diagramevent/diagrameventaddelement.cpp b/sources/diagramevent/diagrameventaddelement.cpp index 147a57c36..203a0d953 100644 --- a/sources/diagramevent/diagrameventaddelement.cpp +++ b/sources/diagramevent/diagrameventaddelement.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "diagrameventaddelement.h" - +#include "../qetproject.h" #include "../conductorautonumerotation.h" #include "../diagram.h" #include "../undocommand/addgraphicsobjectcommand.h" diff --git a/sources/diagramview.cpp b/sources/diagramview.cpp index 271ac6fb3..405b6387a 100644 --- a/sources/diagramview.cpp +++ b/sources/diagramview.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "diagramview.h" - +#include "qetproject.h" #include "QPropertyUndoCommand/qpropertyundocommand.h" #include "diagramcommands.h" #include "diagramevent/diagrameventaddelement.h" diff --git a/sources/elementsmover.cpp b/sources/elementsmover.cpp index b8f3ff3ca..59233c623 100644 --- a/sources/elementsmover.cpp +++ b/sources/elementsmover.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "elementsmover.h" - +#include "qetproject.h" #include "conductorautonumerotation.h" #include "diagram.h" #include "qetgraphicsitem/conductor.h" diff --git a/sources/exportproperties.cpp b/sources/exportproperties.cpp index ee929e0bc..941f894b5 100644 --- a/sources/exportproperties.cpp +++ b/sources/exportproperties.cpp @@ -30,6 +30,7 @@ ExportProperties::ExportProperties() : destination_directory(QETApp::documentDir()), format("PNG"), draw_grid(false), + draw_guides(false), draw_border(true), draw_titleblock(true), draw_terminals(false), @@ -61,6 +62,8 @@ void ExportProperties::toSettings(QSettings &settings, format); settings.setValue(prefix % "drawgrid", draw_grid); + settings.setValue(prefix % "drawguides", + draw_guides); settings.setValue(prefix % "drawborder", draw_border); settings.setValue(prefix % "drawtitleblock", @@ -94,6 +97,8 @@ void ExportProperties::fromSettings(QSettings &settings, draw_grid = settings.value(prefix % "drawgrid", false).toBool(); + draw_guides = settings.value(prefix % "drawguides", + false).toBool(); draw_border = settings.value(prefix % "drawborder", true ).toBool(); draw_titleblock = settings.value(prefix % "drawtitleblock", diff --git a/sources/exportproperties.h b/sources/exportproperties.h index 1245e9e04..f104a9c41 100644 --- a/sources/exportproperties.h +++ b/sources/exportproperties.h @@ -43,6 +43,7 @@ class ExportProperties { QDir destination_directory; ///< Target directory for generated files QString format; ///< Image format of generated files bool draw_grid; ///< Whether to render the diagram grid + bool draw_guides; ///< Whether to render the diagram guides bool draw_border; ///< Whether to render the border (along with rows/columns headers) bool draw_titleblock; ///< Whether to render the title block bool draw_terminals; ///< Whether to render terminals diff --git a/sources/factory/qetgraphicstablefactory.cpp b/sources/factory/qetgraphicstablefactory.cpp index 5ab68220f..6fe99971b 100644 --- a/sources/factory/qetgraphicstablefactory.cpp +++ b/sources/factory/qetgraphicstablefactory.cpp @@ -25,7 +25,7 @@ #include "../qetgraphicsitem/ViewItem/qetgraphicstableitem.h" #include "../utils/qetutils.h" #include "ui/addtabledialog.h" - +#include "../qetproject.h" #include QetGraphicsTableFactory::QetGraphicsTableFactory() diff --git a/sources/print/projectprintwindow.cpp b/sources/print/projectprintwindow.cpp index b8d7b019a..ebd174ddd 100644 --- a/sources/print/projectprintwindow.cpp +++ b/sources/print/projectprintwindow.cpp @@ -522,6 +522,7 @@ ExportProperties ProjectPrintWindow::exportProperties() const exp.draw_terminals = ui->m_draw_terminal_cb->isChecked(); exp.draw_colored_conductors = ui->m_keep_conductor_color_cb->isChecked(); exp.draw_grid = false; + exp.draw_guides = false; return exp; } diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 55fc73319..f8f2a3b1d 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -373,8 +373,9 @@ void QETDiagramEditor::setUpActions() //Draw or not the background grid m_draw_grid = new QAction ( QET::Icons::Grid, tr("Afficher la grille"), this); m_draw_grid->setStatusTip(tr("Affiche ou masque la grille des folios")); + QSettings settings; m_draw_grid->setCheckable(true); - m_draw_grid->setChecked(true); + m_draw_grid->setChecked(settings.value("diagrameditor/grid_display_startup", true).toBool()); connect(m_draw_grid, &QAction::triggered, [this](bool checked) { foreach (ProjectView *prjv, this->openedProjects()) foreach (Diagram *d, prjv->project()->diagrams()) { @@ -383,6 +384,18 @@ void QETDiagramEditor::setUpActions() } }); + // Draw or not the custom guides + m_draw_guides = new QAction ( QIcon(":/ico/22x22/guides.png"), tr("Afficher les guides"), this); + m_draw_guides->setStatusTip(tr("Affiche ou masque les guides")); + m_draw_guides->setCheckable(true); + m_draw_guides->setChecked(settings.value("diagrameditor/guides_display_startup", false).toBool()); + connect(m_draw_guides, &QAction::triggered, [this](bool checked) { + foreach (ProjectView *prjv, this->openedProjects()) + foreach (Diagram *d, prjv->project()->diagrams()) { + d->setDisplayGuides(checked); + } + }); + //Edit current diagram properties m_edit_diagram_properties = new QAction(QET::Icons::DialogInformation, tr("Propriétés du folio"), this); m_edit_diagram_properties->setShortcut(Qt::CTRL | Qt::Key_L); @@ -765,6 +778,7 @@ void QETDiagramEditor::setUpToolBar() view_tool_bar -> addWidget(new DiagramEditorHandlerSizeWidget(this)); view_tool_bar -> addSeparator(); view_tool_bar -> addAction(m_draw_grid); + view_tool_bar -> addAction(m_draw_guides); view_tool_bar -> addAction (m_grey_background); view_tool_bar -> addSeparator(); view_tool_bar -> addActions(m_zoom_action_toolBar); @@ -1577,6 +1591,7 @@ void QETDiagramEditor::slot_updateActions() m_row_column_actions_group. setEnabled(editable_project); m_grey_background-> setEnabled(opened_diagram); m_draw_grid-> setEnabled(opened_diagram); + m_draw_guides-> setEnabled(opened_diagram); //Project menu m_project_edit_properties -> setEnabled(opened_project); diff --git a/sources/qetdiagrameditor.h b/sources/qetdiagrameditor.h index 309e108e5..9daf6a122 100644 --- a/sources/qetdiagrameditor.h +++ b/sources/qetdiagrameditor.h @@ -193,6 +193,7 @@ class QETDiagramEditor : public QETMainWindow *conductor_default, ///< Show a dialog to edit default conductor properties *m_grey_background, ///< Switch the background color in white or grey *m_draw_grid, ///< Switch the background grid display or not + *m_draw_guides = nullptr, ///< Switch the custom guides display or not *m_project_edit_properties, ///< Edit the properties of the current project. *m_project_add_diagram, ///< Add a diagram to the current project. *m_remove_diagram_from_project, ///< Delete a diagram from the current project diff --git a/sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.cpp b/sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.cpp index 215c2e3c6..49e57bf68 100644 --- a/sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.cpp +++ b/sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "qetgraphicstableitem.h" - +#include "../../qetproject.h" #include "../../QPropertyUndoCommand/qpropertyundocommand.h" #include "../../createdxf.h" #include "../../diagram.h" diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp index 73d2e3ac3..291608620 100644 --- a/sources/qetgraphicsitem/conductor.cpp +++ b/sources/qetgraphicsitem/conductor.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "../qetgraphicsitem/conductor.h" - +#include "../qetproject.h" #include "../QPropertyUndoCommand/qpropertyundocommand.h" #include "../autoNum/numerotationcontextcommands.h" #include "../conductorautonumerotation.h" diff --git a/sources/qetgraphicsitem/crossrefitem.cpp b/sources/qetgraphicsitem/crossrefitem.cpp index 31443266c..8bc328e16 100644 --- a/sources/qetgraphicsitem/crossrefitem.cpp +++ b/sources/qetgraphicsitem/crossrefitem.cpp @@ -18,7 +18,7 @@ #include "crossrefitem.h" #include - +#include "../qetproject.h" #include "../autoNum/assignvariables.h" #include "../diagram.h" #include "../diagramposition.h" diff --git a/sources/qetgraphicsitem/dynamicelementtextitem.cpp b/sources/qetgraphicsitem/dynamicelementtextitem.cpp index 64a05d603..de47ca808 100644 --- a/sources/qetgraphicsitem/dynamicelementtextitem.cpp +++ b/sources/qetgraphicsitem/dynamicelementtextitem.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "dynamicelementtextitem.h" - +#include "../qetproject.h" #include "../QPropertyUndoCommand/qpropertyundocommand.h" #include "../diagram.h" #include "../qetapp.h" diff --git a/sources/qetgraphicsitem/element.cpp b/sources/qetgraphicsitem/element.cpp index 408e89e4d..74322b66c 100644 --- a/sources/qetgraphicsitem/element.cpp +++ b/sources/qetgraphicsitem/element.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "element.h" - +#include "../qetproject.h" #include "../PropertiesEditor/propertieseditordialog.h" #include "../autoNum/numerotationcontextcommands.h" #include "../diagram.h" diff --git a/sources/qetgraphicsitem/elementtextitemgroup.cpp b/sources/qetgraphicsitem/elementtextitemgroup.cpp index b5260f909..eb4cb72e9 100644 --- a/sources/qetgraphicsitem/elementtextitemgroup.cpp +++ b/sources/qetgraphicsitem/elementtextitemgroup.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "elementtextitemgroup.h" - +#include "../qetproject.h" #include "../QPropertyUndoCommand/qpropertyundocommand.h" #include "../diagram.h" #include "../qetapp.h" diff --git a/sources/qetgraphicsitem/masterelement.cpp b/sources/qetgraphicsitem/masterelement.cpp index 64504bb09..5d573ca12 100644 --- a/sources/qetgraphicsitem/masterelement.cpp +++ b/sources/qetgraphicsitem/masterelement.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "masterelement.h" - +#include "../qetproject.h" #include "../diagram.h" #include "crossrefitem.h" #include "dynamicelementtextitem.h" diff --git a/sources/qetgraphicsitem/terminal.cpp b/sources/qetgraphicsitem/terminal.cpp index 1f06f3361..49fb53ad4 100644 --- a/sources/qetgraphicsitem/terminal.cpp +++ b/sources/qetgraphicsitem/terminal.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "../qetgraphicsitem/terminal.h" - +#include "../qetproject.h" #include "../conductorautonumerotation.h" #include "../diagram.h" #include "../undocommand/addgraphicsobjectcommand.h" diff --git a/sources/qetproject.cpp b/sources/qetproject.cpp index 86d884aad..aabd128de 100644 --- a/sources/qetproject.cpp +++ b/sources/qetproject.cpp @@ -56,15 +56,27 @@ void QETProject::setBackupEnabled(bool enabled) @param parent */ QETProject::QETProject(QObject *parent) : - QObject (parent), - m_titleblocks_collection(this), - m_data_base(this, this), - m_project_properties_handler{this} +QObject (parent), +m_titleblocks_collection(this), +m_data_base(this, this), +m_project_properties_handler{this} { setDefaultTitleBlockProperties(TitleBlockProperties::defaultProperties()); m_elements_collection = new XmlElementCollection(this); init(); + + QSettings settings; + int size = settings.beginReadArray(QStringLiteral("diagrameditor/defaultguides")); + for (int i = 0; i < size; ++i) { + settings.setArrayIndex(i); + GuideProperties g; + g.orientation = settings.value(QStringLiteral("orientation"), 0).toInt(); + g.position = settings.value(QStringLiteral("position"), 0.0).toReal(); + g.color = QColor(settings.value(QStringLiteral("color"), QStringLiteral("#ff0000")).toString()); + m_default_guides.append(g); + } + settings.endArray(); } ProjectPropertiesHandler &QETProject::projectPropertiesHandler() @@ -205,6 +217,7 @@ void QETProject::init() }); m_autosave_timer.start(); } + } /** @@ -502,6 +515,23 @@ TitleBlockProperties QETProject::defaultTitleBlockProperties() const return(default_titleblock_properties_); } +QList QETProject::defaultGuides() const { + return m_default_guides; +} + +void QETProject::setDefaultGuides(const QList &guides) { + if (m_default_guides != guides) { + m_default_guides = guides; + setModified(true); + + for (Diagram *diagram : m_diagrams_list) { + if (diagram) { + diagram->updateProjectGuides(m_default_guides); + } + } + } +} + /** @brief QETProject::setDefaultTitleBlockProperties Specify the title block to be used at the creation of a new diagram for this project @@ -1589,7 +1619,7 @@ void QETProject::readDefaultPropertiesXml(QDomDocument &xml_project) m_default_xref_properties = XRefProperties:: defaultProperties(); //Read values indicate in project - QDomElement border_elmt, titleblock_elmt, conductors_elmt, report_elmt, xref_elmt, conds_autonums, folio_autonums, element_autonums; + QDomElement border_elmt, titleblock_elmt, conductors_elmt, report_elmt, xref_elmt, conds_autonums, folio_autonums, element_autonums, guides_elmt; for (QDomNode child = newdiagrams_elmt.firstChild() ; !child.isNull() ; child = child.nextSibling()) { @@ -1612,6 +1642,8 @@ void QETProject::readDefaultPropertiesXml(QDomDocument &xml_project) folio_autonums = child_elmt; else if (child_elmt.tagName()== QLatin1String("element_autonums")) element_autonums = child_elmt; + else if (child_elmt.tagName() == QLatin1String("guides")) + guides_elmt = child_elmt; } // size, titleblock, conductor, report, conductor autonum, folio autonum, element autonum @@ -1659,6 +1691,18 @@ void QETProject::readDefaultPropertiesXml(QDomDocument &xml_project) m_element_autonum.insert(elmt.attribute(QStringLiteral("title")), nc); } } + // Read guides from XML (if missing, e.g. in old projects, list stays empty) + m_default_guides.clear(); + + if (!guides_elmt.isNull()) { + for (auto elmt : QET::findInDomElement(guides_elmt, QStringLiteral("guide"))) { + GuideProperties g; + g.orientation = elmt.attribute(QStringLiteral("orientation"), QStringLiteral("0")).toInt(); + g.position = elmt.attribute(QStringLiteral("position"), QStringLiteral("0.0")).toDouble(); + g.color = QColor(elmt.attribute(QStringLiteral("color"), QStringLiteral("#ff0000"))); + m_default_guides.append(g); + } + } } /** @@ -1769,6 +1813,17 @@ void QETProject::writeDefaultPropertiesXml(QDomElement &xml_element) } } xml_element.appendChild(element_autonums); + + // Export default guides + QDomElement guides_elmt = xml_document.createElement("guides"); + for (const auto &g : m_default_guides) { + QDomElement guide_elmt = xml_document.createElement("guide"); + guide_elmt.setAttribute("orientation", static_cast(g.orientation)); + guide_elmt.setAttribute("position", g.position); + guide_elmt.setAttribute("color", g.color.name()); + guides_elmt.appendChild(guide_elmt); + } + xml_element.appendChild(guides_elmt); } /** diff --git a/sources/qetproject.h b/sources/qetproject.h index 5f13cf4a8..6e96c1e6a 100644 --- a/sources/qetproject.h +++ b/sources/qetproject.h @@ -28,7 +28,7 @@ #include "properties/xrefproperties.h" #include "titleblock/templatescollection.h" #include "titleblockproperties.h" - +#include "diagram.h" #ifdef BUILD_WITHOUT_KF5 # include "ui/nokde/kautosavefile.h" #else @@ -50,6 +50,23 @@ class QTimer; class TerminalStrip; +#include + +struct GuideProperties { + int orientation; // 0 = Horizontal, 1 = Vertical + qreal position; + QColor color; + + bool operator==(const GuideProperties &other) const { + return orientation == other.orientation && + position == other.position && + color == other.color; + } + bool operator!=(const GuideProperties &other) const { + return !(*this == other); + } +}; + /** This class represents a QET project. Typically saved as a .qet file, it consists in an XML document grouping 0 to n diagrams and embedding an elements @@ -110,6 +127,9 @@ class QETProject : public QObject BorderProperties defaultBorderProperties() const; void setDefaultBorderProperties(const BorderProperties &); + QList defaultGuides() const; + void setDefaultGuides(const QList &guides); + TitleBlockProperties defaultTitleBlockProperties() const; void setDefaultTitleBlockProperties(const TitleBlockProperties &); @@ -262,6 +282,8 @@ class QETProject : public QObject QString read_only_file_path_; /// Default dimensions and properties for new diagrams created within the project BorderProperties default_border_properties_ = BorderProperties::defaultProperties(); + /// Default guides for new diagrams created within the project + QList m_default_guides; /// Default conductor properties for new diagrams created within the project ConductorProperties default_conductor_properties_ = ConductorProperties::defaultProperties(); /// Default title block properties for new diagrams created within the project diff --git a/sources/ui/configpage/configpages.cpp b/sources/ui/configpage/configpages.cpp index 5c1537118..1a01a343e 100644 --- a/sources/ui/configpage/configpages.cpp +++ b/sources/ui/configpage/configpages.cpp @@ -30,7 +30,7 @@ #include "../reportpropertiewidget.h" #include "../titleblockpropertieswidget.h" #include "../xrefpropertieswidget.h" - +#include "guidespropertieswidget.h" #include #include #include @@ -73,6 +73,33 @@ NewDiagramPage::NewDiagramPage(QETProject *project, rpw = new ReportPropertieWidget(ReportProperties::defaultProperties()); // default properties of xref xrefpw = new XRefPropertiesWidget(XRefProperties::defaultProperties(), this); + // default guides properties + m_gpw = new GuidesPropertiesWidget(this); + + QSettings settings; + QList loaded_guides; + if (m_project) { + for (const auto &pg : m_project->defaultGuides()) { + Diagram::Guide g; + g.orientation = static_cast(pg.orientation); + g.position = pg.position; + g.color = pg.color; + loaded_guides.append(g); + } + } else { + QSettings settings; + int size = settings.beginReadArray(QStringLiteral("diagrameditor/defaultguides")); + for (int i = 0; i < size; ++i) { + settings.setArrayIndex(i); + Diagram::Guide g; + g.orientation = static_cast(settings.value(QStringLiteral("orientation"), 0).toInt()); + g.position = settings.value(QStringLiteral("position"), 0.0).toReal(); + g.color = QColor(settings.value(QStringLiteral("color"), QStringLiteral("#ff0000")).toString()); + loaded_guides.append(g); + } + settings.endArray(); + } + m_gpw->setGuides(loaded_guides); //If there is a project, we edit his properties if (m_project) { @@ -98,6 +125,7 @@ NewDiagramPage::NewDiagramPage(QETProject *project, tab_widget -> addTab (m_cpw, tr("Conducteur")); tab_widget -> addTab (rpw, tr("Reports de folio")); tab_widget -> addTab (xrefpw, tr("Références croisées")); + tab_widget -> addTab (m_gpw, tr("Guides")); QVBoxLayout *vlayout1 = new QVBoxLayout(); vlayout1->addWidget(tab_widget); @@ -155,6 +183,17 @@ void NewDiagramPage::applyConf() modified_project = true; } + QList proj_guides; + for (const auto &g : m_gpw->guides()) { + GuideProperties pg; + pg.orientation = static_cast(g.orientation); + pg.position = g.position; + pg.color = g.color; + proj_guides.append(pg); + } + m_project->setDefaultGuides(proj_guides); + modified_project = true; + if (modified_project) { m_project -> setModified(modified_project); } @@ -176,13 +215,18 @@ void NewDiagramPage::applyConf() // default xref properties QHash hash_xrp = xrefpw -> properties(); - foreach (QString key, hash_xrp.keys()) { - XRefProperties xrp = hash_xrp[key]; - QString str("diagrameditor/defaultxref"); - xrp.toSettings(settings, str += key); - } - } + // Global in QSettings speichern + QList current_guides = m_gpw->guides(); + settings.beginWriteArray(QStringLiteral("diagrameditor/defaultguides")); + for (int i = 0; i < current_guides.size(); ++i) { + settings.setArrayIndex(i); + settings.setValue(QStringLiteral("orientation"), static_cast(current_guides[i].orientation)); + settings.setValue(QStringLiteral("position"), current_guides[i].position); + settings.setValue(QStringLiteral("color"), current_guides[i].color.name()); + } + settings.endArray(); + } } /** diff --git a/sources/ui/configpage/configpages.h b/sources/ui/configpage/configpages.h index 856616588..0a4740f90 100644 --- a/sources/ui/configpage/configpages.h +++ b/sources/ui/configpage/configpages.h @@ -29,6 +29,7 @@ class TitleBlockPropertiesWidget; class ExportPropertiesWidget; class ReportPropertieWidget; class XRefPropertiesWidget; +class GuidesPropertiesWidget; class QETProject; class TitleBlockProperties; @@ -69,6 +70,7 @@ public slots: ConductorPropertiesWidget *m_cpw; ///< Widget to edit default conductor properties ReportPropertieWidget *rpw; ///< Widget to edit default report label XRefPropertiesWidget *xrefpw; ///< Widget to edit default xref properties + GuidesPropertiesWidget *m_gpw; ///< Widget to edit guides TitleBlockProperties savedTbp; ///< Used to save current TBP and retrieve later }; diff --git a/sources/ui/configpage/generalconfigurationpage.cpp b/sources/ui/configpage/generalconfigurationpage.cpp index 9fe0c9b8f..d639e3a6a 100644 --- a/sources/ui/configpage/generalconfigurationpage.cpp +++ b/sources/ui/configpage/generalconfigurationpage.cpp @@ -22,7 +22,6 @@ #include "ui_generalconfigurationpage.h" #include "../../utils/qetsettings.h" #include "../../qetmessagebox.h" - #include #include #include @@ -66,6 +65,8 @@ GeneralConfigurationPage::GeneralConfigurationPage(QWidget *parent) : break; } #endif + ui->grid_startup_cb->setChecked(settings.value("diagrameditor/grid_display_startup", true).toBool()); + ui->guides_startup_cb->setChecked(settings.value("diagrameditor/guides_display_startup", false).toBool()); ui->DiagramEditor_xGrid_sb->setValue(settings.value("diagrameditor/Xgrid", 10).toInt()); ui->DiagramEditor_yGrid_sb->setValue(settings.value("diagrameditor/Ygrid", 10).toInt()); ui->DiagramEditor_xKeyGrid_sb->setValue(settings.value("diagrameditor/key_Xgrid", 10).toInt()); @@ -240,6 +241,9 @@ void GeneralConfigurationPage::applyConf() settings.setValue("diagrameditor/highlight-integrated-elements", ui->m_highlight_integrated_elements->isChecked()); settings.setValue("diagrameditor/zoom-out-beyond-of-folio", ui->m_zoom_out_beyond_folio->isChecked()); settings.setValue("diagrameditor/autosave-interval", ui->m_autosave_sb->value()); + + settings.setValue("diagrameditor/grid_display_startup", ui->grid_startup_cb->isChecked()); + settings.setValue("diagrameditor/guides_display_startup", ui->guides_startup_cb->isChecked()); //Grid step and key navigation settings.setValue("diagrameditor/Xgrid", ui->DiagramEditor_xGrid_sb->value()); settings.setValue("diagrameditor/Ygrid", ui->DiagramEditor_yGrid_sb->value()); diff --git a/sources/ui/configpage/generalconfigurationpage.ui b/sources/ui/configpage/generalconfigurationpage.ui index 16146c6d8..297cb6c3d 100644 --- a/sources/ui/configpage/generalconfigurationpage.ui +++ b/sources/ui/configpage/generalconfigurationpage.ui @@ -7,7 +7,7 @@ 0 0 955 - 556 + 570 @@ -17,7 +17,7 @@ - 2 + 0 @@ -59,6 +59,27 @@ + + + + Afficher la grille par défaut (appliqué au prochain lancement) + + + + + + + Afficher les guides par défaut (appliqué au prochain lancement) + + + + + + + Qt::Horizontal + + + @@ -911,30 +932,10 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Affichage Grille - - - - Qt::Horizontal - - - - 555 - 20 - - - - - - + + - max: - - - - - - - Taille des points de la grille de Diagram-Editor : 1 - 5 + min: @@ -954,10 +955,39 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments - - + + + + Qt::Horizontal + + + + 555 + 20 + + + + + + + + + 60 + 0 + + + + 1 + + + 5 + + + + + - min: + Taille des points de la grille de Diagram-Editor : 1 - 5 @@ -977,13 +1007,6 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments - - - - Taille des points de la grille de l'éditeur d'éléments : 1 - 5 - - - @@ -1007,19 +1030,10 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments - - - - - 60 - 0 - - - - 1 - - - 5 + + + + max: @@ -1030,6 +1044,13 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments + + + + Taille des points de la grille de l'éditeur d'éléments : 1 - 5 + + + @@ -1110,7 +1131,6 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments - tabWidget m_use_system_color_cb m_use_gesture_trackpad m_zoom_out_beyond_folio diff --git a/sources/ui/configpage/guidespropertieswidget.cpp b/sources/ui/configpage/guidespropertieswidget.cpp new file mode 100644 index 000000000..73b3d3e96 --- /dev/null +++ b/sources/ui/configpage/guidespropertieswidget.cpp @@ -0,0 +1,113 @@ +#include "guidespropertieswidget.h" +#include +#include +#include +#include +#include +#include +#include +#include + +GuidesPropertiesWidget::GuidesPropertiesWidget(QWidget *parent) +: QWidget(parent) +{ + setupUi(); +} + +GuidesPropertiesWidget::~GuidesPropertiesWidget() {} + +void GuidesPropertiesWidget::setupUi() { + QVBoxLayout *main_layout = new QVBoxLayout(this); + + m_table = new QTableWidget(0, 3, this); + m_table->setHorizontalHeaderLabels({tr("Orientation"), tr("Position"), tr("Couleur")}); + m_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + m_table->setSelectionBehavior(QAbstractItemView::SelectRows); + + m_add_btn = new QPushButton(tr("Ajouter"), this); + m_remove_btn = new QPushButton(tr("Supprimer"), this); + + QHBoxLayout *btn_layout = new QHBoxLayout(); + btn_layout->addWidget(m_add_btn); + btn_layout->addWidget(m_remove_btn); + btn_layout->addStretch(); + + main_layout->addWidget(m_table); + main_layout->addLayout(btn_layout); + + connect(m_add_btn, &QPushButton::clicked, this, &GuidesPropertiesWidget::addGuide); + connect(m_remove_btn, &QPushButton::clicked, this, &GuidesPropertiesWidget::removeGuide); +} + +QList GuidesPropertiesWidget::guides() const { + QList list; + for (int row = 0; row < m_table->rowCount(); ++row) { + QComboBox *combo = qobject_cast(m_table->cellWidget(row, 0)); + QDoubleSpinBox *spin = qobject_cast(m_table->cellWidget(row, 1)); + QPushButton *colorBtn = qobject_cast(m_table->cellWidget(row, 2)); + + if (combo && spin && colorBtn) { + Diagram::Guide g; + g.orientation = (combo->currentIndex() == 0) ? Diagram::Guide::Horizontal : Diagram::Guide::Vertical; + g.position = spin->value(); + g.color = colorBtn->property("color").value(); + list.append(g); + } + } + return list; +} + +void GuidesPropertiesWidget::setGuides(const QList &guides) { + m_table->setRowCount(0); + for (const auto &g : guides) { + addGuide(); + int row = m_table->rowCount() - 1; + + QComboBox *combo = qobject_cast(m_table->cellWidget(row, 0)); + QDoubleSpinBox *spin = qobject_cast(m_table->cellWidget(row, 1)); + QPushButton *colorBtn = qobject_cast(m_table->cellWidget(row, 2)); + + if (combo && spin && colorBtn) { + combo->setCurrentIndex(g.orientation == Diagram::Guide::Horizontal ? 0 : 1); + spin->setValue(g.position); + colorBtn->setProperty("color", g.color); + colorBtn->setStyleSheet(QString("background-color: %1; color: white; font-weight: bold;").arg(g.color.name())); + } + } +} + +void GuidesPropertiesWidget::addGuide() { + int row = m_table->rowCount(); + m_table->insertRow(row); + + QComboBox *combo = new QComboBox(this); + combo->addItems({tr("Horizontal"), tr("Vertical")}); + m_table->setCellWidget(row, 0, combo); + + QDoubleSpinBox *spin = new QDoubleSpinBox(this); + spin->setRange(-10000.0, 10000.0); + spin->setDecimals(2); + spin->setValue(100.0); + m_table->setCellWidget(row, 1, spin); + + QPushButton *colorBtn = new QPushButton(tr("Couleur"), this); + QColor defaultColor = Qt::lightGray; + colorBtn->setProperty("color", defaultColor); + colorBtn->setStyleSheet(QString("background-color: %1; color: white; font-weight: bold;").arg(defaultColor.name())); + + connect(colorBtn, &QPushButton::clicked, [this, colorBtn]() { + QColor c = QColorDialog::getColor(colorBtn->property("color").value(), this); + if (c.isValid()) { + colorBtn->setProperty("color", c); + colorBtn->setStyleSheet(QString("background-color: %1; color: white; font-weight: bold;").arg(c.name())); + } + }); + m_table->setCellWidget(row, 2, colorBtn); +} + +void GuidesPropertiesWidget::removeGuide() { + int row = m_table->currentRow(); + if (row >= 0) { + m_table->removeRow(row); + } +} diff --git a/sources/ui/configpage/guidespropertieswidget.h b/sources/ui/configpage/guidespropertieswidget.h new file mode 100644 index 000000000..1e4e599ec --- /dev/null +++ b/sources/ui/configpage/guidespropertieswidget.h @@ -0,0 +1,32 @@ +#ifndef GUIDESPROPERTIESWIDGET_H +#define GUIDESPROPERTIESWIDGET_H + +#include +#include +#include "../../diagram.h" + +class QTableWidget; +class QPushButton; + +class GuidesPropertiesWidget : public QWidget { + Q_OBJECT +public: + explicit GuidesPropertiesWidget(QWidget *parent = nullptr); + ~GuidesPropertiesWidget() override; + + QList guides() const; + void setGuides(const QList &guides); + +private slots: + void addGuide(); + void removeGuide(); + +private: + void setupUi(); + + QTableWidget *m_table; + QPushButton *m_add_btn; + QPushButton *m_remove_btn; +}; + +#endif // GUIDESPROPERTIESWIDGET_H diff --git a/sources/ui/linksingleelementwidget.cpp b/sources/ui/linksingleelementwidget.cpp index 7fdf68f8d..852e4ac7c 100644 --- a/sources/ui/linksingleelementwidget.cpp +++ b/sources/ui/linksingleelementwidget.cpp @@ -24,7 +24,7 @@ #include "../elementprovider.h" #include "../undocommand/linkelementcommand.h" #include "../qetinformation.h" - +#include "../qetproject.h" #include "../ui_linksingleelementwidget.h" #include diff --git a/sources/ui/masterpropertieswidget.cpp b/sources/ui/masterpropertieswidget.cpp index b3bd91905..0cb2548eb 100644 --- a/sources/ui/masterpropertieswidget.cpp +++ b/sources/ui/masterpropertieswidget.cpp @@ -16,7 +16,7 @@ * along with QElectroTech. If not, see . */ #include "masterpropertieswidget.h" - +#include "../qetproject.h" #include "../diagram.h" #include "../diagramposition.h" #include "../elementprovider.h" diff --git a/sources/ui/multipastedialog.cpp b/sources/ui/multipastedialog.cpp index e41c0c9be..953b5bccd 100644 --- a/sources/ui/multipastedialog.cpp +++ b/sources/ui/multipastedialog.cpp @@ -17,7 +17,7 @@ */ #include "multipastedialog.h" - +#include "../qetproject.h" #include "../conductorautonumerotation.h" #include "../diagram.h" #include "../diagramcommands.h" diff --git a/sources/undocommand/changeelementinformationcommand.cpp b/sources/undocommand/changeelementinformationcommand.cpp index 6d3ad3b6d..d06566e0a 100644 --- a/sources/undocommand/changeelementinformationcommand.cpp +++ b/sources/undocommand/changeelementinformationcommand.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "changeelementinformationcommand.h" - +#include "../qetproject.h" #include "../diagram.h" #include "../qetgraphicsitem/element.h"