diff --git a/osx/scenedit/scen.main.cpp b/osx/scenedit/scen.main.cpp index 88361ef50..1a5b6e336 100644 --- a/osx/scenedit/scen.main.cpp +++ b/osx/scenedit/scen.main.cpp @@ -230,58 +230,14 @@ void Handle_Update() { restore_cursor(); } -//void handle_menu_choice(long choice) { -// int menu,menu_item; -// -// if (choice != 0) { -// menu = HiWord(choice); -// menu_item = LoWord(choice); -// -// set_cursor(wand_curs); -// switch (menu) { -// case 500: -// handle_apple_menu(menu_item); -// break; -// case 550: -// handle_file_menu(menu_item); -// break; -// case 600: -// handle_scenario_menu(menu_item); -// break; -// case 650: -// handle_town_menu(menu_item); -// break; -// case 651: -// handle_outdoor_menu(menu_item); -// break; -// case 675: -// handle_help_menu(menu_item); -// break; -// case 700: case 701: case 702: case 703: case 704: -// handle_item_menu(menu_item + 80 * (menu - 700) - 1); -// break; -// case 750: case 751: case 752: case 753: -// handle_monst_menu(menu_item + 64 * (menu - 750) - 1); -// break; -// -// } -// } -// HiliteMenu(0); -//} - void handle_apple_menu(int item_hit) { switch (item_hit) { case 1: cChoiceDlog("about-scened.xml").show(); break; - default: - // GetItem (apple_menu,item_hit,desk_acc_name); - // desk_acc_num = OpenDeskAcc(desk_acc_name); - break; } } - void handle_file_menu(int item_hit) { fs::path file_to_load; switch (item_hit) { diff --git a/osx/scenedit/scen.menus.mac.mm b/osx/scenedit/scen.menus.mac.mm index 1726fa405..62772d946 100644 --- a/osx/scenedit/scen.menus.mac.mm +++ b/osx/scenedit/scen.menus.mac.mm @@ -13,19 +13,41 @@ using MenuHandle = NSMenu*; MenuHandle menu_bar_handle; MenuHandle item_menu[5], mon_menu[4]; -MenuHandle file_menu, edit_menu; +MenuHandle file_menu, edit_menu, app_menu, scen_menu, town_menu, out_menu, help_menu; extern cScenario scenario; @interface MenuHandler : NSObject - +-(void) appMenu:(id) sender; +-(void) fileMenu:(id) sender; +-(void) editMenu:(id) sender; +-(void) scenMenu:(id) sender; +-(void) townMenu:(id) sender; +-(void) outMenu:(id) sender; +-(void) itemMenu:(id) sender; +-(void) monstMenu:(id) sender; +-(void) helpMenu:(id) sender; +-(void) onlineHelp:(id) sender; @end +static void setMenuCallback(NSMenuItem* item, id targ, SEL selector, int num) { + [item setTarget: targ]; + [item setAction: selector]; + [item setRepresentedObject: [[NSNumber numberWithInt: num] retain]]; +} + void init_menubar() { NSApplication* app = [NSApplication sharedApplication]; [NSBundle loadNibNamed: @"scen.menu" owner: app]; menu_bar_handle = [app mainMenu]; + app_menu = [[menu_bar_handle itemWithTitle: @"BoE Scenario Editor"] submenu]; + file_menu = [[menu_bar_handle itemWithTitle: @"File"] submenu]; + edit_menu = [[menu_bar_handle itemWithTitle: @"Edit"] submenu]; + scen_menu = [[menu_bar_handle itemWithTitle: @"Scenario"] submenu]; + town_menu = [[menu_bar_handle itemWithTitle: @"Town"] submenu]; + out_menu = [[menu_bar_handle itemWithTitle: @"Outdoors"] submenu]; + help_menu = [[menu_bar_handle itemWithTitle: @"Help"] submenu]; item_menu[0] = [[menu_bar_handle itemWithTitle: @"I1"] submenu]; item_menu[1] = [[menu_bar_handle itemWithTitle: @"I2"] submenu]; item_menu[2] = [[menu_bar_handle itemWithTitle: @"I3"] submenu]; @@ -35,12 +57,34 @@ void init_menubar() { mon_menu[1] = [[menu_bar_handle itemWithTitle: @"M2"] submenu]; mon_menu[2] = [[menu_bar_handle itemWithTitle: @"M3"] submenu]; mon_menu[3] = [[menu_bar_handle itemWithTitle: @"M4"] submenu]; + + MenuHandler* handler = [[[MenuHandler alloc] init] retain]; + setMenuCallback([app_menu itemWithTitle: @"About BoE Scenario Editor"], handler, @selector(appMenu:), 1); + setMenuCallback([app_menu itemWithTitle: @"Quit BoE Scenario Editor"], handler, @selector(fileMenu:), 5); + // TODO: Organize file menu function + setMenuCallback([file_menu itemWithTitle: @"New Scenario…"], handler, @selector(fileMenu:), 3); + setMenuCallback([file_menu itemWithTitle: @"Open…"], handler, @selector(fileMenu:), 1); + setMenuCallback([file_menu itemWithTitle: @"Save"], handler, @selector(fileMenu:), 2); + setMenuCallback([help_menu itemAtIndex: 0], handler, @selector(onlineHelp:), 0); + + for(int i = 0; i < [edit_menu numberOfItems]; i++) + setMenuCallback([edit_menu itemAtIndex: i], handler, @selector(editMenu:), i + 1); + for(int i = 0; i < [scen_menu numberOfItems]; i++) + setMenuCallback([scen_menu itemAtIndex: i], handler, @selector(scenMenu:), i + 1); + for(int i = 0; i < [town_menu numberOfItems]; i++) + setMenuCallback([town_menu itemAtIndex: i], handler, @selector(townMenu:), i + 1); + for(int i = 0; i < [out_menu numberOfItems]; i++) + setMenuCallback([out_menu itemAtIndex: i], handler, @selector(outMenu:), i + 1); + for(int i = 2; i < [help_menu numberOfItems]; i++) + setMenuCallback([help_menu itemAtIndex: i], handler, @selector(helpMenu:), i - 1); + // TODO: Item and monster menus } // mode 0 - initial shut down, 1 - no town, 2 - no out, 3 - no town or out 4 - all menus on // TODO: Use an enum here void shut_down_menus(short mode) { - if (mode == 0) { + if(mode == 0) { + [[file_menu itemWithTitle: @"Save"] setEnabled: NO]; [[menu_bar_handle itemWithTitle: @"Scenario"] setEnabled: NO]; [[menu_bar_handle itemWithTitle: @"Town"] setEnabled: NO]; [[menu_bar_handle itemWithTitle: @"Outdoors"] setEnabled: NO]; @@ -54,8 +98,8 @@ void shut_down_menus(short mode) { [[menu_bar_handle itemWithTitle: @"M3"] setEnabled: NO]; [[menu_bar_handle itemWithTitle: @"M4"] setEnabled: NO]; } - if (mode == 4) { - [[[[menu_bar_handle itemWithTitle: @"File"] submenu] itemWithTitle: @"Save"] setEnabled: YES]; + if(mode == 4) { + [[file_menu itemWithTitle: @"Save"] setEnabled: YES]; [[menu_bar_handle itemWithTitle: @"Scenario"] setEnabled: YES]; [[menu_bar_handle itemWithTitle: @"Town"] setEnabled: YES]; MenuHandle town_menu = [[menu_bar_handle itemWithTitle: @"Town"] submenu]; @@ -77,7 +121,7 @@ void shut_down_menus(short mode) { [[menu_bar_handle itemWithTitle: @"M3"] setEnabled: YES]; [[menu_bar_handle itemWithTitle: @"M4"] setEnabled: YES]; } - if ((mode == 1) || (mode == 3)) { + if((mode == 1) || (mode == 3)) { MenuHandle town_menu = [[menu_bar_handle itemWithTitle: @"Town"] submenu]; for(id item in [town_menu itemArray]) if([[item title] length] > 0 && [[item title] characterAtIndex: 0] != ' ') @@ -92,7 +136,7 @@ void shut_down_menus(short mode) { [[menu_bar_handle itemWithTitle: @"M3"] setEnabled: NO]; [[menu_bar_handle itemWithTitle: @"M4"] setEnabled: NO]; } - if ((mode == 2) || (mode == 3)) { + if((mode == 2) || (mode == 3)) { MenuHandle out_menu = [[menu_bar_handle itemWithTitle: @"Outdoors"] submenu]; for(id item in [out_menu itemArray]) if([[item title] length] > 0 && [[item title] characterAtIndex: 0] != ' ') @@ -105,7 +149,7 @@ void update_item_menu() { short i,j; char item_name[256]; - for (j = 0; j < 5; j++) { + for(j = 0; j < 5; j++) { [item_menu[j] removeAllItems]; for (i = 0; i < 80; i++) { NSString* title = [NSString stringWithCString: scenario.scen_items[i + j * 80].full_name.c_str() encoding: NSASCIIStringEncoding]; @@ -113,9 +157,9 @@ void update_item_menu() { [newItem setTarget: targ]; } } - for (j = 0; j < 4; j++) { + for(j = 0; j < 4; j++) { [mon_menu[j] removeAllItems]; - for (i = 0; i < 64; i++) { + for(i = 0; i < 64; i++) { NSString* title = [NSString stringWithCString: scenario.scen_monsters[i + j * 64].m_name.c_str() encoding: NSASCIIStringEncoding]; NSMenuItem* newItem = [mon_menu[j] addItemWithTitle: title action: @selector(monstMenu:) keyEquivalent: @""]; [newItem setTarget: targ]; @@ -123,3 +167,53 @@ void update_item_menu() { } } + +void handle_apple_menu(int item_hit); +void handle_file_menu(int item_hit); +void handle_scenario_menu(int item_hit); +void handle_town_menu(int item_hit); +void handle_outdoor_menu(int item_hit); +void handle_help_menu(int item_hit); +void handle_item_menu(int item_hit); +void handle_monst_menu(int item_hit); + +@implementation MenuHandler +-(void) appMenu:(id) sender { + handle_apple_menu([[sender representedObject] intValue]); +} + +-(void) fileMenu:(id) sender { + handle_file_menu([[sender representedObject] intValue]); +} + +// TODO: Implement edit menu (much work to be done here!) +-(void) editMenu:(id) sender { +} + +-(void) scenMenu:(id) sender { + handle_scenario_menu([[sender representedObject] intValue]); +} + +-(void) townMenu:(id) sender { + handle_town_menu([[sender representedObject] intValue]); +} + +-(void) outMenu:(id) sender { + handle_outdoor_menu([[sender representedObject] intValue]); +} + +// TODO: Monster and item menus +-(void) itemMenu:(id) sender { +} + +-(void) monstMenu:(id) sender { +} + +-(void) helpMenu:(id) sender { + handle_help_menu([[sender representedObject] intValue]); +} + +-(void) onlineHelp:(id) sender { + [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: @"https://calref.net/~sylae/boe-doc/editor/About.html"]]; +} +@end