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

Ton Roosendaal ton at blender.org
Wed Jun 3 20:31:38 CEST 2009


Revision: 20606
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20606
Author:   ton
Date:     2009-06-03 20:31:37 +0200 (Wed, 03 Jun 2009)

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

Further work on new "text search" button.

- Now allows to browse items (mouse, arrow key)
- Assigns active value
- Uses different backdrop to distinguish from popup menus
- Cleaned API for it, so it can be used nicely generic

Also added a search menu, which shows all currently working
operators: CTRL+ALT+F. (mind the looks, it needs some tweaks!)

To make a menu activating a button I've added a new event...
could use some tweaks.

Important note: the callback to pass on "old string" for text
button (bone rename) couldn't work yet, added first code for new
callback, but has to be worked on further. When bone rename gets
added it can be tested.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
    branches/blender2.5/blender/source/blender/editors/interface/interface.c
    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/interface/interface_widgets.c
    branches/blender2.5/blender/source/blender/editors/screen/area.c
    branches/blender2.5/blender/source/blender/editors/space_info/info_header.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_event_types.h

Modified: branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/UI_interface.h	2009-06-03 17:00:56 UTC (rev 20605)
+++ branches/blender2.5/blender/source/blender/editors/include/UI_interface.h	2009-06-03 18:31:37 UTC (rev 20606)
@@ -436,31 +436,30 @@
  *
  * uiButSetNFunc will free the argument with MEM_freeN. */
 
-typedef struct uiSearchItems {
-	int maxitem, totitem, maxstrlen;
-	
-	char **names;
-	void **pointers;
-	
-} uiSearchItems;
+typedef struct uiSearchItems uiSearchItems;
 
-
 typedef void (*uiButHandleFunc)(struct bContext *C, void *arg1, void *arg2);
+typedef void (*uiButHandleRenameFunc)(struct bContext *C, void *arg, char *origstr);
 typedef void (*uiButHandleNFunc)(struct bContext *C, void *argN, void *arg2);
 typedef void (*uiButCompleteFunc)(struct bContext *C, char *str, void *arg);
 typedef void (*uiButSearchFunc)(const struct bContext *C, void *arg, char *str, uiSearchItems *items);
 typedef void (*uiBlockHandleFunc)(struct bContext *C, void *arg, int event);
+		
+		/* use inside searchfunc to add items */
+int		uiSearchItemAdd(uiSearchItems *items, const char *name, void *poin);
+		/* bfunc gets search item *poin as arg2, or if NULL the old string */
+void	uiButSetSearchFunc	(uiBut *but,		uiButSearchFunc sfunc, void *arg1, uiButHandleFunc bfunc);
 
 
 void	uiBlockSetHandleFunc(uiBlock *block,	uiBlockHandleFunc func, void *arg);
 void	uiBlockSetButmFunc	(uiBlock *block,	uiMenuHandleFunc func, void *arg);
 
 void	uiBlockSetFunc		(uiBlock *block,	uiButHandleFunc func, void *arg1, void *arg2);
+void	uiBlockSetRenameFunc(uiBlock *block,	uiButHandleRenameFunc func, void *arg1);
 void	uiButSetFunc		(uiBut *but,		uiButHandleFunc func, void *arg1, void *arg2);
 void	uiButSetNFunc		(uiBut *but,		uiButHandleNFunc func, void *argN, void *arg2);
 
 void	uiButSetCompleteFunc(uiBut *but,		uiButCompleteFunc func, void *arg);
-void	uiButSetSearchFunc	(uiBut *but,		uiButSearchFunc func, void *arg);
 
 void 	uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(struct bContext *C, uiBlock *block));
 

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface.c	2009-06-03 17:00:56 UTC (rev 20605)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface.c	2009-06-03 18:31:37 UTC (rev 20606)
@@ -2963,6 +2963,11 @@
 	block->func_arg2= arg2;
 }
 
+void uiBlockSetRenameFunc(uiBlock *block, uiButHandleRenameFunc func, void *arg1)
+{
+	
+}
+
 void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)())
 {
 	block->drawextra= func;
@@ -3083,7 +3088,7 @@
 	ui_check_but(but);
 }
 
-/* arg is pointer to string/name, use callbacks below to make this work */
+/* arg is pointer to string/name, use uiButSetSearchFunc() below to make this work */
 uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, char *tip)
 {
 	uiBut *but= ui_def_but(block, SEARCH_MENU, retval, "", x1, y1, x2, y2, arg, 0.0, maxlen, 0.0, 0.0, tip);
@@ -3099,10 +3104,13 @@
 	return but;
 }
 
-void uiButSetSearchFunc(uiBut *but, uiButSearchFunc func, void *arg)
+/* arg is user value, searchfunc and handlefunc both get it as arg */
+void uiButSetSearchFunc(uiBut *but, uiButSearchFunc sfunc, void *arg, uiButHandleFunc bfunc)
 {
-	but->search_func= func;
+	but->search_func= sfunc;
 	but->search_arg= arg;
+	
+	uiButSetFunc(but, bfunc, arg, NULL);
 }
 
 

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-03 17:00:56 UTC (rev 20605)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c	2009-06-03 18:31:37 UTC (rev 20606)
@@ -142,7 +142,8 @@
 	uiButHandleFunc func;
 	void *func_arg1;
 	void *func_arg2;
-
+	void *func_arg3;
+	
 	uiButHandleNFunc funcN;
 	void *func_argN;
 
@@ -233,6 +234,7 @@
 		after->func= but->func;
 		after->func_arg1= but->func_arg1;
 		after->func_arg2= but->func_arg2;
+		after->func_arg3= but->func_arg3;
 
 		after->funcN= but->funcN;
 		after->func_argN= but->func_argN;
@@ -418,9 +420,10 @@
 
 	/* give butfunc the original text too */
 	/* feature used for bone renaming, channels, etc */
-	if(but->func_arg2==NULL) but->func_arg2= data->origstr;
+	/* XXX goes via uiButHandleRenameFunc now */
+//	if(but->func_arg2==NULL) but->func_arg2= data->origstr;
 	ui_apply_but_func(C, but);
-	if(but->func_arg2==data->origstr) but->func_arg2= NULL;
+//	if(but->func_arg2==data->origstr) but->func_arg2= NULL;
 
 	data->retval= but->retval;
 	data->applied= 1;
@@ -888,7 +891,7 @@
 		}
 	}
 
-	return WM_UI_HANDLER_BREAK;
+	return changed;
 }
 
 void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int select, int jump)
@@ -1047,7 +1050,7 @@
 	else { /* backspace */
 		if(len!=0) {
 			if ((but->selend - but->selsta) > 0) {
-				ui_textedit_delete_selection(but, data);
+				changed= ui_textedit_delete_selection(but, data);
 			}
 			else if(but->pos>0) {
 				for(x=but->pos; x<len; x++)
@@ -1175,12 +1178,16 @@
 static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data)
 {
 	if(but) {
-		but->editstr= 0;
+		if(data->searchbox) {
+			if(data->cancel==0)
+				ui_searchbox_apply(but, data->searchbox);
+
+			ui_searchbox_free(C, data->searchbox);
+			data->searchbox= NULL;
+		}
+		
+		but->editstr= NULL;
 		but->pos= -1;
-		
-		if(data->searchbox)
-			ui_searchbox_free(C, data->searchbox);
-		data->searchbox= NULL;
 	}
 }
 
@@ -1232,11 +1239,17 @@
 	}
 }
 
