diff --git a/plug-ins/imagemap/imap-menu.ui b/plug-ins/imagemap/imap-menu.ui index e576f7af9b..501bd46239 100644 --- a/plug-ins/imagemap/imap-menu.ui +++ b/plug-ins/imagemap/imap-menu.ui @@ -115,6 +115,21 @@ Zoom To
+ + 8:1 + app.zoom + 8 + + + 4:1 + app.zoom + 4 + + + 2:1 + app.zoom + 2 + 1:1 app.zoom @@ -123,37 +138,17 @@ 1:2 app.zoom - 2 - - - 1:3 - app.zoom - 3 + 0 1:4 app.zoom - 4 - - - 1:5 - app.zoom - 5 - - - 1:6 - app.zoom - 6 - - - 1:7 - app.zoom - 7 + -2 1:8 app.zoom - 8 + -6
diff --git a/plug-ins/imagemap/imap_main.c b/plug-ins/imagemap/imap_main.c index dc58530735..0d3b3e5179 100644 --- a/plug-ins/imagemap/imap_main.c +++ b/plug-ins/imagemap/imap_main.c @@ -58,8 +58,9 @@ #define MAX_ZOOM_FACTOR 8 -#define ZOOMED(x) (_zoom_factor * (x)) -#define GET_REAL_COORD(x) ((x) / _zoom_factor) +#define MIN_ZOOM_FACTOR -6 +#define ZOOMED(x) (_zoom_ratio * (x)) +#define GET_REAL_COORD(x) ((x) / _zoom_ratio) GType imap_get_type (void) G_GNUC_CONST; @@ -115,6 +116,7 @@ static Selection_t *_selection; static StatusBar_t *_statusbar; static ObjectList_t *_shapes; static gint _zoom_factor = 1; +static gfloat _zoom_ratio = 1; static gboolean (*_button_press_func)(GtkWidget*, GdkEventButton*, gpointer); static gpointer _button_press_param; @@ -398,7 +400,7 @@ zoom_in (gpointer data) static gint zoom_out (gpointer data) { - if (_zoom_factor > 1) + if (_zoom_factor > MIN_ZOOM_FACTOR) { set_zoom (_zoom_factor - 1); menu_set_zoom (data, _zoom_factor); @@ -407,13 +409,19 @@ zoom_out (gpointer data) } void -set_zoom(gint zoom_factor) +set_zoom (gint zoom_factor) { - set_busy_cursor(); - _zoom_factor = zoom_factor; - preview_zoom(_preview, zoom_factor); - statusbar_set_zoom(_statusbar, zoom_factor); - remove_busy_cursor(); + set_busy_cursor(); + _zoom_factor = zoom_factor; + + if (zoom_factor > 0) + _zoom_ratio = zoom_factor; + else + _zoom_ratio = 1.0f / ((zoom_factor - 2.0f) * -1.0f); + + preview_zoom (_preview, _zoom_ratio); + statusbar_set_zoom (_statusbar, zoom_factor); + remove_busy_cursor (); } gint diff --git a/plug-ins/imagemap/imap_menu.c b/plug-ins/imagemap/imap_menu.c index cd56650052..b26cbe4885 100644 --- a/plug-ins/imagemap/imap_menu.c +++ b/plug-ins/imagemap/imap_menu.c @@ -52,7 +52,7 @@ menu_set_zoom_sensitivity (gpointer data, g_simple_action_set_enabled (G_SIMPLE_ACTION (action), factor < 8); action = g_action_map_lookup_action (G_ACTION_MAP (imap->app), "zoom-out"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), factor > 1); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), factor > -6); } void diff --git a/plug-ins/imagemap/imap_preview.c b/plug-ins/imagemap/imap_preview.c index 3ea085705c..7d45ecfb45 100644 --- a/plug-ins/imagemap/imap_preview.c +++ b/plug-ins/imagemap/imap_preview.c @@ -176,15 +176,17 @@ preview_unset_tmp_obj (Object_t *obj) } void -preview_zoom(Preview_t *preview, gint zoom_factor) +preview_zoom (Preview_t *preview, + gfloat zoom_factor) { - preview->widget_width = preview->width * zoom_factor; - preview->widget_height = preview->height * zoom_factor; - gtk_widget_set_size_request (preview->preview, preview->widget_width, - preview->widget_height); - gtk_widget_queue_resize(preview->window); - render_preview(preview, preview->drawable); - preview_redraw(); + preview->widget_width = ceil (preview->width * zoom_factor); + preview->widget_height = ceil (preview->height * zoom_factor); + + gtk_widget_set_size_request (preview->preview, preview->widget_width, + preview->widget_height); + gtk_widget_queue_resize (preview->window); + render_preview (preview, preview->drawable); + preview_redraw (); } GdkCursorType diff --git a/plug-ins/imagemap/imap_preview.h b/plug-ins/imagemap/imap_preview.h index f970cc6720..5c59ad4628 100644 --- a/plug-ins/imagemap/imap_preview.h +++ b/plug-ins/imagemap/imap_preview.h @@ -31,26 +31,27 @@ typedef struct { GtkWidget *preview; GtkWidget *hruler; GtkWidget *vruler; - gint width; - gint height; - gint widget_width; - gint widget_height; + gint width; + gint height; + gint widget_width; + gint widget_height; - GdkCursorType cursor; + GdkCursorType cursor; } Preview_t; -Preview_t *make_preview (GimpDrawable *drawable, - gpointer imap); -void preview_redraw (void); +Preview_t * make_preview (GimpDrawable *drawable, + gpointer imap); +void preview_redraw (void); -void preview_unset_tmp_obj (Object_t *obj); -void preview_set_tmp_obj (Object_t *obj); +void preview_unset_tmp_obj (Object_t *obj); +void preview_set_tmp_obj (Object_t *obj); -gint preview_get_width(GtkWidget *preview); -gint preview_get_height(GtkWidget *preview); +gint preview_get_width (GtkWidget *preview); +gint preview_get_height (GtkWidget *preview); -void preview_zoom(Preview_t *preview, gint zoom_factor); -GdkCursorType preview_set_cursor(Preview_t *preview, - GdkCursorType cursor_type); +void preview_zoom (Preview_t *preview, + gfloat zoom_factor); +GdkCursorType preview_set_cursor (Preview_t *preview, + GdkCursorType cursor_type); #endif /* _IMAP_PREVIEW_H */ diff --git a/plug-ins/imagemap/imap_statusbar.c b/plug-ins/imagemap/imap_statusbar.c index d94207299a..d5c6987cd0 100644 --- a/plug-ins/imagemap/imap_statusbar.c +++ b/plug-ins/imagemap/imap_statusbar.c @@ -143,11 +143,16 @@ statusbar_clear_dimension(StatusBar_t *statusbar) } void -statusbar_set_zoom(StatusBar_t *statusbar, gint factor) +statusbar_set_zoom (StatusBar_t *statusbar, + gint factor) { - char scratch[16]; + char scratch[16]; - sprintf(scratch, "1:%d", factor); - gtk_statusbar_push(GTK_STATUSBAR(statusbar->zoom), statusbar->zoom_id, + if (factor > 0) + sprintf (scratch, "%d:1", factor); + else + sprintf (scratch, "1:%d", ((factor - 2) * -1)); + + gtk_statusbar_push (GTK_STATUSBAR (statusbar->zoom), statusbar->zoom_id, scratch); }