aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/ui/controls/Control.h12
-rw-r--r--src/osx/gui/Window.mm2
-rw-r--r--src/theme_builder/CMakeLists.txt1
-rw-r--r--src/theme_builder/components/StyleRuleEditor.cpp17
-rw-r--r--src/theme_builder/components/StyleRuleEditor.h30
-rw-r--r--src/theme_builder/components/StyleRuleSetEditor.cpp10
-rw-r--r--src/theme_builder/components/StyleRuleSetEditor.h8
-rw-r--r--src/ui/components/Menu.cpp17
-rw-r--r--src/ui/controls/Control.cpp17
-rw-r--r--src/ui/host/WindowHost.cpp2
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();