Revision: 24042
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24042
Author:   blendix
Date:     2009-10-21 22:58:10 +0200 (Wed, 21 Oct 2009)

Log Message:
-----------
UI: List Template tweaks to get it a bit more usable

* Mouse wheel now scrolls the list.
* Up/down key and alt mouse wheel change the active item.
* Adding/removing items from the list now automatically scrolls so the
  active item is in the view.
* Shift mouse wheel changes the size of the list widget to display more
  items. Lazy replacement for a proper grip.

* Shape key list now displays the influence value next to the name,
* Also fix the range of the value slider to match the defined min/max
  range.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/interface/interface_layout.c
    trunk/blender/source/blender/editors/interface/interface_regions.c
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/makesdna/DNA_screen_types.h
    trunk/blender/source/blender/makesrna/intern/rna_key.c
    trunk/blender/source/blender/makesrna/intern/rna_ui.c
    trunk/blender/source/blender/makesrna/intern/rna_ui_api.c

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h 2009-10-21 
17:56:26 UTC (rev 24041)
+++ trunk/blender/source/blender/editors/include/UI_interface.h 2009-10-21 
20:58:10 UTC (rev 24042)
@@ -148,6 +148,7 @@
 #define UI_BUT_LAST_ACTIVE     (1<<24)
 #define UI_BUT_UNDO                    (1<<25)
 #define UI_BUT_IMMEDIATE       (1<<26)
+#define UI_BUT_NO_TOOLTIP      (1<<27)
 
 #define UI_PANEL_WIDTH                 340
 #define UI_COMPACT_PANEL_WIDTH 160
@@ -603,16 +604,17 @@
 int uiLayoutGetWidth(uiLayout *layout);
 float uiLayoutGetScaleX(uiLayout *layout);
 float uiLayoutGetScaleY(uiLayout *layout);
-ListBase *uiLayoutBoxGetList(uiLayout *layout);
 
 /* layout specifiers */
 uiLayout *uiLayoutRow(uiLayout *layout, int align);
 uiLayout *uiLayoutColumn(uiLayout *layout, int align);
 uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, int align);
 uiLayout *uiLayoutBox(uiLayout *layout);
-uiLayout *uiLayoutListBox(uiLayout *layout);
-uiLayout *uiLayoutFree(uiLayout *layout, int align);
+uiLayout *uiLayoutListBox(uiLayout *layout, struct PointerRNA *ptr, struct 
PropertyRNA *prop,
+       struct PointerRNA *actptr, struct PropertyRNA *actprop);
+uiLayout *uiLayoutAbsolute(uiLayout *layout, int align);
 uiLayout *uiLayoutSplit(uiLayout *layout, float percentage);
+uiLayout *uiLayoutOverlap(uiLayout *layout);
 
 uiBlock *uiLayoutAbsoluteBlock(uiLayout *layout);
 
@@ -639,15 +641,8 @@
 void uiTemplate_view3d_select_faceselmenu(uiLayout *layout, struct bContext 
*C);
 void uiTemplateTextureImage(uiLayout *layout, struct bContext *C, struct Tex 
*tex);
 
-typedef struct uiListItem {
-       struct uiListItem *next, *prev;
+void uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA 
*ptr, char *propname, struct PointerRNA *activeptr, char *activeprop, int rows, 
int type);
 
-       struct PointerRNA data;
-       uiLayout *layout;
-} uiListItem;
-
-ListBase uiTemplateList(uiLayout *layout, struct bContext *C, struct 
PointerRNA *ptr, char *propname, struct PointerRNA *activeptr, char 
*activeprop, int rows, int type);
-
 /* items */
 void uiItemO(uiLayout *layout, char *name, int icon, char *opname);
 void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char 
*propname, int value);

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c 
2009-10-21 17:56:26 UTC (rev 24041)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c 
2009-10-21 20:58:10 UTC (rev 24042)
@@ -1944,8 +1944,11 @@
 {
        if(data->state == BUTTON_STATE_HIGHLIGHT) {
                if(ELEM4(event->type, LEFTMOUSE, PADENTER, RETKEY, 
EVT_BUT_OPEN) && event->val==KM_PRESS) {
-                       button_activate_state(C, but, 
BUTTON_STATE_TEXT_EDITING);
-                       return WM_UI_HANDLER_BREAK;
+                       if(but->dt == UI_EMBOSSN && !event->ctrl);
+                       else {
+                               button_activate_state(C, but, 
BUTTON_STATE_TEXT_EDITING);
+                               return WM_UI_HANDLER_BREAK;
+                       }
                }
        }
        else if(data->state == BUTTON_STATE_TEXT_EDITING) {
@@ -3653,15 +3656,35 @@
                        if(but->flag & UI_HIDDEN)
                                continue;
                        if(ui_but_contains_pt(but, mx, my))
-                               /* give precedence to already activated buttons 
*/
-                               if(!butover || (!butover->active && 
but->active))
-                                       butover= but;
+                               butover= but;
                }
        }
 
        return butover;
 }
 
