Added keyboard navigation to list views, but I've disabled this in the target registers pane, as ListItem hierarchies are not currently supported.

This commit is contained in:
Nav
2023-08-24 21:43:46 +01:00
parent 586c11157c
commit fc6decc1df
3 changed files with 66 additions and 29 deletions

View File

@@ -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);
}
}

View File

@@ -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<ListItem*>& 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<ListItem*> selectedItems;
std::uint8_t selectionLimit = 1;

View File

@@ -111,6 +111,7 @@ namespace Widgets
);
this->registerListScene = this->registerListView->listScene();
this->registerListScene->setKeyNavigationEnabled(false);
containerLayout->addWidget(this->registerListView);