[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59612] trunk/blender/source/blender/ editors/interface/interface_handlers.c: Some tweaking to uiList dragsize, to make it more reactive to very quick moves.

Bastien Montagne montagne29 at wanadoo.fr
Wed Aug 28 21:23:15 CEST 2013


Revision: 59612
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59612
Author:   mont29
Date:     2013-08-28 19:23:15 +0000 (Wed, 28 Aug 2013)
Log Message:
-----------
Some tweaking to uiList dragsize, to make it more reactive to very quick moves.

Note that, even though not officialy supporting non-UI_UNIT_Y height items (other point like scrollbar size would faill too), we try to maintain a not-that-bad behavior in this case, which implies a bit of black magic (esp. as our ref point is the bottom of the list, which moves when it is resized :/)...

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface_handlers.c

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2013-08-28 19:22:48 UTC (rev 59611)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2013-08-28 19:23:15 UTC (rev 59612)
@@ -3411,11 +3411,18 @@
 {
 	uiList *ui_list = but->custom_data;
 	int *size = (int *)but->poin;
-	int mx, my;
+	int mx, my, raw_dir_sign;
 	int retval = WM_UI_HANDLER_CONTINUE;
 
 	mx = event->x;
 	my = event->y;
+
+	/* We find the direction of the mouse since last time, before converting coordinates into block's space.
+	 * We'll use it to avoid flickering in case some rows are higher than UI_UNIT_Y.
+	 */
+	raw_dir_sign = (data->draglasty - my < 0) ? -1 : 1;
+	data->draglasty = my;
+
 	ui_window_to_block(data->region, block, &mx, &my);
 
 	if (data->state == BUTTON_STATE_NUM_EDITING) {
@@ -3438,49 +3445,53 @@
 			 */
 			if (data->draglastvalue > 0 && *size == 0) {
 				data->draglastvalue = *size;
-				data->draglasty = data->dragstarty;
+				data->dragstartx = data->dragstarty;  /* draglasty already used... */
 				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 = (int)floorf(((float)delta / (float)UI_UNIT_Y) + 0.5f);
+				int delta = data->dragstarty - my;
+				/* We only actually do something if the real mousemouve direction matches the "virtual"
+				 * mousemove direction in current block's space. This avoids flickering when drag-resizing lists with
+				 * items drawing higher that UI_UNIT_Y.
+				 */
+				if (delta * raw_dir_sign > 0) {
+					/* Number of rows to show/hide, UI_UNIT_Y should work nice in most cases. */
+					delta = (int)floorf(((float)delta / (float)UI_UNIT_Y) + 0.5f);
 
-				/* 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);
+					/* If we are not in autosize mode, default behavior... */
+					if (*size > 0 && delta != 0) {
+						/* This prevents some instability in case some items draw more/less than UI_UNIT_Y height. */
+						delta = (delta < -5) ? -5 : (delta > 5) ? 5 : 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;
+						/* Used to detect switch to/from autosize mode. */
+						data->draglastvalue = *size;
 
-					data->dragchange = true;
-					data->applied = data->applied_interactive = true;
+						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;
+						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;
+						/* Restore real dragstarty value! */
+						data->dragstarty = data->dragstartx;
 
-					/* Used to detect switch to/from autosize mode. */
-					data->draglastvalue = *size;
+						/* Used to detect switch to/from autosize mode. */
+						data->draglastvalue = *size;
 
-					data->dragchange = true;
-					data->applied = data->applied_interactive = true;
+						data->dragchange = true;
+						data->applied = data->applied_interactive = true;
 
-					ui_list->flag |= UILST_SCROLL_TO_ACTIVE_ITEM;
-					ED_region_tag_redraw(data->region);
+						ui_list->flag |= UILST_SCROLL_TO_ACTIVE_ITEM;
+						ED_region_tag_redraw(data->region);
+					}
 				}
 			}
 		}




More information about the Bf-blender-cvs mailing list