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:
@@ -87,6 +87,40 @@ namespace Widgets
|
|||||||
this->update();
|
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) {
|
void ListScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) {
|
||||||
const auto button = mouseEvent->button();
|
const auto button = mouseEvent->button();
|
||||||
|
|
||||||
@@ -106,35 +140,7 @@ namespace Widgets
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto selectedItemCount = this->selectedItems.size();
|
this->selectListItem(clickedListItem, (mouseEvent->modifiers() & Qt::ControlModifier) != 0);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
emit this->itemClicked(clickedListItem);
|
emit this->itemClicked(clickedListItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,4 +186,30 @@ namespace Widgets
|
|||||||
|
|
||||||
emit this->itemContextMenu(listItem, event->screenPos());
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ namespace Widgets
|
|||||||
void removeListItem(ListItem* item);
|
void removeListItem(ListItem* item);
|
||||||
void clearListItems();
|
void clearListItems();
|
||||||
void setEnabled(bool enabled);
|
void setEnabled(bool enabled);
|
||||||
|
void setKeyNavigationEnabled(bool enabled);
|
||||||
|
void selectListItem(ListItem* item, bool append);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void selectionChanged(const std::list<ListItem*>& selectedItems);
|
void selectionChanged(const std::list<ListItem*>& selectedItems);
|
||||||
@@ -48,11 +50,13 @@ namespace Widgets
|
|||||||
void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
|
void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
|
||||||
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
|
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
|
||||||
void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override;
|
void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override;
|
||||||
|
void keyPressEvent(QKeyEvent* keyEvent) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ListScene::ListItemSetType listItems;
|
ListScene::ListItemSetType listItems;
|
||||||
QGraphicsView* const parent;
|
QGraphicsView* const parent;
|
||||||
bool enabled = false;
|
bool enabled = false;
|
||||||
|
bool keyNavigationEnabled = true;
|
||||||
std::list<ListItem*> selectedItems;
|
std::list<ListItem*> selectedItems;
|
||||||
std::uint8_t selectionLimit = 1;
|
std::uint8_t selectionLimit = 1;
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ namespace Widgets
|
|||||||
);
|
);
|
||||||
|
|
||||||
this->registerListScene = this->registerListView->listScene();
|
this->registerListScene = this->registerListView->listScene();
|
||||||
|
this->registerListScene->setKeyNavigationEnabled(false);
|
||||||
|
|
||||||
containerLayout->addWidget(this->registerListView);
|
containerLayout->addWidget(this->registerListView);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user