[qet] [4303] QetShapeItem : add color and improve the GUI,. |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
Revision: 4303
Author: blacksun
Date: 2016-01-03 14:45:30 +0100 (Sun, 03 Jan 2016)
Log Message:
-----------
QetShapeItem : add color and improve the GUI,.
the xml saving is break from previous version.
Modified Paths:
--------------
trunk/sources/qetgraphicsitem/qetshapeitem.cpp
trunk/sources/qetgraphicsitem/qetshapeitem.h
trunk/sources/ui/shapegraphicsitempropertieswidget.cpp
trunk/sources/ui/shapegraphicsitempropertieswidget.h
trunk/sources/ui/shapegraphicsitempropertieswidget.ui
Added Paths:
-----------
trunk/sources/qetxml.cpp
trunk/sources/qetxml.h
Modified: trunk/sources/qetgraphicsitem/qetshapeitem.cpp
===================================================================
--- trunk/sources/qetgraphicsitem/qetshapeitem.cpp 2016-01-03 04:53:09 UTC (rev 4302)
+++ trunk/sources/qetgraphicsitem/qetshapeitem.cpp 2016-01-03 13:45:30 UTC (rev 4303)
@@ -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 @@
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 @@
}
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 @@
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 @@
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 @@
//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)
{
Modified: trunk/sources/qetgraphicsitem/qetshapeitem.h
===================================================================
--- trunk/sources/qetgraphicsitem/qetshapeitem.h 2016-01-03 04:53:09 UTC (rev 4302)
+++ trunk/sources/qetgraphicsitem/qetshapeitem.h 2016-01-03 13:45:30 UTC (rev 4303)
@@ -47,7 +47,7 @@
enum ShapeType {Line =1,
Rectangle =2,
Ellipse =4,
- Polygon =8 };
+ Polygon =8 };
enum { Type = UserType + 1008 };
@@ -103,7 +103,6 @@
bool m_hovered,
m_mouse_grab_handler;
int m_vector_index;
- double shape_size;
QetGraphicsHandlerUtility m_handler;
};
#endif // QETSHAPEITEM_H
Added: trunk/sources/qetxml.cpp
===================================================================
--- trunk/sources/qetxml.cpp (rev 0)
+++ trunk/sources/qetxml.cpp 2016-01-03 13:45:30 UTC (rev 4303)
@@ -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 <http://www.gnu.org/licenses/>.
+*/
+#include "qetxml.h"
+#include <QPen>
+
+/**
+ * @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;
+}
Added: trunk/sources/qetxml.h
===================================================================
--- trunk/sources/qetxml.h (rev 0)
+++ trunk/sources/qetxml.h 2016-01-03 13:45:30 UTC (rev 4303)
@@ -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 <http://www.gnu.org/licenses/>.
+*/
+#ifndef QETXML_H
+#define QETXML_H
+
+#include <QDomDocument>
+#include <QPen>
+
+/**
+ *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
Modified: trunk/sources/ui/shapegraphicsitempropertieswidget.cpp
===================================================================
--- trunk/sources/ui/shapegraphicsitempropertieswidget.cpp 2016-01-03 04:53:09 UTC (rev 4302)
+++ trunk/sources/ui/shapegraphicsitempropertieswidget.cpp 2016-01-03 13:45:30 UTC (rev 4303)
@@ -55,14 +55,13 @@
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 @@
* 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 @@
/**
* @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 @@
*/
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<int>(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 @@
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();
+}
Modified: trunk/sources/ui/shapegraphicsitempropertieswidget.h
===================================================================
--- trunk/sources/ui/shapegraphicsitempropertieswidget.h 2016-01-03 04:53:09 UTC (rev 4302)
+++ trunk/sources/ui/shapegraphicsitempropertieswidget.h 2016-01-03 13:45:30 UTC (rev 4303)
@@ -49,8 +49,12 @@
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;
Modified: trunk/sources/ui/shapegraphicsitempropertieswidget.ui
===================================================================
--- trunk/sources/ui/shapegraphicsitempropertieswidget.ui 2016-01-03 04:53:09 UTC (rev 4302)
+++ trunk/sources/ui/shapegraphicsitempropertieswidget.ui 2016-01-03 13:45:30 UTC (rev 4303)
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>242</width>
- <height>183</height>
+ <width>261</width>
+ <height>170</height>
</rect>
</property>
<property name="windowTitle">
@@ -15,88 +15,103 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Type de trait</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="m_style_cb">
- <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Trait</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
<property name="text">
- <string>Normal</string>
+ <string>Épaisseur</string>
</property>
- </item>
- <item>
- <property name="text">
- <string>Tiret</string>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="m_style_cb">
+ <item>
+ <property name="text">
+ <string>Normal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Tiret</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Pointillé</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Traits et points</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Traits points points</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QDoubleSpinBox" name="m_size_dsb">
+ <property name="maximumSize">
+ <size>
+ <width>16777212</width>
+ <height>16777215</height>
+ </size>
</property>
- </item>
- <item>
+ <property name="buttonSymbols">
+ <enum>QAbstractSpinBox::UpDownArrows</enum>
+ </property>
+ <property name="accelerated">
+ <bool>true</bool>
+ </property>
+ <property name="correctionMode">
+ <enum>QAbstractSpinBox::CorrectToNearestValue</enum>
+ </property>
+ <property name="minimum">
+ <double>0.400000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>50.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>0.200000000000000</double>
+ </property>
+ <property name="value">
+ <double>1.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
<property name="text">
- <string>Pointillé</string>
+ <string>Type</string>
</property>
- </item>
- <item>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_3">
<property name="text">
- <string>Traits et points</string>
+ <string>Couleur</string>
</property>
- </item>
- <item>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QPushButton" name="m_color_pb">
<property name="text">
- <string>Traits points points</string>
+ <string/>
</property>
- </item>
- </widget>
- </item>
- </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
</item>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <item>
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Epaisseur de trait</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDoubleSpinBox" name="m_size_cb">
- <property name="maximumSize">
- <size>
- <width>16777212</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="wrapping">
- <bool>true</bool>
- </property>
- <property name="accelerated">
- <bool>true</bool>
- </property>
- <property name="correctionMode">
- <enum>QAbstractSpinBox::CorrectToNearestValue</enum>
- </property>
- <property name="minimum">
- <double>0.400000000000000</double>
- </property>
- <property name="maximum">
- <double>50.000000000000000</double>
- </property>
- <property name="singleStep">
- <double>0.200000000000000</double>
- </property>
- <property name="value">
- <double>1.000000000000000</double>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
<widget class="QCheckBox" name="m_lock_pos_cb">
<property name="text">
<string>Verrouiller la position</string>