aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/cru/ui/model/IListChangeNotify.h47
-rw-r--r--include/cru/ui/style/StyleRuleSet.h12
2 files changed, 58 insertions, 1 deletions
diff --git a/include/cru/ui/model/IListChangeNotify.h b/include/cru/ui/model/IListChangeNotify.h
new file mode 100644
index 00000000..a9fcd65b
--- /dev/null
+++ b/include/cru/ui/model/IListChangeNotify.h
@@ -0,0 +1,47 @@
+#pragma once
+#include "../Base.h"
+#include "cru/common/Base.h"
+#include "cru/common/Event.h"
+
+namespace cru::ui::model {
+enum ListChangeType {
+ kItemAdd,
+ kItemRemove,
+ kItemSet,
+ kItemMove,
+ kClear,
+};
+
+struct CRU_UI_API ListChange {
+ ListChangeType type;
+ union {
+ Index position;
+ };
+ union {
+ Index count;
+ Index new_position;
+ };
+
+ constexpr static ListChange ItemAdd(Index index, Index count = 1) {
+ return {ListChangeType::kItemAdd, index, count};
+ }
+
+ constexpr static ListChange ItemRemove(Index index, Index count = 1) {
+ return {ListChangeType::kItemRemove, index, count};
+ }
+
+ constexpr static ListChange ItemSet(Index index, Index count = 1) {
+ return {ListChangeType::kItemSet, index, count};
+ }
+
+ constexpr static ListChange ItemMove(Index position, Index new_position) {
+ return {ListChangeType::kItemMove, position, new_position};
+ }
+
+ constexpr static ListChange Clear() { return {ListChangeType::kClear}; }
+};
+
+struct CRU_UI_API IListChangeNotify : virtual Interface {
+ virtual IEvent<ListChange>* ListChangeEvent() = 0;
+};
+} // namespace cru::ui::model
diff --git a/include/cru/ui/style/StyleRuleSet.h b/include/cru/ui/style/StyleRuleSet.h
index 8bf9c9ff..8f3495bc 100644
--- a/include/cru/ui/style/StyleRuleSet.h
+++ b/include/cru/ui/style/StyleRuleSet.h
@@ -2,6 +2,7 @@
#include "StyleRule.h"
#include "cru/common/Base.h"
#include "cru/common/Event.h"
+#include "cru/ui/model/IListChangeNotify.h"
#include <cstddef>
@@ -12,7 +13,7 @@ namespace cru::ui::style {
* mutable and has reference semantics. Change of it will be notified by
* StyleRuleSet::ChangeEvent.
*/
-class CRU_UI_API StyleRuleSet : public Object {
+class CRU_UI_API StyleRuleSet : public Object, public model::IListChangeNotify {
public:
StyleRuleSet() = default;
explicit StyleRuleSet(std::shared_ptr<StyleRuleSet> parent);
@@ -50,11 +51,20 @@ class CRU_UI_API StyleRuleSet : public Object {
// change ...). Subscribe to this and update style change listeners and style.
IEvent<std::nullptr_t>* ChangeEvent() { return &change_event_; }
+ IEvent<model::ListChange>* ListChangeEvent() override {
+ return &list_change_event_;
+ }
+
private:
void RaiseChangeEvent() { change_event_.Raise(nullptr); }
+ void RaiseChangeEvent(model::ListChange list_change) {
+ list_change_event_.Raise(list_change);
+ change_event_.Raise(nullptr);
+ }
private:
Event<std::nullptr_t> change_event_;
+ Event<model::ListChange> list_change_event_;
std::shared_ptr<StyleRuleSet> parent_ = nullptr;
EventRevokerGuard parent_change_event_guard_;