aboutsummaryrefslogtreecommitdiff
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
parentec2060983edd2b77ff90b2533404d77ea892a5d9 (diff)
downloadcru-6459edc7c8af9e5c9bafe4f1635194334f42f415.tar.gz
cru-6459edc7c8af9e5c9bafe4f1635194334f42f415.tar.bz2
cru-6459edc7c8af9e5c9bafe4f1635194334f42f415.zip
...
-rw-r--r--include/cru/ui/style/Condition.h4
-rw-r--r--src/theme_builder/CMakeLists.txt1
-rw-r--r--src/theme_builder/components/conditions/CheckedConditionEditor.cpp5
-rw-r--r--src/theme_builder/components/conditions/CheckedConditionEditor.h5
-rw-r--r--src/theme_builder/components/conditions/ClickStateConditionEditor.cpp5
-rw-r--r--src/theme_builder/components/conditions/ClickStateConditionEditor.h6
-rw-r--r--src/theme_builder/components/conditions/CompoundConditionEditor.cpp103
-rw-r--r--src/theme_builder/components/conditions/CompoundConditionEditor.h57
-rw-r--r--src/theme_builder/components/conditions/CompoundConditonEditor.cpp40
-rw-r--r--src/theme_builder/components/conditions/ConditionEditor.cpp35
-rw-r--r--src/theme_builder/components/conditions/ConditionEditor.h3
-rw-r--r--src/theme_builder/components/conditions/FocusConditionEditor.cpp4
-rw-r--r--src/theme_builder/components/conditions/FocusConditionEditor.h5
13 files changed, 215 insertions, 58 deletions
diff --git a/include/cru/ui/style/Condition.h b/include/cru/ui/style/Condition.h
index b45c0e07..28f42315 100644
--- a/include/cru/ui/style/Condition.h
+++ b/include/cru/ui/style/Condition.h
@@ -42,6 +42,10 @@ class CRU_UI_API CompoundCondition : public Condition {
std::vector<IBaseEvent*> ChangeOn(controls::Control* control) const override;
+ std::vector<ClonablePtr<Condition>> GetChildren() const {
+ return conditions_;
+ }
+
protected:
std::vector<ClonablePtr<Condition>> conditions_;
};
diff --git a/src/theme_builder/CMakeLists.txt b/src/theme_builder/CMakeLists.txt
index 6b0242c7..5b968918 100644
--- a/src/theme_builder/CMakeLists.txt
+++ b/src/theme_builder/CMakeLists.txt
@@ -5,6 +5,7 @@ add_executable(cru_theme_builder
components/StyleRuleSetEditor.cpp
components/conditions/CheckedConditionEditor.cpp
components/conditions/ClickStateConditionEditor.cpp
+ components/conditions/CompoundConditionEditor.cpp
components/conditions/ConditionEditor.cpp
components/conditions/FocusConditionEditor.cpp
components/properties/CheckBoxPropertyEditor.cpp
diff --git a/src/theme_builder/components/conditions/CheckedConditionEditor.cpp b/src/theme_builder/components/conditions/CheckedConditionEditor.cpp
index 0d9b5956..756bd2af 100644
--- a/src/theme_builder/components/conditions/CheckedConditionEditor.cpp
+++ b/src/theme_builder/components/conditions/CheckedConditionEditor.cpp
@@ -17,9 +17,8 @@ ClonablePtr<ui::style::CheckedCondition> CheckedConditionEditor::GetValue()
return ui::style::CheckedCondition::Create(checked_check_box_.GetValue());
}
-void CheckedConditionEditor::SetValue(
- const ClonablePtr<ui::style::CheckedCondition> &value,
- bool trigger_change) {
+void CheckedConditionEditor::SetValue(ui::style::CheckedCondition* value,
+ bool trigger_change) {
checked_check_box_.SetValue(value->IsChecked(), trigger_change);
}
} // namespace cru::theme_builder::components::conditions
diff --git a/src/theme_builder/components/conditions/CheckedConditionEditor.h b/src/theme_builder/components/conditions/CheckedConditionEditor.h
index 4a5fae4e..e5203770 100644
--- a/src/theme_builder/components/conditions/CheckedConditionEditor.h
+++ b/src/theme_builder/components/conditions/CheckedConditionEditor.h
@@ -12,8 +12,11 @@ class CheckedConditionEditor : public ConditionEditor {
public:
ClonablePtr<ui::style::CheckedCondition> GetValue() const;
+ void SetValue(ui::style::CheckedCondition* value, bool trigger_change = true);
void SetValue(const ClonablePtr<ui::style::CheckedCondition>& value,
- bool trigger_change = true);
+ bool trigger_change = true) {
+ SetValue(value.get(), trigger_change);
+ }
ClonablePtr<ui::style::Condition> GetCondition() override {
return GetValue();
diff --git a/src/theme_builder/components/conditions/ClickStateConditionEditor.cpp b/src/theme_builder/components/conditions/ClickStateConditionEditor.cpp
index 80d221bd..65238700 100644
--- a/src/theme_builder/components/conditions/ClickStateConditionEditor.cpp
+++ b/src/theme_builder/components/conditions/ClickStateConditionEditor.cpp
@@ -60,9 +60,8 @@ ClickStateConditionEditor::GetValue() const {
ConvertIndexToClickState(click_state_select_.GetSelectedIndex()));
}
-void ClickStateConditionEditor::SetValue(
- const ClonablePtr<ui::style::ClickStateCondition>& value,
- bool trigger_change) {
+void ClickStateConditionEditor::SetValue(ui::style::ClickStateCondition* value,
+ bool trigger_change) {
click_state_select_.SetSelectedIndex(
ConvertClickStateToIndex(value->GetClickState()), trigger_change);
}
diff --git a/src/theme_builder/components/conditions/ClickStateConditionEditor.h b/src/theme_builder/components/conditions/ClickStateConditionEditor.h
index 4e18c423..78664620 100644
--- a/src/theme_builder/components/conditions/ClickStateConditionEditor.h
+++ b/src/theme_builder/components/conditions/ClickStateConditionEditor.h
@@ -13,8 +13,12 @@ class ClickStateConditionEditor : public ConditionEditor {
public:
ClonablePtr<ui::style::ClickStateCondition> GetValue() const;
- void SetValue(const ClonablePtr<ui::style::ClickStateCondition>& value,
+ void SetValue(ui::style::ClickStateCondition* value,
bool trigger_change = true);
+ void SetValue(const ClonablePtr<ui::style::ClickStateCondition>& value,
+ bool trigger_change = true) {
+ SetValue(value.get(), trigger_change);
+ }
ClonablePtr<ui::style::Condition> GetCondition() override {
return GetValue();
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
diff --git a/src/theme_builder/components/conditions/CompoundConditionEditor.h b/src/theme_builder/components/conditions/CompoundConditionEditor.h
index db58b50a..bedbdc56 100644
--- a/src/theme_builder/components/conditions/CompoundConditionEditor.h
+++ b/src/theme_builder/components/conditions/CompoundConditionEditor.h
@@ -3,6 +3,7 @@
#include "cru/common/ClonablePtr.h"
#include "cru/common/Event.h"
#include "cru/ui/components/Component.h"
+#include "cru/ui/components/PopupButton.h"
#include "cru/ui/controls/Button.h"
#include "cru/ui/controls/FlexLayout.h"
#include "cru/ui/controls/TextBlock.h"
@@ -38,18 +39,60 @@ class CompoundConditionEditor : public ConditionEditor {
protected:
std::vector<ClonablePtr<ui::style::Condition>> GetChildren();
- void SetChildren(std::vector<ClonablePtr<ui::style::Condition>> children);
+ void SetChildren(std::vector<ClonablePtr<ui::style::Condition>> children,
+ bool trigger_change = true);
- IEvent<std::nullptr_t>* ChildrenChangeEvent() {
- return &children_change_event_;
- }
+ IEvent<std::nullptr_t>* ChangeEvent() { return &change_event_; }
private:
ui::controls::FlexLayout children_container_;
- ui::controls::Button add_child_button_;
- ui::controls::TextBlock add_child_button_text_;
+ ui::components::PopupMenuTextButton add_child_button_;
std::vector<std::unique_ptr<CompoundConditionEditorChild>> children_;
- Event<std::nullptr_t> children_change_event_;
+ Event<std::nullptr_t> change_event_;
+};
+
+class AndConditionEditor : public CompoundConditionEditor {
+ public:
+ AndConditionEditor() = default;
+ ~AndConditionEditor() override = default;
+
+ public:
+ ClonablePtr<ui::style::AndCondition> GetValue() {
+ return ui::style::AndCondition::Create(GetChildren());
+ }
+ void SetValue(ui::style::AndCondition* value, bool trigger_change = true) {
+ SetChildren(value->GetChildren(), trigger_change);
+ }
+ void SetValue(const ClonablePtr<ui::style::AndCondition>& value,
+ bool trigger_change = true) {
+ SetValue(value.get(), trigger_change);
+ }
+
+ ClonablePtr<ui::style::Condition> GetCondition() override {
+ return GetValue();
+ }
+};
+
+class OrConditionEditor : public CompoundConditionEditor {
+ public:
+ OrConditionEditor() = default;
+ ~OrConditionEditor() override = default;
+
+ public:
+ ClonablePtr<ui::style::OrCondition> GetValue() {
+ return ui::style::OrCondition::Create(GetChildren());
+ }
+ void SetValue(ui::style::OrCondition* value, bool trigger_change = true) {
+ SetChildren(value->GetChildren(), trigger_change);
+ }
+ void SetValue(const ClonablePtr<ui::style::OrCondition>& value,
+ bool trigger_change = true) {
+ SetValue(value.get(), trigger_change);
+ }
+
+ ClonablePtr<ui::style::Condition> GetCondition() override {
+ return GetValue();
+ }
};
} // namespace cru::theme_builder::components::conditions
diff --git a/src/theme_builder/components/conditions/CompoundConditonEditor.cpp b/src/theme_builder/components/conditions/CompoundConditonEditor.cpp
deleted file mode 100644
index 96daa20b..00000000
--- a/src/theme_builder/components/conditions/CompoundConditonEditor.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "CompoundConditionEditor.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); });
-}
-
-CompoundConditionEditor::CompoundConditionEditor() {
- GetContainer()->AddChild(&children_container_);
- GetContainer()->AddChild(&add_child_button_);
-
- add_child_button_.SetChild(&add_child_button_text_);
- add_child_button_text_.SetText(u"+");
-}
-
-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;
-}
-
-} // namespace cru::theme_builder::components::conditions
diff --git a/src/theme_builder/components/conditions/ConditionEditor.cpp b/src/theme_builder/components/conditions/ConditionEditor.cpp
index 772fcc98..f5edf674 100644
--- a/src/theme_builder/components/conditions/ConditionEditor.cpp
+++ b/src/theme_builder/components/conditions/ConditionEditor.cpp
@@ -1,4 +1,8 @@
#include "ConditionEditor.h"
+#include "CheckedConditionEditor.h"
+#include "ClickStateConditionEditor.h"
+#include "CompoundConditionEditor.h"
+#include "FocusConditionEditor.h"
#include "cru/ui/controls/FlexLayout.h"
namespace cru::theme_builder::components::conditions {
@@ -8,4 +12,35 @@ ConditionEditor::ConditionEditor() {
}
ConditionEditor::~ConditionEditor() { container_.RemoveFromParent(); }
+
+std::unique_ptr<ConditionEditor> CreateConditionEditor(
+ ui::style::Condition* condition) {
+ if (auto and_condition = dynamic_cast<ui::style::AndCondition*>(condition)) {
+ auto result = std::make_unique<AndConditionEditor>();
+ result->SetValue(and_condition);
+ return result;
+ } else if (auto or_condition =
+ dynamic_cast<ui::style::OrCondition*>(condition)) {
+ auto result = std::make_unique<OrConditionEditor>();
+ result->SetValue(or_condition);
+ return result;
+ } else if (auto click_state_condition =
+ dynamic_cast<ui::style::ClickStateCondition*>(condition)) {
+ auto result = std::make_unique<ClickStateConditionEditor>();
+ result->SetValue(click_state_condition);
+ return result;
+ } else if (auto focus_condition =
+ dynamic_cast<ui::style::FocusCondition*>(condition)) {
+ auto result = std::make_unique<FocusConditionEditor>();
+ result->SetValue(focus_condition);
+ return result;
+ } else if (auto checked_condition =
+ dynamic_cast<ui::style::CheckedCondition*>(condition)) {
+ auto result = std::make_unique<CheckedConditionEditor>();
+ result->SetValue(checked_condition);
+ return result;
+ } else {
+ return nullptr;
+ }
+}
} // namespace cru::theme_builder::components::conditions
diff --git a/src/theme_builder/components/conditions/ConditionEditor.h b/src/theme_builder/components/conditions/ConditionEditor.h
index 64d5a19e..32984810 100644
--- a/src/theme_builder/components/conditions/ConditionEditor.h
+++ b/src/theme_builder/components/conditions/ConditionEditor.h
@@ -25,4 +25,7 @@ class ConditionEditor : public ui::components::Component {
ui::controls::FlexLayout container_;
ui::controls::TextBlock label_;
};
+
+std::unique_ptr<ConditionEditor> CreateConditionEditor(
+ ui::style::Condition* condition);
} // namespace cru::theme_builder::components::conditions
diff --git a/src/theme_builder/components/conditions/FocusConditionEditor.cpp b/src/theme_builder/components/conditions/FocusConditionEditor.cpp
index d5d864e1..c4ac0dc9 100644
--- a/src/theme_builder/components/conditions/FocusConditionEditor.cpp
+++ b/src/theme_builder/components/conditions/FocusConditionEditor.cpp
@@ -16,8 +16,8 @@ ClonablePtr<ui::style::FocusCondition> FocusConditionEditor::GetValue() const {
return ui::style::FocusCondition::Create(focus_check_box_.GetValue());
}
-void FocusConditionEditor::SetValue(
- const ClonablePtr<ui::style::FocusCondition> &value, bool trigger_change) {
+void FocusConditionEditor::SetValue(ui::style::FocusCondition* value,
+ bool trigger_change) {
focus_check_box_.SetValue(value->IsHasFocus(), trigger_change);
}
} // namespace cru::theme_builder::components::conditions
diff --git a/src/theme_builder/components/conditions/FocusConditionEditor.h b/src/theme_builder/components/conditions/FocusConditionEditor.h
index ab5d40c6..f96ad821 100644
--- a/src/theme_builder/components/conditions/FocusConditionEditor.h
+++ b/src/theme_builder/components/conditions/FocusConditionEditor.h
@@ -12,8 +12,11 @@ class FocusConditionEditor : public ConditionEditor {
public:
ClonablePtr<ui::style::FocusCondition> GetValue() const;
+ void SetValue(ui::style::FocusCondition* value, bool trigger_change = true);
void SetValue(const ClonablePtr<ui::style::FocusCondition>& value,
- bool trigger_change = true);
+ bool trigger_change = true) {
+ SetValue(value.get(), trigger_change);
+ }
ClonablePtr<ui::style::Condition> GetCondition() override {
return GetValue();