From 6110cb6a36cb9cef39af0951ec47458696ac1da6 Mon Sep 17 00:00:00 2001 From: Mike Antipov Date: Wed, 28 Jul 2010 10:59:53 +0300 Subject: EXT-8285 FIXED prevented wrong handling in accordion of the "scrollToShowRect" event from the child accordion tab's scroll container. This problem begins from expanding accordion_tab: 1. adjustToFitScreen - calls adjustContainerPanel with "fit screen" rectangle (calls reshape() and resize()). Enter adjustContainerPanel("fit screen") 2. reshape calls ensureSelectedVisible -> scrollToShowRect... scrollToShowRect notifyParent about "scrollToShowRect" (notifiParent is sync call) Enter LLAccordionCtrl::notifyParent("scrollToShowRect") 4. AccordionCtrl handles "scrollToShowRect" notification and perform adjustContainerPanel with "another" rectangle. Perform adjustContainerPanel("another") // At least I have not seen 3rd recursive call of adjustContainerPanel 5. Exit LLAccordionCtrl::notifyParent("scrollToShowRect") 6. Exit reshape("fit screen"). 7. setRect("fit screen"). 8. Exit adjustContainerPanel("fit screen"). ... As result we get AccordionTab that reshaped to "another" rectangle and resized to "fit screen" rectangle. + Fixed by handling "scrollToShowRect" message in LLAccordionCtrlTab from "LLScrollContainer". + Removed the workaround comment. Reviewed by Neal Orman at https://codereview.productengine.com/secondlife/r/727/ --HG-- branch : product-engine --- indra/llui/llaccordionctrltab.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'indra/llui/llaccordionctrltab.cpp') diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index d8760d5cdb..fb9fff385d 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -33,6 +33,7 @@ #include "linden_common.h" #include "llaccordionctrltab.h" +#include "llaccordionctrl.h" #include "lllocalcliprect.h" #include "llscrollbar.h" @@ -709,7 +710,7 @@ S32 LLAccordionCtrlTab::notifyParent(const LLSD& info) setRect(panel_rect); } - //LLAccordionCtrl should rearrange accodion tab if one of accordion change its size + //LLAccordionCtrl should rearrange accordion tab if one of accordion change its size if (getParent()) // A parent may not be set if tabs are added dynamically. getParent()->notifyParent(info); return 1; @@ -720,6 +721,27 @@ S32 LLAccordionCtrlTab::notifyParent(const LLSD& info) return 1; } } + else if (info.has("scrollToShowRect")) + { + LLAccordionCtrl* parent = dynamic_cast(getParent()); + if (parent && parent->getFitParent()) + { + // EXT-8285 ('No attachments worn' text appears at the bottom of blank 'Attachments' accordion) + // The problem was in passing message "scrollToShowRect" IN LLAccordionCtrlTab::notifyParent + // FROM child LLScrollContainer TO parent LLAccordionCtrl with "it_parent" set to true. + + // It is wrong notification for parent accordion which leads to recursive call of adjustContainerPanel + // As the result of recursive call of adjustContainerPanel we got LLAccordionCtrlTab + // that reshaped and re-sized with different rectangles. + + // LLAccordionCtrl has own scrollContainer and LLAccordionCtrlTab has own scrollContainer + // both should handle own scroll container's event. + // So, if parent accordion "fit_parent" accordion tab should handle its scroll container events itself. + + return 1; + } + } + return LLUICtrl::notifyParent(info); } -- cgit v1.2.3