Segment size verification in Edit dialog

* Remove Start field and calculate it from previous segment sizes
  * Add segment size slider
  * Gray out OK when segment configuration is invalid
This commit is contained in:
Adam Honse 2023-05-08 11:43:46 -05:00
parent e07b044e40
commit 9866f61032
3 changed files with 140 additions and 24 deletions

View file

@ -17,6 +17,10 @@ OpenRGBZoneResizeDialog::OpenRGBZoneResizeDialog(RGBController* edit_dev_ptr, un
ui->setupUi(this);
QStringList header_labels;
header_labels << "Name" << "Size" << "";
ui->SegmentsTreeWidget->setHeaderLabels(header_labels);
ui->ResizeSlider->setRange(size_min, size_max);
ui->ResizeBox->setRange(size_min, size_max);
@ -25,19 +29,24 @@ OpenRGBZoneResizeDialog::OpenRGBZoneResizeDialog(RGBController* edit_dev_ptr, un
for(unsigned int segment_idx = 0; segment_idx < edit_dev->zones[edit_zone_idx].segments.size(); segment_idx++)
{
QTreeWidgetItem* new_item = new QTreeWidgetItem(ui->SegmentsTreeWidget);
QTreeWidgetItem* new_item = new QTreeWidgetItem(ui->SegmentsTreeWidget);
QLineEdit* lineedit_name = new QLineEdit(ui->SegmentsTreeWidget);
QLineEdit* lineedit_start = new QLineEdit(ui->SegmentsTreeWidget);
QLineEdit* lineedit_length = new QLineEdit(ui->SegmentsTreeWidget);
QLineEdit* lineedit_name = new QLineEdit(ui->SegmentsTreeWidget);
QLineEdit* lineedit_length = new QLineEdit(ui->SegmentsTreeWidget);
QSlider* slider_length = new QSlider(Qt::Horizontal, ui->SegmentsTreeWidget);
slider_length->setMaximum(edit_dev->zones[edit_zone_idx].leds_count);
lineedit_name->setText(QString::fromStdString(edit_dev->zones[edit_zone_idx].segments[segment_idx].name));
lineedit_start->setText(QString::number(edit_dev->zones[edit_zone_idx].segments[segment_idx].start_idx));
lineedit_length->setText(QString::number(edit_dev->zones[edit_zone_idx].segments[segment_idx].leds_count));
slider_length->setSliderPosition(edit_dev->zones[edit_zone_idx].segments[segment_idx].leds_count);
ui->SegmentsTreeWidget->setItemWidget(new_item, 0, lineedit_name);
ui->SegmentsTreeWidget->setItemWidget(new_item, 1, lineedit_start);
ui->SegmentsTreeWidget->setItemWidget(new_item, 2, lineedit_length);
ui->SegmentsTreeWidget->setItemWidget(new_item, 1, lineedit_length);
ui->SegmentsTreeWidget->setItemWidget(new_item, 2, slider_length);
connect(slider_length, &QSlider::valueChanged, this, &OpenRGBZoneResizeDialog::on_segment_slider_valueChanged);
connect(lineedit_length, &QLineEdit::textChanged, this, &OpenRGBZoneResizeDialog::on_segment_lineedit_textChanged);
}
}
@ -59,6 +68,47 @@ void Ui::OpenRGBZoneResizeDialog::on_ResizeSlider_valueChanged(int value)
ui->ResizeBox->blockSignals(true);
ui->ResizeBox->setValue(value);
ui->ResizeBox->blockSignals(false);
/*-----------------------------------------------------*\
| Set maximum value for all segment sliders to new zone |
| size |
\*-----------------------------------------------------*/
for(unsigned int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++)
{
((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 2))->setMaximum(value);
}
CheckSegmentsValidity();
}
void Ui::OpenRGBZoneResizeDialog::on_segment_lineedit_textChanged()
{
/*-----------------------------------------------------*\
| Update the Slider with the LineEdit value for each |
| segment |
\*-----------------------------------------------------*/
for(unsigned int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++)
{
int lineedit_value = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 1))->text().toInt();
((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 2))->setValue(lineedit_value);
}
CheckSegmentsValidity();
}
void Ui::OpenRGBZoneResizeDialog::on_segment_slider_valueChanged(int)
{
/*-----------------------------------------------------*\
| Update the LineEdit with the Slider value for each |
| segment |
\*-----------------------------------------------------*/
for(unsigned int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++)
{
int slider_value = ((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 2))->value();
((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 1))->setText(QString::number(slider_value));
}
CheckSegmentsValidity();
}
void Ui::OpenRGBZoneResizeDialog::on_ResizeBox_valueChanged(int value)
@ -66,6 +116,17 @@ void Ui::OpenRGBZoneResizeDialog::on_ResizeBox_valueChanged(int value)
ui->ResizeSlider->blockSignals(true);
ui->ResizeSlider->setValue(value);
ui->ResizeSlider->blockSignals(false);
/*-----------------------------------------------------*\
| Set maximum value for all segment sliders to new zone |
| size |
\*-----------------------------------------------------*/
for(unsigned int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++)
{
((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 2))->setMaximum(value);
}
CheckSegmentsValidity();
}
int Ui::OpenRGBZoneResizeDialog::show()
@ -89,15 +150,19 @@ int Ui::OpenRGBZoneResizeDialog::show()
edit_dev->zones[edit_zone_idx].segments.clear();
unsigned int start_idx = 0;
for(unsigned int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++)
{
segment new_segment;
new_segment.type = ZONE_TYPE_LINEAR;
new_segment.name = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 0))->text().toStdString();
new_segment.start_idx = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 1))->text().toInt();
new_segment.leds_count = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 2))->text().toInt();
new_segment.start_idx = start_idx;
new_segment.leds_count = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 1))->text().toInt();
edit_dev->zones[edit_zone_idx].segments.push_back(new_segment);
start_idx += new_segment.leds_count;
}
}
@ -106,20 +171,65 @@ int Ui::OpenRGBZoneResizeDialog::show()
void Ui::OpenRGBZoneResizeDialog::on_AddSegmentButton_clicked()
{
QTreeWidgetItem* new_item = new QTreeWidgetItem(ui->SegmentsTreeWidget);
QLineEdit* lineedit_name = new QLineEdit(ui->SegmentsTreeWidget);
QLineEdit* lineedit_start = new QLineEdit(ui->SegmentsTreeWidget);
QLineEdit* lineedit_length = new QLineEdit(ui->SegmentsTreeWidget);
QTreeWidgetItem* new_item = new QTreeWidgetItem(ui->SegmentsTreeWidget);
QLineEdit* lineedit_name = new QLineEdit(ui->SegmentsTreeWidget);
QLineEdit* lineedit_length = new QLineEdit(ui->SegmentsTreeWidget);
QSlider* slider_length = new QSlider(Qt::Horizontal, ui->SegmentsTreeWidget);
slider_length->setMaximum(edit_dev->zones[edit_zone_idx].leds_count);
ui->SegmentsTreeWidget->setItemWidget(new_item, 0, lineedit_name);
ui->SegmentsTreeWidget->setItemWidget(new_item, 1, lineedit_start);
ui->SegmentsTreeWidget->setItemWidget(new_item, 2, lineedit_length);
ui->SegmentsTreeWidget->setItemWidget(new_item, 1, lineedit_length);
ui->SegmentsTreeWidget->setItemWidget(new_item, 2, slider_length);
connect(slider_length, &QSlider::valueChanged, this, &OpenRGBZoneResizeDialog::on_segment_slider_valueChanged);
connect(lineedit_length, &QLineEdit::textChanged, this, &OpenRGBZoneResizeDialog::on_segment_lineedit_textChanged);
CheckSegmentsValidity();
}
void Ui::OpenRGBZoneResizeDialog::CheckSegmentsValidity()
{
bool segments_valid = true;
/*---------------------------------------------------------*\
| Only check validity if segments are configured |
\*---------------------------------------------------------*/
if(ui->SegmentsTreeWidget->topLevelItemCount() != 0)
{
/*-----------------------------------------------------*\
| Verify all segments add up to zone size |
\*-----------------------------------------------------*/
unsigned int total_segment_leds = 0;
for(unsigned int segment_idx = 0; segment_idx < ui->SegmentsTreeWidget->topLevelItemCount(); segment_idx++)
{
unsigned int segment_leds = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(segment_idx), 1))->text().toInt();
/*-------------------------------------------------*\
| Zero-length segment is not allowed |
\*-------------------------------------------------*/
if(segment_leds == 0)
{
segments_valid = false;
}
total_segment_leds += segment_leds;
}
if(total_segment_leds != ui->ResizeBox->value())
{
segments_valid = false;
}
}
ui->ButtonBox->setEnabled(segments_valid);
}
void Ui::OpenRGBZoneResizeDialog::on_RemoveSegmentButton_clicked()
{
ui->SegmentsTreeWidget->takeTopLevelItem(ui->SegmentsTreeWidget->topLevelItemCount() - 1);
}
CheckSegmentsValidity();
}

View file

@ -30,10 +30,16 @@ private slots:
void on_RemoveSegmentButton_clicked();
void on_segment_slider_valueChanged(int);
void on_segment_lineedit_textChanged();
private:
Ui::OpenRGBZoneResizeDialogUi *ui;
RGBController* edit_dev;
unsigned int edit_zone_idx;
void CheckSegmentsValidity();
};
#endif // OPENRGBZONERESIZEDIALOG_H

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>340</width>
<height>187</height>
<width>450</width>
<height>250</height>
</rect>
</property>
<property name="windowTitle">
@ -57,18 +57,18 @@
</column>
<column>
<property name="text">
<string>Start</string>
<string>Length</string>
</property>
</column>
<column>
<property name="text">
<string>Length</string>
<string> </string>
</property>
</column>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<widget class="QDialogButtonBox" name="ButtonBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -105,7 +105,7 @@
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<sender>ButtonBox</sender>
<signal>accepted()</signal>
<receiver>OpenRGBZoneResizeDialogUi</receiver>
<slot>accept()</slot>
@ -121,7 +121,7 @@
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<sender>ButtonBox</sender>
<signal>rejected()</signal>
<receiver>OpenRGBZoneResizeDialogUi</receiver>
<slot>reject()</slot>