void ddisplay_show_all (DDisplay *ddisp) { Diagram *dia; real magnify_x, magnify_y; int width, height; Point middle; g_return_if_fail (ddisp != NULL); dia = ddisp->diagram; width = dia_renderer_get_width_pixels (ddisp->renderer); height = dia_renderer_get_height_pixels (ddisp->renderer); /* if there is something selected show that instead of all exisiting objects */ if (dia->data->selected) { GList *list = dia->data->selected; Rectangle extents = *dia_object_get_enclosing_box ((DiaObject*)list->data); list = g_list_next(list); while (list) { DiaObject *obj = (DiaObject *)list->data; rectangle_union(&extents, dia_object_get_enclosing_box (obj)); list = g_list_next(list); } magnify_x = (real)width / (extents.right - extents.left) / ddisp->zoom_factor; magnify_y = (real)height / (extents.bottom - extents.top) / ddisp->zoom_factor; middle.x = extents.left + (extents.right - extents.left) / 2.0; middle.y = extents.top + (extents.bottom - extents.top) / 2.0; } else { magnify_x = (real)width / (dia->data->extents.right - dia->data->extents.left) / ddisp->zoom_factor; magnify_y = (real)height / (dia->data->extents.bottom - dia->data->extents.top) / ddisp->zoom_factor; middle.x = dia->data->extents.left + (dia->data->extents.right - dia->data->extents.left) / 2.0; middle.y = dia->data->extents.top + (dia->data->extents.bottom - dia->data->extents.top) / 2.0; } ddisplay_zoom (ddisp, &middle, ((magnify_x<magnify_y)?magnify_x:magnify_y)/1.05); ddisplay_update_scrollbars(ddisp); ddisplay_add_update_all(ddisp); ddisplay_flush(ddisp); }
/** 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 object_add_updates(DiaObject *obj, Diagram *dia) { int i; /* Bounding box */ if (data_object_get_highlight(dia->data,obj) != DIA_HIGHLIGHT_NONE) { diagram_add_update_with_border(dia, dia_object_get_enclosing_box (obj), 5); } else { diagram_add_update(dia, dia_object_get_enclosing_box (obj)); } /* Handles */ for (i=0; i<obj->num_handles; i++) { handle_add_update(obj->handles[i], dia); } /* Connection points */ for (i=0; i<dia_object_get_num_connections(obj); ++i) { connectionpoint_add_update(obj->connections[i], dia); } }