diff options
author | crupest <crupest@outlook.com> | 2020-11-09 20:06:04 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2020-11-09 20:06:04 +0800 |
commit | 68fc33443981fcd499dfe263c228787e213ae943 (patch) | |
tree | 6a11d424a958d9c566e4c0b85b32212bfad9a1dc /src/ui/controls | |
parent | ddc6d6478f849ef10b832bc8b1d8ab7fe9454601 (diff) | |
download | cru-68fc33443981fcd499dfe263c228787e213ae943.tar.gz cru-68fc33443981fcd499dfe263c228787e213ae943.tar.bz2 cru-68fc33443981fcd499dfe263c228787e213ae943.zip |
...
Diffstat (limited to 'src/ui/controls')
-rw-r--r-- | src/ui/controls/Popup.cpp | 15 | ||||
-rw-r--r-- | src/ui/controls/RootControl.cpp | 45 | ||||
-rw-r--r-- | src/ui/controls/Window.cpp | 27 |
3 files changed, 63 insertions, 24 deletions
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 |