📄 gnomeapp_ui.c
字号:
/* GNOME front end to the CD database developed in Beginning Linux Programming 2nd edition */#include <gnome.h>#include <stdlib.h>#include <stdio.h>#include "cd_data.h"/* define local prototypes */ static void update_clist(void);static void add_cd_dialog(void);static void delete_cd_dialog(void);static void add_track_dialog(void);static void delete_track_dialog(void);static void find_cat_entry(void);static gint get_row(gchar *catalog);static void update_track_list(void);static gint count_track_entries(void);static void create_main_window(void);static void set_insensitive(void);static void show_about_dialog(void);/* define global variables - a data structure would be better */GtkWidget *cd_list;GtkWidget *track_list;GtkWidget *track_frame;cdc_entry selected_cdc_entry;gint selected_track;/* Menu and toolbar definitions */GnomeUIInfo file_menu[] = { GNOMEUIINFO_MENU_EXIT_ITEM(gtk_main_quit, NULL), GNOMEUIINFO_END};GnomeUIInfo edit_menu[] = { GNOMEUIINFO_MENU_FIND_ITEM(find_cat_entry, NULL), GNOMEUIINFO_END};GnomeUIInfo help_menu[] = { GNOMEUIINFO_MENU_ABOUT_ITEM(show_about_dialog, NULL), GNOMEUIINFO_END};GnomeUIInfo menubar[] = { GNOMEUIINFO_MENU_FILE_TREE(file_menu), GNOMEUIINFO_MENU_EDIT_TREE(edit_menu), GNOMEUIINFO_MENU_HELP_TREE(help_menu), GNOMEUIINFO_END};GnomeUIInfo toolbar[] = { GNOMEUIINFO_ITEM_STOCK("New", "Add a Cd", add_cd_dialog, GNOME_STOCK_PIXMAP_CDROM), GNOMEUIINFO_ITEM_STOCK("Delete", "Delete a Cd", delete_cd_dialog, GNOME_STOCK_PIXMAP_CLOSE), GNOMEUIINFO_ITEM_STOCK("Find", "Find a Cd", find_cat_entry, GNOME_STOCK_PIXMAP_SEARCH), GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_ITEM_STOCK("Exit", "Exit the application", gtk_main_quit, GNOME_STOCK_PIXMAP_EXIT), GNOMEUIINFO_END};static void show_about_dialog(){ GtkWidget *about; const gchar *authors[] = { "Wrox Press et al", NULL}; about = gnome_about_new("CD Database", "0.1", "GNU Public License", authors, "The GNOME front end to the CD Database developed in 'Beginning Linux Programming 2nd edition'", NULL); gtk_widget_show(about);}static void select_row_callback(GtkWidget *cd_list, gint row, gint column, GdkEventButton *event, gpointer data){ gchar *row_text; gtk_widget_set_sensitive(track_frame, TRUE); /* unshade the track frame */ gtk_clist_get_text (GTK_CLIST (cd_list), row, 0, &row_text); /* get the catalog of the selected cd */ selected_cdc_entry = get_cdc_entry(row_text); /* update our global variable */ update_track_list(); /* redraw the track list to show the tracks for the selected cd */} static void update_track_list () /* redraw the track list based on the currently selected cd */{ gchar *text[2]; cdt_entry entry_found; gint track_no = 1; gchar buffer[70]; gtk_clist_clear (GTK_CLIST (track_list)); /* clear the track list */ text[0] = buffer; do { entry_found = get_cdt_entry(selected_cdc_entry.catalog, track_no); if (entry_found.catalog[0]) { sprintf(text[0], "%d", entry_found.track_no); /* place the track number in the first column */ text[1] = entry_found.track_txt; /* place the track text in the second column */ gtk_clist_append (GTK_CLIST(track_list), text); /* add the row */ track_no++; /* do the next track */ } } while (entry_found.catalog[0]); } void select_track_row_callback(GtkWidget *cd_list, gint row, gint column, GdkEventButton *event, gpointer data){ selected_track = row + 1; /* update the selected track global variable */ /* rows start from zero, so add one to get the track number */} static void update_clist() /* update the cd list */{ cdc_entry item_found; gint first_call = 1; gchar *text[4]; gchar *null_text = ""; /* we get all the cds from the database by searching for a null string */ gint row; gtk_clist_clear (GTK_CLIST (cd_list)); /* clear the list */ item_found = search_cdc_entry(null_text, &first_call); while (item_found.catalog[0] != '\0') { /* add cds row by row */ text[0] = item_found.catalog; text[1] = item_found.title; text[2] = item_found.type; text[3] = item_found.artist; row = gtk_clist_append (GTK_CLIST(cd_list), text); item_found = search_cdc_entry(null_text, &first_call); } gtk_clist_sort(GTK_CLIST(cd_list)); } static void add_cd_dialog(){ GtkWidget *dialog; GtkWidget *label; GtkWidget *hbox; GtkWidget *catalog, *title, *type, *artist; cdc_entry new_entry; gint i; memset(&new_entry ,'\0', sizeof(new_entry)); dialog = gnome_dialog_new("Add new CD", GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CLOSE, NULL); hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new ("Catalog Entry: "); catalog = gtk_entry_new_with_max_length (CAT_CAT_LEN); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), catalog, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0); hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new ("Title: "); title = gtk_entry_new_with_max_length (CAT_TITLE_LEN); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), title, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0); hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new ("Type: "); type = gtk_entry_new_with_max_length (CAT_TYPE_LEN); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), type, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0); hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new ("Artist: "); artist = gtk_entry_new_with_max_length (CAT_ARTIST_LEN); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), artist, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0); gtk_widget_show_all (dialog); i = gnome_dialog_run(GNOME_DIALOG (dialog)); if (i==0) { strncpy(new_entry.catalog, gtk_entry_get_text (GTK_ENTRY (catalog)), CAT_CAT_LEN - 1); strncpy(new_entry.title, gtk_entry_get_text (GTK_ENTRY(title)), CAT_TITLE_LEN - 1); strncpy(new_entry.type, gtk_entry_get_text (GTK_ENTRY(type)), CAT_TYPE_LEN - 1); strncpy(new_entry.artist, gtk_entry_get_text (GTK_ENTRY(artist)), CAT_ARTIST_LEN - 1); add_cdc_entry(new_entry); update_clist(); } gnome_dialog_close (GNOME_DIALOG (dialog)); }static void delete_cd_dialog() { GtkWidget *dialog; gint track_no = 1; gint i; gint delete_ok; dialog = gnome_message_box_new ("Are you sure you want to delete this entry and all its tracks?", GNOME_MESSAGE_BOX_QUESTION, GNOME_STOCK_BUTTON_YES, GNOME_STOCK_BUTTON_CANCEL, NULL); gtk_widget_show_all (dialog); i = gnome_dialog_run(GNOME_DIALOG (dialog)); if (i==0) { do { delete_ok = del_cdt_entry(selected_cdc_entry.catalog, track_no); track_no++; } while (delete_ok); del_cdc_entry(selected_cdc_entry.catalog); update_clist(); gtk_clist_clear (GTK_CLIST (track_list)); set_insensitive(); }}static void add_track_dialog(){ GtkWidget *dialog; GtkWidget *label; GtkWidget *hbox; GtkWidget *spin_button, *description; GtkObject *spinner_adj; cdt_entry new_track; gint next_track; gint i; memset(&new_track, '\0', sizeof(new_track)); dialog = gnome_dialog_new("Add a track", GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CLOSE, NULL); next_track = count_track_entries() + 1; /* we count the number of tracks for this cd */ /* so we can only add a track with a track number */ /* 1 greater than the current number of tracks */ spinner_adj = gtk_adjustment_new((gfloat) (next_track), 1.0, (gfloat) (next_track), 1.0, 1.0, 1.0); hbox = gtk_hbox_new (FALSE, 2); label = gtk_label_new ("Track number: "); spin_button = gtk_spin_button_new (GTK_ADJUSTMENT (spinner_adj), 1.0, 0.0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin_button), TRUE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -