filename | src/gtkui/gdrom_menu.c |
changeset | 691:ad3356543392 |
prev | 678:35eb00945316 |
next | 736:a02d1475ccfd |
author | nkeynes |
date | Thu Jun 19 04:40:37 2008 +0000 (14 years ago) |
permissions | -rw-r--r-- |
last change | Refactor the gd-rom list management out of the GUI (devices, recent files, etc). Add gd-rom list to the cocoa UI. |
file | annotate | diff | log | raw |
1.1 --- a/src/gtkui/gdrom_menu.c Thu May 29 11:00:26 2008 +00001.2 +++ b/src/gtkui/gdrom_menu.c Thu Jun 19 04:40:37 2008 +00001.3 @@ -26,173 +26,41 @@1.4 #include "gdrom/gdrom.h"1.5 #include "gtkui/gtkui.h"1.7 -#define MAX_RECENT_ITEMS 51.8 +static gboolean gdrom_menu_adjusting = FALSE;1.10 -static GList *gdrom_menu_list = NULL;1.11 -static gboolean gdrom_menu_adjusting = FALSE;1.12 -static GList *gdrom_device_list = NULL;1.13 -static GList *gdrom_recent_list = NULL;1.14 -1.15 -void gdrom_menu_rebuild_all();1.16 -1.17 -1.18 -gint gdrom_menu_find_item( const gchar *name )1.19 -{1.20 - gint posn = 0;1.21 - GList *ptr;1.22 -1.23 - for( ptr = gdrom_device_list; ptr != NULL; ptr = g_list_next(ptr) ) {1.24 - gchar *device = (gchar *)ptr->data;1.25 - posn++;1.26 - if( strcmp(device, name) == 0 ) {1.27 - return posn;1.28 - }1.29 - }1.30 - posn++;1.31 - for( ptr = gdrom_recent_list; ptr != NULL; ptr = g_list_next(ptr) ) {1.32 - gchar *file = (gchar *)ptr->data;1.33 - posn++;1.34 - if( strcmp(file, name) == 0 ) {1.35 - return posn;1.36 - }1.37 - }1.38 - return -1;1.39 -}1.40 -1.41 -gint gdrom_menu_add_recent_item( const gchar *name )1.42 -{1.43 - gdrom_recent_list = g_list_prepend( gdrom_recent_list, g_strdup(name) );1.44 - if( g_list_length(gdrom_recent_list) > MAX_RECENT_ITEMS ) {1.45 - GList *ptr = g_list_nth( gdrom_recent_list, MAX_RECENT_ITEMS );1.46 - g_free( ptr->data );1.47 - gdrom_recent_list = g_list_remove( gdrom_recent_list, ptr->data );1.48 - }1.49 -1.50 - GList *ptr;1.51 - int size = 0;1.52 - for( ptr = gdrom_recent_list; ptr != NULL; ptr = g_list_next(ptr) ) {1.53 - size += strlen( (gchar *)ptr->data ) + 1;1.54 - }1.55 - char buf[size];1.56 - strcpy( buf, (gchar *)gdrom_recent_list->data );1.57 - ptr = g_list_next(gdrom_recent_list);1.58 - while( ptr != NULL ) {1.59 - strcat( buf, ":" );1.60 - strcat( buf, (gchar *)ptr->data );1.61 - ptr = g_list_next(ptr);1.62 - }1.63 - lxdream_set_global_config_value( CONFIG_RECENT, buf );1.64 - lxdream_save_config();1.65 -1.66 - return g_list_length( gdrom_device_list ) + 2; // menu posn of new item1.67 -}1.68 -1.69 -void gdrom_menu_update_all()1.70 -{1.71 - const gchar *disc_name = gdrom_get_current_disc_name();1.72 - gint posn = 0;1.73 - GList *ptr;1.74 -1.75 - gdrom_menu_adjusting = TRUE;1.76 -1.77 - if( disc_name != NULL ) {1.78 - posn = gdrom_menu_find_item( disc_name );1.79 - if( posn == -1 ) {1.80 - posn = gdrom_menu_add_recent_item( disc_name );1.81 - gdrom_menu_rebuild_all();1.82 - }1.83 - }1.84 -1.85 - for( ptr = gdrom_menu_list; ptr != NULL; ptr = g_list_next(ptr) ) {1.86 - GtkWidget *menu = GTK_WIDGET(ptr->data);1.87 - GList *children = gtk_container_get_children( GTK_CONTAINER(menu) );1.88 - GList *item = g_list_nth( children, posn );1.89 - assert( item != NULL );1.90 - gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(item->data), TRUE );1.91 - g_list_free(children);1.92 - }1.93 -1.94 - gdrom_menu_adjusting = FALSE;1.95 -}1.96 -1.97 -void gdrom_menu_empty_callback( GtkWidget *widget, gpointer user_data )1.98 +static void gdrom_menu_open_image_callback( GtkWidget *widget, gpointer user_data )1.99 {1.100 if( !gdrom_menu_adjusting ) {1.101 - gdrom_unmount_disc();1.102 - lxdream_set_global_config_value( CONFIG_GDROM, NULL );1.103 - lxdream_save_config();1.104 + const gchar *dir = lxdream_get_config_value(CONFIG_DEFAULT_PATH);1.105 + open_file_dialog( _("Open..."), gdrom_mount_image, NULL, NULL, dir );1.106 }1.107 }1.109 -void gdrom_menu_disc_changed( gdrom_disc_t disc, const gchar *name, void *user_data )1.110 +void gdrom_menu_item_callback( GtkWidget *widget, gpointer user_data )1.111 {1.112 if( !gdrom_menu_adjusting ) {1.113 - gdrom_menu_update_all();1.114 - }1.115 -}1.116 -1.117 -gboolean gdrom_menu_open_file( const char *filename )1.118 -{1.119 - gboolean result = FALSE;1.120 - if( filename != NULL ) {1.121 - result = gdrom_mount_image(filename);1.122 - }1.123 - if( result ) {1.124 - lxdream_set_global_config_value( CONFIG_GDROM, filename );1.125 - lxdream_save_config();1.126 - }1.127 - return result;1.128 -}1.129 -1.130 -void gdrom_menu_open_image_callback( GtkWidget *widget, gpointer user_data )1.131 -{1.132 - if( !gdrom_menu_adjusting ) {1.133 - const gchar *dir = lxdream_get_config_value(CONFIG_DEFAULT_PATH);1.134 - open_file_dialog( _("Open..."), gdrom_menu_open_file, NULL, NULL, dir );1.135 - }1.136 -}1.137 -1.138 -1.139 -void gdrom_menu_open_specified_callback( GtkWidget *widget, gpointer user_data )1.140 -{1.141 - if( !gdrom_menu_adjusting ) {1.142 - gdrom_menu_open_file( (gchar *)user_data );1.143 + gdrom_list_set_selection( GPOINTER_TO_INT(user_data) );1.144 }1.145 }1.147 void gdrom_menu_build( GtkWidget *menu )1.148 {1.149 + unsigned int i, len;1.150 GSList *group = NULL;1.151 - GtkWidget *empty = gtk_radio_menu_item_new_with_label( group, _("Empty") );1.152 - group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(empty) );1.153 - g_signal_connect_after( empty, "activate", G_CALLBACK(gdrom_menu_empty_callback), NULL );1.154 - gtk_menu_shell_append( GTK_MENU_SHELL(menu), empty );1.156 - GList *ptr;1.157 - for( ptr = gdrom_device_list; ptr != NULL; ptr = g_list_next(ptr) ) {1.158 - gchar *name = (gchar *)ptr->data;1.159 - GtkWidget *item = gtk_radio_menu_item_new_with_label( group, name);1.160 - gtk_widget_set_name( item, name );1.161 - group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(item) );1.162 - g_signal_connect_after( item, "activate", G_CALLBACK(gdrom_menu_open_specified_callback),1.163 - name );1.164 - gtk_menu_shell_append( GTK_MENU_SHELL(menu), item );1.165 + len = gdrom_list_size();1.166 + for( i=0; i < len; i++ ) {1.167 + const gchar *entry = gdrom_list_get_display_name(i);1.168 + if( entry[0] == '\0' ) { // Empty string = separator1.169 + gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() );1.170 + } else {1.171 + GtkWidget *item = gtk_radio_menu_item_new_with_label( group, entry );1.172 + group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(item) );1.173 + g_signal_connect_after( item, "activate", G_CALLBACK(gdrom_menu_item_callback), GINT_TO_POINTER(i) );1.174 + gtk_menu_shell_append( GTK_MENU_SHELL(menu), item );1.175 + }1.176 }1.178 - if( gdrom_recent_list != NULL ) {1.179 - gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() );1.180 - for( ptr = gdrom_recent_list; ptr != NULL; ptr = g_list_next(ptr) ) {1.181 - gchar *path = (gchar *)ptr->data;1.182 - gchar *name = basename(path);1.183 - GtkWidget *item = gtk_radio_menu_item_new_with_label( group, name );1.184 - gtk_widget_set_name( item, path );1.185 - group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(item) );1.186 - g_signal_connect_after( item, "activate", G_CALLBACK(gdrom_menu_open_specified_callback),1.187 - path );1.188 - gtk_menu_shell_append( GTK_MENU_SHELL(menu), item );1.189 -1.190 - }1.191 - }1.192 gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() );1.193 GtkWidget *open = gtk_image_menu_item_new_with_label( _("Open image file...") );1.194 g_signal_connect_after( open, "activate", G_CALLBACK(gdrom_menu_open_image_callback), NULL );1.195 @@ -200,47 +68,45 @@1.196 gtk_widget_show_all(menu);1.197 }1.199 +void gdrom_menu_rebuild( GtkWidget *menu )1.200 +{1.201 + GList *children = gtk_container_get_children( GTK_CONTAINER(menu) );1.202 + GList *listptr;1.203 + for( listptr = children; listptr != NULL; listptr = g_list_next(listptr) ) {1.204 + gtk_widget_destroy( GTK_WIDGET(listptr->data) );1.205 + }1.206 + g_list_free(children);1.207 + gdrom_menu_build(menu);1.208 +}1.209 +1.210 +gboolean gdrom_menu_update( gboolean list_changed, int selection, void *user_data )1.211 +{1.212 + gdrom_menu_adjusting = TRUE;1.213 + GtkWidget *menu = GTK_WIDGET(user_data);1.214 +1.215 + if( list_changed ) {1.216 + gdrom_menu_rebuild(menu);1.217 + }1.218 +1.219 + GList *children = gtk_container_get_children( GTK_CONTAINER(menu) );1.220 + GList *item = g_list_nth( children, selection );1.221 + assert( item != NULL );1.222 + gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(item->data), TRUE );1.223 + g_list_free(children);1.224 +1.225 + gdrom_menu_adjusting = FALSE;1.226 + return TRUE;1.227 +}1.228 +1.229 GtkWidget *gdrom_menu_new()1.230 {1.231 GtkWidget *menu = gtk_menu_new();1.232 gtk_menu_set_title( GTK_MENU(menu), _("GD-Rom Settings") );1.234 gdrom_menu_build(menu);1.235 -1.236 - gdrom_menu_list = g_list_append(gdrom_menu_list, menu);1.237 + register_gdrom_list_change_hook(gdrom_menu_update, menu);1.238 + gdrom_menu_update( FALSE, gdrom_list_get_selection(), menu );1.239 gtk_widget_show_all(menu);1.240 - gdrom_menu_update_all();1.241 +1.242 return menu;1.243 }1.244 -1.245 -void gdrom_menu_rebuild_all()1.246 -{1.247 - GList *ptr;1.248 -1.249 - for( ptr = gdrom_menu_list; ptr != NULL; ptr = g_list_next(ptr) ) {1.250 - GtkWidget *menu = GTK_WIDGET(ptr->data);1.251 - GList *children = gtk_container_get_children( GTK_CONTAINER(menu) );1.252 - GList *listptr;1.253 - for( listptr = children; listptr != NULL; listptr = g_list_next(listptr) ) {1.254 - gtk_widget_destroy( GTK_WIDGET(listptr->data) );1.255 - }1.256 - g_list_free(children);1.257 - gdrom_menu_build(menu);1.258 - }1.259 - gdrom_menu_update_all();1.260 -}1.261 -1.262 -void gdrom_menu_init()1.263 -{1.264 - const gchar *recent = lxdream_get_config_value( CONFIG_RECENT );1.265 - register_gdrom_disc_change_hook( gdrom_menu_disc_changed, NULL );1.266 - gdrom_device_list = gdrom_get_native_devices();1.267 - if( recent != NULL ) {1.268 - gchar **list = g_strsplit(recent, ":", 5);1.269 - int i;1.270 - for( i=0; list[i] != NULL; i++ ) {1.271 - gdrom_recent_list = g_list_append( gdrom_recent_list, g_strdup(list[i]) );1.272 - }1.273 - g_strfreev(list);1.274 - }1.275 -}
.