#include "stdafx.h" #include "common.h" #include "sabbu.h" #include "gui_properties.h" #include "gui_workspace.h" #include "gui_export.h" #include "gui_main_script.h" #include "gui_main_video.h" #include "gui_main_event.h" #include "gui_main_karaoke.h" #include "gui_main_navigation.h" #include "gui_main_tool.h" #include "gui_main_help.h" //#include "gui_spell.h" #include "gui_menu.h" extern struct sabbu app; struct menu_item menu_script_export[] = { { MENU_ITEM, _("Menu|Script|Export|_Text File"), NULL, 0, 0, (GCallback) gui_export_cb, (void *) KRY_FORMAT_TEXT }, { MENU_ITEM, _("Menu|Script|Export|_Adobe Encore Text File"), NULL, 0, 0, (GCallback) gui_export_cb, (void *) KRY_FORMAT_ENCORE }, { MENU_END, NULL, NULL, 0, 0, NULL, 0 } }; struct menu_item menu_script[] = { { MENU_ITEM, _("Menu|Script|_New"), NULL, 0, 0, (GCallback) gui_main_menu_script_new, 0 }, { MENU_ITEM, _("Menu|Script|_Open"), NULL, 0, 0, (GCallback) gui_main_menu_script_open, 0 }, { MENU_BRANCH, _("Menu|Script|Open _Recent"), &app.ui.menu.script.open_recent, 0, 0, (GCallback) NULL, 0 }, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0 }, { MENU_ITEM, _("Menu|Script|Proper_ties"), NULL, 0, 0, (GCallback) gui_properties_show, 0 }, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0 }, { MENU_ITEM, _("Menu|Script|_Save"), NULL, GDK_CONTROL_MASK, GDK_s, (GCallback) gui_main_menu_script_save, 0 }, { MENU_ITEM, _("Menu|Script|Save _As"), NULL, 0, 0, (GCallback) gui_main_menu_script_save_as, 0 }, { MENU_ITEM, _("Menu|Script|Save As _UTF16"), &app.ui.menu.script.save_as_utf16, 0, 0, (GCallback) gui_main_menu_script_save_as, (void *) 1 }, { MENU_BRANCH, _("Menu|Script|_Export"), NULL, 0, 0, (GCallback) NULL, menu_script_export }, { MENU_ITEM, _("Menu|Script|_Close"), &app.ui.menu.script.close, 0, 0, (GCallback) gui_main_menu_script_close, 0 }, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0 }, { MENU_ITEM, _("Menu|Script|O_pen Workspace"), NULL, 0, 0, (GCallback) gui_workspace_open_cb, 0 }, { MENU_BRANCH, _("Menu|Script|Op_en Recent Workspace"), &app.ui.menu.script.open_recent_workspace, 0, 0, (GCallback) NULL, 0 }, { MENU_ITEM, _("Menu|Script|Save Wor_kspace"), NULL, 0, 0, (GCallback) gui_workspace_save_cb, 0 }, { MENU_ITEM, _("Menu|Script|Sa_ve Workspace As"), &app.ui.menu.script.save_workspace_as, 0, 0, (GCallback) gui_workspace_save_as_cb, 0 }, { MENU_ITEM, _("Menu|Script|Close _Workspace"), &app.ui.menu.script.close_workspace, 0, 0, (GCallback) gui_workspace_close_cb, 0 }, { MENU_END, NULL, NULL, 0, 0, (GCallback) NULL, 0 } }; struct menu_item menu_audio[] = { { MENU_ITEM, _("Menu|Audio|_Open"), NULL, 0, 0, (GCallback) gui_main_menu_file_audio_open, 0}, { MENU_BRANCH, _("Menu|Audio|Open Recen_t"), &app.ui.menu.audio.open_recent, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Audio|_Close"), &app.ui.menu.audio.close, 0, 0, (GCallback) gui_main_menu_file_audio_close, 0}, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Audio|_Grab Times"), &app.ui.menu.audio.grab_times, GDK_MOD1_MASK, GDK_g, (GCallback) gui_main_grab_times_cb, (void *) 1}, { MENU_ITEM, _("Menu|Audio|Play _Selection"), NULL, GDK_MOD1_MASK, GDK_s, (GCallback) gui_main_play_selected, 0}, { MENU_ITEM, _("Menu|Audio|Play _From Start Marker"), &app.ui.menu.audio.play_from_start_marker, GDK_MOD1_MASK, GDK_p, (GCallback) gui_main_menu_audio_play_start, 0}, { MENU_ITEM, _("Menu|Audio|Play _Previous Row"), &app.ui.menu.audio.play_previous_row, GDK_MOD1_MASK, GDK_v, (GCallback) gui_main_menu_audio_play_previous_row, 0}, { MENU_ITEM, _("Menu|Audio|Play C_urrent Row"), &app.ui.menu.audio.play_current_row, GDK_MOD1_MASK, GDK_r, (GCallback) gui_main_menu_audio_play_current_row, 0}, { MENU_ITEM, _("Menu|Audio|Play _Next Row"), &app.ui.menu.audio.play_next_row, GDK_MOD1_MASK, GDK_x, (GCallback) gui_main_menu_audio_play_next_row, 0}, { MENU_ITEM, _("Menu|Audio|Play _Last 0.5 seconds"), NULL, GDK_MOD1_MASK, GDK_z, (GCallback) gui_main_menu_audio_play_last, 0}, { MENU_ITEM, _("Menu|Audio|Play P_revious 0.25 seconds"), NULL, GDK_MOD1_MASK, GDK_a, (GCallback) gui_main_menu_audio_play_previous, 0}, { MENU_ITEM, _("Menu|Audio|Play N_ext 0.5 seconds"), NULL, GDK_MOD1_MASK | GDK_SHIFT_MASK, GDK_z, (GCallback) gui_main_menu_audio_play_next, 0}, { MENU_ITEM, _("Menu|Audio|Stop Pla_ying"), NULL, GDK_MOD1_MASK, GDK_q, (GCallback) gui_main_menu_audio_stop, 0}, { MENU_ITEM, _("Menu|Audio|_Advance Markers"), &app.ui.menu.audio.advance_selection, GDK_MOD1_MASK, GDK_e, (GCallback) gui_main_advance_markers, 0}, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Audio|Save Selection As _WAV"), &app.ui.menu.audio.save_selection_as_wav, 0, 0, (GCallback) gui_main_save_selection_cb, 0}, { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item menu_video_keyframes[] = { { MENU_ITEM, _("Menu|Video|Key Frames|Load From _Video"), NULL, 0, 0, (GCallback) gui_main_menu_video_keyframes_mark, 0}, { MENU_ITEM, _("Menu|Video|Key Frames|Load List _From File"), NULL, 0, 0, (GCallback) gui_main_menu_video_keyframes_load, 0}, { MENU_ITEM, _("Menu|Video|Key Frames|Save List _To File"), NULL, 0, 0, (GCallback) gui_main_menu_video_keyframes_save, 0}, { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item menu_video[] = { { MENU_ITEM, _("Menu|Video|_Open"), NULL, 0, 0, (GCallback) gui_main_menu_video_open, 0}, { MENU_BRANCH, _("Menu|Video|O_pen Recent"), &app.ui.menu.video.open_recent, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Video|_Close"), &app.ui.menu.video.close, 0, 0, (GCallback) gui_main_menu_video_close, 0}, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0}, { MENU_BRANCH, _("Menu|Video|_Key Frames"), NULL, 0, 0, (GCallback) NULL, menu_video_keyframes}, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Video|_Show Grid"), NULL, 0, 0, (GCallback) gui_main_menu_video_ahow_grid, 0}, { MENU_ITEM, _("Menu|Video|Configure _Grid"), NULL, 0, 0, (GCallback) gui_main_menu_video_configure_grid, 0}, { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item menu_event[] = { { MENU_BRANCH, _("Menu|Event|_Type"), &app.ui.menu.event.type, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Event|_Add Blank Above"), &app.ui.menu.event.add_blank_above, GDK_CONTROL_MASK, GDK_a, (GCallback) gui_main_menu_event_add, (void *) EVENT_ADD_BLANK_BEFORE }, { MENU_ITEM, _("Menu|Event|Add Blank _Below"), &app.ui.menu.event.add_blank_below, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GDK_a, (GCallback) gui_main_menu_event_add, (void *) EVENT_ADD_BLANK_AFTER }, { MENU_ITEM, _("Menu|Event|Add Se_parator Above"), &app.ui.menu.event.add_separator_above, 0, 0, (GCallback) gui_main_menu_event_add, (void *) EVENT_ADD_SEPARATOR_BEFORE }, { MENU_ITEM, _("Menu|Event|Add Separat_or Below"), &app.ui.menu.event.add_separator_below, 0, 0, (GCallback) gui_main_menu_event_add, (void *) EVENT_ADD_SEPARATOR_AFTER }, { MENU_ITEM, _("Menu|Event|_Delete"), &app.ui.menu.event.event_delete, GDK_CONTROL_MASK, GDK_l, (GCallback) gui_main_menu_event_clipboard, (void *) EVENT_DELETE}, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Event|_Find"), NULL, GDK_CONTROL_MASK, GDK_f, (GCallback) gui_find_replace_show, 0 }, { MENU_ITEM, _("Menu|Event|Find _Next"), NULL, GDK_CONTROL_MASK, GDK_g, (GCallback) gui_find_replace_find, 0 }, /* { MENU_ITEM, _("Menu|Event|Find Next Spelling Mistake"), &app.ui.menu.event.find_spelling_mistake, 0, 0, (GCallback) gui_find_next_spelling_mistake, 0 },*/ { MENU_ITEM, _("Menu|Event|Set Spell Check Language"), &app.ui.menu.event.spellcheck_language, 0, 0, NULL, 0 }, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Event|_Join"), &app.ui.menu.event.join, GDK_CONTROL_MASK, GDK_j, (GCallback) gui_main_menu_event_join, 0}, { MENU_ITEM, _("Menu|Event|_Split"), &app.ui.menu.event.split, GDK_CONTROL_MASK, GDK_k, (GCallback) gui_main_menu_event_split, 0}, { MENU_ITEM, _("Menu|Event|Split at Cu_rsor"), &app.ui.menu.event.split_at_cursor, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GDK_k, (GCallback) gui_main_menu_event_split, (void *) 1}, { MENU_ITEM, _("Menu|Event|Shift T_imes"), &app.ui.menu.event.shift_times, 0, 0, (GCallback) gui_main_menu_event_shift_times_cb, 0}, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Event|_Copy"), &app.ui.menu.event.copy, 0, 0, (GCallback) gui_main_menu_event_clipboard, (void *) EVENT_COPY}, { MENU_ITEM, _("Menu|Event|C_ut"), &app.ui.menu.event.cut, 0, 0, (GCallback) gui_main_menu_event_clipboard, (void *) EVENT_CUT}, { MENU_ITEM, _("Menu|Event|_Paste Above"), &app.ui.menu.event.paste_above, 0, 0, (GCallback) gui_main_menu_event_paste, (void *) EVENT_PASTE_BEFORE}, { MENU_ITEM, _("Menu|Event|Paste B_elow"), &app.ui.menu.event.paste_below, 0, 0, (GCallback) gui_main_menu_event_paste, (void *) EVENT_PASTE_AFTER }, #ifdef _DEBUG { MENU_ITEM, _("Menu|Event|Number Events"), &app.ui.menu.event.number_events, 0, 0, (GCallback) gui_main_menu_number_events, 0 }, #endif { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item menu_karaoke[] = { { MENU_ITEM, _("Menu|Karaoke|_Box Mode"), &app.ui.menu.karaoke.box_mode, 0, 0, (GCallback) gui_main_karaoke_mode_on, 0 }, { MENU_ITEM, _("Menu|Karaoke|_Line Mode"), &app.ui.menu.karaoke.script_mode, 0, 0, (GCallback) gui_main_karaoke_mode_on, (void *) 1 }, { MENU_ITEM, _("Menu|Karaoke|Sa_ve Changes"), &app.ui.menu.karaoke.save_changes, GDK_MOD1_MASK, GDK_g, (GCallback) gui_karaoke_grab_times_cb, (void *) 1 }, { MENU_ITEM, _("Menu|Karaoke|Turn _Off"), &app.ui.menu.karaoke.turn_off, 0, 0, (GCallback) gui_main_karaoke_mode_off_cb, (void *) 1 }, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Karaoke|_Split Part"), &app.ui.menu.karaoke.split_part, GDK_CONTROL_MASK, GDK_k, (GCallback) gui_main_karaoke_split_word_cb, 0}, { MENU_SEPARATOR, NULL, NULL, 0, 0, (GCallback) NULL, 0}, { MENU_ITEM, _("Menu|Karaoke|_Previous Part"), &app.ui.menu.karaoke.previous_part, GDK_MOD1_MASK, GDK_v, (GCallback) gui_main_karaoke_prev_part_cb, 0}, { MENU_ITEM, _("Menu|Karaoke|_Next Part"), &app.ui.menu.karaoke.next_part, GDK_MOD1_MASK, GDK_x, (GCallback) gui_main_karaoke_next_part_cb, 0}, { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item menu_navigation[] = { { MENU_ITEM, _("Menu|Navigation|_Next Event"), NULL, GDK_CONTROL_MASK, GDK_n, (GCallback) gui_main_menu_navigation_next_row, (void *) 1}, { MENU_ITEM, _("Menu|Navigation|_Previous Event"), NULL, GDK_CONTROL_MASK, GDK_p, (GCallback) gui_main_menu_navigation_previous_row, (void *) -1}, { MENU_ITEM, _("Menu|Navigation|Page _Up"), NULL, GDK_CONTROL_MASK, GDK_u, (GCallback) gui_main_menu_navigation_page_up, 0}, { MENU_ITEM, _("Menu|Navigation|Page _Down"), NULL, GDK_CONTROL_MASK, GDK_d, (GCallback) gui_main_menu_navigation_page_down, 0}, { MENU_ITEM, _("Menu|Navigation|_Top of Script"), NULL, GDK_CONTROL_MASK, GDK_t, (GCallback) gui_main_menu_navigation_top, 0}, { MENU_ITEM, _("Menu|Navigation|_Bottom of Script"), NULL, GDK_CONTROL_MASK, GDK_b, (GCallback) gui_main_menu_navigation_bottom, 0}, { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item menu_customize[] = { { MENU_ITEM, _("Menu|Customize|_Options"), NULL, 0, 0, (GCallback) gui_main_menu_tool_options, 0}, { MENU_ITEM, _("Menu|Customize|_Colors"), NULL, 0, 0, (GCallback) gui_main_menu_tool_colors, 0}, { MENU_ITEM, _("Menu|Customize|_Menu Shortcuts"), NULL, 0, 0, (GCallback) gui_main_menu_tool_menu_accels, 0}, { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item menu_sync_point[] = { { MENU_ITEM, _("Menu|Sync|Sync Point|Set at Current _Time"), NULL, 0, 0, (GCallback) gui_main_sync_point_set, 0}, { MENU_ITEM, _("Menu|Sync|Sync Point|Sync to Another _Script"), NULL, 0, 0, (GCallback) gui_main_sync_point_sync, 0}, { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item menu_sync[] = { { MENU_BRANCH, _("Menu|Sync|_Sync Point"), NULL, 0, 0, (GCallback) gui_main_sync_point_set, menu_sync_point}, { MENU_ITEM, _("Menu|Sync|Sync Event To _Wave"), NULL, 0, 0, (GCallback) gui_main_sync_event_to_wave, 0}, { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item menu_help[] = { { MENU_ITEM, _("Menu|Help|_Keyboard Shortcuts"), NULL, 0, 0, (GCallback) gui_main_help_shortcuts, 0}, { MENU_ITEM, _("Menu|Help|_About"), NULL, 0, 0, (GCallback) gui_main_help_about, 0}, { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item menu_root[] = { { MENU_BRANCH, _("Menu|S_cript"), NULL, 0, 0, NULL, menu_script}, { MENU_BRANCH, _("Menu|A_udio"), NULL, 0, 0, NULL, menu_audio}, { MENU_BRANCH, _("Menu|V_ideo"), NULL, 0, 0, NULL, menu_video}, { MENU_BRANCH, _("Menu|Even_t"), &app.ui.menu.event.me, 0, 0, NULL, menu_event}, /* { MENU_BRANCH, _("Menu|_Karaoke"), &app.ui.menu.karaoke.me, 0, 0, NULL, menu_karaoke },*/ { MENU_BRANCH, _("Menu|_Navigation"), NULL, 0, 0, NULL, menu_navigation}, { MENU_BRANCH, _("Menu|Cust_omize"), NULL, 0, 0, NULL, menu_customize}, { MENU_BRANCH, _("Menu|S_ync"), &app.ui.menu.sync.me, 0, 0, NULL, menu_sync}, { MENU_BRANCH, _("Menu|_Help"), NULL, 0, 0, NULL, menu_help}, { MENU_END, NULL, NULL, 0, 0, NULL, 0} }; struct menu_item *gui_menu_get_data() { return menu_root; } GtkMenuShell *gui_menu_create_widget(struct menu_item *items, char *path) { gboolean submenu = (items != NULL); GtkMenuShell *menu; if(items == NULL) { menu = GTK_MENU_SHELL(gtk_menu_bar_new()); items = menu_root; } else { menu = GTK_MENU_SHELL(gtk_menu_new()); gtk_menu_set_accel_group(GTK_MENU(menu), app.ui.menu_accel_group); } int index = 0; while(items[index].type != MENU_END) { GtkMenuItem *item; if(items[index].type == MENU_SEPARATOR) { item = GTK_MENU_ITEM(gtk_separator_menu_item_new()); } else { item = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(__(items[index].text))); if(submenu) { char *accel_path = kry_strdup_printf(KRY_LOC "%s/%s", path, sgettext_strip(items[index].text)); char *key_key = kry_strdup_printf(KRY_LOC "%s//Key", accel_path); int key = app.prefs->GetInt("MenuAccels", key_key, items[index].key); kry_free(key_key); char *mod_key = kry_strdup_printf(KRY_LOC "%s//Mod", accel_path); int mod = app.prefs->GetInt("MenuAccels", mod_key, items[index].modifier); kry_free(mod_key); gtk_accel_map_add_entry(accel_path, key, (GdkModifierType) mod); gtk_menu_item_set_accel_path(item, accel_path); kry_free(accel_path); if(items[index].type != MENU_BRANCH && items[index].cb) g_signal_connect(item, "activate", items[index].cb, items[index].param); } if(items[index].var) *(items[index].var) = item; if(items[index].type == MENU_BRANCH && items[index].param) { char *subpath = kry_strdup_printf(KRY_LOC "%s/%s", path, sgettext_strip(items[index].text)); gtk_menu_item_set_submenu(item, GTK_WIDGET(gui_menu_create_widget((struct menu_item *) items[index].param, subpath))); kry_free(subpath); } } gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(item)); index++; } return menu; } void gui_menu_check_labels(struct menu_item *items = NULL) { GList *accels = NULL; if(items == NULL) { char *reserved[] = {"g", "s", "p", "v", "r", "x", "z", "a", "q", "e", NULL}; items = menu_root; for(int i = 0; reserved[i]; i++) accels = g_list_append(accels, kry_strdup(reserved[i])); } for(int i = 0; items[i].type != MENU_END; i++) { if(items[i].type == MENU_BRANCH && items[i].param) { gui_menu_check_labels((struct menu_item *) items[i].param); continue; } if(items[i].type == MENU_SEPARATOR) continue; char *text = __(items[i].text); char *text_accel = strchr(text, '_'); if(text_accel) { char *shortcut = (char *) kry_malloc(2); shortcut[0] = text_accel[1]; shortcut[1] = 0; if(g_list_find_custom(accels, shortcut, (GCompareFunc) strncmp)) g_warning("'%s' does not have a unique accelerator", text); else accels = g_list_append(accels, shortcut); } else { g_warning("'%s' does not have an accelerator", text); } } g_list_foreach(accels, (GFunc) kry_free_minimal, NULL); g_list_free(accels); } GtkWidget *gui_menu_create() { app.ui.menu_accel_group = gtk_accel_group_new(); gtk_window_add_accel_group(app.ui.window, app.ui.menu_accel_group); #ifdef _WINDOWS #ifdef _DEBUG gui_menu_check_labels(); #endif #endif return GTK_WIDGET(gui_menu_create_widget(NULL, "")); }