/* extendedlayoutexample.c * Copyright (C) 2010 Openismus GmbH * * Author: * Tristan Van Berkom * * 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 . */ #include typedef struct { const char *name; const char *tooltip; const char *interface; GtkWidget *window; } TestInterface; /* These strings were generated with: * * IFS=""; while read line; do echo -n \"; echo -n $line | sed -e 's|\"|\\"|g'; echo \"; done < file.glade */ static TestInterface interfaces[] = { { "Ellipsizing Labels", "Demonstrates how labels will request a natural size in a horizontal space", "" " " " " " " " 450" " 50" " " " " " horizontal" " " " " " Some labels do ellipsize" " end" " " " " " " " " " " " " " " " " " but some" " end" " " " " " " " " " " " " " " " " " do not at all" " " " " " " " " " " " " " " " " " " " " "", NULL }, { "Wrapping Label", "Demonstrates how a wrapping label can require a height contextual to its allocated width", "" " " " " " " " 300" " " " " " horizontal" " True" " False" " False" " " " " " vertical" " " " " " A short static label." " " " " " " " " " " " " " " " Long label" " " " " " This is a really long label for the purpose of testing line wrapping is working correctly in conjunction with height-for-width support in GTK" " True" " 30" " " " " " " " " " " " " " " " " " " " True" " True" " " " " " A really really long label inside a button to demonstrate height for width working inside buttons" " True" " 25" " " " " " " " " " " " " " " " " " " " " " " " This static label\n" "can shrink." " center" " " " " " " " " " " " " " " " " " " "", NULL }, { "Horizontal Box", "Demonstrates how a horizontal box can calculate the collective height for an allocated width", "" " " " " " " " 200" " 600" " " " " " horizontal" " True" " False" " False" " " " " " vertical" " " " " " horizontal" " " " " " True" " True" " " " " " A button that wraps." " True" " 10" " " " " " " " " " " " " " " " " " " " Lets try setting up some long text to wrap up in this hbox and see if the height-for-width is gonna work !" " True" " 30" " " " " " " " " " " " " " " " " " " " A button that expands in the vbox" " True" " True" " " " " " " " " " " " " " This label is\n" "set to shrink inside\n" "the paned window." " center" " " " " " " " " " " " " " " " " " " "", NULL }, { "Label Parameters", "This test demonstrates how \"width-chars\" and \"max-width-chars\" can be used " "to effect minimum and natural widths in wrapping labels.", "" " " " " " " " 900" " " " " " horizontal" " True" " False" " False" " " " " " vertical" " " " " " horizontal" " 6" " " " " " The first 2 labels require 10 characters." " True" " 10" " " " " " " " " " " " " " " " " " This label has a maximum natural width of 20 characters. The second two labels expand." " True" " 10" " 20" " " " " " " " " " " " " " " " " " This label requires a default minimum size." " True" " " " " " " " " " " " " " " " " " " " " " This test demonstrates how the \"width-chars\" and \"max-width-chars\"\n" "properties can be used to specify the minimum requested wrap width\n" "and the maximum natural wrap width respectively." " end" " 30" " " " " " " " " " " " " " " " " " " " " " Some static\n" "text that shrinks.\n" "\n" "You will need to stretch\n" "this window quite wide\n" "to see the effects." " center" " " " " " " " " " " " " " " " " "", NULL }, { "Wrapping Expander", "This test demonstrates how the expander label can fill to its natural width " "and also trade height for width.", "" "" " " " " " " " 500" " " " " " horizontal" " True" " False" " False" " " " " " True" " " " " " More wrapping text to fill the largish content area in the expander " " True" " 10" " " " " " " " " " " " " " " " " " Here is some expander text that wraps" " True" " 10" " " " " " " " " " " " " " " " " " " " " " static\n" "text\n" "here" " " " " " " " " " " " " " " " " "", NULL }, { "Wrapping Frame Label", "This test demonstrates how the frame label can fill to its natural width " "and also trade height for width.", "" "" " " " " " " " 400" " 150" " " " " " 0" " " " " " 12" " some content" " " " " " " " " " A frame label that's a little long and wraps" " True" " True" " " " " " " " " " " "", NULL }, { "Combo Boxes and Menus", "This test shows wrapping and ellipsizing text in combo boxes (and consequently in menu items).", "" "" " " " " " " " 600" " " " " " horizontal" " True" " False" " False" " " " " " vertical" " 5" " " " " " horizontal" " 5" " " " " " this combo box" " " " " " " " " " " " " " " " " " contains some wrapping locations" " end" " 10" " " " " " " " " " " " " " " " " " liststore1" " 0" " " " " " " " 1" " " " " " " " " " purple" " 600" " word" " 100" " " " " " 0" " " " " " " " " " " " " " " " " " 0" " " " " " This test shows combo boxes\n" "requesting and allocating space\n" "for its backing content using\n" "height-for-width geometry\n" "management.\n" "\n" "Note this test also demonstrates\n" "height-for-width menu items." " center" " " " " " " " " " " " " " " " " " " " " " horizontal" " 5" " " " " " this combo box" " " " " " " " " " " " " " " " " " contains some ellipsizing locations" " end" " 10" " " " " " " " " " " " " " " " " " liststore1" " 0" " " " " " " " 1" " " " " " " " " " end" " orange" " 600" " 10" " " " " " 0" " " " " " " " " " " " " " " " " " " " " " Some static\n" "text here\n" "that shrinks." " center" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " Montreal, Quebec Canada" " edit-undo" " " " " " Sao Paulo, SP Brazil" " edit-redo" " " " " " Buenos Aires, Argentina" " process-stop" " " " " " Los Angelos, California USA" " media-record" " " " " " Rio de Janeiro, RJ Brazil" " dialog-error" " " " " " Seoul, South Korea" " dialog-information" " " " " " " "", NULL }, }; static void test_clicked (GtkWidget *button, TestInterface *interface) { if (!interface->window) { GtkBuilder *builder = gtk_builder_new (); GError *error = NULL; gtk_builder_add_from_string (builder, interface->interface, -1, &error); if (error) { g_printerr ("GtkBuilder for interface \"%s\" returned error \"%s\"\n", interface->name, error->message); g_error_free (error); g_object_unref (builder); return; } interface->window = (GtkWidget *)gtk_builder_get_object (builder, "window"); gtk_window_set_hide_on_close (GTK_WINDOW (interface->window), TRUE); g_object_unref (builder); } gtk_window_present (GTK_WINDOW (interface->window)); } static GtkWidget * create_window (void) { GtkWidget *window, *vbox, *button; int i; window = gtk_window_new (); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); gtk_widget_set_margin_start (vbox, 8); gtk_widget_set_margin_end (vbox, 8); gtk_widget_set_margin_top (vbox, 8); gtk_widget_set_margin_bottom (vbox, 8); gtk_window_set_child (GTK_WINDOW (window), vbox); for (i = 0; i < G_N_ELEMENTS (interfaces); i++) { button = gtk_button_new_with_label (interfaces[i].name); gtk_widget_set_tooltip_text (button, interfaces[i].tooltip); g_signal_connect (button, "clicked", G_CALLBACK (test_clicked), &interfaces[i]); gtk_box_append (GTK_BOX (vbox), button); } 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; }