📄 favorites.cpp
字号:
{ GtkTreeModel* model; GtkTreePath* path = gtk_tree_path_new_from_string (path_string); GtkTreeIter iter; gint column; HXFavorite* favorite = NULL; column = (gint)g_object_get_data (G_OBJECT (cell), "column"); model = (GtkTreeModel*)g_object_get_data (G_OBJECT (cell), "model"); g_return_if_fail(model != NULL); gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, COLUMN_FAVORITE, &favorite, -1); g_return_if_fail(favorite != NULL); switch(column) { case COLUMN_TITLE: g_free(favorite->title); favorite->title = g_strdup(new_text); gtk_list_store_set(GTK_LIST_STORE(model), &iter, COLUMN_TITLE, favorite->title, -1); break; case COLUMN_URL: g_free(favorite->url); favorite->url = g_strdup(new_text); gtk_list_store_set(GTK_LIST_STORE(model), &iter, COLUMN_URL, favorite->url, -1); break; } gtk_tree_path_free(path);}static voidcount_selections(GtkTreeModel* /* model */, GtkTreePath* /* path */, GtkTreeIter* /* iter */, gpointer data){ gint* count = (gint*)data; (*count)++;}void hfd_selection_changed(GtkTreeSelection* selection, GtkWidget* delete_button){ gint count = 0; gtk_tree_selection_selected_foreach(selection, count_selections, &count); if(count > 0) { /* Enable delete button */ gtk_widget_set_sensitive(GTK_WIDGET(delete_button), TRUE); } else { /* Disable delete button */ gtk_widget_set_sensitive(GTK_WIDGET(delete_button), FALSE); }}typedef struct{ GladeXML* xml;} HXManageFavoritesDialog;static voidhxplay_manage_favorites_dialog_destroy (GtkWidget* /* widget */, HXManageFavoritesDialog* info){ glade_xml_destroy (info->xml); g_free(info);}GtkDialog*hxplay_manage_favorites_dialog_new(GList** favorites_list_ptr){ GladeXML* xml; GtkWidget* dialog; gchar* filename; GList* favorites_list = *favorites_list_ptr; GList* favorites_list_iter; GtkWidget* tree_view; GtkWidget* delete_button; GtkListStore *store; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeIter tree_iter; GtkTreeSelection* selection; HXManageFavoritesDialog* info; filename = hxcommon_locate_file("favorites.glade"); xml = glade_xml_new (filename, NULL, NULL); g_free(filename); g_return_val_if_fail(xml != NULL, NULL); dialog = glade_xml_get_widget(xml, "hxplayer_favorites_dialog"); g_return_val_if_fail(dialog != NULL, NULL); delete_button = glade_xml_get_widget(xml, "hfd_delete_button"); g_return_val_if_fail(delete_button != NULL, NULL); tree_view = glade_xml_get_widget (xml, "hfd_tree_view"); g_return_val_if_fail(tree_view != NULL, NULL); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(hfd_selection_changed), delete_button); /* Populate the store */ store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_POINTER); favorites_list_iter = favorites_list; while(favorites_list_iter) { HXFavorite* favorite = (HXFavorite*)favorites_list_iter->data; gtk_list_store_append(store, &tree_iter); gtk_list_store_set (store, &tree_iter, COLUMN_TITLE, favorite->title, COLUMN_URL, favorite->url, COLUMN_EDITABLE, TRUE, COLUMN_FAVORITE, favorite, -1); favorites_list_iter = g_list_next(favorites_list_iter); } /* Configure the tree view */ gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(store)); /* Title column */ renderer = gtk_cell_renderer_text_new(); g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(hfd_cell_edited), NULL); g_object_set_data(G_OBJECT(renderer), "model", store); g_object_set_data(G_OBJECT(renderer), "column", (gint *)COLUMN_TITLE); column = gtk_tree_view_column_new_with_attributes(_("Title"), renderer, "text", COLUMN_TITLE, "editable", COLUMN_EDITABLE, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); // XXXRGG: How do I set the default (vs minimum) width of a column? gtk_tree_view_column_set_min_width (column, 80); /* Url column */ renderer = gtk_cell_renderer_text_new(); g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (hfd_cell_edited), NULL); g_object_set_data(G_OBJECT(renderer), "model", store); g_object_set_data(G_OBJECT(renderer), "column", (gint *)COLUMN_URL); column = gtk_tree_view_column_new_with_attributes(_("URI"), renderer, "text", COLUMN_URL, "editable", COLUMN_EDITABLE, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); /* Set data for new/delete button handlers */ g_object_set_data(G_OBJECT(dialog), "favorites_list_ptr", (gpointer)favorites_list_ptr); g_object_set_data(G_OBJECT(dialog), "model", (gpointer)store); g_object_set_data(G_OBJECT(dialog), "tree_view", (gpointer)tree_view); info = g_new0(HXManageFavoritesDialog, 1); info->xml = xml; g_signal_connect (G_OBJECT (dialog), "destroy", G_CALLBACK (hxplay_manage_favorites_dialog_destroy), info); return GTK_DIALOG(dialog);}void hfd_new_favorite(GtkWidget* widget){ GList* favorites_list; GList** favorites_list_ptr; GtkListStore* list_store; gpointer model_data; HXFavorite* favorite; GtkTreeIter tree_iter; GtkWidget* tree_view; GtkTreePath* path; GtkWidget* dialog = gtk_widget_get_toplevel(widget); favorites_list_ptr = (GList**)g_object_get_data(G_OBJECT(dialog), "favorites_list_ptr"); favorites_list = *favorites_list_ptr; model_data = g_object_get_data(G_OBJECT(dialog), "model"); list_store = GTK_LIST_STORE(model_data); tree_view = (GtkWidget*)g_object_get_data(G_OBJECT(dialog), "tree_view"); favorite = hx_favorite_new(); favorite->title = g_strdup(_("Untitled")); favorite->url = g_strdup("http://"); favorites_list = g_list_append(favorites_list, favorite); gtk_list_store_append(list_store, &tree_iter); gtk_list_store_set (list_store, &tree_iter, COLUMN_TITLE, favorite->title, COLUMN_URL, favorite->url, COLUMN_EDITABLE, TRUE, COLUMN_FAVORITE, favorite, -1); path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), &tree_iter); gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree_view), path, NULL, FALSE); gtk_tree_path_free(path); *favorites_list_ptr = favorites_list;}void hfd_delete_favorite(GtkWidget* widget){ GList* favorites_list; GList** favorites_list_ptr; GList* favorites_link; GtkListStore* list_store; gpointer model_data; HXFavorite* favorite; GtkTreeIter tree_iter; GtkTreeIter* select_iter = NULL; GtkTreeIter* last_iter = NULL; GtkTreeSelection* selection; GtkWidget* tree_view; gboolean got_row; gboolean deleted_row = FALSE; GtkWidget* dialog = gtk_widget_get_toplevel(widget); favorites_list_ptr = (GList**)g_object_get_data(G_OBJECT(dialog), "favorites_list_ptr"); favorites_list = *favorites_list_ptr; tree_view = (GtkWidget*)g_object_get_data(G_OBJECT(dialog), "tree_view"); model_data = g_object_get_data(G_OBJECT(dialog), "model"); list_store = GTK_LIST_STORE(model_data); g_return_if_fail(list_store != NULL && favorites_list != NULL && model_data != NULL); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); got_row = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &tree_iter); while(got_row) { if(gtk_tree_selection_iter_is_selected(selection, &tree_iter)) { gtk_tree_model_get(GTK_TREE_MODEL(list_store), &tree_iter, COLUMN_FAVORITE, &favorite, -1); favorites_link = g_list_find(favorites_list, favorite); favorites_list = g_list_remove_link(favorites_list, favorites_link); hx_favorite_free(favorite); // Gtk 2.2: // got_row = gtk_list_store_remove(list_store, &tree_iter); gtk_list_store_remove(list_store, &tree_iter); got_row = tree_iter.stamp != 0; if(select_iter) { gtk_tree_iter_free(select_iter); select_iter = NULL; } if(got_row) { select_iter = gtk_tree_iter_copy(&tree_iter); } deleted_row = TRUE; } else { if(last_iter) { gtk_tree_iter_free(last_iter); } last_iter = gtk_tree_iter_copy(&tree_iter); got_row = gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &tree_iter); } } if(deleted_row) { GtkTreePath* path; if(!select_iter) { select_iter = last_iter; } else { gtk_tree_iter_free(last_iter); } if(select_iter) { path = gtk_tree_model_get_path(GTK_TREE_MODEL(list_store), select_iter); gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree_view), path, NULL, FALSE); gtk_tree_path_free(path); gtk_tree_iter_free(select_iter); select_iter = NULL; } } *favorites_list_ptr = favorites_list;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -