diff --git a/qt/OpenRGBZoneResizeDialog.cpp b/qt/OpenRGBZoneResizeDialog.cpp index 30c5d35d..12599fae 100644 --- a/qt/OpenRGBZoneResizeDialog.cpp +++ b/qt/OpenRGBZoneResizeDialog.cpp @@ -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(); +} diff --git a/qt/OpenRGBZoneResizeDialog.h b/qt/OpenRGBZoneResizeDialog.h index 35b79367..2320e7e3 100644 --- a/qt/OpenRGBZoneResizeDialog.h +++ b/qt/OpenRGBZoneResizeDialog.h @@ -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 diff --git a/qt/OpenRGBZoneResizeDialog.ui b/qt/OpenRGBZoneResizeDialog.ui index de24607b..350a5ccc 100644 --- a/qt/OpenRGBZoneResizeDialog.ui +++ b/qt/OpenRGBZoneResizeDialog.ui @@ -6,8 +6,8 @@ 0 0 - 340 - 187 + 450 + 250 @@ -57,18 +57,18 @@ - Start + Length - Length + - + 0 @@ -105,7 +105,7 @@ - buttonBox + ButtonBox accepted() OpenRGBZoneResizeDialogUi accept() @@ -121,7 +121,7 @@ - buttonBox + ButtonBox rejected() OpenRGBZoneResizeDialogUi reject()