Rounded and eye candy tooltip
[tbo.git] / src / tbo-tooltip.c
1 #include <math.h>
2 #include <gtk/gtk.h>
3 #include <glib.h>
4 #include <cairo.h>
5 #include "tbo-tooltip.h"
6
7 static GString *TOOLTIP = NULL;
8 static int X=0, Y=0;
9
10 void
11 cairo_rounded_rectangle (cairo_t *cr, int xx, int yy, int w, int h)
12 {
13     double x             = xx,
14            y             = yy,
15            width         = w,
16            height        = h,
17            aspect        = 1.0,     /* aspect ratio */
18            corner_radius = height / 10.0;   /* and corner curvature radius */
19
20     double radius = corner_radius / aspect;
21     double degrees = M_PI / 180.0;
22
23     cairo_new_sub_path (cr);
24     cairo_arc (cr, x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees);
25     cairo_arc (cr, x + width - radius, y + height - radius, radius, 0 * degrees, 90 * degrees);
26     cairo_arc (cr, x + radius, y + height - radius, radius, 90 * degrees, 180 * degrees);
27     cairo_arc (cr, x + radius, y + radius, radius, 180 * degrees, 270 * degrees);
28     cairo_close_path (cr);
29 }
30
31 void
32 tbo_tooltip_draw_background (cairo_t *cr, int w, int h)
33 {
34     int margin = 5;
35
36     cairo_set_source_rgba (cr, 0, 0, 0, 0.6);
37     cairo_rounded_rectangle (cr, -margin, -margin, w + margin * 2, h + margin * 2);
38     cairo_fill (cr);
39
40 }
41
42 void
43 tbo_tooltip_set (const char *tooltip, int x, int y)
44 {
45     if (!TOOLTIP)
46     {
47         if (tooltip)
48         {
49             TOOLTIP = g_string_new (tooltip);
50             X = x;
51             Y = y;
52         }
53     }
54     else
55     {
56         if (!tooltip)
57         {
58             g_string_free (TOOLTIP, TRUE);
59             TOOLTIP = NULL;
60         }
61         else
62         {
63             TOOLTIP = g_string_overwrite (TOOLTIP, 0, tooltip);
64             X = x;
65             Y = y;
66         }
67     }
68 }
69
70 GString *
71 tbo_tooltip_get ()
72 {
73     return TOOLTIP;
74 }
75
76 void
77 tbo_tooltip_draw (cairo_t *cr)
78 {
79     if (!TOOLTIP)
80         return;
81
82     int w=0, h=0;
83     int posx, posy;
84     gchar *text = TOOLTIP->str;
85     PangoLayout *layout;
86
87     layout = pango_cairo_create_layout (cr);
88     pango_layout_set_text (layout, text, -1);
89     pango_layout_get_size (layout, &w, &h);
90     w = (double)w / PANGO_SCALE;
91     h = (double)h / PANGO_SCALE;
92
93     //pango_layout_set_font_description (layout, desc);
94     pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
95
96     posx = X - w / 2;
97     posy = Y - h / 2;
98     cairo_translate (cr, posx, posy);
99
100     tbo_tooltip_draw_background (cr, w, h);
101
102     cairo_set_source_rgb(cr, 1, 1, 1);
103     pango_cairo_show_layout (cr, layout);
104
105     cairo_translate (cr, -posx, -posy);
106 }