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:
@@ -30,12 +30,12 @@ class MenuItem : public DoublyLinkedListLinkImpl<MenuItem> {
|
|||||||
public:
|
public:
|
||||||
MenuItem(const char* label = NULL,
|
MenuItem(const char* label = NULL,
|
||||||
Menu* subMenu = NULL);
|
Menu* subMenu = NULL);
|
||||||
~MenuItem();
|
virtual ~MenuItem();
|
||||||
|
|
||||||
void SetTarget(menu_item_hook target);
|
void SetTarget(menu_item_hook target);
|
||||||
menu_item_hook Target() const { return fTarget; }
|
menu_item_hook Target() const { return fTarget; }
|
||||||
|
|
||||||
void SetMarked(bool marked);
|
virtual void SetMarked(bool marked);
|
||||||
bool IsMarked() const { return fIsMarked; }
|
bool IsMarked() const { return fIsMarked; }
|
||||||
|
|
||||||
void Select(bool selected);
|
void Select(bool selected);
|
||||||
@@ -57,7 +57,11 @@ public:
|
|||||||
char Shortcut() const { return fShortcut; }
|
char Shortcut() const { return fShortcut; }
|
||||||
|
|
||||||
const char* Label() const { return fLabel; }
|
const char* Label() const { return fLabel; }
|
||||||
|
|
||||||
Menu* Submenu() const { return fSubMenu; }
|
Menu* Submenu() const { return fSubMenu; }
|
||||||
|
void SetSubmenu(Menu* subMenu);
|
||||||
|
|
||||||
|
Menu* Supermenu() const { return fMenu; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class Menu;
|
friend class Menu;
|
||||||
@@ -93,10 +97,13 @@ enum menu_type {
|
|||||||
class Menu {
|
class Menu {
|
||||||
public:
|
public:
|
||||||
Menu(menu_type type, const char* title = NULL);
|
Menu(menu_type type, const char* title = NULL);
|
||||||
~Menu();
|
virtual ~Menu();
|
||||||
|
|
||||||
menu_type Type() const { return fType; }
|
menu_type Type() const { return fType; }
|
||||||
|
|
||||||
|
virtual void Entered();
|
||||||
|
virtual void Exited();
|
||||||
|
|
||||||
void Hide() { fIsHidden = true; }
|
void Hide() { fIsHidden = true; }
|
||||||
void Show() { fIsHidden = false; }
|
void Show() { fIsHidden = false; }
|
||||||
bool IsHidden() const { return fIsHidden; }
|
bool IsHidden() const { return fIsHidden; }
|
||||||
@@ -131,6 +138,9 @@ public:
|
|||||||
shortcut_hook FindShortcut(char key) const;
|
shortcut_hook FindShortcut(char key) const;
|
||||||
MenuItem* FindItemByShortcut(char key);
|
MenuItem* FindItemByShortcut(char key);
|
||||||
|
|
||||||
|
void SortItems(bool (*less)(const MenuItem*,
|
||||||
|
const MenuItem*));
|
||||||
|
|
||||||
void Run();
|
void Run();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -51,21 +51,18 @@ MenuItem::MenuItem(const char *label, Menu *subMenu)
|
|||||||
fIsEnabled(true),
|
fIsEnabled(true),
|
||||||
fType(MENU_ITEM_STANDARD),
|
fType(MENU_ITEM_STANDARD),
|
||||||
fMenu(NULL),
|
fMenu(NULL),
|
||||||
fSubMenu(subMenu),
|
fSubMenu(NULL),
|
||||||
fData(NULL),
|
fData(NULL),
|
||||||
fHelpText(NULL),
|
fHelpText(NULL),
|
||||||
fShortcut(0)
|
fShortcut(0)
|
||||||
{
|
{
|
||||||
if (subMenu != NULL)
|
SetSubmenu(subMenu);
|
||||||
subMenu->fSuperItem = this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MenuItem::~MenuItem()
|
MenuItem::~MenuItem()
|
||||||
{
|
{
|
||||||
if (fSubMenu != NULL)
|
delete fSubMenu;
|
||||||
fSubMenu->fSuperItem = NULL;
|
|
||||||
|
|
||||||
free(const_cast<char *>(fLabel));
|
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
|
void
|
||||||
MenuItem::SetMenu(Menu* menu)
|
MenuItem::SetMenu(Menu* menu)
|
||||||
{
|
{
|
||||||
@@ -210,6 +217,18 @@ Menu::~Menu()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Menu::Entered()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Menu::Exited()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MenuItem*
|
MenuItem*
|
||||||
Menu::ItemAt(int32 index)
|
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
|
void
|
||||||
Menu::Run()
|
Menu::Run()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ draw_menu(Menu *menu)
|
|||||||
print_centered(2, "Haiku Boot Loader");
|
print_centered(2, "Haiku Boot Loader");
|
||||||
|
|
||||||
console_set_color(kCopyrightColor, kBackgroundColor);
|
console_set_color(kCopyrightColor, kBackgroundColor);
|
||||||
print_centered(4, "Copyright 2004-2012 Haiku Inc.");
|
print_centered(4, "Copyright 2004-2013 Haiku, Inc.");
|
||||||
|
|
||||||
if (menu->Title()) {
|
if (menu->Title()) {
|
||||||
console_set_cursor(kOffsetX, kFirstLine - 2);
|
console_set_cursor(kOffsetX, kFirstLine - 2);
|
||||||
@@ -390,6 +390,7 @@ static void
|
|||||||
run_menu(Menu* menu)
|
run_menu(Menu* menu)
|
||||||
{
|
{
|
||||||
sMenuOffset = 0;
|
sMenuOffset = 0;
|
||||||
|
menu->Entered();
|
||||||
menu->Show();
|
menu->Show();
|
||||||
|
|
||||||
draw_menu(menu);
|
draw_menu(menu);
|
||||||
@@ -481,6 +482,7 @@ run_menu(Menu* menu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
menu->Hide();
|
menu->Hide();
|
||||||
|
menu->Exited();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user