aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demos/main/main.cpp2
-rw-r--r--include/cru/ui/controls/Popup.hpp17
-rw-r--r--include/cru/ui/controls/RootControl.hpp40
-rw-r--r--include/cru/ui/controls/Window.hpp34
-rw-r--r--src/ui/CMakeLists.txt2
-rw-r--r--src/ui/controls/Popup.cpp15
-rw-r--r--src/ui/controls/RootControl.cpp45
-rw-r--r--src/ui/controls/Window.cpp27
8 files changed, 130 insertions, 52 deletions
diff --git a/demos/main/main.cpp b/demos/main/main.cpp
index 2d5939f1..66354289 100644
--- a/demos/main/main.cpp
+++ b/demos/main/main.cpp
@@ -23,7 +23,7 @@ int main() {
auto application = CreateUiApplication();
- const auto window = Window::CreateOverlapped();
+ const auto window = Window::Create();
const auto flex_layout = FlexLayout::Create();
flex_layout->SetFlexDirection(cru::ui::FlexDirection::Vertical);
diff --git a/include/cru/ui/controls/Popup.hpp b/include/cru/ui/controls/Popup.hpp
index f17cd1b2..d76e1211 100644
--- a/include/cru/ui/controls/Popup.hpp
+++ b/include/cru/ui/controls/Popup.hpp
@@ -1,10 +1,13 @@
#pragma once
-#include "LayoutControl.hpp"
+#include "RootControl.hpp"
+
+#include "cru/ui/Base.hpp"
+#include "cru/platform/gui/Base.hpp"
#include <memory>
namespace cru::ui::controls {
-class Popup : public LayoutControl {
+class Popup : public RootControl {
public:
explicit Popup(Control* attached_control = nullptr);
@@ -13,11 +16,9 @@ class Popup : public LayoutControl {
~Popup() override;
- private:
- std::unique_ptr<host::WindowHost> window_host_;
-
- std::unique_ptr<render::StackLayoutRenderObject> render_object_;
-
- Control* attached_control_;
+ protected:
+ gsl::not_null<platform::gui::INativeWindow*> CreateNativeWindow(
+ gsl::not_null<host::WindowHost*> host,
+ platform::gui::INativeWindow* parent) override;
};
} // namespace cru::ui::controls
diff --git a/include/cru/ui/controls/RootControl.hpp b/include/cru/ui/controls/RootControl.hpp
new file mode 100644
index 00000000..ff1b545a
--- /dev/null
+++ b/include/cru/ui/controls/RootControl.hpp
@@ -0,0 +1,40 @@
+#pragma once
+#include "LayoutControl.hpp"
+
+#include "cru/common/Base.hpp"
+#include "cru/platform/gui/Base.hpp"
+#include "cru/ui/Base.hpp"
+
+namespace cru::ui::controls {
+class RootControl : public LayoutControl {
+ protected:
+ explicit RootControl(Control* attached_control);
+
+ public:
+ CRU_DELETE_COPY(RootControl)
+ CRU_DELETE_MOVE(RootControl)
+ ~RootControl() override;
+
+ public:
+ render::RenderObject* GetRenderObject() const override;
+
+ // If create is false and native window is not create, it will not be created
+ // and shown.
+ void Show(bool create = true);
+
+ protected:
+ virtual gsl::not_null<platform::gui::INativeWindow*> CreateNativeWindow(
+ gsl::not_null<host::WindowHost*> host,
+ platform::gui::INativeWindow* parent) = 0;
+
+ private:
+ platform::gui::INativeWindow* GetNativeWindow(bool create);
+
+ 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/include/cru/ui/controls/Window.hpp b/include/cru/ui/controls/Window.hpp
index 996bc75e..cca56b64 100644
--- a/include/cru/ui/controls/Window.hpp
+++ b/include/cru/ui/controls/Window.hpp
@@ -1,36 +1,32 @@
#pragma once
-#include "LayoutControl.hpp"
+#include "cru/platform/gui/Base.hpp"
+#include "cru/ui/controls/RootControl.hpp"
+
+#include "cru/common/Base.hpp"
namespace cru::ui::controls {
-class Window final : public LayoutControl {
+class Window final : public RootControl {
public:
static constexpr std::u16string_view control_type = u"Window";
public:
- static Window* CreateOverlapped();
+ static Window* Create(Control* attached_control = nullptr);
private:
- Window();
+ explicit Window(Control* attached_control);
public:
- Window(const Window& other) = delete;
- Window(Window&& other) = delete;
- Window& operator=(const Window& other) = delete;
- Window& operator=(Window&& other) = delete;
+ CRU_DELETE_COPY(Window)
+ CRU_DELETE_MOVE(Window)
+
~Window() override;
public:
- std::u16string_view GetControlType() const final;
-
- render::RenderObject* GetRenderObject() const override;
-
- // If create is false and native window is not create, it will not be created
- // and shown.
- void Show(bool create = true);
-
- private:
- std::unique_ptr<host::WindowHost> window_host_;
+ std::u16string_view GetControlType() const final { return control_type; }
- std::unique_ptr<render::StackLayoutRenderObject> render_object_;
+ protected:
+ gsl::not_null<platform::gui::INativeWindow*> CreateNativeWindow(
+ gsl::not_null<host::WindowHost*> host,
+ platform::gui::INativeWindow* parent) override;
};
} // namespace cru::ui::controls
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index 15ad1258..d9edf49e 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -14,6 +14,7 @@ add_library(cru_ui STATIC
controls/LayoutControl.cpp
controls/NoChildControl.cpp
controls/Popup.cpp
+ controls/RootControl.cpp
controls/StackLayout.cpp
controls/TextBlock.cpp
controls/TextBox.cpp
@@ -46,6 +47,7 @@ target_sources(cru_ui PUBLIC
${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/RootControl.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/Popup.cpp b/src/ui/controls/Popup.cpp
index 982aee38..bc217bf5 100644
--- a/src/ui/controls/Popup.cpp
+++ b/src/ui/controls/Popup.cpp
@@ -1,19 +1,22 @@
#include "cru/ui/controls/Popup.hpp"
#include "cru/platform/gui/UiApplication.hpp"
+#include "cru/ui/controls/RootControl.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>();
- render_object_->SetAttachedControl(this);
- SetContainerRenderObject(render_object_.get());
+Popup::Popup(Control* attached_control) : RootControl(attached_control) {}
- window_host_ = std::make_unique<host::WindowHost>(this);
+Popup::~Popup() = default;
+
+gsl::not_null<platform::gui::INativeWindow*> Popup::CreateNativeWindow(
+ gsl::not_null<host::WindowHost*> host,
+ platform::gui::INativeWindow* parent) {
+ return host->CreateNativeWindow(
+ {parent, platform::gui::CreateWindowFlags::NoCaptionAndBorder});
}
-Popup::~Popup() = default;
} // namespace cru::ui::controls
diff --git a/src/ui/controls/RootControl.cpp b/src/ui/controls/RootControl.cpp
new file mode 100644
index 00000000..61d272f8
--- /dev/null
+++ b/src/ui/controls/RootControl.cpp
@@ -0,0 +1,45 @@
+#include "cru/ui/controls/RootControl.hpp"
+
+#include "cru/common/Base.hpp"
+#include "cru/platform/gui/Base.hpp"
+#include "cru/ui/host/WindowHost.hpp"
+#include "cru/ui/render/Base.hpp"
+#include "cru/ui/render/StackLayoutRenderObject.hpp"
+#include "gsl/pointers"
+
+#include <memory>
+
+namespace cru::ui::controls {
+RootControl::RootControl(Control* attached_control)
+ : attached_control_(attached_control) {
+ render_object_ = std::make_unique<render::StackLayoutRenderObject>();
+ render_object_->SetAttachedControl(this);
+ SetContainerRenderObject(render_object_.get());
+ window_host_ = std::make_unique<host::WindowHost>(this);
+}
+
+RootControl::~RootControl() {}
+
+render::RenderObject* RootControl::GetRenderObject() const {
+ return render_object_.get();
+}
+
+void RootControl::Show(bool create) {
+ platform::gui::INativeWindow* native_window = GetNativeWindow(create);
+ if (!native_window) return;
+ native_window->SetVisible(true);
+}
+
+platform::gui::INativeWindow* RootControl::GetNativeWindow(bool create) {
+ const auto host = GetWindowHost();
+ platform::gui::INativeWindow* native_window = host->GetNativeWindow();
+ if (!create) return native_window;
+ if (!native_window) {
+ native_window = this->CreateNativeWindow(
+ host, attached_control_
+ ? attached_control_->GetWindowHost()->GetNativeWindow()
+ : nullptr);
+ }
+ return native_window;
+}
+} // namespace cru::ui::controls
diff --git a/src/ui/controls/Window.cpp b/src/ui/controls/Window.cpp
index b302cb62..ba66f42e 100644
--- a/src/ui/controls/Window.cpp
+++ b/src/ui/controls/Window.cpp
@@ -2,32 +2,23 @@
#include "cru/common/Base.hpp"
#include "cru/platform/gui/Base.hpp"
+#include "cru/ui/controls/RootControl.hpp"
#include "cru/ui/host/WindowHost.hpp"
#include "cru/ui/render/Base.hpp"
#include "cru/ui/render/StackLayoutRenderObject.hpp"
namespace cru::ui::controls {
-Window* Window::CreateOverlapped() { return new Window(); }
-
-Window::Window() : render_object_(new render::StackLayoutRenderObject()) {
- render_object_->SetAttachedControl(this);
- SetContainerRenderObject(render_object_.get());
- window_host_ = std::make_unique<host::WindowHost>(this);
+Window* Window::Create(Control* attached_control) {
+ return new Window(attached_control);
}
-Window::~Window() {}
-
-std::u16string_view Window::GetControlType() const { return control_type; }
+Window::Window(Control* attached_control) : RootControl(attached_control) {}
-render::RenderObject* Window::GetRenderObject() const {
- return render_object_.get();
-}
+Window::~Window() {}
-void Window::Show(bool create) {
- platform::gui::INativeWindow* native_window =
- create ? window_host_->CreateNativeWindow().get()
- : window_host_->GetNativeWindow();
- if (!native_window) return;
- native_window->SetVisible(true);
+gsl::not_null<platform::gui::INativeWindow*> Window::CreateNativeWindow(
+ gsl::not_null<host::WindowHost*> host,
+ platform::gui::INativeWindow* parent) {
+ return host->CreateNativeWindow({parent});
}
} // namespace cru::ui::controls