| /* |
| * Copyright (C) 2010 Openismus GmbH |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Library General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Library General Public License for more details. |
| * |
| * You should have received a copy of the GNU Library General Public |
| * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| #include <gtk/gtk.h> |
| |
| G_GNUC_BEGIN_IGNORE_DEPRECATIONS |
| |
| enum { |
| SIMPLE_ITEMS = 0, |
| FOCUS_ITEMS, |
| WRAPPY_ITEMS, |
| IMAGE_ITEMS, |
| BUTTON_ITEMS |
| }; |
| |
| #define INITIAL_HALIGN GTK_ALIGN_FILL |
| #define INITIAL_VALIGN GTK_ALIGN_START |
| #define INITIAL_MINIMUM_LENGTH 3 |
| #define INITIAL_MAXIMUM_LENGTH 6 |
| #define INITIAL_CSPACING 2 |
| #define INITIAL_RSPACING 2 |
| #define N_ITEMS 1000 |
| |
| static GtkFlowBox *the_flowbox = NULL; |
| static int items_type = SIMPLE_ITEMS; |
| |
| static void |
| populate_flowbox_simple (GtkFlowBox *flowbox) |
| { |
| GtkWidget *widget, *frame; |
| int i; |
| |
| for (i = 0; i < N_ITEMS; i++) |
| { |
| char *text = g_strdup_printf ("Item %02d", i); |
| |
| widget = gtk_label_new (text); |
| frame = gtk_frame_new (NULL); |
| |
| gtk_frame_set_child (GTK_FRAME (frame), widget); |
| |
| g_object_set_data_full (G_OBJECT (frame), "id", (gpointer)g_strdup (text), g_free); |
| gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), frame, -1); |
| |
| g_free (text); |
| } |
| } |
| |
| static void |
| populate_flowbox_focus (GtkFlowBox *flowbox) |
| { |
| GtkWidget *widget, *frame, *box; |
| int i; |
| gboolean sensitive; |
| |
| for (i = 0; i < 200; i++) |
| { |
| sensitive = TRUE; |
| frame = gtk_frame_new (NULL); |
| |
| box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); |
| gtk_frame_set_child (GTK_FRAME (frame), box); |
| |
| widget = gtk_label_new ("Label"); |
| gtk_box_append (GTK_BOX (box), widget); |
| |
| switch (i % 4) |
| { |
| case 0: |
| widget = gtk_entry_new (); |
| break; |
| case 1: |
| widget = gtk_button_new_with_label ("Button"); |
| break; |
| case 2: |
| widget = gtk_label_new ("bla"); |
| break; |
| case 3: |
| widget = gtk_label_new ("bla"); |
| sensitive = FALSE; |
| break; |
| default: |
| g_assert_not_reached (); |
| } |
| |
| gtk_box_append (GTK_BOX (box), widget); |
| |
| if (i % 5 == 0) |
| gtk_box_append (GTK_BOX (box), gtk_switch_new ()); |
| |
| gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), frame, -1); |
| if (!sensitive) |
| gtk_widget_set_sensitive (gtk_widget_get_parent (frame), FALSE); |
| } |
| } |
| |
| static void |
| populate_flowbox_buttons (GtkFlowBox *flowbox) |
| { |
| GtkWidget *widget; |
| int i; |
| |
| for (i = 0; i < 50; i++) |
| { |
| widget = gtk_button_new_with_label ("Button"); |
| gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), widget, -1); |
| widget = gtk_widget_get_parent (widget); |
| gtk_widget_set_can_focus (widget, FALSE); |
| } |
| } |
| |
| static void |
| populate_flowbox_wrappy (GtkFlowBox *flowbox) |
| { |
| GtkWidget *widget, *frame; |
| int i; |
| |
| const char *strings[] = { |
| "These are", "some wrappy label", "texts", "of various", "lengths.", |
| "They should always be", "shown", "consecutively. Except it's", |
| "hard to say", "where exactly the", "label", "will wrap", "and where exactly", |
| "the actual", "container", "will wrap.", "This label is really really really long !", |
| "Let's add some more", "labels to the", |
| "mix. Just to", "make sure we", "got something to work", "with here." |
| }; |
| |
| for (i = 0; i < G_N_ELEMENTS (strings); i++) |
| { |
| widget = gtk_label_new (strings[i]); |
| frame = gtk_frame_new (NULL); |
| |
| gtk_frame_set_child (GTK_FRAME (frame), widget); |
| |
| gtk_label_set_wrap (GTK_LABEL (widget), TRUE); |
| gtk_label_set_wrap_mode (GTK_LABEL (widget), PANGO_WRAP_WORD); |
| gtk_label_set_width_chars (GTK_LABEL (widget), 10); |
| g_object_set_data_full (G_OBJECT (frame), "id", (gpointer)g_strdup (strings[i]), g_free); |
| |
| gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), frame, -1); |
| } |
| } |
| |
| static void |
| populate_flowbox_images (GtkFlowBox *flowbox) |
| { |
| GtkWidget *widget, *image, *label; |
| int i; |
| |
| for (i = 0; i < N_ITEMS; i++) |
| { |
| char *text = g_strdup_printf ("Item %02d", i); |
| |
| widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); |
| gtk_widget_set_hexpand (widget, TRUE); |
| |
| image = gtk_image_new_from_icon_name ("face-wink"); |
| gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE); |
| gtk_widget_set_hexpand (image, TRUE); |
| gtk_image_set_pixel_size (GTK_IMAGE (image), 256); |
| |
| label = gtk_label_new (text); |
| |
| gtk_box_append (GTK_BOX (widget), image); |
| gtk_box_append (GTK_BOX (widget), label); |
| |
| g_object_set_data_full (G_OBJECT (widget), "id", (gpointer)g_strdup (text), g_free); |
| gtk_box_append (GTK_BOX (flowbox), widget); |
| |
| g_free (text); |
| } |
| } |
| |
| static void |
| populate_items (GtkFlowBox *flowbox) |
| { |
| GtkWidget *child; |
| |
| while ((child = gtk_widget_get_first_child (GTK_WIDGET (flowbox)))) |
| gtk_flow_box_remove (flowbox, child); |
| |
| if (items_type == SIMPLE_ITEMS) |
| populate_flowbox_simple (flowbox); |
| else if (items_type == FOCUS_ITEMS) |
| populate_flowbox_focus (flowbox); |
| else if (items_type == WRAPPY_ITEMS) |
| populate_flowbox_wrappy (flowbox); |
| else if (items_type == IMAGE_ITEMS) |
| populate_flowbox_images (flowbox); |
| else if (items_type == BUTTON_ITEMS) |
| populate_flowbox_buttons (flowbox); |
| } |
| |
| static void |
| horizontal_alignment_changed (GtkComboBox *box, |
| GtkFlowBox *flowbox) |
| { |
| GtkAlign alignment = gtk_combo_box_get_active (box); |
| |
| gtk_widget_set_halign (GTK_WIDGET (flowbox), alignment); |
| } |
| |
| static void |
| vertical_alignment_changed (GtkComboBox *box, |
| GtkFlowBox *flowbox) |
| { |
| GtkAlign alignment = gtk_combo_box_get_active (box); |
| |
| gtk_widget_set_valign (GTK_WIDGET (flowbox), alignment); |
| } |
| |
| static void |
| orientation_changed (GtkComboBox *box, |
| GtkFlowBox *flowbox) |
| { |
| GtkOrientation orientation = gtk_combo_box_get_active (box); |
| |
| gtk_orientable_set_orientation (GTK_ORIENTABLE (flowbox), orientation); |
| } |
| |
| static void |
| selection_mode_changed (GtkComboBox *box, |
| GtkFlowBox *flowbox) |
| { |
| GtkSelectionMode mode = gtk_combo_box_get_active (box); |
| |
| gtk_flow_box_set_selection_mode (flowbox, mode); |
| } |
| |
| static void |
| line_length_changed (GtkSpinButton *spin, |
| GtkFlowBox *flowbox) |
| { |
| int length = gtk_spin_button_get_value_as_int (spin); |
| |
| gtk_flow_box_set_min_children_per_line (flowbox, length); |
| } |
| |
| static void |
| max_line_length_changed (GtkSpinButton *spin, |
| GtkFlowBox *flowbox) |
| { |
| int length = gtk_spin_button_get_value_as_int (spin); |
| |
| gtk_flow_box_set_max_children_per_line (flowbox, length); |
| } |
| |
| static void |
| spacing_changed (GtkSpinButton *button, |
| gpointer data) |
| { |
| GtkOrientation orientation = GPOINTER_TO_INT (data); |
| int state = gtk_spin_button_get_value_as_int (button); |
| |
| if (orientation == GTK_ORIENTATION_HORIZONTAL) |
| gtk_flow_box_set_column_spacing (the_flowbox, state); |
| else |
| gtk_flow_box_set_row_spacing (the_flowbox, state); |
| } |
| |
| static void |
| items_changed (GtkComboBox *box, |
| GtkFlowBox *flowbox) |
| { |
| items_type = gtk_combo_box_get_active (box); |
| |
| populate_items (flowbox); |
| } |
| |
| static void |
| homogeneous_toggled (GtkCheckButton *button, |
| GtkFlowBox *flowbox) |
| { |
| gboolean state = gtk_check_button_get_active (button); |
| |
| gtk_flow_box_set_homogeneous (flowbox, state); |
| } |
| |
| static void |
| on_child_activated (GtkFlowBox *self, |
| GtkWidget *child) |
| { |
| const char *id; |
| id = g_object_get_data (G_OBJECT (gtk_flow_box_child_get_child (GTK_FLOW_BOX_CHILD (child))), "id"); |
| g_message ("Child activated %p: %s", child, id); |
| } |
| |
| static G_GNUC_UNUSED void |
| selection_foreach (GtkFlowBox *self, |
| GtkFlowBoxChild *child_info, |
| gpointer data) |
| { |
| const char *id; |
| GtkWidget *child; |
| |
| child = gtk_flow_box_child_get_child (child_info); |
| id = g_object_get_data (G_OBJECT (child), "id"); |
| g_message ("Child selected %p: %s", child, id); |
| } |
| |
| static void |
| on_selected_children_changed (GtkFlowBox *self) |
| { |
| g_message ("Selection changed"); |
| //gtk_flow_box_selected_foreach (self, selection_foreach, NULL); |
| } |
| |
| static gboolean |
| filter_func (GtkFlowBoxChild *child, gpointer user_data) |
| { |
| int index; |
| |
| index = gtk_flow_box_child_get_index (child); |
| |
| return (index % 3) == 0; |
| } |
| |
| static void |
| filter_toggled (GtkCheckButton *button, |
| GtkFlowBox *flowbox) |
| { |
| gboolean state = gtk_check_button_get_active (button); |
| |
| if (state) |
| gtk_flow_box_set_filter_func (flowbox, filter_func, NULL, NULL); |
| else |
| gtk_flow_box_set_filter_func (flowbox, NULL, NULL, NULL); |
| } |
| |
| static int |
| sort_func (GtkFlowBoxChild *a, |
| GtkFlowBoxChild *b, |
| gpointer data) |
| { |
| char *ida, *idb; |
| |
| ida = (char *)g_object_get_data (G_OBJECT (gtk_flow_box_child_get_child (a)), "id"); |
| idb = (char *)g_object_get_data (G_OBJECT (gtk_flow_box_child_get_child (b)), "id"); |
| return g_strcmp0 (ida, idb); |
| } |
| |
| static void |
| sort_toggled (GtkCheckButton *button, |
| GtkFlowBox *flowbox) |
| { |
| gboolean state = gtk_check_button_get_active (button); |
| |
| if (state) |
| gtk_flow_box_set_sort_func (flowbox, sort_func, NULL, NULL); |
| else |
| gtk_flow_box_set_sort_func (flowbox, NULL, NULL, NULL); |
| } |
| |
| static GtkWidget * |
| create_window (void) |
| { |
| GtkWidget *window, *hbox, *vbox, *flowbox_cntl, *items_cntl; |
| GtkWidget *flowbox, *widget, *expander, *swindow; |
| |
| window = gtk_window_new (); |
| hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); |
| vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); |
| |
| gtk_window_set_child (GTK_WINDOW (window), hbox); |
| gtk_box_append (GTK_BOX (hbox), vbox); |
| |
| swindow = gtk_scrolled_window_new (); |
| gtk_widget_set_hexpand (swindow, TRUE); |
| gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), |
| GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
| |
| gtk_box_append (GTK_BOX (hbox), swindow); |
| |
| flowbox = gtk_flow_box_new (); |
| gtk_widget_set_halign (flowbox, GTK_ALIGN_END); |
| the_flowbox = (GtkFlowBox *)flowbox; |
| gtk_widget_set_halign (flowbox, INITIAL_HALIGN); |
| gtk_widget_set_valign (flowbox, INITIAL_VALIGN); |
| gtk_flow_box_set_column_spacing (GTK_FLOW_BOX (flowbox), INITIAL_CSPACING); |
| gtk_flow_box_set_row_spacing (GTK_FLOW_BOX (flowbox), INITIAL_RSPACING); |
| gtk_flow_box_set_min_children_per_line (GTK_FLOW_BOX (flowbox), INITIAL_MINIMUM_LENGTH); |
| gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX (flowbox), INITIAL_MAXIMUM_LENGTH); |
| gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (swindow), flowbox); |
| |
| gtk_flow_box_set_hadjustment (GTK_FLOW_BOX (flowbox), |
| gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (swindow))); |
| gtk_flow_box_set_vadjustment (GTK_FLOW_BOX (flowbox), |
| gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (swindow))); |
| |
| g_signal_connect (flowbox, "child-activated", G_CALLBACK (on_child_activated), NULL); |
| g_signal_connect (flowbox, "selected-children-changed", G_CALLBACK (on_selected_children_changed), NULL); |
| |
| /* Add Flowbox test control frame */ |
| expander = gtk_expander_new ("Flow Box controls"); |
| gtk_expander_set_expanded (GTK_EXPANDER (expander), TRUE); |
| flowbox_cntl = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); |
| gtk_expander_set_child (GTK_EXPANDER (expander), flowbox_cntl); |
| gtk_box_append (GTK_BOX (vbox), expander); |
| |
| widget = gtk_check_button_new_with_label ("Homogeneous"); |
| gtk_check_button_set_active (GTK_CHECK_BUTTON (widget), FALSE); |
| |
| gtk_widget_set_tooltip_text (widget, "Set whether the items should be displayed at the same size"); |
| gtk_box_append (GTK_BOX (flowbox_cntl), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "toggled", |
| G_CALLBACK (homogeneous_toggled), flowbox); |
| |
| widget = gtk_check_button_new_with_label ("Activate on single click"); |
| gtk_check_button_set_active (GTK_CHECK_BUTTON (widget), FALSE); |
| g_object_bind_property (widget, "active", |
| flowbox, "activate-on-single-click", |
| G_BINDING_SYNC_CREATE); |
| gtk_box_append (GTK_BOX (flowbox_cntl), widget); |
| |
| /* Add alignment controls */ |
| widget = gtk_combo_box_text_new (); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Fill"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Start"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "End"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Center"); |
| gtk_combo_box_set_active (GTK_COMBO_BOX (widget), INITIAL_HALIGN); |
| |
| gtk_widget_set_tooltip_text (widget, "Set the horizontal alignment policy"); |
| gtk_box_append (GTK_BOX (flowbox_cntl), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "changed", |
| G_CALLBACK (horizontal_alignment_changed), flowbox); |
| |
| widget = gtk_combo_box_text_new (); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Fill"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Start"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "End"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Center"); |
| gtk_combo_box_set_active (GTK_COMBO_BOX (widget), INITIAL_VALIGN); |
| |
| gtk_widget_set_tooltip_text (widget, "Set the vertical alignment policy"); |
| gtk_box_append (GTK_BOX (flowbox_cntl), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "changed", |
| G_CALLBACK (vertical_alignment_changed), flowbox); |
| |
| /* Add Orientation control */ |
| widget = gtk_combo_box_text_new (); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Horizontal"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Vertical"); |
| gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0); |
| |
| gtk_widget_set_tooltip_text (widget, "Set the flowbox orientation"); |
| gtk_box_append (GTK_BOX (flowbox_cntl), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "changed", |
| G_CALLBACK (orientation_changed), flowbox); |
| |
| /* Add selection mode control */ |
| widget = gtk_combo_box_text_new (); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "None"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Single"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Browse"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Multiple"); |
| gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 1); |
| |
| gtk_widget_set_tooltip_text (widget, "Set the selection mode"); |
| gtk_box_append (GTK_BOX (flowbox_cntl), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "changed", |
| G_CALLBACK (selection_mode_changed), flowbox); |
| |
| /* Add minimum line length in items control */ |
| widget = gtk_spin_button_new_with_range (1, 10, 1); |
| gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), INITIAL_MINIMUM_LENGTH); |
| |
| gtk_widget_set_tooltip_text (widget, "Set the minimum amount of items per line before wrapping"); |
| gtk_box_append (GTK_BOX (flowbox_cntl), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "changed", |
| G_CALLBACK (line_length_changed), flowbox); |
| g_signal_connect (G_OBJECT (widget), "value-changed", |
| G_CALLBACK (line_length_changed), flowbox); |
| |
| /* Add natural line length in items control */ |
| widget = gtk_spin_button_new_with_range (1, 10, 1); |
| gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), INITIAL_MAXIMUM_LENGTH); |
| |
| gtk_widget_set_tooltip_text (widget, "Set the natural amount of items per line "); |
| gtk_box_append (GTK_BOX (flowbox_cntl), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "changed", |
| G_CALLBACK (max_line_length_changed), flowbox); |
| g_signal_connect (G_OBJECT (widget), "value-changed", |
| G_CALLBACK (max_line_length_changed), flowbox); |
| |
| /* Add horizontal/vertical spacing controls */ |
| hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); |
| |
| widget = gtk_label_new ("H Spacing"); |
| gtk_box_append (GTK_BOX (hbox), widget); |
| |
| widget = gtk_spin_button_new_with_range (0, 30, 1); |
| gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), INITIAL_CSPACING); |
| |
| gtk_widget_set_tooltip_text (widget, "Set the horizontal spacing between children"); |
| gtk_box_append (GTK_BOX (hbox), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "changed", |
| G_CALLBACK (spacing_changed), GINT_TO_POINTER (GTK_ORIENTATION_HORIZONTAL)); |
| g_signal_connect (G_OBJECT (widget), "value-changed", |
| G_CALLBACK (spacing_changed), GINT_TO_POINTER (GTK_ORIENTATION_HORIZONTAL)); |
| |
| gtk_box_append (GTK_BOX (flowbox_cntl), hbox); |
| |
| hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); |
| |
| widget = gtk_label_new ("V Spacing"); |
| gtk_box_append (GTK_BOX (hbox), widget); |
| |
| widget = gtk_spin_button_new_with_range (0, 30, 1); |
| gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), INITIAL_RSPACING); |
| |
| gtk_widget_set_tooltip_text (widget, "Set the vertical spacing between children"); |
| gtk_box_append (GTK_BOX (hbox), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "changed", |
| G_CALLBACK (spacing_changed), GINT_TO_POINTER (GTK_ORIENTATION_VERTICAL)); |
| g_signal_connect (G_OBJECT (widget), "value-changed", |
| G_CALLBACK (spacing_changed), GINT_TO_POINTER (GTK_ORIENTATION_VERTICAL)); |
| |
| gtk_box_append (GTK_BOX (flowbox_cntl), hbox); |
| |
| /* filtering and sorting */ |
| |
| widget = gtk_check_button_new_with_label ("Filter"); |
| gtk_check_button_set_active (GTK_CHECK_BUTTON (widget), FALSE); |
| |
| gtk_widget_set_tooltip_text (widget, "Set whether some items should be filtered out"); |
| gtk_box_append (GTK_BOX (flowbox_cntl), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "toggled", |
| G_CALLBACK (filter_toggled), flowbox); |
| |
| widget = gtk_check_button_new_with_label ("Sort"); |
| gtk_check_button_set_active (GTK_CHECK_BUTTON (widget), FALSE); |
| |
| gtk_widget_set_tooltip_text (widget, "Set whether items should be sorted"); |
| gtk_box_append (GTK_BOX (flowbox_cntl), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "toggled", |
| G_CALLBACK (sort_toggled), flowbox); |
| |
| |
| /* Add test items control frame */ |
| expander = gtk_expander_new ("Test item controls"); |
| gtk_expander_set_expanded (GTK_EXPANDER (expander), TRUE); |
| items_cntl = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); |
| gtk_expander_set_child (GTK_EXPANDER (expander), items_cntl); |
| gtk_box_append (GTK_BOX (vbox), expander); |
| |
| /* Add Items control */ |
| widget = gtk_combo_box_text_new (); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Simple"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Focus"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Wrappy"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Images"); |
| gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Buttons"); |
| gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0); |
| |
| gtk_widget_set_tooltip_text (widget, "Set the item set to use"); |
| gtk_box_append (GTK_BOX (items_cntl), widget); |
| |
| g_signal_connect (G_OBJECT (widget), "changed", |
| G_CALLBACK (items_changed), flowbox); |
| |
| populate_items (GTK_FLOW_BOX (flowbox)); |
| |
| /* This line was added only for the convenience of reproducing |
| * a height-for-width inside GtkScrolledWindow bug (bug 629778). |
| * -Tristan |
| */ |
| gtk_window_set_default_size (GTK_WINDOW (window), 390, -1); |
| |
| return window; |
| } |
| |
| static void |
| quit_cb (GtkWidget *widget, |
| gpointer data) |
| { |
| gboolean *done = data; |
| |
| *done = TRUE; |
| |
| g_main_context_wakeup (NULL); |
| } |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| GtkWidget *window; |
| gboolean done = FALSE; |
| |
| gtk_init (); |
| |
| window = create_window (); |
| |
| g_signal_connect (window, "destroy", G_CALLBACK (quit_cb), &done); |
| |
| gtk_window_present (GTK_WINDOW (window)); |
| |
| while (!done) |
| g_main_context_iteration (NULL, TRUE); |
| |
| return 0; |
| } |