diff --git a/apps/OpenSpace/ext/launcher/include/deltatimes.h b/apps/OpenSpace/ext/launcher/include/deltatimes.h index 5fd3ac3995..7df41b0d15 100644 --- a/apps/OpenSpace/ext/launcher/include/deltatimes.h +++ b/apps/OpenSpace/ext/launcher/include/deltatimes.h @@ -28,6 +28,7 @@ class deltaTimes : public QDialog public slots: void listItemSelected(); void saveDeltaTimeValue(); + void cancelDeltaTimeValue(); void addDeltaTimeValue(); void removeDeltaTimeValue(); void parseSelections(); @@ -38,6 +39,10 @@ public: void setDeltaTimes(std::vector& dt); QString createSummaryForDeltaTime(size_t idx, int dt, bool forListView); void keyPressEvent(QKeyEvent *evt); + void transitionToEditMode(); + void transitionFromEditMode(); + void editBoxDisabled(bool disabled); + struct timeIntervals { int index; int secondsPerInterval; @@ -55,9 +60,11 @@ private: QString timeDescription(int value); bool checkForTimeDescription(QString& description, QString unit, int interval, int value); + QString createTextLabelForKey(int index); QString checkForTimeDescription(int intervalIndex, int value); int lastSelectableItem(); bool isNumericalValue(QLineEdit* le); + bool isLineEmpty(int index); Ui::deltaTimes *ui; QWidget* _parent; @@ -65,6 +72,7 @@ private: openspace::Profile* _imported; std::vector _data; std::vector _deltaTimeStrings; + bool _editModeNewItem = false; std::vector _timeIntervals = { {0, 31536000, "year"}, diff --git a/apps/OpenSpace/ext/launcher/include/properties.h b/apps/OpenSpace/ext/launcher/include/properties.h index 299b70e03e..12fef3a3b1 100644 --- a/apps/OpenSpace/ext/launcher/include/properties.h +++ b/apps/OpenSpace/ext/launcher/include/properties.h @@ -37,12 +37,15 @@ private: void transitionFromEditMode(); void editBoxDisabled(bool disabled); bool areRequiredFormsFilled(); + bool isLineEmpty(int index); Ui::properties *ui; QWidget* _parent; openspace::Profile* _imported; std::vector _data; bool _editModeNewItem = false; + const openspace::Profile::Property kBlank + = {openspace::Profile::Property::SetType::SetPropertyValue, "", ""}; }; #endif // PROPERTIES_H diff --git a/apps/OpenSpace/ext/launcher/include/ui_deltatimes.h b/apps/OpenSpace/ext/launcher/include/ui_deltatimes.h index 42d95dc625..8a33fd3dff 100644 --- a/apps/OpenSpace/ext/launcher/include/ui_deltatimes.h +++ b/apps/OpenSpace/ext/launcher/include/ui_deltatimes.h @@ -28,6 +28,7 @@ public: QListWidget *listWidget; QLabel *label_adjust; QPushButton *button_save; + QPushButton *button_cancel; QPushButton *button_add; QPushButton *button_remove; QLineEdit *line_seconds; @@ -61,6 +62,9 @@ public: button_save = new QPushButton(deltaTimes); button_save->setObjectName(QString::fromUtf8("button_save")); button_save->setGeometry(QRect(20, 354, 71, 25)); + button_cancel = new QPushButton(deltaTimes); + button_cancel->setObjectName(QString::fromUtf8("button_cancel")); + button_cancel->setGeometry(QRect(120, 354, 71, 25)); button_add = new QPushButton(deltaTimes); button_add->setObjectName(QString::fromUtf8("button_add")); button_add->setGeometry(QRect(20, 230, 151, 25)); @@ -83,8 +87,9 @@ public: { deltaTimes->setWindowTitle(QCoreApplication::translate("deltaTimes", "Delta Time Steps", nullptr)); label_module->setText(QCoreApplication::translate("deltaTimes", "Delta Times", nullptr)); - label_adjust->setText(QCoreApplication::translate("deltaTimes", "Set Delta Time for key", nullptr)); + label_adjust->setText(QCoreApplication::translate("deltaTimes", "Set Delta Time", nullptr)); button_save->setText(QCoreApplication::translate("deltaTimes", "Save", nullptr)); + button_cancel->setText(QCoreApplication::translate("deltaTimes", "Cancel", nullptr)); button_add->setText(QCoreApplication::translate("deltaTimes", "Add New Entry", nullptr)); button_remove->setText(QCoreApplication::translate("deltaTimes", "Remove Last Entry", nullptr)); } // retranslateUi diff --git a/apps/OpenSpace/ext/launcher/src/deltatimes.cpp b/apps/OpenSpace/ext/launcher/src/deltatimes.cpp index 7561e96b6d..d26783c240 100644 --- a/apps/OpenSpace/ext/launcher/src/deltatimes.cpp +++ b/apps/OpenSpace/ext/launcher/src/deltatimes.cpp @@ -22,9 +22,11 @@ deltaTimes::deltaTimes(openspace::Profile* imported, QWidget *parent) } connect(ui->listWidget, SIGNAL(itemSelectionChanged()), this, SLOT(listItemSelected())); connect(ui->button_save, SIGNAL(clicked()), this, SLOT(saveDeltaTimeValue())); + connect(ui->button_cancel, SIGNAL(clicked()), this, SLOT(cancelDeltaTimeValue())); connect(ui->button_add, SIGNAL(clicked()), this, SLOT(addDeltaTimeValue())); connect(ui->button_remove, SIGNAL(clicked()), this, SLOT(removeDeltaTimeValue())); connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(parseSelections())); + transitionFromEditMode(); } QString deltaTimes::createSummaryForDeltaTime(size_t idx, int dt, bool forListView) { @@ -67,36 +69,23 @@ void deltaTimes::listItemSelected() { } if (_data.size() > 0) { - QString labelS = "Set Delta Time for key "; - labelS += createSummaryForDeltaTime(index, _data.at(index), false); - labelS += " :\t"; - - ui->label_adjust->setText(labelS); - ui->line_seconds->setText(QString::number(_data.at(index))); - } -} - -/*int deltaTimes::lastSelectableItem() { - if (_data.size() == 0) { - return 0; - } - int i; - for (i = _data.size() - 1; i >= 0; --i) { - if (_data._times.at(i) != 0) { - break; + ui->label_adjust->setText(createTextLabelForKey(index)); + if (_data.at(index) == 0) { + ui->line_seconds->setText(""); + } + else { + ui->line_seconds->setText(QString::number(_data.at(index))); } } + transitionToEditMode(); +} - if (i < 0) { - return 0; - } - else if (i == (static_cast(_data.size()) - 1)) { - return _data.size() - 1; - } - else { - return i + 1; - } -}*/ +QString deltaTimes::createTextLabelForKey(int index) { + QString labelS = "Set Delta Time for key "; + labelS += createSummaryForDeltaTime(index, _data.at(index), false); + labelS += " :"; + return labelS; +} QString deltaTimes::timeDescription(int value) { QString description; @@ -106,8 +95,8 @@ QString deltaTimes::timeDescription(int value) { } size_t i; - for (i = 0; i < _timeIntervals.size(); ++i) { - if (value >= _timeIntervals[i].secondsPerInterval) { + for (i = 0; i < (_timeIntervals.size() - 1); ++i) { + if (abs(value) >= _timeIntervals[i].secondsPerInterval) { break; } } @@ -122,15 +111,37 @@ QString deltaTimes::checkForTimeDescription(int intervalIndex, int value) { return description += " " + _timeIntervals[intervalIndex].intervalName + "/sec"; } +bool deltaTimes::isLineEmpty(int index) { + bool isEmpty = true; + if (ui->listWidget->item(index)->text().compare("") != 0) { + isEmpty = false; + } + if ((_data.size() > 0) && (_data.at(0) != 0)) { + isEmpty = false; + } + return isEmpty; +} + void deltaTimes::addDeltaTimeValue() { - if (_data.size() < _maxSize) { + int currentListSize = ui->listWidget->count(); + const QString messageAddValue = " (Enter integer value below & click 'Save')"; + + if ((currentListSize == 1) && (isLineEmpty(0))) { + //Special case where list is "empty" but really has one line that is blank. + // This is done because QListWidget does not seem to like having its sole + // remaining item being removed. + _data.at(0) = 0; + ui->listWidget->item(0)->setText(messageAddValue); + } + else if (_data.size() < _maxSize) { if (_data.size() != 0 && _data.back() == 0) { return; } _data.push_back(0); - QString summary = createSummaryForDeltaTime(_data.size() - 1, 0, true); - ui->listWidget->addItem(new QListWidgetItem(summary)); + ui->listWidget->addItem(new QListWidgetItem(messageAddValue)); } + ui->listWidget->setCurrentRow(ui->listWidget->count() - 1); + _editModeNewItem = true; } void deltaTimes::saveDeltaTimeValue() { @@ -138,33 +149,97 @@ void deltaTimes::saveDeltaTimeValue() { if (item != nullptr) { int index = ui->listWidget->row(item); if (_data.size() > 0) { - if (isNumericalValue(ui->line_seconds) /*&& index <= lastSelectableItem() + 1*/) { - _data.at(index) = ui->line_seconds->text().toInt(); - QString summary = createSummaryForDeltaTime(index, _data.at(index), true); - ui->listWidget->item(index)->setText(summary); + if (isNumericalValue(ui->line_seconds)) { + int value = ui->line_seconds->text().toInt(); + if (value != 0) { + _data.at(index) = value; + QString summary = createSummaryForDeltaTime(index, _data.at(index), true); + ui->listWidget->item(index)->setText(summary); + ui->label_adjust->setText("" + createTextLabelForKey(index) + ""); + transitionFromEditMode(); + _editModeNewItem = false; + } + else { + ui->label_adjust->setText("" + createTextLabelForKey(index) + ""); + } + } + else { + ui->label_adjust->setText("" + createTextLabelForKey(index) + ""); } } } } +void deltaTimes::cancelDeltaTimeValue(void) { + listItemSelected(); + transitionFromEditMode(); + if (_editModeNewItem) { + if (_data.size() > 0) { + if (_data.back() == 0) { + removeDeltaTimeValue(); + } + } + } + _editModeNewItem = false; +} + bool deltaTimes::isNumericalValue(QLineEdit* le) { QString s = le->text(); bool validConversion = false; - s.toDouble(&validConversion); + s.toInt(&validConversion, 10); return validConversion; } void deltaTimes::removeDeltaTimeValue() { if (ui->listWidget->count() > 0) { - delete ui->listWidget->takeItem(ui->listWidget->count() - 1); - if (_data.size() > 0) { - _data.pop_back(); + if (ui->listWidget->count() == 1) { + _data.at(0) = 0; + ui->listWidget->item(0)->setText(""); + } + else { + delete ui->listWidget->takeItem(ui->listWidget->count() - 1); + if (_data.size() > 0) { + _data.pop_back(); + } } } ui->listWidget->clearSelection(); + transitionFromEditMode(); +} + +void deltaTimes::transitionToEditMode(void) { + ui->listWidget->setDisabled(true); + ui->button_add->setDisabled(true); + ui->button_remove->setDisabled(true); + ui->button_cancel->setDisabled(false); + ui->button_save->setDisabled(false); + ui->buttonBox->setDisabled(true); + + editBoxDisabled(false); +} + +void deltaTimes::transitionFromEditMode(void) { + ui->listWidget->setDisabled(false); + ui->button_add->setDisabled(false); + ui->button_remove->setDisabled(false); + ui->button_cancel->setDisabled(true); + ui->button_save->setDisabled(true); + ui->buttonBox->setDisabled(false); + + editBoxDisabled(true); + ui->label_adjust->setText("Set Delta Time"); +} + +void deltaTimes::editBoxDisabled(bool disabled) { + //ui->label_module->setDisabled(disabled); + ui->label_adjust->setDisabled(disabled); + ui->line_seconds->setDisabled(disabled); } void deltaTimes::parseSelections() { + if ((_data.size() == 1) && (_data.at(0) == 0)) { + _data.clear(); + } int finalNonzeroIndex = _data.size() - 1; for (; finalNonzeroIndex >= 0; --finalNonzeroIndex) { if (_data.at(finalNonzeroIndex) != 0) { diff --git a/apps/OpenSpace/ext/launcher/src/keybindings.cpp b/apps/OpenSpace/ext/launcher/src/keybindings.cpp index 6f60206628..19c5363702 100644 --- a/apps/OpenSpace/ext/launcher/src/keybindings.cpp +++ b/apps/OpenSpace/ext/launcher/src/keybindings.cpp @@ -146,7 +146,7 @@ void keybindings::listItemAdded(void) { } else { _data.push_back(kBlank); - ui->list->addItem(new QListWidgetItem(" (Enter details below and click 'Save')")); + ui->list->addItem(new QListWidgetItem(" (Enter details below & click 'Save')")); } //Scroll down to that blank line highlighted diff --git a/apps/OpenSpace/ext/launcher/src/properties.cpp b/apps/OpenSpace/ext/launcher/src/properties.cpp index 0728fd65b5..ed567bb361 100644 --- a/apps/OpenSpace/ext/launcher/src/properties.cpp +++ b/apps/OpenSpace/ext/launcher/src/properties.cpp @@ -59,10 +59,31 @@ void properties::listItemSelected(void) { transitionToEditMode(); } +bool properties::isLineEmpty(int index) { + bool isEmpty = true; + if (ui->list->item(index)->text().compare("") != 0) { + isEmpty = false; + } + if ((_data.size() > 0) && (_data.at(0).name.compare("") != 0)) { + isEmpty = false; + } + return isEmpty; +} + void properties::listItemAdded(void) { - //Add new line at bottom of props list - _data.push_back({openspace::Profile::Property::SetType::SetPropertyValue, "", ""}); - ui->list->addItem(new QListWidgetItem(" (Enter details below and click 'Save')")); + int currentListSize = ui->list->count(); + + if ((currentListSize == 1) && (isLineEmpty(0))) { + //Special case where list is "empty" but really has one line that is blank. + // This is done because QListWidget does not seem to like having its sole + // remaining item being removed. + _data.at(0) = kBlank; + ui->list->item(0)->setText(" (Enter details below & click 'Save')"); + } + else { + _data.push_back(kBlank); + ui->list->addItem(new QListWidgetItem(" (Enter details below & click 'Save')")); + } //Scroll down to that blank line highlighted ui->list->setCurrentRow(ui->list->count() - 1); @@ -131,11 +152,19 @@ void properties::listItemCancelSave(void) { void properties::listItemRemove(void) { if (ui->list->count() > 0) { - int index = ui->list->currentRow(); - if (index >= 0 && index < ui->list->count()) { - delete ui->list->takeItem(index); - if (_data.size() > 0) { - _data.erase(_data.begin() + index); + if (ui->list->count() == 1) { + //Special case where last remaining item is being removed (QListWidget does + // not like the final item being removed so instead clear it & leave it) + _data.at(0) = kBlank; + ui->list->item(0)->setText(""); + } + else { + int index = ui->list->currentRow(); + if (index >= 0 && index < ui->list->count()) { + delete ui->list->takeItem(index); + if (_data.size() > 0) { + _data.erase(_data.begin() + index); + } } } } @@ -147,6 +176,9 @@ void properties::transitionToEditMode(void) { ui->list->setDisabled(true); ui->button_add->setDisabled(true); ui->button_remove->setDisabled(true); + ui->button_cancel->setDisabled(true); + ui->button_save->setDisabled(true); + ui->buttonBox->setDisabled(true); editBoxDisabled(false); } @@ -155,6 +187,9 @@ void properties::transitionFromEditMode(void) { ui->list->setDisabled(false); ui->button_add->setDisabled(false); ui->button_remove->setDisabled(false); + ui->button_cancel->setDisabled(false); + ui->button_save->setDisabled(false); + ui->buttonBox->setDisabled(false); editBoxDisabled(true); ui->label_property->setText("Property"); @@ -202,6 +237,10 @@ void properties::editBoxDisabled(bool disabled) { }*/ void properties::parseSelections() { + //Handle case with only one remaining but empty line + if ((_data.size() == 1) && (_data.at(0).name.compare("") == 0)) { + _data.clear(); + } _imported->setProperties(_data); accept(); }