mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-03-13 17:09:05 -05:00
Fix for empty list bug in properties and deltatimes
This commit is contained in:
@@ -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"},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user