Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-06-02 22:10:06 +0400
committerTon Roosendaal <ton@blender.org>2009-06-02 22:10:06 +0400
commitca24322413e78b60ece51902da1b8a9ac22d13ba (patch)
treef9111a453452e478a941fa4f35344bc4f382020b /source
parent67494dcad3330b1c056cef4b9aa21030c856cf5d (diff)
2.5
Part one of new text button type: SEARCH_MENU This opens a popup showing all matches for a typed string, nice for object names, materials, operators, and so on. Warning: Currently menu doesn't function yet! Only draws choices. As test I've added an operator search button in top bar. It only shows operators that can be used in this context now. Also that is part of the WIP, tomorrow more fun :)
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/include/UI_interface.h41
-rw-r--r--source/blender/editors/interface/interface.c42
-rw-r--r--source/blender/editors/interface/interface_handlers.c26
-rw-r--r--source/blender/editors/interface/interface_intern.h9
-rw-r--r--source/blender/editors/interface/interface_regions.c176
-rw-r--r--source/blender/editors/interface/interface_style.c2
-rw-r--r--source/blender/editors/interface/interface_widgets.c69
-rw-r--r--source/blender/editors/screen/screen_ops.c37
-rw-r--r--source/blender/editors/space_info/info_header.c36
9 files changed, 363 insertions, 75 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 97c2da5297f..e66c4ef827b 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -177,20 +177,21 @@ typedef struct uiLayout uiLayout;
#define INLINK (23<<9)
#define KEYEVT (24<<9)
#define ICONTEXTROW (25<<9)
-#define HSVCUBE (26<<9)
-#define PULLDOWN (27<<9)
-#define ROUNDBOX (28<<9)
-#define CHARTAB (29<<9)
+#define HSVCUBE (26<<9)
+#define PULLDOWN (27<<9)
+#define ROUNDBOX (28<<9)
+#define CHARTAB (29<<9)
#define BUT_COLORBAND (30<<9)
-#define BUT_NORMAL (31<<9)
-#define BUT_CURVE (32<<9)
+#define BUT_NORMAL (31<<9)
+#define BUT_CURVE (32<<9)
#define BUT_TOGDUAL (33<<9)
-#define ICONTOGN (34<<9)
-#define FTPREVIEW (35<<9)
-#define NUMABS (36<<9)
-#define TOGBUT (37<<9)
-#define OPTION (38<<9)
-#define OPTIONN (39<<9)
+#define ICONTOGN (34<<9)
+#define FTPREVIEW (35<<9)
+#define NUMABS (36<<9)
+#define TOGBUT (37<<9)
+#define OPTION (38<<9)
+#define OPTIONN (39<<9)
+#define SEARCH_MENU (40<<9)
#define BUTTYPE (63<<9)
/* Drawing
@@ -401,6 +402,8 @@ uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg,
void uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *spoin, char *tip);
+uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, char *tip);
+
void uiBlockPickerButtons(struct uiBlock *block, float *col, float *hsv, float *old, char *hexcol, char mode, short retval);
void uiBlockColorbandButtons(struct uiBlock *block, struct ColorBand *coba, struct rctf *butr, int event);
@@ -425,16 +428,29 @@ uiBut *uiFindInlink(uiBlock *block, void *poin);
*
* uiButSetCompleteFunc is for tab completion.
*
+ * uiButSearchFunc is for name buttons, showing a popup with matches
+ *
* uiBlockSetFunc and uiButSetFunc are callbacks run when a button is used,
* in case events, operators or RNA are not sufficient to handle the button.
*
* uiButSetNFunc will free the argument with MEM_freeN. */
+typedef struct uiSearchItems {
+ int maxitem, totitem, maxstrlen;
+
+ char **names;
+ void **pointers;
+
+} uiSearchItems;
+
+
typedef void (*uiButHandleFunc)(struct bContext *C, void *arg1, void *arg2);
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);
+
void uiBlockSetHandleFunc(uiBlock *block, uiBlockHandleFunc func, void *arg);
void uiBlockSetButmFunc (uiBlock *block, uiMenuHandleFunc func, void *arg);
@@ -443,6 +459,7 @@ 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));
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index e9a886375c3..4fb2f27a618 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1359,7 +1359,7 @@ int ui_get_but_string_max_length(uiBut *but)
void ui_get_but_string(uiBut *but, char *str, int maxlen)
{
- if(but->rnaprop && ELEM(but->type, TEX, IDPOIN)) {
+ if(but->rnaprop && ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
PropertyType type;
char *buf= NULL;
@@ -1402,6 +1402,11 @@ void ui_get_but_string(uiBut *but, char *str, int maxlen)
BLI_strncpy(str, but->poin, maxlen);
return;
}
+ else if(but->type == SEARCH_MENU) {
+ /* string */
+ BLI_strncpy(str, but->poin, maxlen);
+ return;
+ }
else {
/* number */
double value;
@@ -1491,7 +1496,7 @@ static void ui_rna_ID_autocomplete(bContext *C, char *str, void *arg_but)
int ui_set_but_string(bContext *C, uiBut *but, const char *str)
{
- if(but->rnaprop && ELEM(but->type, TEX, IDPOIN)) {
+ if(but->rnaprop && ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
if(RNA_property_editable(&but->rnapoin, but->rnaprop)) {
PropertyType type;
@@ -1535,6 +1540,11 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
BLI_strncpy(but->poin, str, but->hardmax);
return 1;
}
+ else if(but->type == SEARCH_MENU) {
+ /* string */
+ BLI_strncpy(but->poin, str, but->hardmax);
+ return 1;
+ }
else {
double value;
@@ -1817,11 +1827,11 @@ void ui_check_but(uiBut *but)
/* if something changed in the button */
double value;
float okwidth;
- int transopts= ui_translate_buttons();
+// int transopts= ui_translate_buttons();
ui_is_but_sel(but);
- if(but->type==TEX || but->type==IDPOIN) transopts= 0;
+// if(but->type==TEX || but->type==IDPOIN) transopts= 0;
/* test for min and max, icon sliders, etc */
switch( but->type ) {
@@ -1926,6 +1936,7 @@ void ui_check_but(uiBut *but)
case IDPOIN:
case TEX:
+ case SEARCH_MENU:
if(!but->editstr) {
char str[UI_MAX_DRAW_STR];
@@ -3065,6 +3076,29 @@ void uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1,
ui_check_but(but);
}
+/* arg is pointer to string/name, use callbacks 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);
+
+ but->icon= (BIFIconID) icon;
+ but->flag|= UI_HAS_ICON;
+
+ but->flag|= UI_ICON_LEFT|UI_TEXT_LEFT;
+ but->flag|= UI_ICON_SUBMENU;
+
+ ui_check_but(but);
+
+ return but;
+}
+
+void uiButSetSearchFunc(uiBut *but, uiButSearchFunc func, void *arg)
+{
+ but->search_func= func;
+ but->search_arg= arg;
+}
+
+
/* Program Init/Exit */
void UI_init(void)
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index ec2f960dd14..e0e58e61752 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -127,6 +127,9 @@ typedef struct uiHandleButtonData {
/* menu open */
uiPopupBlockHandle *menu;
int menuretval;
+
+ /* search box */
+ ARegion *searchbox;
/* post activate */
uiButtonActivateType posttype;
@@ -557,6 +560,7 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
ui_apply_but_BUT(C, but, data);
break;
case TEX:
+ case SEARCH_MENU:
ui_apply_but_TEX(C, but, data);
break;
case TOGBUT:
@@ -1124,7 +1128,7 @@ static int ui_textedit_copypaste(uiBut *but, uiHandleButtonData *data, int paste
return changed;
}
-static void ui_textedit_begin(uiBut *but, uiHandleButtonData *data)
+static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
{
if(data->str) {
MEM_freeN(data->str);
@@ -1146,14 +1150,24 @@ static void ui_textedit_begin(uiBut *but, uiHandleButtonData *data)
but->selsta= 0;
but->selend= strlen(but->drawstr) - strlen(but->str);
+ /* optional searchbox */
+ if(but->type==SEARCH_MENU) {
+ data->searchbox= ui_searchbox_create(C, data->region, but);
+ ui_searchbox_update(C, data->searchbox, but);
+ }
+
ui_check_but(but);
}
-static void ui_textedit_end(uiBut *but, uiHandleButtonData *data)
+static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data)
{
if(but) {
but->editstr= 0;
but->pos= -1;
+
+ if(data->searchbox)
+ ui_searchbox_free(C, data->searchbox);
+ data->searchbox= NULL;
}
}
@@ -1316,6 +1330,9 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
if(changed) {
if(data->interactive) ui_apply_button(C, block, but, data, 1);
else ui_check_but(but);
+
+ if(data->searchbox)
+ ui_searchbox_update(C, data->searchbox, but);
}
if(changed || (retval == WM_UI_HANDLER_BREAK))
@@ -2702,6 +2719,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
break;
case TEX:
case IDPOIN:
+ case SEARCH_MENU:
retval= ui_do_but_TEX(C, block, but, data, event);
break;
case MENU:
@@ -2928,9 +2946,9 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s
/* text editing */
if(state == BUTTON_STATE_TEXT_EDITING && data->state != BUTTON_STATE_TEXT_SELECTING)
- ui_textedit_begin(but, data);
+ ui_textedit_begin(C, but, data);
else if(data->state == BUTTON_STATE_TEXT_EDITING && state != BUTTON_STATE_TEXT_SELECTING)
- ui_textedit_end(but, data);
+ ui_textedit_end(C, but, data);
/* number editing */
if(state == BUTTON_STATE_NUM_EDITING)
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 25a1dbe3d62..f4483a0540d 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -176,6 +176,9 @@ struct uiBut {
uiButCompleteFunc autocomplete_func;
void *autofunc_arg;
+ uiButSearchFunc search_func;
+ void *search_arg;
+
uiLink *link;
char *tip, *lockstr;
@@ -351,6 +354,10 @@ uiBlock *ui_block_func_COL(struct bContext *C, uiPopupBlockHandle *handle, void
struct ARegion *ui_tooltip_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
void ui_tooltip_free(struct bContext *C, struct ARegion *ar);
+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_free(struct bContext *C, struct ARegion *ar);
+
typedef uiBlock* (*uiBlockHandleCreateFunc)(struct bContext *C, struct uiPopupBlockHandle *handle, void *arg1);
uiPopupBlockHandle *ui_popup_block_create(struct bContext *C, struct ARegion *butregion, uiBut *but,
@@ -394,6 +401,8 @@ extern void ui_draw_but(ARegion *ar, struct uiStyle *style, uiBut *but, rcti *re
struct ThemeUI;
void ui_widget_color_init(struct ThemeUI *tui);
+void ui_draw_menu_item(struct uiFontStyle *fstyle, rcti *rect, char *name, int state);
+
/* interface_style.c */
void uiStyleInit(void);
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 0109612fdc0..3441abc94bd 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -383,6 +383,182 @@ void ui_tooltip_free(bContext *C, ARegion *ar)
ui_remove_temporary_region(C, CTX_wm_screen(C), ar);
}
+
+/************************* Creating Search Box **********************/
+
+
+typedef struct uiSearchboxData {
+ rcti bbox;
+ uiFontStyle fstyle;
+ uiSearchItems items;
+} uiSearchboxData;
+
+#define SEARCH_ITEMS 10
+
+/* ar is the search box itself */
+void ui_searchbox_update(bContext *C, ARegion *ar, uiBut *but)
+{
+ uiSearchboxData *data= ar->regiondata;
+
+ /* callback */
+ data->items.totitem= 0;
+ but->search_func(C, but->search_arg, but->editstr, &data->items);
+
+ ED_region_tag_redraw(ar);
+}
+
+static void ui_searchbox_region_draw(const bContext *C, ARegion *ar)
+{
+ uiSearchboxData *data= ar->regiondata;
+
+ ui_draw_menu_back(U.uistyles.first, NULL, &data->bbox);
+
+ /* draw text */
+ if(data->items.totitem) {
+ rcti rect;
+ int a, buth;
+
+ /* draw items */
+ buth= (data->bbox.ymax-data->bbox.ymin - 2*MENU_SEPR_HEIGHT)/SEARCH_ITEMS;
+ rect= data->bbox;
+ rect.xmin= data->bbox.xmin + 3.0f;
+ rect.xmax= data->bbox.xmax - 3.0f;
+ rect.ymax= data->bbox.ymax - MENU_SEPR_HEIGHT;
+ rect.ymin= rect.ymax - buth;
+
+ for(a=0; a<data->items.totitem; a++) {
+ ui_draw_menu_item(&data->fstyle, &rect, data->items.names[a], a==0?UI_ACTIVE:0);
+ rect.ymax -= buth;
+ rect.ymin -= buth;
+ }
+ }
+}
+
+static void ui_searchbox_region_free(ARegion *ar)
+{
+ uiSearchboxData *data= ar->regiondata;
+ int a;
+
+ /* free search data */
+ for(a=0; a<SEARCH_ITEMS; a++)
+ MEM_freeN(data->items.names[a]);
+ MEM_freeN(data->items.names);
+ MEM_freeN(data->items.pointers);
+
+ MEM_freeN(data);
+ ar->regiondata= NULL;
+}
+
+ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
+{
+ uiStyle *style= U.uistyles.first; // XXX pass on as arg
+ static ARegionType type;
+ ARegion *ar;
+ uiSearchboxData *data;
+ float aspect= but->block->aspect;
+ float x1f, x2f, y1f, y2f;
+ int x1, x2, y1, y2, winx, winy, ofsx, ofsy;
+
+ /* create area region */
+ ar= ui_add_temporary_region(CTX_wm_screen(C));
+
+ memset(&type, 0, sizeof(ARegionType));
+ type.draw= ui_searchbox_region_draw;
+ type.free= ui_searchbox_region_free;
+ ar->type= &type;
+
+ /* create searchbox data */
+ data= MEM_callocN(sizeof(uiSearchboxData), "uiSearchboxData");
+
+ /* set font, get bb */
+ data->fstyle= style->widget; /* copy struct */
+ data->fstyle.align= UI_STYLE_TEXT_CENTER;
+ ui_fontscale(&data->fstyle.points, aspect);
+ uiStyleFontSet(&data->fstyle);
+
+ ar->regiondata= data;
+
+ /* compute position */
+ ofsx= (but->block->panel)? but->block->panel->ofsx: 0;
+ ofsy= (but->block->panel)? but->block->panel->ofsy: 0;
+
+ x1f= but->x1;
+ x2f= but->x2;
+ y2f= but->y1;
+ y1f= y2f - SEARCH_ITEMS*MENU_BUTTON_HEIGHT - 2*MENU_SEPR_HEIGHT;
+
+ /* minimal width */
+ if(x2f - x1f < 180) x2f= x1f+180; // XXX arbitrary
+
+ /* copy to int, gets projected if possible too */
+ x1= x1f; y1= y1f; x2= x2f; y2= y2f;
+
+ if(butregion) {
+ if(butregion->v2d.cur.xmin != butregion->v2d.cur.xmax) {
+ UI_view2d_to_region_no_clip(&butregion->v2d, x1f, y1f, &x1, &y1);
+ UI_view2d_to_region_no_clip(&butregion->v2d, x2f, y2f, &x2, &y2);
+ }
+
+ x1 += butregion->winrct.xmin;
+ x2 += butregion->winrct.xmin;
+ y1 += butregion->winrct.ymin;
+ y2 += butregion->winrct.ymin;
+ }
+
+ wm_window_get_size(CTX_wm_window(C), &winx, &winy);
+
+ if(x2 > winx) {
+ /* super size */
+ if(x2 > winx + x1) {
+ x2= winx;
+ x1= 0;
+ }
+ else {
+ x1 -= x2-winx;
+ x2= winx;
+ }
+ }
+ if(y1 < 0) {
+ y1 += 36;
+ y2 += 36;
+ }
+
+ /* widget rect, in region coords */
+ data->bbox.xmin= MENU_SHADOW_SIDE;
+ data->bbox.xmax= x2-x1 + MENU_SHADOW_SIDE;
+ data->bbox.ymin= MENU_SHADOW_BOTTOM;
+ data->bbox.ymax= y2-y1 + MENU_SHADOW_BOTTOM;
+
+ /* region bigger for shadow */
+ ar->winrct.xmin= x1 - MENU_SHADOW_SIDE;
+ ar->winrct.xmax= x2 + MENU_SHADOW_SIDE;
+ ar->winrct.ymin= y1 - MENU_SHADOW_BOTTOM;
+ ar->winrct.ymax= y2 + MENU_TOP;
+
+ /* adds subwindow */
+ ED_region_init(C, ar);
+
+ /* notify change and redraw */
+ ED_region_tag_redraw(ar);
+
+ /* prepare search data */
+ data->items.maxitem= SEARCH_ITEMS;
+ data->items.maxstrlen= but->hardmax;
+ data->items.totitem= 0;
+ data->items.names= MEM_callocN(SEARCH_ITEMS*sizeof(void *), "search names");
+ data->items.pointers= MEM_callocN(SEARCH_ITEMS*sizeof(void *), "search pointers");
+ for(x1=0; x1<SEARCH_ITEMS; x1++)
+ data->items.names[x1]= MEM_callocN(but->hardmax+1, "search pointers");
+
+ return ar;
+}
+
+void ui_searchbox_free(bContext *C, ARegion *ar)
+{
+ ui_remove_temporary_region(C, CTX_wm_screen(C), ar);
+}
+
+
/************************* Creating Menu Blocks **********************/
/* position block relative to but, result is in window space */
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c
index fca88132771..62a4c01bc6c 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -170,7 +170,7 @@ void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str)
if(fs->align==UI_STYLE_TEXT_CENTER)
xofs= floor( 0.5f*(rect->xmax - rect->xmin - BLF_width(str)));
else if(fs->align==UI_STYLE_TEXT_RIGHT)
- xofs= rect->xmax - rect->xmin - BLF_width(str);
+ xofs= rect->xmax - rect->xmin - BLF_width(str) - 1;
/* clip is very strict, so we give it some space */
BLF_clipping(rect->xmin-1, rect->ymin-4, rect->xmax+1, rect->ymax+4);
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index f4e3a7f2899..82bfb898f99 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -844,29 +844,23 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
widget_draw_icon(but, ICON_DOT, dualset?0:-100, rect);
}
- if(but->drawstr[0]!=0) {
+ /* If there's an icon too (made with uiDefIconTextBut) then draw the icon
+ and offset the text label to accomodate it */
+
+ if (but->flag & UI_HAS_ICON) {
+ widget_draw_icon(but, but->icon, 0, rect);
- /* If there's an icon too (made with uiDefIconTextBut) then draw the icon
- and offset the text label to accomodate it */
+ rect->xmin += UI_icon_get_width(but->icon);
- if (but->flag & UI_HAS_ICON) {
- widget_draw_icon(but, but->icon, 0, rect);
-
- rect->xmin += UI_icon_get_width(but->icon);
-
- if(but->editstr || (but->flag & UI_TEXT_LEFT))
- rect->xmin += 5;
- }
- else if(but->flag & UI_TEXT_LEFT)
+ if(but->editstr || (but->flag & UI_TEXT_LEFT))
rect->xmin += 5;
-
- widget_draw_text(fstyle, wcol, but, rect);
-
- }
- /* if there's no text label, then check to see if there's an icon only and draw it */
- else if( but->flag & UI_HAS_ICON ) {
- widget_draw_icon(but, (BIFIconID) (but->icon+but->iconadd), 0, rect);
}
+ else if(but->flag & UI_TEXT_LEFT)
+ rect->xmin += 5;
+
+ /* always draw text for textbutton cursor */
+ widget_draw_text(fstyle, wcol, but, rect);
+
}
}
@@ -1827,6 +1821,7 @@ void ui_draw_but(ARegion *ar, uiStyle *style, uiBut *but, rcti *rect)
wt= widget_type(UI_WTYPE_RADIO);
break;
case TEX:
+ case SEARCH_MENU:
wt= widget_type(UI_WTYPE_NAME);
break;
case TOGBUT:
@@ -1918,4 +1913,40 @@ void ui_draw_menu_back(uiStyle *style, uiBlock *block, rcti *rect)
}
+/* helper call to draw a menu item without button */
+/* state: UI_ACTIVE or 0 */
+void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, char *name, int state)
+{
+ uiWidgetType *wt= widget_type(UI_WTYPE_MENU_ITEM);
+ rcti _rect= *rect;
+ char *cpoin;
+
+ wt->state(wt, state);
+ wt->draw(&wt->wcol, rect, 0, 0);
+
+ uiStyleFontSet(fstyle);
+ fstyle->align= UI_STYLE_TEXT_LEFT;
+
+ /* text location offset */
+ rect->xmin+=5;
+
+ /* cut string in 2 parts? */
+ cpoin= strchr(name, '|');
+ if(cpoin) *cpoin= 0;
+
+ glColor3ubv(wt->wcol.text);
+ uiStyleFontDraw(fstyle, rect, name);
+
+ /* part text right aligned */
+ if(cpoin) {
+ fstyle->align= UI_STYLE_TEXT_RIGHT;
+ rect->xmax-=5;
+ uiStyleFontDraw(fstyle, rect, cpoin+1);
+ *cpoin= '|';
+ }
+
+ /* restore rect, was messed with */
+ *rect= _rect;
+
+}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index bec3cde7935..e8314deeae9 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -225,7 +225,8 @@ int ED_operator_uvedit(bContext *C)
return 1;
}
- BKE_mesh_end_editmesh(obedit->data, em);
+ if(obedit)
+ BKE_mesh_end_editmesh(obedit->data, em);
return 0;
}
@@ -1971,37 +1972,6 @@ static int region_flip_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static void testfunc(bContext *C, void *argv, int arg)
-{
- printf("arg %d\n", arg);
-}
-
-static void newlevel1(bContext *C, uiLayout *layout, void *arg)
-{
- uiLayoutSetFunc(layout, testfunc, NULL);
-
- uiItemV(layout, "First", ICON_PROP_ON, 1);
- uiItemV(layout, "Second", ICON_PROP_CON, 2);
- uiItemV(layout, "Third", ICON_SMOOTHCURVE, 3);
- uiItemV(layout, "Fourth", ICON_SHARPCURVE, 4);
-}
-
-static int testing123(bContext *C, wmOperator *op, wmEvent *event)
-{
- uiPopupMenu *pup= uiPupMenuBegin(C, "Hello world", 0);
- uiLayout *layout= uiPupMenuLayout(pup);
-
- uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
- uiItemO(layout, NULL, ICON_PROP_ON, "SCREEN_OT_region_flip");
- uiItemO(layout, NULL, ICON_PROP_CON, "SCREEN_OT_screen_full_area");
- uiItemO(layout, NULL, ICON_SMOOTHCURVE, "SCREEN_OT_region_foursplit");
- uiItemMenuF(layout, "Submenu", 0, newlevel1);
-
- uiPupMenuEnd(C, pup);
-
- /* this operator is only for a menu, not used further */
- return OPERATOR_CANCELLED;
-}
void SCREEN_OT_region_flip(wmOperatorType *ot)
{
@@ -2010,13 +1980,10 @@ void SCREEN_OT_region_flip(wmOperatorType *ot)
ot->idname= "SCREEN_OT_region_flip";
/* api callbacks */
- ot->invoke= testing123; // XXX WM_operator_confirm;
ot->exec= region_flip_exec;
ot->poll= ED_operator_areaactive;
ot->flag= OPTYPE_REGISTER;
-
- RNA_def_int(ot->srna, "test", 0, INT_MIN, INT_MAX, "test", "", INT_MIN, INT_MAX);
}
diff --git a/source/blender/editors/space_info/info_header.c b/source/blender/editors/space_info/info_header.c
index fd5d851b0c2..38e778848b9 100644
--- a/source/blender/editors/space_info/info_header.c
+++ b/source/blender/editors/space_info/info_header.c
@@ -387,6 +387,32 @@ static void scene_idpoin_handle(bContext *C, ID *id, int event)
}
}
+static void operator_search_cb(const struct bContext *C, void *arg, char *str, uiSearchItems *items)
+{
+ wmOperatorType *ot = WM_operatortype_first();
+
+ for(; ot; ot= ot->next) {
+
+ if(BLI_strcasestr(ot->name, str)) {
+ if(ot->poll==NULL || ot->poll((bContext *)C)) {
+ int len= strlen(ot->name);
+
+ BLI_strncpy(items->names[items->totitem], ot->name, items->maxstrlen);
+
+ /* check for hotkey */
+ if(len < items->maxstrlen-6) {
+ if(WM_key_event_operator_string(C, ot->idname, WM_OP_EXEC_DEFAULT, NULL, items->names[items->totitem]+len+1, items->maxstrlen-len-1)) {
+ items->names[items->totitem][len]= '|';
+ }
+ }
+
+ items->totitem++;
+ if(items->totitem>=items->maxitem)
+ break;
+ }
+ }
+ }
+}
void info_header_buttons(const bContext *C, ARegion *ar)
{
@@ -453,6 +479,16 @@ void info_header_buttons(const bContext *C, ARegion *ar)
xco+= 90;
}
+ {
+ static char search[256]= "";
+ uiBut *but= uiDefSearchBut(block, search, 0, ICON_PROP_ON, 256, xco+5, yco, 120, 19, "");
+
+ uiButSetSearchFunc(but, operator_search_cb, NULL);
+
+ xco+= 125;
+ }
+
+
/* always as last */
UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);