diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2025-11-13 19:03:24 +0200 |
|---|---|---|
| committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2025-11-13 19:03:24 +0200 |
| commit | ceba070dcb42609ca267bdc5dac003db7aa2ad09 (patch) | |
| tree | cf444a5b3ad3041e36b3e11307b2c6907badabda /indra/llui/llaccordionctrltab.cpp | |
| parent | 2a620a9447b7d0544d5c500d88b4128565486018 (diff) | |
| parent | 0ceefe6d270a4688720287f88b3bd5e2509909c1 (diff) | |
Merge branch 'release/2025.08' into marchcat/slua-2508
# Conflicts:
# autobuild.xml
Diffstat (limited to 'indra/llui/llaccordionctrltab.cpp')
| -rw-r--r-- | indra/llui/llaccordionctrltab.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index bdf93348bb..828bfb289b 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -479,7 +479,34 @@ void LLAccordionCtrlTab::onUpdateScrollToChild(const LLUICtrl *cntrl) // Translate to parent coordinatess to check if we are in visible rectangle rect.translate(getRect().mLeft, getRect().mBottom); - if (!getRect().contains(rect)) + bool needs_to_scroll = false; + const LLRect &acc_rect = getRect(); + if (!acc_rect.contains(rect)) + { + if (acc_rect.mTop < rect.mBottom || acc_rect.mBottom > rect.mTop) + { + // Content fully not in view + needs_to_scroll = true; + } + else if (acc_rect.getHeight() >= rect.getHeight()) + { + // Content can be displayed fully, but only partially in view + needs_to_scroll = true; + } + else if (acc_rect.mTop <= rect.mTop || acc_rect.mBottom >= rect.mBottom) + { + // Intersects, but too big to be displayed fully + S32 covered_height = acc_rect.mTop > rect.mTop ? rect.mTop - acc_rect.mBottom : acc_rect.mTop - rect.mBottom; + constexpr F32 covered_ratio = 0.7f; + if (covered_height < covered_ratio * acc_rect.getHeight()) + { + // Try to show bigger portion of the content + needs_to_scroll = true; + } + } + // else too big and in the middle of the view as is + } + if (needs_to_scroll) { // for accordition's scroll, height is in pixels // Back to local coords and calculate position for scroller |
