Terminal strip item can saved / loaded to .qet file

This commit is contained in:
joshua
2022-12-21 19:18:49 +01:00
parent f41b5a4ed4
commit f54bea713e
12 changed files with 334 additions and 27 deletions

View File

@@ -164,7 +164,8 @@ HEADERS += $$files(sources/*.h) $$files(sources/ui/*.h) \
$$files(sources/TerminalStrip/*.h) \
$$files(sources/TerminalStrip/ui/*.h) \
$$files(sources/TerminalStrip/UndoCommand/*.h) \
$$files(sources/TerminalStrip/GraphicsItem/*.h)
$$files(sources/TerminalStrip/GraphicsItem/*.h) \
$$files(sources/xml/*.h)
SOURCES += $$files(sources/*.cpp) \
$$files(sources/editor/*.cpp) \
@@ -201,7 +202,8 @@ SOURCES += $$files(sources/*.cpp) \
$$files(sources/TerminalStrip/*.cpp) \
$$files(sources/TerminalStrip/ui/*.cpp) \
$$files(sources/TerminalStrip/UndoCommand/*.cpp) \
$$files(sources/TerminalStrip/GraphicsItem/*.cpp)
$$files(sources/TerminalStrip/GraphicsItem/*.cpp) \
$$files(sources/xml/*.cpp)
# Needed for use promote QTreeWidget in terminalstripeditor.ui
INCLUDEPATH += sources/TerminalStrip/ui

View File

@@ -32,6 +32,11 @@ TerminalStripDrawer::TerminalStripDrawer(QPointer<TerminalStrip> strip) :
m_strip(strip)
{}
void TerminalStripDrawer::setStrip(TerminalStrip *strip)
{
m_strip = strip;
}
/**
* @brief TerminalStripDrawer::paint
* @param painter

View File

@@ -27,9 +27,10 @@ class TerminalStrip;
class TerminalStripDrawer
{
public:
TerminalStripDrawer(QPointer<TerminalStrip> strip);
void paint(QPainter *painter);
TerminalStripDrawer(QPointer<TerminalStrip> strip = QPointer<TerminalStrip>());
void setStrip(TerminalStrip *strip);
void paint(QPainter *painter);
QRectF boundingRect() const;
private:

View File

@@ -16,6 +16,8 @@
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "terminalstripitem.h"
#include "../diagram.h"
#include "../../qetgraphicsitem/qgraphicsitemutility.h"
#include "../terminalstrip.h"
#include "../ui/terminalstripeditorwindow.h"
@@ -26,7 +28,29 @@ TerminalStripItem::TerminalStripItem(QPointer<TerminalStrip> strip, QGraphicsIte
m_drawer{strip}
{
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
setAcceptHoverEvents(true);
setAcceptHoverEvents(true);
}
TerminalStripItem::TerminalStripItem(QGraphicsItem *parent) :
QetGraphicsItem { parent }
{
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
setAcceptHoverEvents(true);
}
void TerminalStripItem::setTerminalStrip(TerminalStrip *strip)
{
m_strip = strip;
m_drawer.setStrip(strip);
m_pending_strip_uuid = QUuid();
}
/**
* @brief TerminalStripItem::terminalStrip
* @return The strip drawed by this item
*/
QPointer<TerminalStrip> TerminalStripItem::terminalStrip() const {
return m_strip;
}
void TerminalStripItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
@@ -62,5 +86,22 @@ void TerminalStripItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
Q_UNUSED (event);
TerminalStripEditorWindow::edit(m_strip);
if (m_strip) {
TerminalStripEditorWindow::edit(m_strip);
}
}
void TerminalStripItem::refreshPending()
{
if (!m_pending_strip_uuid.isNull()
&& diagram()
&& diagram()->project())
{
for (const auto &strip_ : diagram()->project()->terminalStrip()) {
if (strip_->uuid() == m_pending_strip_uuid) {
setTerminalStrip(strip_);
break;
}
}
}
}

View File

