aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/host
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-17 12:54:55 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-17 12:54:55 +0800
commit0f8f98b9005803ab154b43dcad0db1f292072a4d (patch)
tree0a43d5a9c4e3b747ad955fc30a143aa07ab5888d /include/cru/ui/host
parentb68f9f52a3ecdd8e379dd60ac1c1366e76695464 (diff)
downloadcru-0f8f98b9005803ab154b43dcad0db1f292072a4d.tar.gz
cru-0f8f98b9005803ab154b43dcad0db1f292072a4d.tar.bz2
cru-0f8f98b9005803ab154b43dcad0db1f292072a4d.zip
Refactor window host.
Diffstat (limited to 'include/cru/ui/host')
-rw-r--r--include/cru/ui/host/LayoutPaintCycler.h39
-rw-r--r--include/cru/ui/host/WindowHost.h172
2 files changed, 0 insertions, 211 deletions
diff --git a/include/cru/ui/host/LayoutPaintCycler.h b/include/cru/ui/host/LayoutPaintCycler.h
deleted file mode 100644
index e4ff7aa8..00000000
--- a/include/cru/ui/host/LayoutPaintCycler.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#pragma once
-#include "../Base.h"
-
-#include "cru/platform/gui/UiApplication.h"
-
-#include <chrono>
-
-namespace cru::ui::host {
-class CRU_UI_API LayoutPaintCycler {
- public:
- explicit LayoutPaintCycler(WindowHost* host);
-
- CRU_DELETE_COPY(LayoutPaintCycler)
- CRU_DELETE_MOVE(LayoutPaintCycler)
-
- ~LayoutPaintCycler();
-
- public:
- void InvalidateLayout();
- void InvalidatePaint();
-
- bool IsLayoutDirty() { return layout_dirty_; }
-
- private:
- void OnCycle();
-
- private:
- WindowHost* host_;
-
- platform::gui::TimerAutoCanceler timer_canceler_;
-
- bool layout_dirty_ = true;
- bool paint_dirty_ = true;
-
- std::chrono::steady_clock::time_point last_cycle_time_;
- std::chrono::steady_clock::duration cycle_threshold_ =
- std::chrono::milliseconds(1000) / 144;
-};
-} // namespace cru::ui::host
diff --git a/include/cru/ui/host/WindowHost.h b/include/cru/ui/host/WindowHost.h
deleted file mode 100644
index 13b06b07..00000000
--- a/include/cru/ui/host/WindowHost.h
+++ /dev/null
@@ -1,172 +0,0 @@
-#pragma once
-#include "../Base.h"
-
-#include "../render/RenderObject.h"
-#include "cru/base/Event.h"
-#include "cru/platform/gui/Cursor.h"
-#include "cru/platform/gui/UiApplication.h"
-#include "cru/platform/gui/Window.h"
-
-#include <functional>
-#include <memory>
-
-namespace cru::ui::host {
-class LayoutPaintCycler;
-
-struct AfterLayoutEventArgs {};
-
-// The bridge between control tree and native window.
-class CRU_UI_API WindowHost : public Object {
- friend controls::Control;
- CRU_DEFINE_CLASS_LOG_TAG("WindowHost")
-
- private:
- static int event_handling_depth_;
-
- public:
- static bool IsInEventHandling() { return event_handling_depth_ > 0; }
- static void EnterEventHandling();
- static void LeaveEventHandling();
-
- public:
- explicit WindowHost(controls::Control* root_control);
- ~WindowHost() override;
-
- public:
- platform::gui::INativeWindow* GetNativeWindow() {
- return native_window_.get();
- }
-
- // Mark the layout as invalid, and arrange a re-layout later.
- // This method could be called more than one times in a message cycle. But
- // layout only takes place once.
- void InvalidateLayout();
-
- // Mark the paint as invalid, and arrange a re-paint later.
- // This method could be called more than one times in a message cycle. But
- // paint only takes place once.
- void InvalidatePaint();
-
- IEvent<AfterLayoutEventArgs>* AfterLayoutEvent() {
- return &after_layout_event_;
- }
-
- void Relayout();
- void RelayoutWithSize(const Size& available_size = Size::Infinite(),
- bool set_window_size_to_fit_content = false);
-
- void Repaint();
-
- // Is layout is invalid, wait for relayout and then run the action. Otherwist
- // run it right now.
- void RunAfterLayoutStable(std::function<void()> action);
-
- // If true, preferred size of root render object is set to window size when
- // measure. Default is true.
- bool IsLayoutPreferToFillWindow() const;
- void SetLayoutPreferToFillWindow(bool value);
-
- // Get current control that mouse hovers on. This ignores the mouse-capture
- // control. Even when mouse is captured by another control, this function
- // return the control under cursor. You can use `GetMouseCaptureControl` to
- // get more info.
- controls::Control* GetMouseHoverControl() const {
- return mouse_hover_control_;
- }
-
- //*************** region: focus ***************
-
- controls::Control* GetFocusControl();
-
- void SetFocusControl(controls::Control* control);
-
- //*************** region: focus ***************
-
- // Pass nullptr to release capture. If mouse is already capture by a control,
- // this capture will fail and return false. If control is identical to the
- // capturing control, capture is not changed and this function will return
- // true.
- //
- // When capturing control changes,
- // appropriate event will be sent. If mouse is not on the capturing control
- // and capture is released, mouse enter event will be sent to the mouse-hover
- // control. If mouse is not on the capturing control and capture is set, mouse
- // leave event will be sent to the mouse-hover control.
- bool CaptureMouseFor(controls::Control* control);
-
- // Return null if not captured.
- controls::Control* GetMouseCaptureControl();
-
- controls::Control* HitTest(const Point& point);
-
- void UpdateCursor();
-
- IEvent<platform::gui::INativeWindow*>* NativeWindowChangeEvent() {
- return &native_window_change_event_;
- }
-
- std::shared_ptr<platform::gui::ICursor> GetOverrideCursor();
- void SetOverrideCursor(std::shared_ptr<platform::gui::ICursor> cursor);
-
- private:
- std::unique_ptr<platform::gui::INativeWindow> CreateNativeWindow();
-
- //*************** region: native messages ***************
- void OnNativeDestroy(platform::gui::INativeWindow* window, std::nullptr_t);
- void OnNativePaint(platform::gui::INativeWindow* window, std::nullptr_t);
- void OnNativeResize(platform::gui::INativeWindow* window, const Size& size);
-
- void OnNativeFocus(platform::gui::INativeWindow* window,
- cru::platform::gui::FocusChangeType focus);
-
- void OnNativeMouseEnterLeave(platform::gui::INativeWindow* window,
- cru::platform::gui::MouseEnterLeaveType enter);
- void OnNativeMouseMove(platform::gui::INativeWindow* window,
- const Point& point);
- void OnNativeMouseDown(platform::gui::INativeWindow* window,
- const platform::gui::NativeMouseButtonEventArgs& args);
- void OnNativeMouseUp(platform::gui::INativeWindow* window,
- const platform::gui::NativeMouseButtonEventArgs& args);
- void OnNativeMouseWheel(platform::gui::INativeWindow* window,
- const platform::gui::NativeMouseWheelEventArgs& args);
-
- void OnNativeKeyDown(platform::gui::INativeWindow* window,
- const platform::gui::NativeKeyEventArgs& args);
- void OnNativeKeyUp(platform::gui::INativeWindow* window,
- const platform::gui::NativeKeyEventArgs& args);
-
- //*************** region: event dispatcher helper ***************
-
- void DispatchMouseHoverControlChangeEvent(controls::Control* old_control,
- controls::Control* new_control,
- const Point& point, bool no_leave,
- bool no_enter);
-
- void OnControlDetach(controls::Control* control);
-
- private:
- controls::Control* root_control_ = nullptr;
- render::RenderObject* root_render_object_ = nullptr;
-
- std::unique_ptr<platform::gui::INativeWindow> native_window_;
-
- std::unique_ptr<LayoutPaintCycler> layout_paint_cycler_;
-
- Event<AfterLayoutEventArgs> after_layout_event_;
- std::vector<std::function<void()> > after_layout_stable_action_;
-
- std::vector<EventHandlerRevokerGuard> event_revoker_guards_;
-
- controls::Control* mouse_hover_control_ = nullptr;
-
- controls::Control* focus_control_;
-
- controls::Control* mouse_captured_control_ = nullptr;
-
- bool layout_prefer_to_fill_window_ = false;
-
- Event<platform::gui::INativeWindow*> native_window_change_event_;
-
- std::shared_ptr<platform::gui::ICursor> override_cursor_;
-};
-} // namespace cru::ui::host