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>
This commit is contained in:
		 Ikey Doherty
					Ikey Doherty
				
			
				
					committed by
					
						 Matthias Clasen
						Matthias Clasen
					
				
			
			
				
	
			
			
			 Matthias Clasen
						Matthias Clasen
					
				
			
						parent
						
							3b08ba24b3
						
					
				
				
					commit
					cdd2651db0
				
			| @ -48,6 +48,7 @@ demos =						\ | ||||
| 	rotated_text.c				\ | ||||
| 	search_entry.c				\ | ||||
| 	search_entry2.c				\ | ||||
| 	sidebar.c				\ | ||||
| 	sizegroup.c				\ | ||||
| 	spinner.c				\ | ||||
| 	stack.c					\ | ||||
|  | ||||
| @ -118,6 +118,7 @@ | ||||
|     <file>search_entry.c</file> | ||||
|     <file>search_entry2.c</file> | ||||
|     <file>sizegroup.c</file> | ||||
|     <file>sidebar.c</file> | ||||
|     <file>stack.c</file> | ||||
|     <file>spinner.c</file> | ||||
|     <file>textview.c</file> | ||||
|  | ||||
							
								
								
									
										77
									
								
								demos/gtk-demo/sidebar.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								demos/gtk-demo/sidebar.c
									
									
									
									
									
										Normal file
									
								
							| @ -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; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user