Revision: 17737
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17737
Author:   aligorith
Date:     2008-12-07 13:15:04 +0100 (Sun, 07 Dec 2008)

Log Message:
-----------
View2D: Scroller Manipulations

Implemented operator to work with scrollers. This should work reasonably well, 
but as always, more testing is needed.
* LMB-drag can now be used to initiate manipulations of scrollbars (so they can 
be dragged as per normal)
* By clicking on the 'dark regions' on the ends of the scroll bubble, it is 
possible to zoom the view (in a way similar to Sony Vegas scrollbars)

Tidied up code of other operators
* Re-labelled the current zoom operators, as there is still a modal click-drag 
zoom tool to be ported still
* Marked all of the existing view manipulation operators as redoable. Scrollers 
manipulator is not allowed to be redoable. 

Assorted changes:
* Added more flags for Outliner on reading old files, to prevent more weird 
things happening as code expects certain flags these days

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    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/makesdna/DNA_view2d_types.h

Modified: 
branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c     
2008-12-07 10:55:33 UTC (rev 17736)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c     
2008-12-07 12:15:04 UTC (rev 17737)
@@ -5078,6 +5078,7 @@
                                ar->v2d.scroll &= ~V2D_SCROLL_LEFT;
                                ar->v2d.scroll |= V2D_SCROLL_RIGHT;
                                ar->v2d.align = 
(V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
+                               ar->v2d.keepzoom |= 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y);
                        }
                                break;
                        case SPACE_TIME:

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-07 10:55:33 UTC (rev 17736)
+++ branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h      
2008-12-07 12:15:04 UTC (rev 17737)
@@ -33,7 +33,7 @@
 #define UI_VIEW2D_H
 
 /* ------------------------------------------ */
-/* Settings:                                                           */
+/* Settings and Defines:                                       */
 
 /* generic value to use when coordinate lies out of view when converting */
 #define V2D_IS_CLIPPED 12000
@@ -41,6 +41,7 @@
 /* 'dummy' argument to pass when argument is irrelevant */
 #define V2D_ARG_DUMMY          -1
 
+
 /* grid-units (for drawing time) */
 #define V2D_UNIT_SECONDS       0
 #define V2D_UNIT_FRAMES                1

Modified: branches/blender2.5/blender/source/blender/editors/interface/view2d.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/view2d.c       
2008-12-07 10:55:33 UTC (rev 17736)
+++ branches/blender2.5/blender/source/blender/editors/interface/view2d.c       
2008-12-07 12:15:04 UTC (rev 17737)
@@ -732,7 +732,10 @@
 /* *********************************************************************** */
 /* Scrollbars */
 
-/* View2DScrollers is typedef'd in UI_view2d.h */
+/* View2DScrollers is typedef'd in UI_view2d.h 
+ * WARNING: the start of this struct must not change, as view2d_ops.c uses 
this too. 
+ *                For now, we don't need to have a separate (internal) header 
for structs like this...
+ */
 struct View2DScrollers {       
                /* focus bubbles */
        int vert_min, vert_max; /* vertical scrollbar */
@@ -769,11 +772,11 @@
                scrollsize= hor.xmax - hor.xmin;
                
                fac= (v2d->cur.xmin- v2d->tot.xmin) / totsize;
-               //if (fac < 0.0f) fac= 0.0f;
+               if (fac < 0.0f) fac= 0.0f;
                scrollers->hor_min= hor.xmin + (fac * scrollsize);
                
                fac= (v2d->cur.xmax - v2d->tot.xmin) / totsize;
-               //if (fac > 1.0f) fac= 1.0f;
+               if (fac > 1.0f) fac= 1.0f;
                scrollers->hor_max= hor.xmin + (fac * scrollsize);
                
                if (scrollers->hor_min > scrollers->hor_max) 
@@ -787,11 +790,11 @@
                scrollsize= vert.ymax - vert.ymin;
                
                fac= (v2d->cur.ymin- v2d->tot.ymin) / totsize;
-               //if (fac < 0.0f) fac= 0.0f;
+               if (fac < 0.0f) fac= 0.0f;
                scrollers->vert_min= vert.ymin + (fac * scrollsize);
                
                fac= (v2d->cur.ymax - v2d->tot.ymin) / totsize;
-               //if (fac > 1.0f) fac= 1.0f;
+               if (fac > 1.0f) fac= 1.0f;
                scrollers->vert_max= vert.ymin + (fac * scrollsize);
                
                if (scrollers->vert_min > scrollers->vert_max) 
@@ -806,11 +809,15 @@
                scrollers->yclamp= yclamp;
                scrollers->yunits= yunits;
                
-               /* calculate grid */
-               if (v2d->scroll & V2D_SCROLL_SCALE_HORIZONTAL)
-                       scrollers->grid= UI_view2d_grid_calc(C, v2d, xunits, 
xclamp, (hor.xmax - hor.xmin), (vert.ymax - vert.ymin));
-               else if (v2d->scroll & V2D_SCROLL_SCALE_VERTICAL)
-                       scrollers->grid= UI_view2d_grid_calc(C, v2d, yunits, 
yclamp, (hor.xmax - hor.xmin), (vert.ymax - vert.ymin));
+               /* calculate grid only if clamping + units are valid arguments 
*/
+               if ( !((xclamp == V2D_ARG_DUMMY) && (xunits == V2D_ARG_DUMMY) 
&& (yclamp == V2D_ARG_DUMMY) && (yunits == V2D_ARG_DUMMY)) ) { 
+                       /* if both axes show scale, give priority to 
horizontal.. */
+                       // FIXME: this doesn't do justice to the vertical 
scroller calculations...
+                       if (v2d->scroll & V2D_SCROLL_SCALE_HORIZONTAL)
+                               scrollers->grid= UI_view2d_grid_calc(C, v2d, 
xunits, xclamp, (hor.xmax - hor.xmin), (vert.ymax - vert.ymin));
+                       else if (v2d->scroll & V2D_SCROLL_SCALE_VERTICAL)
+                               scrollers->grid= UI_view2d_grid_calc(C, v2d, 
yunits, yclamp, (hor.xmax - hor.xmin), (vert.ymax - vert.ymin));
+               }
        }
        
        /* return scrollers */

Modified: 
branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c   
2008-12-07 10:55:33 UTC (rev 17736)
+++ branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c   
2008-12-07 12:15:04 UTC (rev 17737)
@@ -98,7 +98,6 @@
  
 /* temp customdata for operator */
 typedef struct v2dViewPanData {
-       ARegion *region;                /* region we're operating in */
        View2D *v2d;                    /* view2d we're operating in */
        
        float facx, facy;               /* amount to move view relative to zoom 
*/
@@ -107,7 +106,7 @@
        int startx, starty;             /* mouse x/y values in window when 
operator was initiated */
        int lastx, lasty;               /* previous x/y values of mouse in 
window */
        
-       short in_scroller;              /* activated in scrollbar */
+       short in_scroller;              /* for MMB in scrollers (old feature in 
past, but now not that useful) */
 } v2dViewPanData;
  
 /* initialise panning customdata */
@@ -121,13 +120,13 @@
        /* regions now have v2d-data by default, so check for region */
        if (C->region == NULL)
                return 0;
+       ar= C->region;
        
        /* set custom-data for operator */
        vpd= MEM_callocN(sizeof(v2dViewPanData), "v2dViewPanData");
        op->customdata= vpd;
        
        /* set pointers to owners */
-       vpd->region= ar= C->region;
        vpd->v2d= v2d= &ar->v2d;
        
        /* calculate translation factor - based on size of view */
@@ -160,6 +159,9 @@
                v2d->cur.ymax += dy;
        }
        
+       /* validate that view is in valid configuration after this operation */
+       UI_view2d_status_enforce(v2d);
+       
        /* request updates to be done... */
        WM_event_add_notifier(C, WM_NOTE_AREA_REDRAW, 0, NULL);
        /* XXX: add WM_NOTE_TIME_CHANGED? */
@@ -299,6 +301,9 @@
        ot->invoke= view_pan_invoke;
        ot->modal= view_pan_modal;
        
+       /* operator is repeatable */
+       ot->flag= OPTYPE_REGISTER;
+       
        /* rna - must keep these in sync with the other operators */
        prop= RNA_def_property(ot->srna, "deltax", PROP_INT, PROP_NONE);
        prop= RNA_def_property(ot->srna, "deltay", PROP_INT, PROP_NONE);
@@ -335,6 +340,9 @@
        /* api callbacks */
        ot->exec= view_scrollright_exec;
        
+       /* operator is repeatable */
+       ot->flag= OPTYPE_REGISTER;
+       
        /* rna - must keep these in sync with the other operators */
        prop= RNA_def_property(ot->srna, "deltax", PROP_INT, PROP_NONE);
        prop= RNA_def_property(ot->srna, "deltay", PROP_INT, PROP_NONE);
