diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.cpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.cpp index 1f773e2f..3f4f3af3 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.cpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.cpp @@ -87,6 +87,40 @@ namespace Widgets this->update(); } + void ListScene::setKeyNavigationEnabled(bool enabled) { + this->keyNavigationEnabled = enabled; + } + + void ListScene::selectListItem(ListItem* item, bool append) { + const auto selectedItemCount = this->selectedItems.size(); + if (selectedItemCount > 0) { + if (!append || selectedItemCount >= this->selectionLimit) { + const auto itemsToRemove = append + ? selectedItemCount - this->selectionLimit + 1 + : selectedItemCount; + + auto itemIt = this->selectedItems.begin(); + while ( + itemIt != this->selectedItems.end() + && (selectedItemCount - this->selectedItems.size()) < itemsToRemove + ) { + auto& item = *itemIt; + item->selected = false; + item->update(); + + this->selectedItems.erase(itemIt++); + } + } + } + + if (this->selectionLimit > 0) { + this->selectedItems.push_back(item); + item->selected = true; + item->update(); + emit this->selectionChanged(this->selectedItems); + } + } + void ListScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) { const auto button = mouseEvent->button(); @@ -106,35 +140,7 @@ namespace Widgets return; } - const auto selectedItemCount = this->selectedItems.size(); - if (selectedItemCount > 0) { - const auto ctrlModifierEnabled = (mouseEvent->modifiers() & Qt::ControlModifier) != 0; - if (!ctrlModifierEnabled || selectedItemCount >= this->selectionLimit) { - const auto itemsToRemove = ctrlModifierEnabled - ? selectedItemCount - this->selectionLimit + 1 - : selectedItemCount; - - auto itemIt = this->selectedItems.begin(); - while ( - itemIt != this->selectedItems.end() - && (selectedItemCount - this->selectedItems.size()) < itemsToRemove - ) { - auto& item = *itemIt; - item->selected = false; - item->update(); - - this->selectedItems.erase(itemIt++); - } - } - } - - if (this->selectionLimit > 0) { - this->selectedItems.push_back(clickedListItem); - clickedListItem->selected = true; - clickedListItem->update(); - emit this->selectionChanged(this->selectedItems); - } - + this->selectListItem(clickedListItem, (mouseEvent->modifiers() & Qt::ControlModifier) != 0); emit this->itemClicked(clickedListItem); } @@ -180,4 +186,30 @@ namespace Widgets emit this->itemContextMenu(listItem, event->screenPos()); } + + void ListScene::keyPressEvent(QKeyEvent* keyEvent) { + const auto key = keyEvent->key(); + + if ( + this->keyNavigationEnabled + && (key == Qt::Key_Up || key == Qt::Key_Down) && this->selectedItems.size() == 1 + ) { + auto itemIt = this->listItems.find(this->selectedItems.front()); + if ( + itemIt != this->listItems.end() + && ( + (key == Qt::Key_Up && itemIt != this->listItems.begin()) + || (key == Qt::Key_Down && itemIt != --(this->listItems.end())) + ) + ) { + auto* item = key == Qt::Key_Up ? *(--itemIt) : *(++itemIt); + this->selectListItem(item, false); + + this->views().front()->ensureVisible(item); + return; + } + } + + return QGraphicsScene::keyPressEvent(keyEvent); + } } diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.hpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.hpp index 45b8af7f..2c6f6a00 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.hpp @@ -37,6 +37,8 @@ namespace Widgets void removeListItem(ListItem* item); void clearListItems(); void setEnabled(bool enabled); + void setKeyNavigationEnabled(bool enabled); + void selectListItem(ListItem* item, bool append); signals: void selectionChanged(const std::list& selectedItems); @@ -48,11 +50,13 @@ namespace Widgets void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) override; void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mouseEvent) override; void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override; + void keyPressEvent(QKeyEvent* keyEvent) override; private: ListScene::ListItemSetType listItems; QGraphicsView* const parent; bool enabled = false; + bool keyNavigationEnabled = true; std::list selectedItems; std::uint8_t selectionLimit = 1; diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/TargetRegistersPaneWidget.cpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/TargetRegistersPaneWidget.cpp index 60b22e9f..36b64aa1 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/TargetRegistersPaneWidget.cpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/TargetRegistersPaneWidget.cpp @@ -111,6 +111,7 @@ namespace Widgets ); this->registerListScene = this->registerListView->listScene(); + this->registerListScene->setKeyNavigationEnabled(false); containerLayout->addWidget(this->registerListView);