Added a layout builder for menus.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39507 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -6,11 +6,15 @@
|
|||||||
#define _LAYOUT_BUILDER_H
|
#define _LAYOUT_BUILDER_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <new>
|
||||||
|
|
||||||
#include <GridLayout.h>
|
#include <GridLayout.h>
|
||||||
#include <GridView.h>
|
#include <GridView.h>
|
||||||
#include <GroupLayout.h>
|
#include <GroupLayout.h>
|
||||||
#include <GroupView.h>
|
#include <GroupView.h>
|
||||||
|
#include <Menu.h>
|
||||||
#include <MenuField.h>
|
#include <MenuField.h>
|
||||||
|
#include <MenuItem.h>
|
||||||
#include <SpaceLayoutItem.h>
|
#include <SpaceLayoutItem.h>
|
||||||
#include <SplitView.h>
|
#include <SplitView.h>
|
||||||
#include <TextControl.h>
|
#include <TextControl.h>
|
||||||
@@ -23,6 +27,8 @@ template<typename ParentBuilder> class Base;
|
|||||||
template<typename ParentBuilder = void*> class Group;
|
template<typename ParentBuilder = void*> class Group;
|
||||||
template<typename ParentBuilder = void*> class Grid;
|
template<typename ParentBuilder = void*> class Grid;
|
||||||
template<typename ParentBuilder = void*> class Split;
|
template<typename ParentBuilder = void*> class Split;
|
||||||
|
template<typename ParentBuilder = void*> class Menu;
|
||||||
|
template<typename ParentBuilder = void*> class MenuItem;
|
||||||
|
|
||||||
|
|
||||||
template<typename ParentBuilder>
|
template<typename ParentBuilder>
|
||||||
@@ -248,6 +254,54 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
class Menu : public Base<ParentBuilder> {
|
||||||
|
public:
|
||||||
|
typedef Menu<ParentBuilder> ThisBuilder;
|
||||||
|
typedef MenuItem<ParentBuilder> ItemBuilder;
|
||||||
|
typedef Menu<ThisBuilder> MenuBuilder;
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline Menu(BMenu* menu);
|
||||||
|
|
||||||
|
inline ThisBuilder& GetMenu(BMenu*& _menu);
|
||||||
|
|
||||||
|
inline ItemBuilder AddItem(BMenuItem* item);
|
||||||
|
inline ItemBuilder AddItem(BMenu* menu);
|
||||||
|
inline ItemBuilder AddItem(const char* label, BMessage* message,
|
||||||
|
char shortcut = 0, uint32 modifiers = 0);
|
||||||
|
inline ItemBuilder AddItem(const char* label, uint32 messageWhat,
|
||||||
|
char shortcut = 0, uint32 modifiers = 0);
|
||||||
|
|
||||||
|
inline MenuBuilder AddMenu(BMenu* menu);
|
||||||
|
inline MenuBuilder AddMenu(const char* title,
|
||||||
|
menu_layout layout = B_ITEMS_IN_COLUMN);
|
||||||
|
|
||||||
|
inline ThisBuilder& AddSeparator();
|
||||||
|
|
||||||
|
private:
|
||||||
|
BMenu* fMenu;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
class MenuItem : public Menu<ParentBuilder> {
|
||||||
|
public:
|
||||||
|
typedef MenuItem<ParentBuilder> ThisBuilder;
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline MenuItem(ParentBuilder* parentBuilder,
|
||||||
|
BMenu* menu, BMenuItem* item);
|
||||||
|
|
||||||
|
inline ThisBuilder& GetItem(BMenuItem*& _item);
|
||||||
|
|
||||||
|
inline ThisBuilder& SetEnabled(bool enabled);
|
||||||
|
|
||||||
|
private:
|
||||||
|
BMenuItem* fMenuItem;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark - Base
|
// #pragma mark - Base
|
||||||
|
|
||||||
|
|
||||||
@@ -965,6 +1019,151 @@ Split<ParentBuilder>::operator BSplitView*()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - Menu
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
Menu<ParentBuilder>::Menu(BMenu* menu)
|
||||||
|
:
|
||||||
|
fMenu(menu)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
typename Menu<ParentBuilder>::ThisBuilder&
|
||||||
|
Menu<ParentBuilder>::GetMenu(BMenu*& _menu)
|
||||||
|
{
|
||||||
|
_menu = fMenu;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
typename Menu<ParentBuilder>::ItemBuilder
|
||||||
|
Menu<ParentBuilder>::AddItem(BMenuItem* item)
|
||||||
|
{
|
||||||
|
fMenu->AddItem(item);
|
||||||
|
return MenuItem<ParentBuilder>(this->fParent, fMenu, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
typename Menu<ParentBuilder>::ItemBuilder
|
||||||
|
Menu<ParentBuilder>::AddItem(BMenu* menu)
|
||||||
|
{
|
||||||
|
if (!fMenu->AddItem(menu))
|
||||||
|
throw std::bad_alloc();
|
||||||
|
|
||||||
|
return MenuItem<ParentBuilder>(this->fParent, fMenu,
|
||||||
|
fMenu->ItemAt(fMenu->CountItems() - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
typename Menu<ParentBuilder>::ItemBuilder
|
||||||
|
Menu<ParentBuilder>::AddItem(const char* label, BMessage* message,
|
||||||
|
char shortcut, uint32 modifiers)
|
||||||
|
{
|
||||||
|
BMenuItem* item = new BMenuItem(label, message, shortcut, modifiers);
|
||||||
|
if (!fMenu->AddItem(item))
|
||||||
|
delete item;
|
||||||
|
|
||||||
|
return MenuItem<ParentBuilder>(this->fParent, fMenu, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
typename Menu<ParentBuilder>::ItemBuilder
|
||||||
|
Menu<ParentBuilder>::AddItem(const char* label, uint32 messageWhat,
|
||||||
|
char shortcut, uint32 modifiers)
|
||||||
|
{
|
||||||
|
BMessage* message = new BMessage(messageWhat);
|
||||||
|
BMenuItem* item;
|
||||||
|
try {
|
||||||
|
item = new BMenuItem(label, message, shortcut, modifiers);
|
||||||
|
} catch (...) {
|
||||||
|
delete message;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fMenu->AddItem(item))
|
||||||
|
delete item;
|
||||||
|
|
||||||
|
return MenuItem<ParentBuilder>(this->fParent, fMenu, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
typename Menu<ParentBuilder>::ThisBuilder&
|
||||||
|
Menu<ParentBuilder>::AddSeparator()
|
||||||
|
{
|
||||||
|
fMenu->AddSeparatorItem();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
typename Menu<ParentBuilder>::MenuBuilder
|
||||||
|
Menu<ParentBuilder>::AddMenu(BMenu* menu)
|
||||||
|
{
|
||||||
|
if (!fMenu->AddItem(menu))
|
||||||
|
throw std::bad_alloc();
|
||||||
|
|
||||||
|
MenuBuilder builder(menu);
|
||||||
|
builder.SetParent(this);
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
typename Menu<ParentBuilder>::MenuBuilder
|
||||||
|
Menu<ParentBuilder>::AddMenu(const char* title, menu_layout layout)
|
||||||
|
{
|
||||||
|
BMenu* menu = new BMenu(title, layout);
|
||||||
|
if (!fMenu->AddItem(menu)) {
|
||||||
|
delete menu;
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
|
||||||
|
MenuBuilder builder(menu);
|
||||||
|
builder.SetParent(this);
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - MenuItem
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
MenuItem<ParentBuilder>::MenuItem(ParentBuilder* parentBuilder, BMenu* menu,
|
||||||
|
BMenuItem* item)
|
||||||
|
:
|
||||||
|
Menu<ParentBuilder>(menu),
|
||||||
|
fMenuItem(item)
|
||||||
|
{
|
||||||
|
SetParent(parentBuilder);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
typename MenuItem<ParentBuilder>::ThisBuilder&
|
||||||
|
MenuItem<ParentBuilder>::GetItem(BMenuItem*& _item)
|
||||||
|
{
|
||||||
|
_item = fMenuItem;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ParentBuilder>
|
||||||
|
typename MenuItem<ParentBuilder>::ThisBuilder&
|
||||||
|
MenuItem<ParentBuilder>::SetEnabled(bool enabled)
|
||||||
|
{
|
||||||
|
fMenuItem->SetEnabled(enabled);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace BLayoutBuilder
|
} // namespace BLayoutBuilder
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user