xref: /petsc/src/sys/classes/draw/utils/zoom.c (revision d0609ced746bc51b019815ca91d747429db24893)
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 @*/
185c6c1daeSBarry Smith PetscErrorCode  PetscDrawZoom(PetscDraw draw,PetscErrorCode (*func)(PetscDraw,void*),void *ctx)
195c6c1daeSBarry Smith {
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));
265c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
275c6c1daeSBarry Smith 
289566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
299566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
30*d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
319566063dSJacob Faibussowitsch   PetscCall((*func)(draw,ctx));
32*d0609cedSBarry 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));
449f80f0efSLisandro Dalcin   xmin = xl; xmax = xr; w = xr - xl;
459f80f0efSLisandro Dalcin   ymin = yl; ymax = yr; h = yr - yl;
465c6c1daeSBarry Smith 
47e118a51fSLisandro Dalcin   while (button != PETSC_BUTTON_NONE && button != PETSC_BUTTON_RIGHT) {
489f80f0efSLisandro Dalcin     switch (button) {
499f80f0efSLisandro Dalcin     case PETSC_BUTTON_LEFT:       scale = 0.5;   break;
509f80f0efSLisandro Dalcin     case PETSC_BUTTON_CENTER:     scale = 2.0;   break;
519f80f0efSLisandro Dalcin     case PETSC_BUTTON_WHEEL_UP:   scale = 8/10.; break;
529f80f0efSLisandro Dalcin     case PETSC_BUTTON_WHEEL_DOWN: scale = 10/8.; break;
539f80f0efSLisandro Dalcin     default:                      scale = 1.0;
549f80f0efSLisandro Dalcin     }
555c6c1daeSBarry Smith     xl = scale*(xl + w - xc) + xc - w*scale;
565c6c1daeSBarry Smith     xr = scale*(xr - w - xc) + xc + w*scale;
575c6c1daeSBarry Smith     yl = scale*(yl + h - yc) + yc - h*scale;
585c6c1daeSBarry Smith     yr = scale*(yr - h - yc) + yc + h*scale;
595c6c1daeSBarry Smith     w *= scale; h *= scale;
609566063dSJacob Faibussowitsch     PetscCall(PetscDrawClear(draw));
619566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetCoordinates(draw,xl,yl,xr,yr));
62*d0609cedSBarry Smith     PetscDrawCollectiveBegin(draw);
639566063dSJacob Faibussowitsch     PetscCall((*func)(draw,ctx));
64*d0609cedSBarry Smith     PetscDrawCollectiveEnd(draw);
659566063dSJacob Faibussowitsch     PetscCall(PetscDrawFlush(draw));
669566063dSJacob Faibussowitsch     PetscCall(PetscDrawGetMouseButton(draw,&button,&xc,&yc,NULL,NULL));
675c6c1daeSBarry Smith   }
689566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw,xmin,ymin,xmax,ymax));
695c6c1daeSBarry Smith theend:
705c6c1daeSBarry Smith   PetscFunctionReturn(0);
715c6c1daeSBarry Smith }
72