diff --git a/sources/editor/elementscene.cpp b/sources/editor/elementscene.cpp index 431f34fe5..d1ab2d4da 100644 --- a/sources/editor/elementscene.cpp +++ b/sources/editor/elementscene.cpp @@ -1,17 +1,17 @@ /* Copyright 2006-2020 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 . */ @@ -94,7 +94,8 @@ ElementScene::~ElementScene() @brief ElementScene::mouseMoveEvent @param e */ -void ElementScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { +void ElementScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) +{ if (m_event_interface) { if (m_event_interface -> mouseMoveEvent(e)) { if (m_event_interface->isFinish()) { @@ -109,7 +110,7 @@ void ElementScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { QPointF event_pos = e -> scenePos(); if (!(e -> modifiers() & Qt::ControlModifier)) event_pos = snapToGrid(event_pos); - + if (m_behavior == PasteArea) { QRectF current_rect(m_paste_area -> rect()); current_rect.moveCenter(event_pos); @@ -118,14 +119,15 @@ void ElementScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { } QGraphicsScene::mouseMoveEvent(e); - + } /** @brief ElementScene::mousePressEvent @param e */ -void ElementScene::mousePressEvent(QGraphicsSceneMouseEvent *e) { +void ElementScene::mousePressEvent(QGraphicsSceneMouseEvent *e) +{ if (m_event_interface) { if (m_event_interface -> mousePressEvent(e)) { if (m_event_interface->isFinish()) { @@ -144,7 +146,8 @@ void ElementScene::mousePressEvent(QGraphicsSceneMouseEvent *e) { @brief ElementScene::mouseReleaseEvent @param e */ -void ElementScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { +void ElementScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) +{ if (m_event_interface) { if (m_event_interface -> mouseReleaseEvent(e)) { if (m_event_interface->isFinish()) { @@ -155,7 +158,7 @@ void ElementScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { return; } } - + if (m_behavior == PasteArea) { m_defined_paste_area = m_paste_area -> rect(); removeItem(m_paste_area); @@ -171,7 +174,8 @@ void ElementScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { @brief ElementScene::mouseDoubleClickEvent @param event */ -void ElementScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { +void ElementScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) +{ if (m_event_interface) { if (m_event_interface -> mouseDoubleClickEvent(event)) { if (m_event_interface->isFinish()) { @@ -206,7 +210,7 @@ void ElementScene::keyPressEvent(QKeyEvent *event) return; } } - + if(selectedItems().size() == 1) { if(selectedItems().first()->type() == PartText::Type) @@ -218,15 +222,15 @@ void ElementScene::keyPressEvent(QKeyEvent *event) return; } } - + QGraphicsObject *qgo = selectedItems().first()->toGraphicsObject(); if(qgo) { QPointF original_pos = qgo->pos(); QPointF p = qgo->pos(); - + if (event->modifiers() & Qt::ControlModifier) { - + int k = event->key(); if(k == Qt::Key_Right) p.rx() += 0.1; @@ -238,7 +242,7 @@ void ElementScene::keyPressEvent(QKeyEvent *event) p.ry() += 0.1; } else { - + int k = event->key(); if(k == Qt::Key_Right) p.rx() += 1; @@ -249,13 +253,11 @@ void ElementScene::keyPressEvent(QKeyEvent *event) else if (k == Qt::Key_Down) p.ry() += 1; } - + qgo->setPos(p); QPropertyUndoCommand *undo = - new QPropertyUndoCommand(qgo, - "pos", - QVariant(original_pos), - QVariant(p)); + new QPropertyUndoCommand( + qgo,"pos",QVariant(original_pos),QVariant(p)); undo->setText(tr("Déplacer une primitive")); undo->enableAnimation(); undoStack().push(undo); @@ -263,7 +265,7 @@ void ElementScene::keyPressEvent(QKeyEvent *event) return; } } - + QGraphicsScene::keyPressEvent(event); } @@ -277,7 +279,7 @@ void ElementScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) QGraphicsScene::contextMenuEvent(event); if(event->isAccepted()) return; - + if (m_behavior == ElementScene::Normal) m_element_editor -> contextMenu(event->screenPos()); } @@ -343,7 +345,8 @@ void ElementScene::clearEventInterface() \~French Modifie the current behavior of this scene \~ @param b */ -void ElementScene::setBehavior(ElementScene::Behavior b) { +void ElementScene::setBehavior(ElementScene::Behavior b) +{ m_behavior = b; } @@ -379,7 +382,8 @@ int ElementScene::yGrid() const \~ @param y_g : Vertical grid size \~French Taille verticale de la grille */ -void ElementScene::setGrid(int x_g, int y_g) { +void ElementScene::setGrid(int x_g, int y_g) +{ m_x_grid = x_g ? x_g : 1; m_y_grid = y_g ? y_g : 1; } @@ -438,7 +442,7 @@ const QDomDocument ElementScene::toXml(bool all_parts) QDomElement uuid = xml_document.createElement("uuid"); uuid.setAttribute("uuid", QUuid::createUuid().toString()); root.appendChild(uuid); - + //names of element root.appendChild(m_names_list.toXml(xml_document)); @@ -448,7 +452,7 @@ const QDomDocument ElementScene::toXml(bool all_parts) m_elmt_kindInfo.toXml(kindInfo, "kindInformation"); root.appendChild(kindInfo); } - + if( m_elmt_type == "simple" || m_elmt_type == "master" @@ -458,12 +462,12 @@ const QDomDocument ElementScene::toXml(bool all_parts) m_elmt_information.toXml(element_info, "elementInformation"); root.appendChild(element_info); } - + //complementary information about the element QDomElement informations_element = xml_document.createElement("informations"); root.appendChild(informations_element); informations_element.appendChild(xml_document.createTextNode(informations())); - + QDomElement description = xml_document.createElement("description"); //the graphic description of the element @@ -478,7 +482,7 @@ const QDomDocument ElementScene::toXml(bool all_parts) } } root.appendChild(description); - + xml_document.appendChild(root); return(xml_document); } @@ -490,20 +494,21 @@ const QDomDocument ElementScene::toXml(bool all_parts) \~ @return the boundingRect of the element's content \~French le boundingRect du contenu de l'element */ -QRectF ElementScene::boundingRectFromXml(const QDomDocument &xml_document) { +QRectF ElementScene::boundingRectFromXml(const QDomDocument &xml_document) +{ // load parts from XML document // charge les parties depuis le document XML ElementContent loaded_content = loadContent(xml_document); if (loaded_content.isEmpty()) return(QRectF()); - + // calcule the boundingRect // calcule le boundingRect QRectF bounding_rect = elementContentBoundingRect(loaded_content); - + // destroy charged parties // detruit les parties chargees qDeleteAll(loaded_content); - + return(bounding_rect); } @@ -531,18 +536,19 @@ QRectF ElementScene::boundingRectFromXml(const QDomDocument &xml_document) { \~French si ce pointeur vers un ElementContent est different de 0, il sera rempli avec le contenu ajoute a l'element par le fromXml */ -void ElementScene::fromXml(const QDomDocument &xml_document, - const QPointF &position, - bool consider_informations, - ElementContent *content_ptr) +void ElementScene::fromXml( + const QDomDocument &xml_document, + const QPointF &position, + bool consider_informations, + ElementContent *content_ptr) { bool state = true; - + //Consider the informations of the element if (consider_informations) { state = applyInformations(xml_document); } - + if (state) { ElementContent loaded_content = loadContent(xml_document); @@ -550,7 +556,7 @@ void ElementScene::fromXml(const QDomDocument &xml_document, addContentAtPos(loaded_content, position); else addContent(loaded_content); - + if (content_ptr) *content_ptr = loaded_content; } @@ -563,7 +569,8 @@ void ElementScene::fromXml(const QDomDocument &xml_document, It is different from itemsBoundingRect() because it is not supposed to imply any margin. */ -QRectF ElementScene::elementSceneGeometricRect() const{ +QRectF ElementScene::elementSceneGeometricRect() const +{ QRectF esgr; foreach (QGraphicsItem *qgi, items()) { if (qgi->type() == ElementPrimitiveDecorator::Type) continue; @@ -585,8 +592,10 @@ QRectF ElementScene::elementSceneGeometricRect() const{ */ bool ElementScene::containsTerminals() const { - foreach(QGraphicsItem *qgi,items()) { - if (qgraphicsitem_cast(qgi)) { + foreach(QGraphicsItem *qgi,items()) + { + if (qgraphicsitem_cast(qgi)) + { return(true); } } @@ -635,7 +644,8 @@ bool ElementScene::clipboardMayContainElement() true if clipboard_content has been copied from this element. \~French true si clipboard_content a ete copie depuis cet element. */ -bool ElementScene::wasCopiedFromThisElement(const QString &clipboard_content) { +bool ElementScene::wasCopiedFromThisElement(const QString &clipboard_content) +{ return(clipboard_content == m_last_copied); } @@ -665,16 +675,16 @@ void ElementScene::copy() { // accede au presse-papier QClipboard *clipboard = QApplication::clipboard(); - + // genere la description XML de la selection QString clipboard_content = toXml(false).toString(4); - + // met la description XML dans le presse-papier if (clipboard -> supportsSelection()) { clipboard -> setText(clipboard_content, QClipboard::Selection); } clipboard -> setText(clipboard_content); - + // retient le dernier contenu copie m_last_copied = clipboard_content; } @@ -710,7 +720,7 @@ void ElementScene::setElementInfo(const DiagramContext& dc) void ElementScene::slot_select(const ElementContent &content) { blockSignals(true); - + /* Befor clear selection, * we must to remove the handlers items in @content, * because if in @content there are a selected item, @@ -728,7 +738,7 @@ void ElementScene::slot_select(const ElementContent &content) foreach(QGraphicsItem *qgi, items_list) qgi -> setSelected(true); - + blockSignals(false); emit(selectionChanged()); } @@ -776,11 +786,11 @@ void ElementScene::slot_delete() // verifie qu'il y a qqc de selectionne QList selected_items = selectedItems(); if (selected_items.isEmpty()) return; - + // erase everything that is selected // efface tout ce qui est selectionne m_undo_stack.push(new DeletePartsCommand(this, selected_items)); - + // removing items does not trigger QGraphicsScene::selectionChanged() emit(partsRemoved()); emit(selectionChanged()); @@ -798,7 +808,7 @@ void ElementScene::slot_delete() void ElementScene::slot_editAuthorInformations() { bool is_read_only = m_element_editor && m_element_editor -> isReadOnly(); - + // create a dialogue // cree un dialogue QDialog dialog_author(m_element_editor); @@ -807,9 +817,10 @@ void ElementScene::slot_editAuthorInformations() dialog_author.setWindowFlags(Qt::Sheet); #endif dialog_author.setMinimumSize(400, 260); - dialog_author.setWindowTitle(tr("Éditer les informations sur l'auteur", "window title")); + dialog_author.setWindowTitle( + tr("Éditer les informations sur l'auteur", "window title")); QVBoxLayout *dialog_layout = new QVBoxLayout(&dialog_author); - + // adds an explanatory field to the dialogue // ajoute un champ explicatif au dialogue QLabel *information_label = new QLabel(tr("Vous pouvez utiliser ce champ libre pour mentionner les auteurs de l'élément, sa licence, ou tout autre renseignement que vous jugerez utile.")); @@ -824,22 +835,25 @@ void ElementScene::slot_editAuthorInformations() text_field -> setPlainText(informations()); text_field -> setReadOnly(is_read_only); dialog_layout -> addWidget(text_field); - + // ajoute deux boutons au dialogue QDialogButtonBox *dialog_buttons = new QDialogButtonBox( is_read_only ? QDialogButtonBox::Ok : - QDialogButtonBox::Ok - | QDialogButtonBox::Cancel); + QDialogButtonBox::Ok + | QDialogButtonBox::Cancel); dialog_layout -> addWidget(dialog_buttons); connect(dialog_buttons, SIGNAL(accepted()),&dialog_author, SLOT(accept())); connect(dialog_buttons, SIGNAL(rejected()),&dialog_author, SLOT(reject())); // start the dialogue // lance le dialogue - if (dialog_author.exec() == QDialog::Accepted && !is_read_only) { + if (dialog_author.exec() == QDialog::Accepted && !is_read_only) + { QString new_infos = text_field -> toPlainText().remove(QChar(13)); // CR-less text - if (new_infos != informations()) { - undoStack().push(new ChangeInformationsCommand(this, informations(), new_infos)); + if (new_infos != informations()) + { + undoStack().push(new ChangeInformationsCommand( + this, informations(), new_infos)); } } } @@ -853,17 +867,17 @@ void ElementScene::slot_editProperties() QString type = m_elmt_type; DiagramContext kind_info = m_elmt_kindInfo; DiagramContext elmt_info = m_elmt_information; - + ElementPropertiesEditorWidget epew(type, kind_info, elmt_info); epew.exec(); - + if (type != m_elmt_type || kind_info != m_elmt_kindInfo || elmt_info != m_elmt_information) undoStack().push(new ChangePropertiesCommand(this, - type, - kind_info, - elmt_info)); + type, + kind_info, + elmt_info)); } /** @@ -873,19 +887,19 @@ void ElementScene::slot_editProperties() void ElementScene::slot_editNames() { bool is_read_only = m_element_editor && m_element_editor -> isReadOnly(); - + NameListDialog dialog_(m_element_editor); - + dialog_.setModal(true); dialog_.setMinimumSize(400, 330); dialog_.setWindowTitle(tr("Éditer les noms", "window title")); - + dialog_.setInformationText(tr("Vous pouvez spécifier le nom de l'élément dans plusieurs langues.")); - + NameListWidget *nlw_ = dialog_.namelistWidget(); nlw_->setNames(m_names_list); nlw_->setReadOnly(is_read_only); - + if (dialog_.exec() == QDialog::Accepted && !is_read_only && !nlw_->isEmpty()) { NamesList new_names = nlw_->names(); @@ -904,8 +918,10 @@ void ElementScene::slot_editNames() QList ElementScene::primitives() const { QList primitives_list; - foreach (QGraphicsItem *item, items()) { - if (CustomElementPart *primitive = dynamic_cast(item)) { + foreach (QGraphicsItem *item, items()) + { + if (CustomElementPart *primitive = dynamic_cast(item)) + { primitives_list << primitive; } } @@ -923,14 +939,15 @@ QList ElementScene::zItems(ItemOptions options) const // handle dummy request, i.e. when neither Selected nor NonSelected are set if (!(options & ElementScene::Selected) && - !(options & ElementScene::NonSelected)) { + !(options & ElementScene::NonSelected)) + { return(QList()); } - + // retrieve all items QList all_items_list(items()); QMutableListIterator i(all_items_list); - + // remove unrequired items if ((options & ElementScene::SelectedOrNot) != ElementScene::SelectedOrNot) { @@ -941,10 +958,11 @@ QList ElementScene::zItems(ItemOptions options) const } } } - + QList terminals; QList helpers; - for (i.toFront(); i.hasNext(); ) { + for (i.toFront(); i.hasNext(); ) + { i.next(); QGraphicsItem *qgi = i.value(); if ( @@ -955,26 +973,31 @@ QList ElementScene::zItems(ItemOptions options) const i.remove(); helpers << qgi; } - else if (qgraphicsitem_cast(qgi)) { + else if (qgraphicsitem_cast(qgi)) + { i.remove(); terminals << qgi; } } - + // orders the parts by their zValue // ordonne les parties par leur zValue - if (options & SortByZValue) { - std::sort (all_items_list.begin(), - all_items_list.end(), - ElementScene::zValueLessThan); + if (options & SortByZValue) + { + std::sort ( + all_items_list.begin(), + all_items_list.end(), + ElementScene::zValueLessThan); } - + // possibly add the limits // rajoute eventuellement les bornes - if (options & ElementScene::IncludeTerminals) { + if (options & ElementScene::IncludeTerminals) + { all_items_list += terminals; } - if (options & ElementScene::IncludeHelperItems) { + if (options & ElementScene::IncludeHelperItems) + { all_items_list += helpers; } return(all_items_list); @@ -988,7 +1011,8 @@ QList ElementScene::zItems(ItemOptions options) const ElementContent ElementScene::selectedContent() const { ElementContent content; - foreach(QGraphicsItem *qgi, zItems()) { + foreach(QGraphicsItem *qgi, zItems()) + { if (qgi -> isSelected()) content << qgi; } return(content); @@ -1001,7 +1025,8 @@ ElementContent ElementScene::selectedContent() const \~ @return the rectangle where you will have to glue these parts \~French le rectangle ou il faudra coller ces parties */ -void ElementScene::getPasteArea(const QRectF &to_paste) { +void ElementScene::getPasteArea(const QRectF &to_paste) +{ // we draw it on the stage // on le dessine sur la scene m_paste_area -> setRect(to_paste); @@ -1028,7 +1053,7 @@ void ElementScene::reset() if(qgi->type() != QetGraphicsHandlerItem::Type) items_list << qgi; } - + for (QGraphicsItem *qgi : items_list) { removeItem(qgi); @@ -1079,7 +1104,7 @@ bool ElementScene::applyInformations(const QDomDocument &xml_document) { // Root must be an element definition QDomElement root = xml_document.documentElement(); - + if ( root.tagName() != "definition" || @@ -1098,12 +1123,12 @@ bool ElementScene::applyInformations(const QDomDocument &xml_document) //Extract names of xml definition m_names_list.fromXml(root); - + //extract additional informations setInformations(QString()); for (QDomNode node = root.firstChild() ; - !node.isNull() ; - node = node.nextSibling()) + !node.isNull() ; + node = node.nextSibling()) { QDomElement elmt = node.toElement(); if (elmt.isNull()) continue; @@ -1113,7 +1138,7 @@ bool ElementScene::applyInformations(const QDomDocument &xml_document) break; } } - + return(true); } @@ -1126,20 +1151,20 @@ bool ElementScene::applyInformations(const QDomDocument &xml_document) ElementContent ElementScene::loadContent(const QDomDocument &xml_document) { ElementContent loaded_parts; - + // The root is supposed to be an element definition QDomElement root = xml_document.documentElement(); - + if (root.tagName() != "definition" || root.attribute("type") != "element") return(loaded_parts); - + //Load the graphic description of the element for (QDomNode node = root.firstChild() ; !node.isNull() ; node = node.nextSibling()) { QDomElement elmts = node.toElement(); if (elmts.isNull()) continue; - + if (elmts.tagName() == "description") { int z = 1; @@ -1150,7 +1175,7 @@ ElementContent ElementScene::loadContent(const QDomDocument &xml_document) continue; CustomElementPart *cep = nullptr; PartDynamicTextField *pdtf = nullptr; - + if (qde.tagName() == "line") cep = new PartLine (m_element_editor); else if (qde.tagName() == "rect") cep = new PartRectangle(m_element_editor); else if (qde.tagName() == "ellipse") cep = new PartEllipse (m_element_editor); @@ -1163,14 +1188,14 @@ ElementContent ElementScene::loadContent(const QDomDocument &xml_document) //For the input (aka the old text field) we try to convert it to the new partDynamicTextField else if (qde.tagName() == "input") cep = pdtf = new PartDynamicTextField(m_element_editor); else continue; - + if (QGraphicsItem *qgi = dynamic_cast(cep)) { if (!qgi->zValue()) qgi->setZValue(z++); - + loaded_parts<fromTextFieldXml(qde); else @@ -1181,7 +1206,7 @@ ElementContent ElementScene::loadContent(const QDomDocument &xml_document) } } } - + return(loaded_parts); } @@ -1195,7 +1220,8 @@ ElementContent ElementScene::loadContent(const QDomDocument &xml_document) \~ @return Content adds \~French Le contenu ajoute */ -ElementContent ElementScene::addContent(const ElementContent &content) { +ElementContent ElementScene::addContent(const ElementContent &content) +{ foreach(QGraphicsItem *part, content) { addPrimitive(part); } @@ -1215,19 +1241,21 @@ ElementContent ElementScene::addContent(const ElementContent &content) { \~ @return Content adds \~French Le contenu ajoute */ -ElementContent ElementScene::addContentAtPos(const ElementContent &content, - const QPointF &pos) { +ElementContent ElementScene::addContentAtPos( + const ElementContent &content, + const QPointF &pos) +{ // calculate the boundingRect of the content to add // calcule le boundingRect du contenu a ajouter QRectF bounding_rect = elementContentBoundingRect(content); - + /* deduced the offset to be applied to the parts to place * them at the point requested * en deduit le decalage a appliquer aux parties pour les poser * au point demander */ QPointF offset = pos - bounding_rect.topLeft(); - + // add the parts with the correct offset // ajoute les parties avec le decalage adequat foreach(QGraphicsItem *part, content) { @@ -1243,7 +1271,8 @@ ElementContent ElementScene::addContentAtPos(const ElementContent &content, ElementPrimitiveDecorator group. @param primitive */ -void ElementScene::addPrimitive(QGraphicsItem *primitive) { +void ElementScene::addPrimitive(QGraphicsItem *primitive) +{ if (!primitive) return; addItem(primitive); } @@ -1257,15 +1286,15 @@ void ElementScene::initPasteArea() { m_paste_area = new QGraphicsRectItem(); m_paste_area -> setZValue(1000000); - + QPen paste_area_pen; paste_area_pen.setStyle(Qt::DashDotLine); paste_area_pen.setColor(QColor(30, 56, 86, 255)); - + QBrush paste_area_brush; paste_area_brush.setStyle(Qt::SolidPattern); paste_area_brush.setColor(QColor(90, 167, 255, 64)); - + m_paste_area -> setPen(paste_area_pen); m_paste_area -> setBrush(paste_area_brush); } @@ -1281,7 +1310,8 @@ void ElementScene::initPasteArea() \~French une reference vers un QPointF. Cet objet sera modifie. \~ @return point */ -QPointF ElementScene::snapToGrid(QPointF point) { +QPointF ElementScene::snapToGrid(QPointF point) +{ point.rx() = qRound(point.x() / m_x_grid) * m_x_grid; point.ry() = qRound(point.y() / m_y_grid) * m_y_grid; return point; @@ -1293,7 +1323,8 @@ QPointF ElementScene::snapToGrid(QPointF point) { @param item2 : QGraphicsItem @return true if \a item1's zValue() is less than \a item2's. */ -bool ElementScene::zValueLessThan(QGraphicsItem *item1, QGraphicsItem *item2) { +bool ElementScene::zValueLessThan(QGraphicsItem *item1, QGraphicsItem *item2) +{ return(item1-> zValue() < item2 -> zValue()); } @@ -1335,7 +1366,7 @@ void ElementScene::managePrimitivesGroups() //this function is not supposed to be reentrant if (!m_decorator_lock->tryLock()) return; - + if (!m_decorator) { m_decorator = new ElementPrimitiveDecorator(); @@ -1345,7 +1376,7 @@ void ElementScene::managePrimitivesGroups() addItem(m_decorator); m_decorator -> hide(); } - + // should we hide the decorator? QList selected_items = zItems( ElementScene::Selected @@ -1376,13 +1407,14 @@ void ElementScene::managePrimitivesGroups() Push the provided \a command on the undo stack. @param command */ -void ElementScene::stackAction(ElementEditionCommand *command) { +void ElementScene::stackAction(ElementEditionCommand *command) +{ if (command -> elementScene()) { if (command -> elementScene() != this) return; } else { command -> setElementScene(this); } - + if (!command -> elementView()) { foreach (QGraphicsView *view, views()) { if (ElementView *element_view = @@ -1392,6 +1424,6 @@ void ElementScene::stackAction(ElementEditionCommand *command) { } } } - + undoStack().push(command); }