blacksun 5248c891f4 Dynamic element text item :
First : If the parent element of the text item is a slave,
the info use to create the text (both if option are 'element info' or 'composite text') are taken to the linked master element, and not the slave.
If the salve element is not linked, no information is taken.
Second : if the text is composed with the variable 'label' of the master (both if text from are 'element info' or 'composite text') double click on the text, act like a link and go to the master.



git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@5035 bfdf4180-ca20-0410-9c96-a3a8aa849046
2017-08-29 14:54:27 +00:00

173 lines
5.9 KiB
C++

/*
Copyright 2006-2017 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 "slaveelement.h"
#include "diagramposition.h"
#include "qetapp.h"
#include "elementtextitem.h"
#include "diagram.h"
/**
* @brief SlaveElement::SlaveElement
* Default constructor
* @param location location of xml definition
* @param qgi parent QGraphicItem
* @param s parent diagram
* @param state int used to know if the creation of element have error
*/
SlaveElement::SlaveElement(const ElementsLocation &location, QGraphicsItem *qgi, int *state) :
CustomElement(location, qgi, state)
{
m_xref_item = nullptr;
link_type_ = Slave;
connect(this, SIGNAL(updateLabel()), this, SLOT(updateLabel()));
}
/**
* @brief SlaveElement::~SlaveElement
* default destructor
*/
SlaveElement::~SlaveElement() {
unlinkAllElements();
}
/**
* @brief SlaveElement::linkToElement
* Link this slave to another element
* For this class element must be a master
* @param elmt
*/
void SlaveElement::linkToElement(Element *elmt)
{
// check if element is master and if isn't already linked
if (elmt->linkType() == Master && !connected_elements.contains(elmt))
{
if(!isFree())
unlinkAllElements();
for(QMetaObject::Connection c : m_connections)
this->disconnect(c);
m_connections.clear();
connected_elements << elmt;
QETProject *project = elmt->diagram()->project();
m_connections << connect(elmt, SIGNAL(xChanged()), this, SLOT(updateLabel()));
m_connections << connect(elmt, SIGNAL(yChanged()), this, SLOT(updateLabel()));
m_connections << connect(elmt, SIGNAL(elementInfoChange(DiagramContext, DiagramContext)), this, SLOT(updateLabel()));
m_connections << connect(project, SIGNAL(projectDiagramsOrderChanged(QETProject*,int,int)), this, SLOT(updateLabel()));
m_connections << connect(project, SIGNAL(diagramRemoved(QETProject*,Diagram*)), this, SLOT(updateLabel()));
m_connections << connect(project, SIGNAL(XRefPropertiesChanged()), this, SLOT(updateLabel()));
m_connections << connect(elmt, SIGNAL(updateLabel()), this, SLOT(updateLabel()));
updateLabel();
elmt -> linkToElement(this);
emit linkedElementChanged();
}
}
/**
* @brief SlaveElement::unlinkAllElements
* Unlink all of the element in the QList connected_elements
*/
void SlaveElement::unlinkAllElements()
{
// if this element is free no need to do something
if (!isFree())
{
foreach(Element *elmt, connected_elements)
unlinkElement(elmt);
emit linkedElementChanged();
}
}
/**
* @brief SlaveElement::unlinkElement
* Unlink the given elmt in parametre
* @param elmt
*/
void SlaveElement::unlinkElement(Element *elmt)
{
//Ensure elmt is linked to this element
if (connected_elements.contains(elmt))
{
connected_elements.removeOne(elmt);
disconnect(elmt, SIGNAL(xChanged()), this, SLOT(updateLabel()));
disconnect(elmt, SIGNAL(yChanged()), this, SLOT(updateLabel()));
disconnect(elmt, SIGNAL(elementInfoChange(DiagramContext, DiagramContext)),this, SLOT(updateLabel()));
disconnect(diagram()->project(), SIGNAL(projectDiagramsOrderChanged(QETProject*,int,int)), this, SLOT(updateLabel()));
disconnect(diagram()->project(), SIGNAL(diagramRemoved(QETProject*,Diagram*)), this, SLOT(updateLabel()));
disconnect(elmt -> diagram(), SIGNAL(XRefPropertiesChanged()), this, SLOT(updateLabel()));
disconnect(elmt, SIGNAL(updateLabel()), this, SLOT(updateLabel()));
delete m_xref_item; m_xref_item = nullptr;
if (ElementTextItem *eti = this->taggedText("label"))
eti->setPlainText("_");
updateLabel();
elmt -> unlinkElement (this) ;
elmt -> setHighlighted (false);
emit linkedElementChanged();
}
}
/**
* @brief SlaveElement::updateLabel
* update the label (tagged with label) of this element.
* If this element is connected to a master,
* the label show the string tagged by "label" of the master
* and add a qgraphicstextitem for show the position of the master
*/
void SlaveElement::updateLabel()
{
QString label;
if (ElementTextItem *eti = this->taggedText("label"))
label = eti->toPlainText();
QString Xreflabel;
bool no_editable = false;
//must be linked to set the label of master
if (linkedElements().count())
{
no_editable = true;
Element *elmt = linkedElements().first();
label = elmt->elementInformations()["label"].toString();
XRefProperties xrp = elmt->diagram()->project()->defaultXRefProperties(elmt->kindInformations()["type"].toString());
Xreflabel = xrp.slaveLabel();
Xreflabel = autonum::AssignVariables::formulaToLabel(Xreflabel, elmt->rSequenceStruct(), elmt->diagram(), elmt);
}
else
label = autonum::AssignVariables::formulaToLabel(label, m_autoNum_seq, diagram(), this);
// set the new label
ElementTextItem *eti = setTaggedText("label", label, no_editable);
if (eti && !isFree())
{
if (m_xref_item)
m_xref_item->setPlainText(Xreflabel);
else
{
m_xref_item = new QGraphicsTextItem(Xreflabel, eti);
m_xref_item->setFont(QETApp::diagramTextsFont(5));
m_xref_item->setPos(eti -> boundingRect().bottomLeft());
}
}
}