15c6c1daeSBarry Smith 25c6c1daeSBarry Smith #include <petscdraw.h> /*I "petscdraw.h" I*/ 35c6c1daeSBarry Smith 45c6c1daeSBarry Smith /*@C 5*811af0c4SBarry Smith PetscDrawZoom - Allows one to provide a function that gets called for zooming in on a drawing using the mouse buttons 65c6c1daeSBarry Smith 7*811af0c4SBarry 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 16*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()` 175c6c1daeSBarry Smith @*/ 189371c9d4SSatish Balay PetscErrorCode PetscDrawZoom(PetscDraw draw, PetscErrorCode (*func)(PetscDraw, void *), void *ctx) { 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)); 255c6c1daeSBarry Smith if (isnull) PetscFunctionReturn(0); 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) { 529f80f0efSLisandro Dalcin case PETSC_BUTTON_LEFT: scale = 0.5; break; 539f80f0efSLisandro Dalcin case PETSC_BUTTON_CENTER: scale = 2.0; break; 549f80f0efSLisandro Dalcin case PETSC_BUTTON_WHEEL_UP: scale = 8 / 10.; break; 559f80f0efSLisandro Dalcin case PETSC_BUTTON_WHEEL_DOWN: scale = 10 / 8.; break; 569f80f0efSLisandro Dalcin default: scale = 1.0; 579f80f0efSLisandro Dalcin } 585c6c1daeSBarry Smith xl = scale * (xl + w - xc) + xc - w * scale; 595c6c1daeSBarry Smith xr = scale * (xr - w - xc) + xc + w * scale; 605c6c1daeSBarry Smith yl = scale * (yl + h - yc) + yc - h * scale; 615c6c1daeSBarry Smith yr = scale * (yr - h - yc) + yc + h * scale; 629371c9d4SSatish Balay w *= scale; 639371c9d4SSatish Balay h *= scale; 649566063dSJacob Faibussowitsch PetscCall(PetscDrawClear(draw)); 659566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw, xl, yl, xr, yr)); 66d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 679566063dSJacob Faibussowitsch PetscCall((*func)(draw, ctx)); 68d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 699566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 709566063dSJacob Faibussowitsch PetscCall(PetscDrawGetMouseButton(draw, &button, &xc, &yc, NULL, NULL)); 715c6c1daeSBarry Smith } 729566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw, xmin, ymin, xmax, ymax)); 735c6c1daeSBarry Smith theend: 745c6c1daeSBarry Smith PetscFunctionReturn(0); 755c6c1daeSBarry Smith } 76