diff options
author | Kristian Rietveld <kris@imendio.com> | 2007-02-06 10:25:21 +0000 |
---|---|---|
committer | Kristian Rietveld <kristian@src.gnome.org> | 2007-02-06 10:25:21 +0000 |
commit | 0ef946ed64c746aa210f40884d5e082e9c3a6d01 (patch) | |
tree | e2e71072af6204dece9abb6a1892507065d66952 /tests/testtooltips.c | |
parent | 47b8d98aba689af51337f34fe54ceb5e8390bfd1 (diff) | |
download | gtk+-0ef946ed64c746aa210f40884d5e082e9c3a6d01.tar.gz |
New tooltips API.
2007-02-06 Kristian Rietveld <kris@imendio.com>
New tooltips API.
* gtk/Makefile.am
* gtk/gtk.h
* gtk/gtk.symbols: build system foo.
* gtk/gtkmain.c (gtk_main_do_event): call tooltip event handler
hook for appropriate events.
* gtk/gtkmarshalers.list: add BOOLEAN:INT,INT,BOOLEAN,OBJECT.
* gtk/gtkrc.c: add style for gtk-tooltip.
* gtk/gtksettings.c (gtk_settings_class_init): make the
different tooltip timeouts configurable.
* gtk/gtkwidget.[ch]: add new properties, signals, make sure
tooltips are hidden on unmap, destroy, update window event
mask on realize, hook into focus change and show help
handlers.
* gtk/gtkwindow.h: move GtkWindow typdef to gtkwidget.h ...
* gtk/gtktooltip.[ch]: new files.
* tests/Makefile.am
* tests/testtooltips.c: add test application.
svn path=/trunk/; revision=17264
Diffstat (limited to 'tests/testtooltips.c')
-rw-r--r-- | tests/testtooltips.c | 377 |
1 files changed, 377 insertions, 0 deletions
diff --git a/tests/testtooltips.c b/tests/testtooltips.c new file mode 100644 index 0000000000..8def5111b7 --- /dev/null +++ b/tests/testtooltips.c @@ -0,0 +1,377 @@ +/* testtooltips.c: Test application for GTK+ >= 2.12 tooltips code + * + * Copyright (C) 2006-2007 Imendio AB + * Contact: Kristian Rietveld <kris@imendio.com> + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include <gtk/gtk.h> + +static gboolean +query_tooltip_cb (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + gpointer data) +{ + gtk_tooltip_set_markup (tooltip, gtk_button_get_label (GTK_BUTTON (widget))); + gtk_tooltip_set_icon_from_stock (tooltip, GTK_STOCK_DELETE, + GTK_ICON_SIZE_MENU); + + return TRUE; +} + +static gboolean +query_tooltip_custom_cb (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + gpointer data) +{ + GdkColor color = { 0, 0, 65535 }; + GtkWindow *window = gtk_widget_get_tooltip_window (widget); + + gtk_widget_modify_bg (GTK_WIDGET (window), GTK_STATE_NORMAL, &color); + + return TRUE; +} + +static gboolean +query_tooltip_text_view_cb (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + gpointer data) +{ + gint bx, by, trailing; + GtkTextTag *tag = data; + GtkTextIter iter; + GtkTextView *text_view = GTK_TEXT_VIEW (widget); + + gtk_text_view_window_to_buffer_coords (text_view, GTK_TEXT_WINDOW_TEXT, + x, y, &bx, &by); + gtk_text_view_get_iter_at_position (text_view, &iter, &trailing, bx, by); + + if (gtk_text_iter_has_tag (&iter, tag)) + gtk_tooltip_set_markup (tooltip, "Tooltip on text tag"); + else + return FALSE; + + return TRUE; +} + +static gboolean +query_tooltip_tree_view_cb (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + gpointer data) +{ + GtkTreeIter iter; + GtkTreeView *tree_view = GTK_TREE_VIEW (widget); + GtkTreeModel *model = gtk_tree_view_get_model (tree_view); + GtkTreePath *path = NULL; + gchar *tmp; + gchar *pathstring; + + char buffer[512]; + + if (keyboard_tip) + { + /* Keyboard mode */ + gtk_tree_view_get_cursor (tree_view, &path, NULL); + + if (!path) + return FALSE; + } + else + { + /* Mouse mode */ + if (!gtk_tree_view_get_path_at_pos (tree_view, x, y, &path, NULL, NULL, NULL)) + return FALSE; + } + + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_model_get (model, &iter, 0, &tmp, -1); + pathstring = gtk_tree_path_to_string (path); + + snprintf (buffer, 511, "<b>Path %s:</b> %s", pathstring, tmp); + gtk_tooltip_set_markup (tooltip, buffer); + + gtk_tree_path_free (path); + g_free (pathstring); + g_free (tmp); + + return TRUE; +} + +static GtkTreeModel * +create_model (void) +{ + GtkTreeStore *store; + GtkTreeIter iter; + + store = gtk_tree_store_new (1, G_TYPE_STRING); + + /* A tree store with some random words ... */ + gtk_tree_store_insert_with_values (store, &iter, NULL, 0, + 0, "File Manager", -1); + gtk_tree_store_insert_with_values (store, &iter, NULL, 0, + 0, "Gossip", -1); + gtk_tree_store_insert_with_values (store, &iter, NULL, 0, + 0, "System Settings", -1); + gtk_tree_store_insert_with_values (store, &iter, NULL, 0, + 0, "The GIMP", -1); + gtk_tree_store_insert_with_values (store, &iter, NULL, 0, + 0, "Terminal", -1); + gtk_tree_store_insert_with_values (store, &iter, NULL, 0, + 0, "Word Processor", -1); + + return GTK_TREE_MODEL (store); +} + +static void +selection_changed_cb (GtkTreeSelection *selection, + GtkWidget *tree_view) +{ + gtk_widget_trigger_tooltip_query (tree_view); +} + +static struct Rectangle +{ + gint x; + gint y; + gfloat r; + gfloat g; + gfloat b; + const char *tooltip; +} +rectangles[] = +{ + { 10, 10, 0.0, 0.0, 0.9, "Blue box!" }, + { 200, 170, 1.0, 0.0, 0.0, "Red thing" }, + { 100, 50, 0.8, 0.8, 0.0, "Yellow thing" } +}; + +static gboolean +query_tooltip_drawing_area_cb (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + gpointer data) +{ + gint i; + + if (keyboard_tip) + return FALSE; + + for (i = 0; i < G_N_ELEMENTS (rectangles); i++) + { + struct Rectangle *r = &rectangles[i]; + + if (r->x < x && x < r->x + 50 + && r->y < y && y < r->y + 50) + { + gtk_tooltip_set_markup (tooltip, r->tooltip); + return TRUE; + } + } + + return FALSE; +} + +static gboolean +drawing_area_expose (GtkWidget *drawing_area, + GdkEventExpose *event, + gpointer data) +{ + gint i; + cairo_t *cr; + + gdk_window_get_pointer (drawing_area->window, NULL, NULL, NULL); + + cr = gdk_cairo_create (drawing_area->window); + + cairo_rectangle (cr, 0, 0, + drawing_area->allocation.width, + drawing_area->allocation.height); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_fill (cr); + + for (i = 0; i < G_N_ELEMENTS (rectangles); i++) + { + struct Rectangle *r = &rectangles[i]; + + cairo_rectangle (cr, r->x, r->y, 50, 50); + cairo_set_source_rgb (cr, r->r, r->g, r->b); + cairo_stroke (cr); + + cairo_rectangle (cr, r->x, r->y, 50, 50); + cairo_set_source_rgba (cr, r->r, r->g, r->b, 0.5); + cairo_fill (cr); + } + + cairo_destroy (cr); + + return FALSE; +} + +int +main (int argc, char *argv[]) +{ + GtkWidget *window; + GtkWidget *box; + GtkWidget *drawing_area; + GtkWidget *button; + + GtkWidget *tooltip_window; + GtkWidget *tooltip_button; + + GtkWidget *tree_view; + GtkTreeViewColumn *column; + + GtkWidget *text_view; + GtkTextBuffer *buffer; + GtkTextIter iter; + GtkTextTag *tag; + + gtk_init (&argc, &argv); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), "Tooltips test"); + gtk_container_set_border_width (GTK_CONTAINER (window), 10); + g_signal_connect (window, "delete_event", + G_CALLBACK (gtk_main_quit), NULL); + + box = gtk_vbox_new (FALSE, 3); + gtk_container_add (GTK_CONTAINER (window), box); + + /* A check button using the tooltip-markup property */ + button = gtk_check_button_new_with_label ("This one uses the tooltip-markup property"); + g_object_set (button, "tooltip-markup", "Hello, I am a static tooltip.", NULL); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + + /* A check button using the query-tooltip signal */ + button = gtk_check_button_new_with_label ("I use the query-tooltip signal"); + g_object_set (button, "has-tooltip", TRUE, NULL); + g_signal_connect (button, "query-tooltip", + G_CALLBACK (query_tooltip_cb), NULL); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + + /* A label */ + button = gtk_label_new ("I am just a label"); + gtk_label_set_selectable (GTK_LABEL (button), FALSE); + g_object_set (button, "tooltip-markup", "Label tooltip", NULL); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + + /* A selectable label */ + button = gtk_label_new ("I am a selectable label"); + gtk_label_set_selectable (GTK_LABEL (button), TRUE); + g_object_set (button, "tooltip-markup", "Another Label tooltip", NULL); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + + /* Another one, with a custom tooltip window */ + button = gtk_check_button_new_with_label ("This one has a custom tooltip window!"); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + + tooltip_window = gtk_window_new (GTK_WINDOW_POPUP); + tooltip_button = gtk_label_new ("blaat!"); + gtk_container_add (GTK_CONTAINER (tooltip_window), tooltip_button); + gtk_widget_show (tooltip_button); + + gtk_widget_set_tooltip_window (button, GTK_WINDOW (tooltip_window)); + g_signal_connect (button, "query-tooltip", + G_CALLBACK (query_tooltip_custom_cb), NULL); + g_object_set (button, "has-tooltip", TRUE, NULL); + + /* An insensitive button */ + button = gtk_button_new_with_label ("This one is insensitive"); + gtk_widget_set_sensitive (button, FALSE); + g_object_set (button, "tooltip-markup", "Insensitive!", NULL); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + + /* Testcases from Kris without a tree view don't exist. */ + tree_view = gtk_tree_view_new_with_model (create_model ()); + gtk_widget_set_size_request (tree_view, 200, 240); + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), + 0, "Test", + gtk_cell_renderer_text_new (), + "text", 0, + NULL); + + g_object_set (tree_view, "has-tooltip", TRUE, NULL); + g_signal_connect (tree_view, "query-tooltip", + G_CALLBACK (query_tooltip_tree_view_cb), NULL); + g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)), + "changed", G_CALLBACK (selection_changed_cb), tree_view); + + /* Set a tooltip on the column */ + column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), 0); + gtk_tree_view_column_set_clickable (column, TRUE); + g_object_set (column->button, "tooltip-markup", "Header", NULL); + + gtk_box_pack_start (GTK_BOX (box), tree_view, FALSE, FALSE, 2); + + /* And a text view for Matthias */ + buffer = gtk_text_buffer_new (NULL); + + gtk_text_buffer_get_end_iter (buffer, &iter); + gtk_text_buffer_insert (buffer, &iter, "Hello, the text ", -1); + + tag = gtk_text_buffer_create_tag (buffer, "bold", NULL); + g_object_set (tag, "weight", PANGO_WEIGHT_BOLD, NULL); + + gtk_text_buffer_get_end_iter (buffer, &iter); + gtk_text_buffer_insert_with_tags (buffer, &iter, "in bold", -1, tag, NULL); + + gtk_text_buffer_get_end_iter (buffer, &iter); + gtk_text_buffer_insert (buffer, &iter, " has a tooltip!", -1); + + text_view = gtk_text_view_new_with_buffer (buffer); + gtk_widget_set_size_request (text_view, 200, 50); + + g_object_set (text_view, "has-tooltip", TRUE, NULL); + g_signal_connect (text_view, "query-tooltip", + G_CALLBACK (query_tooltip_text_view_cb), tag); + + gtk_box_pack_start (GTK_BOX (box), text_view, FALSE, FALSE, 2); + + /* Drawing area */ + drawing_area = gtk_drawing_area_new (); + gtk_widget_set_size_request (drawing_area, 320, 240); + g_object_set (drawing_area, "has-tooltip", TRUE, NULL); + g_signal_connect (drawing_area, "expose_event", + G_CALLBACK (drawing_area_expose), NULL); + g_signal_connect (drawing_area, "query-tooltip", + G_CALLBACK (query_tooltip_drawing_area_cb), NULL); + gtk_box_pack_start (GTK_BOX (box), drawing_area, FALSE, FALSE, 2); + + /* Done! */ + gtk_widget_show_all (window); + + gtk_main (); + + return 0; +} |