+static uiBut *ui_list_find_mouse_over(ARegion *ar, int x, int y)
+{
+       uiBlock *block;
+       uiBut *but;
+       int mx, my;
+
+       if(!ui_mouse_inside_region(ar, x, y))
+               return NULL;
+
+       for(block=ar->uiblocks.first; block; block=block->next) {
+               mx= x;
+               my= y;
+               ui_window_to_block(ar, block, &mx, &my);
+
+               for(but=block->buttons.last; but; but= but->prev)
+                       if(but->type == LISTBOX && ui_but_contains_pt(but, mx, 
my))
+                               return but;
+       }
+
+       return NULL;
+}
+
 /* ****************** button state handling **************************/
 
 static int button_modal_state(uiHandleButtonState state)
@@ -4028,6 +4051,10 @@
                                        data->cancel= 1;
                                        button_activate_state(C, but, 
BUTTON_STATE_EXIT);
                                }
+                               else if(ui_but_find_mouse_over(ar, event->x, 
event->y) != but) {
+                                       data->cancel= 1;
+                                       button_activate_state(C, but, 
BUTTON_STATE_EXIT);
+                               }
                                else if(event->x!=event->prevx || 
event->y!=event->prevy) {
                                        /* re-enable tooltip on mouse move */
                                        ui_blocks_set_tooltips(ar, 1);
@@ -4151,6 +4178,71 @@
        return retval;
 }
 
