summaryrefslogtreecommitdiff
path: root/demos/gtk-demo/sidebar.c
diff options
context:
space:
mode:
authorIkey Doherty <michael.i.doherty@intel.com>2014-08-23 17:38:42 +0100
committerMatthias Clasen <mclasen@redhat.com>2014-10-01 00:44:46 -0400
commitcdd2651db054ecd6cd92c9d1ad728fff7cd7ff33 (patch)
treece1487a7ac87c399581be1b30d4fe80759a92f22 /demos/gtk-demo/sidebar.c
parent3b08ba24b31702bd85901c8141d43d90fc6a2df4 (diff)
downloadgtk+-cdd2651db054ecd6cd92c9d1ad728fff7cd7ff33.tar.gz
Add GtkSidebar
GtkSidebar behaves internally much like GtkStackSwitcher, providing a vertical sidebar like widget. It is virtually identical in appearance to the widget currently used in GNOME Tweak Tool. This widget is connected to a GtkStack, and builds its own contents as a GtkListBox subclass, using the "title" child property to provide a consistent navigatable widget. Being a subclass of GtkListBox it benefits immediately from strong keyboard navigation, and minimal changes are required for theming. https://bugzilla.gnome.org/show_bug.cgi?id=735293 Signed-off-by: Ikey Doherty <michael.i.doherty@intel.com>
Diffstat (limited to 'demos/gtk-demo/sidebar.c')
-rw-r--r--demos/gtk-demo/sidebar.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/demos/gtk-demo/sidebar.c b/demos/gtk-demo/sidebar.c
new file mode 100644
index 0000000000..2d373f4a89
--- /dev/null
+++ b/demos/gtk-demo/sidebar.c
@@ -0,0 +1,77 @@
+/* Sidebar
+ *
+ * GtkSidebar provides an automatic sidebar widget to control navigation
+ * of a GtkStack object. This widget automatically updates it content
+ * based on what is presently available in the GtkStack object, and
+ * using the "title" child property to set the display labels.
+ */
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+static GtkWidget *window = NULL;
+
+GtkWidget *
+do_sidebar (GtkWidget *do_widget)
+{
+ GtkWidget *sidebar;
+ GtkWidget *stack;
+ GtkWidget *box;
+ GtkWidget *widget;
+ GtkWidget *header;
+ const gchar* pages[] = { "Welcome to GTK+", "GtkSidebar Widget", "Automatic navigation", "Consistent appearance", NULL };
+ const gchar *c = NULL;
+ guint i;
+
+ if (!window)
+ {
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
+ gtk_widget_set_size_request (window, 500, 350);
+
+ header = gtk_header_bar_new ();
+ gtk_header_bar_set_show_close_button (GTK_HEADER_BAR(header), TRUE);
+ gtk_window_set_titlebar (GTK_WINDOW(window), header);
+ gtk_window_set_title (GTK_WINDOW(window), "Sidebar demo");
+
+ g_signal_connect (window, "destroy",
+ G_CALLBACK (gtk_widget_destroyed), &window);
+
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ sidebar = gtk_sidebar_new ();
+ gtk_box_pack_start (GTK_BOX (box), sidebar, FALSE, FALSE, 0);
+
+ stack = gtk_stack_new ();
+ gtk_stack_set_transition_type (GTK_STACK (stack), GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN);
+ gtk_sidebar_set_stack (GTK_SIDEBAR (sidebar), GTK_STACK (stack));
+
+ /* Separator between sidebar and stack */
+ widget = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
+ gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 0);
+
+ gtk_box_pack_start (GTK_BOX (box), stack, TRUE, TRUE, 0);
+
+ for (i=0; (c = *(pages+i)) != NULL; i++ )
+ {
+ if (i == 0)
+ {
+ widget = gtk_image_new_from_icon_name ("help-about", GTK_ICON_SIZE_INVALID);
+ gtk_image_set_pixel_size (GTK_IMAGE (widget), 256);
+ } else
+ {
+ widget = gtk_label_new (c);
+ }
+ gtk_stack_add_named (GTK_STACK (stack), widget, c);
+ gtk_container_child_set (GTK_CONTAINER (stack), widget, "title", c, NULL);
+ }
+
+ gtk_container_add (GTK_CONTAINER (window), box);
+ }
+
+ if (!gtk_widget_get_visible (window))
+ gtk_widget_show_all (window);
+ else
+ gtk_widget_destroy (window);
+
+ return window;
+}