/* When using the mouse wheel button to zoom in and out, it is more intuitive to maintain the drawing zoom center-point based on the cursor position. This can help orientation and prevent the drawing from "jumping" around while zooming in and out. */ void ddisplay_zoom_centered(DDisplay *ddisp, Point *point, real magnify) { Rectangle *visible; real width, height; /* cursor position ratios */ real rx,ry; if ((ddisp->zoom_factor <= DDISPLAY_MIN_ZOOM) && (magnify<=1.0)) return; if ((ddisp->zoom_factor >= DDISPLAY_MAX_ZOOM) && (magnify>=1.0)) return; visible = &ddisp->visible; /* calculate cursor position ratios */ rx = (point->x-visible->left)/(visible->right - visible->left); ry = (point->y-visible->top)/(visible->bottom - visible->top); width = (visible->right - visible->left)/magnify; height = (visible->bottom - visible->top)/magnify; ddisp->zoom_factor *= magnify; /* set new origin based on the calculated ratios before zooming */ ddisplay_set_origo(ddisp, point->x-(width*rx),point->y-(height*ry)); ddisplay_update_scrollbars(ddisp); ddisplay_add_update_all(ddisp); ddisplay_flush(ddisp); update_zoom_status (ddisp); }
static void scroll_motion(ScrollTool *tool, GdkEventMotion *event, DDisplay *ddisp) { Point to; Point delta; /* set the cursor appropriately, and change use_hand if needed */ if (!tool->scrolling) { /* try to minimise the number of cursor type changes */ if ((event->state & GDK_SHIFT_MASK) != 0) { if (!tool->use_hand) { tool->use_hand = TRUE; if (!open_hand_cursor) open_hand_cursor = create_cursor(ddisp->canvas->window, hand_open_data_bits, hand_open_data_width, hand_open_data_height, hand_open_mask_bits, hand_open_data_width/2, hand_open_data_height/2); ddisplay_set_all_cursor(open_hand_cursor); } } else if (tool->use_hand) { tool->use_hand = FALSE; ddisplay_set_all_cursor(scroll_cursor); } return; } ddisplay_untransform_coords(ddisp, event->x, event->y, &to.x, &to.y); if (tool->use_hand) { delta = tool->last_pos; point_sub(&delta, &to); tool->last_pos = to; point_add(&tool->last_pos, &delta); /* we use this so you can scroll past the edge of the image */ point_add(&delta, &ddisp->origo); ddisplay_set_origo(ddisp, delta.x, delta.y); ddisplay_update_scrollbars(ddisp); ddisplay_add_update_all(ddisp); } else { delta = to; point_sub(&delta, &tool->last_pos); point_scale(&delta, 0.5); ddisplay_scroll(ddisp, &delta); tool->last_pos = to; } ddisplay_flush(ddisp); }
static PyObject * PyDiaDisplay_SetOrigion(PyDiaDisplay *self, PyObject *args) { double x, y; if (!PyArg_ParseTuple(args, "dd:Display.set_origion", &x, &y)) return NULL; ddisplay_set_origo(self->disp, x, y); Py_INCREF(Py_None); return Py_None; }
void ddisplay_resize_canvas(DDisplay *ddisp, int width, int height) { if (ddisp->renderer==NULL) { if (ddisp->aa_renderer) ddisp->renderer = new_aa_renderer (ddisp); else ddisp->renderer = new_gdk_renderer(ddisp); } dia_renderer_set_size(ddisp->renderer, gtk_widget_get_window(ddisp->canvas), width, height); ddisplay_set_origo(ddisp, ddisp->origo.x, ddisp->origo.y); ddisplay_add_update_all(ddisp); ddisplay_flush(ddisp); }
/** Scroll the display by delta (diagram coords) */ gboolean ddisplay_scroll(DDisplay *ddisp, Point *delta) { Rectangle *visible = &ddisp->visible; real width = visible->right - visible->left; real height = visible->bottom - visible->top; Rectangle extents = ddisp->diagram->data->extents; real ex_width = extents.right - extents.left; real ex_height = extents.bottom - extents.top; Point new_origo = ddisp->origo; point_add(&new_origo, delta); rectangle_union(&extents, visible); if (new_origo.x < extents.left - ex_width) new_origo.x = extents.left - ex_width; if (new_origo.x+width > extents.right + ex_width) new_origo.x = extents.right - width + ex_width; if (new_origo.y < extents.top - ex_height) new_origo.y = extents.top - ex_height; if (new_origo.y+height > extents.bottom + ex_height) new_origo.y = extents.bottom - height + ex_height; if ( (new_origo.x != ddisp->origo.x) || (new_origo.y != ddisp->origo.y) ) { ddisplay_set_origo(ddisp, new_origo.x, new_origo.y); ddisplay_update_scrollbars(ddisp); ddisplay_add_update_all(ddisp); return TRUE; } return FALSE; }
void ddisplay_zoom(DDisplay *ddisp, Point *point, real magnify) { Rectangle *visible; real width, height, old_zoom; visible = &ddisp->visible; if ((ddisp->zoom_factor <= DDISPLAY_MIN_ZOOM) && (magnify<=1.0)) return; if ((ddisp->zoom_factor >= DDISPLAY_MAX_ZOOM) && (magnify>=1.0)) return; old_zoom = ddisp->zoom_factor; ddisp->zoom_factor = old_zoom * magnify; /* clip once more */ if (ddisp->zoom_factor < DDISPLAY_MIN_ZOOM) ddisp->zoom_factor = DDISPLAY_MIN_ZOOM; else if (ddisp->zoom_factor > DDISPLAY_MAX_ZOOM) ddisp->zoom_factor = DDISPLAY_MAX_ZOOM; /* the real one used - after clipping */ magnify = ddisp->zoom_factor / old_zoom; width = (visible->right - visible->left)/magnify; height = (visible->bottom - visible->top)/magnify; ddisplay_set_origo(ddisp, point->x - width/2.0, point->y - height/2.0); ddisplay_update_scrollbars(ddisp); ddisplay_add_update_all(ddisp); ddisplay_flush(ddisp); update_zoom_status (ddisp); }