diff options
author | Benjamin Otte <otte@redhat.com> | 2019-10-18 20:47:48 +0200 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-05-30 19:26:46 -0400 |
commit | 6b98948f9a5d1f21d2a61ca1b6fdfbea65f721e8 (patch) | |
tree | 2c91a4065019994a38aa278bfbf48555c90a1908 /demos/gtk-demo | |
parent | f57afe51af0d91c1a8358126a0813fb99091ccab (diff) | |
download | gtk+-6b98948f9a5d1f21d2a61ca1b6fdfbea65f721e8.tar.gz |
demo: Add a file browser demo
Diffstat (limited to 'demos/gtk-demo')
-rw-r--r-- | demos/gtk-demo/demo.gresource.xml | 4 | ||||
-rw-r--r-- | demos/gtk-demo/listview_filebrowser.c | 254 | ||||
-rw-r--r-- | demos/gtk-demo/listview_filebrowser.ui | 240 | ||||
-rw-r--r-- | demos/gtk-demo/meson.build | 1 |
4 files changed, 499 insertions, 0 deletions
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml index 585bc28e70..ede5926fb3 100644 --- a/demos/gtk-demo/demo.gresource.xml +++ b/demos/gtk-demo/demo.gresource.xml @@ -125,6 +125,9 @@ <file>gnome-fs-directory.png</file> <file>gnome-fs-regular.png</file> </gresource> + <gresource prefix="/listview_filebrowser"> + <file>listview_filebrowser.ui</file> + </gresource> <gresource prefix="/listview_settings"> <file>listview_settings.ui</file> </gresource> @@ -208,6 +211,7 @@ <file>infobar.c</file> <file>links.c</file> <file>listbox.c</file> + <file>listview_filebrowser.c</file> <file>listview_settings.c</file> <file>listview_weather.c</file> <file>list_store.c</file> diff --git a/demos/gtk-demo/listview_filebrowser.c b/demos/gtk-demo/listview_filebrowser.c new file mode 100644 index 0000000000..0bc34e4b8e --- /dev/null +++ b/demos/gtk-demo/listview_filebrowser.c @@ -0,0 +1,254 @@ +/* Lists/File browser + * + * This demo shows off the different layouts that are quickly achievable + * with GtkGridView by implementing a file browser with different views. + */ + +#include <glib/gi18n.h> +#include <gtk/gtk.h> + +static GtkWidget *window = NULL; + +/* Create a simple object that holds the data for the different views */ +typedef struct _FileBrowserView FileBrowserView; +struct _FileBrowserView +{ + GObject parent_instance; + + GtkListItemFactory *factory; + char *icon_name; + GtkOrientation orientation; +}; + +enum { + PROP_0, + PROP_FACTORY, + PROP_ICON_NAME, + PROP_ORIENTATION, + + N_PROPS +}; + +#define FILE_BROWSER_TYPE_VIEW (file_browser_view_get_type ()) +G_DECLARE_FINAL_TYPE (FileBrowserView, file_browser_view, FILE_BROWSER, VIEW, GObject); + +G_DEFINE_TYPE (FileBrowserView, file_browser_view, G_TYPE_OBJECT); +static GParamSpec *properties[N_PROPS] = { NULL, }; + +static void +file_browser_view_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + FileBrowserView *self = FILE_BROWSER_VIEW (object); + + switch (property_id) + { + case PROP_FACTORY: + g_value_set_object (value, self->factory); + break; + + case PROP_ICON_NAME: + g_value_set_string (value, self->icon_name); + break; + + case PROP_ORIENTATION: + g_value_set_enum (value, self->orientation); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +file_browser_view_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + FileBrowserView *self = FILE_BROWSER_VIEW (object); + + switch (prop_id) + { + case PROP_FACTORY: + g_set_object (&self->factory, g_value_get_object (value)); + break; + + case PROP_ICON_NAME: + g_free (self->icon_name); + self->icon_name = g_value_dup_string (value); + break; + + case PROP_ORIENTATION: + self->orientation = g_value_get_enum (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +file_browser_view_finalize (GObject *object) +{ + FileBrowserView *self = FILE_BROWSER_VIEW (object); + + g_object_unref (self->factory); + g_free (self->icon_name); + + G_OBJECT_CLASS (file_browser_view_parent_class)->dispose (object); +} + +static void +file_browser_view_class_init (FileBrowserViewClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = file_browser_view_get_property; + gobject_class->set_property = file_browser_view_set_property; + gobject_class->finalize = file_browser_view_finalize; + + properties[PROP_FACTORY] = + g_param_spec_object ("factory", + "factory", + "factory to use in the main view", + GTK_TYPE_LIST_ITEM_FACTORY, + G_PARAM_READWRITE); + properties[PROP_ICON_NAME] = + g_param_spec_string ("icon-name", + "icon name", + "icon to display for selecting this view", + NULL, + G_PARAM_READWRITE); + properties[PROP_ORIENTATION] = + g_param_spec_enum ("orientation", + "orientation", + "orientation of the view", + GTK_TYPE_ORIENTATION, + GTK_ORIENTATION_VERTICAL, + G_PARAM_READWRITE); + + g_object_class_install_properties (gobject_class, N_PROPS, properties); +} + +static void file_browser_view_init (FileBrowserView *self) +{ +} + +char * +filebrowser_get_display_name (GObject *object, + GFileInfo *info) +{ + if (!info) + return NULL; + + return g_strdup (g_file_info_get_attribute_string (info, "standard::display-name")); +} + +char * +filebrowser_get_content_type (GObject *object, + GFileInfo *info) +{ + if (!info) + return NULL; + + return g_strdup (g_file_info_get_attribute_string (info, "standard::content-type")); +} + +char * +filebrowser_get_size (GObject *object, + GFileInfo *info) +{ + if (!info) + return NULL; + + return g_format_size (g_file_info_get_attribute_uint64 (info, "standard::size")); +} + +GIcon * +filebrowser_get_icon (GObject *object, + GFileInfo *info) +{ + GIcon *icon; + + if (info) + icon = G_ICON (g_file_info_get_attribute_object (info, "standard::icon")); + else + icon = NULL; + + if (icon) + g_object_ref (icon); + + return icon; +} + +void +filebrowser_up_clicked_cb (GtkButton *button, + GtkDirectoryList *list) +{ + GFile *file; + + file = g_file_get_parent (gtk_directory_list_get_file (list)); + if (file == NULL) + return; + + gtk_directory_list_set_file (list, file); +} + +void +filebrowser_view_activated_cb (GtkGridView *view, + guint pos, + GtkDirectoryList *list) +{ + GFileInfo *info; + + info = g_list_model_get_item (gtk_grid_view_get_model (view), pos); + if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) + gtk_directory_list_set_file (list, G_FILE (g_file_info_get_attribute_object (info, "standard::file"))); + + g_object_unref (info); +} + +GtkWidget * +do_listview_filebrowser (GtkWidget *do_widget) +{ + if (!window) + { + GtkWidget *view; + GtkBuilder *builder; + GtkDirectoryList *dirlist; + GFile *file; + char *cwd; + + builder = gtk_builder_new_from_resource ("/listview_filebrowser/listview_filebrowser.ui"); + window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); + gtk_window_set_display (GTK_WINDOW (window), + gtk_widget_get_display (do_widget)); + g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window); + + /* Create the model and fill it with the contents of the current directory */ + cwd = g_get_current_dir (); + file = g_file_new_for_path (cwd); + g_free (cwd); + dirlist = GTK_DIRECTORY_LIST (gtk_builder_get_object (builder, "dirlist")); + gtk_directory_list_set_file (dirlist, file); + g_object_unref (file); + + /* grab focus in the view */ + view = GTK_WIDGET (gtk_builder_get_object (builder, "view")); + gtk_widget_grab_focus (view); + + g_object_unref (builder); + } + + if (!gtk_widget_get_visible (window)) + gtk_widget_show (window); + else + gtk_window_destroy (GTK_WINDOW (window)); + + return window; +} diff --git a/demos/gtk-demo/listview_filebrowser.ui b/demos/gtk-demo/listview_filebrowser.ui new file mode 100644 index 0000000000..126c1baa02 --- /dev/null +++ b/demos/gtk-demo/listview_filebrowser.ui @@ -0,0 +1,240 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <object class="GListStore" id="viewlist"> + <property name="item-type">FileBrowserView</property> + <child> + <object class="FileBrowserView"> + <property name="factory"> + <object class="GtkBuilderListItemFactory"> + <property name="bytes"><![CDATA[ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <template class="GtkListItem"> + <property name="child"> + <object class="GtkBox"> + <child> + <object class="GtkImage"> + <binding name="gicon"> + <closure type="GIcon" function="filebrowser_get_icon"> + <lookup name="item">GtkListItem</lookup> + </closure> + </binding> + </object> + </child> + <child> + <object class="GtkLabel"> + <property name="halign">start</property> + <binding name="label"> + <closure type="gchararray" function="filebrowser_get_display_name"> + <lookup name="item">GtkListItem</lookup> + </closure> + </binding> + </object> + </child> + </object> + </property> + </template> +</interface> + ]]></property> + </object> + </property> + <property name="icon-name">view-list-symbolic</property> + <property name="orientation">horizontal</property> + </object> + </child> + <child> + <object class="FileBrowserView"> + <property name="icon-name">view-grid-symbolic</property> + <property name="factory"> + <object class="GtkBuilderListItemFactory"> + <property name="bytes"><![CDATA[ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <template class="GtkListItem"> + <property name="child"> + <object class="GtkBox"> + <property name="orientation">vertical</property> + <child> + <object class="GtkImage"> + <property name="icon-size">large</property> + <binding name="gicon"> + <closure type="GIcon" function="filebrowser_get_icon"> + <lookup name="item">GtkListItem</lookup> + </closure> + </binding> + </object> + </child> + <child> + <object class="GtkLabel"> + <property name="wrap">1</property> + <property name="wrap-mode">word-char</property> + <property name="lines">2</property> + <property name="ellipsize">end</property> + <property name="width-chars">10</property> + <property name="max-width-chars">30</property> + <binding name="label"> + <closure type="gchararray" function="filebrowser_get_display_name"> + <lookup name="item">GtkListItem</lookup> + </closure> + </binding> + </object> + </child> + </object> + </property> + </template> +</interface> + ]]></property> + </object> + </property> + <property name="orientation">vertical</property> + </object> + </child> + <child> + <object class="FileBrowserView"> + <property name="icon-name">view-paged-symbolic</property> + <property name="factory"> + <object class="GtkBuilderListItemFactory"> + <property name="bytes"><![CDATA[ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <template class="GtkListItem"> + <property name="child"> + <object class="GtkBox"> + <child> + <object class="GtkImage"> + <property name="icon-size">large</property> + <binding name="gicon"> + <closure type="GIcon" function="filebrowser_get_icon"> + <lookup name="item">GtkListItem</lookup> + </closure> + </binding> + </object> + </child> + <child> + <object class="GtkBox"> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel"> + <property name="halign">start</property> + <binding name="label"> + <closure type="gchararray" function="filebrowser_get_display_name"> + <lookup name="item">GtkListItem</lookup> + </closure> + </binding> + </object> + </child> + <child> + <object class="GtkLabel"> + <property name="halign">start</property> + <binding name="label"> + <closure type="gchararray" function="filebrowser_get_size"> + <lookup name="item">GtkListItem</lookup> + </closure> + </binding> + <style> + <class name="dim-label"/> + </style> + </object> + </child> + <child> + <object class="GtkLabel"> + <property name="halign">start</property> + <binding name="label"> + <closure type="gchararray" function="filebrowser_get_content_type"> + <lookup name="item">GtkListItem</lookup> + </closure> + </binding> + <style> + <class name="dim-label"/> + </style> + </object> + </child> + </object> + </child> + </object> + </property> + </template> +</interface> + ]]></property> + </object> + </property> + <property name="orientation">horizontal</property> + </object> + </child> + </object> + <object class="GtkDirectoryList" id="dirlist"> + <property name="attributes">standard::name,standard::display-name,standard::icon,standard::size,standard::content-type</property> + </object> + <object class="GtkWindow" id="window"> + <property name="title" translatable="yes">File browser</property> + <property name="default-width">600</property> + <property name="default-height">400</property> + <child type="titlebar"> + <object class="GtkHeaderBar" id=""> + <property name="show-title-buttons">1</property> + <child> + <object class="GtkButton"> + <property name="icon-name">go-up</property> + <signal name="clicked" handler="filebrowser_up_clicked_cb" object="dirlist" swapped="no"/> + </object> + </child> + <child type="end"> + <object class="GtkListView"> + <property name="valign">center</property> + <property name="orientation">horizontal</property> + <style> + <class name="linked"/> + </style> + <property name="model"> + <object class="GtkSingleSelection" id="selected-view"> + <property name="model">viewlist</property> + </object> + </property> + <property name="factory"> + <object class="GtkBuilderListItemFactory"> + <property name="bytes"><![CDATA[ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <template class="GtkListItem"> + <property name="child"> + <object class="GtkImage"> + <binding name="icon-name"> + <lookup type="FileBrowserView" name="icon-name"> + <lookup name="item">GtkListItem</lookup> + </lookup> + </binding> + </object> + </property> + </template> +</interface> + ]]></property> + </object> + </property> + </object> + </child> + </object> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="can-focus">1</property> + <child> + <object class="GtkGridView" id="view"> + <property name="model">dirlist</property> + <property name="max-columns">15</property> + <binding name="factory"> + <lookup name="factory" type="FileBrowserView"> + <lookup name="selected-item">selected-view</lookup> + </lookup> + </binding> + <binding name="orientation"> + <lookup name="orientation" type="FileBrowserView"> + <lookup name="selected-item">selected-view</lookup> + </lookup> + </binding> + <signal name="activate" handler="filebrowser_view_activated_cb" object="dirlist" swapped="no"/> + </object> + </child> + </object> + </child> + </object> +</interface> diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build index 984b4b0429..e4aac15e41 100644 --- a/demos/gtk-demo/meson.build +++ b/demos/gtk-demo/meson.build @@ -42,6 +42,7 @@ demos = files([ 'listbox.c', 'flowbox.c', 'list_store.c', + 'listview_filebrowser.c', 'listview_settings.c', 'listview_weather.c', 'markup.c', |