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()