boot loader: Menu[Item] API improvements
* Make Menu and MenuItem polymorphic. * MenuItem: - Make SetMarked() virtual, so it can be overridden. - Add SetSubmenu() and Supermenu(). - Delete the submenu in the destructor. * Menu: - Add Entered()/Exited() hooks. They frame the time the user navigates the menu or any of its submenus. The hooks allow for subclasses populating their item list dynamically. - Add SortItems(). * Update boot loader menu copyright text to include 2013, now that it is over soon. :-)
This commit is contained in:
parent
435fb01509
commit
6c7abe9829
|
@ -30,12 +30,12 @@ class MenuItem : public DoublyLinkedListLinkImpl<MenuItem> {
|
|||
public:
|
||||
MenuItem(const char* label = NULL,
|
||||
Menu* subMenu = NULL);
|
||||
~MenuItem();
|
||||
virtual ~MenuItem();
|
||||
|
||||
void SetTarget(menu_item_hook target);
|
||||
menu_item_hook Target() const { return fTarget; }
|
||||
|
||||
void SetMarked(bool marked);
|
||||
virtual void SetMarked(bool marked);
|
||||
bool IsMarked() const { return fIsMarked; }
|
||||
|
||||
void Select(bool selected);
|
||||
|
@ -57,7 +57,11 @@ public:
|
|||
char Shortcut() const { return fShortcut; }
|
||||
|
||||
const char* Label() const { return fLabel; }
|
||||
|
||||
Menu* Submenu() const { return fSubMenu; }
|
||||
void SetSubmenu(Menu* subMenu);
|
||||
|
||||
Menu* Supermenu() const { return fMenu; }
|
||||
|
||||
private:
|
||||
friend class Menu;
|
||||
|
@ -93,10 +97,13 @@ enum menu_type {
|
|||
class Menu {
|
||||
public:
|
||||
Menu(menu_type type, const char* title = NULL);
|
||||
~Menu();
|
||||
virtual ~Menu();
|
||||
|
||||
menu_type Type() const { return fType; }
|
||||
|
||||
virtual void Entered();
|
||||
virtual void Exited();
|
||||
|
||||
void Hide() { fIsHidden = true; }
|
||||
void Show() { fIsHidden = false; }
|
||||
bool IsHidden() const { return fIsHidden; }
|
||||
|
@ -131,6 +138,9 @@ public:
|
|||
shortcut_hook FindShortcut(char key) const;
|
||||
MenuItem* FindItemByShortcut(char key);
|
||||
|
||||
void SortItems(bool (*less)(const MenuItem*,
|
||||
const MenuItem*));
|
||||
|
||||
void Run();
|
||||
|
||||
private:
|
||||
|
|
|
@ -51,21 +51,18 @@ MenuItem::MenuItem(const char *label, Menu *subMenu)
|
|||
fIsEnabled(true),
|
||||
fType(MENU_ITEM_STANDARD),
|
||||
fMenu(NULL),
|
||||
fSubMenu(subMenu),
|
||||
fSubMenu(NULL),
|
||||
fData(NULL),
|
||||
fHelpText(NULL),
|
||||
fShortcut(0)
|
||||
{
|
||||
if (subMenu != NULL)
|
||||
subMenu->fSuperItem = this;
|
||||
SetSubmenu(subMenu);
|
||||
}
|
||||
|
||||
|
||||
MenuItem::~MenuItem()
|
||||
{
|
||||
if (fSubMenu != NULL)
|
||||
fSubMenu->fSuperItem = NULL;
|
||||
|
||||
delete fSubMenu;
|
||||
free(const_cast<char *>(fLabel));
|
||||
}
|
||||
|
||||
|
@ -175,6 +172,16 @@ MenuItem::SetShortcut(char key)
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
MenuItem::SetSubmenu(Menu* subMenu)
|
||||
{
|
||||
fSubMenu = subMenu;
|
||||
|
||||
if (fSubMenu != NULL)
|
||||
fSubMenu->fSuperItem = this;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
MenuItem::SetMenu(Menu* menu)
|
||||
{
|
||||
|
@ -210,6 +217,18 @@ Menu::~Menu()
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
Menu::Entered()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Menu::Exited()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
MenuItem*
|
||||
Menu::ItemAt(int32 index)
|
||||
{
|
||||
|
@ -397,6 +416,13 @@ Menu::FindItemByShortcut(char key)
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
Menu::SortItems(bool (*less)(const MenuItem*, const MenuItem*))
|
||||
{
|
||||
fItems.Sort(less);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Menu::Run()
|
||||
{
|
||||
|
|
|
@ -209,7 +209,7 @@ draw_menu(Menu *menu)
|
|||
print_centered(2, "Haiku Boot Loader");
|
||||
|
||||
console_set_color(kCopyrightColor, kBackgroundColor);
|
||||
print_centered(4, "Copyright 2004-2012 Haiku Inc.");
|
||||
print_centered(4, "Copyright 2004-2013 Haiku, Inc.");
|
||||
|
||||
if (menu->Title()) {
|
||||
console_set_cursor(kOffsetX, kFirstLine - 2);
|
||||
|
@ -390,6 +390,7 @@ static void
|
|||
run_menu(Menu* menu)
|
||||
{
|
||||
sMenuOffset = 0;
|
||||
menu->Entered();
|
||||
menu->Show();
|
||||
|
||||
draw_menu(menu);
|
||||
|
@ -481,6 +482,7 @@ run_menu(Menu* menu)
|
|||
}
|
||||
|
||||
menu->Hide();
|
||||
menu->Exited();
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue