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


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/