From b9013a8914b2ec03511bd6131f27fa6e5f52a152 Mon Sep 17 00:00:00 2001 From: blacksun Date: Tue, 1 Aug 2017 19:09:31 +0000 Subject: [PATCH] Add bicolor conductor git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@4999 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- sources/conductorproperties.cpp | 118 ++++++++++++++++++----- sources/conductorproperties.h | 24 +++-- sources/qetgraphicsitem/conductor.cpp | 50 ++++++---- sources/ui/conductorpropertieswidget.cpp | 35 ++++++- sources/ui/conductorpropertieswidget.h | 3 + sources/ui/conductorpropertieswidget.ui | 51 +++++++++- 6 files changed, 229 insertions(+), 52 deletions(-) diff --git a/sources/conductorproperties.cpp b/sources/conductorproperties.cpp index a42217f2e..c3a4013c8 100644 --- a/sources/conductorproperties.cpp +++ b/sources/conductorproperties.cpp @@ -250,6 +250,10 @@ void ConductorProperties::toXml(QDomElement &e) const if (color != QColor(Qt::black)) e.setAttribute("color", color.name()); + e.setAttribute("bicolor", m_bicolor? "true" : "false"); + e.setAttribute("color2", m_color_2.name()); + e.setAttribute("dash-size", QString::number(m_dash_size)); + if (type == Single) singleLineProperties.toXml(e); @@ -281,6 +285,14 @@ void ConductorProperties::fromXml(QDomElement &e) QColor xml_color= QColor(e.attribute("color")); color = (xml_color.isValid()? xml_color : QColor(Qt::black)); + QString bicolor_str = e.attribute("bicolor", "false"); + m_bicolor = bicolor_str == "true"? true : false; + + QColor xml_color_2 = QColor(e.attribute("color2")); + m_color_2 = xml_color_2.isValid()? xml_color_2 : QColor(Qt::black); + + m_dash_size = e.attribute("dash-size", QString::number(1)).toInt(); + // read style of conductor readStyle(e.attribute("style")); @@ -317,6 +329,9 @@ void ConductorProperties::fromXml(QDomElement &e) void ConductorProperties::toSettings(QSettings &settings, const QString &prefix) const { settings.setValue(prefix + "color", color.name()); + settings.setValue(prefix + "bicolor", m_bicolor); + settings.setValue(prefix + "color2", m_color_2.name()); + settings.setValue(prefix + "dash-size", m_dash_size); settings.setValue(prefix + "style", writeStyle()); settings.setValue(prefix + "type", typeToString(type)); settings.setValue(prefix + "text", text); @@ -341,6 +356,12 @@ void ConductorProperties::fromSettings(QSettings &settings, const QString &prefi QColor settings_color = QColor(settings.value(prefix + "color").toString()); color = (settings_color.isValid()? settings_color : QColor(Qt::black)); + QColor settings_color_2 = QColor(settings.value(prefix + "color2").toString()); + m_color_2 = (settings_color_2.isValid()? settings_color_2 : QColor(Qt::black)); + + m_bicolor = settings.value(prefix + "bicolor", false).toBool(); + m_dash_size = settings.value(prefix + "dash-size", 1).toInt(); + QString setting_type = settings.value(prefix + "type", typeToString(Multi)).toString(); type = (setting_type == typeToString(Single)? Single : Multi); @@ -388,13 +409,18 @@ void ConductorProperties::setText(QString text) { */ void ConductorProperties::applyForEqualAttributes(QList list) { - if (list.isEmpty()) + const QList clist = list; + + if (clist.isEmpty()) return; - if (list.size() == 1) + if (clist.size() == 1) { - ConductorProperties cp = list.first(); + ConductorProperties cp = clist.first(); color = cp.color; + m_bicolor = cp.m_bicolor; + m_color_2 = cp.m_color_2; + m_dash_size = cp.m_dash_size; text = cp.text; m_formula = cp.m_formula; m_function = cp.m_function; @@ -410,9 +436,15 @@ void ConductorProperties::applyForEqualAttributes(QList lis } bool equal = true; + QColor c_value; + bool b_value; + QString s_value; + int i_value; + double d_value; + //Color - QColor c_value = list.first().color; - foreach(ConductorProperties cp, list) + c_value = clist.first().color; + for(ConductorProperties cp : clist) { if (cp.color != c_value) equal = false; @@ -420,10 +452,43 @@ void ConductorProperties::applyForEqualAttributes(QList lis if (equal) color = c_value; equal = true; + + //bicolor + b_value = clist.first().m_bicolor; + for(ConductorProperties cp : clist) + { + if (cp.m_bicolor != b_value) + equal = false; + } + if (equal) + m_bicolor = b_value; + equal = true; + + //second color + c_value = clist.first().m_color_2; + for(ConductorProperties cp : clist) + { + if (cp.m_color_2 != c_value) + equal = false; + } + if (equal) + m_color_2 = c_value; + equal = true; + + //Dash size + i_value = clist.first().m_dash_size; + for(ConductorProperties cp : clist) + { + if (cp.m_dash_size != i_value) + equal = false; + } + if (equal) + m_dash_size = i_value; + equal = true; //text - QString s_value = list.first().text; - foreach(ConductorProperties cp, list) + s_value = clist.first().text; + for(ConductorProperties cp : clist) { if (cp.text != s_value) equal = false; @@ -433,8 +498,8 @@ void ConductorProperties::applyForEqualAttributes(QList lis equal = true; //formula - s_value = list.first().m_formula; - foreach(ConductorProperties cp, list) + s_value = clist.first().m_formula; + for(ConductorProperties cp : clist) { if (cp.m_formula != s_value) equal = false; @@ -444,8 +509,8 @@ void ConductorProperties::applyForEqualAttributes(QList lis equal = true; //function - s_value = list.first().m_function; - foreach(ConductorProperties cp, list) + s_value = clist.first().m_function; + for(ConductorProperties cp : clist) { if (cp.m_function != s_value) equal = false; @@ -455,8 +520,8 @@ void ConductorProperties::applyForEqualAttributes(QList lis equal = true; //Tension protocol - s_value = list.first().m_tension_protocol; - foreach(ConductorProperties cp, list) + s_value = clist.first().m_tension_protocol; + for(ConductorProperties cp : clist) { if (cp.m_tension_protocol != s_value) equal = false; @@ -466,8 +531,8 @@ void ConductorProperties::applyForEqualAttributes(QList lis equal = true; //text size - int i_value = list.first().text_size; - foreach(ConductorProperties cp, list) + i_value = clist.first().text_size; + for(ConductorProperties cp : clist) { if (cp.text_size != i_value) equal = false; @@ -477,8 +542,8 @@ void ConductorProperties::applyForEqualAttributes(QList lis equal = true; //conductor size - double d_value = list.first().cond_size; - foreach(ConductorProperties cp, list) + d_value = clist.first().cond_size; + for(ConductorProperties cp : clist) { if (cp.cond_size != d_value) equal = false; @@ -488,8 +553,8 @@ void ConductorProperties::applyForEqualAttributes(QList lis equal = true; //show text - bool b_value = list.first().m_show_text; - foreach(ConductorProperties cp, list) + b_value = clist.first().m_show_text; + for(ConductorProperties cp : clist) { if (cp.m_show_text != b_value) equal = false; @@ -499,8 +564,8 @@ void ConductorProperties::applyForEqualAttributes(QList lis equal = true; //One text per folio - b_value = list.first().m_one_text_per_folio; - foreach(ConductorProperties cp, list) + b_value = clist.first().m_one_text_per_folio; + for(ConductorProperties cp : clist) { if (cp.m_one_text_per_folio != b_value) equal = false; @@ -510,8 +575,8 @@ void ConductorProperties::applyForEqualAttributes(QList lis equal = true; //Text rotation for vertical conducor - d_value = list.first().verti_rotate_text; - foreach(ConductorProperties cp, list) + d_value = clist.first().verti_rotate_text; + for(ConductorProperties cp : clist) { if (cp.verti_rotate_text != d_value) equal = false; @@ -521,8 +586,8 @@ void ConductorProperties::applyForEqualAttributes(QList lis equal = true; //Text rotation for horizontal conducor - d_value = list.first().horiz_rotate_text; - foreach(ConductorProperties cp, list) + d_value = clist.first().horiz_rotate_text; + for(ConductorProperties cp : clist) { if (cp.horiz_rotate_text != d_value) equal = false; @@ -556,6 +621,9 @@ bool ConductorProperties::operator==(const ConductorProperties &other) const return( other.type == type &&\ other.color == color &&\ + other.m_bicolor == m_bicolor &&\ + other.m_color_2 == m_color_2 &&\ + other.m_dash_size == m_dash_size &&\ other.style == style &&\ other.text == text &&\ other.m_formula == m_formula &&\ diff --git a/sources/conductorproperties.h b/sources/conductorproperties.h index c5cb1f549..db5cdd829 100644 --- a/sources/conductorproperties.h +++ b/sources/conductorproperties.h @@ -77,18 +77,28 @@ class ConductorProperties //Attributes ConductorType type; - QColor color; + + QColor color, + m_color_2; + QString text, m_function, m_tension_protocol, m_formula; - int text_size; - double cond_size; - double verti_rotate_text; - double horiz_rotate_text; - bool m_show_text; - bool m_one_text_per_folio; + + int text_size, + m_dash_size = 1; + + double cond_size, + verti_rotate_text, + horiz_rotate_text; + + bool m_show_text, + m_one_text_per_folio, + m_bicolor = false; + Qt::PenStyle style; + SingleLineProperties singleLineProperties; // methods diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp index 9fc15a632..7f431e725 100644 --- a/sources/qetgraphicsitem/conductor.cpp +++ b/sources/qetgraphicsitem/conductor.cpp @@ -456,18 +456,19 @@ QPointF Conductor::extendTerminal(const QPointF &terminal, Qet::Orientation term } /** - Dessine le conducteur sans antialiasing. - @param qp Le QPainter a utiliser pour dessiner le conducteur - @param options Les options de style pour le conducteur - @param qw Le QWidget sur lequel on dessine -*/ + * @brief Conductor::paint + * Draw the conductor + * @param qp + * @param options + * @param qw + */ void Conductor::paint(QPainter *qp, const QStyleOptionGraphicsItem *options, QWidget *qw) { Q_UNUSED(qw); qp -> save(); qp -> setRenderHint(QPainter::Antialiasing, false); - // determine la couleur du conducteur + // Set the color of conductor QColor final_conductor_color(m_properties.color); if (must_highlight_ == Normal) { final_conductor_color = QColor::fromRgb(69, 137, 255, 255); @@ -486,24 +487,38 @@ void Conductor::paint(QPainter *qp, const QStyleOptionGraphicsItem *options, QWi //Draw the conductor bigger when is hovered conductor_pen.setWidthF(m_mouse_over? (m_properties.cond_size) +4 : (m_properties.cond_size)); - // affectation du QPen et de la QBrush modifies au QPainter + //Set the QPen and QBrush to the QPainter qp -> setBrush(conductor_brush); QPen final_conductor_pen = conductor_pen; - // modification du QPen generique pour lui affecter la couleur et le style adequats + //Set the conductor style final_conductor_pen.setColor(final_conductor_color); final_conductor_pen.setStyle(m_properties.style); - final_conductor_pen.setJoinStyle(Qt::SvgMiterJoin); // meilleur rendu des pointilles + final_conductor_pen.setJoinStyle(Qt::SvgMiterJoin); // better rendering with dot - // utilisation d'un trait "cosmetique" en-dessous d'un certain zoom + //Use a cosmetique line, below a certain zoom if (options && options -> levelOfDetail < 1.0) { final_conductor_pen.setCosmetic(true); } - qp -> setPen(final_conductor_pen); + qp->setPen(final_conductor_pen); - // dessin du conducteur + //Draw the conductor qp -> drawPath(path()); + //Draw the second color + if(m_properties.m_bicolor) + { + final_conductor_pen.setColor(m_properties.m_color_2); + final_conductor_pen.setStyle(Qt::CustomDashLine); + QVector dash_pattern; + dash_pattern << m_properties.m_dash_size-2 << m_properties.m_dash_size; + final_conductor_pen.setDashPattern(dash_pattern); + qp->save(); + qp->setPen(final_conductor_pen); + qp->drawPath(path()); + qp->restore(); + } + if (m_properties.type == ConductorProperties::Single) { qp -> setBrush(final_conductor_color); m_properties.singleLineProperties.draw( @@ -518,17 +533,18 @@ void Conductor::paint(QPainter *qp, const QStyleOptionGraphicsItem *options, QWi if (isSelected()) m_handler.drawHandler(qp, handlerPoints()); - // dessine les eventuelles jonctions - QList junctions_list = junctions(); - if (!junctions_list.isEmpty()) { + //Draw the junctions + const QList junctions_list = junctions(); + if (!junctions_list.isEmpty()) + { final_conductor_pen.setStyle(Qt::SolidLine); QBrush junction_brush(final_conductor_color, Qt::SolidPattern); qp -> setPen(final_conductor_pen); qp -> setBrush(junction_brush); qp -> setRenderHint(QPainter::Antialiasing, true); - foreach(QPointF point, junctions_list) { + + for(QPointF point : junctions_list) qp -> drawEllipse(QRectF(point.x() - 1.5, point.y() - 1.5, 3.0, 3.0)); - } } qp -> restore(); diff --git a/sources/ui/conductorpropertieswidget.cpp b/sources/ui/conductorpropertieswidget.cpp index 515daec3d..792a421f1 100644 --- a/sources/ui/conductorpropertieswidget.cpp +++ b/sources/ui/conductorpropertieswidget.cpp @@ -68,13 +68,18 @@ ConductorPropertiesWidget::~ConductorPropertiesWidget() */ void ConductorPropertiesWidget::setProperties(const ConductorProperties &properties) { - if (m_properties == properties) return; + if (m_properties == properties) + return; + m_properties = properties; setColorButton(m_properties.color); + setColorButton2(m_properties.m_color_2); int index = ui -> m_line_style_cb -> findData(QPen(m_properties.style)); if (index != -1) ui -> m_line_style_cb -> setCurrentIndex(index); + ui->m_color_2_gb -> setChecked (m_properties.m_bicolor); + ui->m_dash_size_sb -> setValue (m_properties.m_dash_size); ui->m_formula_le -> setText (m_properties.m_formula); ui->m_text_le -> setText (m_properties.text); ui->m_function_le -> setText (m_properties.m_function); @@ -107,6 +112,9 @@ ConductorProperties ConductorPropertiesWidget::properties() const else if (ui -> m_singlewire_gb -> isChecked()) properties_.type = ConductorProperties::Single; properties_.color = ui -> m_color_pb->palette().color(QPalette::Button); + properties_.m_bicolor = ui->m_color_2_gb->isChecked(); + properties_.m_color_2 = ui->m_color_2_pb->palette().color(QPalette::Button); + properties_.m_dash_size = ui->m_dash_size_sb->value(); properties_.style = ui -> m_line_style_cb->itemData(ui->m_line_style_cb->currentIndex()).value().style(); properties_.m_formula = ui->m_formula_le->text(); properties_.text = ui -> m_text_le -> text(); @@ -295,12 +303,24 @@ void ConductorPropertiesWidget::on_m_color_pb_clicked() { * Set m_color_pb to @color * @param color */ -void ConductorPropertiesWidget::setColorButton(const QColor &color) { +void ConductorPropertiesWidget::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())); } +/** + * @brief ConductorPropertiesWidget::setColorButton2 + * Set m_color_2_pb to @color + * @param color + */ +void ConductorPropertiesWidget::setColorButton2(const QColor &color) +{ + QPalette palette; + palette.setColor(QPalette::Button, color); + ui->m_color_2_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())); +} + /** * @brief ConductorPropertiesWidget::on_m_update_preview_pb_clicked * Update the preview of single line. @@ -311,3 +331,14 @@ void ConductorPropertiesWidget::setColorButton(const QColor &color) { void ConductorPropertiesWidget::on_m_update_preview_pb_clicked() { updatePreview(); } + +/** + * @brief ConductorPropertiesWidget::on_m_color_2_pb_clicked + * Open a color dialog, for choose the second color of conductor + */ +void ConductorPropertiesWidget::on_m_color_2_pb_clicked() +{ + QColor color = QColorDialog::getColor(m_properties.m_color_2, this); + if (color.isValid()) + setColorButton2(color); +} diff --git a/sources/ui/conductorpropertieswidget.h b/sources/ui/conductorpropertieswidget.h index f84d89f7d..07a968748 100644 --- a/sources/ui/conductorpropertieswidget.h +++ b/sources/ui/conductorpropertieswidget.h @@ -65,8 +65,11 @@ class ConductorPropertiesWidget : public QWidget void on_m_neutral_cb_toggled(bool checked); void on_m_color_pb_clicked(); void setColorButton (const QColor &color); + void setColorButton2 (const QColor &color); void on_m_update_preview_pb_clicked(); + void on_m_color_2_pb_clicked(); + private: Ui::ConductorPropertiesWidget *ui; ConductorProperties m_properties; diff --git a/sources/ui/conductorpropertieswidget.ui b/sources/ui/conductorpropertieswidget.ui index 182432a3e..7a7694c60 100644 --- a/sources/ui/conductorpropertieswidget.ui +++ b/sources/ui/conductorpropertieswidget.ui @@ -390,7 +390,7 @@ - + Qt::Vertical @@ -426,6 +426,55 @@ + + + + Couleur secondaire : + + + true + + + true + + + false + + + + + + px + + + 2 + + + + + + + + + + + + + + Couleur : + + + + + + + Taille de trait : + + + + + +