Replaced std::vector with std::set, for automatic sorting in ListScene widget.

And added `ListScene::removeListItem()` function
This commit is contained in:
Nav
2023-04-15 00:00:06 +01:00
parent c5545df40a
commit 3feb60cc5c
7 changed files with 30 additions and 23 deletions

View File

@@ -0,0 +1,14 @@
#pragma once
#include <type_traits>
namespace Bloom {
template<typename Type>
requires std::is_pointer<Type>::value
struct DereferenceLessComparator
{
constexpr bool operator () (const Type& lhs, const Type& rhs) const {
return *lhs < *rhs;
}
};
}

View File

@@ -9,7 +9,7 @@
namespace Bloom::Widgets
{
ListScene::ListScene(
std::vector<ListItem*> items,
ListScene::ListItemSetType&& items,
QGraphicsView* parent
)
: parent(parent)
@@ -48,7 +48,7 @@ namespace Bloom::Widgets
this->update();
}
void ListScene::setItems(const std::vector<ListItem*>& items) {
void ListScene::setItems(const ListScene::ListItemSetType& items) {
for (auto& item : this->items()) {
this->removeItem(item);
}
@@ -58,23 +58,16 @@ namespace Bloom::Widgets
for (const auto& listItem : this->listItems) {
this->addItem(listItem);
}
this->sortItems();
}
void ListScene::addListItem(ListItem* item) {
this->listItems.push_back(item);
this->listItems.insert(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::removeListItem(ListItem* item) {
this->listItems.erase(item);
this->removeItem(item);
}
void ListScene::setEnabled(bool enabled) {

View File

@@ -3,7 +3,7 @@
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QMargins>
#include <vector>
#include <set>
#include <list>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsSceneWheelEvent>
@@ -13,6 +13,7 @@
#include <QPointF>
#include "ListItem.hpp"
#include "src/Helpers/DereferenceLessComparator.hpp"
namespace Bloom::Widgets
{
@@ -21,18 +22,19 @@ namespace Bloom::Widgets
Q_OBJECT
public:
using ListItemSetType = std::set<ListItem*, DereferenceLessComparator<ListItem*>>;
QMargins margins = QMargins(0, 0, 0, 10);
ListScene(
std::vector<ListItem*> items,
ListScene::ListItemSetType&& items,
QGraphicsView* parent
);
void refreshGeometry();
void setSelectionLimit(std::uint8_t selectionLimit);
void setItems(const std::vector<ListItem*>& items);
void setItems(const ListScene::ListItemSetType& items);
void addListItem(ListItem* item);
void sortItems();
void removeListItem(ListItem* item);
void setEnabled(bool enabled);
signals:
@@ -47,7 +49,7 @@ namespace Bloom::Widgets
void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override;
private:
std::vector<ListItem*> listItems;
ListScene::ListItemSetType listItems;
QGraphicsView* const parent;
bool enabled = false;
std::list<ListItem*> selectedItems;

View File

@@ -3,7 +3,7 @@
namespace Bloom::Widgets
{
ListView::ListView(
const std::vector<ListItem*>& items,
ListScene::ListItemSetType&& items,
QWidget* parent
)
: QGraphicsView(parent)

View File

@@ -15,7 +15,7 @@ namespace Bloom::Widgets
public:
ListView(
const std::vector<ListItem*>& items,
ListScene::ListItemSetType&& items,
QWidget* parent
);

View File

@@ -173,7 +173,6 @@ namespace Bloom::Widgets
this->addSnapshot(std::move(snapshot));
}
this->snapshotListScene->sortItems();
this->snapshotListScene->refreshGeometry();
}
);
@@ -218,7 +217,6 @@ namespace Bloom::Widgets
this,
[this] (MemorySnapshot snapshot) {
this->addSnapshot(std::move(snapshot));
this->snapshotListScene->sortItems();
this->snapshotListScene->refreshGeometry();
}
);

View File

@@ -105,7 +105,7 @@ namespace Bloom::Widgets
}
this->registerListView = new ListView(
std::vector<ListItem*>(this->registerGroupItems.begin(), this->registerGroupItems.end()),
ListScene::ListItemSetType(this->registerGroupItems.begin(), this->registerGroupItems.end()),
this
);