diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/CMakeLists.txt | 3 | ||||
-rw-r--r-- | core/src/Model/Workflow/Value.hpp | 1 | ||||
-rw-r--r-- | core/src/Model/Workflow/Value_RTTI.cpp | 9 | ||||
-rw-r--r-- | core/src/Model/Workflow/Values/List.cpp | 100 | ||||
-rw-r--r-- | core/src/Model/Workflow/Values/List.hpp | 50 |
5 files changed, 162 insertions, 1 deletions
diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 520210d..781140d 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -41,9 +41,9 @@ add_source_group(MODEL_MODULE_SOURCES ) add_source_group(MODEL_TEMPLATE_SOURCES - src/Model/Template/TableTemplate.cpp src/Model/Template/Template_Main.cpp src/Model/Template/Template_RTTI.cpp + src/Model/Template/TableTemplate.cpp ) add_source_group(MODEL_WORKFLOW_MODULE_SOURCES @@ -64,6 +64,7 @@ add_source_group(MODEL_WORKFLOW_NODES_MODULE_SOURCES add_source_group(MODEL_WORKFLOW_VALUES_MODULE_SOURCES src/Model/Workflow/Values/Basic.cpp src/Model/Workflow/Values/Database.cpp + src/Model/Workflow/Values/List.cpp ) set(UI_MODULE_SOURCES diff --git a/core/src/Model/Workflow/Value.hpp b/core/src/Model/Workflow/Value.hpp index ff62d43..39c0bf3 100644 --- a/core/src/Model/Workflow/Value.hpp +++ b/core/src/Model/Workflow/Value.hpp @@ -16,6 +16,7 @@ public: KD_Text, KD_DateTime, KD_DatabaseRowId, + KD_List, KD_BaseObject, KD_SaleDatabaseRow, diff --git a/core/src/Model/Workflow/Value_RTTI.cpp b/core/src/Model/Workflow/Value_RTTI.cpp index 44b047c..d6721d7 100644 --- a/core/src/Model/Workflow/Value_RTTI.cpp +++ b/core/src/Model/Workflow/Value_RTTI.cpp @@ -2,6 +2,7 @@ #include "Model/Workflow/Values/Basic.hpp" #include "Model/Workflow/Values/Database.hpp" +#include "Model/Workflow/Values/List.hpp" #include "UI/UI.hpp" constexpr BaseValue::KindInfo kNumericInfo{ @@ -24,6 +25,11 @@ constexpr BaseValue::KindInfo kDatabaseRowIdInfo{ .PinColor = RgbaColor(216, 42, 221), }; +constexpr BaseValue::KindInfo kListInfo{ + .PinIcon = ImGui::IconType::Diamond, + .PinColor = RgbaColor(58, 154, 214), +}; + constexpr BaseValue::KindInfo kDatabaseRowInfo{ .PinIcon = ImGui::IconType::Square, .PinColor = RgbaColor(15, 124, 196), @@ -41,6 +47,7 @@ const BaseValue::KindInfo& BaseValue::QueryInfo(BaseValue::Kind kind) case KD_Text: return kTextInfo; case KD_DateTime: return kDateTimeInfo; case KD_DatabaseRowId: return kDatabaseRowIdInfo; + case KD_List: return kListInfo; case KD_BaseObject: return kObjectinfo; case KD_SaleDatabaseRow: @@ -59,6 +66,7 @@ const char* BaseValue::Format(Kind kind) case KD_Text: return "Text"; case KD_DateTime: return "Date/time"; case KD_DatabaseRowId: return "Row id"; + case KD_List: return "List"; case KD_BaseObject: return "Object"; case KD_SaleDatabaseRow: return "Sale record"; @@ -76,6 +84,7 @@ std::unique_ptr<BaseValue> BaseValue::CreateByKind(BaseValue::Kind kind) case KD_Text: return std::make_unique<TextValue>(); case KD_DateTime: return std::make_unique<DateTimeValue>(); case KD_DatabaseRowId: return std::make_unique<DatabaseRowIdValue>(); + case KD_List: return std::make_unique<ListValue>(); case KD_BaseObject: return nullptr; case KD_SaleDatabaseRow: return std::make_unique<SaleDatabaseRowValue>(); diff --git a/core/src/Model/Workflow/Values/List.cpp b/core/src/Model/Workflow/Values/List.cpp new file mode 100644 index 0000000..9fd6bfd --- /dev/null +++ b/core/src/Model/Workflow/Values/List.cpp @@ -0,0 +1,100 @@ +#include "List.hpp" + +#include <utility> + +BaseValue* ListValue::Iterator::operator*() const +{ + return mIter->get(); +} + +BaseValue* ListValue::Iterator::operator->() const +{ + return mIter->get(); +} + +ListValue::Iterator& ListValue::Iterator::operator++() +{ + ++mIter; + return *this; +} + +ListValue::Iterator ListValue::Iterator::operator++(int) const +{ + return Iterator(mIter + 1); +} + +ListValue::Iterator& ListValue::Iterator::operator--() +{ + --mIter; + return *this; +} + +ListValue::Iterator ListValue::Iterator::operator--(int) const +{ + return Iterator(mIter - 1); +} + +bool operator==(const ListValue::Iterator& a, const ListValue::Iterator& b) +{ + return a.mIter == b.mIter; +} + +ListValue::Iterator::Iterator(decltype(mIter) iter) + : mIter{ iter } +{ +} + +bool ListValue::IsInstance(const BaseValue* value) +{ + return value->GetKind() == KD_List; +} + +ListValue::ListValue() + : BaseValue(KD_List) +{ +} + +int ListValue::GetCount() const +{ + return mElements.size(); +} + +BaseValue* ListValue::GetElement(int i) const +{ + return mElements[i].get(); +} + +void ListValue::Append(std::unique_ptr<BaseValue> element) +{ + mElements.push_back(std::move(element)); +} + +void ListValue::Insert(int i, std::unique_ptr<BaseValue> element) +{ + mElements.insert(mElements.begin() + i, std::move(element)); +} + +void ListValue::Insert(Iterator iter, std::unique_ptr<BaseValue> element) +{ + mElements.insert(iter.mIter, std::move(element)); +} + +void ListValue::Remove(int i) +{ + mElements.erase(mElements.begin() + i); +} + +void ListValue::Remove(Iterator iter) +{ + mElements.erase(iter.mIter); +} + +ListValue::Iterator ListValue::begin() +{ + return Iterator(mElements.begin()); +} + +ListValue::Iterator ListValue::end() +{ + return Iterator(mElements.end()); +} diff --git a/core/src/Model/Workflow/Values/List.hpp b/core/src/Model/Workflow/Values/List.hpp new file mode 100644 index 0000000..706a95c --- /dev/null +++ b/core/src/Model/Workflow/Values/List.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "Model/Workflow/Value.hpp" + +#include <memory> +#include <vector> + +class ListValue : public BaseValue +{ +public: + class Iterator + { + private: + std::vector<std::unique_ptr<BaseValue>>::iterator mIter; + + public: + BaseValue* operator*() const; + BaseValue* operator->() const; + + Iterator& operator++(); + Iterator operator++(int) const; + Iterator& operator--(); + Iterator operator--(int) const; + + friend bool operator==(const Iterator& a, const Iterator& b); + + private: + friend class ListValue; + Iterator(decltype(mIter) iter); + }; + +private: + std::vector<std::unique_ptr<BaseValue>> mElements; + +public: + static bool IsInstance(const BaseValue* value); + ListValue(); + + int GetCount() const; + BaseValue* GetElement(int i) const; + + void Append(std::unique_ptr<BaseValue> element); + void Insert(int i, std::unique_ptr<BaseValue> element); + void Insert(Iterator iter, std::unique_ptr<BaseValue> element); + void Remove(int i); + void Remove(Iterator iter); + + Iterator begin(); + Iterator end(); +}; |