15c6c1daeSBarry Smith 25c6c1daeSBarry Smith #include <petscdraw.h> /*I "petscdraw.h" I*/ 35c6c1daeSBarry Smith 45c6c1daeSBarry Smith /*@C 5811af0c4SBarry Smith PetscDrawZoom - Allows one to provide a function that gets called for zooming in on a drawing using the mouse buttons 65c6c1daeSBarry Smith 7811af0c4SBarry Smith Collective draw 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 16811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()` 175c6c1daeSBarry Smith @*/ 18d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawZoom(PetscDraw draw, PetscErrorCode (*func)(PetscDraw, void *), void *ctx) 19d71ae5a4SJacob Faibussowitsch { 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)); 26*3ba16761SJacob Faibussowitsch if (isnull) PetscFunctionReturn(PETSC_SUCCESS); 275c6c1daeSBarry Smith 289566063dSJacob Faibussowitsch PetscCall(PetscDrawCheckResizedWindow(draw)); 299566063dSJacob Faibussowitsch PetscCall(PetscDrawClear(draw)); 30d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 319566063dSJacob Faibussowitsch PetscCall((*func)(draw, ctx)); 32d0609cedSBarry 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)); 449371c9d4SSatish Balay xmin = xl; 459371c9d4SSatish Balay xmax = xr; 469371c9d4SSatish Balay w = xr - xl; 479371c9d4SSatish Balay ymin = yl; 489371c9d4SSatish Balay ymax = yr; 499371c9d4SSatish Balay h = yr - yl; 505c6c1daeSBarry Smith 51e118a51fSLisandro Dalcin while (button != PETSC_BUTTON_NONE && button != PETSC_BUTTON_RIGHT) { 529f80f0efSLisandro Dalcin switch (button) { 53d71ae5a4SJacob Faibussowitsch case PETSC_BUTTON_LEFT: 54d71ae5a4SJacob Faibussowitsch scale = 0.5; 55d71ae5a4SJacob Faibussowitsch break; 56d71ae5a4SJacob Faibussowitsch case PETSC_BUTTON_CENTER: 57d71ae5a4SJacob Faibussowitsch scale = 2.0; 58d71ae5a4SJacob Faibussowitsch break; 59d71ae5a4SJacob Faibussowitsch case PETSC_BUTTON_WHEEL_UP: 60d71ae5a4SJacob Faibussowitsch scale = 8 / 10.; 61d71ae5a4SJacob Faibussowitsch break; 62d71ae5a4SJacob Faibussowitsch case PETSC_BUTTON_WHEEL_DOWN: 63d71ae5a4SJacob Faibussowitsch scale = 10 / 8.; 64d71ae5a4SJacob Faibussowitsch break; 65d71ae5a4SJacob Faibussowitsch default: 66d71ae5a4SJacob Faibussowitsch scale = 1.0; 679f80f0efSLisandro Dalcin } 685c6c1daeSBarry Smith xl = scale * (xl + w - xc) + xc - w * scale; 695c6c1daeSBarry Smith xr = scale * (xr - w - xc) + xc + w * scale; 705c6c1daeSBarry Smith yl = scale * (yl + h - yc) + yc - h * scale; 715c6c1daeSBarry Smith yr = scale * (yr - h - yc) + yc + h * scale; 729371c9d4SSatish Balay w *= scale; 739371c9d4SSatish Balay h *= scale; 749566063dSJacob Faibussowitsch PetscCall(PetscDrawClear(draw)); 759566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw, xl, yl, xr, yr)); 76d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 779566063dSJacob Faibussowitsch PetscCall((*func)(draw, ctx)); 78d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 799566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 809566063dSJacob Faibussowitsch PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL)); 815c6c1daeSBarry Smith } 829566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw, xmin, ymin, xmax, ymax)); 835c6c1daeSBarry Smith theend: 84*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 855c6c1daeSBarry Smith } 86