Revision: 42007
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42007
Author:   blendix
Date:     2011-11-20 14:31:01 +0000 (Sun, 20 Nov 2011)
Log Message:
-----------
UI: fix issue with part of panels going offscreen after recent commit.

The code here was tricky, with ED_region_panels trying to match the complex
logic in uiAlignPanelStep, now refactored the code so it's avoided.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/interface/interface_panel.c
    trunk/blender/source/blender/editors/screen/area.c

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h 2011-11-20 
14:16:41 UTC (rev 42006)
+++ trunk/blender/source/blender/editors/include/UI_interface.h 2011-11-20 
14:31:01 UTC (rev 42007)
@@ -592,7 +592,8 @@
  * not clear yet so we postpone that. */
 
 void uiBeginPanels(const struct bContext *C, struct ARegion *ar);
-void uiEndPanels(const struct bContext *C, struct ARegion *ar);
+void uiEndPanels(const struct bContext *C, struct ARegion *ar, int *x, int *y);
+void uiDrawPanels(const struct bContext *C, struct ARegion *ar);
 
 struct Panel *uiBeginPanel(struct ScrArea *sa, struct ARegion *ar, uiBlock 
*block, struct PanelType *pt, int *open);
 void uiEndPanel(uiBlock *block, int width, int height);

Modified: trunk/blender/source/blender/editors/interface/interface_panel.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_panel.c    
2011-11-20 14:16:41 UTC (rev 42006)
+++ trunk/blender/source/blender/editors/interface/interface_panel.c    
2011-11-20 14:31:01 UTC (rev 42007)
@@ -779,7 +779,36 @@
        return done;
 }
 
+static void ui_panels_size(ScrArea *sa, ARegion *ar, int *x, int *y)
+{
+       Panel *pa;
+       int align= panel_aligned(sa, ar);
+       int sizex = UI_PANEL_WIDTH;
+       int sizey = UI_PANEL_WIDTH;
 
+       /* compute size taken up by panels, for setting in view2d */
+       for(pa= ar->panels.first; pa; pa= pa->next) {
+               if(pa->runtime_flag & PNL_ACTIVE) {
+                       int pa_sizex, pa_sizey;
+
+                       if(align==BUT_VERTICAL) {
+                               pa_sizex= pa->ofsx + pa->sizex;
+                               pa_sizey= get_panel_real_ofsy(pa);
+                       }
+                       else {
+                               pa_sizex= get_panel_real_ofsx(pa) + pa->sizex;
+                               pa_sizey= pa->ofsy + get_panel_size_y(pa);
+                       }
+
+                       sizex= MAX2(sizex, pa_sizex);
+                       sizey= MIN2(sizey, pa_sizey);
+               }
+       }
+
+       *x= sizex;
+       *y= sizey;
+}
+
 static void ui_do_animate(const bContext *C, Panel *panel)
 {
        uiHandlePanelData *data= panel->activedata;
@@ -818,7 +847,7 @@
 }
 
 /* only draws blocks with panels */
-void uiEndPanels(const bContext *C, ARegion *ar)
+void uiEndPanels(const bContext *C, ARegion *ar, int *x, int *y)
 {
        ScrArea *sa= CTX_wm_area(C);
        uiBlock *block;
@@ -871,7 +900,15 @@
        
        if(firstpa)
                firstpa->runtime_flag |= PNL_FIRST;
+       
+       /* compute size taken up by panel */
+       ui_panels_size(sa, ar, x, y);
+}
 
+void uiDrawPanels(const bContext *C, ARegion *ar)
+{
+       uiBlock *block;
+
        UI_ThemeClearColor(TH_BACK);
        
        /* draw panels, selected on top */

Modified: trunk/blender/source/blender/editors/screen/area.c
===================================================================
--- trunk/blender/source/blender/editors/screen/area.c  2011-11-20 14:16:41 UTC 
(rev 42006)
+++ trunk/blender/source/blender/editors/screen/area.c  2011-11-20 14:31:01 UTC 
(rev 42007)
@@ -1559,7 +1559,7 @@
        Panel *panel;
        View2D *v2d= &ar->v2d;
        View2DScrollers *scrollers;
-       int xco, yco, x, y, miny=0, w, em, header, triangle, open, newcontext= 
0;
+       int x, y, xco, yco, w, em, triangle, open, newcontext= 0;
 
        if(contextnr >= 0)
                newcontext= UI_view2d_tab_set(v2d, contextnr);
@@ -1573,9 +1573,6 @@
                em= (ar->type->prefsizex)? UI_UNIT_Y/2: UI_UNIT_Y;
        }
 
-       x= 0;
-       y= 0;
-
        /* create panels */
        uiBeginPanels(C, ar);
 
@@ -1594,16 +1591,12 @@
                        panel= uiBeginPanel(sa, ar, block, pt, &open);
 
                        /* bad fixed values */
-                       header= (pt->flag & PNL_NO_HEADER)? 0: UI_UNIT_Y;
                        triangle= (int)(UI_UNIT_Y * 1.1f);
 
-                       if(vertical)
-                               y -= header;
-
-                       if(pt->draw_header && header && (open || vertical)) {
+                       if(pt->draw_header && !(pt->flag & PNL_NO_HEADER) && 
(open || vertical)) {
                                /* for enabled buttons */
                                panel->layout= uiBlockLayout(block, 
UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER,
-                                       triangle, header+style->panelspace, 
header, 1, style);
+                                       triangle, UI_UNIT_Y+style->panelspace, 
UI_UNIT_Y, 1, style);
 
                                pt->draw_header(C, panel);
 
@@ -1641,30 +1634,11 @@
                        }
 
                        uiEndBlock(C, block);
-
-                       if(vertical) {
-                               if(pt->flag & PNL_NO_HEADER)
-                                       y += yco;
-                               else
-                                       y += yco;
-                       }
-                       else {
-                               x += w;
-                               miny= MIN2(y, yco-header);
-                       }
                }
        }
 
-       if(vertical)
-               x += w;
-       else
-               y= miny;
-       
-       /* in case there are no panels */
-       if(x == 0 || y == 0) {
-               x= UI_PANEL_WIDTH;
-               y= UI_PANEL_WIDTH;
-       }
+       /* align panels and return size */
+       uiEndPanels(C, ar, &x, &y);
 
        /* clear */
        UI_ThemeClearColor((ar->type->regionid == 
RGN_TYPE_PREVIEW)?TH_PREVIEW_BACK:TH_BACK);
@@ -1706,9 +1680,9 @@
        /* set the view */
        UI_view2d_view_ortho(v2d);
 
-       /* this does the actual drawing! */
-       uiEndPanels(C, ar);
-       
+       /* draw panels */
+       uiDrawPanels(C, ar);
+
        /* restore view matrix */
        UI_view2d_view_restore(C);
        

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to