#include "toolbar.h" #define TOOL_SIZE 72 #define CORNER_SIZE 12 #define BORDER_WIDTH 2 #define MARGIN 6 #define COLOR 1.4 * (0x58 / 255.0), 1.4 * (0x75 / 255.0), 1.4 * (0xA7 / 255.0) #define STROKE_COLOR (0x58 / 255.0), (0x75 / 255.0), (0xA7 / 255.0) #define N_TOOLS (sizeof (tools) / sizeof (tools[0])) typedef struct { const char* name; FooScrollAreaEventFunc event; } ToolInfo; static const ToolInfo tools[] = { { "T", NULL }, /* text */ { "R", NULL }, /* rectangle */ { "E", NULL }, /* ellipse */ { "P", NULL }, /* polygon */ { "L", NULL }, /* line */ { "I", NULL }, /* image */ { "H", NULL }, /* horizontal helper line */ { "V", NULL }, /* vertical helper line */ { "N", NULL }, /* post-it note */ }; struct Toolbar { int dummy; /* no content */ }; Toolbar * toolbar_new (void) { return g_new0 (Toolbar, 1); } int toolbar_get_width (Toolbar *bar) { return BORDER_WIDTH + TOOL_SIZE; } static void layout_set_font (PangoLayout *layout, const char *font) { PangoFontDescription *desc = pango_font_description_from_string (font); pango_layout_set_font_description (layout, desc); pango_font_description_free (desc); } static void on_input (FooScrollArea *area, FooScrollAreaEvent *event, gpointer data) { switch (event->type) { case FOO_BUTTON_PRESS: g_print ("mouse down\n"); break; case FOO_BUTTON_RELEASE: g_print ("mouse up\n"); break; default: case FOO_MOTION: break; } } static void draw_number (FooScrollArea *area, cairo_t *cr, int number, int x, int y) { PangoLayout *layout; char *string = g_strdup_printf (tools[number].name); PangoRectangle logical, ink; cairo_save (cr); layout = gtk_widget_create_pango_layout (GTK_WIDGET (area), string); layout_set_font (layout, "Sans Bold 24"); pango_layout_get_pixel_extents (layout, &ink, &logical); x += (TOOL_SIZE - logical.width) / 2 - logical.x - BORDER_WIDTH / 2; y += (TOOL_SIZE - logical.height) / 2 - logical.y - BORDER_WIDTH / 2; cairo_move_to (cr, x, y); cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0); pango_cairo_show_layout (cr, layout); cairo_restore (cr); g_object_unref (layout); g_free (string); } void toolbar_paint (Toolbar *bar, FooScrollArea *scroll_area, cairo_t *cr, int x, int y) { int i; int b = BORDER_WIDTH / 2; int segment = TOOL_SIZE - 2 * b - 2 * CORNER_SIZE; GdkRectangle viewport; foo_scroll_area_get_viewport (scroll_area, &viewport); cairo_move_to (cr, b + x, MARGIN + y); for (i = 0; i < N_TOOLS; ++i) { double x, y; cairo_get_current_point (cr, &x, &y); cairo_rel_move_to (cr, CORNER_SIZE, 0); cairo_rel_line_to (cr, segment, 0); cairo_rel_curve_to (cr, CORNER_SIZE, 0, CORNER_SIZE, 0, CORNER_SIZE, CORNER_SIZE); cairo_rel_line_to (cr, 0, segment); cairo_rel_curve_to (cr, 0, CORNER_SIZE, 0, CORNER_SIZE, -CORNER_SIZE, CORNER_SIZE); cairo_rel_line_to (cr, -segment, 0); cairo_rel_curve_to (cr, -CORNER_SIZE, 0, -CORNER_SIZE, 0, -CORNER_SIZE, -CORNER_SIZE); cairo_rel_line_to (cr, 0, -segment); cairo_rel_curve_to (cr, 0, -CORNER_SIZE, 0, -CORNER_SIZE, CORNER_SIZE, -CORNER_SIZE); cairo_set_source_rgba (cr, COLOR, 0.8); foo_scroll_area_add_input_from_fill (scroll_area, cr, on_input, GINT_TO_POINTER (i)); cairo_fill_preserve (cr); cairo_set_source_rgba (cr, STROKE_COLOR, 0.8); cairo_set_line_width (cr, BORDER_WIDTH); foo_scroll_area_add_input_from_stroke (scroll_area, cr, on_input, GINT_TO_POINTER (i)); cairo_stroke (cr); draw_number (scroll_area, cr, i, x, y); cairo_move_to (cr, x, y + TOOL_SIZE + MARGIN); } } void toolbar_invalidate (Toolbar *bar, FooScrollArea *scroll_area, int x, int y) { foo_scroll_area_invalidate_rect (scroll_area, x, y, TOOL_SIZE + 10, N_TOOLS * (TOOL_SIZE + MARGIN) + 10); }