diff options
author | crupest <crupest@outlook.com> | 2022-02-08 21:13:01 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-02-08 21:13:01 +0800 |
commit | fa1764d7cb77aa683c6049f915a46b981f9161f7 (patch) | |
tree | e5b54620d3b84f5391e995ab483647214152ca99 | |
parent | 74bb9cd27242b9320f99ff4d2b50c3051576cc14 (diff) | |
download | cru-fa1764d7cb77aa683c6049f915a46b981f9161f7.tar.gz cru-fa1764d7cb77aa683c6049f915a46b981f9161f7.tar.bz2 cru-fa1764d7cb77aa683c6049f915a46b981f9161f7.zip |
...
-rw-r--r-- | include/cru/ui/controls/Control.h | 12 | ||||
-rw-r--r-- | src/osx/gui/Window.mm | 2 | ||||
-rw-r--r-- | src/theme_builder/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/theme_builder/components/StyleRuleEditor.cpp | 17 | ||||
-rw-r--r-- | src/theme_builder/components/StyleRuleEditor.h | 30 | ||||
-rw-r--r-- | src/theme_builder/components/StyleRuleSetEditor.cpp | 10 | ||||
-rw-r--r-- | src/theme_builder/components/StyleRuleSetEditor.h | 8 | ||||
-rw-r--r-- | src/ui/components/Menu.cpp | 17 | ||||
-rw-r--r-- | src/ui/controls/Control.cpp | 17 | ||||
-rw-r--r-- | src/ui/host/WindowHost.cpp | 2 |
10 files changed, 101 insertions, 15 deletions
diff --git a/include/cru/ui/controls/Control.h b/include/cru/ui/controls/Control.h index c00e3a65..edbf5919 100644 --- a/include/cru/ui/controls/Control.h +++ b/include/cru/ui/controls/Control.h @@ -5,8 +5,6 @@ #include "../render/Base.h" #include "cru/common/Event.h" -#include <string_view> - namespace cru::ui::controls { class CRU_UI_API Control : public Object { friend host::WindowHost; @@ -31,10 +29,18 @@ class CRU_UI_API Control : public Object { Control* GetParent() const { return parent_; } const std::vector<Control*>& GetChildren() const { return children_; } + Index IndexOf(Control* child) const; // Traverse the tree rooted the control including itself. void TraverseDescendants(const std::function<void(Control*)>& predicate); + bool IsAutoDeleteChildren() const { return auto_delete_children_; } + void SetAutoDeleteChildren(bool auto_delete_children) { + auto_delete_children_ = auto_delete_children; + } + + void RemoveFromParent(); + public: virtual render::RenderObject* GetRenderObject() const = 0; @@ -146,6 +152,8 @@ class CRU_UI_API Control : public Object { host::WindowHost* window_host_ = nullptr; + bool auto_delete_children_ = true; + private: bool is_mouse_over_ = false; diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm index f8a72599..4f2937a3 100644 --- a/src/osx/gui/Window.mm +++ b/src/osx/gui/Window.mm @@ -166,6 +166,8 @@ Point OsxWindowPrivate::TransformMousePoint(const Point& point) { } void OsxWindowPrivate::CreateWindow() { + Expects(!window_); + NSRect content_rect = Convert(content_rect_); NSWindowStyleMask style_mask = CalcWindowStyleMask(style_flag_); diff --git a/src/theme_builder/CMakeLists.txt b/src/theme_builder/CMakeLists.txt index 0ec34e39..194e857b 100644 --- a/src/theme_builder/CMakeLists.txt +++ b/src/theme_builder/CMakeLists.txt @@ -1,6 +1,7 @@ add_executable(cru_theme_builder main.cpp components/MainWindow.cpp + components/StyleRuleEditor.cpp components/StyleRuleSetEditor.cpp ) diff --git a/src/theme_builder/components/StyleRuleEditor.cpp b/src/theme_builder/components/StyleRuleEditor.cpp new file mode 100644 index 00000000..8b9df6db --- /dev/null +++ b/src/theme_builder/components/StyleRuleEditor.cpp @@ -0,0 +1,17 @@ +#include "StyleRuleEditor.h" + +namespace cru::theme_builder { +StyleRuleEditor::StyleRuleEditor() { + main_layout_ = ui::controls::FlexLayout::Create(); +} + +StyleRuleEditor::~StyleRuleEditor() {} + +void StyleRuleEditor::BindStyleRule(ui::style::StyleRule *rule) { + style_rule_ = rule; + UpdateView(); +} + +void StyleRuleEditor::UpdateView() {} + +} // namespace cru::theme_builder diff --git a/src/theme_builder/components/StyleRuleEditor.h b/src/theme_builder/components/StyleRuleEditor.h new file mode 100644 index 00000000..181ff0ef --- /dev/null +++ b/src/theme_builder/components/StyleRuleEditor.h @@ -0,0 +1,30 @@ +#pragma once +#include "cru/ui/components/Component.h" +#include "cru/ui/controls/Control.h" +#include "cru/ui/controls/FlexLayout.h" +#include "cru/ui/style/StyleRule.h" + +namespace cru::theme_builder { +class StyleRuleEditor : public ui::components::Component { + public: + StyleRuleEditor(); + + CRU_DELETE_COPY(StyleRuleEditor) + CRU_DELETE_MOVE(StyleRuleEditor) + + ~StyleRuleEditor() override; + + public: + ui::controls::Control* GetRootControl() override { return main_layout_; } + + void BindStyleRule(ui::style::StyleRule* rule); + + private: + void UpdateView(); + + private: + ui::controls::FlexLayout* main_layout_; + + ui::style::StyleRule* style_rule_; +}; +} // namespace cru::theme_builder diff --git a/src/theme_builder/components/StyleRuleSetEditor.cpp b/src/theme_builder/components/StyleRuleSetEditor.cpp index 933706a3..cfb2ad56 100644 --- a/src/theme_builder/components/StyleRuleSetEditor.cpp +++ b/src/theme_builder/components/StyleRuleSetEditor.cpp @@ -4,4 +4,14 @@ namespace cru::theme_builder { StyleRuleSetEditor::StyleRuleSetEditor() {} StyleRuleSetEditor::~StyleRuleSetEditor() {} + +void StyleRuleSetEditor::BindStyleRuleSet( + std::shared_ptr<ui::style::StyleRuleSet> rule_set) { + style_rule_set_ = std::move(rule_set); + UpdateView(); +} + +void StyleRuleSetEditor::UpdateView() { + +} } // namespace cru::theme_builder diff --git a/src/theme_builder/components/StyleRuleSetEditor.h b/src/theme_builder/components/StyleRuleSetEditor.h index ecb3ee95..50f1c80d 100644 --- a/src/theme_builder/components/StyleRuleSetEditor.h +++ b/src/theme_builder/components/StyleRuleSetEditor.h @@ -2,6 +2,7 @@ #include "cru/ui/components/Component.h" #include "cru/ui/controls/Control.h" #include "cru/ui/controls/FlexLayout.h" +#include "cru/ui/style/StyleRuleSet.h" namespace cru::theme_builder { class StyleRuleSetEditor : public ui::components::Component { @@ -16,7 +17,14 @@ class StyleRuleSetEditor : public ui::components::Component { public: ui::controls::Control* GetRootControl() override { return main_layout_; } + void BindStyleRuleSet(std::shared_ptr<ui::style::StyleRuleSet> rule_set); + + private: + void UpdateView(); + private: ui::controls::FlexLayout* main_layout_; + + std::shared_ptr<ui::style::StyleRuleSet> style_rule_set_; }; } // namespace cru::theme_builder diff --git a/src/ui/components/Menu.cpp b/src/ui/components/Menu.cpp index 873e7ce0..c6db8e4a 100644 --- a/src/ui/components/Menu.cpp +++ b/src/ui/components/Menu.cpp @@ -25,10 +25,8 @@ MenuItem::MenuItem() { MenuItem::MenuItem(String text) : MenuItem() { SetText(std::move(text)); } MenuItem::~MenuItem() { - if (!container_->GetWindowHost()) { - delete container_; - delete text_; - } + container_->RemoveFromParent(); + delete container_; } void MenuItem::SetText(String text) { text_->SetText(std::move(text)); } @@ -39,13 +37,12 @@ Menu::Menu() { } Menu::~Menu() { - if (!container_->GetWindowHost()) { - delete container_; - } - for (auto item : items_) { delete item; } + + container_->RemoveFromParent(); + delete container_; } void Menu::AddItem(Component* item, gsl::index index) { @@ -100,9 +97,7 @@ PopupMenu::PopupMenu(controls::Control* attached_control) PopupMenu::~PopupMenu() { delete menu_; - if (!popup_->GetWindowHost()) { - delete popup_; - } + delete popup_; } controls::Control* PopupMenu::GetRootControl() { return popup_; } diff --git a/src/ui/controls/Control.cpp b/src/ui/controls/Control.cpp index bda8cb35..36d5cd60 100644 --- a/src/ui/controls/Control.cpp +++ b/src/ui/controls/Control.cpp @@ -32,17 +32,32 @@ Control::Control() { } Control::~Control() { - for (const auto child : children_) delete child; + if (auto_delete_children_) { + for (const auto child : children_) { + delete child; + } + } } host::WindowHost* Control::GetWindowHost() const { return window_host_; } +Index Control::IndexOf(Control* child) const { + for (Index i = 0; i < children_.size(); ++i) { + if (children_[i] == child) return i; + } + return -1; +} + void Control::TraverseDescendants( const std::function<void(Control*)>& predicate) { predicate(this); for (auto c : GetChildren()) c->TraverseDescendants(predicate); } +void Control::RemoveFromParent() { + if (parent_) parent_->RemoveChild(parent_->IndexOf(this)); +} + bool Control::HasFocus() { auto host = GetWindowHost(); if (host == nullptr) return false; diff --git a/src/ui/host/WindowHost.cpp b/src/ui/host/WindowHost.cpp index 26d48f89..2d09a895 100644 --- a/src/ui/host/WindowHost.cpp +++ b/src/ui/host/WindowHost.cpp @@ -118,7 +118,7 @@ WindowHost::WindowHost(controls::Control* root_control) CreateNativeWindow(); } -WindowHost::~WindowHost() {} +WindowHost::~WindowHost() { delete native_window_; } gsl::not_null<platform::gui::INativeWindow*> WindowHost::CreateNativeWindow() { const auto ui_application = IUiApplication::GetInstance(); |