Commit: 27a2d5c8ea7ef641326f0fd850c55ccc02bdc28a
Author: Bastien Montagne
Date:   Tue Oct 20 17:59:12 2015 +0200
Branches: ui-align-rework
https://developer.blender.org/rB27a2d5c8ea7ef641326f0fd850c55ccc02bdc28a

Bunch of fixes and cleanup, also take into account non-alignable stuff (like 
separators),
they need to actually break alignment!

Tortured even more Dimensions panel of Scene buttons to have a really complex 
aligned layout.

Things work rather nice (much much nicer than with older code at least!), but 
there is still
a glitch in alignment in some cases, one pixel, though debug prints show it 
should be same value,
wonder, looks like some rouding stuff or so...

===================================================================

M       release/scripts/startup/bl_ui/properties_render.py
M       source/blender/editors/interface/interface.c
M       source/blender/editors/interface/interface_intern.h
M       source/blender/editors/interface/interface_layout.c
M       source/blender/editors/interface/interface_templates.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_render.py 
b/release/scripts/startup/bl_ui/properties_render.py
index 1192fa8..a59c77c 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -135,10 +135,11 @@ class RENDER_PT_dimensions(RenderButtonsPanel, Panel):
 
         row = col_a.row(align=True)
         row.menu("RENDER_MT_presets", 
text=bpy.types.RENDER_MT_presets.bl_label)
+        row.separator()
         row.operator("render.preset_add", text="", icon='ZOOMIN')
         row.operator("render.preset_add", text="", 
icon='ZOOMOUT').remove_active = True
 
-        split = col_a.split(align=True)
+        split = col_a.split(0.3333, align=True)
 
         col = split.column(align=True)
         sub = col.column(align=True)
@@ -159,8 +160,8 @@ class RENDER_PT_dimensions(RenderButtonsPanel, Panel):
         col = split.column(align=True)
         sub = col.column(align=True)
         sub.prop(scene, "frame_start")
-        #~ sub.prop(scene, "frame_end")
         sub.label("")
+        #~ sub.prop(scene, "frame_end")
         sub.prop(scene, "frame_step")
 
         sub.label(text="Frame Rate:")
@@ -173,8 +174,23 @@ class RENDER_PT_dimensions(RenderButtonsPanel, Panel):
         subrow.prop(rd, "frame_map_old", text="Old")
         subrow.prop(rd, "frame_map_new", text="New")
 
+        col = split.column(align=True)
+        
col.template_ID_preview(context.scene.objects.active.material_slots[0], 
"material")
+
         col_a.prop(scene, "frame_end")
 
+        col_a = layout.column(align=True)
+        sub = col_a.row(align=True)
+        sub.prop(rd, "resolution_x", text="X")
+        sub.prop(scene, "frame_start")
+        sub = col_a.row(align=True)
+        sub.prop(rd, "resolution_y", text="Y")
+        sub.label("")
+        sub = col_a.row(align=True)
+        sub.prop(rd, "resolution_percentage", text="")
+        sub.prop(scene, "frame_step")
+
+
 
 class RENDER_PT_antialiasing(RenderButtonsPanel, Panel):
     bl_label = "Anti-Aliasing"
diff --git a/source/blender/editors/interface/interface.c 
b/source/blender/editors/interface/interface.c
index dfde112..4e04810 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -42,6 +42,7 @@
 #include "DNA_screen_types.h"
 #include "DNA_userdef_types.h"
 
+#include "BLI_alloca.h"
 #include "BLI_math.h"
 #include "BLI_listbase.h"
 #include "BLI_string.h"
@@ -1251,8 +1252,8 @@ void UI_block_end_ex(const bContext *C, uiBlock *block, 
const int xy[2])
                UI_block_layout_resolve(block, NULL, NULL);
        }
 
-//     TIMEIT_BENCH(ui_block_align_calc(block), ui_block_align_calc);
-       ui_block_align_calc(block);
+       TIMEIT_BENCH(ui_block_align_calc(block), ui_block_align_calc);
+//     ui_block_align_calc(block);
 
        if ((block->flag & UI_BLOCK_LOOP) && (block->flag & 
UI_BLOCK_NUMSELECT)) {
                ui_menu_block_set_keyaccels(block); /* could use a different 
flag to check */
@@ -2937,7 +2938,7 @@ void UI_block_align_end(uiBlock *block)
        block->flag &= ~UI_BUT_ALIGN;  /* all 4 flags */
 }
 
-#if 1
+#ifdef NEW_ALIGN_CODE
 typedef struct uiButAlign {
        uiBut *but;
 
@@ -2960,10 +2961,10 @@ enum {
        RIGHT        = 2,
        DOWN         = 3,
 
-       STITCH_LEFT  = 1 << 4,
-       STITCH_TOP   = 1 << 5,
-       STITCH_RIGHT = 1 << 6,
-       STITCH_DOWN  = 1 << 7,
+       STITCH_LEFT  = 1 << LEFT,
+       STITCH_TOP   = 1 << TOP,
+       STITCH_RIGHT = 1 << RIGHT,
+       STITCH_DOWN  = 1 << DOWN,
 };
 
 #define OPPOSITE(_s) (((_s) + 2) % 4)
@@ -2996,7 +2997,7 @@ static int get_but_align_flag(const int i) {
 /* Only the shortest diff (if below acceptable limits) is set, other pointers 
are set to NULL. */
 static void buts_proximity_compute(uiButAlign *but1, uiButAlign *but2)
 {
-       const float max_delta = 0.5f * max_ii(UI_UNIT_Y, UI_UNIT_X);
+       const float max_delta = 0.45f * max_ii(UI_UNIT_Y, UI_UNIT_X);
        float delta;
        int i;
 
@@ -3013,15 +3014,32 @@ static void buts_proximity_compute(uiButAlign *but1, 
uiButAlign *but2)
                if (buts_share[i_share]) {
                        const int i_opp = OPPOSITE(i);
 
-                       delta = fabsf(*but1->borders[i] - 
*but2->borders[i_opp]);
+                       /* We rely on exact zero value here as an 'already 
processed' flag, so ensure we never actually
+                        * set a zero value at this stage. FLT_MIN is 
zero-enough for UI position computing. ;) */
+                       delta = max_ff(fabsf(*but1->borders[i] - 
*but2->borders[i_opp]), FLT_MIN);
                        if (delta < max_delta) {
                                if (delta <= but1->dists[i]) {
-                                       if (delta < but1->dists[i]) {
-                                               but1->neighbors[i] = but2;
-                                               but2->neighbors[i_opp] = but1;
+                                       const bool but1_can_align = 
ui_but_can_align(but1->but);
+                                       const bool but2_can_align = 
ui_but_can_align(but2->but);
+
+                                       if (!(but1_can_align || 
but2_can_align)) {
+                                               continue;
+                                       }
+
+                                       if ((but1_can_align && (delta < 
but1->dists[i])) || (delta < but2->dists[i])) {
+                                               if (but1_can_align && 
but2_can_align) {
+                                                       but1->neighbors[i] = 
but2;
+                                                       but2->neighbors[i_opp] 
= but1;
+                                               }
+                                               else if (but1_can_align) {
+                                                       but1->neighbors[i] = 
NULL;
+                                               }
+                                               else /* if (but2_can_align) */ {
+                                                       but2->neighbors[i_opp] 
= NULL;
+                                               }
                                                but1->dists[i] = 
but2->dists[i_opp] = delta;
                                        }
-                                       {
+                                       if (but1_can_align && but2_can_align) {
                                                const int i_s1 = SIDE1(i);
                                                const int i_s2 = SIDE2(i);
 
@@ -3053,31 +3071,32 @@ static void align_stitch_neighbors(
 {
        uiButAlign *butal_neighbor;
 
-       printf("%s\n", butal->but->str);
-       if (STREQ(butal->but->str, "Frame Step:")) {
-               printf("%s: main side %d, stride side %d: %f\n", 
butal->but->str, i, i_s1, butal->dists[i]);
-       }
+//     printf("%s (%d) (%f, %f)\n", butal->but->str[0] ? butal->but->str : 
"<noname>", i, *butal->borders[i], *butal->borders[i_opp]);
+//     if (STREQ(butal->but->str, "Frame Step: ")) {
+//             printf("%s: main side %d, stride side %d: %f\n", 
butal->but->str, i, i_s1, butal->dists[i]);
+//     }
 
        while ((butal->flags[i] & STITCH(i_s1)) &&
               (butal = butal->neighbors[i_s1]) &&
               (butal->flags[i] & STITCH(i_s2)))
        {
-               if (STREQ(butal->but->str, "Frame Step:")) {
-                       printf("%s: main side %d, stride side %d: %f\n", 
butal->but->str, i, i_s1, butal->dists[i]);
-               }
-               if (butal->dists[i]) {
-                       butal_neighbor = butal->neighbors[i];
-
-                       if (butal_neighbor) {
-                               butal->but->drawflag |= align;
-                               butal_neighbor->but->drawflag |= align_opp;
-                               *butal_neighbor->borders[i_opp] = co;
-                               butal_neighbor->dists[i_opp] = 0.0f;
-                       }
-                       *butal->borders[i] = co;
-                       butal->dists[i] = 0.0f;
+//             printf("\t%s\n", butal->but->str[0] ? butal->but->str : 
"<noname>");
+//             if (STREQ(butal->but->str, "Frame Step: ")) {
+//                     printf("%s: main side %d, stride side %d: %f (%f vs %f, 
%f)\n", butal->but->str, i, i_s1, butal->dists[i], co, *butal->borders[i], 
*butal->borders[i_opp]);
+//             }
+               butal_neighbor = butal->neighbors[i];
+
+               if (butal_neighbor) {
+                       butal->but->drawflag |= align;
+                       butal_neighbor->but->drawflag |= align_opp;
+                       *butal_neighbor->borders[i_opp] = co;
+                       butal_neighbor->dists[i_opp] = 0.0f;
                }
+               *butal->borders[i] = co;
+               butal->dists[i] = 0.0f;
+               butal->flags[i] &= ~(STITCH(i_s2));
        }
+//     printf("\n");
 }
 
 void ui_block_align_calc(uiBlock *block)
@@ -3093,7 +3112,7 @@ void ui_block_align_calc(uiBlock *block)
                /* clear old flag */
                but->drawflag &= ~UI_BUT_ALIGN;
 
-               if ((but->alignnr == 0) || !ui_but_can_align(but)) {
+               if (but->alignnr == 0) {
                        continue;
                }
                num_buttons++;
@@ -3103,10 +3122,11 @@ void ui_block_align_calc(uiBlock *block)
                return;
        }
 
-       but_align_array = MEM_callocN(sizeof(*but_align_array) * 
(size_t)num_buttons, __func__);
+       but_align_array = alloca(sizeof(*but_align_array) * 
(size_t)num_buttons);
+       memset(but_align_array, 0, sizeof(*but_align_array) * 
(size_t)num_buttons);
 
        for (but = block->buttons.first, but_align = but_align_array; but; but 
= but->next) {
-               if ((but->alignnr == 0) || !ui_but_can_align(but)) {
+               if (but->alignnr == 0) {
                        continue;
                }
 
@@ -3176,16 +3196,16 @@ void ui_block_align_calc(uiBlock *block)
                                                but_align_other->dists[j_opp] = 
0.0f;
                                        }
                                        *delta = 0.0f;
-
-                                       align_stitch_neighbors(but_align, j, 
j_opp, j_s1, j_s2, align, align_opp, co);
-                                       align_stitch_neighbors(but_align, j, 
j_opp, j_s2, j_s1, align, align_opp, co);
                                }
+                               else {
+                                       co = *but_align->borders[j];
+                               }
+
+                               align_stitch_neighbors(but_align, j, j_opp, 
j_s1, j_s2, align, align_opp, co);
+                               align_stitch_neighbors(but_align, j, j_opp, 
j_s2, j_s1, align, align_opp, co);
                        }
                }
        }
-
-       /* And we are done! */
-       MEM_freeN(but_align_array);
 }
 
 #else
diff --git a/source/blender/editors/interface/interface_intern.h 
b/source/blender/editors/interface/interface_intern.h
index a858a64..17df899 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -174,6 +174,9 @@ extern const short ui_radial_dir_to_angle[8];
 /* split numbuts by ':' and align l/r */
 #define USE_NUMBUTS_LR_ALIGN
 
+/* Use new 'align' computation code. */
+#define NEW_ALIGN_CODE
+
 /* PieMenuData->flags */
 enum {
        UI_PIE_DEGREES_RANGE_LARGE  = (1 << 0),  /* pie menu item collision is 
detected at 90 degrees */
diff --git a/source/blender/editors/interface/interface_layout.c 
b/source/blender/editors/interface/interface_layout.c
index 67b4f18..ae6870a 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -3012,7 +3012,9 @@ static void ui_item_align(uiLayout *litem, short nr)
        for (item = litem->items.last; item; item = item->prev) {
                if (item->type == ITEM_BUTTON) {
                        bitem = (uiButtonItem *)item;
+#ifndef NEW_ALIGN_CODE
                        if (ui_but_can_align(bitem->but))
+#endif
                                if (!bitem->but->alignnr)
                                        bitem->but->alignnr = nr;
                }
diff --git a/source/blender/editors/interface/interface_templates.c 
b/source/blender/editors/interface/interface_templates.c
index 1238b88..6df2383 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -393,7 +393,7 @@ static void template_ID(
        // lb = template->idlb;
 
        block = uiLayoutGetBlock(layout);
-       UI_block_align_begin(block);
+//

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