aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/common/base.hpp67
-rw-r--r--include/cru/common/bitmask.hpp42
-rw-r--r--include/cru/platform/native/basic_types.hpp16
-rw-r--r--include/cru/ui/base.hpp6
-rw-r--r--include/cru/ui/click_detector.hpp35
-rw-r--r--include/cru/ui/controls/button.hpp48
-rw-r--r--include/cru/ui/render/render_object.hpp2
-rw-r--r--include/cru/ui/render/window_render_object.hpp3
-rw-r--r--include/cru/ui/ui_event.hpp2
-rw-r--r--src/common/CMakeLists.txt1
-rw-r--r--src/ui/click_detector.cpp122
-rw-r--r--src/ui/controls/button.cpp74
-rw-r--r--src/ui/render/render_object.cpp10
-rw-r--r--src/ui/render/window_render_object.cpp21
-rw-r--r--src/win/native/window.cpp13
15 files changed, 230 insertions, 232 deletions
diff --git a/include/cru/common/base.hpp b/include/cru/common/base.hpp
index d4f164bf..4264142d 100644
--- a/include/cru/common/base.hpp
+++ b/include/cru/common/base.hpp
@@ -2,7 +2,6 @@
#include "pre_config.hpp"
#include <stdexcept>
-#include <type_traits>
#define CRU_UNUSED(entity) static_cast<void>(entity);
@@ -41,70 +40,4 @@ struct Interface {
[[noreturn]] inline void UnreachableCode() {
throw std::runtime_error("Unreachable code.");
}
-
} // namespace cru
-
-template <typename Enum>
-struct enable_bitmask_operators : std::false_type {};
-
-#define CRU_ENABLE_BITMASK_OPERATORS(enumname) \
- template <> \
- struct enable_bitmask_operators<enumname> : std::true_type {};
-
-template <typename Enum>
-auto operator|(Enum lhs, Enum rhs)
- -> std::enable_if_t<enable_bitmask_operators<Enum>::value, Enum> {
- using underlying = typename std::underlying_type<Enum>::type;
- return static_cast<Enum>(static_cast<underlying>(lhs) |
- static_cast<underlying>(rhs));
-}
-
-template <typename Enum>
-auto operator&(Enum lhs, Enum rhs)
- -> std::enable_if_t<enable_bitmask_operators<Enum>::value, Enum> {
- using underlying = typename std::underlying_type<Enum>::type;
- return static_cast<Enum>(static_cast<underlying>(lhs) &
- static_cast<underlying>(rhs));
-}
-
-template <typename Enum>
-auto operator^(Enum lhs, Enum rhs)
- -> std::enable_if_t<enable_bitmask_operators<Enum>::value, Enum> {
- using underlying = typename std::underlying_type<Enum>::type;
- return static_cast<Enum>(static_cast<underlying>(lhs) ^
- static_cast<underlying>(rhs));
-}
-
-template <typename Enum>
-auto operator~(Enum rhs)
- -> std::enable_if_t<enable_bitmask_operators<Enum>::value, Enum> {
- using underlying = typename std::underlying_type<Enum>::type;
- return static_cast<Enum>(~static_cast<underlying>(rhs));
-}
-
-template <typename Enum>
-auto operator|=(Enum& lhs, Enum rhs)
- -> std::enable_if_t<enable_bitmask_operators<Enum>::value, Enum&> {
- using underlying = typename std::underlying_type<Enum>::type;
- lhs = static_cast<Enum>(static_cast<underlying>(lhs) |
- static_cast<underlying>(rhs));
- return lhs;
-}
-
-template <typename Enum>
-auto operator&=(Enum& lhs, Enum rhs)
- -> std::enable_if_t<enable_bitmask_operators<Enum>::value, Enum&> {
- using underlying = typename std::underlying_type<Enum>::type;
- lhs = static_cast<Enum>(static_cast<underlying>(lhs) &
- static_cast<underlying>(rhs));
- return lhs;
-}
-
-template <typename Enum>
-auto operator^=(Enum& lhs, Enum rhs)
- -> std::enable_if_t<enable_bitmask_operators<Enum>::value, Enum&> {
- using underlying = typename std::underlying_type<Enum>::type;
- lhs = static_cast<Enum>(static_cast<underlying>(lhs) ^
- static_cast<underlying>(rhs));
- return lhs;
-}
diff --git a/include/cru/common/bitmask.hpp b/include/cru/common/bitmask.hpp
new file mode 100644
index 00000000..6dfb651c
--- /dev/null
+++ b/include/cru/common/bitmask.hpp
@@ -0,0 +1,42 @@
+#pragma once
+#include "base.hpp"
+
+namespace cru {
+template <typename Tag, typename TUnderlying = unsigned>
+struct Bitmask final {
+ using Underlying = TUnderlying;
+
+ constexpr Bitmask() : value(0) {}
+ constexpr explicit Bitmask(TUnderlying value) : value(value) {}
+
+ CRU_DEFAULT_COPY(Bitmask)
+ CRU_DEFAULT_MOVE(Bitmask)
+
+ ~Bitmask() = default;
+
+ Bitmask operator|(Bitmask rhs) const { return Bitmask(value | rhs.value); }
+ Bitmask operator&(Bitmask rhs) const { return Bitmask(value & rhs.value); }
+ Bitmask operator^(Bitmask rhs) const { return Bitmask(value ^ rhs.value); }
+ Bitmask operator~() const { return Bitmask(~value); }
+ Bitmask& operator|=(Bitmask rhs) {
+ value |= rhs;
+ return *this;
+ }
+ Bitmask& operator&=(Bitmask rhs) {
+ value &= rhs;
+ return *this;
+ }
+ Bitmask& operator^=(Bitmask rhs) {
+ value ^= rhs;
+ return *this;
+ }
+
+ bool operator==(Bitmask rhs) const { return this->value == rhs.value; }
+ bool operator!=(Bitmask rhs) const { return this->value != rhs.value; }
+
+ explicit operator TUnderlying() const { return value; }
+ explicit operator bool() const { return value != 0; }
+
+ TUnderlying value;
+};
+} // namespace cru
diff --git a/include/cru/platform/native/basic_types.hpp b/include/cru/platform/native/basic_types.hpp
index 247df06d..84cc61d1 100644
--- a/include/cru/platform/native/basic_types.hpp
+++ b/include/cru/platform/native/basic_types.hpp
@@ -1,5 +1,6 @@
#pragma once
#include "cru/common/base.hpp"
+#include "cru/common/bitmask.hpp"
namespace cru::platform::native {
struct Dpi {
@@ -7,7 +8,16 @@ struct Dpi {
float y;
};
-enum class MouseButton : unsigned { Left = 0b1, Right = 0b10, Middle = 0b100 };
-} // namespace cru::platform::native
+namespace details {
+struct TagMouseButton {};
+} // namespace details
+
+using MouseButton = Bitmask<details::TagMouseButton>;
-CRU_ENABLE_BITMASK_OPERATORS(::cru::platform::native::MouseButton)
+namespace mouse_buttons {
+constexpr MouseButton left{0b1};
+constexpr MouseButton middle{0b10};
+constexpr MouseButton right{0b100};
+} // namespace mouse_buttons
+
+} // namespace cru::platform::native
diff --git a/include/cru/ui/base.hpp b/include/cru/ui/base.hpp
index 581e6f8f..90a3f746 100644
--- a/include/cru/ui/base.hpp
+++ b/include/cru/ui/base.hpp
@@ -16,6 +16,12 @@ using cru::platform::TextRange;
using cru::platform::Thickness;
using cru::platform::native::MouseButton;
+namespace mouse_buttons {
+using cru::platform::native::mouse_buttons::left;
+using cru::platform::native::mouse_buttons::middle;
+using cru::platform::native::mouse_buttons::right;
+} // namespace mouse_buttons
+
namespace colors {
using cru::platform::colors::black;
using cru::platform::colors::skyblue;
diff --git a/include/cru/ui/click_detector.hpp b/include/cru/ui/click_detector.hpp
index d5e4ac78..9b59c717 100644
--- a/include/cru/ui/click_detector.hpp
+++ b/include/cru/ui/click_detector.hpp
@@ -49,7 +49,17 @@ class ClickDetector : public Object {
Control* GetControl() const { return control_; }
+ ClickState GetState() const { return state_; }
+
+ // Default is enable.
+ bool IsEnabled() const { return enable_; }
+ // If disable when user is pressing, the pressing is deactivated.
+ void SetEnabled(bool enable);
+
+ // Default is left and right.
MouseButton GetTriggerButton() const { return trigger_button_; }
+ // If unset the trigger button when user is pressing, the pressing is
+ // deactivated.
void SetTriggerButton(MouseButton trigger_button);
IEvent<ClickEventArgs>* ClickEvent() { return &event_; }
@@ -57,33 +67,22 @@ class ClickDetector : public Object {
IEvent<ClickState>* StateChangeEvent() { return &state_change_event_; }
private:
- std::optional<Point>& FromButton(MouseButton button) {
- switch (button) {
- case MouseButton::Left:
- return click_map_.left;
- case MouseButton::Middle:
- return click_map_.middle;
- case MouseButton::Right:
- return click_map_.right;
- default:
- UnreachableCode();
- }
- }
+ void SetState(ClickState state);
private:
Control* control_;
- MouseButton trigger_button_ = MouseButton::Left | MouseButton::Right;
+ ClickState state_;
+
+ bool enable_ = true;
+ MouseButton trigger_button_ = mouse_buttons::left | mouse_buttons::right;
Event<ClickEventArgs> event_;
Event<ClickState> state_change_event_;
std::vector<EventRevokerGuard> event_rovoker_guards_;
- struct {
- std::optional<Point> left = std::nullopt;
- std::optional<Point> middle = std::nullopt;
- std::optional<Point> right = std::nullopt;
- } click_map_;
+ Point down_point_;
+ MouseButton button_;
};
} // namespace cru::ui
diff --git a/include/cru/ui/controls/button.hpp b/include/cru/ui/controls/button.hpp
index 60b1243f..b24a9934 100644
--- a/include/cru/ui/controls/button.hpp
+++ b/include/cru/ui/controls/button.hpp
@@ -19,27 +19,16 @@ struct ButtonStateStyle {
};
struct ButtonStyle {
- // corresponds to ButtonState::Normal
+ // corresponds to ClickState::None
ButtonStateStyle normal;
- // corresponds to ButtonState::Hover
+ // corresponds to ClickState::Hover
ButtonStateStyle hover;
- // corresponds to ButtonState::Press
+ // corresponds to ClickState::Press
ButtonStateStyle press;
- // corresponds to ButtonState::PressCancel
+ // corresponds to ClickState::PressInactive
ButtonStateStyle press_cancel;
};
-enum class ButtonState {
- // mouse is not in it
- Normal,
- // mouse is in it and not pressed
- Hover,
- // mouse is pressed in it
- Press,
- // mouse is pressed outside button
- PressCancel,
-};
-
class Button : public ContentControl {
public:
static constexpr std::string_view control_type = "Button";
@@ -56,9 +45,7 @@ class Button : public ContentControl {
Button& operator=(Button&& other) = delete;
~Button() override = default;
- std::string_view GetControlType() const final {
- return control_type;
- }
+ std::string_view GetControlType() const final { return control_type; }
render::RenderObject* GetRenderObject() const override;
@@ -66,37 +53,12 @@ class Button : public ContentControl {
const ButtonStyle& GetStyle() const { return style_; }
void SetStyle(ButtonStyle style);
- ButtonState GetState() const { return state_; }
-
- // Get the trigger mouse button(s). Return value might be a union of Left,
- // Middle and Right.
- MouseButton GetTriggerButton() const { return trigger_button_; }
- // Set the trigger mouse button(s). You can set multiple buttons by passing a
- // union of Left, Middle and Right. If you disable a button when user is
- // pressing the same one, click will be stopped.
- // Default is only Left.
- void SetTriggerButton(MouseButton newTrigger);
-
protected:
void OnChildChanged(Control* old_child, Control* new_child) override;
- virtual void OnStateChange(ButtonState oldState, ButtonState newState);
-
- private:
- void SetState(ButtonState newState) {
- if (state_ == newState) return;
- const auto oldState = state_;
- state_ = newState;
- OnStateChange(oldState, newState);
- }
-
private:
std::unique_ptr<render::BorderRenderObject> render_object_{};
- ButtonState state_ = ButtonState::Normal;
-
- MouseButton trigger_button_ = MouseButton::Left;
-
ButtonStyle style_;
ClickDetector click_detector_;
diff --git a/include/cru/ui/render/render_object.hpp b/include/cru/ui/render/render_object.hpp
index 55b7f2da..3e351d34 100644
--- a/include/cru/ui/render/render_object.hpp
+++ b/include/cru/ui/render/render_object.hpp
@@ -117,6 +117,8 @@ class RenderObject : public Object {
private:
void SetParent(RenderObject* new_parent);
+ void SetRenderHostRecursive(IRenderHost* host);
+
private:
Control* control_ = nullptr;
IRenderHost* render_host_ = nullptr;
diff --git a/include/cru/ui/render/window_render_object.hpp b/include/cru/ui/render/window_render_object.hpp
index 8f35ad80..ae95b8ee 100644
--- a/include/cru/ui/render/window_render_object.hpp
+++ b/include/cru/ui/render/window_render_object.hpp
@@ -26,9 +26,6 @@ class WindowRenderObject : public RenderObject {
RenderObject* HitTest(const Point& point) override;
protected:
- void OnAddChild(RenderObject* new_child, int position) override;
- void OnRemoveChild(RenderObject* new_child, int position) override;
-
Size OnMeasureContent(const Size& available_size) override;
void OnLayoutContent(const Rect& content_rect) override;
diff --git a/include/cru/ui/ui_event.hpp b/include/cru/ui/ui_event.hpp
index c9ed1b80..147d3da6 100644
--- a/include/cru/ui/ui_event.hpp
+++ b/include/cru/ui/ui_event.hpp
@@ -100,7 +100,7 @@ class MouseButtonEventArgs : public MouseEventArgs {
MouseButtonEventArgs& operator=(MouseButtonEventArgs&& other) = default;
~MouseButtonEventArgs() override = default;
- MouseButton GetMouseButton() const { return button_; }
+ MouseButton GetButton() const { return button_; }
private:
MouseButton button_;
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index a6497222..f84a954a 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -4,6 +4,7 @@ add_library(cru_base STATIC
)
target_sources(cru_base PUBLIC
${CRU_BASE_INCLUDE_DIR}/base.hpp
+ ${CRU_BASE_INCLUDE_DIR}/bitmask.hpp
${CRU_BASE_INCLUDE_DIR}/event.hpp
${CRU_BASE_INCLUDE_DIR}/format.hpp
${CRU_BASE_INCLUDE_DIR}/logger.hpp
diff --git a/src/ui/click_detector.cpp b/src/ui/click_detector.cpp
index 05d6dce1..b620201c 100644
--- a/src/ui/click_detector.cpp
+++ b/src/ui/click_detector.cpp
@@ -1,5 +1,7 @@
#include "cru/ui/click_detector.hpp"
+#include "cru/common/logger.hpp"
+
#include <cassert>
#include <optional>
@@ -10,33 +12,119 @@ ClickDetector::ClickDetector(Control* control) {
event_rovoker_guards_.push_back(
EventRevokerGuard(control->MouseEnterEvent()->Direct()->AddHandler(
- [this, control](event::MouseEventArgs& args) {
- if
+ [this](event::MouseEventArgs&) {
+ if (this->enable_) {
+ if (this->state_ == ClickState::PressInactive) {
+ if ((this->button_ & this->trigger_button_)) {
+ this->SetState(ClickState::Press);
+ }
+ } else {
+ this->SetState(ClickState::Hover);
+ }
+ }
+ })));
+ event_rovoker_guards_.push_back(
+ EventRevokerGuard(control->MouseLeaveEvent()->Direct()->AddHandler(
+ [this](event::MouseEventArgs&) {
+ if (this->enable_) {
+ if (this->state_ == ClickState::Press) {
+ if ((this->button_ & this->trigger_button_)) {
+ this->SetState(ClickState::PressInactive);
+ }
+ } else {
+ this->SetState(ClickState::None);
+ }
+ }
})));
event_rovoker_guards_.push_back(
EventRevokerGuard(control->MouseDownEvent()->Direct()->AddHandler(
- [this, control](event::MouseButtonEventArgs& args) {
- if (!control->CaptureMouse()) return; // capture failed
- const auto button = args.GetMouseButton();
- FromButton(button) = args.GetPoint(); // save mouse down point
- begin_event_.Raise(button);
+ [this](event::MouseButtonEventArgs& args) {
+ const auto button = args.GetButton();
+ if (this->enable_ && (button & this->trigger_button_) &&
+ this->state_ == ClickState::Hover) {
+ if (!this->control_->CaptureMouse()) {
+ log::Debug("Failed to capture mouse when begin click.");
+ return;
+ }
+ this->down_point_ = args.GetPoint();
+ this->button_ = button;
+ this->SetState(ClickState::Press);
+ }
})));
event_rovoker_guards_.push_back(
EventRevokerGuard(control->MouseUpEvent()->Direct()->AddHandler(
- [this, control](event::MouseButtonEventArgs& args) {
- if (!control->IsMouseCaptured()) return;
- const auto button = args.GetMouseButton();
- auto& down_point = FromButton(button);
- if (down_point.has_value()) {
- event_.Raise(ClickEventArgs(control, down_point.value(),
- args.GetPoint(), button));
- end_event_.Raise(button);
- down_point = std::nullopt;
+ [this](event::MouseButtonEventArgs& args) {
+ const auto button = args.GetButton();
+ if (this->enable_ && (button & this->trigger_button_) &&
+ button == button_) {
+ if (this->state_ == ClickState::Press) {
+ this->SetState(ClickState::Hover);
+ this->event_.Raise(ClickEventArgs{this->control_,
+ this->down_point_,
+ args.GetPoint(), button});
+ this->control_->ReleaseMouse();
+ } else if (this->state_ == ClickState::PressInactive) {
+ this->SetState(ClickState::None);
+ this->control_->ReleaseMouse();
+ }
}
- control->ReleaseMouse();
})));
+} // namespace cru::ui
+
+void ClickDetector::SetEnabled(bool enable) {
+ if (enable == enable_) {
+ return;
+ }
+
+ enable_ = enable;
+ if (enable) {
+ SetState(control_->IsMouseOver() ? ClickState::Hover : ClickState::None);
+ } else {
+ if (state_ == ClickState::Press || state_ == ClickState::PressInactive) {
+ SetState(ClickState::None);
+ control_->ReleaseMouse();
+ } else if (state_ == ClickState::Hover) {
+ SetState(ClickState::None);
+ }
+ }
+}
+
+void ClickDetector::SetTriggerButton(MouseButton trigger_button) {
+ if (trigger_button == trigger_button_) {
+ return;
+ }
+
+ trigger_button_ = trigger_button;
+ if ((state_ == ClickState::Press || state_ == ClickState::PressInactive) &&
+ !(button_ & trigger_button)) {
+ SetState(control_->IsMouseOver() ? ClickState::Hover : ClickState::None);
+ control_->ReleaseMouse();
+ }
+}
+
+void ClickDetector::SetState(ClickState state) {
+#ifdef CRU_DEBUG
+ auto to_string = [](ClickState state) -> std::string_view {
+ switch (state) {
+ case ClickState::None:
+ return "None";
+ case ClickState::Hover:
+ return "Hover";
+ case ClickState::Press:
+ return "Press";
+ case ClickState::PressInactive:
+ return "PressInvactive";
+ default:
+ UnreachableCode();
+ }
+ };
+ log::Debug("Click state changed, new state: {}.", to_string(state));
+#endif
+
+ state_ = state;
+ state_change_event_.Raise(state);
}
} // namespace cru::ui
diff --git a/src/ui/controls/button.cpp b/src/ui/controls/button.cpp
index 75651a1d..7dc5a5d7 100644
--- a/src/ui/controls/button.cpp
+++ b/src/ui/controls/button.cpp
@@ -35,37 +35,27 @@ Button::Button() : click_detector_(this) {
Set(render_object_.get(), style_.normal);
render_object_->SetBorderEnabled(true);
- MouseEnterEvent()->Direct()->AddHandler([this](event::MouseEventArgs& args) {
- CRU_UNUSED(args)
-
- if (click_detector_.GetPressingButton() & trigger_button_) {
- SetState(ButtonState::Press);
- } else {
- SetState(ButtonState::Hover);
- }
- });
-
- MouseLeaveEvent()->Direct()->AddHandler([this](event::MouseEventArgs& args) {
- CRU_UNUSED(args)
-
- if (click_detector_.GetPressingButton() & trigger_button_) {
- SetState(ButtonState::Normal);
- } else {
- SetState(ButtonState::PressCancel);
- }
- });
-
- click_detector_.ClickBeginEvent()->AddHandler([this](MouseButton button) {
- if (button & trigger_button_) {
- SetState(ButtonState::Press);
- }
- });
-
- click_detector_.ClickEndEvent()->AddHandler([this](MouseButton button) {
- if (button & trigger_button_) {
- SetState(ButtonState::Hover);
- }
- });
+ click_detector_.StateChangeEvent()->AddHandler(
+ [this](const ClickState& state) {
+ switch (state) {
+ case ClickState::None:
+ Set(render_object_.get(), style_.normal);
+ SetCursor(GetSystemCursor(SystemCursorType::Arrow));
+ break;
+ case ClickState::Hover:
+ Set(render_object_.get(), style_.hover);
+ SetCursor(GetSystemCursor(SystemCursorType::Hand));
+ break;
+ case ClickState::Press:
+ Set(render_object_.get(), style_.press);
+ SetCursor(GetSystemCursor(SystemCursorType::Hand));
+ break;
+ case ClickState::PressInactive:
+ Set(render_object_.get(), style_.press_cancel);
+ SetCursor(GetSystemCursor(SystemCursorType::Arrow));
+ break;
+ }
+ });
}
render::RenderObject* Button::GetRenderObject() const {
@@ -78,26 +68,4 @@ void Button::OnChildChanged(Control* old_child, Control* new_child) {
render_object_->AddChild(new_child->GetRenderObject(), 0);
}
-void Button::OnStateChange(ButtonState oldState, ButtonState newState) {
- CRU_UNUSED(oldState)
-
- switch (newState) {
- case ButtonState::Normal:
- Set(render_object_.get(), style_.normal);
- SetCursor(GetSystemCursor(SystemCursorType::Arrow));
- break;
- case ButtonState::Hover:
- Set(render_object_.get(), style_.hover);
- SetCursor(GetSystemCursor(SystemCursorType::Hand));
- break;
- case ButtonState::Press:
- Set(render_object_.get(), style_.press);
- SetCursor(GetSystemCursor(SystemCursorType::Hand));
- break;
- case ButtonState::PressCancel:
- Set(render_object_.get(), style_.press_cancel);
- SetCursor(GetSystemCursor(SystemCursorType::Arrow));
- break;
- }
-}
} // namespace cru::ui::controls
diff --git a/src/ui/render/render_object.cpp b/src/ui/render/render_object.cpp
index 7f6255f7..d220b1c1 100644
--- a/src/ui/render/render_object.cpp
+++ b/src/ui/render/render_object.cpp
@@ -18,6 +18,7 @@ void RenderObject::AddChild(RenderObject* render_object, const int position) {
children_.insert(children_.cbegin() + position, render_object);
render_object->SetParent(this);
+ render_object->SetRenderHostRecursive(GetRenderHost());
OnAddChild(render_object, position);
}
@@ -30,6 +31,7 @@ void RenderObject::RemoveChild(const int position) {
const auto removed_child = *i;
children_.erase(i);
removed_child->SetParent(nullptr);
+ removed_child->SetRenderHostRecursive(nullptr);
OnRemoveChild(removed_child, position);
}
@@ -140,4 +142,12 @@ void RenderObject::NotifyAfterLayoutRecursive(RenderObject* render_object) {
NotifyAfterLayoutRecursive(o);
}
}
+
+void RenderObject::SetRenderHostRecursive(IRenderHost* host) {
+ SetRenderHost(host);
+ for (const auto child : GetChildren()) {
+ child->SetRenderHostRecursive(host);
+ }
+}
+
} // namespace cru::ui::render
diff --git a/src/ui/render/window_render_object.cpp b/src/ui/render/window_render_object.cpp
index 12fc2ce1..1001be87 100644
--- a/src/ui/render/window_render_object.cpp
+++ b/src/ui/render/window_render_object.cpp
@@ -88,27 +88,6 @@ RenderObject* WindowRenderObject::HitTest(const Point& point) {
return Rect{Point{}, GetSize()}.IsPointInside(point) ? this : nullptr;
}
-namespace {
-void SetRenderHostRecursive(RenderObject* render_object, IRenderHost* host) {
- render_object->SetRenderHost(host);
- for (const auto child : render_object->GetChildren()) {
- SetRenderHostRecursive(child, host);
- }
-}
-} // namespace
-
-void WindowRenderObject::OnAddChild(RenderObject* new_child, int position) {
- CRU_UNUSED(position)
-
- SetRenderHostRecursive(new_child, render_host_.get());
-}
-
-void WindowRenderObject::OnRemoveChild(RenderObject* new_child, int position) {
- CRU_UNUSED(position)
-
- SetRenderHostRecursive(new_child, nullptr);
-}
-
Size WindowRenderObject::OnMeasureContent(const Size& available_size) {
if (const auto child = GetChild()) child->Measure(available_size);
return available_size;
diff --git a/src/win/native/window.cpp b/src/win/native/window.cpp
index d3c12a44..a8016676 100644
--- a/src/win/native/window.cpp
+++ b/src/win/native/window.cpp
@@ -155,6 +155,7 @@ bool WinNativeWindow::ReleaseMouse() {
void WinNativeWindow::RequestRepaint() {
if (IsValid()) {
+ log::Debug("A repaint is requested.");
if (!::InvalidateRect(hwnd_, nullptr, FALSE))
throw Win32Error(::GetLastError(), "Failed to invalidate window.");
if (!::UpdateWindow(hwnd_))
@@ -262,7 +263,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg,
POINT point;
point.x = GET_X_LPARAM(l_param);
point.y = GET_Y_LPARAM(l_param);
- OnMouseDownInternal(platform::native::MouseButton::Left, point);
+ OnMouseDownInternal(platform::native::mouse_buttons::left, point);
*result = 0;
return true;
}
@@ -270,7 +271,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg,
POINT point;
point.x = GET_X_LPARAM(l_param);
point.y = GET_Y_LPARAM(l_param);
- OnMouseUpInternal(platform::native::MouseButton::Left, point);
+ OnMouseUpInternal(platform::native::mouse_buttons::left, point);
*result = 0;
return true;
}
@@ -278,7 +279,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg,
POINT point;
point.x = GET_X_LPARAM(l_param);
point.y = GET_Y_LPARAM(l_param);
- OnMouseDownInternal(platform::native::MouseButton::Right, point);
+ OnMouseDownInternal(platform::native::mouse_buttons::right, point);
*result = 0;
return true;
}
@@ -286,7 +287,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg,
POINT point;
point.x = GET_X_LPARAM(l_param);
point.y = GET_Y_LPARAM(l_param);
- OnMouseUpInternal(platform::native::MouseButton::Right, point);
+ OnMouseUpInternal(platform::native::mouse_buttons::right, point);
*result = 0;
return true;
}
@@ -294,7 +295,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg,
POINT point;
point.x = GET_X_LPARAM(l_param);
point.y = GET_Y_LPARAM(l_param);
- OnMouseDownInternal(platform::native::MouseButton::Middle, point);
+ OnMouseDownInternal(platform::native::mouse_buttons::middle, point);
*result = 0;
return true;
}
@@ -302,7 +303,7 @@ bool WinNativeWindow::HandleNativeWindowMessage(HWND hwnd, UINT msg,
POINT point;
point.x = GET_X_LPARAM(l_param);
point.y = GET_Y_LPARAM(l_param);
- OnMouseUpInternal(platform::native::MouseButton::Middle, point);
+ OnMouseUpInternal(platform::native::mouse_buttons::middle, point);
*result = 0;
return true;
}