[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59555] trunk/blender/source: uiLists enhacements: dragresize and better GRID layout.

Bastien Montagne montagne29 at wanadoo.fr
Tue Aug 27 17:27:42 CEST 2013


Revision: 59555
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59555
Author:   mont29
Date:     2013-08-27 15:27:41 +0000 (Tue, 27 Aug 2013)
Log Message:
-----------
uiLists enhacements: dragresize and better GRID layout.

Many thanks to Brecht for the review!

* You can now drag-resize uiLists (in default or grid layouts).
** Note about "default" size: when you drag below minimal size of the uiList, it will automatically reset to automatic sizing (i.e. size between rows and maxrows, depending on the number of items to show). This often means (e.g. in Materials list with many mat slots) that the list will grow again to maxrows!

* Grid uiLists now have a customizable number of columns (previously it was a fixed value of 9), and they will respect the rows/maxrows settings as well (i.e. show a scrollbar when needed), instead of growing indefinitly!

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/screen.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    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_templates.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/editors/space_node/node_buttons.c
    trunk/blender/source/blender/makesdna/DNA_screen_types.h
    trunk/blender/source/blender/makesrna/intern/rna_ui_api.c
    trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c

Modified: trunk/blender/source/blender/blenkernel/intern/screen.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/screen.c	2013-08-27 15:21:58 UTC (rev 59554)
+++ trunk/blender/source/blender/blenkernel/intern/screen.c	2013-08-27 15:27:41 UTC (rev 59555)
@@ -267,6 +267,8 @@
 /* not region itself */
 void BKE_area_region_free(SpaceType *st, ARegion *ar)
 {
+	uiList *uilst;
+
 	if (st) {
 		ARegionType *art = BKE_regiontype_from_id(st, ar->regiontype);
 		
@@ -285,6 +287,12 @@
 	}
 
 	BLI_freelistN(&ar->panels);
+
+	for (uilst = ar->ui_lists.first; uilst; uilst = uilst->next) {
+		if (uilst->dyn_data) {
+			MEM_freeN(uilst->dyn_data);
+		}
+	}
 	BLI_freelistN(&ar->ui_lists);
 }
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2013-08-27 15:21:58 UTC (rev 59554)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2013-08-27 15:27:41 UTC (rev 59555)
@@ -6127,6 +6127,7 @@
 
 	for (ui_list = ar->ui_lists.first; ui_list; ui_list = ui_list->next) {
 		ui_list->type = NULL;
+		ui_list->dyn_data = NULL;
 	}
 
 	if (spacetype == SPACE_EMPTY) {

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h	2013-08-27 15:21:58 UTC (rev 59554)
+++ trunk/blender/source/blender/editors/include/UI_interface.h	2013-08-27 15:27:41 UTC (rev 59555)
@@ -845,7 +845,7 @@
 #define UI_UL_DEFAULT_CLASS_NAME "UI_UL_list"
 void uiTemplateList(uiLayout *layout, struct bContext *C, const char *listtype_name, const char *list_id,
                     struct PointerRNA *dataptr, const char *propname, struct PointerRNA *active_dataptr,
-                    const char *active_propname, int rows, int maxrows, int layout_type);
+                    const char *active_propname, int rows, int maxrows, int layout_type, int columns);
 void uiTemplateNodeLink(uiLayout *layout, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input);
 void uiTemplateNodeView(uiLayout *layout, struct bContext *C, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input);
 void uiTemplateTextureUser(uiLayout *layout, struct bContext *C);

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2013-08-27 15:21:58 UTC (rev 59554)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2013-08-27 15:27:41 UTC (rev 59555)
@@ -170,6 +170,7 @@
 	/* coords are Window/uiBlock relative (depends on the button) */
 	int draglastx, draglasty;
 	int dragstartx, dragstarty;
+	int draglastvalue;
 	bool dragchange, draglock;
 	int dragsel;
 	float dragf, dragfstart;
@@ -3406,7 +3407,88 @@
 	return retval;
 }
 
