1 /*
2 	Copyright 2006-2019 The QElectroTech Team
3 	This file is part of QElectroTech.
4 
5 	QElectroTech is free software: you can redistribute it and/or modify
6 	it under the terms of the GNU General Public License as published by
7 	the Free Software Foundation, either version 2 of the License, or
8 	(at your option) any later version.
9 
10 	QElectroTech is distributed in the hope that it will be useful,
11 	but WITHOUT ANY WARRANTY; without even the implied warranty of
12 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 	GNU General Public License for more details.
14 
15 	You should have received a copy of the GNU General Public License
16 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
17 */
18 #include "conductorpropertieswidget.h"
19 #include "ui_conductorpropertieswidget.h"
20 #include "conductorproperties.h"
21 #include "qetapp.h"
22 #include "qtextorientationspinboxwidget.h"
23 
24 /**
25  * @brief ConductorPropertiesWidget::ConductorPropertiesWidget
26  * Constructor
27  * @param parent, paretn widget
28  */
ConductorPropertiesWidget(QWidget * parent)29 ConductorPropertiesWidget::ConductorPropertiesWidget(QWidget *parent) :
30 	QWidget(parent),
31 	ui(new Ui::ConductorPropertiesWidget)
32 {
33 	ui->setupUi(this);
34 	initWidget();
35 }
36 
37 
38 
39 
40 /**
41  * @brief ConductorPropertiesWidget::ConductorPropertiesWidget
42  * Constructor with properties
43  * @param properties, properties to edit
44  * @param parent, parent widget
45  */
ConductorPropertiesWidget(const ConductorProperties & properties,QWidget * parent)46 ConductorPropertiesWidget::ConductorPropertiesWidget(const ConductorProperties &properties, QWidget *parent) :
47 	QWidget(parent),
48 	ui(new Ui::ConductorPropertiesWidget)
49 {
50 	ui -> setupUi(this);
51 	initWidget();
52 	setProperties(properties);
53 }
54 
55 /**
56  * @brief ConductorPropertiesWidget::~ConductorPropertiesWidget
57  * destructor
58  */
~ConductorPropertiesWidget()59 ConductorPropertiesWidget::~ConductorPropertiesWidget()
60 {
61 	delete ui;
62 }
63 
64 /**
65  * @brief ConductorPropertiesWidget::setProperties
66  * Set the properties
67  * @param properties
68  */
setProperties(const ConductorProperties & properties)69 void ConductorPropertiesWidget::setProperties(const ConductorProperties &properties)
70 {
71 	if (m_properties == properties)
72 		return;
73 
74 	m_properties = properties;
75 
76 	int index = ui -> m_line_style_cb -> findData(QPen(m_properties.style));
77 	if (index != -1) ui -> m_line_style_cb -> setCurrentIndex(index);
78 
79 	ui->m_color_2_gb            -> setChecked  (m_properties.m_bicolor);
80 	ui->m_dash_size_sb          -> setValue    (m_properties.m_dash_size);
81 	ui->m_formula_le            -> setText    (m_properties.m_formula);
82 	ui->m_text_le               -> setText    (m_properties.text);
83 	ui->m_function_le           -> setText    (m_properties.m_function);
84 	ui->m_tension_protocol_le   -> setText    (m_properties.m_tension_protocol);
85 	ui->m_text_size_sb          -> setValue   (m_properties.text_size);
86 	ui->m_cond_size_sb          -> setValue   (m_properties.cond_size);
87 	ui->m_show_text_cb          -> setChecked (m_properties.m_show_text);
88 	ui->m_one_text_per_folio_cb -> setChecked (m_properties.m_one_text_per_folio);
89 	ui->m_earth_cb              -> setChecked (m_properties.singleLineProperties.hasGround);
90 	ui->m_neutral_cb            -> setChecked (m_properties.singleLineProperties.hasNeutral);
91 	ui->m_pen_cb                -> setChecked (m_properties.singleLineProperties.isPen());
92 	ui->m_phase_cb              -> setChecked (m_properties.singleLineProperties.phasesCount());
93 	ui->m_phase_slider          -> setValue   (m_properties.singleLineProperties.phasesCount());
94 	ui->m_color_kpb             -> setColor(m_properties.color);
95 	ui->m_color_2_kpb           -> setColor(m_properties.m_color_2);
96 
97 	ui->m_horiz_cb->setCurrentIndex(m_properties.m_horizontal_alignment == Qt::AlignTop? 0 : 1);
98 	ui->m_verti_cb->setCurrentIndex(m_properties.m_vertical_alignment == Qt::AlignLeft? 0 : 1);
99 	m_verti_select -> setValue (m_properties.verti_rotate_text);
100 	m_horiz_select -> setValue (m_properties.horiz_rotate_text);
101 
102 	setConductorType(m_properties.type);
103 	updatePreview(false);
104 }
105 
106 /**
107  * @brief ConductorPropertiesWidget::properties
108  * @return the edited properties
109  */
properties() const110 ConductorProperties ConductorPropertiesWidget::properties() const
111 {
112 	ConductorProperties properties_;
113 	if (ui -> m_multiwires_gb  -> isChecked()) properties_.type = ConductorProperties::Multi;
114 	else if (ui -> m_singlewire_gb -> isChecked()) properties_.type = ConductorProperties::Single;
115 
116 	properties_.color                   = ui -> m_color_kpb->color();
117 	properties_.m_bicolor               = ui->m_color_2_gb->isChecked();
118 	properties_.m_color_2               = ui->m_color_2_kpb->color();
119 	properties_.m_dash_size             = ui->m_dash_size_sb->value();
120 	properties_.style                   = ui -> m_line_style_cb->itemData(ui->m_line_style_cb->currentIndex()).value<QPen>().style();
121 	properties_.m_formula               = ui->m_formula_le->text();
122 	properties_.text                    = ui -> m_text_le -> text();
123 	properties_.m_function              = ui -> m_function_le->text();
124 	properties_.m_tension_protocol      = ui -> m_tension_protocol_le->text();
125 	properties_.text_size               = ui -> m_text_size_sb -> value();
126 	properties_.cond_size               = ui -> m_cond_size_sb -> value();
127 	properties_.m_show_text             = ui -> m_show_text_cb -> isChecked();
128 	properties_.m_one_text_per_folio    = ui -> m_one_text_per_folio_cb -> isChecked();
129 	properties_.verti_rotate_text       = m_verti_select -> value();
130 	properties_.horiz_rotate_text       = m_horiz_select -> value();
131 	properties_.m_vertical_alignment    = ui->m_verti_cb->currentIndex() == 0? Qt::AlignLeft : Qt::AlignRight;
132 	properties_.m_horizontal_alignment  = ui->m_horiz_cb->currentIndex() == 0? Qt::AlignTop : Qt::AlignBottom;
133 
134 	properties_.singleLineProperties.hasGround  = ui -> m_earth_cb -> isChecked();
135 	properties_.singleLineProperties.hasNeutral = ui -> m_neutral_cb -> isChecked();
136 	properties_.singleLineProperties.is_pen     = ui -> m_pen_cb -> isChecked();
137 	properties_.singleLineProperties.setPhasesCount(ui -> m_phase_cb -> isChecked() ? ui -> m_phase_sb -> value() : 0);
138 
139 	return properties_;
140 }
141 
142 /**
143  * @brief ConductorPropertiesWidget::event
144  * @param event
145  * @return
146  */
event(QEvent * event)147 bool ConductorPropertiesWidget::event(QEvent *event)
148 {
149 	if (event->type() == QEvent::WindowActivate) {
150 		ui -> m_formula_le -> setFocus();
151 	}
152 	return(QWidget::event(event));
153 }
154 
155 
156 /**
157  * @brief ConductorPropertiesWidget::setReadOnly
158  * @param ro if true this widget is disabled
159  */
setReadOnly(const bool & ro)160 void ConductorPropertiesWidget::setReadOnly(const bool &ro) {
161 	this->setDisabled(ro);
162 }
163 
164 /**
165  * @brief ConductorPropertiesWidget::addAutonumWidget
166  * @param widget
167  */
addAutonumWidget(QWidget * widget)168 void ConductorPropertiesWidget::addAutonumWidget(QWidget *widget) {
169 	ui->m_autonum_layout->addWidget(widget);
170 }
171 
172 /**
173  * @brief ConductorPropertiesWidget::setHiddenOneTextPerFolio
174  * @param hide
175  */
setHiddenOneTextPerFolio(const bool & hide)176 void ConductorPropertiesWidget::setHiddenOneTextPerFolio(const bool &hide) {
177 	ui -> m_one_text_per_folio_cb -> setHidden(hide);
178 }
179 
180 /**
181  * @brief ConductorPropertiesWidget::setDisabledShowText
182  * @param disable
183  */
setDisabledShowText(const bool & disable)184 void ConductorPropertiesWidget::setDisabledShowText(const bool &disable) {
185 	ui->m_show_text_cb->setDisabled(disable==true? true : false);
186 }
187 
188 /**
189  * @brief ConductorPropertiesWidget::setHiddenAvailableAutonum
190  * Hide the label, combo box and push button of available autonum
191  * @param hide
192  */
setHiddenAvailableAutonum(const bool & hide)193 void ConductorPropertiesWidget::setHiddenAvailableAutonum(const bool &hide)
194 {
195 	ui->m_autonum_label->setHidden(hide);
196 	ui->m_available_autonum_cb->setHidden(hide);
197 	ui->m_edit_autonum_pb->setHidden(hide);
198 }
199 
autonumComboBox() const200 QComboBox *ConductorPropertiesWidget::autonumComboBox() const
201 {
202 	return ui->m_available_autonum_cb;
203 }
204 
editAutonumPushButton() const205 QPushButton *ConductorPropertiesWidget::editAutonumPushButton() const
206 {
207 	return ui->m_edit_autonum_pb;
208 }
209 
210 /**
211  * @brief ConductorPropertiesWidget::initWidget
212  */
initWidget()213 void ConductorPropertiesWidget::initWidget() {
214 	m_verti_select = QETApp::createTextOrientationSpinBoxWidget();
215 	ui -> m_text_angle_gl -> addWidget(m_verti_select, 2, 0, Qt::AlignHCenter);
216 	m_horiz_select = QETApp::createTextOrientationSpinBoxWidget();
217 	ui -> m_text_angle_gl -> addWidget(m_horiz_select, 2, 1, Qt::AlignHCenter);
218 
219 	ui -> m_line_style_cb -> addItem(tr("Trait plein", "conductor style: solid line"), QPen(Qt::SolidLine));
220 	ui -> m_line_style_cb -> addItem(tr("Trait en pointillés", "conductor style: dashed line"), QPen(Qt::DashLine));
221 	ui -> m_line_style_cb -> addItem(tr("Traits et points", "conductor style: dashed and dotted line"), QPen(Qt::DashDotLine));
222 
223 	ui -> m_update_preview_pb -> setHidden(true);
224 
225 	connect(ui->m_multiwires_gb, &QGroupBox::toggled, [this](bool toggle) {this->ui->m_singlewire_gb->setChecked(!toggle);});
226 	connect(ui->m_singlewire_gb, &QGroupBox::toggled, [this](bool toggle) {this->ui->m_multiwires_gb->setChecked(!toggle);});
227 	connect(ui->m_formula_le, &QLineEdit::textChanged, [this](QString text) {this->ui->m_text_le->setEnabled(text.isEmpty());});
228 	ui->m_multiwires_gb->setChecked(true);
229 	ui->m_singlewire_gb->setChecked(true);
230 }
231 
232 /**
233  * @brief ConductorPropertiesWidget::setConductorType
234  * Update this widget to the new conductor type
235  * @param type
236  */
setConductorType(ConductorProperties::ConductorType type)237 void ConductorPropertiesWidget::setConductorType(ConductorProperties::ConductorType type) {
238 	switch (type) {
239 		case ConductorProperties::Multi:
240 			ui -> m_multiwires_gb -> setChecked(true);
241 			break;
242 		case ConductorProperties::Single:
243 			ui -> m_singlewire_gb -> setChecked(true);
244 			break;
245 		default:
246 			ui -> m_multiwires_gb -> setChecked(true);
247 			break;
248 	}
249 }
250 
251 /**
252  * @brief ConductorPropertiesWidget::updatePreview
253  * Update the preview for single lien
254  * @param b true: update from the value displayed by this widget
255  *          false: update from the properties given at the constructor of this widget
256  */
updatePreview(bool b)257 void ConductorPropertiesWidget::updatePreview(bool b) {
258 	const QRect pixmap_rect(0, 0, 96, 96);
259 	QPixmap pixmap(pixmap_rect.width(), pixmap_rect.height());
260 	QPainter painter;
261 	painter.begin(&pixmap);
262 	painter.eraseRect(pixmap_rect);
263 	painter.drawRect(pixmap_rect.adjusted(0,0,-1,-1));
264 	painter.drawLine(QLineF(0, pixmap_rect.height() / 2, pixmap_rect.width(), pixmap_rect.height() / 2));
265 
266 	if (b) properties().singleLineProperties.draw(&painter, QET::Horizontal, pixmap_rect);
267 	else   m_properties.singleLineProperties.draw(&painter, QET::Horizontal, pixmap_rect);
268 
269 	painter.end();
270 	ui -> m_preview_label -> setPixmap(pixmap);
271 }
272 
273 /**
274  * @brief ConductorPropertiesWidget::on_m_earth_cb_toggled
275  * Update the widget when toggled
276  * @param checked
277  */
on_m_earth_cb_toggled(bool checked)278 void ConductorPropertiesWidget::on_m_earth_cb_toggled(bool checked) {
279 	if (checked && ui -> m_neutral_cb -> isChecked())
280 		 ui -> m_pen_cb -> setEnabled(true);
281 	else ui -> m_pen_cb -> setDisabled(true);
282 }
283 
284 /**
285  * @brief ConductorPropertiesWidget::on_m_neutral_cb_toggled
286  * Update the widget when toggled
287  * @param checked
288  */
on_m_neutral_cb_toggled(bool checked)289 void ConductorPropertiesWidget::on_m_neutral_cb_toggled(bool checked) {
290 	if (checked && ui -> m_earth_cb -> isChecked())
291 		ui -> m_pen_cb -> setEnabled(true);
292 	else ui -> m_pen_cb -> setDisabled(true);
293 }
294 
295 /**
296  * @brief ConductorPropertiesWidget::on_m_update_preview_pb_clicked
297  * Update the preview of single line.
298  * m_update_preview_pb is a no used button and hidden, his role is only
299  * to centralize signal from various widget to edit single ligne properties,
300  * for update the preview
301  */
on_m_update_preview_pb_clicked()302 void ConductorPropertiesWidget::on_m_update_preview_pb_clicked() {
303 	updatePreview();
304 }
305