Implement #35: Add a tab menu. Still needs icons but this works for now.
git-svn-id: http://svn.haiku-os.org/webpositive/webkit/trunk@569 94f232f2-1747-11df-bad5-a5bfde151594
This commit is contained in:
parent
1220bcc0af
commit
1af1ea8546
@ -330,6 +330,10 @@ TabContainerView::SelectTab(TabView* tab)
|
|||||||
if (fSelectedTab != NULL)
|
if (fSelectedTab != NULL)
|
||||||
index = GroupLayout()->IndexOfItem(tab->LayoutItem());
|
index = GroupLayout()->IndexOfItem(tab->LayoutItem());
|
||||||
|
|
||||||
|
if (!tab->LayoutItem()->IsVisible()) {
|
||||||
|
SetFirstVisibleTabIndex(index);
|
||||||
|
}
|
||||||
|
|
||||||
fController->TabSelected(index);
|
fController->TabSelected(index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,9 @@
|
|||||||
#include <ControlLook.h>
|
#include <ControlLook.h>
|
||||||
#include <GroupView.h>
|
#include <GroupView.h>
|
||||||
#include <MenuBar.h>
|
#include <MenuBar.h>
|
||||||
|
#include <MenuItem.h>
|
||||||
|
#include <PopUpMenu.h>
|
||||||
|
#include <Rect.h>
|
||||||
#include <SpaceLayoutItem.h>
|
#include <SpaceLayoutItem.h>
|
||||||
#include <Window.h>
|
#include <Window.h>
|
||||||
|
|
||||||
@ -184,12 +187,34 @@ public:
|
|||||||
be_control_look->DrawArrowShape(this, frame, updateRect,
|
be_control_look->DrawArrowShape(this, frame, updateRect,
|
||||||
base, BControlLook::B_DOWN_ARROW, 0, B_DARKEN_4_TINT);
|
base, BControlLook::B_DOWN_ARROW, 0, B_DARKEN_4_TINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void MouseDown(BPoint point)
|
||||||
|
{
|
||||||
|
if (!IsEnabled())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Invoke must be called before setting B_CONTROL_ON
|
||||||
|
// for the button to stay "down"
|
||||||
|
Invoke();
|
||||||
|
SetValue(B_CONTROL_ON);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void MouseUp(BPoint point)
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
void MenuClosed()
|
||||||
|
{
|
||||||
|
SetValue(B_CONTROL_OFF);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MSG_SCROLL_TABS_LEFT = 'stlt',
|
MSG_SCROLL_TABS_LEFT = 'stlt',
|
||||||
MSG_SCROLL_TABS_RIGHT = 'strt'
|
MSG_SCROLL_TABS_RIGHT = 'strt',
|
||||||
|
MSG_OPEN_TAB_MENU = 'otmn'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -200,7 +225,8 @@ public:
|
|||||||
BGroupView(B_HORIZONTAL, 0.0),
|
BGroupView(B_HORIZONTAL, 0.0),
|
||||||
fTabContainerView(tabContainerView),
|
fTabContainerView(tabContainerView),
|
||||||
fScrollLeftTabButton(NULL),
|
fScrollLeftTabButton(NULL),
|
||||||
fScrollRightTabButton(NULL)
|
fScrollRightTabButton(NULL),
|
||||||
|
fTabMenuButton(NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,6 +236,8 @@ public:
|
|||||||
fScrollLeftTabButton->SetTarget(this);
|
fScrollLeftTabButton->SetTarget(this);
|
||||||
if (fScrollRightTabButton != NULL)
|
if (fScrollRightTabButton != NULL)
|
||||||
fScrollRightTabButton->SetTarget(this);
|
fScrollRightTabButton->SetTarget(this);
|
||||||
|
if (fTabMenuButton != NULL)
|
||||||
|
fTabMenuButton->SetTarget(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void MessageReceived(BMessage* message)
|
virtual void MessageReceived(BMessage* message)
|
||||||
@ -223,6 +251,43 @@ public:
|
|||||||
fTabContainerView->SetFirstVisibleTabIndex(
|
fTabContainerView->SetFirstVisibleTabIndex(
|
||||||
fTabContainerView->FirstVisibleTabIndex() + 1);
|
fTabContainerView->FirstVisibleTabIndex() + 1);
|
||||||
break;
|
break;
|
||||||
|
case MSG_OPEN_TAB_MENU:
|
||||||
|
{
|
||||||
|
BPopUpMenu* tabMenu = new BPopUpMenu("tab menu", true, false);
|
||||||
|
int tabCount = fTabContainerView->GetLayout()->CountItems();
|
||||||
|
for (int i = 0; i < tabCount; i++) {
|
||||||
|
TabView* tab = fTabContainerView->TabAt(i);
|
||||||
|
if (tab) {
|
||||||
|
BMenuItem* item = new BMenuItem(tab->Label(), NULL);
|
||||||
|
tabMenu->AddItem(item);
|
||||||
|
if (tab->IsFront())
|
||||||
|
item->SetMarked(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force layout to get the final menu size
|
||||||
|
tabMenu->InvalidateLayout();
|
||||||
|
BRect buttonFrame = fTabMenuButton->Frame();
|
||||||
|
BRect menuFrame = tabMenu->Frame();
|
||||||
|
BPoint openPoint = ConvertToScreen(buttonFrame.LeftBottom());
|
||||||
|
// Open with the right side of the menu aligned with the right
|
||||||
|
// side of the button and a little below.
|
||||||
|
openPoint.x -= menuFrame.Width() - buttonFrame.Width();
|
||||||
|
openPoint.y += 2;
|
||||||
|
|
||||||
|
BMenuItem *selected = tabMenu->Go(openPoint, false, false,
|
||||||
|
ConvertToScreen(buttonFrame));
|
||||||
|
if (selected) {
|
||||||
|
selected->SetMarked(true);
|
||||||
|
int32 index = tabMenu->IndexOf(selected);
|
||||||
|
if (index != B_ERROR)
|
||||||
|
fTabContainerView->SelectTab(index);
|
||||||
|
}
|
||||||
|
fTabMenuButton->MenuClosed();
|
||||||
|
delete tabMenu;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
BGroupView::MessageReceived(message);
|
BGroupView::MessageReceived(message);
|
||||||
break;
|
break;
|
||||||
@ -241,6 +306,12 @@ public:
|
|||||||
GroupLayout()->AddView(button, 0.0f);
|
GroupLayout()->AddView(button, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AddTabMenuButton(TabMenuTabButton* button)
|
||||||
|
{
|
||||||
|
fTabMenuButton = button;
|
||||||
|
GroupLayout()->AddView(button, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
void EnableScrollButtons(bool canScrollLeft, bool canScrollRight)
|
void EnableScrollButtons(bool canScrollLeft, bool canScrollRight)
|
||||||
{
|
{
|
||||||
fScrollLeftTabButton->SetEnabled(canScrollLeft);
|
fScrollLeftTabButton->SetEnabled(canScrollLeft);
|
||||||
@ -256,6 +327,7 @@ private:
|
|||||||
TabContainerView* fTabContainerView;
|
TabContainerView* fTabContainerView;
|
||||||
TabButton* fScrollLeftTabButton;
|
TabButton* fScrollLeftTabButton;
|
||||||
TabButton* fScrollRightTabButton;
|
TabButton* fScrollRightTabButton;
|
||||||
|
TabMenuTabButton* fTabMenuButton;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -669,7 +741,8 @@ TabManager::TabManager(const BMessenger& target, BMessage* newTabMessage)
|
|||||||
NewTabButton* newTabButton = new NewTabButton(newTabMessage);
|
NewTabButton* newTabButton = new NewTabButton(newTabMessage);
|
||||||
newTabButton->SetTarget(be_app);
|
newTabButton->SetTarget(be_app);
|
||||||
fTabContainerGroup->GroupLayout()->AddView(newTabButton, 0.0f);
|
fTabContainerGroup->GroupLayout()->AddView(newTabButton, 0.0f);
|
||||||
// fTabContainerGroup->GroupLayout()->AddView(new TabMenuTabButton(NULL), 0.0f);
|
fTabContainerGroup->AddTabMenuButton(new TabMenuTabButton(
|
||||||
|
new BMessage(MSG_OPEN_TAB_MENU)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user