xref: /petsc/src/sys/classes/draw/utils/zoom.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <petscdraw.h> /*I "petscdraw.h"  I*/
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith /*@C
5811af0c4SBarry Smith     PetscDrawZoom - Allows one to provide a function that gets called for zooming in on a drawing using the mouse buttons
65c6c1daeSBarry Smith 
7811af0c4SBarry Smith     Collective draw
85c6c1daeSBarry Smith 
95c6c1daeSBarry Smith     Input Parameters:
105c6c1daeSBarry Smith +   draw - the window where the graph will be made.
115c6c1daeSBarry Smith .   func - users function that draws the graphic
125c6c1daeSBarry Smith -   ctx - pointer to any user required data
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith   Level: advanced
155c6c1daeSBarry Smith 
16811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()`
175c6c1daeSBarry Smith @*/
18d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawZoom(PetscDraw draw, PetscErrorCode (*func)(PetscDraw, void *), void *ctx)
19d71ae5a4SJacob Faibussowitsch {
205c6c1daeSBarry Smith   PetscDrawButton button;
215c6c1daeSBarry Smith   PetscReal       dpause, xc, yc, scale = 1.0, w, h, xr, xl, yr, yl, xmin, xmax, ymin, ymax;
225c6c1daeSBarry Smith   PetscBool       isnull;
235c6c1daeSBarry Smith 
245c6c1daeSBarry Smith   PetscFunctionBegin;
259566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw, &isnull));
26*3ba16761SJacob Faibussowitsch   if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
275c6c1daeSBarry Smith 
289566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
299566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
30d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
319566063dSJacob Faibussowitsch   PetscCall((*func)(draw, ctx));
32d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
339566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
345c6c1daeSBarry Smith 
359566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetPause(draw, &dpause));
365c6c1daeSBarry Smith   if (dpause >= 0) {
379566063dSJacob Faibussowitsch     PetscCall(PetscSleep(dpause));
385c6c1daeSBarry Smith     goto theend;
395c6c1daeSBarry Smith   }
405c6c1daeSBarry Smith   if (dpause != -1) goto theend;
415c6c1daeSBarry Smith 
429566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL));
439566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetCoordinates(draw, &xl, &yl, &xr, &yr));
449371c9d4SSatish Balay   xmin = xl;
459371c9d4SSatish Balay   xmax = xr;
469371c9d4SSatish Balay   w    = xr - xl;
479371c9d4SSatish Balay   ymin = yl;
489371c9d4SSatish Balay   ymax = yr;
499371c9d4SSatish Balay   h    = yr - yl;
505c6c1daeSBarry Smith 
51e118a51fSLisandro Dalcin   while (button != PETSC_BUTTON_NONE && button != PETSC_BUTTON_RIGHT) {
529f80f0efSLisandro Dalcin     switch (button) {
53d71ae5a4SJacob Faibussowitsch     case PETSC_BUTTON_LEFT:
54d71ae5a4SJacob Faibussowitsch       scale = 0.5;
55d71ae5a4SJacob Faibussowitsch       break;
56d71ae5a4SJacob Faibussowitsch     case PETSC_BUTTON_CENTER:
57d71ae5a4SJacob Faibussowitsch       scale = 2.0;
58d71ae5a4SJacob Faibussowitsch       break;
59d71ae5a4SJacob Faibussowitsch     case PETSC_BUTTON_WHEEL_UP:
60d71ae5a4SJacob Faibussowitsch       scale = 8 / 10.;
61d71ae5a4SJacob Faibussowitsch       break;
62d71ae5a4SJacob Faibussowitsch     case PETSC_BUTTON_WHEEL_DOWN:
63d71ae5a4SJacob Faibussowitsch       scale = 10 / 8.;
64d71ae5a4SJacob Faibussowitsch       break;
65d71ae5a4SJacob Faibussowitsch     default:
66d71ae5a4SJacob Faibussowitsch       scale = 1.0;
679f80f0efSLisandro Dalcin     }
685c6c1daeSBarry Smith     xl = scale * (xl + w - xc) + xc - w * scale;
695c6c1daeSBarry Smith     xr = scale * (xr - w - xc) + xc + w * scale;
705c6c1daeSBarry Smith     yl = scale * (yl + h - yc) + yc - h * scale;
715c6c1daeSBarry Smith     yr = scale * (yr - h - yc) + yc + h * scale;
729371c9d4SSatish Balay     w *= scale;
739371c9d4SSatish Balay     h *= scale;
749566063dSJacob Faibussowitsch     PetscCall(PetscDrawClear(draw));
759566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetCoordinates(draw, xl, yl, xr, yr));
76d0609cedSBarry Smith     PetscDrawCollectiveBegin(draw);
779566063dSJacob Faibussowitsch     PetscCall((*func)(draw, ctx));
78d0609cedSBarry Smith     PetscDrawCollectiveEnd(draw);
799566063dSJacob Faibussowitsch     PetscCall(PetscDrawFlush(draw));
809566063dSJacob Faibussowitsch     PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL));
815c6c1daeSBarry Smith   }
829566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw, xmin, ymin, xmax, ymax));
835c6c1daeSBarry Smith theend:
84*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
855c6c1daeSBarry Smith }
86