diff --git a/src/helpers/gtab/GTabView.cpp b/src/helpers/gtab/GTabView.cpp index 3f9a7ae1..272b55ea 100644 --- a/src/helpers/gtab/GTabView.cpp +++ b/src/helpers/gtab/GTabView.cpp @@ -104,6 +104,7 @@ GTabView::AttachedToWindow() fScrollRightTabButton->SetTarget(this); fTabsContainer->SetTarget(this); fTabMenuTabButton->SetTarget(this); + BGroupView::AttachedToWindow(); } @@ -112,10 +113,10 @@ GTabView::MessageReceived(BMessage* message) { switch(message->what) { case kLeftTabButton: - fTabsContainer->ShiftTabs(-1); + fTabsContainer->ShiftTabs(-1, "shift left"); break; case kRightTabButton: - fTabsContainer->ShiftTabs(+1); + fTabsContainer->ShiftTabs(+1, "shift right"); break; case kSelectedTabButton: { diff --git a/src/helpers/gtab/TabsContainer.cpp b/src/helpers/gtab/TabsContainer.cpp index 3b7c96d4..3d9f6dd9 100644 --- a/src/helpers/gtab/TabsContainer.cpp +++ b/src/helpers/gtab/TabsContainer.cpp @@ -22,7 +22,8 @@ TabsContainer::TabsContainer(GTabView* tabView, fSelectedTab(nullptr), fGTabView(tabView), fTabShift(0), - fAffinity(affinity) + fAffinity(affinity), + fFirstLayout(true) { SetFlags(Flags()|B_FRAME_EVENTS); GroupLayout()->AddView(0, new Filler(this)); @@ -47,7 +48,7 @@ TabsContainer::AddTab(GTab* tab, int32 index) SelectTab(tab); } - ShiftTabs(0); + ShiftTabs(0, "add tab"); } @@ -103,7 +104,7 @@ TabsContainer::RemoveTab(GTab* tab) if (fTabShift > 0 && fTabShift >= CountTabs()) { shift -= 1; } - ShiftTabs(shift); + ShiftTabs(shift, "remove tab"); return tab; } @@ -137,7 +138,7 @@ TabsContainer::SelectTab(GTab* tab, bool invoke) } if (fTabShift >= index) { - ShiftTabs(index - fTabShift); + ShiftTabs(index - fTabShift, "select tab_1"); } else { // let's ensure at least the tab's "middle point" // is visible. @@ -152,7 +153,7 @@ TabsContainer::SelectTab(GTab* tab, bool invoke) break; } } - ShiftTabs(shift); + ShiftTabs(shift, "select tab_2"); } } } @@ -161,8 +162,11 @@ TabsContainer::SelectTab(GTab* tab, bool invoke) void -TabsContainer::ShiftTabs(int32 delta) +TabsContainer::ShiftTabs(int32 delta, const char* src) { + if (Bounds().IsValid() == false) + return; + int32 newShift = fTabShift + delta; if (newShift < 0) newShift = 0; @@ -178,6 +182,7 @@ TabsContainer::ShiftTabs(int32 delta) tab->Show(); } } + //DEBUG printf(".. updating from %d to %d (%s)\n", fTabShift, newShift,src); fTabShift = newShift; _UpdateScrolls(); } @@ -212,7 +217,7 @@ TabsContainer::FrameResized(float w, float h) break; } if (tox != 0) - ShiftTabs(tox); + ShiftTabs(tox, "select tab_1"); } // end _UpdateScrolls(); @@ -253,3 +258,17 @@ TabsContainer::_UpdateScrolls() fGTabView->UpdateScrollButtons(false, false); } } + + +void +TabsContainer::DoLayout() +{ + BGroupView::DoLayout(); + if (fFirstLayout == true && Bounds().IsValid()) { + GTab* selected = fSelectedTab; + fSelectedTab = nullptr; + SelectTab(selected); + fFirstLayout = false; + } + +} \ No newline at end of file diff --git a/src/helpers/gtab/TabsContainer.h b/src/helpers/gtab/TabsContainer.h index 8586767a..bfdd804e 100644 --- a/src/helpers/gtab/TabsContainer.h +++ b/src/helpers/gtab/TabsContainer.h @@ -26,7 +26,7 @@ class TabsContainer : public BGroupView, public BInvoker { GTab* TabAt(int32 index) const; int32 IndexOfTab(GTab* tab) const; - void ShiftTabs(int32 delta); // 0 to refresh the current state + void ShiftTabs(int32 delta, const char* src); // 0 to refresh the current state void MouseDownOnTab(GTab* tab, BPoint where, const int32 buttons); @@ -41,6 +41,8 @@ class TabsContainer : public BGroupView, public BInvoker { tab_affinity GetAffinity() const { return fAffinity; } + void DoLayout(); + private: void _PrintToStream(); void _UpdateScrolls(); @@ -49,4 +51,5 @@ class TabsContainer : public BGroupView, public BInvoker { GTabView* fGTabView; int32 fTabShift; tab_affinity fAffinity; + bool fFirstLayout; };