diff options
author | Leo Tenenbaum <pommicket@gmail.com> | 2018-08-20 21:12:06 -0400 |
---|---|---|
committer | Leo Tenenbaum <pommicket@gmail.com> | 2018-08-20 21:12:06 -0400 |
commit | 63e87c2d0c9d263f14c77b68f85c67d46ece82a9 (patch) | |
tree | 6260365cbf7d24f37d27669e8538227fcb72e243 /gtk+-mingw/share/gtk-3.0/demo/iconview.c | |
parent | a4460f6d9453bbd7e584937686449cef3e19f052 (diff) |
Diffstat (limited to 'gtk+-mingw/share/gtk-3.0/demo/iconview.c')
-rw-r--r-- | gtk+-mingw/share/gtk-3.0/demo/iconview.c | 371 |
1 files changed, 0 insertions, 371 deletions
diff --git a/gtk+-mingw/share/gtk-3.0/demo/iconview.c b/gtk+-mingw/share/gtk-3.0/demo/iconview.c deleted file mode 100644 index a94b484..0000000 --- a/gtk+-mingw/share/gtk-3.0/demo/iconview.c +++ /dev/null @@ -1,371 +0,0 @@ -/* Icon View/Icon View Basics - * - * The GtkIconView widget is used to display and manipulate icons. - * It uses a GtkTreeModel for data storage, so the list store - * example might be helpful. - */ - -#include <gtk/gtk.h> -#include <string.h> -#include "demo-common.h" - -static GtkWidget *window = NULL; - -#define FOLDER_NAME "gnome-fs-directory.png" -#define FILE_NAME "gnome-fs-regular.png" - -enum -{ - COL_PATH, - COL_DISPLAY_NAME, - COL_PIXBUF, - COL_IS_DIRECTORY, - NUM_COLS -}; - - -static GdkPixbuf *file_pixbuf, *folder_pixbuf; -gchar *parent; -GtkToolItem *up_button; - -/* Loads the images for the demo and returns whether the operation succeeded */ -static gboolean -load_pixbufs (GError **error) -{ - char *filename; - - if (file_pixbuf) - return TRUE; /* already loaded earlier */ - - /* demo_find_file() looks in the current directory first, - * so you can run gtk-demo without installing GTK, then looks - * in the location where the file is installed. - */ - filename = demo_find_file (FILE_NAME, error); - if (!filename) - return FALSE; /* note that "error" was filled in and returned */ - - file_pixbuf = gdk_pixbuf_new_from_file (filename, error); - g_free (filename); - - if (!file_pixbuf) - return FALSE; /* Note that "error" was filled with a GError */ - - filename = demo_find_file (FOLDER_NAME, error); - if (!filename) - return FALSE; /* note that "error" was filled in and returned */ - - folder_pixbuf = gdk_pixbuf_new_from_file (filename, error); - g_free (filename); - - return TRUE; -} - -static void -fill_store (GtkListStore *store) -{ - GDir *dir; - const gchar *name; - GtkTreeIter iter; - - /* First clear the store */ - gtk_list_store_clear (store); - - /* Now go through the directory and extract all the file - * information */ - dir = g_dir_open (parent, 0, NULL); - if (!dir) - return; - - name = g_dir_read_name (dir); - while (name != NULL) - { - gchar *path, *display_name; - gboolean is_dir; - - /* We ignore hidden files that start with a '.' */ - if (name[0] != '.') - { - path = g_build_filename (parent, name, NULL); - - is_dir = g_file_test (path, G_FILE_TEST_IS_DIR); - - display_name = g_filename_to_utf8 (name, -1, NULL, NULL, NULL); - - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, - COL_PATH, path, - COL_DISPLAY_NAME, display_name, - COL_IS_DIRECTORY, is_dir, - COL_PIXBUF, is_dir ? folder_pixbuf : file_pixbuf, - -1); - g_free (path); - g_free (display_name); - } - - name = g_dir_read_name (dir); - } - g_dir_close (dir); -} - -static gint -sort_func (GtkTreeModel *model, - GtkTreeIter *a, - GtkTreeIter *b, - gpointer user_data) -{ - gboolean is_dir_a, is_dir_b; - gchar *name_a, *name_b; - int ret; - - /* We need this function because we want to sort - * folders before files. - */ - - - gtk_tree_model_get (model, a, - COL_IS_DIRECTORY, &is_dir_a, - COL_DISPLAY_NAME, &name_a, - -1); - - gtk_tree_model_get (model, b, - COL_IS_DIRECTORY, &is_dir_b, - COL_DISPLAY_NAME, &name_b, - -1); - - if (!is_dir_a && is_dir_b) - ret = 1; - else if (is_dir_a && !is_dir_b) - ret = -1; - else - { - ret = g_utf8_collate (name_a, name_b); - } - - g_free (name_a); - g_free (name_b); - - return ret; -} - -static GtkListStore * -create_store (void) -{ - GtkListStore *store; - - store = gtk_list_store_new (NUM_COLS, - G_TYPE_STRING, - G_TYPE_STRING, - GDK_TYPE_PIXBUF, - G_TYPE_BOOLEAN); - - /* Set sort column and function */ - gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (store), - sort_func, - NULL, NULL); - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), - GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, - GTK_SORT_ASCENDING); - - return store; -} - -static void -item_activated (GtkIconView *icon_view, - GtkTreePath *tree_path, - gpointer user_data) -{ - GtkListStore *store; - gchar *path; - GtkTreeIter iter; - gboolean is_dir; - - store = GTK_LIST_STORE (user_data); - - gtk_tree_model_get_iter (GTK_TREE_MODEL (store), - &iter, tree_path); - gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, - COL_PATH, &path, - COL_IS_DIRECTORY, &is_dir, - -1); - - if (!is_dir) - { - g_free (path); - return; - } - - /* Replace parent with path and re-fill the model*/ - g_free (parent); - parent = path; - - fill_store (store); - - /* Sensitize the up button */ - gtk_widget_set_sensitive (GTK_WIDGET (up_button), TRUE); -} - -static void -up_clicked (GtkToolItem *item, - gpointer user_data) -{ - GtkListStore *store; - gchar *dir_name; - - store = GTK_LIST_STORE (user_data); - - dir_name = g_path_get_dirname (parent); - g_free (parent); - - parent = dir_name; - - fill_store (store); - - /* Maybe de-sensitize the up button */ - gtk_widget_set_sensitive (GTK_WIDGET (up_button), - strcmp (parent, "/") != 0); -} - -static void -home_clicked (GtkToolItem *item, - gpointer user_data) -{ - GtkListStore *store; - - store = GTK_LIST_STORE (user_data); - - g_free (parent); - parent = g_strdup (g_get_home_dir ()); - - fill_store (store); - - /* Sensitize the up button */ - gtk_widget_set_sensitive (GTK_WIDGET (up_button), - TRUE); -} - -static void close_window(void) -{ - gtk_widget_destroy (window); - window = NULL; - - g_object_unref (file_pixbuf); - file_pixbuf = NULL; - - g_object_unref (folder_pixbuf); - folder_pixbuf = NULL; -} - -GtkWidget * -do_iconview (GtkWidget *do_widget) -{ - if (!window) - { - GError *error; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size (GTK_WINDOW (window), 650, 400); - - gtk_window_set_screen (GTK_WINDOW (window), - gtk_widget_get_screen (do_widget)); - gtk_window_set_title (GTK_WINDOW (window), "GtkIconView demo"); - - g_signal_connect (window, "destroy", - G_CALLBACK (close_window), NULL); - - error = NULL; - if (!load_pixbufs (&error)) - { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (GTK_WINDOW (window), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "Failed to load an image: %s", - error->message); - - g_error_free (error); - - g_signal_connect (dialog, "response", - G_CALLBACK (gtk_widget_destroy), NULL); - - gtk_widget_show (dialog); - } - else - { - GtkWidget *sw; - GtkWidget *icon_view; - GtkListStore *store; - GtkWidget *vbox; - GtkWidget *tool_bar; - GtkToolItem *home_button; - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_container_add (GTK_CONTAINER (window), vbox); - - tool_bar = gtk_toolbar_new (); - gtk_box_pack_start (GTK_BOX (vbox), tool_bar, FALSE, FALSE, 0); - - up_button = gtk_tool_button_new_from_stock (GTK_STOCK_GO_UP); - gtk_tool_item_set_is_important (up_button, TRUE); - gtk_widget_set_sensitive (GTK_WIDGET (up_button), FALSE); - gtk_toolbar_insert (GTK_TOOLBAR (tool_bar), up_button, -1); - - home_button = gtk_tool_button_new_from_stock (GTK_STOCK_HOME); - gtk_tool_item_set_is_important (home_button, TRUE); - gtk_toolbar_insert (GTK_TOOLBAR (tool_bar), home_button, -1); - - - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), - GTK_SHADOW_ETCHED_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0); - - /* Create the store and fill it with the contents of '/' */ - parent = g_strdup ("/"); - store = create_store (); - fill_store (store); - - icon_view = gtk_icon_view_new_with_model (GTK_TREE_MODEL (store)); - gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (icon_view), - GTK_SELECTION_MULTIPLE); - g_object_unref (store); - - /* Connect to the "clicked" signal of the "Up" tool button */ - g_signal_connect (up_button, "clicked", - G_CALLBACK (up_clicked), store); - - /* Connect to the "clicked" signal of the "Home" tool button */ - g_signal_connect (home_button, "clicked", - G_CALLBACK (home_clicked), store); - - /* We now set which model columns that correspond to the text - * and pixbuf of each item - */ - gtk_icon_view_set_text_column (GTK_ICON_VIEW (icon_view), COL_DISPLAY_NAME); - gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (icon_view), COL_PIXBUF); - - /* Connect to the "item-activated" signal */ - g_signal_connect (icon_view, "item-activated", - G_CALLBACK (item_activated), store); - gtk_container_add (GTK_CONTAINER (sw), icon_view); - - gtk_widget_grab_focus (icon_view); - } - } - - if (!gtk_widget_get_visible (window)) - gtk_widget_show_all (window); - else - { - gtk_widget_destroy (window); - window = NULL; - } - - return window; -} |