This is an automated email from the ASF dual-hosted git repository. gregdove pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
The following commit(s) were added to refs/heads/develop by this push: new 87d0fb2 Fix for TabNavigator TabBar updates (removal) when navigator content is removed. 87d0fb2 is described below commit 87d0fb29b7279647ea035339604cb2a1fa01fd47 Author: greg-dove <greg.d...@gmail.com> AuthorDate: Thu Jan 13 18:50:45 2022 +1300 Fix for TabNavigator TabBar updates (removal) when navigator content is removed. --- .../src/main/royale/mx/containers/TabNavigator.as | 3 ++ .../royale/mx/containers/beads/TabNavigatorView.as | 59 +++++++++++++++++----- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/TabNavigator.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/TabNavigator.as index 69cf7e0..92ee428 100644 --- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/TabNavigator.as +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/TabNavigator.as @@ -31,6 +31,7 @@ import mx.controls.TabBar; import org.apache.royale.core.IBeadView; import org.apache.royale.core.IChild; import org.apache.royale.events.Event; +import org.apache.royale.events.ValueEvent; import org.apache.royale.html.util.getModelByType; import org.apache.royale.core.ISelectionModel; //-------------------------------------- @@ -479,6 +480,8 @@ public class TabNavigator extends ViewStack implements IFocusManagerComponent { var tnView:TabNavigatorView = view as TabNavigatorView; tnView.contentArea.removeElement(c, dispatchEvent); + if (dispatchEvent) + this.dispatchEvent(new ValueEvent('childrenRemoved', c)); } /** diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/TabNavigatorView.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/TabNavigatorView.as index c19c7b1..d1e5b02 100644 --- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/TabNavigatorView.as +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/TabNavigatorView.as @@ -40,6 +40,7 @@ import org.apache.royale.core.UIBase; import org.apache.royale.core.ValuesManager; import org.apache.royale.events.Event; import org.apache.royale.events.IEventDispatcher; +import org.apache.royale.events.ValueEvent; import org.apache.royale.html.beads.GroupView; import org.apache.royale.html.supportClasses.PanelLayoutProxy; @@ -143,8 +144,9 @@ public class TabNavigatorView extends GroupView contentArea.percentHeight = 100; // try to listen for childrenAdded before ViewStackLayout listens for childrenAdded // so we can update the selection before the layout picks the visible child - (_strand as IEventDispatcher).addEventListener("childrenAdded", childrenAddedHandler); - contentArea.addEventListener("childrenAdded", childrenAddedHandler); + (_strand as IEventDispatcher).addEventListener("childrenAdded", childrenChangedHandler); + contentArea.addEventListener("childrenAdded", childrenChangedHandler); + contentArea.addEventListener("childrenRemoved", childrenChangedHandler); var vsl:ViewStackLayout = new ViewStackLayout(); vsl.target = contentArea as UIComponent; vsl.model = tabBar.model as ISelectionModel; @@ -152,29 +154,53 @@ public class TabNavigatorView extends GroupView if (contentArea.parent == null) { (_strand as IContainerBaseStrandChildrenHost).$addElement(contentArea as IChild); } - + // Now give the TabNavigator its own layout var boxLayout:BoxLayout = new BoxLayout(); boxLayout.direction = "vertical"; _strand.addBead(boxLayout); - + } - + private var tabDP:Array = []; - - private function childrenAddedHandler(event:Event):void + + private function childrenChangedHandler(event:Event):void { + var isRemoval:Boolean = event.type == 'childrenRemoved'; + var child:INavigatorContent; + var removeIndex:int = -1; + + var n:int; + var i:int; + + if (isRemoval) { + child = ValueEvent(event).value as INavigatorContent; + if (child) { + tabDP = (tabBar as TabBar).dataProvider as Array; + n = tabDP.length; + for (i = 0; i < n; i++) + { + var item:Object = tabDP[i]; + if (item.label == child.label) { + removeIndex = i; + break; + } + } + } + } tabDP = []; - var n:int = contentArea.numElements; - for (var i:int = 0; i < n; i++) + n = contentArea.numElements; + for (i = 0; i < n; i++) { - var child:INavigatorContent = contentArea.getElementAt(i) as INavigatorContent; + child = contentArea.getElementAt(i) as INavigatorContent; tabDP.push({ label: child.label}); // run this again if the label changes - child.addEventListener("labelChanged", childrenAddedHandler); + child.addEventListener("labelChanged", childrenChangedHandler); } + var oldIndex:int = (tabBar.model as ISelectionModel).selectedIndex; (tabBar as TabBar).dataProvider = tabDP; - if ((tabBar.model as ISelectionModel).selectedIndex == -1 && n > 0) + + if (oldIndex == -1 && n > 0) { (tabBar.model as ISelectionModel).selectedIndex = 0; var tabNavigator:TabNavigator = _strand as TabNavigator; @@ -182,6 +208,15 @@ public class TabNavigatorView extends GroupView { tabNavigator.selectedIndex = 0; } + } else { + if (removeIndex != -1 ) { + var tabNavigator:TabNavigator = _strand as TabNavigator; + if (removeIndex == tabDP.length) removeIndex--; + if (tabNavigator) + { + tabNavigator.selectedIndex = removeIndex; + } + } } }