Revision: 17772 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17772 Author: aligorith Date: 2008-12-10 10:07:15 +0100 (Wed, 10 Dec 2008)
Log Message: ----------- View2D - Bugfixes Fixed a few typos in View2D code, which included the zoom-locking flags not being checked for correctly by the zoom operators. This commit does NOT fix the problems with the Outliner 'cur' rect expanding/contracting as the view changes size. I still haven't found the cause of this, but it might be related to the off-by-1 errors with UI-widgets that brecht noted in TimeLine header... Modified Paths: -------------- branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h branches/blender2.5/blender/source/blender/editors/interface/view2d.c branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c Modified: branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h =================================================================== --- branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h 2008-12-10 05:41:21 UTC (rev 17771) +++ branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h 2008-12-10 09:07:15 UTC (rev 17772) @@ -89,10 +89,9 @@ /* refresh and validation (of view rects) */ void UI_view2d_size_update(struct View2D *v2d, int winx, int winy); -void UI_view2d_status_enforce(struct View2D *v2d); - -void UI_view2d_totRect_set(struct View2D *v2d, int width, int height); +void UI_view2d_curRect_validate(struct View2D *v2d); void UI_view2d_curRect_reset(struct View2D *v2d); +void UI_view2d_totRect_set(struct View2D *v2d, int width, int height); /* view matrix operations */ void UI_view2d_view_ortho(const struct bContext *C, struct View2D *v2d); Modified: branches/blender2.5/blender/source/blender/editors/interface/view2d.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/interface/view2d.c 2008-12-10 05:41:21 UTC (rev 17771) +++ branches/blender2.5/blender/source/blender/editors/interface/view2d.c 2008-12-10 09:07:15 UTC (rev 17772) @@ -78,7 +78,7 @@ else if (v2d->scroll & V2D_SCROLL_RIGHT) { /* on right-hand edge of region */ v2d->vert= v2d->mask; - v2d->vert.xmin= v2d->vert.xmax-V2D_SCROLL_WIDTH; + v2d->vert.xmin= v2d->vert.xmax - V2D_SCROLL_WIDTH; v2d->mask.xmax= v2d->vert.xmin; } @@ -92,7 +92,7 @@ else if (v2d->scroll & V2D_SCROLL_TOP) { /* on upper edge of region */ v2d->hor= v2d->mask; - v2d->hor.ymin= v2d->hor.ymax-V2D_SCROLL_HEIGHT; + v2d->hor.ymin= v2d->hor.ymax - V2D_SCROLL_HEIGHT; v2d->mask.ymax= v2d->hor.ymin; } } @@ -102,17 +102,16 @@ * - cur is not allowed to be: larger than max, smaller than min, or outside of tot */ // XXX pre2.5 -> this used to be called test_view2d() -// XXX FIXME - this is an old mess function... let's rewrite! -void UI_view2d_status_enforce(View2D *v2d) +void UI_view2d_curRect_validate(View2D *v2d) { /* cur is not allowed to be larger than max, smaller than min, or outside of tot */ float totwidth, totheight, curwidth, curheight, width, height; - int winx, winy; + float winx, winy; rctf *cur, *tot; /* use mask as size of region that View2D resides in, as it takes into account scrollbars already */ - winx= v2d->mask.xmax - v2d->mask.xmin + 1; - winy= v2d->mask.ymax - v2d->mask.ymin + 1; + winx= (float)(v2d->mask.xmax - v2d->mask.xmin + 1); + winy= (float)(v2d->mask.ymax - v2d->mask.ymin + 1); /* get pointers to rcts for less typing */ cur= &v2d->cur; @@ -122,7 +121,7 @@ * - cur must not fall outside of tot * - axis locks (zoom and offset) must be maintained * - zoom must not be excessive (check either sizes or zoom values) - * - aspect ratio should be respected + * - aspect ratio should be respected (NOTE: this is quite closely realted to zoom too) */ /* Step 1: if keepzoom, adjust the sizes of the rects only @@ -136,9 +135,9 @@ /* if zoom is locked, size on the appropriate axis is reset to mask size */ if (v2d->keepzoom & V2D_LOCKZOOM_X) - width= (float)winy; + width= winx; if (v2d->keepzoom & V2D_LOCKZOOM_Y) - height= (float)winx; + height= winy; /* keepzoom (V2D_KEEPZOOM set), indicates that zoom level on each axis must not exceed limits * NOTE: in general, it is not expected that the lock-zoom will be used in conjunction with this @@ -147,14 +146,14 @@ float zoom, fac; /* check if excessive zoom on x-axis */ - zoom= (float)winx / width; + zoom= winx / width; if ((zoom < v2d->minzoom) || (zoom > v2d->maxzoom)) { fac= (zoom < v2d->minzoom) ? (zoom / v2d->minzoom) : (zoom / v2d->maxzoom); width *= fac; } /* check if excessive zoom on y-axis */ - zoom= (float)winy / height; + zoom= winy / height; if ((zoom < v2d->minzoom) || (zoom > v2d->maxzoom)) { fac= (zoom < v2d->minzoom) ? (zoom / v2d->minzoom) : (zoom / v2d->maxzoom); height *= fac; @@ -171,16 +170,14 @@ short do_x=0, do_y=0, do_cur, do_win; float curRatio, winRatio; - // XXX this is old code here to be cleaned up still /* when a window edge changes, the aspect ratio can't be used to * find which is the best new 'cur' rect. thats why it stores 'old' */ if (winx != v2d->oldwinx) do_x= 1; if (winy != v2d->oldwiny) do_y= 1; - /* here dx is cur ratio, while dy is win ratio */ curRatio= height / width; - winRatio= ((float)winy) / ((float)winx); + winRatio= winy / winx; /* both sizes change (area/region maximised) */ if (do_x == do_y) { @@ -233,20 +230,19 @@ float temp, dh; /* resize around 'center' of frame */ - // FIXME: maybe we should just scale down on min? if (width != curwidth) { - temp= (cur->xmax + cur->xmin) / 2.0f; - dh= (width - curwidth) * 0.5f; + temp= (cur->xmax + cur->xmin) * 0.5f; + dh= width * 0.5f; - cur->xmin -= dh; - cur->xmax += dh; + cur->xmin = temp - dh; + cur->xmax = temp + dh; } if (height != curheight) { - temp= (cur->ymax + cur->ymin) / 2.0f; - dh= (height - curheight) * 0.5f; + temp= (cur->ymax + cur->ymin) * 0.5f; + dh= height * 0.5f; - cur->ymin -= dh; - cur->ymax += dh; + cur->ymin = temp - dh; + cur->ymax = temp + dh; } } @@ -284,6 +280,7 @@ temp= cur->xmax - tot->xmax; if ((cur->xmin - temp) < tot->xmin) { + /* only offset by difference from cur-min and tot-min */ temp= cur->xmin - tot->xmin; cur->xmin -= temp; @@ -342,7 +339,7 @@ cur->ymax += temp; } else if (cur->ymax > tot->ymax) { - /* there's still space remaining, so shift up */ + /* there's still space remaining, so shift down */ temp= cur->ymax - tot->ymax; cur->ymin -= temp; @@ -354,101 +351,101 @@ /* ------------------ */ -/* Change the size of the maximum viewable area (i.e. 'tot' rect) */ -void UI_view2d_totRect_set(View2D *v2d, int width, int height) +/* Restore 'cur' rect to standard orientation (i.e. optimal maximum view of tot) */ +void UI_view2d_curRect_reset (View2D *v2d) { - /* don't do anything if either value is 0 */ - if (ELEM3(0, v2d, width, height)) - return; - + float width, height; + + /* assume width and height of 'cur' rect by default, should be same size as mask */ + width= (float)(v2d->mask.xmax - v2d->mask.xmin + 1); + height= (float)(v2d->mask.ymax - v2d->mask.ymin + 1); + /* handle width - posx and negx flags are mutually exclusive, so watch out */ if ((v2d->align & V2D_ALIGN_NO_POS_X) && !(v2d->align & V2D_ALIGN_NO_NEG_X)) { /* width is in negative-x half */ - v2d->tot.xmin= (float)-width; - v2d->tot.xmax= 0.0f; + v2d->cur.xmin= (float)-width; + v2d->cur.xmax= 0.0f; } else if ((v2d->align & V2D_ALIGN_NO_NEG_X) && !(v2d->align & V2D_ALIGN_NO_POS_X)) { /* width is in positive-x half */ - v2d->tot.xmin= 0.0f; - v2d->tot.xmax= (float)width; + v2d->cur.xmin= 0.0f; + v2d->cur.xmax= (float)width; } else { /* width is centered around x==0 */ const float dx= (float)width / 2.0f; - v2d->tot.xmin= -dx; - v2d->tot.xmax= dx; + v2d->cur.xmin= -dx; + v2d->cur.xmax= dx; } /* handle height - posx and negx flags are mutually exclusive, so watch out */ if ((v2d->align & V2D_ALIGN_NO_POS_Y) && !(v2d->align & V2D_ALIGN_NO_NEG_Y)) { /* height is in negative-y half */ - v2d->tot.ymin= (float)-height; - v2d->tot.ymax= 0.0f; + v2d->cur.ymin= (float)-height; + v2d->cur.ymax= 0.0f; } else if ((v2d->align & V2D_ALIGN_NO_NEG_Y) && !(v2d->align & V2D_ALIGN_NO_POS_Y)) { /* height is in positive-y half */ - v2d->tot.ymin= 0.0f; - v2d->tot.ymax= (float)height; + v2d->cur.ymin= 0.0f; + v2d->cur.ymax= (float)height; } else { /* height is centered around y==0 */ const float dy= (float)height / 2.0f; - v2d->tot.ymin= -dy; - v2d->tot.ymax= dy; + v2d->cur.ymin= -dy; + v2d->cur.ymax= dy; } - - /* make sure that 'cur' rect is in a valid state as a result of these changes */ - UI_view2d_status_enforce(v2d); } -/* Restore 'cur' rect to standard orientation (i.e. optimal maximum view of tot) */ -void UI_view2d_curRect_reset (View2D *v2d) +/* Change the size of the maximum viewable area (i.e. 'tot' rect) */ +void UI_view2d_totRect_set (View2D *v2d, int width, int height) { - float width, height; + /* don't do anything if either value is 0 */ + if (ELEM3(0, v2d, width, height)) + return; - /* assume width and height of 'cur' rect by default, should be same size as mask */ - width= (float)(v2d->mask.xmax - v2d->mask.xmin + 1); - height= (float)(v2d->mask.ymax - v2d->mask.ymin + 1); - /* handle width - posx and negx flags are mutually exclusive, so watch out */ if ((v2d->align & V2D_ALIGN_NO_POS_X) && !(v2d->align & V2D_ALIGN_NO_NEG_X)) { /* width is in negative-x half */ - v2d->cur.xmin= (float)-width; - v2d->cur.xmax= 0.0f; + v2d->tot.xmin= (float)-width; + v2d->tot.xmax= 0.0f; } else if ((v2d->align & V2D_ALIGN_NO_NEG_X) && !(v2d->align & V2D_ALIGN_NO_POS_X)) { /* width is in positive-x half */ - v2d->cur.xmin= 0.0f; - v2d->cur.xmax= (float)width; + v2d->tot.xmin= 0.0f; + v2d->tot.xmax= (float)width; } else { /* width is centered around x==0 */ const float dx= (float)width / 2.0f; - v2d->cur.xmin= -dx; - v2d->cur.xmax= dx; + v2d->tot.xmin= -dx; + v2d->tot.xmax= dx; } /* handle height - posx and negx flags are mutually exclusive, so watch out */ if ((v2d->align & V2D_ALIGN_NO_POS_Y) && !(v2d->align & V2D_ALIGN_NO_NEG_Y)) { /* height is in negative-y half */ - v2d->cur.ymin= (float)-height; - v2d->cur.ymax= 0.0f; + v2d->tot.ymin= (float)-height; + v2d->tot.ymax= 0.0f; } else if ((v2d->align & V2D_ALIGN_NO_NEG_Y) && !(v2d->align & V2D_ALIGN_NO_POS_Y)) { /* height is in positive-y half */ - v2d->cur.ymin= 0.0f; - v2d->cur.ymax= (float)height; + v2d->tot.ymin= 0.0f; + v2d->tot.ymax= (float)height; } else { /* height is centered around y==0 */ const float dy= (float)height / 2.0f; - v2d->cur.ymin= -dy; - v2d->cur.ymax= dy; + v2d->tot.ymin= -dy; + v2d->tot.ymax= dy; } + + /* make sure that 'cur' rect is in a valid state as a result of these changes */ + UI_view2d_curRect_validate(v2d); } /* *********************************************************************** */ @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs