Fix [#29018] Problem with multi-column dorpdown lists, when scrolling is enabled...
authorBastien Montagne <montagne29@wanadoo.fr>
Fri, 18 Nov 2011 23:10:56 +0000 (23:10 +0000)
committerBastien Montagne <montagne29@wanadoo.fr>
Fri, 18 Nov 2011 23:10:56 +0000 (23:10 +0000)
ui_popup_block_scrolltest needs to be aware whether uiblock is flip or not, to avoid hiding irrelevant items in multi-column scrolled menus...

source/blender/editors/interface/interface_regions.c

index 93e974ddb20b765064864bfe5fec61b9f4d57592..3d94fd4dc563d92b25725d2d011f6fe35a96418c 100644 (file)
@@ -1446,6 +1446,8 @@ static void ui_popup_block_clip(wmWindow *window, uiBlock *block)
 void ui_popup_block_scrolltest(uiBlock *block)
 {
        uiBut *bt;
+       /* Knowing direction is necessary for multi-column menus... */
+       int is_flip = (block->direction & UI_TOP) && !(block->flag & UI_BLOCK_NO_FLIP);
        
        block->flag &= ~(UI_BLOCK_CLIPBOTTOM|UI_BLOCK_CLIPTOP);
        
@@ -1462,9 +1464,9 @@ void ui_popup_block_scrolltest(uiBlock *block)
                        block->flag |= UI_BLOCK_CLIPBOTTOM;
                        /* make space for arrow */
                        if(bt->y2 < block->miny +10) {
-                               if(bt->next && bt->next->y1 > bt->y1)
+                               if(is_flip && bt->next && bt->next->y1 > bt->y1)
                                        bt->next->flag |= UI_SCROLLED;
-                               if(bt->prev && bt->prev->y1 > bt->y1)
+                               else if(!is_flip && bt->prev && bt->prev->y1 > bt->y1)
                                        bt->prev->flag |= UI_SCROLLED;
                        }
                }
@@ -1473,9 +1475,9 @@ void ui_popup_block_scrolltest(uiBlock *block)
                        block->flag |= UI_BLOCK_CLIPTOP;
                        /* make space for arrow */
                        if(bt->y1 > block->maxy -10) {
-                               if(bt->next && bt->next->y2 < bt->y2)
+                               if(!is_flip && bt->next && bt->next->y2 < bt->y2)
                                        bt->next->flag |= UI_SCROLLED;
-                               if(bt->prev && bt->prev->y2 < bt->y2)
+                               else if(is_flip && bt->prev && bt->prev->y2 < bt->y2)
                                        bt->prev->flag |= UI_SCROLLED;
                        }
                }