+
 static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event)
 {
-	int mx, my, changed= 0, retval= WM_UI_HANDLER_CONTINUE;
+	int mx, my, changed= 0, inbox=0, retval= WM_UI_HANDLER_CONTINUE;
 
 	switch(event->type) {
+		case MOUSEMOVE:
+			if(data->searchbox)
+				ui_searchbox_event(data->searchbox, event);
+			
+			break;
 		case RIGHTMOUSE:
 		case ESCKEY:
 			data->cancel= 1;
@@ -1244,6 +1257,11 @@
 			retval= WM_UI_HANDLER_BREAK;
 			break;
 		case LEFTMOUSE: {
+			
+			/* exit on LMB only on RELEASE for searchbox, to mimic other popups, and allow multiple menu levels */
+			if(data->searchbox)
+				inbox= BLI_in_rcti(&data->searchbox->winrct, event->x, event->y);
+
 			if(event->val==KM_PRESS) {
 				mx= event->x;
 				my= event->y;
@@ -1257,11 +1275,15 @@
 					button_activate_state(C, but, BUTTON_STATE_TEXT_SELECTING);
 					retval= WM_UI_HANDLER_BREAK;
 				}
-				else {
+				else if(inbox==0) {
 					button_activate_state(C, but, BUTTON_STATE_EXIT);
 					retval= WM_UI_HANDLER_BREAK;
 				}
 			}
+			else if(inbox) {
+				button_activate_state(C, but, BUTTON_STATE_EXIT);
+				retval= WM_UI_HANDLER_BREAK;
+			}
 			break;
 		}
 	}
@@ -1291,11 +1313,21 @@
 				retval= WM_UI_HANDLER_BREAK;
 				break;
 			case DOWNARROWKEY:
+				if(data->searchbox) {
+					ui_searchbox_event(data->searchbox, event);
+					break;
+				}
+				/* pass on purposedly */
 			case ENDKEY:
 				ui_textedit_move_end(but, data, 1, event->shift);
 				retval= WM_UI_HANDLER_BREAK;
 				break;
 			case UPARROWKEY:
+				if(data->searchbox) {
+					ui_searchbox_event(data->searchbox, event);
+					break;
+				}
+				/* pass on purposedly */
 			case HOMEKEY:
 				ui_textedit_move_end(but, data, 0, event->shift);
 				retval= WM_UI_HANDLER_BREAK;
@@ -1579,7 +1611,7 @@
 static int ui_do_but_TEX(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event)
 {
 	if(data->state == BUTTON_STATE_HIGHLIGHT) {
-		if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) {
+		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;
 		}
@@ -3013,7 +3045,9 @@
 	data= MEM_callocN(sizeof(uiHandleButtonData), "uiHandleButtonData");
 	data->window= CTX_wm_window(C);
 	data->region= ar;
-	data->interactive= but->type==BUT_CURVE?0:1; // XXX temp
+	if( ELEM(but->type, BUT_CURVE, SEARCH_MENU) );  // XXX curve is temp
+	else data->interactive= 1;
+	
 	data->state = BUTTON_STATE_INIT;
 
 	/* activate button */
@@ -3115,16 +3149,35 @@
 
 /************** handle activating a button *************/
 
+static uiBut *uit_but_find_open_event(ARegion *ar, wmEvent *event)
+{
+	uiBlock *block;
+	uiBut *but;
+	
+	for(block=ar->uiblocks.first; block; block=block->next) {
+		for(but=block->buttons.first; but; but= but->next)
+			if(but==event->customdata)
+				return but;
+	}
+	return NULL;
+}
+
 static int ui_handle_button_over(bContext *C, wmEvent *event, ARegion *ar)
 {
 	uiBut *but;
 
 	if(event->type == MOUSEMOVE) {
 		but= ui_but_find_mouse_over(ar, event->x, event->y);
-
 		if(but)
 			button_activate_init(C, ar, but, BUTTON_ACTIVATE_OVER);
 	}
+	else if(event->type == EVT_BUT_OPEN) {
+		but= uit_but_find_open_event(ar, event);
+		if(but) {
+			button_activate_init(C, ar, but, BUTTON_ACTIVATE_OVER);
+			ui_do_button(C, but->block, but, event);
+		}
+	}
 
 	return WM_UI_HANDLER_CONTINUE;
 }

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-03 17:00:56 UTC (rev 20605)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_intern.h	2009-06-03 18:31:37 UTC (rev 20606)
@@ -164,6 +164,7 @@
 	uiButHandleFunc func;
 	void *func_arg1;
 	void *func_arg2;
+	void *func_arg3;
 
 	uiButHandleNFunc funcN;
 	void *func_argN;
@@ -354,8 +355,11 @@
 struct ARegion *ui_tooltip_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
 void ui_tooltip_free(struct bContext *C, struct ARegion *ar);
 
+/* searchbox for string button */
 ARegion *ui_searchbox_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
 void ui_searchbox_update(struct bContext *C, struct ARegion *ar, uiBut *but);
+void ui_searchbox_event(struct ARegion *ar, struct wmEvent *event);
+void ui_searchbox_apply(uiBut *but, struct ARegion *ar);
 void ui_searchbox_free(struct bContext *C, struct ARegion *ar);
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list