From d7a8e0ded0da9527f566c9520eaab54633be987f Mon Sep 17 00:00:00 2001 From: Nav Date: Tue, 21 Mar 2023 20:30:57 +0000 Subject: [PATCH] Added support for sorting ListItems in a ListView --- .../Widgets/ListView/ListItem.hpp | 14 +++++++ .../Widgets/ListView/ListScene.cpp | 37 ++++++++++++++++--- .../Widgets/ListView/ListScene.hpp | 5 ++- .../TargetRegistersPane/RegisterGroupItem.hpp | 5 +++ .../TargetRegistersPane/RegisterItem.hpp | 5 +++ 5 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListItem.hpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListItem.hpp index 01a8961e..387b6d44 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListItem.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListItem.hpp @@ -26,6 +26,20 @@ namespace Bloom::Widgets return; } + virtual bool operator < (const ListItem& rhs) const = 0; + + bool operator > (const ListItem& rhs) const { + return rhs < *this; + } + + bool operator <= (const ListItem& rhs) const { + return !(rhs < *this); + } + + bool operator >= (const ListItem& rhs) const { + return !(*this < rhs); + } + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override = 0; }; } diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.cpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.cpp index 84aa86c4..6b46ab09 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.cpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.cpp @@ -12,15 +12,11 @@ namespace Bloom::Widgets std::vector items, QGraphicsView* parent ) - : listItems(std::move(items)) - , parent(parent) + : parent(parent) , QGraphicsScene(parent) { this->setItemIndexMethod(QGraphicsScene::NoIndex); - - for (const auto& listItem : this->listItems) { - this->addItem(listItem); - } + this->setItems(std::move(items)); } void ListScene::refreshGeometry() { @@ -48,6 +44,35 @@ namespace Bloom::Widgets this->update(); } + void ListScene::setItems(const std::vector& items) { + for (auto& item : this->items()) { + this->removeItem(item); + } + + this->listItems = items; + + for (const auto& listItem : this->listItems) { + this->addItem(listItem); + } + + this->sortItems(); + } + + void ListScene::addListItem(ListItem* item) { + this->listItems.push_back(item); + this->addItem(item); + } + + void ListScene::sortItems() { + std::sort( + this->listItems.begin(), + this->listItems.end(), + [] (const ListItem* itemA, const ListItem* itemB) { + return *itemA < *itemB; + } + ); + } + void ListScene::setEnabled(bool enabled) { if (this->enabled == enabled) { return; diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.hpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.hpp index d0c21b9a..f96cfab0 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/ListView/ListScene.hpp @@ -28,6 +28,9 @@ namespace Bloom::Widgets ); void refreshGeometry(); + void setItems(const std::vector& items); + void addListItem(ListItem* item); + void sortItems(); void setEnabled(bool enabled); signals: @@ -42,7 +45,7 @@ namespace Bloom::Widgets void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override; private: - const std::vector listItems; + std::vector listItems; QGraphicsView* const parent; bool enabled = false; ListItem* selectedItem = nullptr; diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/RegisterGroupItem.hpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/RegisterGroupItem.hpp index 8d81fc61..d143e019 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/RegisterGroupItem.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/RegisterGroupItem.hpp @@ -37,6 +37,11 @@ namespace Bloom::Widgets void refreshGeometry(); + bool operator < (const ListItem& rhs) const override { + const auto& rhsRegisterGroupItem = dynamic_cast(rhs); + return this->groupName < rhsRegisterGroupItem.groupName; + } + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override; private: diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/RegisterItem.hpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/RegisterItem.hpp index 710b9393..c78939f8 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/RegisterItem.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/TargetRegistersPane/RegisterItem.hpp @@ -29,6 +29,11 @@ namespace Bloom::Widgets this->valueText.clear(); } + bool operator < (const ListItem& rhs) const override { + const auto& rhsRegisterItem = dynamic_cast(rhs); + return this->registerName < rhsRegisterItem.registerName; + } + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override; private: