📄 gnomeapp_ui.c
字号:
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), spin_button, 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 ("Description: "); description = gtk_entry_new_with_max_length (CAT_TITLE_LEN); gtk_box_pack_end (GTK_BOX (hbox), description, FALSE, FALSE, 0); gtk_box_pack_end (GTK_BOX (hbox), label, 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) { /* i==0 when we click ok, so here we add the new track */ new_track.track_no = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON (spin_button)); strncpy(new_track.track_txt, gtk_entry_get_text (GTK_ENTRY (description)), TRACK_TTEXT_LEN - 1); strcpy(new_track.catalog, selected_cdc_entry.catalog); add_cdt_entry(new_track); } gnome_dialog_close(GNOME_DIALOG (dialog)); /* close the dialog */ update_track_list(); /* and update the track list to show the new addition */} static void delete_track_dialog(){ GtkWidget *dialog; gint i; dialog = gnome_message_box_new ("Are you sure you want to delete this track and all the higher numbered 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) { while (del_cdt_entry(selected_cdc_entry.catalog, selected_track)) { selected_track++; } update_track_list(); /* we must delete all higher numbered tracks than the one we select to delete, to ensure */ /* that row 'n' contains track 'n+1', which our update functions etc rely on */ }}static void reorder_list (GtkCList *clist, gint column, gpointer data){ gtk_clist_sort(GTK_CLIST(clist)); /* when we click on a column header in the cd list, we reorder*/ /* in ascending alphabetical order for that column */ gtk_clist_set_sort_column(GTK_CLIST(clist), column); }static gint count_track_entries() /* calculate the total number of tracks for the currently selected cd */{ cdt_entry cdt_found; gint track_entries_found = 0; gint track_no = 1; do { cdt_found = get_cdt_entry(selected_cdc_entry.catalog, track_no); if (cdt_found.catalog[0]) { track_entries_found++; track_no++; } } while (cdt_found.catalog[0]); return (track_entries_found);}static void find_cat_entry(void) /* search for a catalog entry */{ /* first we search the database, then we find the entry in our list */ /* because the list may have been reordered since we created the list */ /* This way, we don't have to keep track of which row each cd is in */ cdc_entry item_found; GtkWidget *dialog; GtkWidget *label; GtkWidget *search_entry; GtkWidget *hbox; gint i; gint first_call = 1; dialog = gnome_dialog_new("Search", GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CLOSE, NULL); hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new ("Search for catalog entry: "); search_entry = 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), search_entry, 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) { item_found = search_cdc_entry(gtk_entry_get_text (GTK_ENTRY (search_entry)), &first_call); if (item_found.catalog[0] != '\0') { gtk_clist_select_row(GTK_CLIST (cd_list), get_row(item_found.catalog),0); /* select the found entry */ gtk_clist_moveto(GTK_CLIST (cd_list), get_row(item_found.catalog), 0, 0.5, 0.5); /* move to the entry */ } } gnome_dialog_close(GNOME_DIALOG (dialog)); } static gint get_row(gchar *catalog) /* find which row a particular entry is in, returning the row number */{ gint row; gchar *row_text; for (row = 0; row <= 9999; row++) { gtk_clist_get_text (GTK_CLIST (cd_list), row, 0, &row_text); if (strcmp(row_text, catalog)==0) { break; } } return row;} static void set_insensitive() /* when we unselect a cd, make sure we can't add or delete a track */ /* by shading the entire frame */{gtk_widget_set_sensitive(track_frame, FALSE);}static void create_main_window() /* function that creates the main window */{ GtkWidget *hbox; GtkWidget *vbox, *vbox2; GtkWidget *scrolled_window; GtkWidget *scrolled_window2; GtkWidget *add_button, *delete_button; GtkWidget *app; gchar *titles[4] = {"Catalog Entry", "Title", "Type", "Artist"}; /* cd list column titles */ gchar *tracks[2] = {"Track no.","Title"}; /* track list column titles */ app = gnome_app_new ("example", "CD Database"); hbox = gtk_hbox_new (FALSE, 0); vbox = gtk_vbox_new (FALSE, 0); vbox2 = gtk_vbox_new (FALSE, 0); cd_list = gtk_clist_new_with_titles (4, titles); track_list = gtk_clist_new_with_titles (2, tracks); gtk_clist_set_column_width(GTK_CLIST(cd_list), 1, 200); /* set sensible column widths */ gtk_clist_set_column_width(GTK_CLIST(cd_list), 2, 50); gtk_clist_set_column_width(GTK_CLIST(cd_list), 3, 100); gtk_clist_set_column_justification (GTK_CLIST(cd_list), 0, GTK_JUSTIFY_CENTER); /* justify leftmost column */ gtk_clist_set_column_justification (GTK_CLIST(track_list), 0, GTK_JUSTIFY_CENTER); gtk_clist_set_sort_type(GTK_CLIST(cd_list), GTK_SORT_ASCENDING); /* sort rows in ascending alphabetical order */ gtk_clist_set_sort_type(GTK_CLIST(track_list), GTK_SORT_ASCENDING); gtk_clist_set_sort_column(GTK_CLIST(cd_list), 0); gtk_clist_set_sort_column(GTK_CLIST(track_list), 0); gtk_clist_column_titles_passive (GTK_CLIST (track_list)); /* set the track list column titles passive, */ /* to show we can't click on them */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); /* create scrolled window widgets to place the clists in */ scrolled_window2 = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); /* select scrollbar policy to show */ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window2), /* a vertical scrollbar only when necessary */ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); track_frame = gtk_frame_new("Tracks"); /* create the frame to hold the track list and buttons */ add_button = gtk_button_new_with_label("Add..."); /* create the add track button */ delete_button = gtk_button_new_with_label("Delete"); /* create the delete track button */ gtk_box_pack_start(GTK_BOX(hbox), add_button, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), delete_button, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(scrolled_window), cd_list); gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(scrolled_window2), track_list); gtk_box_pack_start(GTK_BOX(vbox2), scrolled_window2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(track_frame), vbox2); gtk_box_pack_start(GTK_BOX(vbox), track_frame, TRUE, TRUE, 0); gtk_container_border_width(GTK_CONTAINER (vbox), 10); gnome_app_create_menus (GNOME_APP (app), menubar); gnome_app_create_toolbar (GNOME_APP (app), toolbar); gnome_app_set_contents(GNOME_APP(app), vbox); /* add our callbacks */ gtk_signal_connect (GTK_OBJECT (app), "delete_event", GTK_SIGNAL_FUNC (gtk_main_quit), NULL); gtk_signal_connect(GTK_OBJECT (cd_list), "select_row", GTK_SIGNAL_FUNC(select_row_callback), NULL); gtk_signal_connect(GTK_OBJECT (track_list), "select_row", GTK_SIGNAL_FUNC(select_track_row_callback), NULL); gtk_signal_connect(GTK_OBJECT (cd_list), /* when a column title is clicked, reorder the list */ "click-column", GTK_SIGNAL_FUNC(reorder_list), NULL); gtk_signal_connect(GTK_OBJECT (cd_list), /* when a cd is unselected, shade the track frame */ "unselect_row", GTK_SIGNAL_FUNC(set_insensitive), NULL); /* add the button functionality */ gtk_signal_connect (GTK_OBJECT (add_button), "clicked", GTK_SIGNAL_FUNC (add_track_dialog), NULL); gtk_signal_connect(GTK_OBJECT (delete_button), "clicked", GTK_SIGNAL_FUNC (delete_track_dialog), NULL); set_insensitive(); gtk_widget_show_all (app);} int main(int argc, char *argv[]){ GtkWidget *dialog, *error_dialog; gint i; gnome_init ("example", "0.1", argc, argv); if (!database_initialize(0)) { dialog = gnome_message_box_new ("Sorry, unable to initialize database\nCreate new database?", 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) { if (!database_initialize(1)) { error_dialog = gnome_message_box_new ("Failed to initialize database", GNOME_MESSAGE_BOX_ERROR, GNOME_STOCK_BUTTON_OK, NULL); gtk_widget_show_all(error_dialog); return 0; } } else return 0; } create_main_window(); update_clist(); gtk_main (); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -