Revision: 22031
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22031
Author:   blendix
Date:     2009-07-30 00:57:53 +0200 (Thu, 30 Jul 2009)

Log Message:
-----------
2.5: Buttons View

* When resizing the window, the top position is now preserved,
  instead of the center position.
* Fix zoom level not being preserved in various cases, when
  changing both with and height. This replaces some earlier code
  which did this at screen level but wasn't very reliable.
* Different tabs now each preserve their own scroll.
* When switching between tabs, it now scrolls to show as many
  buttons as possible, instead of possibly showing empty space.
  There is a trade-off here between doing that keeping the
  buttons in the same place, no ideal solution exists I think.
* Change zooming in/out to be symmetric, for example doing
  numpad + then - did not give the original zoom level back.
* Added some calls to avoid hanging tooltips when manipulating
  the view.

Internals:
* Added V2D_KEEPOFS_X and V2D_KEEPOFS_Y to keep the top/bottom
  rather than the center.
* Renamed V2D_KEEPZOOM to V2D_LIMITZOOM (seems more appropriate),
  and make V2D_KEEPZOOM preserve the zoom level.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    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
    branches/blender2.5/blender/source/blender/editors/screen/area.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    
branches/blender2.5/blender/source/blender/editors/space_buttons/space_buttons.c
    
branches/blender2.5/blender/source/blender/editors/space_console/space_console.c
    branches/blender2.5/blender/source/blender/editors/space_file/space_file.c
    branches/blender2.5/blender/source/blender/editors/space_graph/space_graph.c
    branches/blender2.5/blender/source/blender/editors/space_image/space_image.c
    branches/blender2.5/blender/source/blender/editors/space_info/space_info.c
    branches/blender2.5/blender/source/blender/editors/space_logic/space_logic.c
    branches/blender2.5/blender/source/blender/editors/space_nla/space_nla.c
    branches/blender2.5/blender/source/blender/editors/space_node/space_node.c
    
branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c
    
branches/blender2.5/blender/source/blender/editors/space_sequencer/space_sequencer.c
    branches/blender2.5/blender/source/blender/editors/space_text/space_text.c
    
branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_view2d_types.h

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c       
2009-07-29 22:37:33 UTC (rev 22030)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c       
2009-07-29 22:57:53 UTC (rev 22031)
@@ -179,6 +179,9 @@
                else
                        newar->regiondata= MEM_dupallocN(ar->regiondata);
        }
+
+       if(ar->v2d.tab_offset)
+               newar->v2d.tab_offset= MEM_dupallocN(ar->v2d.tab_offset);
        
        newar->panels.first= newar->panels.last= NULL;
        BLI_duplicatelist(&newar->panels, &ar->panels);
@@ -271,10 +274,14 @@
        }
        else if(ar->type && ar->type->free)
                ar->type->free(ar);
+       
+       if(ar->v2d.tab_offset) {
+               MEM_freeN(ar->v2d.tab_offset);
+               ar->v2d.tab_offset= NULL;
+       }
 
-       if(ar) {
+       if(ar)
                BLI_freelistN(&ar->panels);
-       }
 }
 
 /* not area itself */

Modified: 
branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c     
2009-07-29 22:37:33 UTC (rev 22030)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c     
2009-07-29 22:57:53 UTC (rev 22031)
@@ -4681,6 +4681,9 @@
                }
        }
        
+       ar->v2d.tab_offset= NULL;
+       ar->v2d.tab_num= 0;
+       ar->v2d.tab_cur= 0;
        ar->handlers.first= ar->handlers.last= NULL;
        ar->uiblocks.first= ar->uiblocks.last= NULL;
        ar->headerstr= NULL;
@@ -5654,7 +5657,7 @@
        
        /* initialise view2d data for header region, to allow panning */
        /* is copy from ui_view2d.c */
-       ar->v2d.keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+       ar->v2d.keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
        ar->v2d.keepofs = V2D_LOCKOFS_Y;
        ar->v2d.keeptot = V2D_KEEPTOT_STRICT; 
        ar->v2d.align = V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y;
@@ -5847,7 +5850,7 @@
                                memcpy(&ar->v2d, &snode->v2d, sizeof(View2D));
                                
                                ar->v2d.scroll= 
(V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
-                               ar->v2d.keepzoom= V2D_KEEPZOOM|V2D_KEEPASPECT;
+                               ar->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT;
                                break;
                        }
                        case SPACE_BUTS:
@@ -5868,7 +5871,7 @@
                                ar->regiontype= RGN_TYPE_WINDOW;
                                ar->v2d.scroll = 
