Revision: 53326
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53326
Author:   ton
Date:     2012-12-26 13:05:39 +0000 (Wed, 26 Dec 2012)
Log Message:
-----------
Region scrollbar fix!

Now scrollbars correctly hide and show, making space for the actual contents
in a region. It solves several old hacks, and puts view2d code a bit more
back in control as well. 

Implementation notes:

- The view2d mask feature is working again
- The #define V2D_SCROLL_HORIZONTAL_HIDE means: "turn on hiding".
- Code for UI_view2d_region_reinit() is enforcing better standard view settings

But... two hack/patches needed to be added:

- Region panel drawing: if after generating the button panels it appears
  a scroller hides or reveils, it calls all the generating code again.
  (a simple scale doesn't work due to rounding differences in layout code)

- View2d code that maps 'tot' and 'cur' rects: if this code detects that
  the mask changes, it calcs the map code again.

Also a bugfix (issue in 2.65)

- The left/bottom area split widget was drawing 1 pixel too large sometimes, 
  leaving bad trails on moving area dividers.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/versioning_250.c
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/include/UI_view2d.h
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/interface/interface_panel.c
    trunk/blender/source/blender/editors/interface/view2d.c
    trunk/blender/source/blender/editors/interface/view2d_ops.c
    trunk/blender/source/blender/editors/screen/area.c
    trunk/blender/source/blender/editors/space_action/action_draw.c
    trunk/blender/source/blender/editors/space_action/space_action.c
    trunk/blender/source/blender/editors/space_file/file_draw.c
    trunk/blender/source/blender/editors/space_graph/space_graph.c
    trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
    trunk/blender/source/blender/editors/space_outliner/outliner_intern.h
    trunk/blender/source/blender/editors/space_outliner/space_outliner.c
    trunk/blender/source/blender/editors/space_userpref/space_userpref.c
    trunk/blender/source/blender/makesdna/DNA_view2d_types.h
    trunk/blender/source/blender/windowmanager/intern/wm_window.c

Modified: trunk/blender/source/blender/blenloader/intern/versioning_250.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/versioning_250.c     
2012-12-26 01:50:01 UTC (rev 53325)
+++ trunk/blender/source/blender/blenloader/intern/versioning_250.c     
2012-12-26 13:05:39 UTC (rev 53326)
@@ -292,7 +292,7 @@
                                        memcpy(&ar->v2d, &soops->v2d, 
sizeof(View2D));
 
                                        ar->v2d.scroll &= ~V2D_SCROLL_LEFT;
-                                       ar->v2d.scroll |= 
(V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM_O);
+                                       ar->v2d.scroll |= 
(V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
                                        ar->v2d.align = 
(V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
                                        ar->v2d.keepzoom |= 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPASPECT);
                                        ar->v2d.keeptot = V2D_KEEPTOT_STRICT;
@@ -415,7 +415,7 @@
                                        ar->v2d.tot.ymax = ar->winy;
                                        ar->v2d.cur = ar->v2d.tot;
                                        ar->regiontype = RGN_TYPE_WINDOW;
-                                       ar->v2d.scroll = 
(V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM_O);
+                                       ar->v2d.scroll = 
(V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
                                        ar->v2d.align = 
(V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
                                        ar->v2d.keepzoom = 
(V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
                                        break;

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h 2012-12-26 
01:50:01 UTC (rev 53325)
+++ trunk/blender/source/blender/editors/include/UI_interface.h 2012-12-26 
13:05:39 UTC (rev 53326)
@@ -658,6 +658,7 @@
 
 struct Panel *uiBeginPanel(struct ScrArea *sa, struct ARegion *ar, uiBlock 
*block, struct PanelType *pt, int *open);
 void uiEndPanel(uiBlock *block, int width, int height);
+void uiScalePanels(struct ARegion *ar, float new_width);
 
 /* Handlers
  *

Modified: trunk/blender/source/blender/editors/include/UI_view2d.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_view2d.h    2012-12-26 
01:50:01 UTC (rev 53325)
+++ trunk/blender/source/blender/editors/include/UI_view2d.h    2012-12-26 
13:05:39 UTC (rev 53326)
@@ -148,7 +148,6 @@
 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);
 

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c  2012-12-26 
01:50:01 UTC (rev 53325)
+++ trunk/blender/source/blender/editors/interface/interface.c  2012-12-26 
13:05:39 UTC (rev 53326)
@@ -2666,6 +2666,8 @@
        
        /* we could do some more error checks here */
        if ((type & BUTTYPE) == LABEL) {
+               if ((poin != NULL || min != 0.0f || max != 0.0f || (a1 == 0.0f 
&& a2 != 0.0f) || (a1 != 0.0f && a1 != 1.0f)))
+                       printf("blah\n");
                BLI_assert((poin != NULL || min != 0.0f || max != 0.0f || (a1 
== 0.0f && a2 != 0.0f) || (a1 != 0.0f && a1 != 1.0f)) == FALSE);
        }
 

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c 
2012-12-26 01:50:01 UTC (rev 53325)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c 
2012-12-26 13:05:39 UTC (rev 53326)
@@ -5248,32 +5248,15 @@
         */
        if (ar->v2d.mask.xmin != ar->v2d.mask.xmax) {
                View2D *v2d = &ar->v2d;
-               rcti mask_rct;
                int mx, my;
                
                /* convert window coordinates to region coordinates */
                mx = x;
                my = y;
                ui_window_to_region(ar, &mx, &my);
-               
-               /* make a copy of the mask rect, and tweak accordingly for 
hidden scrollbars */
-               mask_rct = v2d->mask;
-               
-               if (v2d->scroll & (V2D_SCROLL_VERTICAL_HIDE | 
V2D_SCROLL_VERTICAL_FULLR)) {
-                       if (v2d->scroll & V2D_SCROLL_LEFT)
-                               mask_rct.xmin = v2d->vert.xmin;
-                       else if (v2d->scroll & V2D_SCROLL_RIGHT)
-                               mask_rct.xmax = v2d->vert.xmax;
-               }
-               if (v2d->scroll & (V2D_SCROLL_HORIZONTAL_HIDE | 
V2D_SCROLL_HORIZONTAL_FULLR)) {
-                       if (v2d->scroll & (V2D_SCROLL_BOTTOM | 
V2D_SCROLL_BOTTOM_O))
-                               mask_rct.ymin = v2d->hor.ymin;
-                       else if (v2d->scroll & V2D_SCROLL_TOP)
-                               mask_rct.ymax = v2d->hor.ymax;
-               }
-               
+
                /* check if in the rect */
-               if (!BLI_rcti_isect_pt(&mask_rct, mx, my)) 
+               if (!BLI_rcti_isect_pt(&v2d->mask, mx, my))
                        return 0;
        }
        

Modified: trunk/blender/source/blender/editors/interface/interface_panel.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_panel.c    
2012-12-26 01:50:01 UTC (rev 53325)
+++ trunk/blender/source/blender/editors/interface/interface_panel.c    
2012-12-26 13:05:39 UTC (rev 53326)
@@ -112,7 +112,7 @@
        else if (sa->spacetype == SPACE_FILE && ar->regiontype == 
RGN_TYPE_CHANNELS)
                return BUT_VERTICAL;
        else if (sa->spacetype == SPACE_IMAGE && ar->regiontype == 
RGN_TYPE_PREVIEW)
-               return BUT_VERTICAL; 
+               return BUT_VERTICAL;
        else if (ELEM3(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_TOOLS, 
RGN_TYPE_TOOL_PROPS))
                return BUT_VERTICAL;
        
@@ -812,8 +812,8 @@
 {
        Panel *pa;
        int align = panel_aligned(sa, ar);
-       int sizex = UI_PANEL_WIDTH;
-       int sizey = UI_PANEL_WIDTH;
+       int sizex = 0;
+       int sizey = 0;
 
        /* compute size taken up by panels, for setting in view2d */
        for (pa = ar->panels.first; pa; pa = pa->next) {
@@ -834,6 +834,11 @@
                }
        }
 
+       if (sizex == 0)
+               sizex = UI_PANEL_WIDTH;
+       if (sizey == 0)
+               sizey = -UI_PANEL_WIDTH;
+       
        *x = sizex;
        *y = sizey;
 }
@@ -956,6 +961,25 @@
        }
 }
 
+void uiScalePanels(ARegion *ar, float new_width)
+{
+       uiBlock *block;
+       uiBut *but;
+       
+       for (block = ar->uiblocks.first; block; block = block->next) {
+               if (block->panel) {
+                       float fac = new_width / (float)block->panel->sizex;
+                       printf("scaled %f\n", fac);
+                       block->panel->sizex = new_width;
+                       
+                       for (but = block->buttons.first; but; but = but->next) {
+                               but->rect.xmin *= fac;
+                               but->rect.xmax *= fac;
+                       }
+               }
+       }
+}
+
 /* ------------ panel merging ---------------- */
 
 static void check_panel_overlap(ARegion *ar, Panel *panel)

Modified: trunk/blender/source/blender/editors/interface/view2d.c
===================================================================
--- trunk/blender/source/blender/editors/interface/view2d.c     2012-12-26 
01:50:01 UTC (rev 53325)
+++ trunk/blender/source/blender/editors/interface/view2d.c     2012-12-26 
13:05:39 UTC (rev 53326)
@@ -60,6 +60,8 @@
 
 #include "interface_intern.h"
 
+static void ui_view2d_curRect_validate_resize(View2D *v2d, int resize, int 
mask_scrollers);
+
 /* *********************************************************************** */
 
 /* XXX still unresolved: scrolls hide/unhide vs region mask handling */
@@ -73,15 +75,15 @@
  */
 static int view2d_scroll_mapped(int scroll)
 {
-       if (scroll & V2D_SCROLL_HORIZONTAL_HIDE)
+       if (scroll & V2D_SCROLL_HORIZONTAL_FULLR)
                scroll &= ~(V2D_SCROLL_HORIZONTAL);
-       if (scroll & V2D_SCROLL_VERTICAL_HIDE)
+       if (scroll & V2D_SCROLL_VERTICAL_FULLR)
                scroll &= ~(V2D_SCROLL_VERTICAL);
        return scroll;
 }
 
 /* called each time cur changes, to dynamically update masks */
-static void view2d_masks(View2D *v2d)
+static void view2d_masks(View2D *v2d, int check_scrollers)
 {
        int scroll;
        
@@ -90,19 +92,26 @@
        v2d->mask.xmax = v2d->winx - 1; /* -1 yes! masks are pixels */
        v2d->mask.ymax = v2d->winy - 1;
 
-#if 0
-       /* XXX see above */
-       v2d->scroll &= ~(V2D_SCROLL_HORIZONTAL_HIDE | V2D_SCROLL_VERTICAL_HIDE);
-       /* check size if: */
-       if (v2d->scroll & V2D_SCROLL_HORIZONTAL)
-               if (!(v2d->scroll & V2D_SCROLL_SCALE_HORIZONTAL))
-                       if (BLI_rctf_size_x(&v2d->tot) <= 
BLI_rcti_size_x(&v2d->cur))
-                               v2d->scroll |= V2D_SCROLL_HORIZONTAL_HIDE;
-       if (v2d->scroll & V2D_SCROLL_VERTICAL)
-               if (!(v2d->scroll & V2D_SCROLL_SCALE_VERTICAL))
-                       if (BLI_rctf_size_y(&v2d->tot) <= 
BLI_rctf_size_y(&v2d->cur))
-                               v2d->scroll |= V2D_SCROLL_VERTICAL_HIDE;
-#endif
+       if (check_scrollers) {
+               /* check size if hiding flag is set: */
+               if (v2d->scroll & V2D_SCROLL_HORIZONTAL_HIDE) {
+                       if (!(v2d->scroll & V2D_SCROLL_SCALE_HORIZONTAL)) {
+                               if (BLI_rctf_size_x(&v2d->tot) > 
BLI_rctf_size_x(&v2d->cur))
+                                       v2d->scroll &= 
~V2D_SCROLL_HORIZONTAL_FULLR;
+                               else
+                                       v2d->scroll |= 
V2D_SCROLL_HORIZONTAL_FULLR;
+                       }
+               }
+               if (v2d->scroll & V2D_SCROLL_VERTICAL_HIDE) {
+                       if (!(v2d->scroll & V2D_SCROLL_SCALE_VERTICAL)) {
+                               if (BLI_rctf_size_y(&v2d->tot) + 0.01f > 
BLI_rctf_size_y(&v2d->cur))
+                                       v2d->scroll &= 
~V2D_SCROLL_VERTICAL_FULLR;
+                               else
+                                       v2d->scroll |= 
V2D_SCROLL_VERTICAL_FULLR;
+                       }
+               }
+       }
+       
        scroll = view2d_scroll_mapped(v2d->scroll);
        
        /* scrollers shrink mask area, but should be based off regionsize 
@@ -126,8 +135,8 @@
                }
                
                /* horizontal scroller */
-               if (scroll & (V2D_SCROLL_BOTTOM | V2D_SCROLL_BOTTOM_O)) {
-                       /* on bottom edge of region (V2D_SCROLL_BOTTOM_O is 
outliner, the other is for standard) */
+               if (scroll & (V2D_SCROLL_BOTTOM)) {
+                       /* on bottom edge of region */
                        v2d->hor = v2d->mask;
                        v2d->hor.ymax = V2D_SCROLL_HEIGHT;
                        v2d->mask.ymin = v2d->hor.ymax + 1;
@@ -142,8 +151,8 @@
                /* adjust vertical scroller if there's a horizontal scroller, 
to leave corner free */
                if (scroll & V2D_SCROLL_VERTICAL) {
                        /* just set y min/max for vertical scroller to y 
min/max of mask as appropriate */
-                       if (scroll & (V2D_SCROLL_BOTTOM | V2D_SCROLL_BOTTOM_O)) 
{
-                               /* on bottom edge of region 
(V2D_SCROLL_BOTTOM_O is outliner, the other is for standard) */
+                       if (scroll & (V2D_SCROLL_BOTTOM)) {
+                               /* on bottom edge of region */
                                v2d->vert.ymin = v2d->mask.ymin;
                        }
                        else if (scroll & V2D_SCROLL_TOP) {
@@ -152,7 +161,6 @@
                        }
                }
        }
-       
 }
 
 /* Refresh and Validation */
@@ -165,163 +173,173 @@
  */
 void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
 {
-       short tot_changed = 0, init = 0;
+       short tot_changed = 0, do_init;
        uiStyle *style = UI_GetStyle();
 
-       /* initialize data if there is a need for such */
-       if ((v2d->flag & V2D_IS_INITIALISED) == 0) {
-               /* set initialized flag so that View2D doesn't get 
reinitialised next time again */
-               v2d->flag |= V2D_IS_INITIALISED;
-
-               init = 1;
+       do_init = (v2d->flag & V2D_IS_INITIALISED) == 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