diff --git a/apps/OpenSpace/ext/launcher/include/keybindings.h b/apps/OpenSpace/ext/launcher/include/keybindings.h index 4f570dfd17..17ef9bedaa 100644 --- a/apps/OpenSpace/ext/launcher/include/keybindings.h +++ b/apps/OpenSpace/ext/launcher/include/keybindings.h @@ -41,6 +41,7 @@ private: std::string truncateString(std::string& s); void replaceChars(std::string& src, const std::string& from, const std::string& to); + bool isLineEmpty(int index); Ui::keybindings *ui; QWidget* _parent; @@ -50,6 +51,14 @@ private: std::vector _mapModKeyComboBoxIndexToKeyValue; std::vector _mapKeyComboBoxIndexToKeyValue; bool _editModeNewItem = false; + const openspace::Profile::Keybinding kBlank = { + {openspace::Key::Unknown, openspace::KeyModifier::NoModifier}, + "", + "", + "", + true, + "" + }; }; #endif // KEYBINDINGS_H diff --git a/apps/OpenSpace/ext/launcher/include/osmodules.h b/apps/OpenSpace/ext/launcher/include/osmodules.h index 5c20e0de60..5d59de535c 100644 --- a/apps/OpenSpace/ext/launcher/include/osmodules.h +++ b/apps/OpenSpace/ext/launcher/include/osmodules.h @@ -43,6 +43,7 @@ private: openspace::Profile* _imported; std::vector _data; bool _editModeNewItem = false; + const openspace::Profile::Module kBlank = {"", "", ""}; }; #endif // OSMODULES_H diff --git a/apps/OpenSpace/ext/launcher/src/keybindings.cpp b/apps/OpenSpace/ext/launcher/src/keybindings.cpp index 34b47dda08..6f60206628 100644 --- a/apps/OpenSpace/ext/launcher/src/keybindings.cpp +++ b/apps/OpenSpace/ext/launcher/src/keybindings.cpp @@ -51,11 +51,11 @@ QString keybindings::createOneLineSummary(openspace::Profile::Keybinding k) { int keymod = static_cast(k.key.modifier); if (keymod != static_cast(openspace::KeyModifier::NoModifier)) { - summary += openspace::KeyModifierNames.at(keymod) + "+"; + summary += openspace::KeyModifierNames.at(keymod) + " "; } int keyname = static_cast(k.key.key); - summary += openspace::KeyNames.at(keyname) + " : "; + summary += openspace::KeyNames.at(keyname) + " "; summary += truncateString(k.name) + " ("; summary += truncateString(k.documentation) + ") @ "; summary += truncateString(k.guiPath) + " "; @@ -123,17 +123,31 @@ int keybindings::indexInKeyMapping(std::vector& mapVector, int keyInt) { return std::distance(mapVector.begin(), it); } +bool keybindings::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 keybindings::listItemAdded(void) { - //Add new line at bottom of props list - _data.push_back({ - {openspace::Key::Unknown, openspace::KeyModifier::NoModifier}, - "", - "", - "", - true, - "" - }); - 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 and click 'Save')")); + } //Scroll down to that blank line highlighted ui->list->setCurrentRow(ui->list->count() - 1); @@ -218,22 +232,33 @@ void keybindings::listItemCancelSave(void) { void keybindings::listItemRemove(void) { if (ui->list->count() > 0) { - int index = ui->list->currentRow(); - if (index >= 0 && index < ui->list->count()) { - 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()) { + ui->list->takeItem(index); + if (_data.size() > 0) { + _data.erase(_data.begin() + index); + } } } - ui->list->clearSelection(); - transitionFromEditMode(); } + ui->list->clearSelection(); + transitionFromEditMode(); } void keybindings::transitionToEditMode(void) { ui->list->setDisabled(true); ui->button_add->setDisabled(true); ui->button_remove->setDisabled(true); + ui->button_save->setDisabled(true); + ui->button_cancel->setDisabled(true); + ui->buttonBox->setDisabled(true); editBoxDisabled(false); } @@ -242,6 +267,9 @@ void keybindings::transitionFromEditMode(void) { ui->list->setDisabled(false); ui->button_add->setDisabled(false); ui->button_remove->setDisabled(false); + ui->button_save->setDisabled(false); + ui->button_cancel->setDisabled(false); + ui->buttonBox->setDisabled(false); editBoxDisabled(true); ui->label_key->setText("Key"); @@ -267,6 +295,10 @@ void keybindings::editBoxDisabled(bool disabled) { } void keybindings::parseSelections() { + //Handle case with only one remaining but empty line + if ((_data.size() == 1) && (_data.at(0).name.compare("") == 0)) { + _data.clear(); + } _imported->setKeybindings(_data); accept(); } diff --git a/apps/OpenSpace/ext/launcher/src/osmodules.cpp b/apps/OpenSpace/ext/launcher/src/osmodules.cpp index ad7731442f..eda755a206 100644 --- a/apps/OpenSpace/ext/launcher/src/osmodules.cpp +++ b/apps/OpenSpace/ext/launcher/src/osmodules.cpp @@ -77,11 +77,11 @@ void osmodules::listItemAdded(void) { //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) = {"", "", ""}; + _data.at(0) = kBlank; ui->list->item(0)->setText(" (Enter details below & click 'Save')"); } else { - _data.push_back({"", "", ""}); + _data.push_back(kBlank); ui->list->addItem(new QListWidgetItem(" (Enter details below & click 'Save')")); } @@ -134,7 +134,7 @@ void osmodules::listItemRemove(void) { 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) = {"", "", ""}; + _data.at(0) = kBlank; ui->list->item(0)->setText(""); } else {