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
diff options
context:
space:
mode:
-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);