xref: /petsc/src/sys/classes/draw/utils/zoom.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <petscdraw.h> /*I "petscdraw.h"  I*/
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith /*@C
55c6c1daeSBarry Smith     PetscDrawZoom - Allows one to create a graphic that users may zoom into.
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith     Collective on PetscDraw
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 
165c6c1daeSBarry Smith .seealso:
175c6c1daeSBarry Smith @*/
18*9371c9d4SSatish Balay PetscErrorCode PetscDrawZoom(PetscDraw draw, PetscErrorCode (*func)(PetscDraw, void *), void *ctx) {
195c6c1daeSBarry Smith   PetscDrawButton button;
205c6c1daeSBarry Smith   PetscReal       dpause, xc, yc, scale = 1.0, w, h, xr, xl, yr, yl, xmin, xmax, ymin, ymax;
215c6c1daeSBarry Smith   PetscBool       isnull;
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith   PetscFunctionBegin;
249566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw, &isnull));
255c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
265c6c1daeSBarry Smith 
279566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
289566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
29d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
309566063dSJacob Faibussowitsch   PetscCall((*func)(draw, ctx));
31d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
329566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
335c6c1daeSBarry Smith 
349566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetPause(draw, &dpause));
355c6c1daeSBarry Smith   if (dpause >= 0) {
369566063dSJacob Faibussowitsch     PetscCall(PetscSleep(dpause));
375c6c1daeSBarry Smith     goto theend;
385c6c1daeSBarry Smith   }
395c6c1daeSBarry Smith   if (dpause != -1) goto theend;
405c6c1daeSBarry Smith 
419566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL));
429566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetCoordinates(draw, &xl, &yl, &xr, &yr));
43*9371c9d4SSatish Balay   xmin = xl;
44*9371c9d4SSatish Balay   xmax = xr;
45*9371c9d4SSatish Balay   w    = xr - xl;
46*9371c9d4SSatish Balay   ymin = yl;
47*9371c9d4SSatish Balay   ymax = yr;
48*9371c9d4SSatish Balay   h    = yr - yl;
495c6c1daeSBarry Smith 
50e118a51fSLisandro Dalcin   while (button != PETSC_BUTTON_NONE && button != PETSC_BUTTON_RIGHT) {
519f80f0efSLisandro Dalcin     switch (button) {
529f80f0efSLisandro Dalcin     case PETSC_BUTTON_LEFT: scale = 0.5; break;
539f80f0efSLisandro Dalcin     case PETSC_BUTTON_CENTER: scale = 2.0; break;
549f80f0efSLisandro Dalcin     case PETSC_BUTTON_WHEEL_UP: scale = 8 / 10.; break;
559f80f0efSLisandro Dalcin     case PETSC_BUTTON_WHEEL_DOWN: scale = 10 / 8.; break;
569f80f0efSLisandro Dalcin     default: scale = 1.0;
579f80f0efSLisandro Dalcin     }
585c6c1daeSBarry Smith     xl = scale * (xl + w - xc) + xc - w * scale;
595c6c1daeSBarry Smith     xr = scale * (xr - w - xc) + xc + w * scale;
605c6c1daeSBarry Smith     yl = scale * (yl + h - yc) + yc - h * scale;
615c6c1daeSBarry Smith     yr = scale * (yr - h - yc) + yc + h * scale;
62*9371c9d4SSatish Balay     w *= scale;
63*9371c9d4SSatish Balay     h *= scale;
649566063dSJacob Faibussowitsch     PetscCall(PetscDrawClear(draw));
659566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetCoordinates(draw, xl, yl, xr, yr));
66d0609cedSBarry Smith     PetscDrawCollectiveBegin(draw);
679566063dSJacob Faibussowitsch     PetscCall((*func)(draw, ctx));
68d0609cedSBarry Smith     PetscDrawCollectiveEnd(draw);
699566063dSJacob Faibussowitsch     PetscCall(PetscDrawFlush(draw));
709566063dSJacob Faibussowitsch     PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL));
715c6c1daeSBarry Smith   }
729566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw, xmin, ymin, xmax, ymax));
735c6c1daeSBarry Smith theend:
745c6c1daeSBarry Smith   PetscFunctionReturn(0);
755c6c1daeSBarry Smith }
76