+static int ui_do_but_LISTBOX(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
+{
+	uiList *ui_list = but->custom_data;
+	int *size = (int *)but->poin;
+	int mx, my;
+	int retval = WM_UI_HANDLER_CONTINUE;
 
+	mx = event->x;
+	my = event->y;
+	ui_window_to_block(data->region, block, &mx, &my);
+
+	if (data->state == BUTTON_STATE_NUM_EDITING) {
+		if (event->type == ESCKEY) {
+			data->cancel = true;
+			data->escapecancel = true;
+			*size = (int)data->origvalue;
+			button_activate_state(C, but, BUTTON_STATE_EXIT);
+			ED_region_tag_redraw(data->region);
+		}
+		else if (event->type == LEFTMOUSE && event->val != KM_PRESS) {
+			button_activate_state(C, but, BUTTON_STATE_EXIT);
+			ED_region_tag_redraw(data->region);
+		}
+		else if (event->type == MOUSEMOVE) {
+			/* If we switched from dragged to auto size, suspend shrinking dragging and set dragstarty to a temp
+			 * refpoint.
+			 */
+			if (data->draglastvalue > 0 && *size == 0) {
+				data->draglastvalue = *size;
+				data->draglasty = data->dragstarty;
+				data->dragstarty = my;
+			}
+			else {
+				int delta = -(my - data->dragstarty);
+				/* Number of rows to show/hide, UI_UNIT_Y should work nice in most cases. */
+				delta /= UI_UNIT_Y;
+
+				/* If we are not in autosize mode, default behavior... */
+				if (*size > 0 && delta != 0) {
+					/* Note: In case some items of the list would draw more than UI_UNIT_Y height, we only grow from one
+					 *       item at a time, to avoid instability!
+					 */
+					delta = delta / abs(delta);
+					/* We can't use ui_numedit_apply()... */
+					/* list template will clamp, but we do not want to reach 0 aka autosize mode!. */
+					*size = max_ii(*size + delta, 1);
+
+					/* Used to detect switch to/from autosize mode. */
+					data->draglastvalue = *size;
+
+					data->dragchange = true;
+					data->applied = data->applied_interactive = true;
+
+					ui_list->flag |= UILST_SCROLL_TO_ACTIVE_ITEM;
+					ED_region_tag_redraw(data->region);
+				}
+				/* If we are leaving autosize mode (growing dragging), restore to minimal size. */
+				else if (delta > 0) {
+					/* We can't use ui_numedit_apply()... */
+					*size = ui_list->dyn_data->visual_height_min;
+
+					/* Restore real dragstarty value! */
+					data->dragstarty = data->draglasty;
+
+					/* Used to detect switch to/from autosize mode. */
+					data->draglastvalue = *size;
+
+					data->dragchange = true;
+					data->applied = data->applied_interactive = true;
+
+					ui_list->flag |= UILST_SCROLL_TO_ACTIVE_ITEM;
+					ED_region_tag_redraw(data->region);
+				}
+			}
+		}
+
+		retval = WM_UI_HANDLER_BREAK;
+	}
+
+	return retval;
+}
+
 static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
 {
 	
@@ -5367,8 +5449,10 @@
 		case NUMSLI:
 			retval = ui_do_but_SLI(C, block, but, data, event);
 			break;
+		case LISTBOX:
+			retval = ui_do_but_LISTBOX(C, block, but, data, event);
+			break;
 		case ROUNDBOX:
-		case LISTBOX:
 		case LABEL:
 		case LISTLABEL:
 		case ROW:
@@ -5622,8 +5706,6 @@
 	uiBut *but;
 	int mx, my;
 
-//	if (!win->active)
-//		return NULL;
 	if (!ui_mouse_inside_region(ar, x, y))
 		return NULL;
 
@@ -5768,7 +5850,7 @@
 				WM_cursor_grab_disable(data->window, NULL);
 			}
 #else
-			WM_cursor_grab_disable(data->window, );
+			WM_cursor_grab_disable(data->window, NULL);
 #endif
 		}
 	}