+static int ui_handle_list_event(bContext *C, wmEvent *event, ARegion *ar)
+{
+       uiBut *but= ui_list_find_mouse_over(ar, event->x, event->y);
+       int retval= WM_UI_HANDLER_CONTINUE;
+       int value, min, max;
+
+       if(but && (event->val == KM_PRESS)) {
+               Panel *pa= but->block->panel;
+
+               if(ELEM(event->type, UPARROWKEY, DOWNARROWKEY) ||
+                  ((ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE) && 
event->alt))) {
+                       /* activate up/down the list */
+                       value= RNA_property_int_get(&but->rnapoin, 
but->rnaprop);
+
+                       if(ELEM(event->type, UPARROWKEY, WHEELUPMOUSE))
+                               value--;
+                       else
+                               value++;
+
+                       if(value < pa->list_scroll)
+                               pa->list_scroll= value;
+                       else if(value >= pa->list_scroll+pa->list_size)
+                               pa->list_scroll= value - pa->list_size + 1;
+
+                       RNA_property_int_range(&but->rnapoin, but->rnaprop, 
&min, &max);
+                       value= CLAMPIS(value, min, max);
+
+                       RNA_property_int_set(&but->rnapoin, but->rnaprop, 
value);
+                       RNA_property_update(C, &but->rnapoin, but->rnaprop);
+                       ED_region_tag_redraw(ar);
+
+                       retval= WM_UI_HANDLER_BREAK;
+               }
+               else if(ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE) && 
event->shift) {
+                       /* silly replacement for proper grip */
+                       if(pa->list_grip_size == 0)
+                               pa->list_grip_size= pa->list_size;
+
+                       if(event->type == WHEELUPMOUSE)
+                               pa->list_grip_size--;
+                       else
+                               pa->list_grip_size++;
+
+                       pa->list_grip_size= MAX2(pa->list_grip_size, 1);
+
+                       ED_region_tag_redraw(ar);
+
+                       retval= WM_UI_HANDLER_BREAK;
+               }
+               else if(ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE)) {
+                       /* list template will clamp */
+                       if(event->type == WHEELUPMOUSE)
+                               pa->list_scroll--;
+                       else
+                               pa->list_scroll++;
+
+                       ED_region_tag_redraw(ar);
+
+                       retval= WM_UI_HANDLER_BREAK;
+               }
+       }
+
+       return retval;
+}
+
 static void ui_handle_button_return_submenu(bContext *C, wmEvent *event, uiBut 
*but)
 {
        uiHandleButtonData *data;
@@ -4615,6 +4707,9 @@
        if(!but || !button_modal_state(but->active->state))
                retval= ui_handler_panel_region(C, event);
 
+       if(retval == WM_UI_HANDLER_CONTINUE)
+               retval= ui_handle_list_event(C, event, ar);
+
        if(retval == WM_UI_HANDLER_CONTINUE) {
                if(but)
                        retval= ui_handle_button_event(C, event, but);

Modified: trunk/blender/source/blender/editors/interface/interface_layout.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_layout.c   
2009-10-21 17:56:26 UTC (rev 24041)
+++ trunk/blender/source/blender/editors/interface/interface_layout.c   
2009-10-21 20:58:10 UTC (rev 24042)
@@ -98,6 +98,7 @@
        ITEM_LAYOUT_BOX,
        ITEM_LAYOUT_ABSOLUTE,
        ITEM_LAYOUT_SPLIT,
+       ITEM_LAYOUT_OVERLAP,
 
        ITEM_LAYOUT_ROOT
 #if 0
@@ -148,7 +149,6 @@
 typedef struct uiLayoutItemBx {
        uiLayout litem;
        uiBut *roundbox;
-       ListBase items;
 } uiLayoutItemBx;
 
 typedef struct uiLayoutItemSplt {
@@ -286,6 +286,7 @@
        switch(layout->item.type) {
                case ITEM_LAYOUT_ROW:
                case ITEM_LAYOUT_ROOT:
+               case ITEM_LAYOUT_OVERLAP:
                        return UI_LAYOUT_HORIZONTAL;
                case ITEM_LAYOUT_COLUMN:
                case ITEM_LAYOUT_COLUMN_FLOW:
@@ -362,7 +363,7 @@
                int cols= (len >= 20)? 2: 1;
                int colbuts= len/(2*cols);
 
-               uiBlockSetCurLayout(block, uiLayoutFree(layout, 0));
+               uiBlockSetCurLayout(block, uiLayoutAbsolute(layout, 0));
 
                unit= UI_UNIT_X*0.75;
                butw= unit;
@@ -390,7 +391,7 @@
                /* matrix layout */
                int row, col;
 
-               uiBlockSetCurLayout(block, uiLayoutFree(layout, 1));
+               uiBlockSetCurLayout(block, uiLayoutAbsolute(layout, 1));
 
                len= ceil(sqrt(len));
 
@@ -1869,6 +1870,42 @@
        litem->y= y;
 }
 
+/* overlap layout */
+static void ui_litem_estimate_overlap(uiLayout *litem)
+{
+       uiItem *item;
+       int itemw, itemh;
+
+       litem->w= 0;
+       litem->h= 0;
+
+       for(item=litem->items.first; item; item=item->next) {
+               ui_item_size(item, &itemw, &itemh);
+
+               litem->w= MAX2(itemw, litem->w);
+               litem->h= MAX2(itemh, litem->h);
+       }
+}
+
+static void ui_litem_layout_overlap(uiLayout *litem)
+{
+       uiItem *item;
+       int itemw, itemh, x, y;
+
+       x= litem->x;
+       y= litem->y;
+
+       for(item=litem->items.first; item; item=item->next) {
+               ui_item_size(item, &itemw, &itemh);
+               ui_item_position(item, x, y-itemh, litem->w, itemh);
+
+               litem->h= MAX2(litem->h, itemh);
+       }
+
+       litem->x= x;
+       litem->y= y - litem->h;
+}
+
 /* layout create functions */
 uiLayout *uiLayoutRow(uiLayout *layout, int align)
 {
@@ -1928,7 +1965,7 @@
        return &flow->litem;
 }
 
-static uiLayout *ui_layout_box(uiLayout *layout, int type)
+static uiLayoutItemBx *ui_layout_box(uiLayout *layout, int type)
 {
        uiLayoutItemBx *box;
 
@@ -1945,30 +1982,32 @@
 
        box->roundbox= uiDefBut(layout->root->block, type, 0, "", 0, 0, 0, 0, 
NULL, 0.0, 0.0, 0, 0, "");
 
-       return &box->litem;
+       return box;
 }
 
 uiLayout *uiLayoutBox(uiLayout *layout)
 {
-       return ui_layout_box(layout, ROUNDBOX);
+       return (uiLayout*)ui_layout_box(layout, ROUNDBOX);
 }
 
-uiLayout *uiLayoutListBox(uiLayout *layout)
+uiLayout *uiLayoutListBox(uiLayout *layout, PointerRNA *ptr, PropertyRNA 
*prop, PointerRNA *actptr, PropertyRNA *actprop)
 {
-       return ui_layout_box(layout, LISTBOX);
-}
+    uiLayoutItemBx *box= ui_layout_box(layout, LISTBOX);
+       uiBut *but= box->roundbox;
 
-ListBase *uiLayoutBoxGetList(uiLayout *layout)
-{
-       uiLayoutItemBx *box= (uiLayoutItemBx*)layout;
-       return &box->items;
+       but->rnasearchpoin= *ptr;
+       but->rnasearchprop= prop;
+       but->rnapoin= *actptr;
+       but->rnaprop= actprop;
+
+       return (uiLayout*)box;
 }
 
-uiLayout *uiLayoutFree(uiLayout *layout, int align)
+uiLayout *uiLayoutAbsolute(uiLayout *layout, int align)
 {
        uiLayout *litem;
 
-       litem= MEM_callocN(sizeof(uiLayout), "uiLayoutFree");
+       litem= MEM_callocN(sizeof(uiLayout), "uiLayoutAbsolute");
        litem->item.type= ITEM_LAYOUT_ABSOLUTE;
        litem->root= layout->root;
        litem->align= align;
@@ -1987,11 +2026,28 @@
        uiBlock *block;
 
        block= uiLayoutGetBlock(layout);
-       uiLayoutFree(layout, 0);
+       uiLayoutAbsolute(layout, 0);
 
        return block;
 }
 
+uiLayout *uiLayoutOverlap(uiLayout *layout)
+{
+       uiLayout *litem;
+
+       litem= MEM_callocN(sizeof(uiLayout), "uiLayoutOverlap");

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to