diff --git a/docs/reference/gtk/images/box.png b/docs/reference/gtk/images/box.png new file mode 100644 index 0000000000..77a04a5948 Binary files /dev/null and b/docs/reference/gtk/images/box.png differ diff --git a/docs/reference/gtk/images/centerbox.png b/docs/reference/gtk/images/centerbox.png new file mode 100644 index 0000000000..0ad57fc938 Binary files /dev/null and b/docs/reference/gtk/images/centerbox.png differ diff --git a/docs/reference/gtk/images/grid.png b/docs/reference/gtk/images/grid.png new file mode 100644 index 0000000000..8f83c4c118 Binary files /dev/null and b/docs/reference/gtk/images/grid.png differ diff --git a/docs/reference/gtk/images/overlay.png b/docs/reference/gtk/images/overlay.png new file mode 100644 index 0000000000..e61605a95c Binary files /dev/null and b/docs/reference/gtk/images/overlay.png differ diff --git a/docs/reference/gtk/meson.build b/docs/reference/gtk/meson.build index 30d7737339..75f4b8fb67 100644 --- a/docs/reference/gtk/meson.build +++ b/docs/reference/gtk/meson.build @@ -240,12 +240,14 @@ images = [ 'images/border1.png', 'images/border2.png', 'images/border3.png', + 'images/box.png', 'images/box-expand.png', 'images/box-packing.png', 'images/builder-shortcuts.png', 'images/button.png', 'images/calendar.png', 'images/capture-bubble.png', + 'images/centerbox.png', 'images/check-button.png', 'images/checks.png', 'images/clocks-shortcuts.png', @@ -297,6 +299,7 @@ images = [ 'images/gradient2.png', 'images/gradient3.png', 'images/gradient4.png', + 'images/grid.png', 'images/grid-packing.png', 'images/handles.png', 'images/headerbar.png', @@ -335,6 +338,7 @@ images = [ 'images/multiline-text.png', 'images/notebook.png', 'images/options.png', + 'images/overlay.png', 'images/pagesetupdialog.png', 'images/panes.png', 'images/password-entry.png', diff --git a/docs/reference/gtk/visual_index.xml b/docs/reference/gtk/visual_index.xml index 664d3922fe..46efd6a343 100644 --- a/docs/reference/gtk/visual_index.xml +++ b/docs/reference/gtk/visual_index.xml @@ -64,6 +64,11 @@
Containers + + + + + @@ -77,6 +82,7 @@ + diff --git a/docs/tools/widgets.c b/docs/tools/widgets.c index 3cb08a3410..51889d8e96 100644 --- a/docs/tools/widgets.c +++ b/docs/tools/widgets.c @@ -681,6 +681,7 @@ create_editable_label (void) return new_widget_info ("editable-label", vbox, SMALL); } + static WidgetInfo * create_separator (void) { @@ -1924,10 +1925,208 @@ create_drawing_area (void) return info; } +static WidgetInfo * +create_box (void) +{ + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *widget; + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 40); + gtk_widget_set_margin_top (hbox, 20); + gtk_widget_set_margin_bottom (hbox, 20); + gtk_widget_set_halign (hbox, GTK_ALIGN_CENTER); + widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); + for (int i = 0; i < 2; i++) + { + GtkWidget *button = gtk_button_new (); + gtk_widget_add_css_class (button, "small"); + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + gtk_box_append (GTK_BOX (widget), button); + } + gtk_box_append (GTK_BOX (widget), gtk_label_new ("⋯")); + gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); + gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); + gtk_box_append (GTK_BOX (hbox), widget); + widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4); + for (int i = 0; i < 2; i++) + { + GtkWidget *button = gtk_button_new (); + gtk_widget_add_css_class (button, "small"); + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + gtk_box_append (GTK_BOX (widget), button); + } + gtk_box_append (GTK_BOX (widget), gtk_label_new ("⋮")); + gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); + gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); + gtk_box_append (GTK_BOX (hbox), widget); + gtk_box_append (GTK_BOX (vbox), hbox); + gtk_box_append (GTK_BOX (vbox), g_object_new (GTK_TYPE_LABEL, + "label", "Horizontal and Vertical Boxes", + "justify", GTK_JUSTIFY_CENTER, + NULL)); + add_margin (vbox); + + return new_widget_info ("box", vbox, MEDIUM); +} + +static WidgetInfo * +create_center_box (void) +{ + GtkWidget *vbox; + GtkWidget *widget; + GtkWidget *button; + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); + widget = gtk_center_box_new (); + gtk_widget_set_margin_top (widget, 10); + gtk_widget_set_margin_bottom (widget, 10); + gtk_widget_set_margin_start (widget, 20); + gtk_widget_set_margin_end (widget, 20); + gtk_widget_set_halign (widget, GTK_ALIGN_FILL); + gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); + + button = gtk_button_new (); + gtk_widget_add_css_class (button, "small"); + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + gtk_center_box_set_start_widget (GTK_CENTER_BOX (widget), button); + + button = gtk_button_new (); + gtk_widget_add_css_class (button, "small"); + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + gtk_center_box_set_center_widget (GTK_CENTER_BOX (widget), button); + + button = gtk_button_new (); + gtk_widget_add_css_class (button, "small"); + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + gtk_center_box_set_end_widget (GTK_CENTER_BOX (widget), button); + + gtk_box_append (GTK_BOX (vbox), widget); + gtk_box_append (GTK_BOX (vbox), g_object_new (GTK_TYPE_LABEL, + "label", "Center Box", + "justify", GTK_JUSTIFY_CENTER, + NULL)); + add_margin (vbox); + + return new_widget_info ("centerbox", vbox, SMALL); +} + +static WidgetInfo * +create_grid (void) +{ + GtkWidget *vbox; + GtkWidget *widget; + GtkWidget *button; + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); + widget = gtk_grid_new (); + gtk_grid_set_row_spacing (GTK_GRID (widget), 4); + gtk_grid_set_column_spacing (GTK_GRID (widget), 4); + gtk_widget_set_margin_top (widget, 20); + gtk_widget_set_margin_bottom (widget, 20); + gtk_widget_set_margin_start (widget, 20); + gtk_widget_set_margin_end (widget, 20); + gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); + gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); + + button = gtk_button_new (); + gtk_widget_add_css_class (button, "small"); + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + gtk_grid_attach (GTK_GRID (widget), button, 0, 0, 1, 1); + + button = gtk_button_new (); + gtk_widget_add_css_class (button, "small"); + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + gtk_grid_attach (GTK_GRID (widget), button, 0, 1, 1, 1); + + button = gtk_button_new (); + gtk_widget_add_css_class (button, "small"); + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + gtk_grid_attach (GTK_GRID (widget), button, 1, 0, 1, 1); + + button = gtk_button_new (); + gtk_widget_add_css_class (button, "small"); + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + gtk_grid_attach (GTK_GRID (widget), button, 1, 1, 1, 1); + + gtk_grid_attach (GTK_GRID (widget), gtk_label_new ("⋯"), 2, 0, 1, 1); + gtk_grid_attach (GTK_GRID (widget), gtk_label_new ("⋮"), 0, 2, 1, 1); + + gtk_box_append (GTK_BOX (vbox), widget); + gtk_box_append (GTK_BOX (vbox), g_object_new (GTK_TYPE_LABEL, + "label", "Grid", + "justify", GTK_JUSTIFY_CENTER, + NULL)); + add_margin (vbox); + + return new_widget_info ("grid", vbox, MEDIUM); +} + +static WidgetInfo * +create_overlay (void) +{ + GtkWidget *vbox; + WidgetInfo *info; + GtkWidget *widget; + GtkWidget *overlay; + GtkWidget *label; + GtkWidget *child; + + widget = gtk_frame_new (NULL); + overlay = gtk_overlay_new (); + gtk_widget_add_css_class (widget, "view"); + label = gtk_label_new ("Content"); + gtk_widget_set_vexpand (label, TRUE); + gtk_frame_set_child (GTK_FRAME (widget), overlay); + gtk_overlay_set_child (GTK_OVERLAY (overlay), label); + + child = gtk_frame_new (NULL); + gtk_widget_add_css_class (child, "app-notification"); + gtk_frame_set_child (GTK_FRAME (child), gtk_label_new ("Overlay")); + gtk_widget_set_valign (child, GTK_ALIGN_START); + gtk_widget_set_halign (child, GTK_ALIGN_CENTER); + gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_widget_set_halign (widget, GTK_ALIGN_FILL); + gtk_widget_set_valign (widget, GTK_ALIGN_FILL); + + gtk_box_append (GTK_BOX (vbox), widget); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Overlay")); + + add_margin (vbox); + + info = new_widget_info ("overlay", vbox, MEDIUM); + + return info; +} + GList * get_all_widgets (void) { GList *retval = NULL; + GtkCssProvider *provider; + + provider = gtk_css_provider_new (); + gtk_css_provider_load_from_data (provider, + "button.small {\n" + " min-width: 16px;\n" + " min-height: 16px;\n" + " padding: 0;\n" + "}", -1); + gtk_style_context_add_provider_for_display (gdk_display_get_default (), + GTK_STYLE_PROVIDER (provider), + 800); retval = g_list_prepend (retval, create_search_bar ()); retval = g_list_prepend (retval, create_action_bar ()); @@ -1997,7 +2196,11 @@ get_all_widgets (void) retval = g_list_prepend (retval, create_popover ()); retval = g_list_prepend (retval, create_menu ()); retval = g_list_prepend (retval, create_shortcuts_window ()); - retval = g_list_prepend (retval, create_drawing_area()); + retval = g_list_prepend (retval, create_drawing_area ()); + retval = g_list_prepend (retval, create_box ()); + retval = g_list_prepend (retval, create_center_box ()); + retval = g_list_prepend (retval, create_grid ()); + retval = g_list_prepend (retval, create_overlay ()); return retval; } diff --git a/gtk/gtkmodelbutton.c b/gtk/gtkmodelbutton.c index 31d0bf10c5..4e4815fdc6 100644 --- a/gtk/gtkmodelbutton.c +++ b/gtk/gtkmodelbutton.c @@ -681,6 +681,11 @@ gtk_model_button_set_text (GtkModelButton *button, gtk_label_set_text_with_mnemonic (GTK_LABEL (button->label), text ? text : ""); update_visibility (button); + + gtk_accessible_update_relation (GTK_ACCESSIBLE (button), + GTK_ACCESSIBLE_RELATION_LABELLED_BY, g_list_append (NULL, button->label), + -1); + g_object_notify_by_pspec (G_OBJECT (button), properties[PROP_TEXT]); }