The new fSuperItem menu field is now maintained, ie. Menu::Superitem() and
Menu::Supermenu() now work. Added function to find an item by label. The boot volume menu now actually lets you choose a different boot volume. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9525 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -33,11 +33,16 @@ MenuItem::MenuItem(const char *label, Menu *subMenu)
|
|||||||
fData(NULL),
|
fData(NULL),
|
||||||
fHelpText(NULL)
|
fHelpText(NULL)
|
||||||
{
|
{
|
||||||
|
if (subMenu != NULL)
|
||||||
|
subMenu->fSuperItem = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MenuItem::~MenuItem()
|
MenuItem::~MenuItem()
|
||||||
{
|
{
|
||||||
|
if (fSubMenu != NULL)
|
||||||
|
fSubMenu->fSuperItem = NULL;
|
||||||
|
|
||||||
free(const_cast<char *>(fLabel));
|
free(const_cast<char *>(fLabel));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,7 +144,8 @@ Menu::Menu(menu_type type, const char *title)
|
|||||||
fTitle(title),
|
fTitle(title),
|
||||||
fCount(0),
|
fCount(0),
|
||||||
fIsHidden(true),
|
fIsHidden(true),
|
||||||
fType(type)
|
fType(type),
|
||||||
|
fSuperItem(NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,6 +204,21 @@ Menu::CountItems() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MenuItem *
|
||||||
|
Menu::FindItem(const char *label)
|
||||||
|
{
|
||||||
|
MenuItemIterator iterator = ItemIterator();
|
||||||
|
MenuItem *item;
|
||||||
|
|
||||||
|
while ((item = iterator.Next()) != NULL) {
|
||||||
|
if (item->Label() != NULL && !strcmp(item->Label(), label))
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MenuItem *
|
MenuItem *
|
||||||
Menu::FindMarked()
|
Menu::FindMarked()
|
||||||
{
|
{
|
||||||
@@ -304,6 +325,24 @@ Menu::Run()
|
|||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
user_menu_boot_volume(Menu *menu, MenuItem *item)
|
||||||
|
{
|
||||||
|
Menu *super = menu->Supermenu();
|
||||||
|
if (super == NULL) {
|
||||||
|
// huh?
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
MenuItem *bootItem = super->ItemAt(super->CountItems() - 1);
|
||||||
|
bootItem->SetEnabled(true);
|
||||||
|
bootItem->Select(true);
|
||||||
|
bootItem->SetData(item->Data());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static Menu *
|
static Menu *
|
||||||
add_boot_volume_menu(Directory *bootVolume)
|
add_boot_volume_menu(Directory *bootVolume)
|
||||||
{
|
{
|
||||||
@@ -322,6 +361,9 @@ add_boot_volume_menu(Directory *bootVolume)
|
|||||||
char name[B_FILE_NAME_LENGTH];
|
char name[B_FILE_NAME_LENGTH];
|
||||||
if (volume->GetName(name, sizeof(name)) == B_OK) {
|
if (volume->GetName(name, sizeof(name)) == B_OK) {
|
||||||
menu->AddItem(item = new MenuItem(name));
|
menu->AddItem(item = new MenuItem(name));
|
||||||
|
item->SetTarget(user_menu_boot_volume);
|
||||||
|
item->SetData(volume);
|
||||||
|
|
||||||
if (volume == bootVolume) {
|
if (volume == bootVolume) {
|
||||||
item->SetMarked(true);
|
item->SetMarked(true);
|
||||||
item->Select(true);
|
item->Select(true);
|
||||||
@@ -343,7 +385,7 @@ add_boot_volume_menu(Directory *bootVolume)
|
|||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
|
|
||||||
menu->AddItem(item = new MenuItem("Rescan volumes"));
|
menu->AddItem(item = new MenuItem("Rescan volumes"));
|
||||||
item->SetHelpText("Please insert a Haiku CD-ROM or attach a USB disk - depending on your BIOS, you can then boot from them.");
|
item->SetHelpText("Please insert a Haiku CD-ROM or attach a USB disk - depending on your system, you can then boot from them.");
|
||||||
item->SetType(MENU_ITEM_NO_CHOICE);
|
item->SetType(MENU_ITEM_NO_CHOICE);
|
||||||
item->Select(true);
|
item->Select(true);
|
||||||
|
|
||||||
@@ -408,6 +450,11 @@ user_menu(Directory **_bootVolume)
|
|||||||
}
|
}
|
||||||
|
|
||||||
menu->Run();
|
menu->Run();
|
||||||
|
|
||||||
|
// See if a new boot device has been selected, and propagate that back
|
||||||
|
if (item->Data() != NULL)
|
||||||
|
*_bootVolume = (Directory *)item->Data();
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user