xref: /petsc/src/sys/classes/draw/utils/zoom.c (revision 9566063d113dddea24716c546802770db7481bc0)
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;
235f80ce2aSJacob Faibussowitsch   PetscErrorCode ierr;
245c6c1daeSBarry Smith 
255c6c1daeSBarry Smith   PetscFunctionBegin;
26*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw,&isnull));
275c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
285c6c1daeSBarry Smith 
29*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
30*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
31*9566063dSJacob Faibussowitsch   ierr = PetscDrawCollectiveBegin(draw);PetscCall(ierr);
32*9566063dSJacob Faibussowitsch   PetscCall((*func)(draw,ctx));
33*9566063dSJacob Faibussowitsch   ierr = PetscDrawCollectiveEnd(draw);PetscCall(ierr);
34*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
355c6c1daeSBarry Smith 
36*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetPause(draw,&dpause));
375c6c1daeSBarry Smith   if (dpause >= 0) {
38*9566063dSJacob Faibussowitsch     PetscCall(PetscSleep(dpause));
395c6c1daeSBarry Smith     goto theend;
405c6c1daeSBarry Smith   }
415c6c1daeSBarry Smith   if (dpause != -1) goto theend;
425c6c1daeSBarry Smith 
43*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetMouseButton(draw,&button,&xc,&yc,NULL,NULL));
44*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr));
459f80f0efSLisandro Dalcin   xmin = xl; xmax = xr; w = xr - xl;
469f80f0efSLisandro Dalcin   ymin = yl; ymax = yr; h = yr - yl;
475c6c1daeSBarry Smith 
48e118a51fSLisandro Dalcin   while (button != PETSC_BUTTON_NONE && button != PETSC_BUTTON_RIGHT) {
499f80f0efSLisandro Dalcin     switch (button) {
509f80f0efSLisandro Dalcin     case PETSC_BUTTON_LEFT:       scale = 0.5;   break;
519f80f0efSLisandro Dalcin     case PETSC_BUTTON_CENTER:     scale = 2.0;   break;
529f80f0efSLisandro Dalcin     case PETSC_BUTTON_WHEEL_UP:   scale = 8/10.; break;
539f80f0efSLisandro Dalcin     case PETSC_BUTTON_WHEEL_DOWN: scale = 10/8.; break;
549f80f0efSLisandro Dalcin     default:                      scale = 1.0;
559f80f0efSLisandro Dalcin     }
565c6c1daeSBarry Smith     xl = scale*(xl + w - xc) + xc - w*scale;
575c6c1daeSBarry Smith     xr = scale*(xr - w - xc) + xc + w*scale;
585c6c1daeSBarry Smith     yl = scale*(yl + h - yc) + yc - h*scale;
595c6c1daeSBarry Smith     yr = scale*(yr - h - yc) + yc + h*scale;
605c6c1daeSBarry Smith     w *= scale; h *= scale;
61*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawClear(draw));
62*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetCoordinates(draw,xl,yl,xr,yr));
63*9566063dSJacob Faibussowitsch     ierr = PetscDrawCollectiveBegin(draw);PetscCall(ierr);
64*9566063dSJacob Faibussowitsch     PetscCall((*func)(draw,ctx));
65*9566063dSJacob Faibussowitsch     ierr = PetscDrawCollectiveEnd(draw);PetscCall(ierr);
66*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawFlush(draw));
67*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawGetMouseButton(draw,&button,&xc,&yc,NULL,NULL));
685c6c1daeSBarry Smith   }
69*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw,xmin,ymin,xmax,ymax));
705c6c1daeSBarry Smith theend:
715c6c1daeSBarry Smith   PetscFunctionReturn(0);
725c6c1daeSBarry Smith }
73