mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2026-01-06 06:07:49 -05:00
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:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user