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:
parent
e07b044e40
commit
9866f61032
3 changed files with 140 additions and 24 deletions
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue