[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53684] trunk/blender/source/blender/ editors: Usability fix:

Ton Roosendaal ton at blender.org
Wed Jan 9 16:58:35 CET 2013


Revision: 53684
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53684
Author:   ton
Date:     2013-01-09 15:58:34 +0000 (Wed, 09 Jan 2013)
Log Message:
-----------
Usability fix: 

Blender's data link button (typically with menu and searching options)
now has a X icon to clear its contents. 

Before you had to click, delete text, enter.

For example:
- Object Parent
- Modifier objects or vertexgroups

This fix saves each user 100 clicks per day, with 100k users
that's 3 billion clicks per year!

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/interface/interface.c
    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_widgets.c

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h	2013-01-09 15:39:26 UTC (rev 53683)
+++ trunk/blender/source/blender/editors/include/UI_interface.h	2013-01-09 15:58:34 UTC (rev 53684)
@@ -254,7 +254,8 @@
 	HISTOGRAM     = (48 << 9),
 	WAVEFORM      = (49 << 9),
 	VECTORSCOPE   = (50 << 9),
-	PROGRESSBAR   = (51 << 9)
+	PROGRESSBAR   = (51 << 9),
+	SEARCH_MENU_UNLINK   = (52 << 9)
 } eButType;
 
 #define BUTTYPE     (63 << 9)

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c	2013-01-09 15:39:26 UTC (rev 53683)
+++ trunk/blender/source/blender/editors/interface/interface.c	2013-01-09 15:58:34 UTC (rev 53684)
@@ -1605,7 +1605,7 @@
 
 int ui_get_but_string_max_length(uiBut *but)
 {
-	if (ELEM(but->type, TEX, SEARCH_MENU))
+	if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK))
 		return but->hardmax;
 	else if (but->type == IDPOIN)
 		return MAX_ID_NAME - 2;