(V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM_O);
                                ar->v2d.align = 
(V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
-                               ar->v2d.keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+                               ar->v2d.keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
                                break;
                        }
                        case SPACE_TEXT:
@@ -8199,7 +8202,7 @@
                                                        simasel->v2d.minzoom= 
0.5f;
                                                        simasel->v2d.maxzoom= 
1.21f;                                            
                                                        simasel->v2d.scroll= 0;
-                                                       simasel->v2d.keepzoom= 
V2D_KEEPZOOM|V2D_KEEPASPECT;
+                                                       simasel->v2d.keepzoom= 
V2D_LIMITZOOM|V2D_KEEPASPECT;
                                                        simasel->v2d.keeptot= 0;
                                                        simasel->prv_h = 96;
                                                        simasel->prv_w = 96;

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h      
2009-07-29 22:37:33 UTC (rev 22030)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h      
2009-07-29 22:57:53 UTC (rev 22031)
@@ -55,7 +55,7 @@
 void   ED_region_tag_redraw(struct ARegion *ar);
 void   ED_region_tag_redraw_partial(struct ARegion *ar, struct rcti *rct);
 void   ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *ar);
-void   ED_region_panels(const struct bContext *C, struct ARegion *ar, int 
vertical, char *context);
+void   ED_region_panels(const struct bContext *C, struct ARegion *ar, int 
vertical, char *context, int contextnr);
 void   ED_region_header_init(struct ARegion *ar);
 void   ED_region_header(const struct bContext *C, struct ARegion *ar);
 

Modified: branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h      
2009-07-29 22:37:33 UTC (rev 22030)
+++ branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h      
2009-07-29 22:57:53 UTC (rev 22031)
@@ -145,11 +145,16 @@
 void UI_view2d_region_reinit(struct View2D *v2d, short type, int winx, int 
winy);
 
 void UI_view2d_curRect_validate(struct View2D *v2d);
+void UI_view2d_curRect_validate_resize(struct View2D *v2d, int resize);
 void UI_view2d_curRect_reset(struct View2D *v2d);
 void UI_view2d_sync(struct bScreen *screen, struct ScrArea *sa, struct View2D 
*v2dcur, int flag);
 
 void UI_view2d_totRect_set(struct View2D *v2d, int width, int height);
+void UI_view2d_totRect_set_resize(struct View2D *v2d, int width, int height, 
int resize);
 
+/* per tab offsets, returns 1 if tab changed */
+int UI_view2d_tab_set(struct View2D *v2d, int tab);
+
 /* view matrix operations */
 void UI_view2d_view_ortho(const struct bContext *C, struct View2D *v2d);
 void UI_view2d_view_orthoSpecial(const struct bContext *C, struct View2D *v2d, 
short xaxis);

