summaryrefslogtreecommitdiff
path: root/tests/testtooltips.c
diff options
context:
space:
mode:
authorKristian Rietveld <kris@imendio.com>2007-02-06 10:25:21 +0000
committerKristian Rietveld <kristian@src.gnome.org>2007-02-06 10:25:21 +0000
commit0ef946ed64c746aa210f40884d5e082e9c3a6d01 (patch)
treee2e71072af6204dece9abb6a1892507065d66952 /tests/testtooltips.c
parent47b8d98aba689af51337f34fe54ceb5e8390bfd1 (diff)
downloadgtk+-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.c377
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;
+}