xref: /petsc/src/sys/classes/draw/utils/zoom.c (revision 4e8208cbcbc709572b8abe32f33c78b69c819375)
15c6c1daeSBarry Smith #include <petscdraw.h> /*I "petscdraw.h"  I*/
25c6c1daeSBarry Smith 
35c6c1daeSBarry Smith /*@C
4811af0c4SBarry Smith   PetscDrawZoom - Allows one to provide a function that gets called for zooming in on a drawing using the mouse buttons
55c6c1daeSBarry Smith 
6811af0c4SBarry Smith   Collective draw
75c6c1daeSBarry Smith 
85c6c1daeSBarry Smith   Input Parameters:
95c6c1daeSBarry Smith + draw - the window where the graph will be made.
105c6c1daeSBarry Smith . func - users function that draws the graphic
115c6c1daeSBarry Smith - ctx  - pointer to any user required data
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith   Level: advanced
145c6c1daeSBarry Smith 
15811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()`
165c6c1daeSBarry Smith @*/
PetscDrawZoom(PetscDraw draw,PetscErrorCode (* func)(PetscDraw,void *),PetscCtx ctx)17*2a8381b2SBarry Smith PetscErrorCode PetscDrawZoom(PetscDraw draw, PetscErrorCode (*func)(PetscDraw, void *), PetscCtx ctx)
18d71ae5a4SJacob Faibussowitsch {
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));
253ba16761SJacob Faibussowitsch   if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
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));
439371c9d4SSatish Balay   xmin = xl;
449371c9d4SSatish Balay   xmax = xr;
459371c9d4SSatish Balay   w    = xr - xl;
469371c9d4SSatish Balay   ymin = yl;
479371c9d4SSatish Balay   ymax = yr;
489371c9d4SSatish Balay   h    = yr - yl;
495c6c1daeSBarry Smith 
50e118a51fSLisandro Dalcin   while (button != PETSC_BUTTON_NONE && button != PETSC_BUTTON_RIGHT) {
519f80f0efSLisandro Dalcin     switch (button) {
52d71ae5a4SJacob Faibussowitsch     case PETSC_BUTTON_LEFT:
53d71ae5a4SJacob Faibussowitsch       scale = 0.5;
54d71ae5a4SJacob Faibussowitsch       break;
55d71ae5a4SJacob Faibussowitsch     case PETSC_BUTTON_CENTER:
56d71ae5a4SJacob Faibussowitsch       scale = 2.0;
57d71ae5a4SJacob Faibussowitsch       break;
58d71ae5a4SJacob Faibussowitsch     case PETSC_BUTTON_WHEEL_UP:
59d71ae5a4SJacob Faibussowitsch       scale = 8 / 10.;
60d71ae5a4SJacob Faibussowitsch       break;
61d71ae5a4SJacob Faibussowitsch     case PETSC_BUTTON_WHEEL_DOWN:
62d71ae5a4SJacob Faibussowitsch       scale = 10 / 8.;
63d71ae5a4SJacob Faibussowitsch       break;
64d71ae5a4SJacob Faibussowitsch     default:
65d71ae5a4SJacob Faibussowitsch       scale = 1.0;
669f80f0efSLisandro Dalcin     }
675c6c1daeSBarry Smith     xl = scale * (xl + w - xc) + xc - w * scale;
685c6c1daeSBarry Smith     xr = scale * (xr - w - xc) + xc + w * scale;
695c6c1daeSBarry Smith     yl = scale * (yl + h - yc) + yc - h * scale;
705c6c1daeSBarry Smith     yr = scale * (yr - h - yc) + yc + h * scale;
719371c9d4SSatish Balay     w *= scale;
729371c9d4SSatish Balay     h *= scale;
739566063dSJacob Faibussowitsch     PetscCall(PetscDrawClear(draw));
749566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetCoordinates(draw, xl, yl, xr, yr));
75d0609cedSBarry Smith     PetscDrawCollectiveBegin(draw);
769566063dSJacob Faibussowitsch     PetscCall((*func)(draw, ctx));
77d0609cedSBarry Smith     PetscDrawCollectiveEnd(draw);
789566063dSJacob Faibussowitsch     PetscCall(PetscDrawFlush(draw));
799566063dSJacob Faibussowitsch     PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL));
805c6c1daeSBarry Smith   }
819566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw, xmin, ymin, xmax, ymax));
825c6c1daeSBarry Smith theend:
833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
845c6c1daeSBarry Smith }
85