diff options
author | crupest <crupest@outlook.com> | 2021-10-26 19:22:08 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-10-26 19:22:08 +0800 |
commit | 395c5aa302518af0d9f66dfafc910b3eab88742d (patch) | |
tree | 5fa452058f5650fc62c37d0f435b8914c5b1aac5 | |
parent | 253341d93d8e3cb38a204b539822ca1cc8597754 (diff) | |
download | cru-395c5aa302518af0d9f66dfafc910b3eab88742d.tar.gz cru-395c5aa302518af0d9f66dfafc910b3eab88742d.tar.bz2 cru-395c5aa302518af0d9f66dfafc910b3eab88742d.zip |
...
-rw-r--r-- | include/cru/ui/DebugFlags.hpp | 2 | ||||
-rw-r--r-- | src/osx/graphics/quartz/TextLayout.cpp | 2 | ||||
-rw-r--r-- | src/osx/gui/Window.mm | 43 | ||||
-rw-r--r-- | src/osx/gui/WindowPrivate.h | 4 | ||||
-rw-r--r-- | src/ui/host/WindowHost.cpp | 1 |
5 files changed, 45 insertions, 7 deletions
diff --git a/include/cru/ui/DebugFlags.hpp b/include/cru/ui/DebugFlags.hpp index c25c10fa..71d2c03e 100644 --- a/include/cru/ui/DebugFlags.hpp +++ b/include/cru/ui/DebugFlags.hpp @@ -6,5 +6,5 @@ constexpr bool layout = false; constexpr bool shortcut = false; constexpr bool text_service = false; constexpr int click_detector = 0; -constexpr int draw = 1; +constexpr int draw = 0; } // namespace cru::ui::debug_flags diff --git a/src/osx/graphics/quartz/TextLayout.cpp b/src/osx/graphics/quartz/TextLayout.cpp index 41d04958..5145f9f9 100644 --- a/src/osx/graphics/quartz/TextLayout.cpp +++ b/src/osx/graphics/quartz/TextLayout.cpp @@ -146,6 +146,8 @@ Point OsxCTTextLayout::TextSinglePoint(Index position, bool trailing) { } } + if (lines_.empty()) return Point{}; + return Convert(CTLineGetImageBounds(lines_.back(), nullptr)).GetRightTop(); } diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm index 84cc1145..bbf05f4d 100644 --- a/src/osx/gui/Window.mm +++ b/src/osx/gui/Window.mm @@ -75,6 +75,10 @@ void OsxWindowPrivate::OnWindowDidResize() { osx_window_->RequestRepaint(); } +void OsxWindowPrivate::OnBecomeKeyWindow() { focus_event_.Raise(FocusChangeType::Gain); } + +void OsxWindowPrivate::OnResignKeyWindow() { focus_event_.Raise(FocusChangeType::Lost); } + void OsxWindowPrivate::OnMouseEnterLeave(MouseEnterLeaveType type) { mouse_enter_leave_event_.Raise(type); if (type == MouseEnterLeaveType::Enter) { @@ -85,18 +89,18 @@ void OsxWindowPrivate::OnMouseEnterLeave(MouseEnterLeaveType type) { } } -void OsxWindowPrivate::OnMouseMove(Point p) { mouse_move_event_.Raise(p); } +void OsxWindowPrivate::OnMouseMove(Point p) { mouse_move_event_.Raise(TransformMousePoint(p)); } void OsxWindowPrivate::OnMouseDown(MouseButton button, Point p, KeyModifier key_modifier) { - mouse_down_event_.Raise({button, p, key_modifier}); + mouse_down_event_.Raise({button, TransformMousePoint(p), key_modifier}); } void OsxWindowPrivate::OnMouseUp(MouseButton button, Point p, KeyModifier key_modifier) { - mouse_up_event_.Raise({button, p, key_modifier}); + mouse_up_event_.Raise({button, TransformMousePoint(p), key_modifier}); } void OsxWindowPrivate::OnMouseWheel(float delta, Point p, KeyModifier key_modifier) { - mouse_wheel_event_.Raise({delta, p, key_modifier}); + mouse_wheel_event_.Raise({delta, TransformMousePoint(p), key_modifier}); } void OsxWindowPrivate::OnKeyDown(KeyCode key, KeyModifier key_modifier) { @@ -116,6 +120,13 @@ void OsxWindowPrivate::UpdateCursor() { [cursor->p_->ns_cursor_ set]; } + +Point OsxWindowPrivate::TransformMousePoint(const Point& point) { + Point r = point; + r.y = content_rect_.height - r.y; + return r; +} + } OsxWindow::OsxWindow(OsxUiApplication* ui_application, INativeWindow* parent, bool frame) @@ -340,6 +351,16 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho _p->OnMouseMove(cru::platform::Point(event.locationInWindow.x, event.locationInWindow.y)); } +- (void)mouseDragged:(NSEvent*)event { + // cru::log::TagDebug(u"CruView", u"Recieved mouse move."); + _p->OnMouseMove(cru::platform::Point(event.locationInWindow.x, event.locationInWindow.y)); +} + +- (void)rightMouseDragged:(NSEvent*)event { + // cru::log::TagDebug(u"CruView", u"Recieved mouse move."); + _p->OnMouseMove(cru::platform::Point(event.locationInWindow.x, event.locationInWindow.y)); +} + - (void)mouseEntered:(NSEvent*)event { // cru::log::TagDebug(u"CruView", u"Recieved mouse enter."); _p->OnMouseEnterLeave(cru::platform::gui::MouseEnterLeaveType::Enter); @@ -427,7 +448,7 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho } - (void)keyDown:(NSEvent*)event { - cru::log::TagDebug(u"CruView", u"Recieved key down."); + // cru::log::TagDebug(u"CruView", u"Recieved key down."); cru::platform::gui::KeyModifier key_modifier; if (event.modifierFlags & NSEventModifierFlagControl) @@ -448,7 +469,7 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho } - (void)keyUp:(NSEvent*)event { - cru::log::TagDebug(u"CruView", u"Recieved key up."); + // cru::log::TagDebug(u"CruView", u"Recieved key up."); cru::platform::gui::KeyModifier key_modifier; if (event.modifierFlags & NSEventModifierFlagControl) @@ -547,11 +568,13 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho } _input_context_text = nil; + _input_context_p->SetCompositionText(cru::platform::gui::CompositionText()); cru::String ss = Convert(s); cru::log::TagDebug(u"CruView", u"Finish composition: {}, replacement range: ({}, {})", ss, replacementRange.location, replacementRange.length); + _input_context_p->RaiseCompositionEvent(); _input_context_p->RaiseCompositionEndEvent(); _input_context_p->RaiseTextEvent(ss); } @@ -598,4 +621,12 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho - (void)windowDidResize:(NSNotification*)notification { _p->OnWindowDidResize(); } + +- (void)windowDidBecomeKey:(NSNotification*)notification { + _p->OnBecomeKeyWindow(); +} + +- (void)windowDidResignKey:(NSNotification*)notification { + _p->OnResignKeyWindow(); +} @end diff --git a/src/osx/gui/WindowPrivate.h b/src/osx/gui/WindowPrivate.h index 68440fe0..0778195a 100644 --- a/src/osx/gui/WindowPrivate.h +++ b/src/osx/gui/WindowPrivate.h @@ -54,6 +54,8 @@ class OsxWindowPrivate { void OnWindowDidExpose(); void OnWindowDidUpdate(); void OnWindowDidResize(); + void OnBecomeKeyWindow(); + void OnResignKeyWindow(); CGLayerRef GetDrawLayer() { return draw_layer_; } @@ -63,6 +65,8 @@ class OsxWindowPrivate { private: void UpdateCursor(); + Point TransformMousePoint(const Point& point); + private: OsxWindow* osx_window_; diff --git a/src/ui/host/WindowHost.cpp b/src/ui/host/WindowHost.cpp index e24a883f..f60e2809 100644 --- a/src/ui/host/WindowHost.cpp +++ b/src/ui/host/WindowHost.cpp @@ -205,6 +205,7 @@ void WindowHost::Relayout(const Size& available_size) { } void WindowHost::Repaint() { + if (native_window_ == nullptr) return; auto painter = native_window_->BeginPaint(); painter->Clear(colors::white); root_render_object_->Draw(painter.get()); |