aboutsummaryrefslogtreecommitdiff
path: root/src/theme_builder/components/conditions/CompoundConditionEditor.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-02-16 19:10:00 +0800
committercrupest <crupest@outlook.com>2022-02-16 19:10:00 +0800
commit6459edc7c8af9e5c9bafe4f1635194334f42f415 (patch)
tree5d11434b5db55a8ab033676e1ed6a32a5bb2f599 /src/theme_builder/components/conditions/CompoundConditionEditor.cpp
parentec2060983edd2b77ff90b2533404d77ea892a5d9 (diff)
downloadcru-6459edc7c8af9e5c9bafe4f1635194334f42f415.tar.gz
cru-6459edc7c8af9e5c9bafe4f1635194334f42f415.tar.bz2
cru-6459edc7c8af9e5c9bafe4f1635194334f42f415.zip
...
Diffstat (limited to 'src/theme_builder/components/conditions/CompoundConditionEditor.cpp')
-rw-r--r--src/theme_builder/components/conditions/CompoundConditionEditor.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/theme_builder/components/conditions/CompoundConditionEditor.cpp b/src/theme_builder/components/conditions/CompoundConditionEditor.cpp
new file mode 100644
index 00000000..511fffdd
--- /dev/null
+++ b/src/theme_builder/components/conditions/CompoundConditionEditor.cpp
@@ -0,0 +1,103 @@
+#include "CompoundConditionEditor.h"
+#include "CheckedConditionEditor.h"
+#include "ClickStateConditionEditor.h"
+#include "ConditionEditor.h"
+#include "FocusConditionEditor.h"
+#include "cru/common/ClonablePtr.h"
+#include "cru/ui/style/Condition.h"
+
+namespace cru::theme_builder::components::conditions {
+CompoundConditionEditorChild::CompoundConditionEditorChild(
+ std::unique_ptr<ConditionEditor>&& condition_editor)
+ : condition_editor_(std::move(condition_editor)) {
+ container_.SetFlexDirection(ui::controls::FlexDirection::Horizontal);
+ container_.AddChild(&remove_button_);
+
+ remove_button_.SetChild(&remove_button_text_);
+ remove_button_text_.SetText(u"-");
+
+ container_.AddChild(condition_editor_->GetRootControl());
+
+ remove_button_.ClickEvent()->AddSpyOnlyHandler(
+ [this] { this->remove_event_.Raise(nullptr); });
+}
+
+CompoundConditionEditorChild::~CompoundConditionEditorChild() {
+ container_.RemoveFromParent();
+}
+
+CompoundConditionEditor::CompoundConditionEditor() {
+ GetContainer()->AddChild(&children_container_);
+ GetContainer()->AddChild(add_child_button_.GetRootControl());
+ add_child_button_.SetButtonText(u"+");
+ add_child_button_.SetMenuItems({
+ u"And Condtion",
+ u"Or Condtion",
+ u"Click State Condtion",
+ u"Focus Condtion",
+ u"Checked Condtion",
+ });
+ add_child_button_.MenuItemSelectedEvent()->AddHandler([this](Index index) {
+ std::unique_ptr<ConditionEditor> child;
+ switch (index) {
+ case 0:
+ child = std::make_unique<AndConditionEditor>();
+ break;
+ case 1:
+ child = std::make_unique<OrConditionEditor>();
+ break;
+ case 2:
+ child = std::make_unique<ClickStateConditionEditor>();
+ break;
+ case 3:
+ child = std::make_unique<FocusConditionEditor>();
+ break;
+ case 4:
+ child = std::make_unique<CheckedConditionEditor>();
+ break;
+ default:
+ break;
+ }
+ if (child) {
+ auto c = std::make_unique<CompoundConditionEditorChild>(std::move(child));
+ children_.push_back(std::move(c));
+ children_container_.AddChild(children_.back()->GetRootControl());
+ change_event_.Raise(nullptr);
+ }
+ });
+}
+
+CompoundConditionEditor::~CompoundConditionEditor() {}
+
+std::vector<ClonablePtr<ui::style::Condition>>
+CompoundConditionEditor::GetChildren() {
+ std::vector<ClonablePtr<ui::style::Condition>> children;
+ for (auto& child : children_) {
+ children.push_back(child->GetConditionEditor()->GetCondition());
+ }
+ return children;
+}
+
+void CompoundConditionEditor::SetChildren(
+ std::vector<ClonablePtr<ui::style::Condition>> children,
+ bool trigger_change) {
+ children_container_.ClearChildren();
+ children_.clear();
+ for (const auto& condition : children) {
+ auto condition_editor = CreateConditionEditor(condition.get());
+ auto child = std::make_unique<CompoundConditionEditorChild>(
+ std::move(condition_editor));
+ child->RemoveEvent()->AddSpyOnlyHandler([this, c = child.get()] {
+ auto index = this->children_container_.IndexOf(c->GetRootControl());
+ this->children_.erase(this->children_.begin() + index);
+ this->children_container_.RemoveChildAt(index);
+ change_event_.Raise(nullptr);
+ });
+ children_.push_back(std::move(child));
+ children_container_.AddChild(children_.back()->GetRootControl());
+ }
+ if (trigger_change) {
+ change_event_.Raise(nullptr);
+ }
+}
+} // namespace cru::theme_builder::components::conditions