aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-11-09 16:18:20 +0800
committercrupest <crupest@outlook.com>2020-11-09 16:18:20 +0800
commit349b26d350d46fd6c48c6895ee9d8ef81add1315 (patch)
tree05ad55ea728f9f5451c554f7faf7a76260aaddf8
parent12301a4e71de0802019381215a821ce58723c39a (diff)
downloadcru-349b26d350d46fd6c48c6895ee9d8ef81add1315.tar.gz
cru-349b26d350d46fd6c48c6895ee9d8ef81add1315.tar.bz2
cru-349b26d350d46fd6c48c6895ee9d8ef81add1315.zip
...
-rw-r--r--include/cru/ui/controls/LayoutControl.hpp18
-rw-r--r--include/cru/ui/controls/Popup.hpp23
-rw-r--r--src/ui/CMakeLists.txt2
-rw-r--r--src/ui/controls/LayoutControl.cpp17
-rw-r--r--src/ui/controls/Popup.cpp20
5 files changed, 78 insertions, 2 deletions
diff --git a/include/cru/ui/controls/LayoutControl.hpp b/include/cru/ui/controls/LayoutControl.hpp
index cbdb8aa2..106dd94d 100644
--- a/include/cru/ui/controls/LayoutControl.hpp
+++ b/include/cru/ui/controls/LayoutControl.hpp
@@ -5,6 +5,8 @@ namespace cru::ui::controls {
class LayoutControl : public Control {
protected:
LayoutControl() = default;
+ explicit LayoutControl(render::RenderObject* container_render_object)
+ : container_render_object_(container_render_object) {}
public:
LayoutControl(const LayoutControl& other) = delete;
@@ -15,5 +17,19 @@ class LayoutControl : public Control {
using Control::AddChild;
using Control::RemoveChild;
+
+ protected:
+ // If container render object is not null. Render object of added or removed
+ // child control will automatically sync to the container render object.
+ render::RenderObject* GetContainerRenderObject() const;
+ void SetContainerRenderObject(render::RenderObject* ro) {
+ container_render_object_ = ro;
+ }
+
+ void OnAddChild(Control* child, Index position) override;
+ void OnRemoveChild(Control* child, Index position) override;
+
+ private:
+ render::RenderObject* container_render_object_ = nullptr;
};
-} // namespace cru::ui
+} // namespace cru::ui::controls
diff --git a/include/cru/ui/controls/Popup.hpp b/include/cru/ui/controls/Popup.hpp
new file mode 100644
index 00000000..f17cd1b2
--- /dev/null
+++ b/include/cru/ui/controls/Popup.hpp
@@ -0,0 +1,23 @@
+#pragma once
+#include "LayoutControl.hpp"
+
+#include <memory>
+
+namespace cru::ui::controls {
+class Popup : public LayoutControl {
+ public:
+ explicit Popup(Control* attached_control = nullptr);
+
+ CRU_DELETE_COPY(Popup)
+ CRU_DELETE_MOVE(Popup)
+
+ ~Popup() override;
+
+ private:
+ std::unique_ptr<host::WindowHost> window_host_;
+
+ std::unique_ptr<render::StackLayoutRenderObject> render_object_;
+
+ Control* attached_control_;
+};
+} // namespace cru::ui::controls
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index 2f0eb10d..15ad1258 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -13,6 +13,7 @@ add_library(cru_ui STATIC
controls/FlexLayout.cpp
controls/LayoutControl.cpp
controls/NoChildControl.cpp
+ controls/Popup.cpp
controls/StackLayout.cpp
controls/TextBlock.cpp
controls/TextBox.cpp
@@ -44,6 +45,7 @@ target_sources(cru_ui PUBLIC
${CRU_UI_INCLUDE_DIR}/controls/FlexLayout.hpp
${CRU_UI_INCLUDE_DIR}/controls/LayoutControl.hpp
${CRU_UI_INCLUDE_DIR}/controls/NoChildControl.hpp
+ ${CRU_UI_INCLUDE_DIR}/controls/Popup.hpp
${CRU_UI_INCLUDE_DIR}/controls/StackLayout.hpp
${CRU_UI_INCLUDE_DIR}/controls/TextBox.hpp
${CRU_UI_INCLUDE_DIR}/controls/TextBlock.hpp
diff --git a/src/ui/controls/LayoutControl.cpp b/src/ui/controls/LayoutControl.cpp
index 85417beb..5954853e 100644
--- a/src/ui/controls/LayoutControl.cpp
+++ b/src/ui/controls/LayoutControl.cpp
@@ -1,3 +1,18 @@
#include "cru/ui/controls/LayoutControl.hpp"
-namespace cru::ui::controls {}
+#include "cru/ui/render/RenderObject.hpp"
+
+namespace cru::ui::controls {
+void LayoutControl::OnAddChild(Control* child, Index position) {
+ if (container_render_object_ != nullptr) {
+ container_render_object_->AddChild(child->GetRenderObject(), position);
+ }
+}
+
+void LayoutControl::OnRemoveChild(Control* child, Index position) {
+ CRU_UNUSED(child)
+ if (container_render_object_ != nullptr) {
+ container_render_object_->RemoveChild(position);
+ }
+}
+} // namespace cru::ui::controls
diff --git a/src/ui/controls/Popup.cpp b/src/ui/controls/Popup.cpp
new file mode 100644
index 00000000..f51f2b3b
--- /dev/null
+++ b/src/ui/controls/Popup.cpp
@@ -0,0 +1,20 @@
+#include "cru/ui/controls/Popup.hpp"
+
+#include "cru/platform/gui/UiApplication.hpp"
+#include "cru/ui/host/WindowHost.hpp"
+#include "cru/ui/render/StackLayoutRenderObject.hpp"
+
+#include <memory>
+
+namespace cru::ui::controls {
+Popup::Popup(Control* attached_control) : attached_control_(attached_control) {
+ render_object_ = std::make_unique<render::StackLayoutRenderObject>();
+ SetContainerRenderObject(render_object_.get());
+
+ window_host_ = std::make_unique<host::WindowHost>(
+ this, host::CreateWindowParams(
+ nullptr, platform::gui::CreateWindowFlags::NoCaptionAndBorder));
+}
+
+Popup::~Popup() = default;
+} // namespace cru::ui::controls