/* Copyright 2006-2024 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. QElectroTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with QElectroTech. If not, see . */ #ifndef QET_PROJECT_H #define QET_PROJECT_H #include "ElementsCollection/elementslocation.h" #include "NameList/nameslist.h" #include "project/projectpropertieshandler.h" #include "borderproperties.h" #include "conductorproperties.h" #include "dataBase/projectdatabase.h" #include "properties/reportproperties.h" #include "properties/xrefproperties.h" #include "titleblock/templatescollection.h" #include "titleblockproperties.h" #ifdef BUILD_WITHOUT_KF5 #else # include #endif #include class Diagram; class ElementsLocation; class QETResult; class TitleBlockTemplate; class MoveTitleBlockTemplatesHandler; class NumerotationContext; class QUndoStack; class XmlElementCollection; class QTimer; class TerminalStrip; #ifdef BUILD_WITHOUT_KF5 #else class KAutoSaveFile; #endif /** 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 collection. This collection enables users to export diagrams on remote machines without wondering whether required elements are available to them. */ class QETProject : public QObject { Q_OBJECT public : //This enum lists possible states for a particular project. enum ProjectState { Ok = 0, /// no error FileOpenFailed = 1, /// file opening failed XmlParsingFailed = 2, /// XML parsing failed ProjectParsingRunning = 3, /// the XML content is currently being processed ProjectParsingFailed = 4, /// the parsing of the XML content failed FileOpenDiscard = 5 /// the user cancelled the file opening }; Q_PROPERTY(bool autoConductor READ autoConductor WRITE setAutoConductor) // constructors, destructor public: QETProject (QObject *parent = nullptr); QETProject (const QString &path, QObject * = nullptr); #ifdef BUILD_WITHOUT_KF5 #else QETProject (KAutoSaveFile *backup, QObject *parent=nullptr); #endif ~QETProject() override; private: QETProject(const QETProject &); // methods public: ProjectPropertiesHandler& projectPropertiesHandler(); projectDataBase *dataBase(); QUuid uuid() const; ProjectState state() const; QList diagrams() const; int folioIndex(const Diagram *) const; XmlElementCollection *embeddedElementCollection()const; TitleBlockTemplatesProjectCollection *embeddedTitleBlockTemplatesCollection(); QString filePath(); void setFilePath(const QString &); QString currentDir() const; QString pathNameTitle() const; QString title() const; QVersionNumber declaredQElectroTechVersion(); void setTitle(const QString &); ///DEFAULT PROPERTIES BorderProperties defaultBorderProperties() const; void setDefaultBorderProperties(const BorderProperties &); TitleBlockProperties defaultTitleBlockProperties() const; void setDefaultTitleBlockProperties(const TitleBlockProperties &); ConductorProperties defaultConductorProperties() const; void setDefaultConductorProperties(const ConductorProperties &); QString defaultReportProperties() const; void setDefaultReportProperties (const QString &properties); XRefProperties defaultXRefProperties (const QString &type) const {return m_default_xref_properties[type];} QHash defaultXRefProperties() const {return m_default_xref_properties;} void setDefaultXRefProperties(const QString& type, const XRefProperties &properties); void setDefaultXRefProperties(QHash hash); QHash conductorAutoNum() const; QHash elementAutoNum() const; QHash folioAutoNum() const; void addConductorAutoNum (const QString& key, const NumerotationContext& context); void addElementAutoNum (const QString& key, const NumerotationContext& context); void addFolioAutoNum (const QString& key, const NumerotationContext& context); void removeConductorAutoNum (const QString& key); void removeElementAutoNum (const QString& key); void removeFolioAutoNum (const QString& key); NumerotationContext conductorAutoNum(const QString &key) const; NumerotationContext folioAutoNum(const QString &key) const; NumerotationContext elementAutoNum(const QString &key); QString conductorAutoNumFormula(const QString& key) const; //returns Formula QString conductorCurrentAutoNum() const; void setCurrentConductorAutoNum(QString autoNum); QString elementAutoNumFormula(const QString& key) const; QString elementAutoNumCurrentFormula() const; QString elementCurrentAutoNum() const; void setCurrrentElementAutonum(QString autoNum); //Element void freezeExistentElementLabel(bool freeze, int from, int to); void freezeNewElementLabel(bool freeze, int from, int to); bool isFreezeNewElements(); void setFreezeNewElements(bool); //Conductor void freezeExistentConductorLabel(bool freeze, int from, int to); void freezeNewConductorLabel(bool freeze, int from, int to); bool isFreezeNewConductors(); void setFreezeNewConductors(bool); bool autoConductor () const; bool autoElement () const; bool autoFolio () const; void setAutoConductor (bool ac); void setAutoElement (bool ae); void autoFolioNumberingNewFolios (); void autoFolioNumberingSelectedFolios(int, int, const QString&); QDomDocument toXml(); bool close(); QETResult write(); bool isReadOnly() const; void setReadOnly(bool); bool isEmpty() const; ElementsLocation importElement(ElementsLocation &location); QString integrateTitleBlockTemplate(const TitleBlockTemplateLocation &, MoveTitleBlockTemplatesHandler *handler); bool usesElement(const ElementsLocation &) const; QList unusedElements() const; bool usesTitleBlockTemplate(const TitleBlockTemplateLocation &); bool projectWasModified(); bool projectOptionsWereModified(); DiagramContext projectProperties(); void setProjectProperties(const DiagramContext &); QUndoStack* undoStack() {return m_undo_stack;} QVector terminalStrip() const; TerminalStrip * newTerminalStrip(QString installation = QString(), QString location = QString(), QString name = QString()); bool addTerminalStrip(TerminalStrip *strip); bool removeTerminalStrip(TerminalStrip *strip); public slots: Diagram *addNewDiagram(int pos = -1); void removeDiagram(Diagram *); void diagramOrderChanged(int, int); void setModified(bool); signals: void projectFilePathChanged(QETProject *, const QString &); void projectTitleChanged(QETProject *, const QString &); void projectInformationsChanged(QETProject *); void diagramAdded(QETProject *, Diagram *); void diagramRemoved(QETProject *, Diagram *); void projectModified(QETProject *, bool); void projectDiagramsOrderChanged(QETProject *, int, int); void diagramUsedTemplate(TitleBlockTemplatesCollection *, const QString &); void readOnlyChanged(QETProject *, bool); void reportPropertiesChanged(const QString &old_str, const QString &new_str); void XRefPropertiesChanged (); void addAutoNumDiagram(); void elementAutoNumAdded(QString name); void elementAutoNumRemoved(QString name); void conductorAutoNumAdded(); void conductorAutoNumRemoved(); void folioAutoNumAdded(); void folioAutoNumRemoved(); void folioAutoNumChanged(QString); void defaultTitleBlockPropertiesChanged(); void conductorAutoNumChanged(); private slots: void updateDiagramsFolioData(); void updateDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *, const QString &); void removeDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *, const QString &); void usedTitleBlockTemplateChanged(const QString &); void undoStackChanged (bool a) {if (!a) setModified(true);} private: void readProjectXml(QDomDocument &xml_project); void readDiagramsXml(QDomDocument &xml_project); void readElementsCollectionXml(QDomDocument &xml_project); void readProjectPropertiesXml(QDomDocument &xml_project); void readDefaultPropertiesXml(QDomDocument &xml_project); void readTerminalStripXml(const QDomDocument &xml_project); void writeProjectPropertiesXml(QDomElement &); void writeDefaultPropertiesXml(QDomElement &); void addDiagram(Diagram *diagram, int pos = -1); NamesList namesListForIntegrationCategory(); void writeBackup(); void init(); ProjectState openFile(QFile *file); void refresh(); // attributes private: /// File path this project is saved to QString m_file_path; /// Current state of the project ProjectState m_state; /// Diagrams carried by the project QList m_diagrams_list; /// Project title QString project_title_; /// QElectroTech version declared in the XML document at opening time QVersionNumber m_project_qet_version; /// Whether options were modified bool m_modified = false; /// Whether the project is read only bool m_read_only = false; /// Filepath for which this project is considered read only QString read_only_file_path_; /// Default dimensions and properties for new diagrams created within the project BorderProperties default_border_properties_ = BorderProperties::defaultProperties(); /// 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 TitleBlockProperties default_titleblock_properties_; /// Default report properties QString m_default_report_properties = ReportProperties::defaultProperties(); /// Default xref properties QHash m_default_xref_properties = XRefProperties::defaultProperties(); /// Embedded title block templates collection TitleBlockTemplatesProjectCollection m_titleblocks_collection; /// project-wide variables that will be made available to child diagrams DiagramContext m_project_properties; /// undo stack for this project QUndoStack *m_undo_stack; /// Conductor auto numerotation QHash m_conductor_autonum;//Title and NumContext hash QString m_current_conductor_autonum; /// Folio auto numbering QHash m_folio_autonum; /// Element Auto Numbering QHash m_element_autonum; //Title and NumContext hash QString m_current_element_autonum; bool m_auto_conductor = true; XmlElementCollection *m_elements_collection = nullptr; bool m_freeze_new_elements = false; bool m_freeze_new_conductors = false; QTimer m_save_backup_timer, m_autosave_timer; #ifdef BUILD_WITHOUT_KF5 #else KAutoSaveFile m_backup_file; #endif QUuid m_uuid = QUuid::createUuid(); projectDataBase m_data_base; QVector m_terminal_strip_vector; ProjectPropertiesHandler m_project_properties_handler; }; Q_DECLARE_METATYPE(QETProject *) #endif