@@ -371,6 +379,9 @@
        /* api callbacks */
        ot->exec= view_scrollleft_exec;
        
+       /* operator is repeatable */
+       ot->flag= OPTYPE_REGISTER;
+       
        /* rna - must keep these in sync with the other operators */
        prop= RNA_def_property(ot->srna, "deltax", PROP_INT, PROP_NONE);
        prop= RNA_def_property(ot->srna, "deltay", PROP_INT, PROP_NONE);
@@ -405,6 +416,9 @@
        /* api callbacks */
        ot->exec= view_scrolldown_exec;
        
+       /* operator is repeatable */
+       ot->flag= OPTYPE_REGISTER;
+       
        /* rna - must keep these in sync with the other operators */
        prop= RNA_def_property(ot->srna, "deltax", PROP_INT, PROP_NONE);
        prop= RNA_def_property(ot->srna, "deltay", PROP_INT, PROP_NONE);
@@ -441,60 +455,34 @@
        /* api callbacks */
        ot->exec= view_scrollup_exec;
        
+       /* operator is repeatable */
+       ot->flag= OPTYPE_REGISTER;
+       
        /* rna - must keep these in sync with the other operators */
        prop= RNA_def_property(ot->srna, "deltax", PROP_INT, PROP_NONE);
        prop= RNA_def_property(ot->srna, "deltay", PROP_INT, PROP_NONE);
 }
 
 /* ********************************************************* */
-/* VIEW ZOOMING OPERATOR                                                       
         */
+/* SINGLE-STEP VIEW ZOOMING OPERATOR                                           
 */
 
 /*     This group of operators come in several forms:
- *             1) Modal 'dragging' with MMB - where movement of mouse dictates 
amount to zoom view by
- *             2) Scrollwheel 'steps' - rolling mousewheel by one step moves 
view by predefined amount
+ *             1) Scrollwheel 'steps' - rolling mousewheel by one step zooms 
view by predefined amount
+ *             2) Scrollwheel 'steps' + alt + ctrl/shift - zooms view on one 
axis only (ctrl=x, shift=y)  // XXX this could be implemented...
  *             3) Pad +/- Keys - pressing each key moves the zooms the view by 
a predefined amount
  *
  *     In order to make sure this works, each operator must define the 
following RNA-Operator Props:
- *             zoomfacx, zoomfacy      - sometimes it's still useful to have 
non-uniform scaling  
+ *             zoomfacx, zoomfacy      - These two zoom factors allow for 
non-uniform scaling.
+ *                                                       It is safe to scale 
by 0, as these factors are used to determine
+ *                                                       amount to enlarge 
'cur' by
  */
 
-/* ------------------ Shared 'core' stuff ---------------------- */
-
-/* temp customdata for operator */
-typedef struct v2dViewZoomData {
-       ARegion *region;                /* region we're operating in */
-       View2D *v2d;                    /* view2d we're operating in */
-       
-       int startx, starty;             /* mouse x/y values in window when 
operator was initiated */
-       int lastx, lasty;               /* previous x/y values of mouse in 
window */
-} v2dViewZoomData;
+/* ------------------ 'Shared' stuff ------------------------ */
  
-/* initialise zooming customdata */
-static int view_zoom_init(bContext *C, wmOperator *op)
-{
-       v2dViewZoomData *vzd;
-       ARegion *ar;
-       
-       /* regions now have v2d-data by default, so check for region */
-       if (C->region == NULL)
-               return 0;
-       
-       /* set custom-data for operator */
-       vzd= MEM_callocN(sizeof(v2dViewZoomData), "v2dViewZoomData");
-       op->customdata= vzd;
-       
-       /* set pointers to owners */
-       vzd->region= ar= C->region;
-       vzd->v2d= &ar->v2d;
-       
-       return 1;
-}
-
 /* apply transform to view (i.e. adjust 'cur' rect) */
 static void view_zoom_apply(bContext *C, wmOperator *op)
 {
-       v2dViewZoomData *vzd= op->customdata;
-       View2D *v2d= vzd->v2d;
+       View2D *v2d= &C->region->v2d;
        float dx, dy;
        
        /* calculate amount to move view by */
@@ -502,7 +490,6 @@
        dy= (v2d->cur.ymax - v2d->cur.ymin) * (float)RNA_float_get(op->ptr, 
"zoomfacy");
        
        /* only move view on an axis if change is allowed */
-       // FIXME: this still only allows for zooming around 'center' of view... 
userdefined center is more useful!
        if ((v2d->keepofs & V2D_LOCKOFS_X)==0) {

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