@@ -1688,7 +1688,7 @@
 
 void ui_get_but_string(uiBut *but, char *str, size_t maxlen)
 {
-	if (but->rnaprop && ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
+	if (but->rnaprop && ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 		PropertyType type;
 		const char *buf = NULL;
 		int buf_len;
@@ -1742,7 +1742,7 @@
 		BLI_strncpy(str, but->poin, maxlen);
 		return;
 	}
-	else if (but->type == SEARCH_MENU) {
+	else if (ELEM(but->type, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 		/* string */
 		BLI_strncpy(str, but->poin, maxlen);
 		return;
@@ -1833,7 +1833,7 @@
 
 int ui_set_but_string(bContext *C, uiBut *but, const char *str)
 {
-	if (but->rnaprop && ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
+	if (but->rnaprop && ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 		if (RNA_property_editable(&but->rnapoin, but->rnaprop)) {
 			PropertyType type;
 
@@ -1890,7 +1890,7 @@
 
 		return 1;
 	}
-	else if (but->type == SEARCH_MENU) {
+	else if (ELEM(but->type, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 		/* string */
 		BLI_strncpy(but->poin, str, but->hardmax);
 		return 1;
@@ -2360,6 +2360,7 @@
 		case IDPOIN:
 		case TEX:
 		case SEARCH_MENU:
+		case SEARCH_MENU_UNLINK:
 			if (!but->editstr) {
 				char str[UI_MAX_DRAW_STR];
 
@@ -2741,7 +2742,7 @@
 	}
 
 	if ((block->flag & UI_BLOCK_LOOP) ||
-	    ELEM8(but->type, MENU, TEX, LABEL, IDPOIN, BLOCK, BUTM, SEARCH_MENU, PROGRESSBAR))
+	    ELEM9(but->type, MENU, TEX, LABEL, IDPOIN, BLOCK, BUTM, SEARCH_MENU, PROGRESSBAR, SEARCH_MENU_UNLINK))
 	{
 		but->flag |= (UI_TEXT_LEFT | UI_ICON_LEFT);
 	}

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2013-01-09 15:39:26 UTC (rev 53683)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2013-01-09 15:58:34 UTC (rev 53684)
@@ -1062,6 +1062,7 @@
 			ui_apply_but_BUT(C, but, data);
 			break;
 		case TEX:
+		case SEARCH_MENU_UNLINK:
 		case SEARCH_MENU:
 			ui_apply_but_TEX(C, but, data);
 			break;
@@ -1169,7 +1170,7 @@
 	for (wmd = drags->first; wmd; wmd = wmd->next) {
 		if (wmd->type == WM_DRAG_ID) {
 			/* align these types with UI_but_active_drop_name */
-			if (ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
+			if (ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 				ID *id = (ID *)wmd->poin;
 				
 				if (but->poin == NULL && but->rnapoin.data == NULL) {}
@@ -1270,7 +1271,7 @@
 	}
 
 	/* text/string and ID data */
-	else if (ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
+	else if (ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 		uiHandleButtonData *active_data = but->active;
 
 		if (but->poin == NULL && but->rnapoin.data == NULL) {
@@ -1289,7 +1290,7 @@
 			if (ui_is_but_utf8(but)) BLI_strncpy_utf8(active_data->str, buf, active_data->maxlen);
 			else BLI_strncpy(active_data->str, buf, active_data->maxlen);
 
-			if (but->type == SEARCH_MENU) {
+			if (ELEM(but->type, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 				/* else uiSearchboxData.active member is not updated [#26856] */
 				ui_searchbox_update(C, data->searchbox, but, 1);
 			}
@@ -1436,7 +1437,7 @@
 	/* XXX solve generic */
 	if (but->type == NUM || but->type == NUMSLI)
 		startx += (int)(0.5f * (BLI_rctf_size_y(&but->rect)));
-	else if (ELEM(but->type, TEX, SEARCH_MENU)) {
+	else if (ELEM3(but->type, TEX, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 		startx += 5;
 		if (but->flag & UI_HAS_ICON)
 			startx += UI_DPI_ICON_SIZE;
@@ -1816,7 +1817,7 @@
 	but->selend = len;
 
 	/* optional searchbox */
-	if (but->type == SEARCH_MENU) {
+	if (ELEM(but->type, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 		data->searchbox = ui_searchbox_create(C, data->region, but);
 		ui_searchbox_update(C, data->searchbox, but, 1); /* 1 = reset */
 	}
@@ -1862,7 +1863,7 @@
 		return;
 
 	for (but = actbut->next; but; but = but->next) {
-		if (ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU)) {
+		if (ELEM8(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 			if (!(but->flag & UI_BUT_DISABLED)) {
 				data->postbut = but;
 				data->posttype = BUTTON_ACTIVATE_TEXT_EDITING;
@@ -1871,7 +1872,7 @@
 		}
 	}
 	for (but = block->buttons.first; but != actbut; but = but->next) {
-		if (ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU)) {
+		if (ELEM8(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 			if (!(but->flag & UI_BUT_DISABLED)) {
 				data->postbut = but;
 				data->posttype = BUTTON_ACTIVATE_TEXT_EDITING;
@@ -1890,7 +1891,7 @@
 		return;
 
 	for (but = actbut->prev; but; but = but->prev) {
-		if (ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU)) {
+		if (ELEM8(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 			if (!(but->flag & UI_BUT_DISABLED)) {
 				data->postbut = but;
 				data->posttype = BUTTON_ACTIVATE_TEXT_EDITING;
@@ -1899,7 +1900,7 @@
 		}
 	}
 	for (but = block->buttons.last; but != actbut; but = but->prev) {
-		if (ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU)) {
+		if (ELEM8(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 			if (!(but->flag & UI_BUT_DISABLED)) {
 				data->postbut = but;
 				data->posttype = BUTTON_ACTIVATE_TEXT_EDITING;
@@ -2430,6 +2431,34 @@
 	return WM_UI_HANDLER_CONTINUE;
 }
 
+static int ui_do_but_SEARCH_UNLINK(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event)
+{
+	/* unlink icon is on right */
+	if (ELEM(event->type, LEFTMOUSE, EVT_BUT_OPEN) && event->val == KM_PRESS) {
+		ARegion *ar = CTX_wm_region(C);
+		rcti rect;
+		int x = event->x, y = event->y;
+		
+		ui_window_to_block(ar, but->block, &x, &y);
+		
+		BLI_rcti_rctf_copy(&rect, &but->rect);
+		
+		rect.xmin = rect.xmax - (BLI_rcti_size_y(&rect));
+		if ( BLI_rcti_isect_pt(&rect, x, y) ) {
+			/* most likely NULL, but let's check, and give it temp zero string */
+			if (data->str == NULL)
+				data->str = MEM_callocN(16, "temp str");
+			data->str[0] = 0;
+			
+			ui_apply_but_TEX(C, but, data);
+			button_activate_state(C, but, BUTTON_STATE_EXIT);
+			
+			return WM_UI_HANDLER_BREAK;
+		}
+	}
+	return ui_do_but_TEX(C, block, but, data, event);
+}
+
 static int ui_do_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event)
 {
 	if (data->state == BUTTON_STATE_HIGHLIGHT) {
@@ -5138,6 +5167,9 @@
 		case SEARCH_MENU:
 			retval = ui_do_but_TEX(C, block, but, data, event);
 			break;
+		case SEARCH_MENU_UNLINK:
+			retval = ui_do_but_SEARCH_UNLINK(C, block, but, data, event);
+			break;
 		case MENU:
 		case ICONROW:
 		case ICONTEXTROW:
@@ -5251,7 +5283,7 @@
 	uiBut *but = ui_but_find_activated(ar);
 
 	if (but) {
-		if (ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU))
+		if (ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK))
 			return 1;
 	}
 	
@@ -5577,7 +5609,7 @@
 	copy_v2_fl(data->ungrab_mval, FLT_MAX);
 #endif
 
-	if (ELEM(but->type, BUT_CURVE, SEARCH_MENU)) {
+	if (ELEM3(but->type, BUT_CURVE, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 		/* XXX curve is temp */
 	}
 	else {
@@ -6440,7 +6472,7 @@
 
 	/* if there's an active modal button, don't check events or outside, except for search menu */
 	but = ui_but_find_activated(ar);
-	if (but && button_modal_state(but->active->state) && but->type != SEARCH_MENU) {
+	if (but && button_modal_state(but->active->state) && but->type != SEARCH_MENU && but->type != SEARCH_MENU_UNLINK) {
 		/* if a button is activated modal, always reset the start mouse
 		 * position of the towards mechanism to avoid loosing focus,
 		 * and don't handle events */
@@ -6466,7 +6498,7 @@
 		if (block->block_event_func && block->block_event_func(C, block, event)) {
 			/* pass */
 		}   /* events not for active search menu button */
-		else if (but == NULL || but->type != SEARCH_MENU) {
+		else if (but == NULL || (but->type != SEARCH_MENU && but->type != SEARCH_MENU_UNLINK)) {
 			switch (event->type) {
 
 

Modified: trunk/blender/source/blender/editors/interface/interface_layout.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_layout.c	2013-01-09 15:39:26 UTC (rev 53683)
+++ trunk/blender/source/blender/editors/interface/interface_layout.c	2013-01-09 15:58:34 UTC (rev 53684)
@@ -1386,7 +1386,7 @@
 
 	/* turn button into search button */
 	if (searchprop) {
-		but->type = SEARCH_MENU;
+		but->type = SEARCH_MENU_UNLINK;
 		but->hardmax = MAX2(but->hardmax, 256.0f);
 		but->rnasearchpoin = *searchptr;
 		but->rnasearchprop = searchprop;

Modified: trunk/blender/source/blender/editors/interface/interface_regions.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_regions.c	2013-01-09 15:39:26 UTC (rev 53683)
+++ trunk/blender/source/blender/editors/interface/interface_regions.c	2013-01-09 15:58:34 UTC (rev 53684)
@@ -466,7 +466,7 @@
 		data->totline++;
 	}
 
-	if (ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
+	if (ELEM4(but->type, TEX, IDPOIN, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 		/* full string */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list