Search
lxdream.org :: lxdream/src/gtkui/gdrom_menu.c
lxdream 0.9.1
released Jun 29
Download Now
filename src/gtkui/gdrom_menu.c
changeset 691:ad3356543392
prev678:35eb00945316
next736:a02d1475ccfd
author nkeynes
date Thu Jun 19 04:40:37 2008 +0000 (15 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
nkeynes@464
     1
/**
nkeynes@561
     2
 * $Id$
nkeynes@464
     3
 *
nkeynes@464
     4
 * Creates and manages the GD-Rom attachment menu.
nkeynes@464
     5
 *
nkeynes@464
     6
 * Copyright (c) 2005 Nathan Keynes.
nkeynes@464
     7
 *
nkeynes@464
     8
 * This program is free software; you can redistribute it and/or modify
nkeynes@464
     9
 * it under the terms of the GNU General Public License as published by
nkeynes@464
    10
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@464
    11
 * (at your option) any later version.
nkeynes@464
    12
 *
nkeynes@464
    13
 * This program is distributed in the hope that it will be useful,
nkeynes@464
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@464
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@464
    16
 * GNU General Public License for more details.
nkeynes@464
    17
 */
nkeynes@464
    18
nkeynes@464
    19
#include <assert.h>
nkeynes@464
    20
#include <libgen.h>
nkeynes@508
    21
#include <glib/gi18n.h>
nkeynes@464
    22
nkeynes@464
    23
#include "dream.h"
nkeynes@464
    24
#include "dreamcast.h"
nkeynes@464
    25
#include "config.h"
nkeynes@464
    26
#include "gdrom/gdrom.h"
nkeynes@537
    27
#include "gtkui/gtkui.h"
nkeynes@464
    28
nkeynes@691
    29
static gboolean gdrom_menu_adjusting = FALSE;
nkeynes@464
    30
nkeynes@691
    31
static void gdrom_menu_open_image_callback( GtkWidget *widget, gpointer user_data )
nkeynes@464
    32
{
nkeynes@464
    33
    if( !gdrom_menu_adjusting ) {
nkeynes@691
    34
        const gchar *dir = lxdream_get_config_value(CONFIG_DEFAULT_PATH);
nkeynes@691
    35
        open_file_dialog( _("Open..."), gdrom_mount_image, NULL, NULL, dir );
nkeynes@678
    36
    }
nkeynes@678
    37
}
nkeynes@678
    38
nkeynes@691
    39
void gdrom_menu_item_callback( GtkWidget *widget, gpointer user_data )
nkeynes@678
    40
{
nkeynes@678
    41
    if( !gdrom_menu_adjusting ) {
nkeynes@691
    42
        gdrom_list_set_selection( GPOINTER_TO_INT(user_data) );
nkeynes@464
    43
    }
nkeynes@464
    44
}
nkeynes@464
    45
nkeynes@464
    46
void gdrom_menu_build( GtkWidget *menu ) 
nkeynes@464
    47
{
nkeynes@691
    48
    unsigned int i, len;
nkeynes@464
    49
    GSList *group = NULL;
nkeynes@464
    50
    
nkeynes@691
    51
    len = gdrom_list_size();
nkeynes@691
    52
    for( i=0; i < len; i++ ) {
nkeynes@691
    53
        const gchar *entry = gdrom_list_get_display_name(i);
nkeynes@691
    54
        if( entry[0] == '\0' ) { // Empty string = separator
nkeynes@691
    55
            gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() );
nkeynes@691
    56
        } else {
nkeynes@691
    57
            GtkWidget *item = gtk_radio_menu_item_new_with_label( group, entry );
nkeynes@691
    58
            group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(item) );
nkeynes@691
    59
            g_signal_connect_after( item, "activate", G_CALLBACK(gdrom_menu_item_callback), GINT_TO_POINTER(i) );
nkeynes@691
    60
            gtk_menu_shell_append( GTK_MENU_SHELL(menu), item );
nkeynes@691
    61
        }
nkeynes@464
    62
    }
nkeynes@464
    63
nkeynes@464
    64
    gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() );
nkeynes@508
    65
    GtkWidget *open = gtk_image_menu_item_new_with_label( _("Open image file...") );
nkeynes@464
    66
    g_signal_connect_after( open, "activate", G_CALLBACK(gdrom_menu_open_image_callback), NULL );
nkeynes@464
    67
    gtk_menu_shell_append( GTK_MENU_SHELL(menu), open );
nkeynes@464
    68
    gtk_widget_show_all(menu);
nkeynes@464
    69
}
nkeynes@464
    70
nkeynes@691
    71
void gdrom_menu_rebuild( GtkWidget *menu )
nkeynes@691
    72
{
nkeynes@691
    73
    GList *children = gtk_container_get_children( GTK_CONTAINER(menu) );
nkeynes@691
    74
    GList *listptr;
nkeynes@691
    75
    for( listptr = children; listptr != NULL; listptr = g_list_next(listptr) ) {
nkeynes@691
    76
        gtk_widget_destroy( GTK_WIDGET(listptr->data) );
nkeynes@691
    77
    }
nkeynes@691
    78
    g_list_free(children);
nkeynes@691
    79
    gdrom_menu_build(menu);
nkeynes@691
    80
}
nkeynes@691
    81
nkeynes@691
    82
gboolean gdrom_menu_update( gboolean list_changed, int selection, void *user_data )
nkeynes@691
    83
{
nkeynes@691
    84
    gdrom_menu_adjusting = TRUE;
nkeynes@691
    85
    GtkWidget *menu = GTK_WIDGET(user_data);
nkeynes@691
    86
nkeynes@691
    87
    if( list_changed ) {
nkeynes@691
    88
        gdrom_menu_rebuild(menu);
nkeynes@691
    89
    }
nkeynes@691
    90
nkeynes@691
    91
    GList *children = gtk_container_get_children( GTK_CONTAINER(menu) );
nkeynes@691
    92
    GList *item = g_list_nth( children, selection );
nkeynes@691
    93
    assert( item != NULL );
nkeynes@691
    94
    gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(item->data), TRUE );
nkeynes@691
    95
    g_list_free(children);
nkeynes@691
    96
nkeynes@691
    97
    gdrom_menu_adjusting = FALSE;
nkeynes@691
    98
    return TRUE;
nkeynes@691
    99
}
nkeynes@691
   100
nkeynes@464
   101
GtkWidget *gdrom_menu_new()
nkeynes@464
   102
{
nkeynes@464
   103
    GtkWidget *menu = gtk_menu_new();
nkeynes@508
   104
    gtk_menu_set_title( GTK_MENU(menu), _("GD-Rom Settings") );
nkeynes@464
   105
nkeynes@464
   106
    gdrom_menu_build(menu);
nkeynes@691
   107
    register_gdrom_list_change_hook(gdrom_menu_update, menu);
nkeynes@691
   108
    gdrom_menu_update( FALSE, gdrom_list_get_selection(), menu );
nkeynes@464
   109
    gtk_widget_show_all(menu);
nkeynes@691
   110
    
nkeynes@464
   111
    return menu;
nkeynes@464
   112
}
.