nkeynes@464: /** nkeynes@561: * $Id$ nkeynes@464: * nkeynes@464: * Creates and manages the GD-Rom attachment menu. nkeynes@464: * nkeynes@464: * Copyright (c) 2005 Nathan Keynes. nkeynes@464: * nkeynes@464: * This program is free software; you can redistribute it and/or modify nkeynes@464: * it under the terms of the GNU General Public License as published by nkeynes@464: * the Free Software Foundation; either version 2 of the License, or nkeynes@464: * (at your option) any later version. nkeynes@464: * nkeynes@464: * This program is distributed in the hope that it will be useful, nkeynes@464: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@464: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@464: * GNU General Public License for more details. nkeynes@464: */ nkeynes@464: nkeynes@464: #include nkeynes@464: #include nkeynes@464: #include "dream.h" nkeynes@464: #include "dreamcast.h" nkeynes@464: #include "config.h" nkeynes@761: #include "gdlist.h" nkeynes@464: #include "gdrom/gdrom.h" nkeynes@537: #include "gtkui/gtkui.h" nkeynes@464: nkeynes@691: static gboolean gdrom_menu_adjusting = FALSE; nkeynes@464: nkeynes@1109: gboolean gtk_gui_gdrom_mount_image( const char *filename ) nkeynes@1109: { nkeynes@1109: ERROR err; nkeynes@1109: gboolean ok = gdrom_mount_image( filename, &err ); nkeynes@1109: if( !ok ) { nkeynes@1109: ERROR( err.msg ); nkeynes@1109: } nkeynes@1109: return ok; nkeynes@1109: } nkeynes@1109: nkeynes@691: static void gdrom_menu_open_image_callback( GtkWidget *widget, gpointer user_data ) nkeynes@464: { nkeynes@464: if( !gdrom_menu_adjusting ) { nkeynes@1109: open_file_dialog_cb( _("Open..."), gtk_gui_gdrom_mount_image, NULL, NULL, CONFIG_DEFAULT_PATH ); nkeynes@678: } nkeynes@678: } nkeynes@678: nkeynes@691: void gdrom_menu_item_callback( GtkWidget *widget, gpointer user_data ) nkeynes@678: { nkeynes@678: if( !gdrom_menu_adjusting ) { nkeynes@1109: ERROR err; nkeynes@1109: gboolean ok = gdrom_list_set_selection( GPOINTER_TO_INT(user_data), &err ); nkeynes@1109: if( !ok ) { nkeynes@1109: ERROR( err.msg ); nkeynes@1109: } nkeynes@464: } nkeynes@464: } nkeynes@464: nkeynes@464: void gdrom_menu_build( GtkWidget *menu ) nkeynes@464: { nkeynes@691: unsigned int i, len; nkeynes@464: GSList *group = NULL; nkeynes@736: nkeynes@691: len = gdrom_list_size(); nkeynes@691: for( i=0; i < len; i++ ) { nkeynes@691: const gchar *entry = gdrom_list_get_display_name(i); nkeynes@691: if( entry[0] == '\0' ) { // Empty string = separator nkeynes@691: gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() ); nkeynes@691: } else { nkeynes@691: GtkWidget *item = gtk_radio_menu_item_new_with_label( group, entry ); nkeynes@691: group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(item) ); nkeynes@691: g_signal_connect_after( item, "activate", G_CALLBACK(gdrom_menu_item_callback), GINT_TO_POINTER(i) ); nkeynes@691: gtk_menu_shell_append( GTK_MENU_SHELL(menu), item ); nkeynes@691: } nkeynes@464: } nkeynes@464: nkeynes@464: gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() ); nkeynes@508: GtkWidget *open = gtk_image_menu_item_new_with_label( _("Open image file...") ); nkeynes@464: g_signal_connect_after( open, "activate", G_CALLBACK(gdrom_menu_open_image_callback), NULL ); nkeynes@464: gtk_menu_shell_append( GTK_MENU_SHELL(menu), open ); nkeynes@464: gtk_widget_show_all(menu); nkeynes@464: } nkeynes@464: nkeynes@691: void gdrom_menu_rebuild( GtkWidget *menu ) nkeynes@691: { nkeynes@691: GList *children = gtk_container_get_children( GTK_CONTAINER(menu) ); nkeynes@691: GList *listptr; nkeynes@691: for( listptr = children; listptr != NULL; listptr = g_list_next(listptr) ) { nkeynes@691: gtk_widget_destroy( GTK_WIDGET(listptr->data) ); nkeynes@691: } nkeynes@691: g_list_free(children); nkeynes@691: gdrom_menu_build(menu); nkeynes@691: } nkeynes@691: nkeynes@691: gboolean gdrom_menu_update( gboolean list_changed, int selection, void *user_data ) nkeynes@691: { nkeynes@691: gdrom_menu_adjusting = TRUE; nkeynes@691: GtkWidget *menu = GTK_WIDGET(user_data); nkeynes@691: nkeynes@691: if( list_changed ) { nkeynes@691: gdrom_menu_rebuild(menu); nkeynes@691: } nkeynes@691: nkeynes@691: GList *children = gtk_container_get_children( GTK_CONTAINER(menu) ); nkeynes@691: GList *item = g_list_nth( children, selection ); nkeynes@691: assert( item != NULL ); nkeynes@691: gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(item->data), TRUE ); nkeynes@691: g_list_free(children); nkeynes@691: nkeynes@691: gdrom_menu_adjusting = FALSE; nkeynes@691: return TRUE; nkeynes@691: } nkeynes@691: nkeynes@464: GtkWidget *gdrom_menu_new() nkeynes@464: { nkeynes@464: GtkWidget *menu = gtk_menu_new(); nkeynes@508: gtk_menu_set_title( GTK_MENU(menu), _("GD-Rom Settings") ); nkeynes@464: nkeynes@464: gdrom_menu_build(menu); nkeynes@691: register_gdrom_list_change_hook(gdrom_menu_update, menu); nkeynes@691: gdrom_menu_update( FALSE, gdrom_list_get_selection(), menu ); nkeynes@464: gtk_widget_show_all(menu); nkeynes@736: nkeynes@464: return menu; nkeynes@464: }