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 user required data
13: Level: advanced
15: .seealso: `PetscDraw`, `PetscDrawCreate()`
16: @*/
17: PetscErrorCode PetscDrawZoom(PetscDraw draw, PetscErrorCode (*func)(PetscDraw, void *), void *ctx)
18: {
19: PetscDrawButton button;
20: PetscReal dpause, xc, yc, scale = 1.0, w, h, xr, xl, yr, yl, xmin, xmax, ymin, ymax;
21: PetscBool isnull;
23: PetscFunctionBegin;
24: PetscCall(PetscDrawIsNull(draw, &isnull));
25: if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
27: PetscCall(PetscDrawCheckResizedWindow(draw));
28: PetscCall(PetscDrawClear(draw));
29: PetscDrawCollectiveBegin(draw);
30: PetscCall((*func)(draw, ctx));
31: PetscDrawCollectiveEnd(draw);
32: PetscCall(PetscDrawFlush(draw));
34: PetscCall(PetscDrawGetPause(draw, &dpause));
35: if (dpause >= 0) {
36: PetscCall(PetscSleep(dpause));
37: goto theend;
38: }
39: if (dpause != -1) goto theend;
41: PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL));
42: PetscCall(PetscDrawGetCoordinates(draw, &xl, &yl, &xr, &yr));
43: xmin = xl;
44: xmax = xr;
45: w = xr - xl;
46: ymin = yl;
47: ymax = yr;
48: h = yr - yl;
50: while (button != PETSC_BUTTON_NONE && button != PETSC_BUTTON_RIGHT) {
51: switch (button) {
52: case PETSC_BUTTON_LEFT:
53: scale = 0.5;
54: break;
55: case PETSC_BUTTON_CENTER:
56: scale = 2.0;
57: break;
58: case PETSC_BUTTON_WHEEL_UP:
59: scale = 8 / 10.;
60: break;
61: case PETSC_BUTTON_WHEEL_DOWN:
62: scale = 10 / 8.;
63: break;
64: default:
65: scale = 1.0;
66: }
67: xl = scale * (xl + w - xc) + xc - w * scale;
68: xr = scale * (xr - w - xc) + xc + w * scale;
69: yl = scale * (yl + h - yc) + yc - h * scale;
70: yr = scale * (yr - h - yc) + yc + h * scale;
71: w *= scale;
72: h *= scale;
73: PetscCall(PetscDrawClear(draw));
74: PetscCall(PetscDrawSetCoordinates(draw, xl, yl, xr, yr));
75: PetscDrawCollectiveBegin(draw);
76: PetscCall((*func)(draw, ctx));
77: PetscDrawCollectiveEnd(draw);
78: PetscCall(PetscDrawFlush(draw));
79: PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL));
80: }
81: PetscCall(PetscDrawSetCoordinates(draw, xmin, ymin, xmax, ymax));
82: theend:
83: PetscFunctionReturn(PETSC_SUCCESS);
84: }