Modified: branches/blender2.5/blender/source/blender/editors/interface/view2d.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/view2d.c       
2009-07-29 22:37:33 UTC (rev 22030)
+++ branches/blender2.5/blender/source/blender/editors/interface/view2d.c       
2009-07-29 22:57:53 UTC (rev 22031)
@@ -154,13 +154,15 @@
  */
 void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
 {
-       short tot_changed= 0;
+       short tot_changed= 0, init= 0;
        uiStyle *style= U.uistyles.first;
 
        /* initialise data if there is a need for such */
        if ((v2d->flag & V2D_IS_INITIALISED) == 0) {
                /* set initialised flag so that View2D doesn't get 
reinitialised next time again */
                v2d->flag |= V2D_IS_INITIALISED;
+
+               init= 1;
                
                /* see eView2D_CommonViewTypes in UI_view2d.h for available 
view presets */
                switch (type) {
@@ -170,7 +172,7 @@
                        case V2D_COMMONVIEW_STANDARD:
                        {
                                /* for now, aspect ratio should be maintained, 
and zoom is clamped within sane default limits */
-                               v2d->keepzoom= (V2D_KEEPASPECT|V2D_KEEPZOOM);
+                               v2d->keepzoom= (V2D_KEEPASPECT|V2D_LIMITZOOM);
                                v2d->minzoom= 0.01f;
                                v2d->maxzoom= 1000.0f;
                                
@@ -197,7 +199,7 @@
                        case V2D_COMMONVIEW_LIST:
                        {
                                /* zoom + aspect ratio are locked */
-                               v2d->keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+                               v2d->keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
                                v2d->minzoom= v2d->maxzoom= 1.0f;
                                
                                /* tot rect has strictly regulated placement, 
and must only occur in +/- quadrant */
@@ -214,7 +216,7 @@
                        case V2D_COMMONVIEW_STACK:
                        {
                                /* zoom + aspect ratio are locked */
-                               v2d->keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+                               v2d->keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
                                v2d->minzoom= v2d->maxzoom= 1.0f;
                                
                                /* tot rect has strictly regulated placement, 
and must only occur in +/+ quadrant */
@@ -230,7 +232,7 @@
                        case V2D_COMMONVIEW_HEADER:
                        {
                                /* zoom + aspect ratio are locked */
-                               v2d->keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+                               v2d->keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
                                v2d->minzoom= v2d->maxzoom= 1.0f;
                                v2d->min[0]= v2d->max[0]= (float)(winx-1);
                                v2d->min[1]= v2d->max[1]= (float)(winy-1);
@@ -257,9 +259,10 @@
                                float panelzoom= (style) ? style->panelzoom : 
1.0f;
                                
                                /* for now, aspect ratio should be maintained, 
and zoom is clamped within sane default limits */
-                               v2d->keepzoom= (V2D_KEEPASPECT|V2D_KEEPZOOM);
+                               v2d->keepzoom= 
(V2D_KEEPASPECT|V2D_LIMITZOOM|V2D_KEEPZOOM);
                                v2d->minzoom= 0.5f;
                                v2d->maxzoom= 2.0f;
+                               //tot_changed= 1;
                                
                                v2d->align= 
(V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
                                v2d->keeptot= V2D_KEEPTOT_BOUNDS;
@@ -298,17 +301,16 @@
        
        /* set 'tot' rect before setting cur? */
        if (tot_changed) 
-               UI_view2d_totRect_set(v2d, winx, winy);
+               UI_view2d_totRect_set_resize(v2d, winx, winy, !init);
        else
-               UI_view2d_curRect_validate(v2d);
-       
+               UI_view2d_curRect_validate_resize(v2d, !init);
 }
 
 /* Ensure View2D rects remain in a viable configuration 
  *     - 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()
-void UI_view2d_curRect_validate(View2D *v2d)
+void UI_view2d_curRect_validate_resize(View2D *v2d, int resize)
 {
        float totwidth, totheight, curwidth, curheight, width, height;
        float winx, winy;
@@ -351,10 +353,30 @@
        if(winx<1) winx= 1;
        if(winy<1) winy= 1;
        
-       /* keepzoom (V2D_KEEPZOOM set), indicates that zoom level on each axis 
must not exceed limits 
+       /* V2D_LIMITZOOM indicates that zoom level should be preserved when the 
window size changes */
+       if (resize && (v2d->keepzoom & V2D_KEEPZOOM)) {
+               float zoom, oldzoom;
+
+               if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) {
+                       zoom= winx / width;
+                       oldzoom= v2d->oldwinx / curwidth;
+
+                       if(oldzoom != zoom)
+                               width *= zoom/oldzoom;
+               }
+
+               if ((v2d->keepzoom & V2D_LOCKZOOM_Y)==0) {
+                       zoom= winy / height;
+                       oldzoom= v2d->oldwiny / curheight;
+
+                       if(oldzoom != zoom)
+                               height *= zoom/oldzoom;
+               }
+       }
+       /* keepzoom (V2D_LIMITZOOM 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
         */
-       if (v2d->keepzoom & V2D_KEEPZOOM) {
+       else if (v2d->keepzoom & V2D_LIMITZOOM) {
                float zoom, fac;
                
                /* check if excessive zoom on x-axis */
@@ -460,11 +482,17 @@
        if ((width != curwidth) || (height != curheight)) {
                float temp, dh;
                
-               /* resize from centerpoint */
+               /* resize from centerpoint, unless otherwise specified */
                if (width != curwidth) {
                        if (v2d->keepofs & V2D_LOCKOFS_X) {
                                cur->xmax += width - (cur->xmax - cur->xmin);
                        }
+                       else if (v2d->keepofs & V2D_KEEPOFS_X) {
+                               if(v2d->align & V2D_ALIGN_NO_POS_X)
+                                       cur->xmin -= width - (cur->xmax - 
cur->xmin);
+                               else
+                                       cur->xmax += width - (cur->xmax - 
cur->xmin);
+                       }
                        else {
                                temp= (cur->xmax + cur->xmin) * 0.5f;
                                dh= width * 0.5f;
@@ -477,6 +505,12 @@
                        if (v2d->keepofs & V2D_LOCKOFS_Y) {
                                cur->ymax += height - (cur->ymax - cur->ymin);
                        }
+                       else if (v2d->keepofs & V2D_KEEPOFS_Y) {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to