[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20678] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Sat Jun 6 15:35:21 CEST 2009


Revision: 20678
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20678
Author:   ton
Date:     2009-06-06 15:35:04 +0200 (Sat, 06 Jun 2009)

Log Message:
-----------
2.5

Several usablity tweaks:

- Search menu allows ScrollWheel to view items

- Tooltip on button on bottom of window showed wrong
- Tooltips were popping up while draggin (MMB) or scrolling
  (wheel). Now they stay away.

- Stolen from Gimp (blame venomgfx for hint!): ScrollWheel allows
  to go over menu items and use number buttons, only on mouse-over.

Note for devs: the WM_event_add_mousemove() call (to add a fake
event to bring UI back alive after view changes) now works much
more reliably. It ensures the mouse move is only handled after all
notifiers/redraws were done.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
    branches/blender2.5/blender/source/blender/editors/interface/interface_intern.h
    branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c	2009-06-06 13:24:06 UTC (rev 20677)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c	2009-06-06 13:35:04 UTC (rev 20678)
@@ -1245,6 +1245,8 @@
 	int mx, my, changed= 0, inbox=0, retval= WM_UI_HANDLER_CONTINUE;
 
 	switch(event->type) {
+		case WHEELUPMOUSE:
+		case WHEELDOWNMOUSE:
 		case MOUSEMOVE:
 			if(data->searchbox)
 				ui_searchbox_event(C, data->searchbox, but, event);
@@ -1760,7 +1762,16 @@
 	ui_window_to_block(data->region, block, &mx, &my);
 
 	if(data->state == BUTTON_STATE_HIGHLIGHT) {
-		if(event->val==KM_PRESS) {
+		/* XXX hardcoded keymap check.... */
+		if(event->type == WHEELDOWNMOUSE && event->alt) {
+			mx= but->x1;
+			click= 1;
+		}
+		else if(event->type == WHEELUPMOUSE && event->alt) {
+			mx= but->x2;
+			click= 1;
+		}
+		else if(event->val==KM_PRESS) {
 			if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->shift) {
 				button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
 				retval= WM_UI_HANDLER_BREAK;
@@ -1774,6 +1785,7 @@
 			else if(ELEM(event->type, PADENTER, RETKEY) && event->val==KM_PRESS)
 				click= 1;
 		}
+		
 	}
 	else if(data->state == BUTTON_STATE_NUM_EDITING) {
 		if(event->type == ESCKEY) {
@@ -1961,7 +1973,16 @@
 	ui_window_to_block(data->region, block, &mx, &my);
 
 	if(data->state == BUTTON_STATE_HIGHLIGHT) {
-		if(event->val==KM_PRESS) {
+		/* XXX hardcoded keymap check.... */
+		if(event->type == WHEELDOWNMOUSE && event->alt) {
+			mx= but->x1;
+			click= 2;
+		}
+		else if(event->type == WHEELUPMOUSE && event->alt) {
+			mx= but->x2;
+			click= 2;
+		}
+		else if(event->val==KM_PRESS) {
 			if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->shift) {
 				button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
 				retval= WM_UI_HANDLER_BREAK;
@@ -2004,7 +2025,7 @@
 	}
 
 	if(click) {
-		if (event->ctrl) {
+		if (event->ctrl || click==2) {
 			/* nudge slider to the left or right */
 			float f, tempf, softmin, softmax, softrange;
 			int temp;
@@ -2062,6 +2083,21 @@
 			button_activate_state(C, but, BUTTON_STATE_MENU_OPEN);
 			return WM_UI_HANDLER_BREAK;
 		}
+		else if(ELEM3(but->type, MENU, ICONROW, ICONTEXTROW)) {
+			
+			if(event->type == WHEELDOWNMOUSE && event->alt) {
+				data->value= ui_step_name_menu(but, -1);
+				button_activate_state(C, but, BUTTON_STATE_EXIT);
+				ui_apply_button(C, but->block, but, data, 1);
+				return WM_UI_HANDLER_BREAK;
+			}
+			else if(event->type == WHEELUPMOUSE && event->alt) {
+				data->value= ui_step_name_menu(but, 1);
+				button_activate_state(C, but, BUTTON_STATE_EXIT);
+				ui_apply_button(C, but->block, but, data, 1);
+				return WM_UI_HANDLER_BREAK;
+			}
+		}
 	}
 
 	return WM_UI_HANDLER_CONTINUE;
@@ -3232,6 +3268,7 @@
 	
 	if(data->state == BUTTON_STATE_HIGHLIGHT) {
 		switch(event->type) {
+			
 			case MOUSEMOVE:
 				/* verify if we are still over the button, if not exit */
 				if(!ui_mouse_inside_button(ar, but, event->x, event->y)) {
@@ -3265,6 +3302,15 @@
 
 				retval= WM_UI_HANDLER_CONTINUE;
 				break;
+			case WHEELUPMOUSE:
+			case WHEELDOWNMOUSE:
+			case MIDDLEMOUSE:
+				/* XXX hardcoded keymap check... but anyway, while view changes, tooltips should be removed */
+				if(data->tooltiptimer) {
+					WM_event_remove_window_timer(data->window, data->tooltiptimer);
+					data->tooltiptimer= NULL;
+				}
+				/* pass on purposedly */
 			default:
 				/* handle button type specific events */
 				retval= ui_do_button(C, block, but, event);

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_intern.h	2009-06-06 13:24:06 UTC (rev 20677)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_intern.h	2009-06-06 13:35:04 UTC (rev 20678)
@@ -371,6 +371,7 @@
 void ui_popup_block_free(struct bContext *C, uiPopupBlockHandle *handle);
 
 void ui_set_name_menu(uiBut *but, int value);
+int ui_step_name_menu(uiBut *but, int step);
 
 struct AutoComplete;
 struct AutoComplete *autocomplete_begin(char *startname, int maxlen);

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c	2009-06-06 13:24:06 UTC (rev 20677)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c	2009-06-06 13:35:04 UTC (rev 20678)
@@ -225,6 +225,44 @@
 	menudata_free(md);
 }
 
+int ui_step_name_menu(uiBut *but, int step)
+{
+	MenuData *md;
+	int value= ui_get_but_val(but);
+	int i;
+	
+	md= decompose_menu_string(but->str);
+	for (i=0; i<md->nitems; i++)
+		if (md->items[i].retval==value)
+			break;
+	
+	if(step==1) {
+		/* skip separators */
+		for(; i<md->nitems-1; i++) {
+			if(md->items[i+1].retval != -1) {
+				value= md->items[i+1].retval;
+				break;
+			}
+		}
+	}
+	else {
+		if(i>0) {
+			/* skip separators */
+			for(; i>0; i--) {
+				if(md->items[i-1].retval != -1) {
+					value= md->items[i-1].retval;
+					break;
+				}
+			}
+		}
+	}
+	
+	menudata_free(md);
+		
+	return value;
+}
+
+
 /******************** Creating Temporary regions ******************/
 
 ARegion *ui_add_temporary_region(bScreen *sc)
@@ -354,8 +392,8 @@
 		}
 	}
 	if(y1 < 0) {
-		y1 += 36;
-		y2 += 36;
+		y1 += 56*aspect;
+		y2 += 56*aspect;
 	}
 
 	/* widget rect, in region coords */
@@ -506,9 +544,11 @@
 	uiSearchboxData *data= ar->regiondata;
 	
 	switch(event->type) {
+		case WHEELUPMOUSE:
 		case UPARROWKEY:
 			ui_searchbox_select(C, ar, but, -1);
 			break;
+		case WHEELDOWNMOUSE:
 		case DOWNARROWKEY:
 			ui_searchbox_select(C, ar, but, 1);
 			break;

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2009-06-06 13:24:06 UTC (rev 20677)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2009-06-06 13:35:04 UTC (rev 20678)
@@ -1283,6 +1283,9 @@
 		
 		ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C));
 		WM_event_add_notifier(C, NC_WINDOW, NULL);
+		
+		/* makes button hilites work */
+		WM_event_add_mousemove(C);
 	}
 }
 

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2009-06-06 13:24:06 UTC (rev 20677)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2009-06-06 13:35:04 UTC (rev 20678)
@@ -97,7 +97,7 @@
 	short active;		/* set to 1 if an active window, for quick rejects */
 	short cursor;		/* current mouse cursor type */
 	short lastcursor;	/* for temp waitcursor */
-	short pad2;
+	short addmousemove;	/* internal: tag this for extra mousemove event, makes cursors/buttons active on UI switching */
 	int pad3;
 	
 	struct wmEvent *eventstate;	/* storage for event system */

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-06-06 13:24:06 UTC (rev 20677)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-06-06 13:35:04 UTC (rev 20678)
@@ -1088,6 +1088,17 @@
 			wm_event_free(event);
 			
 		}
+		
+		/* only add mousemove when queue was read entirely */
+		if(win->addmousemove) {
+			wmEvent event= *(win->eventstate);
+			event.type= MOUSEMOVE;
+			event.prevx= event.x;
+			event.prevy= event.y;
+			wm_event_add(win, &event);
+			win->addmousemove= 0;
+		}
+		
 		CTX_wm_window_set(C, NULL);
 	}
 }
@@ -1238,11 +1249,8 @@
 void WM_event_add_mousemove(bContext *C)
 {
 	wmWindow *window= CTX_wm_window(C);
-	wmEvent event= *(window->eventstate);
-	event.type= MOUSEMOVE;
-	event.prevx= event.x;
-	event.prevy= event.y;
-	wm_event_add(window, &event);
+	
+	window->addmousemove= 1;
 }
 
 /* for modal callbacks, check configuration for how to interpret exit with tweaks  */





More information about the Bf-blender-cvs mailing list