Blame tests/testtreecolumnsizing.c

Packit 98cdb6
/* testtreecolumnsizing.c: Test case for tree view column resizing.
Packit 98cdb6
 *
Packit 98cdb6
 * Copyright (C) 2008  Kristian Rietveld  <kris@gtk.org>
Packit 98cdb6
 *
Packit 98cdb6
 * This work is provided "as is"; redistribution and modification
Packit 98cdb6
 * in whole or in part, in any medium, physical or electronic is
Packit 98cdb6
 * permitted without restriction.
Packit 98cdb6
 *
Packit 98cdb6
 * This work is distributed in the hope that it will be useful,
Packit 98cdb6
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 98cdb6
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Packit 98cdb6
 *
Packit 98cdb6
 * In no event shall the authors or contributors be liable for any
Packit 98cdb6
 * direct, indirect, incidental, special, exemplary, or consequential
Packit 98cdb6
 * damages (including, but not limited to, procurement of substitute
Packit 98cdb6
 * goods or services; loss of use, data, or profits; or business
Packit 98cdb6
 * interruption) however caused and on any theory of liability, whether
Packit 98cdb6
 * in contract, strict liability, or tort (including negligence or
Packit 98cdb6
 * otherwise) arising in any way out of the use of this software, even
Packit 98cdb6
 * if advised of the possibility of such damage.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
#include <gtk/gtk.h>
Packit 98cdb6
#include <string.h>
Packit 98cdb6
Packit 98cdb6
#define NO_EXPAND "No expandable columns"
Packit 98cdb6
#define SINGLE_EXPAND "One expandable column"
Packit 98cdb6
#define MULTI_EXPAND "Multiple expandable columns"
Packit 98cdb6
#define LAST_EXPAND "Last column is expandable"
Packit 98cdb6
#define BORDER_EXPAND "First and last columns are expandable"
Packit 98cdb6
#define ALL_EXPAND "All columns are expandable"
Packit 98cdb6
Packit 98cdb6
#define N_ROWS 10
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static GtkTreeModel *
Packit 98cdb6
create_model (void)
Packit 98cdb6
{
Packit 98cdb6
  int i;
Packit 98cdb6
  GtkListStore *store;
Packit 98cdb6
Packit 98cdb6
  store = gtk_list_store_new (5,
Packit 98cdb6
                              G_TYPE_STRING,
Packit 98cdb6
                              G_TYPE_STRING,
Packit 98cdb6
                              G_TYPE_STRING,
Packit 98cdb6
                              G_TYPE_STRING,
Packit 98cdb6
                              G_TYPE_STRING);
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < N_ROWS; i++)
Packit 98cdb6
    {
Packit 98cdb6
      gchar *str;
Packit 98cdb6
Packit 98cdb6
      str = g_strdup_printf ("Row %d", i);
Packit 98cdb6
      gtk_list_store_insert_with_values (store, NULL, i,
Packit 98cdb6
                                         0, str,
Packit 98cdb6
                                         1, "Blah blah blah blah blah",
Packit 98cdb6
                                         2, "Less blah",
Packit 98cdb6
                                         3, "Medium length",
Packit 98cdb6
                                         4, "Eek",
Packit 98cdb6
                                         -1);
Packit 98cdb6
      g_free (str);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return GTK_TREE_MODEL (store);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
toggle_long_content_row (GtkToggleButton *button,
Packit 98cdb6
                         gpointer         user_data)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeModel *model;
Packit 98cdb6
Packit 98cdb6
  model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
Packit 98cdb6
  if (gtk_tree_model_iter_n_children (model, NULL) == N_ROWS)
Packit 98cdb6
    {
Packit 98cdb6
      gtk_list_store_insert_with_values (GTK_LIST_STORE (model), NULL, N_ROWS,
Packit 98cdb6
                                         0, "Very very very very longggggg",
Packit 98cdb6
                                         1, "Blah blah blah blah blah",
Packit 98cdb6
                                         2, "Less blah",
Packit 98cdb6
                                         3, "Medium length",
Packit 98cdb6
                                         4, "Eek we make the scrollbar appear",
Packit 98cdb6
                                         -1);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      GtkTreeIter iter;
Packit 98cdb6
Packit 98cdb6
      gtk_tree_model_iter_nth_child (model, &iter, NULL, N_ROWS);
Packit 98cdb6
      gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
combo_box_changed (GtkComboBox *combo_box,
Packit 98cdb6
                   gpointer     user_data)
Packit 98cdb6
{
Packit 98cdb6
  gchar *str;
Packit 98cdb6
  GList *list;
Packit 98cdb6
  GList *columns;
Packit 98cdb6
Packit 98cdb6
  str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (combo_box));
Packit 98cdb6
  if (!str)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (user_data));
Packit 98cdb6
Packit 98cdb6
  if (!strcmp (str, NO_EXPAND))
Packit 98cdb6
    {
Packit 98cdb6
      for (list = columns; list; list = list->next)
Packit 98cdb6
        gtk_tree_view_column_set_expand (list->data, FALSE);
Packit 98cdb6
    }
Packit 98cdb6
  else if (!strcmp (str, SINGLE_EXPAND))
Packit 98cdb6
    {
Packit 98cdb6
      for (list = columns; list; list = list->next)
Packit 98cdb6
        {
Packit 98cdb6
          if (list->prev && !list->prev->prev)
Packit 98cdb6
            /* This is the second column */
Packit 98cdb6
            gtk_tree_view_column_set_expand (list->data, TRUE);
Packit 98cdb6
          else
Packit 98cdb6
            gtk_tree_view_column_set_expand (list->data, FALSE);
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
  else if (!strcmp (str, MULTI_EXPAND))
