From 2cdd7d0b4462e7abd46529ac58bc50bfe0a4d2d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 25 Nov 2021 23:04:01 +0100 Subject: [PATCH] Widgets: Fix issues with Y reversal --- src/Nazara/Widgets/AbstractTextAreaWidget.cpp | 16 ++++++--- src/Nazara/Widgets/Canvas.cpp | 34 +++++++++---------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/Nazara/Widgets/AbstractTextAreaWidget.cpp b/src/Nazara/Widgets/AbstractTextAreaWidget.cpp index f9552d59b..a9cdecca5 100644 --- a/src/Nazara/Widgets/AbstractTextAreaWidget.cpp +++ b/src/Nazara/Widgets/AbstractTextAreaWidget.cpp @@ -43,7 +43,7 @@ namespace Nz auto& textNode = GetRegistry().emplace(m_textEntity); textNode.SetParent(this); - textNode.SetPosition(paddingWidth, paddingHeight); + textNode.SetPosition(paddingWidth, GetHeight() - paddingHeight); SetCursor(SystemCursor::Text); @@ -88,6 +88,9 @@ namespace Nz x -= textPosition.x; y -= textPosition.y; + float textHeight = textDrawer.GetBounds().height; + y = textHeight - y; + std::size_t glyphCount = textDrawer.GetGlyphCount(); if (glyphCount > 0) { @@ -458,6 +461,7 @@ namespace Nz } // Resize every cursor sprite + float textHeight = m_textSprite->GetAABB().height; for (unsigned int i = m_cursorPositionBegin.y; i <= m_cursorPositionEnd.y; ++i) { const auto& lineInfo = textDrawer.GetLine(i); @@ -489,7 +493,7 @@ namespace Nz cursor.sprite->SetColor((m_cursorPositionBegin == m_cursorPositionEnd) ? Color::Black : Color(0, 0, 0, 50)); cursor.sprite->SetSize(Vector2f(spriteSize, lineInfo.bounds.height)); - registry.get(cursor.entity).SetPosition(beginX, lineInfo.bounds.y); + registry.get(cursor.entity).SetPosition(beginX, textHeight - lineInfo.bounds.y - lineInfo.bounds.height); } else { @@ -497,7 +501,7 @@ namespace Nz cursor.sprite->SetColor(Color(0, 0, 0, 50)); cursor.sprite->SetSize(Vector2f(lineInfo.bounds.width, lineInfo.bounds.height)); - registry.get(cursor.entity).SetPosition(0.f, lineInfo.bounds.y); + registry.get(cursor.entity).SetPosition(0.f, textHeight - lineInfo.bounds.y - lineInfo.bounds.height); } } } @@ -505,6 +509,10 @@ namespace Nz void AbstractTextAreaWidget::UpdateTextSprite() { m_textSprite->Update(GetTextDrawer()); - SetPreferredSize(Vector2f(m_textSprite->GetAABB().GetLengths())); + Vector2f textSize = Vector2f(m_textSprite->GetAABB().GetLengths()); + SetPreferredSize(textSize); + + auto& textNode = GetRegistry().get(m_textEntity); + textNode.SetPosition(paddingWidth, GetHeight() - paddingHeight - textSize.y); } } diff --git a/src/Nazara/Widgets/Canvas.cpp b/src/Nazara/Widgets/Canvas.cpp index 6988b6483..e19fe7c98 100644 --- a/src/Nazara/Widgets/Canvas.cpp +++ b/src/Nazara/Widgets/Canvas.cpp @@ -49,33 +49,33 @@ namespace Nz m_widgetEntries.pop_back(); } - void Canvas::OnEventMouseButtonPressed(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseButtonEvent& event) + void Canvas::OnEventMouseButtonPressed(const EventHandler* /*eventHandler*/, const WindowEvent::MouseButtonEvent& event) { if (m_hoveredWidget != InvalidCanvasIndex) { WidgetEntry& hoveredWidget = m_widgetEntries[m_hoveredWidget]; int x = static_cast(std::round(event.x - hoveredWidget.box.x)); - int y = static_cast(std::round(event.y - hoveredWidget.box.y)); + int y = static_cast(std::round(m_size.y - event.y - hoveredWidget.box.y)); hoveredWidget.widget->OnMouseButtonPress(x, y, event.button); } } - void Canvas::OnEventMouseButtonRelease(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseButtonEvent& event) + void Canvas::OnEventMouseButtonRelease(const EventHandler* /*eventHandler*/, const WindowEvent::MouseButtonEvent& event) { if (m_hoveredWidget != InvalidCanvasIndex) { WidgetEntry& hoveredWidget = m_widgetEntries[m_hoveredWidget]; int x = static_cast(std::round(event.x - hoveredWidget.box.x)); - int y = static_cast(std::round(event.y - hoveredWidget.box.y)); + int y = static_cast(std::round(m_size.y - event.y - hoveredWidget.box.y)); hoveredWidget.widget->OnMouseButtonRelease(x, y, event.button); } } - void Canvas::OnEventMouseMoved(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseMoveEvent& event) + void Canvas::OnEventMouseMoved(const EventHandler* /*eventHandler*/, const WindowEvent::MouseMoveEvent& event) { std::size_t bestEntry = InvalidCanvasIndex; float bestEntryArea = std::numeric_limits::infinity(); @@ -110,13 +110,13 @@ namespace Nz m_widgetEntries[m_hoveredWidget].widget->OnMouseEnter(); if (m_cursorController) - m_cursorController->UpdateCursor(Nz::Cursor::Get(m_widgetEntries[m_hoveredWidget].cursor)); + m_cursorController->UpdateCursor(Cursor::Get(m_widgetEntries[m_hoveredWidget].cursor)); } WidgetEntry& hoveredWidget = m_widgetEntries[m_hoveredWidget]; - int x = static_cast(std::round(event.x - hoveredWidget.box.x)); - int y = static_cast(std::round(event.y - hoveredWidget.box.y)); + int x = static_cast(std::round(mousePos.x - hoveredWidget.box.x)); + int y = static_cast(std::round(mousePos.y - hoveredWidget.box.y)); hoveredWidget.widget->OnMouseMoved(x, y, event.deltaX, event.deltaY); } else if (m_hoveredWidget != InvalidCanvasIndex) @@ -125,24 +125,24 @@ namespace Nz m_hoveredWidget = InvalidCanvasIndex; if (m_cursorController) - m_cursorController->UpdateCursor(Nz::Cursor::Get(Nz::SystemCursor::Default)); + m_cursorController->UpdateCursor(Cursor::Get(SystemCursor::Default)); } } - void Canvas::OnEventMouseWheelMoved(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseWheelEvent& event) + void Canvas::OnEventMouseWheelMoved(const EventHandler* /*eventHandler*/, const WindowEvent::MouseWheelEvent& event) { if (m_hoveredWidget != InvalidCanvasIndex) { WidgetEntry& hoveredWidget = m_widgetEntries[m_hoveredWidget]; int x = static_cast(std::round(event.x - hoveredWidget.box.x)); - int y = static_cast(std::round(event.y - hoveredWidget.box.y)); + int y = static_cast(std::round(m_size.y - event.y - hoveredWidget.box.y)); hoveredWidget.widget->OnMouseWheelMoved(x, y, event.delta); } } - void Canvas::OnEventMouseLeft(const Nz::EventHandler* /*eventHandler*/) + void Canvas::OnEventMouseLeft(const EventHandler* /*eventHandler*/) { if (m_hoveredWidget != InvalidCanvasIndex) { @@ -151,14 +151,14 @@ namespace Nz } } - void Canvas::OnEventKeyPressed(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::KeyEvent& event) + void Canvas::OnEventKeyPressed(const EventHandler* eventHandler, const WindowEvent::KeyEvent& event) { if (m_keyboardOwner != InvalidCanvasIndex) { if (m_widgetEntries[m_keyboardOwner].widget->OnKeyPressed(event)) return; - if (event.virtualKey == Nz::Keyboard::VKey::Tab) + if (event.virtualKey == Keyboard::VKey::Tab) { if (!event.shift) { @@ -209,7 +209,7 @@ namespace Nz OnUnhandledKeyPressed(eventHandler, event); } - void Canvas::OnEventKeyReleased(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::KeyEvent& event) + void Canvas::OnEventKeyReleased(const EventHandler* eventHandler, const WindowEvent::KeyEvent& event) { if (m_keyboardOwner != InvalidCanvasIndex) m_widgetEntries[m_keyboardOwner].widget->OnKeyReleased(event); @@ -217,13 +217,13 @@ namespace Nz OnUnhandledKeyReleased(eventHandler, event); } - void Canvas::OnEventTextEntered(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::TextEvent& event) + void Canvas::OnEventTextEntered(const EventHandler* /*eventHandler*/, const WindowEvent::TextEvent& event) { if (m_keyboardOwner != InvalidCanvasIndex) m_widgetEntries[m_keyboardOwner].widget->OnTextEntered(event.character, event.repeated); } - void Canvas::OnEventTextEdited(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::EditEvent& event) + void Canvas::OnEventTextEdited(const EventHandler* /*eventHandler*/, const WindowEvent::EditEvent& event) { if (m_keyboardOwner != InvalidCanvasIndex) m_widgetEntries[m_keyboardOwner].widget->OnTextEdited(event.text, event.length);