@@ -19,6 +19,7 @@
#define TERMINALSTRIPITEM_H
#include <QGraphicsObject>
#include <QUuid>
#include "terminalstripdrawer.h"
#include "../../qetgraphicsitem/qetgraphicsitem.h"
@@ -27,10 +28,16 @@ class TerminalStrip;
class TerminalStripItem : public QetGraphicsItem
{
friend class TerminalStripItemXml;
Q_OBJECT
public:
TerminalStripItem(QPointer<TerminalStrip> strip, QGraphicsItem *parent = nullptr);
TerminalStripItem(QGraphicsItem *parent = nullptr);
void setTerminalStrip(TerminalStrip *strip);
QPointer<TerminalStrip> terminalStrip() const;
enum {Type = UserType + 1011};
int type() const override {return Type;}
@@ -41,9 +48,12 @@ class TerminalStripItem : public QetGraphicsItem
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override;
void refreshPending();
private:
QPointer<TerminalStrip> m_strip;
TerminalStripDrawer m_drawer;
QUuid m_pending_strip_uuid;
};

View File

@@ -18,6 +18,8 @@
#include "diagram.h"
#include "ElementsCollection/elementcollectionhandler.h"
#include "TerminalStrip/GraphicsItem/terminalstripitem.h"
#include "xml/terminalstripitemxml.h"
#include "QPropertyUndoCommand/qpropertyundocommand.h"
#include "diagramcommands.h"
#include "diagramcontent.h"
@@ -873,6 +875,7 @@ QDomDocument Diagram::toXml(bool whole_content) {
QVector<DiagramImageItem *> list_images;
QVector<QetShapeItem *> list_shapes;
QVector<QetGraphicsTableItem *> table_vector;
QVector<TerminalStripItem *> strip_vector;
//Ckeck graphics item to "XMLise"
for(QGraphicsItem *qgi : items())
@@ -922,6 +925,12 @@ QDomDocument Diagram::toXml(bool whole_content) {
if (whole_content || table->isSelected())
table_vector << table;
}
case TerminalStripItem::Type: {
const auto strip = static_cast<TerminalStripItem *>(qgi);
if (whole_content || strip->isSelected()) {
strip_vector << strip;
}
}
}
}
@@ -979,6 +988,11 @@ QDomDocument Diagram::toXml(bool whole_content) {
dom_root.appendChild(tables);
}
if (!strip_vector.isEmpty()) {
dom_root.appendChild(TerminalStripItemXml::toXml(strip_vector, document));
}
return(document);
}
@@ -1423,6 +1437,9 @@ bool Diagram::fromXml(QDomElement &document,
added_tables << table;
}
//Load terminal strip item
QVector<TerminalStripItem *> added_strips { TerminalStripItemXml::fromXml(this, root) };
//Translate items if a new position was given in parameter
if (position != QPointF())
{
@@ -1433,6 +1450,7 @@ bool Diagram::fromXml(QDomElement &document,
for (auto text : qAsConst(added_texts )) added_items << text;
for (auto image : qAsConst(added_images )) added_items << image;
for (auto table : qAsConst(added_tables )) added_items << table;
for (const auto &strip : qAsConst(added_strips)) added_items << strip;
//Get the top left corner of the rectangle that contain all added items
QRectF items_rect;
@@ -1473,8 +1491,9 @@ bool Diagram::fromXml(QDomElement &document,
content_ptr -> m_shapes = QSet<QetShapeItem *>(
added_shapes.begin(),
added_shapes.end());
content_ptr->m_terminal_strip.swap(added_strips);
#endif
content_ptr -> m_tables = added_tables;
content_ptr->m_tables.swap(added_tables);
}
adjustSceneRect();
@@ -1528,20 +1547,25 @@ void Diagram::folioSequentialsFromXml(const QDomElement &root,
*/
void Diagram::refreshContents()
{
ElementProvider provider_(this);
DiagramContent dc_(this, false);
for (Element *elmt : elements())
{
for (auto &elmt : dc_.m_elements) {
elmt->initLink(project());
for (DynamicElementTextItem *deti : elmt->dynamicTextItems())
for (auto &deti : elmt->dynamicTextItems())
deti->refreshLabelConnection();
}
for (Conductor *conductor : conductors())
for (auto &conductor : dc_.conductors()) {
conductor->refreshText();
}
for (auto table : provider_.table())
for (auto &table : qAsConst(dc_.m_tables)) {
table->initLink();
}
for (auto &strip :qAsConst(dc_.m_terminal_strip)) {
strip->refreshPending();
}
}
/**

View File

@@ -225,7 +225,33 @@ QETProject::ProjectState QETProject::openFile(QFile *file)
if(opened_here) {
file->close();
}
return ProjectState::Ok;
return ProjectState::Ok;
}
/**
* @brief QETProject::refresh
* Refresh everything in the project.
* This is notably use when open a project from file.
*/
void QETProject::refresh()
{
DialogWaiting *dlgWaiting { nullptr };
if(DialogWaiting::hasInstance())
{
dlgWaiting = DialogWaiting::instance();
dlgWaiting->setModal(true);
dlgWaiting->show();
}
for(const auto &diagram : diagrams())
{
if(dlgWaiting)
{
dlgWaiting->setProgressBar(dlgWaiting->progressBarValue()+1);
dlgWaiting->setDetail(diagram->title());
}
diagram->refreshContents();
}
}
/**
@@ -1388,6 +1414,9 @@ void QETProject::readProjectXml(QDomDocument &xml_project)
//Load the terminal strip
readTerminalStripXml(xml_project);
//Now that all are loaded we refresh content of the project.
refresh();
m_data_base.blockSignals(false);
m_data_base.updateDB();
@@ -1461,18 +1490,6 @@ void QETProject::readDiagramsXml(QDomDocument &xml_project)
"Mise en place des références croisées"
"</p>"));
}
m_data_base.updateDB(); //All diagrams and items are created we need to update the database
for(const auto &diagram : diagrams())
{
if(dlgWaiting)
{
dlgWaiting->setProgressBar(dlgWaiting->progressBarValue()+1);
dlgWaiting->setDetail(diagram->title());
}
diagram->refreshContents();
}
}
/**

View File

@@ -234,6 +234,7 @@ class QETProject : public QObject
void writeBackup();
void init();
ProjectState openFile(QFile *file);
void refresh();
// attributes
private:

View File

@@ -21,6 +21,7 @@
#include <QDir>
#include <QFont>
#include <QGraphicsItem>
#include <QPen>
/**
@@ -917,7 +918,39 @@ bool validXmlProperty(const QDomElement& e) {
if (!e.hasAttribute("value"))
return false;
return true;
return true;
}
/**
* @brief qGraphicsItemPosToXml
* Save the pos of a QGraphicsItem into an xml element.
* The tag name of the xml element is pos and there is 3 attributes:
* x, y, z.
* @param item
* @param document
* @return
*/
QDomElement qGraphicsItemPosToXml(QGraphicsItem *item, QDomDocument &document)
{
auto dom_pos = document.createElement(QStringLiteral("pos"));
dom_pos.setAttribute(QStringLiteral("x"), QString::number(item->pos().x()));
dom_pos.setAttribute(QStringLiteral("y"), QString::number(item->pos().y()));
dom_pos.setAttribute(QStringLiteral("z"), QString::number(item->zValue()));
return dom_pos;
}
bool qGraphicsItemPosFromXml(QGraphicsItem *item, const QDomElement &xml_elmt)
{
if (xml_elmt.tagName() == QLatin1String("pos"))
{
item->setX(xml_elmt.attribute(QStringLiteral("x"), QStringLiteral("0")).toDouble());
item->setY(xml_elmt.attribute(QStringLiteral("y"), QStringLiteral("0")).toDouble());
item->setZValue(xml_elmt.attribute(QStringLiteral("z"), QStringLiteral("0")).toInt());
return true;
}
return false;
}
}

View File

@@ -25,6 +25,7 @@ class QDomDocument;
class QDir;
class QFile;
class QAbstractItemModel;
class QGraphicsItem;
/**
*This namespace contain some function to use xml with QET.
@@ -89,6 +90,10 @@ namespace QETXML
QVector<QDomElement> findInDomElement(const QDomElement &dom_elmt,
const QString &tag_name);
QDomElement qGraphicsItemPosToXml(QGraphicsItem *item, QDomDocument &document);
bool qGraphicsItemPosFromXml(QGraphicsItem *item, const QDomElement &xml_elmt);
QString boolToString(bool value);
bool boolFromString(const QString &value,
bool default_value = true,

View File

@@ -0,0 +1,131 @@
/*
Copyright 2006-2022 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "terminalstripitemxml.h"
#include "../diagram.h"
#include "../qetproject.h"
#include "../qetxml.h"
#include "../TerminalStrip/GraphicsItem/terminalstripitem.h"
#include "../TerminalStrip/terminalstrip.h"
#include <QUuid>
const QString STRIP_ITEM_TAG_NAME { QStringLiteral("terminal_strip_item") };
const QString STRIP_ITEMS_TAG_NAME { QStringLiteral("terminal_strip_items") };
/**
* @brief TerminalStripItemXml::toXml
* Save the vector of @a items as child of an xml element with tag "terminal_strip_tems"
* @param items : items to save in xml
* @param document : parent document used to create the QDomElement returned by this function.
* @return QDomElement where are saved @a items.
*/
QDomElement TerminalStripItemXml::toXml(const QVector<TerminalStripItem *> &items, QDomDocument &document)
{
auto dom_element = document.createElement(STRIP_ITEMS_TAG_NAME);
for (const auto &item : items) {
dom_element.appendChild(toXml(item, document));
}
return dom_element;
}
/**
* @brief TerminalStripItemXml::fromXml
* Load items stored in @a xml_elmt into @a diagram
* @a xml_elmt must have a child element with tag name "terminal_strip_tems"
* @param diagram
* @param xml_elmt
* @return a vector of added terminal strip item
*/
QVector<TerminalStripItem *> TerminalStripItemXml::fromXml(Diagram *diagram, const QDomElement &xml_elmt)
{
QVector<TerminalStripItem *> returned_vector;
for (const auto &dom_elmt : QETXML::subChild(xml_elmt,
STRIP_ITEMS_TAG_NAME,
STRIP_ITEM_TAG_NAME))
{
auto strip_item = new TerminalStripItem();
diagram->addItem(strip_item);
returned_vector << strip_item;
TerminalStripItemXml::fromXml(strip_item, diagram->project(), dom_elmt);
}
return returned_vector;
}
/**
* @brief TerminalStripItemXml::toXml
* Save @a item to an xml element with tag "terminal_strip_item"
* @param item : item to save in xml
* @param document : parent document used to create the QDomElement returned by this function.
* @return QDomElement where are saved @a item.
*/
QDomElement TerminalStripItemXml::toXml(TerminalStripItem *item, QDomDocument &document)
{
//Terminal strip item dom element
auto dom_element = document.createElement(STRIP_ITEM_TAG_NAME);
auto dom_strip = document.createElement(QStringLiteral("terminal_strip"));
dom_strip.setAttribute(QStringLiteral("uuid"), item->terminalStrip()->uuid().toString());
dom_element.appendChild(dom_strip);
dom_element.appendChild(QETXML::qGraphicsItemPosToXml(item, document));
return dom_element;
}
/**
* @brief TerminalStripItemXml::fromXml
* Restor the state of a terminal strip item from @a xml_elmt.
* The @a xml_elmt tag name must be "terminal_strip_item"
* @param item
* @param project
* @param xml_elmt
* @return
*/
bool TerminalStripItemXml::fromXml(TerminalStripItem *item, QETProject *project, const QDomElement &xml_elmt)
{
if (xml_elmt.tagName() == STRIP_ITEM_TAG_NAME)
{
bool a{false};
const auto ts = xml_elmt.firstChildElement(QStringLiteral("terminal_strip"));
if (!ts.isNull())
{
const QUuid uuid_(ts.attribute(QStringLiteral("uuid")));
item->m_pending_strip_uuid = uuid_;
for (const auto &ts : project->terminalStrip()) {
if (ts->uuid() == uuid_) {
item->setTerminalStrip(ts);
a = true;
break;
}
}
}
bool b{QETXML::qGraphicsItemPosFromXml(item,
xml_elmt.firstChildElement(QStringLiteral("pos")))};
return (a && b);
}
return false;
}

View File

@@ -0,0 +1,37 @@
/*
Copyright 2006-2022 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TERMINALSTRIPITEMXML_H
#define TERMINALSTRIPITEMXML_H
#include <QDomElement>
class TerminalStripItem;
class QETProject;
class Diagram;
class TerminalStripItemXml
{
public:
static QDomElement toXml(const QVector<TerminalStripItem *> &items, QDomDocument &document);
static QVector<TerminalStripItem *> fromXml(Diagram *diagram, const QDomElement &xml_elmt);
static QDomElement toXml(TerminalStripItem *item, QDomDocument &document);
static bool fromXml(TerminalStripItem *item, QETProject *project, const QDomElement &xml_elmt);
};
#endif // TERMINALSTRIPITEMXML_H