From 8072ff454ce9688fe63b381ec39db0b5a61eea43 Mon Sep 17 00:00:00 2001 From: Nicola Fontana Date: Fri, 1 Feb 2013 23:27:10 +0100 Subject: [PATCH] adg: added adg_gtk_area_reset() A new API to reset a canvas bound to an AdgGtkArea widget, that is centering and rescaling it to fill the allocation space of the widget. --- demo/adg-demo.c | 27 +++++++++++++++++++++++++++ demo/adg-demo.ui.in | 28 +++++++++------------------- src/adg/adg-gtk-area.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/adg/adg-gtk-area.h | 1 + 4 files changed, 77 insertions(+), 19 deletions(-) diff --git a/demo/adg-demo.c b/demo/adg-demo.c index e032cf3f..d7677fb9 100644 --- a/demo/adg-demo.c +++ b/demo/adg-demo.c @@ -907,6 +907,30 @@ _adg_do_print(GtkWidget *button, AdgCanvas *canvas) _adg_error(error->message, window); } +static gboolean +_adg_button_press(AdgGtkArea *area, GdkEventButton *event) +{ + if (event->button == 1) { + AdgMatrix map; + AdgCanvas *canvas = adg_gtk_area_get_canvas(area); + AdgEntity *entity; + + canvas = adg_gtk_area_get_canvas(area); + entity = (AdgEntity *) canvas; + + /* Restore the original local map */ + cairo_matrix_init_translate(&map, 140, 180); + cairo_matrix_scale(&map, 8, 8); + adg_entity_set_local_map(entity, &map); + + adg_gtk_area_reset(area); + } else if (event->button == 3) { + /* TODO: autoscale */ + } + + return FALSE; +} + static DemoPart * _adg_part_new(GtkBuilder *builder) { @@ -946,6 +970,9 @@ _adg_part_new(GtkBuilder *builder) _adg_part_link(part, &part->DHOLE, gtk_builder_get_object(builder, "editDHOLE")); _adg_part_link(part, &part->LHOLE, gtk_builder_get_object(builder, "editLHOLE")); + g_signal_connect(part->area, "button-press-event", + G_CALLBACK(_adg_button_press), NULL); + toggle_object = gtk_builder_get_object(builder, "GROOVE"); _adg_part_link(part, &part->GROOVE, toggle_object); diff --git a/demo/adg-demo.ui.in b/demo/adg-demo.ui.in index 55cf7c27..2e803a29 100644 --- a/demo/adg-demo.ui.in +++ b/demo/adg-demo.ui.in @@ -26,25 +26,15 @@ - - 6 - False - 6 - - - True - -1 - Rotate the mouse wheel to zoom in and out. -Drag the mouse with the wheel pressed to pan. - - - - - True - 60 - Keep the shift key pressed while zooming or panning with the mouse to do the same in global space. - - + + 0 + 6 + -1 + +Rotate the mouse wheel to zoom in and out, drag the mouse with the wheel pressed to pan. +Keep the shift key pressed while zooming and panning with the mouse to do the same in global space. +Left click to restore the original transformation maps, right click to autoscale the local map. + True diff --git a/src/adg/adg-gtk-area.c b/src/adg/adg-gtk-area.c index af5412ea..71e27daa 100644 --- a/src/adg/adg-gtk-area.c +++ b/src/adg/adg-gtk-area.c @@ -665,6 +665,46 @@ adg_gtk_area_has_autozoom(AdgGtkArea *area) } /** + * adg_gtk_area_reset: + * @area: an #AdgGtkArea + * + * Forcibly resets the zoom ratio and position of the canvas bound + * to @area. This means the canvas will be scaled and centered on + * the current available space. + **/ +void +adg_gtk_area_reset(AdgGtkArea *area) +{ + AdgGtkAreaPrivate *data; + GtkWidget *parent; + const CpmlExtents *sheet; + AdgPair size; + gdouble zoom; + + g_return_if_fail(ADG_GTK_IS_AREA(area)); + + data = area->data; + cairo_matrix_init_identity(&data->render_map); + + sheet = _adg_get_extents(area); + if (!sheet->is_defined || sheet->size.x <= 0 || sheet->size.y <= 0) + return; + + parent = gtk_widget_get_parent((GtkWidget *) area); + size.x = gtk_widget_get_allocated_width(parent); + size.y = gtk_widget_get_allocated_height(parent); + zoom = MIN(size.x / sheet->size.x, size.y / sheet->size.y); + + cairo_matrix_scale(&data->render_map, zoom, zoom); + cairo_matrix_translate(&data->render_map, + (size.x / zoom - sheet->size.x) / 2 - sheet->org.x, + (size.y / zoom - sheet->size.y) / 2 - sheet->org.y); + + /* Trigger a resize trying to hide the scrollbars on the parent */ + gtk_widget_queue_resize(parent); +} + +/** * adg_gtk_area_canvas_changed: * @area: an #AdgGtkArea * @old_canvas: the old canvas bound to @area diff --git a/src/adg/adg-gtk-area.h b/src/adg/adg-gtk-area.h index d8dec327..3f70fd9a 100644 --- a/src/adg/adg-gtk-area.h +++ b/src/adg/adg-gtk-area.h @@ -75,6 +75,7 @@ gdouble adg_gtk_area_get_factor (AdgGtkArea *area); void adg_gtk_area_switch_autozoom (AdgGtkArea *area, gboolean state); gboolean adg_gtk_area_has_autozoom (AdgGtkArea *area); +void adg_gtk_area_reset (AdgGtkArea *area); void adg_gtk_area_canvas_changed (AdgGtkArea *area, AdgCanvas *old_canvas); void adg_gtk_area_set_render_map (AdgGtkArea *area, -- 2.11.4.GIT