Removed tooltip fade in/out.
[tbo.git] / src / tbo-tooltip.c
1 #include <string.h>
2 #include <math.h>
3 #include <gtk/gtk.h>
4 #include <glib.h>
5 #include <cairo.h>
6 #include "ui-drawing.h"
7 #include "tbo-tooltip.h"
8 #include "tbo-window.h"
9
10 #define TOOLTIP_ALPHA 0.7
11
12 static GString *TOOLTIP = NULL;
13 static int X=0, Y=0;
14 static double ALPHA = 0.0;
15
16 void
17 cairo_rounded_rectangle (cairo_t *cr, int xx, int yy, int w, int h)
18 {
19     double x             = xx,
20            y             = yy,
21            width         = w,
22            height        = h,
23            aspect        = 1.0,     /* aspect ratio */
24            corner_radius = height / 10.0;   /* and corner curvature radius */
25
26     double radius = corner_radius / aspect;
27     double degrees = M_PI / 180.0;
28
29     cairo_new_sub_path (cr);
30     cairo_arc (cr, x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees);
31     cairo_arc (cr, x + width - radius, y + height - radius, radius, 0 * degrees, 90 * degrees);
32     cairo_arc (cr, x + radius, y + height - radius, radius, 90 * degrees, 180 * degrees);
33     cairo_arc (cr, x + radius, y + radius, radius, 180 * degrees, 270 * degrees);
34     cairo_close_path (cr);
35 }
36
37 gboolean
38 quit_tooltip_cb (gpointer p)
39 {
40     tbo_tooltip_set (NULL, 0, 0, (TboWindow*) p);
41     return FALSE;
42 }
43
44 void
45 tbo_tooltip_draw_background (cairo_t *cr, int w, int h)
46 {
47     int margin = 5;
48
49     cairo_set_source_rgba (cr, 0, 0, 0, ALPHA);
50     cairo_rounded_rectangle (cr, -margin, -margin, w + margin * 2, h + margin * 2);
51     cairo_fill (cr);
52 }
53
54 void
55 tbo_tooltip_set (const char *tooltip, int x, int y, TboWindow *tbo)
56 {
57
58     if (!TOOLTIP)
59     {
60         if (tooltip)
61         {
62             TOOLTIP = g_string_new (tooltip);
63             ALPHA = TOOLTIP_ALPHA;
64             X = x;
65             Y = y;
66         }
67     }
68     else
69     {
70         // if it's the same passing
71         if (x == X && y == Y && !strcmp (tooltip, TOOLTIP->str))
72             return;
73
74         // removing tooltip if tooltip == NULL
75         if (!tooltip && TOOLTIP)
76         {
77             ALPHA = 0.0;
78             g_string_free (TOOLTIP, TRUE);
79             TOOLTIP = NULL;
80         }
81         else
82         {
83             g_string_free (TOOLTIP, TRUE);
84
85             TOOLTIP = g_string_new (tooltip);
86             ALPHA = TOOLTIP_ALPHA;
87             X = x;
88             Y = y;
89         }
90     }
91
92     update_drawing (tbo);
93 }
94
95 GString *
96 tbo_tooltip_get ()
97 {
98     return TOOLTIP;
99 }
100
101 void
102 tbo_tooltip_draw (cairo_t *cr)
103 {
104     if (!TOOLTIP)
105         return;
106
107     int w=0, h=0;
108     int posx, posy;
109     gchar *text = TOOLTIP->str;
110     PangoLayout *layout;
111
112     layout = pango_cairo_create_layout (cr);
113     pango_layout_set_text (layout, text, -1);
114     pango_layout_get_size (layout, &w, &h);
115     w = (double)w / PANGO_SCALE;
116     h = (double)h / PANGO_SCALE;
117
118     //pango_layout_set_font_description (layout, desc);
119     pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
120
121     posx = X - w / 2;
122     posy = Y - h / 2;
123     cairo_translate (cr, posx, posy);
124
125     tbo_tooltip_draw_background (cr, w, h);
126
127     cairo_set_source_rgba (cr, 1, 1, 1, ALPHA);
128     pango_cairo_show_layout (cr, layout);
129
130     cairo_translate (cr, -posx, -posy);
131 }
132
133 void
134 tbo_tooltip_set_center_timeout (const char *tooltip, int timeout, TboWindow *tbo)
135 {
136     int x, y;
137     x = tbo->drawing->allocation.width / 2;
138     y = tbo->drawing->allocation.height / 2;
139
140     tbo_tooltip_set (tooltip, x, y, tbo);
141     g_timeout_add (timeout, quit_tooltip_cb, tbo);
142 }