/** Ensure the object is visible but minimize scrolling */ gboolean ddisplay_present_object(DDisplay *ddisp, DiaObject *obj) { const Rectangle *r = dia_object_get_enclosing_box(obj); const Rectangle *v = &ddisp->visible; display_set_active(ddisp); if (!rectangle_in_rectangle(v, r)) { Point delta = { 0, 0 }; if ((r->right - r->left) > (v->right - v->left)) /* object bigger than visible area */ delta.x = (r->left - v->left + r->right - v->right) / 2; else if (r->left < v->left) delta.x = r->left - v->left; else if (r->right > v->right) delta.x = r->right - v->right; if ((r->bottom - r->top) > (v->bottom - v->top)) /* object bigger than visible area */ delta.y = (r->top - v->top + r->bottom - v->bottom) / 2; else if (r->top < v->top) delta.y = r->top - v->top; else if (r->bottom > v->bottom) delta.y = r->bottom - v->bottom; ddisplay_scroll(ddisp, &delta); return TRUE; } return FALSE; }
void ddisplay_scroll_right(DDisplay *ddisp) { Point delta; delta.x = (ddisp->visible.right - ddisp->visible.left)/4.0; delta.y = 0; ddisplay_scroll(ddisp, &delta); }
void ddisplay_scroll_down(DDisplay *ddisp) { Point delta; delta.x = 0; delta.y = (ddisp->visible.bottom - ddisp->visible.top)/4.0; ddisplay_scroll(ddisp, &delta); }
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_Scroll(PyDiaDisplay *self, PyObject *args) { Point delta; if (!PyArg_ParseTuple(args, "dd:Display.scroll", &delta.x, &delta.y)) return NULL; ddisplay_scroll(self->disp, &delta); Py_INCREF(Py_None); return Py_None; }
/** Scroll display to have the diagram point p at the center. * Returns TRUE if anything changed. */ gboolean ddisplay_scroll_center_point(DDisplay *ddisp, Point *p) { Point center; g_return_val_if_fail (ddisp != NULL, FALSE); /* Find current center */ center.x = (ddisp->visible.right+ddisp->visible.left)/2; center.y = (ddisp->visible.top+ddisp->visible.bottom)/2; point_sub(p, ¢er); return ddisplay_scroll(ddisp, p); }
/** Scroll display to where point x,y (window coords) is visible */ gboolean ddisplay_autoscroll(DDisplay *ddisp, int x, int y) { guint16 width, height; Point scroll; if (! ddisp->autoscroll) return FALSE; scroll.x = scroll.y = 0; width = GTK_WIDGET(ddisp->canvas)->allocation.width; height = GTK_WIDGET(ddisp->canvas)->allocation.height; if (x < 0) { scroll.x = x; } else if ( x > width) { scroll.x = x - width; } if (y < 0) { scroll.y = y; } else if (y > height) { scroll.y = y - height; } if ((scroll.x != 0) || (scroll.y != 0)) { gboolean scrolled; scroll.x = ddisplay_untransform_length(ddisp, scroll.x); scroll.y = ddisplay_untransform_length(ddisp, scroll.y); scrolled = ddisplay_scroll(ddisp, &scroll); if (scrolled) { ddisplay_flush(ddisp); return TRUE; } } return FALSE; }