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:
Ingo Weinhold 2013-11-20 15:48:35 +01:00
parent 435fb01509
commit 6c7abe9829
3 changed files with 48 additions and 10 deletions

View File

@ -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:

View File

@ -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()
{

View File

@ -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();
}