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 @*/ 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