@@ -6423,90 +6505,125 @@
 
 static int ui_handle_list_event(bContext *C, const wmEvent *event, ARegion *ar)
 {
-	uiBut *but = ui_list_find_mouse_over(ar, event->x, event->y);
+	uiBut *but, *dragbut;
+	uiList *ui_list;
+	uiListDyn *dyn_data;
 	int retval = WM_UI_HANDLER_CONTINUE;
 	int type = event->type, val = event->val;
+	int mx, my;
+	bool is_over_dragbut = false;
 
-	if (but) {
-		uiList *ui_list = but->custom_data;
+	but = ui_list_find_mouse_over(ar, event->x, event->y);
+	if (!but) {
+		return retval;
+	}
 
-		if (ui_list) {
-			
-			/* convert pan to scrollwheel */
-			if (type == MOUSEPAN) {
-				ui_pan_to_scroll(event, &type, &val);
-				
-				/* if type still is mousepan, we call it handled, since delta-y accumulate */
-				/* also see wm_event_system.c do_wheel_ui hack */
-				if (type == MOUSEPAN)
-					retval = WM_UI_HANDLER_BREAK;
-			}
-			
-			if (val == KM_PRESS) {
-				
-				if (ELEM(type, UPARROWKEY, DOWNARROWKEY) ||
-					((ELEM(type, WHEELUPMOUSE, WHEELDOWNMOUSE) && event->alt)))
-				{
-					const int value_orig = RNA_property_int_get(&but->rnapoin, but->rnaprop);
-					int value, min, max;
+	ui_list = but->custom_data;
+	if (!ui_list || !ui_list->dyn_data) {
+		return retval;
+	}
+	dyn_data = ui_list->dyn_data;
 
-					/* activate up/down the list */
-					value = value_orig;
+	mx = event->x;
+	my = event->y;
+	ui_window_to_block(ar, but->block, &mx, &my);
 
-					if (ELEM(type, UPARROWKEY, WHEELUPMOUSE))
-						value--;
-					else
-						value++;
+	/* Find our "dragging" button. */
+	for (dragbut = but->block->buttons.first; dragbut; dragbut = dragbut->next) {
+		if (dragbut->poin == (void *)ui_list) {
+			break;
+		}
+	}
+	if (dragbut && dragbut == ui_but_find_mouse_over(ar, event->x, event->y)) {
+		is_over_dragbut = true;
+	}
 
-					CLAMP(value, 0, ui_list->list_last_len - 1);
+	if (is_over_dragbut && type == LEFTMOUSE && val == KM_PRESS) {
+		uiHandleButtonData *data;
+		int *size = (int *)but->poin;
 
-					if (value < ui_list->list_scroll)
-						ui_list->list_scroll = value;
-					else if (value >= ui_list->list_scroll + ui_list->list_size)
-						ui_list->list_scroll = value - ui_list->list_size + 1;
+		ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE);
+		button_activate_state(C, but, BUTTON_STATE_INIT);
 
-					RNA_property_int_range(&but->rnapoin, but->rnaprop, &min, &max);
-					value = CLAMPIS(value, min, max);
+		data = but->active;
+		data->dragstarty = my;
 
-					if (value != value_orig) {
-						RNA_property_int_set(&but->rnapoin, but->rnaprop, value);
-						RNA_property_update(C, &but->rnapoin, but->rnaprop);
+		button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
 
-						ui_apply_undo(but);
-						ED_region_tag_redraw(ar);
-					}
+		/* Again, have to override values set by ui_numedit_begin, because our listbox button also has a rnapoin... */
+		*size = data->origvalue = (double)dyn_data->visual_height;
 
-					retval = WM_UI_HANDLER_BREAK;
+		retval = WM_UI_HANDLER_BREAK;
+	}
+	else {
+		/* convert pan to scrollwheel */
+		if (type == MOUSEPAN) {
+			ui_pan_to_scroll(event, &type, &val);
+
+			/* if type still is mousepan, we call it handled, since delta-y accumulate */
+			/* also see wm_event_system.c do_wheel_ui hack */
+			if (type == MOUSEPAN)
+				retval = WM_UI_HANDLER_BREAK;
+		}
+
+		if (val == KM_PRESS) {
+			if (ELEM(type, UPARROWKEY, DOWNARROWKEY) ||
+			    ((ELEM(type, WHEELUPMOUSE, WHEELDOWNMOUSE) && event->alt)))
+			{
+				const int value_orig = RNA_property_int_get(&but->rnapoin, but->rnaprop);
+				int value, min, max;
+
+				/* activate up/down the list */
+				value = value_orig;
+
+				if (ELEM(type, UPARROWKEY, WHEELUPMOUSE))
+					value--;
+				else
+					value++;
+
+				CLAMP(value, 0, dyn_data->items_len - 1);
+
+				RNA_property_int_range(&but->rnapoin, but->rnaprop, &min, &max);
+				CLAMP(value, min, max);
+
+				if (value != value_orig) {
+					RNA_property_int_set(&but->rnapoin, but->rnaprop, value);
+					RNA_property_update(C, &but->rnapoin, but->rnaprop);
+
+					ui_apply_undo(but);
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list