Fix for empty list bug in properties and deltatimes

This commit is contained in:
Gene Payne
2020-09-26 09:18:26 -06:00
parent 68dfbe908b
commit af4767d406
6 changed files with 180 additions and 50 deletions

View File

@@ -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<double>& 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<int> _data;
std::vector<std::string> _deltaTimeStrings;
bool _editModeNewItem = false;
std::vector<timeIntervals> _timeIntervals = {
{0, 31536000, "year"},

View File

@@ -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<openspace::Profile::Property> _data;
bool _editModeNewItem = false;
const openspace::Profile::Property kBlank
= {openspace::Profile::Property::SetType::SetPropertyValue, "", ""};
};
#endif // PROPERTIES_H

View File

@@ -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

View File

@@ -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<int>(_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("<font color='black'>" + createTextLabelForKey(index) + "</font>");
transitionFromEditMode();
_editModeNewItem = false;
}
else {
ui->label_adjust->setText("<font color='red'>" + createTextLabelForKey(index) + "</font>");
}
}
else {
ui->label_adjust->setText("<font color='red'>" + createTextLabelForKey(index) + "</font>");
}
}
}
}
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("<font color='black'>Set Delta Time</font>");
}
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) {

View File

@@ -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

View File

@@ -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("<font color='black'>Property</font>");
@@ -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();
}