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