diff options
author | crupest <crupest@outlook.com> | 2022-02-16 19:10:00 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-02-16 19:10:00 +0800 |
commit | 6459edc7c8af9e5c9bafe4f1635194334f42f415 (patch) | |
tree | 5d11434b5db55a8ab033676e1ed6a32a5bb2f599 | |
parent | ec2060983edd2b77ff90b2533404d77ea892a5d9 (diff) | |
download | cru-6459edc7c8af9e5c9bafe4f1635194334f42f415.tar.gz cru-6459edc7c8af9e5c9bafe4f1635194334f42f415.tar.bz2 cru-6459edc7c8af9e5c9bafe4f1635194334f42f415.zip |
...
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(); |