From bba01ef7c1202cc5774564e4f05e8b2bf6d9985b Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Thu, 2 Aug 2007 06:44:34 +0000 Subject: [PATCH] Try to have a really smart tab view... It won't show any tabs when there's only one view attached. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21785 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/terminal/SmartTabView.cpp | 115 +++++++++++++++++++++++------ src/apps/terminal/SmartTabView.h | 19 ++++- 2 files changed, 108 insertions(+), 26 deletions(-) diff --git a/src/apps/terminal/SmartTabView.cpp b/src/apps/terminal/SmartTabView.cpp index b300b3a906..1726f17c0f 100644 --- a/src/apps/terminal/SmartTabView.cpp +++ b/src/apps/terminal/SmartTabView.cpp @@ -8,10 +8,15 @@ #include "SmartTabView.h" +#include + + SmartTabView::SmartTabView(BRect frame, const char *name, button_width width, uint32 resizingMode, uint32 flags) : - BTabView(frame, name, width, resizingMode, flags) + BView(frame, name, resizingMode, flags), + fTabView(NULL), + fView(NULL) { } @@ -21,50 +26,116 @@ SmartTabView::~SmartTabView() } +BView * +SmartTabView::ContainerView() +{ + return fTabView != NULL ? fTabView->ContainerView() : this; +} + + +BView * +SmartTabView::ViewForTab(int32 tab) +{ + return fTabView != NULL ? fTabView->ViewForTab(tab) : fView; +} + + void SmartTabView::Select(int32 index) { - BTabView::Select(index); - BTab *tab = TabAt(Selection()); - if (tab != NULL) { - BView *view = tab->View(); - if (view != NULL) - view->ResizeTo(Bounds().Width(), Bounds().Height()); + if (fView != NULL) { + fView->ResizeTo(Bounds().Width(), Bounds().Height()); + } else if (fTabView != NULL) { + fTabView->Select(index); + BTab *tab = fTabView->TabAt(fTabView->Selection()); + if (tab != NULL) { + BView *view = tab->View(); + if (view != NULL) + view->ResizeTo(fTabView->Bounds().Width(), fTabView->Bounds().Height()); + } } } -/* + +int32 +SmartTabView::Selection() const +{ + return fTabView != NULL ? fTabView->Selection() : 0; +} + + void SmartTabView::AddTab(BView *target, BTab *tab) { if (target == NULL) return; - if (CountTabs() == 1) { - - } - AddTab(target, tab); + if (fView == NULL && fTabView == NULL) { + fView = target; + AddChild(target); + } else { + if (fTabView == NULL) { + RemoveChild(fView); + fTabView = new BTabView(Bounds(), "tabview"); + AddChild(fTabView); + fTabView->MoveTo(B_ORIGIN); + fTabView->ResizeTo(Bounds().Width(), Bounds().Height()); + fTabView->AddTab(fView); + fTabView->Select(0); + fView = NULL; + } + fTabView->AddTab(target, tab); + } } BTab * SmartTabView::RemoveTab(int32 index) { - BTab *oldTab = RemoveTab(index); - if (CountTabs() == 1) { - + BTab *returnTab = NULL; + if (fTabView != NULL) { + returnTab = fTabView->RemoveTab(index); + if (fTabView->CountTabs() == 1) { + BTab *tab = fTabView->RemoveTab(0); + RemoveChild(fTabView); + delete fTabView; + fTabView = NULL; + fView = tab->View(); + tab->SetView(NULL); + AddChild(fView); + fView->MoveTo(B_ORIGIN); + fView->ResizeTo(Bounds().Width(), Bounds().Height()); + delete tab; + } + } else if (fView != NULL) { + RemoveChild(fView); + returnTab = new BTab(); + returnTab->SetView(fView); + fView = NULL; } - return oldTab; + + return returnTab; } -BRect -SmartTabView::DrawTabs() +int32 +SmartTabView::CountTabs() const { - //if (CountTabs() > 1) - return BTabView::DrawTabs(); - //return BRect(0, 0, -1, -1); + if (fTabView != NULL) + return fTabView->CountTabs(); + + return fView != NULL ? 1 : 0; +} + + +/* +void +SmartTabView::Draw(BRect updateRect) +{ + if (fView != NULL) { + + } } */ - + diff --git a/src/apps/terminal/SmartTabView.h b/src/apps/terminal/SmartTabView.h index bc9fbaa0d6..20a49cbd25 100644 --- a/src/apps/terminal/SmartTabView.h +++ b/src/apps/terminal/SmartTabView.h @@ -9,9 +9,10 @@ #ifndef __SMARTTABVIEW_H #define __SMARTTABVIEW_H -#include +#include -class SmartTabView : public BTabView { +class BTabView; +class SmartTabView : public BView { public: SmartTabView(BRect frame, const char *name, button_width width = B_WIDTH_AS_USUAL, @@ -20,12 +21,22 @@ public: B_WILL_DRAW | B_NAVIGABLE_JUMP | B_FRAME_EVENTS | B_NAVIGABLE); virtual ~SmartTabView(); + + virtual BView *ContainerView(); + virtual BView *ViewForTab(int32); + virtual void Select(int32 tab); - /* + virtual int32 Selection() const; + virtual void AddTab(BView *target, BTab *tab = NULL); virtual BTab* RemoveTab(int32 index); - virtual BRect DrawTabs();*/ + virtual int32 CountTabs() const; + + //virtual void Draw(BRect rect); +private: + BTabView *fTabView; + BView *fView; }; #endif // __SMARTTABVIEW_H