Packit 98cdb6
    {
Packit 98cdb6
      for (list = columns; list; list = list->next)
Packit 98cdb6
        {
Packit 98cdb6
          if (list->prev && !list->prev->prev)
Packit 98cdb6
            /* This is the second column */
Packit 98cdb6
            gtk_tree_view_column_set_expand (list->data, TRUE);
Packit 98cdb6
          else if (list->prev && !list->prev->prev->prev)
Packit 98cdb6
            /* This is the third column */
Packit 98cdb6
            gtk_tree_view_column_set_expand (list->data, TRUE);
Packit 98cdb6
          else
Packit 98cdb6
            gtk_tree_view_column_set_expand (list->data, FALSE);
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
  else if (!strcmp (str, LAST_EXPAND))
Packit 98cdb6
    {
Packit 98cdb6
      for (list = columns; list->next; list = list->next)
Packit 98cdb6
        gtk_tree_view_column_set_expand (list->data, FALSE);
Packit 98cdb6
      /* This is the last column */
Packit 98cdb6
      gtk_tree_view_column_set_expand (list->data, TRUE);
Packit 98cdb6
    }
Packit 98cdb6
  else if (!strcmp (str, BORDER_EXPAND))
Packit 98cdb6
    {
Packit 98cdb6
      gtk_tree_view_column_set_expand (columns->data, TRUE);
Packit 98cdb6
      for (list = columns->next; list->next; list = list->next)
Packit 98cdb6
        gtk_tree_view_column_set_expand (list->data, FALSE);
Packit 98cdb6
      /* This is the last column */
Packit 98cdb6
      gtk_tree_view_column_set_expand (list->data, TRUE);
Packit 98cdb6
    }
Packit 98cdb6
  else if (!strcmp (str, ALL_EXPAND))
Packit 98cdb6
    {
Packit 98cdb6
      for (list = columns; list; list = list->next)
Packit 98cdb6
        gtk_tree_view_column_set_expand (list->data, TRUE);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_free (str);
Packit 98cdb6
  g_list_free (columns);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
int
Packit 98cdb6
main (int argc, char **argv)
Packit 98cdb6
{
Packit 98cdb6
  int i;
Packit 98cdb6
  GtkWidget *window;
Packit 98cdb6
  GtkWidget *vbox;
Packit 98cdb6
  GtkWidget *combo_box;
Packit 98cdb6
  GtkWidget *sw;
Packit 98cdb6
  GtkWidget *tree_view;
Packit 98cdb6
  GtkWidget *button;
Packit 98cdb6
Packit 98cdb6
  gtk_init (&argc, &argv);
Packit 98cdb6
Packit 98cdb6
  /* Window and box */
Packit 98cdb6
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit 98cdb6
  gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
Packit 98cdb6
  g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
Packit 98cdb6
  gtk_container_set_border_width (GTK_CONTAINER (window), 5);
Packit 98cdb6
Packit 98cdb6
  vbox = gtk_vbox_new (FALSE, 5);
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (window), vbox);
Packit 98cdb6
Packit 98cdb6
  /* Option menu contents */
Packit 98cdb6
  combo_box = gtk_combo_box_text_new ();
Packit 98cdb6
Packit 98cdb6
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), NO_EXPAND);
Packit 98cdb6
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), SINGLE_EXPAND);
Packit 98cdb6
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), MULTI_EXPAND);
Packit 98cdb6
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), LAST_EXPAND);
Packit 98cdb6
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), BORDER_EXPAND);
Packit 98cdb6
  gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), ALL_EXPAND);
Packit 98cdb6
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox), combo_box, FALSE, FALSE, 0);
Packit 98cdb6
Packit 98cdb6
  /* Scrolled window and tree view */
Packit 98cdb6
  sw = gtk_scrolled_window_new (NULL, NULL);
Packit 98cdb6
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
Packit 98cdb6
                                  GTK_POLICY_AUTOMATIC,
Packit 98cdb6
                                  GTK_POLICY_AUTOMATIC);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
Packit 98cdb6
Packit 98cdb6
  tree_view = gtk_tree_view_new_with_model (create_model ());
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (sw), tree_view);
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < 5; i++)
Packit 98cdb6
    {
Packit 98cdb6
      GtkTreeViewColumn *column;
Packit 98cdb6
Packit 98cdb6
      gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
Packit 98cdb6
                                                   i, "Header",
Packit 98cdb6
                                                   gtk_cell_renderer_text_new (),
Packit 98cdb6
                                                   "text", i,
Packit 98cdb6
                                                   NULL);
Packit 98cdb6
Packit 98cdb6
      column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), i);
Packit 98cdb6
      gtk_tree_view_column_set_resizable (column, TRUE);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  /* Toggle button for long content row */
Packit 98cdb6
  button = gtk_toggle_button_new_with_label ("Toggle long content row");
Packit 98cdb6
  g_signal_connect (button, "toggled",
Packit 98cdb6
                    G_CALLBACK (toggle_long_content_row), tree_view);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
Packit 98cdb6
Packit 98cdb6
  /* Set up option menu callback and default item */
Packit 98cdb6
  g_signal_connect (combo_box, "changed",
Packit 98cdb6
                    G_CALLBACK (combo_box_changed), tree_view);
Packit 98cdb6
  gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), 0);
Packit 98cdb6
Packit 98cdb6
  /* Done */
Packit 98cdb6
  gtk_widget_show_all (window);
Packit 98cdb6
Packit 98cdb6
  gtk_main ();
Packit 98cdb6
Packit 98cdb6
  return 0;
Packit 98cdb6
}