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
-
-
-
-
+
+
+
+
-