From 9d88fcd6496a078ec152389fb07ea28617f96df0 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 22 Feb 2020 15:16:22 +0100 Subject: [PATCH] SDK/Widgets: Inherit parent rendering rect --- SDK/include/NDK/BaseWidget.hpp | 2 ++ SDK/src/NDK/BaseWidget.cpp | 30 +++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index 010abd437..8bdd15584 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -110,6 +110,8 @@ namespace Ndk void InvalidateNode() override; + Nz::Rectf GetScissorRect() const; + virtual bool IsFocusable() const; virtual void OnFocusLost(); virtual void OnFocusReceived(); diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index c887f9402..cb643dc0c 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -164,6 +164,8 @@ namespace Ndk m_renderingRect = renderingRect; UpdatePositionAndSize(); + for (const auto& widgetPtr : m_children) + widgetPtr->UpdatePositionAndSize(); } void BaseWidget::Show(bool show) @@ -244,6 +246,19 @@ namespace Ndk UpdatePositionAndSize(); } + Nz::Rectf BaseWidget::GetScissorRect() const + { + Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition(Nz::CoordSys_Global)); + Nz::Vector2f widgetSize = GetSize(); + + Nz::Rectf widgetRect(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y); + Nz::Rectf widgetRenderingRect(widgetPos.x + m_renderingRect.x, widgetPos.y + m_renderingRect.y, m_renderingRect.width, m_renderingRect.height); + + widgetRect.Intersect(widgetRenderingRect, &widgetRect); + + return widgetRect; + } + bool BaseWidget::IsFocusable() const { return false; @@ -336,16 +351,17 @@ namespace Ndk if (IsRegisteredToCanvas()) m_canvas->NotifyWidgetBoxUpdate(m_canvasIndex); - Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition(Nz::CoordSys_Global)); - Nz::Vector2f widgetSize = GetSize(); + Nz::Rectf scissorRect = GetScissorRect(); - Nz::Rectf widgetRect(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y); - Nz::Rectf widgetRenderingRect(widgetPos.x + m_renderingRect.x, widgetPos.y + m_renderingRect.y, m_renderingRect.width, m_renderingRect.height); + if (m_widgetParent) + { + Nz::Rectf parentScissorRect = m_widgetParent->GetScissorRect(); - Nz::Rectf widgetBounds; - widgetRect.Intersect(widgetRenderingRect, &widgetBounds); + if (!scissorRect.Intersect(parentScissorRect, &scissorRect)) + scissorRect = parentScissorRect; + } - Nz::Recti fullBounds(widgetBounds); + Nz::Recti fullBounds(scissorRect); for (WidgetEntity& widgetEntity : m_entities) { const Ndk::EntityHandle& entity = widgetEntity.handle;