diff --git a/sources/qetgraphicsitem/qetshapeitem.cpp b/sources/qetgraphicsitem/qetshapeitem.cpp index 1a1c148cc..4bd850794 100644 --- a/sources/qetgraphicsitem/qetshapeitem.cpp +++ b/sources/qetgraphicsitem/qetshapeitem.cpp @@ -22,6 +22,7 @@ #include "shapegraphicsitempropertieswidget.h" #include "PropertiesEditor/propertieseditordialog.h" #include "QPropertyUndoCommand/qpropertyundocommand.h" +#include "qetxml.h" /** * @brief QetShapeItem::QetShapeItem @@ -38,7 +39,6 @@ QetShapeItem::QetShapeItem(QPointF p1, QPointF p2, ShapeType type, QGraphicsItem m_P2 (p2), m_hovered(false), m_mouse_grab_handler(false), - shape_size(1), m_handler(10) { if (type == Polygon) m_polygon << m_P1 << m_P2; @@ -201,7 +201,7 @@ QPainterPath QetShapeItem::shape() const } QPainterPathStroker pps; - pps.setWidth(m_hovered? 10 : 1); + pps.setWidth(m_hovered? m_pen.widthF()+10 : m_pen.widthF()); pps.setJoinStyle(Qt::RoundJoin); path = pps.createStroke(path); @@ -237,9 +237,8 @@ void QetShapeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti Q_UNUSED(option); Q_UNUSED(widget); painter->save(); - painter -> setRenderHint(QPainter::Antialiasing, false); - m_pen.setColor(isSelected()? Qt::red : Qt::black); - painter -> setPen(m_pen); + painter->setRenderHint(QPainter::Antialiasing, true); + painter->setPen(m_pen); //Draw hovered shadow if (m_hovered) @@ -458,11 +457,10 @@ bool QetShapeItem::fromXml(const QDomElement &e) if (e.tagName() != "shape") return (false); is_movable_ = (e.attribute("is_movable").toInt()); - m_pen.setStyle(Qt::PenStyle(e.attribute("style","0").toInt())); - m_pen.setWidthF(e.attribute("size", QString::number(shape_size)).toDouble()); + m_pen = QETXML::penFromXml(e.firstChildElement("pen")); QString type = e.attribute("type"); - //Compatibility for version older than N°4075, shape type was stored with an int + //@TODO Compatibility for version older than N°4075, shape type was stored with an int if (type.size() == 1) { switch(e.attribute("type","0").toInt()) @@ -507,8 +505,7 @@ QDomElement QetShapeItem::toXml(QDomDocument &document) const //write some attribute QMetaEnum me = metaObject()->enumerator(metaObject()->indexOfEnumerator("ShapeType")); result.setAttribute("type", me.valueToKey(m_shapeType)); - result.setAttribute("style", QString::number(m_pen.style())); - result.setAttribute("size", QString::number(m_pen.widthF())); + result.appendChild(QETXML::penToXml(document, m_pen)); result.setAttribute("is_movable", bool(is_movable_)); if (m_shapeType != Polygon) { diff --git a/sources/qetgraphicsitem/qetshapeitem.h b/sources/qetgraphicsitem/qetshapeitem.h index 1638833bb..b3192748e 100644 --- a/sources/qetgraphicsitem/qetshapeitem.h +++ b/sources/qetgraphicsitem/qetshapeitem.h @@ -47,7 +47,7 @@ class QetShapeItem : public QetGraphicsItem enum ShapeType {Line =1, Rectangle =2, Ellipse =4, - Polygon =8 }; + Polygon =8 }; enum { Type = UserType + 1008 }; @@ -103,7 +103,6 @@ class QetShapeItem : public QetGraphicsItem bool m_hovered, m_mouse_grab_handler; int m_vector_index; - double shape_size; QetGraphicsHandlerUtility m_handler; }; #endif // QETSHAPEITEM_H diff --git a/sources/qetxml.cpp b/sources/qetxml.cpp new file mode 100644 index 000000000..2d6badd7a --- /dev/null +++ b/sources/qetxml.cpp @@ -0,0 +1,73 @@ +/* + Copyright 2006-2015 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 . +*/ +#include "qetxml.h" +#include + +/** + * @brief QETXML::penToXml + * Write attribute of a QPen in xml element + * @param parent_document : parent document for create the QDomElement + * @param pen : the pen to store + * @return : A QDomElement with the attribute stored. The tagName of QDomeElement is "pen". + */ +QDomElement QETXML::penToXml(QDomDocument &parent_document,QPen pen) +{ + QDomElement element = parent_document.createElement("pen"); + + QString style; + switch(pen.style()) + { + case Qt::SolidLine : style = "SolidLine"; break; + case Qt::DashLine : style = "DashLine"; break; + case Qt::DotLine : style = "DotLine"; break; + case Qt::DashDotLine : style = "DashDotLine"; break; + case Qt::DashDotDotLine : style = "DashDotDotLine"; break; + default : style = "Unknow"; break; + } + + element.setAttribute("style", style); + element.setAttribute("color", pen.color().name()); + element.setAttribute("widthF", pen.widthF()); + return element; +} + +/** + * @brief QETXML::penFromXml + * Build a QPen from a xml description + * @param element, The QDomElement that describe the pen + * @return the created pen. If @element is null or tagName isn't "pen" + * return a default constructed QPen + */ +QPen QETXML::penFromXml(const QDomElement &element) +{ + QPen pen; + + if (!(!element.isNull() && element.tagName() == "pen")) return pen; + + QString style = element.attribute("style", "DashLine"); + if (style == "SolidLine") pen.setStyle(Qt::SolidLine); + else if (style == "DashLine") pen.setStyle(Qt::DashLine); + else if (style == "DotLine") pen.setStyle(Qt::DotLine); + else if (style == "DashDotLine") pen.setStyle(Qt::DashDotLine); + else if (style == "DashDotDotLine") pen.setStyle(Qt::DashDotDotLine); + else pen.setStyle(Qt::DashLine); + + pen.setColor(QColor(element.attribute("color", "#000000"))); + pen.setWidthF(element.attribute("widthF", "1").toDouble()); + return pen; +} diff --git a/sources/qetxml.h b/sources/qetxml.h new file mode 100644 index 000000000..98ec6797d --- /dev/null +++ b/sources/qetxml.h @@ -0,0 +1,34 @@ +/* + Copyright 2006-2015 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 QETXML_H +#define QETXML_H + +#include +#include + +/** + *This namespace contain some function to use xml with QET. + */ +namespace QETXML +{ + QDomElement penToXml(QDomDocument &parent_document, QPen pen); + QPen penFromXml (const QDomElement &element); + +} + +#endif // QETXML_H diff --git a/sources/ui/shapegraphicsitempropertieswidget.cpp b/sources/ui/shapegraphicsitempropertieswidget.cpp index a56713cd2..07f93bbaf 100644 --- a/sources/ui/shapegraphicsitempropertieswidget.cpp +++ b/sources/ui/shapegraphicsitempropertieswidget.cpp @@ -55,14 +55,13 @@ void ShapeGraphicsItemPropertiesWidget::setItem(QetShapeItem *shape) if (!shape) return; if (shape == m_shape) return; - if (m_shape) + if (m_shape && m_live_edit) disconnect(m_shape, &QetShapeItem::penChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); - disconnect(m_shape, &QetShapeItem::widthChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); m_shape = shape; - connect(m_shape, &QetShapeItem::penChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); - connect(m_shape, &QetShapeItem::widthChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); + if (m_live_edit) + connect(m_shape, &QetShapeItem::penChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); updateUi(); } @@ -73,16 +72,10 @@ void ShapeGraphicsItemPropertiesWidget::setItem(QetShapeItem *shape) * undo stack of the shape diagram. */ void ShapeGraphicsItemPropertiesWidget::apply() -{ - if (m_live_edit) - disconnect(m_shape, &QetShapeItem::penChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); - +{ if (m_shape->diagram()) if (QUndoCommand *undo = associatedUndo()) m_shape->diagram()->undoStack().push(undo); - - if (m_live_edit) - connect(m_shape, &QetShapeItem::penChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); } /** @@ -96,15 +89,18 @@ void ShapeGraphicsItemPropertiesWidget::reset() { /** * @brief ShapeGraphicsItemPropertiesWidget::associatedUndo * @return an undo command that represent the change edited by this widget. - * The returned undo command is a ChangeShapeStyleCommand. + * The returned undo command is a QPropertyUndoCommand with the properties "pen". * If there isn't change, return nullptr */ QUndoCommand* ShapeGraphicsItemPropertiesWidget::associatedUndo() const { QPen old_pen = m_shape->pen(); QPen new_pen = old_pen; + new_pen.setStyle(Qt::PenStyle(ui->m_style_cb->currentIndex() + 1)); - new_pen.setWidthF(ui->m_size_cb->value()); + new_pen.setWidthF(ui->m_size_dsb->value()); + new_pen.setColor(ui->m_color_pb->palette().color(QPalette::Button)); + if (new_pen == old_pen) return nullptr; QPropertyUndoCommand *undo = new QPropertyUndoCommand(m_shape, "pen", old_pen, new_pen); @@ -117,9 +113,13 @@ QUndoCommand* ShapeGraphicsItemPropertiesWidget::associatedUndo() const */ void ShapeGraphicsItemPropertiesWidget::updateUi() { + bool le = m_live_edit; + setLiveEdit(false); //Disable temporally live edit mode to avoid weird behavior ui->m_style_cb->setCurrentIndex(static_cast(m_shape->pen().style()) - 1); - ui->m_size_cb ->setValue(m_shape->pen().widthF()); + ui->m_size_dsb ->setValue(m_shape->pen().widthF()); + setColorButton(m_shape->pen().color()); ui->m_lock_pos_cb->setChecked(!m_shape->isMovable()); + setLiveEdit(le); } /** @@ -132,15 +132,46 @@ bool ShapeGraphicsItemPropertiesWidget::setLiveEdit(bool live_edit) if (live_edit == m_live_edit) return true; m_live_edit = live_edit; - if (m_live_edit){ + if (m_live_edit) + { connect (ui->m_style_cb, SIGNAL(activated(int)), this, SLOT(apply())); - connect (ui->m_size_cb, SIGNAL(valueChanged(double)), this, SLOT(apply())); - }else + connect (ui->m_size_dsb, SIGNAL(valueChanged(double)), this, SLOT(apply())); + connect (m_shape, &QetShapeItem::penChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); + } + else + { disconnect (ui->m_style_cb, SIGNAL(activated(int)), this, SLOT(apply())); - disconnect (ui->m_size_cb, SIGNAL(valueChanged(double)), this, SLOT(apply())); + disconnect (ui->m_size_dsb, SIGNAL(valueChanged(double)), this, SLOT(apply())); + disconnect (m_shape, &QetShapeItem::penChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); + } return true; } +/** + * @brief ShapeGraphicsItemPropertiesWidget::setColorButton + * Set the color of the push button to the current color of the shape + * @param color + */ +void ShapeGraphicsItemPropertiesWidget::setColorButton(const QColor &color) +{ + QPalette palette; + palette.setColor(QPalette::Button, color); + ui -> m_color_pb -> setStyleSheet(QString("background-color: %1; min-height: 1.5em; border-style: outset; border-width: 2px; border-color: gray; border-radius: 4px;").arg(color.name())); +} + void ShapeGraphicsItemPropertiesWidget::on_m_lock_pos_cb_clicked() { m_shape->setMovable(!ui->m_lock_pos_cb->isChecked()); } + +/** + * @brief ShapeGraphicsItemPropertiesWidget::on_m_color_pb_clicked + * Color button was clicked, we open a QColorDialog for select the color to apply to the shape. + */ +void ShapeGraphicsItemPropertiesWidget::on_m_color_pb_clicked() +{ + QColor color = QColorDialog::getColor(m_shape->pen().color(), this); + if (color.isValid()) + setColorButton(color); + if(m_live_edit) + apply(); +} diff --git a/sources/ui/shapegraphicsitempropertieswidget.h b/sources/ui/shapegraphicsitempropertieswidget.h index 032e496d2..b92daadda 100644 --- a/sources/ui/shapegraphicsitempropertieswidget.h +++ b/sources/ui/shapegraphicsitempropertieswidget.h @@ -49,8 +49,12 @@ class ShapeGraphicsItemPropertiesWidget : public PropertiesEditorWidget virtual void updateUi(); virtual bool setLiveEdit(bool live_edit); + private: + void setColorButton(const QColor &color); + private slots: void on_m_lock_pos_cb_clicked(); + void on_m_color_pb_clicked(); private: Ui::ShapeGraphicsItemPropertiesWidget *ui; diff --git a/sources/ui/shapegraphicsitempropertieswidget.ui b/sources/ui/shapegraphicsitempropertieswidget.ui index aba8c8988..301f80939 100644 --- a/sources/ui/shapegraphicsitempropertieswidget.ui +++ b/sources/ui/shapegraphicsitempropertieswidget.ui @@ -6,8 +6,8 @@ 0 0 - 242 - 183 + 261 + 170 @@ -15,86 +15,101 @@ - - - - - Type de trait - - - - - - + + + Trait + + + + - Normal + Épaisseur - - + + + + + + + Normal + + + + + Tiret + + + + + Pointillé + + + + + Traits et points + + + + + Traits points points + + + + + + + + + 16777212 + 16777215 + + + + QAbstractSpinBox::UpDownArrows + + + true + + + QAbstractSpinBox::CorrectToNearestValue + + + 0.400000000000000 + + + 50.000000000000000 + + + 0.200000000000000 + + + 1.000000000000000 + + + + + - Tiret + Type - - + + + + - Pointillé + Couleur - - + + + + - Traits et points + - - - - Traits points points - - - - - - - - - - - - Epaisseur de trait - - - - - - - - 16777212 - 16777215 - - - - true - - - true - - - QAbstractSpinBox::CorrectToNearestValue - - - 0.400000000000000 - - - 50.000000000000000 - - - 0.200000000000000 - - - 1.000000000000000 - - - - + + + +