Actual source code: zoom.c
1: #include <petscdraw.h>
3: /*@C
4: PetscDrawZoom - Allows one to provide a function that gets called for zooming in on a drawing using the mouse buttons
6: Collective draw
8: Input Parameters:
9: + draw - the window where the graph will be made.
10: . func - users function that draws the graphic
11: - ctx - pointer to any application required data
13: Calling sequence of func:
14: + draw - the `PetscDraw` object to zoom on
15: - ctx - the context for the zooming operation
17: Level: advanced
19: .seealso: `PetscDraw`, `PetscDrawCreate()`
20: @*/
21: PetscErrorCode PetscDrawZoom(PetscDraw draw, PetscErrorCode (*func)(PetscDraw draw, PetscCtx ctx), PetscCtx ctx)
22: {
23: PetscDrawButton button;
24: PetscReal dpause, xc, yc, scale = 1.0, w, h, xr, xl, yr, yl, xmin, xmax, ymin, ymax;
25: PetscBool isnull;
27: PetscFunctionBegin;
28: PetscCall(PetscDrawIsNull(draw, &isnull));
29: if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
31: PetscCall(PetscDrawCheckResizedWindow(draw));
32: PetscCall(PetscDrawClear(draw));
33: PetscDrawCollectiveBegin(draw);
34: PetscCall((*func)(draw, ctx));
35: PetscDrawCollectiveEnd(draw);
36: PetscCall(PetscDrawFlush(draw));
38: PetscCall(PetscDrawGetPause(draw, &dpause));
39: if (dpause >= 0) {
40: PetscCall(PetscSleep(dpause));
41: goto theend;
42: }
43: if (dpause != -1) goto theend;
45: PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL));
46: PetscCall(PetscDrawGetCoordinates(draw, &xl, &yl, &xr, &yr));
47: xmin = xl;
48: xmax = xr;
49: w = xr - xl;
50: ymin = yl;
51: ymax = yr;
52: h = yr - yl;
54: while (button != PETSC_BUTTON_NONE && button != PETSC_BUTTON_RIGHT) {
55: switch (button) {
56: case PETSC_BUTTON_LEFT:
57: scale = 0.5;
58: break;
59: case PETSC_BUTTON_CENTER:
60: scale = 2.0;
61: break;
62: case PETSC_BUTTON_WHEEL_UP:
63: scale = 8 / 10.;
64: break;
65: case PETSC_BUTTON_WHEEL_DOWN:
66: scale = 10 / 8.;
67: break;
68: default:
69: scale = 1.0;
70: }
71: xl = scale * (xl + w - xc) + xc - w * scale;
72: xr = scale * (xr - w - xc) + xc + w * scale;
73: yl = scale * (yl + h - yc) + yc - h * scale;
74: yr = scale * (yr - h - yc) + yc + h * scale;
75: w *= scale;
76: h *= scale;
77: PetscCall(PetscDrawClear(draw));
78: PetscCall(PetscDrawSetCoordinates(draw, xl, yl, xr, yr));
79: PetscDrawCollectiveBegin(draw);
80: PetscCall((*func)(draw, ctx));
81: PetscDrawCollectiveEnd(draw);
82: PetscCall(PetscDrawFlush(draw));
83: PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL));
84: }
85: PetscCall(PetscDrawSetCoordinates(draw, xmin, ymin, xmax, ymax));
86: theend:
87: PetscFunctionReturn(PETSC_SUCCESS);
88: }