aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-02-15 20:52:37 +0800
committercrupest <crupest@outlook.com>2022-02-15 20:52:37 +0800
commitfa6e9a419f688df12a57199aa3b4dce10cc6fd49 (patch)
treeab29f60da18826d287e84bb53bc124694fcccb2a
parent85f4cb239f10e1801e43f0874a4f637def5daaee (diff)
downloadcru-fa6e9a419f688df12a57199aa3b4dce10cc6fd49.tar.gz
cru-fa6e9a419f688df12a57199aa3b4dce10cc6fd49.tar.bz2
cru-fa6e9a419f688df12a57199aa3b4dce10cc6fd49.zip
...
-rw-r--r--include/cru/ui/components/PopupButton.h31
-rw-r--r--src/theme_builder/components/conditions/CompoundConditonEditor.cpp11
-rw-r--r--src/theme_builder/components/conditions/ConditionEditor.h5
-rw-r--r--src/ui/components/PopupButton.cpp24
4 files changed, 70 insertions, 1 deletions
diff --git a/include/cru/ui/components/PopupButton.h b/include/cru/ui/components/PopupButton.h
new file mode 100644
index 00000000..f8c545bf
--- /dev/null
+++ b/include/cru/ui/components/PopupButton.h
@@ -0,0 +1,31 @@
+#pragma once
+#include "Component.h"
+#include "cru/ui/components/Menu.h"
+#include "cru/ui/controls/Button.h"
+#include "cru/ui/controls/Popup.h"
+#include "cru/ui/controls/TextBlock.h"
+
+namespace cru::ui::components {
+class PopupMenuTextButton : public Component {
+ public:
+ PopupMenuTextButton();
+ ~PopupMenuTextButton() override;
+
+ public:
+ ui::controls::Control* GetRootControl() override { return &button_; }
+
+ String GetButtonText() { return button_text_.GetText(); }
+ void SetButtonText(String text) { button_text_.SetText(std::move(text)); }
+
+ void SetMenuItems(std::vector<String> items);
+
+ IEvent<Index>* MenuItemSelectedEvent() { return &menu_item_selected_event_; }
+
+ private:
+ ui::controls::Button button_;
+ ui::controls::TextBlock button_text_;
+ PopupMenu popup_menu_;
+
+ Event<Index> menu_item_selected_event_;
+};
+} // namespace cru::ui::components
diff --git a/src/theme_builder/components/conditions/CompoundConditonEditor.cpp b/src/theme_builder/components/conditions/CompoundConditonEditor.cpp
index 812c27dc..96daa20b 100644
--- a/src/theme_builder/components/conditions/CompoundConditonEditor.cpp
+++ b/src/theme_builder/components/conditions/CompoundConditonEditor.cpp
@@ -1,4 +1,6 @@
#include "CompoundConditionEditor.h"
+#include "cru/common/ClonablePtr.h"
+#include "cru/ui/style/Condition.h"
namespace cru::theme_builder::components::conditions {
CompoundConditionEditorChild::CompoundConditionEditorChild(
@@ -26,4 +28,13 @@ CompoundConditionEditor::CompoundConditionEditor() {
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.h b/src/theme_builder/components/conditions/ConditionEditor.h
index 0bbaa6ed..64d5a19e 100644
--- a/src/theme_builder/components/conditions/ConditionEditor.h
+++ b/src/theme_builder/components/conditions/ConditionEditor.h
@@ -1,13 +1,14 @@
#pragma once
+#include "cru/common/ClonablePtr.h"
#include "cru/ui/components/Component.h"
#include "cru/ui/controls/FlexLayout.h"
#include "cru/ui/controls/TextBlock.h"
+#include "cru/ui/style/Condition.h"
namespace cru::theme_builder::components::conditions {
class ConditionEditor : public ui::components::Component {
public:
ConditionEditor();
-
~ConditionEditor() override;
public:
@@ -18,6 +19,8 @@ class ConditionEditor : public ui::components::Component {
String GetLabel() const { return label_.GetText(); }
void SetLabel(String label) { label_.SetText(std::move(label)); }
+ virtual ClonablePtr<ui::style::Condition> GetCondition() = 0;
+
private:
ui::controls::FlexLayout container_;
ui::controls::TextBlock label_;
diff --git a/src/ui/components/PopupButton.cpp b/src/ui/components/PopupButton.cpp
new file mode 100644
index 00000000..606d5fd8
--- /dev/null
+++ b/src/ui/components/PopupButton.cpp
@@ -0,0 +1,24 @@
+#include "cru/ui/components/PopupButton.h"
+#include "cru/ui/components/Menu.h"
+#include "cru/ui/controls/Popup.h"
+#include "cru/ui/helper/ClickDetector.h"
+
+namespace cru::ui::components {
+PopupMenuTextButton::PopupMenuTextButton() : popup_menu_(&button_) {
+ button_.SetChild(&button_text_);
+ button_.ClickEvent()->AddHandler([this](const helper::ClickEventArgs& args) {
+ popup_menu_.SetPosition(args.GetDownPoint());
+ popup_menu_.Show();
+ });
+}
+
+PopupMenuTextButton::~PopupMenuTextButton() { button_.RemoveFromParent(); }
+
+void PopupMenuTextButton::SetMenuItems(std::vector<String> items) {
+ popup_menu_.GetMenu()->ClearItems();
+ for (Index i = 0; i < items.size(); i++) {
+ popup_menu_.GetMenu()->AddTextItem(
+ std::move(items[i]), [this, i] { menu_item_selected_event_.Raise(i); });
+ }
+}
+} // namespace cru::ui::components