void SDockingTabWell::BringTabToFront( int32 TabIndexToActivate ) { const bool bActiveIndexChanging = TabIndexToActivate != ForegroundTabIndex; if ( bActiveIndexChanging ) { const int32 LastForegroundTabIndex = FMath::Min(ForegroundTabIndex, Tabs.Num()-1); // For positive indexes, don't go out of bounds on the array. ForegroundTabIndex = FMath::Min(TabIndexToActivate, Tabs.Num()-1); TSharedPtr<SDockingArea> MyDockArea = GetDockArea(); if ( Tabs.Num() > 0 && MyDockArea.IsValid() ) { const TSharedPtr<SDockTab> PreviousForegroundTab = (LastForegroundTabIndex == INDEX_NONE) ? TSharedPtr<SDockTab>() : Tabs[LastForegroundTabIndex]; const TSharedPtr<SDockTab> NewForegroundTab = (ForegroundTabIndex == INDEX_NONE) ? TSharedPtr<SDockTab>() : Tabs[ForegroundTabIndex]; MyDockArea->GetTabManager()->GetPrivateApi().OnTabForegrounded(NewForegroundTab, PreviousForegroundTab); } } // Always force a refresh, even if we don't think the active index changed. RefreshParentContent(); }
void SDockingTabWell::RemoveAndDestroyTab(const TSharedRef<SDockTab>& TabToRemove, SDockingNode::ELayoutModification RemovalMethod) { int32 TabIndex = Tabs.Find(TabToRemove); if (TabIndex != INDEX_NONE) { const TSharedPtr<SDockingTabStack> ParentTabStack = ParentTabStackPtr.Pin(); // Remove the old tab from the list of tabs and activate the new tab. { BringTabToFront(TabIndex); Tabs.RemoveAt(TabIndex); // We no longer have a tab in the foreground. // This is important because BringTabToFront triggers notifications based on the difference in active tab indexes. ForegroundTabIndex = INDEX_NONE; // Now bring the last tab that we were on to the foreground BringTabToFront(FMath::Max(TabIndex-1, 0)); } if ( ensure(ParentTabStack.IsValid()) ) { TSharedPtr<SDockingArea> DockAreaPtr = ParentTabStack->GetDockArea(); ParentTabStack->OnTabClosed( TabToRemove ); // We might be closing down an entire dock area, if this is a major tab. // Use this opportunity to save its layout if (RemovalMethod == SDockingNode::TabRemoval_Closed) { if (DockAreaPtr.IsValid()) { DockAreaPtr->GetTabManager()->GetPrivateApi().OnTabClosing( TabToRemove ); } } if (Tabs.Num() == 0) { ParentTabStack->OnLastTabRemoved(); } else { RefreshParentContent(); } if (DockAreaPtr.IsValid()) { DockAreaPtr->CleanUp( RemovalMethod ); } } } }
void SDockingTabWell::BringTabToFront( int32 TabIndexToActivate ) { const bool bActiveIndexChanging = TabIndexToActivate != ForegroundTabIndex; if ( bActiveIndexChanging ) { const int32 LastForegroundTabIndex = FMath::Min(ForegroundTabIndex, Tabs.Num()-1); // For positive indexes, don't go out of bounds on the array. ForegroundTabIndex = FMath::Min(TabIndexToActivate, Tabs.Num()-1); TSharedPtr<SDockingArea> MyDockArea = GetDockArea(); if ( Tabs.Num() > 0 && MyDockArea.IsValid() ) { const TSharedPtr<SDockTab> PreviousForegroundTab = (LastForegroundTabIndex == INDEX_NONE) ? TSharedPtr<SDockTab>() : Tabs[LastForegroundTabIndex]; const TSharedPtr<SDockTab> NewForegroundTab = (ForegroundTabIndex == INDEX_NONE) ? TSharedPtr<SDockTab>() : Tabs[ForegroundTabIndex]; MyDockArea->GetTabManager()->GetPrivateApi().OnTabForegrounded(NewForegroundTab, PreviousForegroundTab); FGlobalTabmanager::Get()->GetPrivateApi().OnTabForegrounded(NewForegroundTab, PreviousForegroundTab); } } // Always force a refresh, even if we don't think the active index changed. RefreshParentContent(); // Update the native, global menu bar if a tab is in the foreground. if( ForegroundTabIndex != INDEX_NONE ) { TSharedPtr<FTabManager> TabManager = Tabs[ForegroundTabIndex]->GetTabManager(); if(TabManager == FGlobalTabmanager::Get()) { FGlobalTabmanager::Get()->UpdateMainMenu(Tabs[ForegroundTabIndex], false); } else { TabManager->UpdateMainMenu(false); } } }