From 3116062a828e24ed2e91c219ab338a38030f2f42 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 12 Jul 2009 02:06:15 +0000 Subject: 2.5: Couple of small fun features * Text window font size now supports full range 8-32, instead of just 12 and 15. I added BLF_fixed_width to get the character width of a fixed size font. * Buttons do undo push on change again. * Animated/Keyframe/Driver colors are now themable, with blend value to blend with original color. Set this to 0.5 now to give colors less constrast. * Fix tooltip popping up with RMB menu open, and missing redraw. * Autokeyframe now works for buttons. * Driver expressions can be edited in place in a button now. (still some refresh issues). * Also made python driver default for the Add Driver function in the RMB button. This way you don't have to open a Graph editor if you just want to type an expression. Also, the default expression then is the current value. * Tooltips now show some extra info, not sure what is good to have, but currently I added: * Shortcut key for operator buttons. * Python struct & property name for RNA buttons. * Expression for driven values. * Value for text/search/pointer buttons. --- source/blender/blenfont/BLF_api.h | 7 + source/blender/blenfont/intern/blf.c | 10 ++ source/blender/blenfont/intern/blf_font.c | 21 +++ source/blender/blenfont/intern/blf_internal.h | 1 + source/blender/editors/animation/drivers.c | 37 +++++- source/blender/editors/animation/keyframing.c | 16 +++ source/blender/editors/include/ED_keyframing.h | 6 +- source/blender/editors/interface/interface.c | 9 +- source/blender/editors/interface/interface_anim.c | 141 +++++++++++++++++---- .../blender/editors/interface/interface_handlers.c | 82 +++++++++--- .../blender/editors/interface/interface_intern.h | 3 + .../blender/editors/interface/interface_regions.c | 77 +++++++++-- .../blender/editors/interface/interface_widgets.c | 47 ++++--- .../blender/editors/space_buttons/space_buttons.c | 3 + source/blender/editors/space_outliner/outliner.c | 2 +- source/blender/editors/space_text/text_draw.c | 78 ++++++------ source/blender/editors/space_text/text_intern.h | 1 + source/blender/editors/space_text/text_ops.c | 16 ++- source/blender/editors/space_text/text_python.c | 8 +- source/blender/editors/transform/transform.h | 1 - .../editors/transform/transform_conversions.c | 21 +-- source/blender/makesdna/DNA_space_types.h | 3 +- source/blender/makesdna/DNA_userdef_types.h | 12 ++ source/blender/makesrna/intern/rna_space.c | 11 +- source/blender/makesrna/intern/rna_userdef.c | 50 ++++++++ 25 files changed, 520 insertions(+), 143 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h index 99934a80143..b77f4a8fcd1 100644 --- a/source/blender/blenfont/BLF_api.h +++ b/source/blender/blenfont/BLF_api.h @@ -70,6 +70,13 @@ void BLF_boundbox(char *str, struct rctf *box); float BLF_width(char *str); float BLF_height(char *str); + +/* + * For fixed width fonts only, returns the width of a + * character. + */ +float BLF_fixed_width(void); + /* * and this two function return the width and height * of the string, using the default font and both value diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c index 9a249c2f241..cd7f969d5e5 100644 --- a/source/blender/blenfont/intern/blf.c +++ b/source/blender/blenfont/intern/blf.c @@ -398,6 +398,16 @@ float BLF_width(char *str) return(0.0f); } +float BLF_fixed_width(void) +{ + FontBLF *font; + + font= global_font[global_font_cur]; + if (font) + return(blf_font_fixed_width(font)); + return(0.0f); +} + float BLF_width_default(char *str) { FontBLF *font; diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index affc35ea11e..6fc35a96e1e 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -274,6 +274,27 @@ float blf_font_height(FontBLF *font, char *str) return((box.ymax - box.ymin) * font->aspect); } +float blf_font_fixed_width(FontBLF *font) +{ + GlyphBLF *g; + FT_UInt glyph_index; + unsigned int c = ' '; + + if (!font->glyph_cache) + return 0.0f; + + glyph_index= FT_Get_Char_Index(font->face, c); + g= blf_glyph_search(font->glyph_cache, c); + if (!g) + g= blf_glyph_add(font, glyph_index, c); + + /* if we don't find the glyph. */ + if (!g) + return 0.0f; + + return g->advance; +} + void blf_font_free(FontBLF *font) { GlyphCacheBLF *gc; diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h index c9bdc428ebb..30d5c8ede65 100644 --- a/source/blender/blenfont/intern/blf_internal.h +++ b/source/blender/blenfont/intern/blf_internal.h @@ -48,6 +48,7 @@ void blf_font_draw(FontBLF *font, char *str); void blf_font_boundbox(FontBLF *font, char *str, rctf *box); float blf_font_width(FontBLF *font, char *str); float blf_font_height(FontBLF *font, char *str); +float blf_font_fixed_width(FontBLF *font); void blf_font_free(FontBLF *font); GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi); diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c index fdce0965ce3..849e2d2eede 100644 --- a/source/blender/editors/animation/drivers.c +++ b/source/blender/editors/animation/drivers.c @@ -135,7 +135,7 @@ FCurve *verify_driver_fcurve (ID *id, const char rna_path[], const int array_ind /* Main Driver Management API calls: * Add a new driver for the specified property on the given ID block */ -short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short flag) +short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short flag, int type) { PointerRNA id_ptr, ptr; PropertyRNA *prop; @@ -150,6 +150,39 @@ short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short fla /* create F-Curve with Driver */ fcu= verify_driver_fcurve(id, rna_path, array_index, 1); + + if(fcu && fcu->driver) { + fcu->driver->type= type; + + /* fill in current value for python */ + if(type == DRIVER_TYPE_PYTHON) { + PropertyType proptype= RNA_property_type(prop); + int array= RNA_property_array_length(prop); + char *expression= fcu->driver->expression; + int val, maxlen= sizeof(fcu->driver->expression); + float fval; + + if(proptype == PROP_BOOLEAN) { + if(!array) val= RNA_property_boolean_get(&ptr, prop); + else val= RNA_property_boolean_get_index(&ptr, prop, array_index); + + BLI_strncpy(expression, (val)? "True": "False", maxlen); + } + else if(proptype == PROP_INT) { + if(!array) val= RNA_property_int_get(&ptr, prop); + else val= RNA_property_int_get_index(&ptr, prop, array_index); + + BLI_snprintf(expression, maxlen, "%d", val); + } + else if(proptype == PROP_FLOAT) { + if(!array) fval= RNA_property_float_get(&ptr, prop); + else fval= RNA_property_float_get_index(&ptr, prop, array_index); + + BLI_snprintf(expression, maxlen, "%.3f", fval); + } + + } + } /* done */ return (fcu != NULL); @@ -217,7 +250,7 @@ static int add_driver_button_exec (bContext *C, wmOperator *op) length= 1; for (a=0; asrna, "all", 1, "All", "Delete keyfames from all elements of the array."); } +/* ******************************************* */ +/* AUTO KEYFRAME */ + +int autokeyframe_cfra_can_key(Scene *scene, ID *id) +{ + float cfra= (float)CFRA; // XXX for now, this will do + + /* only filter if auto-key mode requires this */ + if (IS_AUTOKEY_ON(scene) == 0) + return 0; + else if (IS_AUTOKEY_MODE(scene, NORMAL)) + return 1; + else + return id_frame_has_keyframe(id, cfra, ANIMFILTER_KEYS_LOCAL); +} + /* ******************************************* */ /* KEYFRAME DETECTION */ diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h index 503d71b0d3e..3b3d0157362 100644 --- a/source/blender/editors/include/ED_keyframing.h +++ b/source/blender/editors/include/ED_keyframing.h @@ -30,6 +30,7 @@ struct ListBase; struct ID; +struct Scene; struct KeyingSet; @@ -168,7 +169,7 @@ void ANIM_OT_keyingset_add_destination(struct wmOperatorType *ot); /* Main Driver Management API calls: * Add a new driver for the specified property on the given ID block */ -short ANIM_add_driver (struct ID *id, const char rna_path[], int array_index, short flag); +short ANIM_add_driver (struct ID *id, const char rna_path[], int array_index, short flag, int type); /* Main Driver Management API calls: * Remove the driver for the specified property on the given ID block (if available) @@ -197,6 +198,9 @@ void ANIM_OT_remove_driver_button(struct wmOperatorType *ot); /* check if a flag is set for auto-keyframing (as userprefs only!) */ #define IS_AUTOKEY_FLAG(flag) (U.autokey_flag & AUTOKEY_FLAG_##flag) +/* auto-keyframing feature - checks for whether anything should be done for the current frame */ +int autokeyframe_cfra_can_key(struct Scene *scene, struct ID *id); + /* ************ Keyframe Checking ******************** */ /* Lesser Keyframe Checking API call: diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 6f86e3e809a..63e16c7933a 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -1312,8 +1312,10 @@ void ui_get_but_string(uiBut *but, char *str, int maxlen) BLI_strncpy(str, but->poin, maxlen); return; } + else if(ui_but_anim_expression_get(but, str, maxlen)) + ; /* driver expression */ else { - /* number */ + /* number editing */ double value; value= ui_get_but_val(but); @@ -1384,7 +1386,12 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str) BLI_strncpy(but->poin, str, but->hardmax); return 1; } + else if(ui_but_anim_expression_set(but, str)) { + /* driver expression */ + return 1; + } else { + /* number editing */ double value; /* XXX 2.50 missing python api */ diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 7c439f408ba..4a2ef50a31b 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -10,6 +10,7 @@ #include "DNA_screen_types.h" #include "BLI_listbase.h" +#include "BLI_string.h" #include "BKE_animsys.h" #include "BKE_context.h" @@ -27,49 +28,135 @@ #include "interface_intern.h" -void ui_but_anim_flag(uiBut *but, float cfra) +static FCurve *ui_but_get_fcurve(uiBut *but, bAction **action, int *driven) { - but->flag &= ~(UI_BUT_ANIMATED|UI_BUT_ANIMATED_KEY|UI_BUT_DRIVEN); - + FCurve *fcu= NULL; + + *driven= 0; + /* there must be some RNA-pointer + property combo for this button */ - if (but->rnaprop && but->rnapoin.id.data && + if(but->rnaprop && but->rnapoin.id.data && RNA_property_animateable(&but->rnapoin, but->rnaprop)) { AnimData *adt= BKE_animdata_from_id(but->rnapoin.id.data); - FCurve *fcu; char *path; - if (adt) { - if ((adt->action && adt->action->curves.first) || (adt->drivers.first)) { + if(adt) { + if((adt->action && adt->action->curves.first) || (adt->drivers.first)) { /* XXX this function call can become a performance bottleneck */ path= RNA_path_from_ID_to_property(&but->rnapoin, but->rnaprop); - - if (path) { + + if(path) { /* animation takes priority over drivers */ - if (adt->action && adt->action->curves.first) { + if(adt->action && adt->action->curves.first) fcu= list_find_fcurve(&adt->action->curves, path, but->rnaindex); - - if (fcu) { - but->flag |= UI_BUT_ANIMATED; - - if (fcurve_frame_has_keyframe(fcu, cfra, 0)) - but->flag |= UI_BUT_ANIMATED_KEY; - } - } /* if not animated, check if driven */ - if ((but->flag & UI_BUT_ANIMATED)==0 && (adt->drivers.first)) { + if(!fcu && (adt->drivers.first)) { fcu= list_find_fcurve(&adt->drivers, path, but->rnaindex); - if (fcu) - but->flag |= UI_BUT_DRIVEN; + if(fcu) + *driven= 1; } - + + if(fcu && action) + *action= adt->action; + MEM_freeN(path); } } } } + + return fcu; +} + +void ui_but_anim_flag(uiBut *but, float cfra) +{ + FCurve *fcu; + int driven; + + but->flag &= ~(UI_BUT_ANIMATED|UI_BUT_ANIMATED_KEY|UI_BUT_DRIVEN); + + fcu= ui_but_get_fcurve(but, NULL, &driven); + + if(fcu) { + if(!driven) { + but->flag |= UI_BUT_ANIMATED; + + if(fcurve_frame_has_keyframe(fcu, cfra, 0)) + but->flag |= UI_BUT_ANIMATED_KEY; + } + else { + but->flag |= UI_BUT_DRIVEN; + } + } +} + +int ui_but_anim_expression_get(uiBut *but, char *str, int maxlen) +{ + FCurve *fcu; + ChannelDriver *driver; + int driven; + + fcu= ui_but_get_fcurve(but, NULL, &driven); + + if(fcu && driven) { + driver= fcu->driver; + + if(driver && driver->type == DRIVER_TYPE_PYTHON) { + BLI_strncpy(str, driver->expression, maxlen); + return 1; + } + } + + return 0; +} + +int ui_but_anim_expression_set(uiBut *but, const char *str) +{ + FCurve *fcu; + ChannelDriver *driver; + int driven; + + fcu= ui_but_get_fcurve(but, NULL, &driven); + + if(fcu && driven) { + driver= fcu->driver; + + if(driver && driver->type == DRIVER_TYPE_PYTHON) { + BLI_strncpy(driver->expression, str, sizeof(driver->expression)); + return 1; + } + } + + return 0; +} + +void ui_but_anim_autokey(uiBut *but, Scene *scene, float cfra) +{ + ID *id; + bAction *action; + FCurve *fcu; + int driven; + + fcu= ui_but_get_fcurve(but, &action, &driven); + + if(fcu && !driven) { + id= but->rnapoin.id.data; + + if(autokeyframe_cfra_can_key(scene, id)) { + short flag = 0; + + if (IS_AUTOKEY_FLAG(INSERTNEEDED)) + flag |= INSERTKEY_NEEDED; + if (IS_AUTOKEY_FLAG(AUTOMATKEY)) + flag |= INSERTKEY_MATRIX; + + fcu->flag &= ~FCURVE_SELECTED; + insert_keyframe(id, action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag); + } + } } void uiAnimContextProperty(const bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index) @@ -140,6 +227,7 @@ void ui_but_anim_menu(bContext *C, uiBut *but) uiItemBooleanO(layout, "Delete Keyframe", 0, "ANIM_OT_delete_keyframe_button", "all", 0); } } + else if(but->flag & UI_BUT_DRIVEN); else if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) { if(length) { uiItemBooleanO(layout, "Insert Keyframes", 0, "ANIM_OT_insert_keyframe_button", "all", 1); @@ -153,17 +241,18 @@ void ui_but_anim_menu(bContext *C, uiBut *but) uiItemS(layout); if(length) { - uiItemBooleanO(layout, "Remove Driver", 0, "ANIM_OT_remove_driver_button", "all", 1); - uiItemBooleanO(layout, "Remove Single Driver", 0, "ANIM_OT_remove_driver_button", "all", 0); + uiItemBooleanO(layout, "Delete Drivers", 0, "ANIM_OT_remove_driver_button", "all", 1); + uiItemBooleanO(layout, "Delete Single Driver", 0, "ANIM_OT_remove_driver_button", "all", 0); } else - uiItemBooleanO(layout, "Remove Driver", 0, "ANIM_OT_remove_driver_button", "all", 0); + uiItemBooleanO(layout, "Delete Driver", 0, "ANIM_OT_remove_driver_button", "all", 0); } + else if(but->flag & UI_BUT_ANIMATED_KEY); else if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) { uiItemS(layout); if(length) { - uiItemBooleanO(layout, "Add Driver", 0, "ANIM_OT_add_driver_button", "all", 1); + uiItemBooleanO(layout, "Add Drivers", 0, "ANIM_OT_add_driver_button", "all", 1); uiItemBooleanO(layout, "Add Single Driver", 0, "ANIM_OT_add_driver_button", "all", 0); } else diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index e0ce6a7a83f..10e495cde94 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -32,6 +32,7 @@ #include "DNA_color_types.h" #include "DNA_object_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_texture_types.h" #include "DNA_userdef_types.h" @@ -49,6 +50,7 @@ #include "BKE_utildefines.h" #include "ED_screen.h" +#include "ED_util.h" #include "UI_interface.h" @@ -166,6 +168,10 @@ typedef struct uiAfterFunc { PropertyRNA *rnaprop; bContextStore *context; + + char undostr[512]; + + int autokey; } uiAfterFunc; static int ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y); @@ -174,6 +180,7 @@ static int ui_handler_region_menu(bContext *C, wmEvent *event, void *userdata); static int ui_handler_popup(bContext *C, wmEvent *event, void *userdata); static void ui_handler_remove_popup(bContext *C, void *userdata); static void ui_handle_button_activate(bContext *C, ARegion *ar, uiBut *but, uiButtonActivateType type); +static void button_timers_tooltip_remove(bContext *C, uiBut *but); /* ******************** menu navigation helpers ************** */ @@ -271,6 +278,32 @@ static void ui_apply_but_func(bContext *C, uiBut *but) } } +static void ui_apply_autokey_undo(bContext *C, uiBut *but) +{ + Scene *scene= CTX_data_scene(C); + uiAfterFunc *after; + char *str= NULL; + + if ELEM5(but->type, BLOCK, BUT, LABEL, PULLDOWN, ROUNDBOX); + else { + /* define which string to use for undo */ + if ELEM(but->type, LINK, INLINK) str= "Add button link"; + else if ELEM(but->type, MENU, ICONTEXTROW) str= but->drawstr; + else if(but->drawstr[0]) str= but->drawstr; + else str= but->tip; + } + + /* delayed, after all other funcs run, popups are closed, etc */ + if(str) { + after= MEM_callocN(sizeof(uiAfterFunc), "uiAfterFunc"); + BLI_strncpy(after->undostr, str, sizeof(after->undostr)); + BLI_addtail(&UIAfterFuncs, after); + } + + /* try autokey */ + ui_but_anim_autokey(but, scene, scene->r.cfra); +} + static void ui_apply_but_funcs_after(bContext *C) { uiAfterFunc *afterf, after; @@ -311,6 +344,9 @@ static void ui_apply_but_funcs_after(bContext *C) after.handle_func(C, after.handle_func_arg, after.retval); if(after.butm_func) after.butm_func(C, after.butm_func_arg, after.a2); + + if(after.undostr[0]) + ED_undo_push(C, after.undostr); } } @@ -1324,7 +1360,7 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data) but->editstr= data->str; but->pos= strlen(data->str); but->selsta= 0; - but->selend= strlen(but->drawstr) - strlen(but->str); + but->selend= strlen(data->str); /* optional searchbox */ if(but->type==SEARCH_MENU) { @@ -1539,7 +1575,8 @@ 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); + /* never update while typing for now */ + if(0/*data->interactive*/) ui_apply_button(C, block, but, data, 1); else ui_check_but(but); if(data->searchbox) @@ -3090,6 +3127,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) } /* handle menu */ else if(event->type == RIGHTMOUSE && event->val == KM_PRESS) { + button_timers_tooltip_remove(C, but); ui_but_anim_menu(C, but); return WM_UI_HANDLER_BREAK; } @@ -3315,6 +3353,27 @@ static int button_modal_state(uiHandleButtonState state) BUTTON_STATE_TEXT_SELECTING, BUTTON_STATE_MENU_OPEN); } +static void button_timers_tooltip_remove(bContext *C, uiBut *but) +{ + uiHandleButtonData *data; + + data= but->active; + + if(data->tooltiptimer) { + WM_event_remove_window_timer(data->window, data->tooltiptimer); + data->tooltiptimer= NULL; + } + if(data->tooltip) { + ui_tooltip_free(C, data->tooltip); + data->tooltip= NULL; + } + + if(data->autoopentimer) { + WM_event_remove_window_timer(data->window, data->autoopentimer); + data->autoopentimer= NULL; + } +} + static void button_tooltip_timer_reset(uiBut *but) { uiHandleButtonData *data; @@ -3362,20 +3421,7 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s } else { but->flag |= UI_SELECT; - - if(data->tooltiptimer) { - WM_event_remove_window_timer(data->window, data->tooltiptimer); - data->tooltiptimer= NULL; - } - if(data->tooltip) { - ui_tooltip_free(C, data->tooltip); - data->tooltip= NULL; - } - - if(data->autoopentimer) { - WM_event_remove_window_timer(data->window, data->autoopentimer); - data->autoopentimer= NULL; - } + button_timers_tooltip_remove(C, but); } /* text editing */ @@ -3502,6 +3548,10 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b } } + /* autokey & undo push */ + if(!data->cancel) + ui_apply_autokey_undo(C, but); + /* disable tooltips until mousemove */ ui_blocks_set_tooltips(data->region, 0); diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 8c254419ec3..5760a28cb5c 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -455,6 +455,9 @@ void ui_but_anim_delete_keyframe(struct bContext *C); void ui_but_anim_add_driver(struct bContext *C); void ui_but_anim_remove_driver(struct bContext *C); void ui_but_anim_menu(struct bContext *C, uiBut *but); +int ui_but_anim_expression_get(uiBut *but, char *str, int maxlen); +int ui_but_anim_expression_set(uiBut *but, const char *str); +void ui_but_anim_autokey(uiBut *but, struct Scene *scene, float cfra); #endif diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index e0c6fbd7134..c574cf1072f 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -294,19 +294,33 @@ void ui_remove_temporary_region(bContext *C, bScreen *sc, ARegion *ar) typedef struct uiTooltipData { rcti bbox; uiFontStyle fstyle; - char *tip; + char lines[5][512]; + int totline; + int toth, spaceh, lineh; } uiTooltipData; static void ui_tooltip_region_draw(const bContext *C, ARegion *ar) { uiTooltipData *data= ar->regiondata; + rcti bbox= data->bbox; + int a; ui_draw_menu_back(U.uistyles.first, NULL, &data->bbox); /* draw text */ - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); uiStyleFontSet(&data->fstyle); - uiStyleFontDraw(&data->fstyle, &data->bbox, data->tip); + + bbox.ymax= bbox.ymax - 0.5f*((bbox.ymax - bbox.ymin) - data->toth); + bbox.ymin= bbox.ymax - data->lineh; + + for(a=0; atotline; a++) { + if(a == 0) glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + else glColor4f(0.5f, 0.5f, 0.5f, 1.0f); + + uiStyleFontDraw(&data->fstyle, &bbox, data->lines[a]); + bbox.ymin -= data->lineh + data->spaceh; + bbox.ymax -= data->lineh + data->spaceh; + } } static void ui_tooltip_region_free(ARegion *ar) @@ -314,7 +328,6 @@ static void ui_tooltip_region_free(ARegion *ar) uiTooltipData *data; data= ar->regiondata; - MEM_freeN(data->tip); MEM_freeN(data); ar->regiondata= NULL; } @@ -325,9 +338,11 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) static ARegionType type; ARegion *ar; uiTooltipData *data; + IDProperty *prop; + char buf[512]; float fonth, fontw, aspect= but->block->aspect; float x1f, x2f, y1f, y2f; - int x1, x2, y1, y2, winx, winy, ofsx, ofsy; + int x1, x2, y1, y2, winx, winy, ofsx, ofsy, w, h, a; if(!but->tip || strlen(but->tip)==0) return NULL; @@ -342,18 +357,64 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) /* create tooltip data */ data= MEM_callocN(sizeof(uiTooltipData), "uiTooltipData"); - data->tip= BLI_strdup(but->tip); + + BLI_strncpy(data->lines[0], but->tip, sizeof(data->lines[0])); + data->totline= 1; + + if(but->optype && !(but->block->flag & UI_BLOCK_LOOP)) { + /* operator keymap (not menus, they already have it) */ + prop= (but->opptr)? but->opptr->data: NULL; + + if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) { + BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Shortcut: %s", buf); + data->totline++; + } + } + + if(ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) { + /* full string */ + ui_get_but_string(but, buf, sizeof(buf)); + BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Value: %s", buf); + data->totline++; + } + + if(but->rnaprop) { + if(but->flag & UI_BUT_DRIVEN) { + if(ui_but_anim_expression_get(but, buf, sizeof(buf))) { + /* expression */ + BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Expression: %s", buf); + data->totline++; + } + } + + /* rna info */ + BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s.%s", RNA_struct_identifier(but->rnapoin.type), RNA_property_identifier(but->rnaprop)); + data->totline++; + } /* 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); - fontw= aspect * BLF_width(data->tip); - fonth= aspect * BLF_height(data->tip); + + h= BLF_height(data->lines[0]); + + for(a=0, fontw=0, fonth=0; atotline; a++) { + w= BLF_width(data->lines[a]); + fontw= MAX2(fontw, w); + fonth += (a == 0)? h: h+5; + } + + fontw *= aspect; + fonth *= aspect; ar->regiondata= data; + data->toth= fonth; + data->lineh= h*aspect; + data->spaceh= 5*aspect; + /* compute position */ ofsx= (but->block->panel)? but->block->panel->ofsx: 0; ofsy= (but->block->panel)? but->block->panel->ofsy: 0; diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 2cd7c1d61cd..8f40b2e4bfd 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -85,15 +85,6 @@ typedef struct uiWidgetTrias { } uiWidgetTrias; -typedef struct uiWidgetStateColors { - char inner_anim[4]; - char inner_anim_sel[4]; - char inner_key[4]; - char inner_key_sel[4]; - char inner_driven[4]; - char inner_driven_sel[4]; -} uiWidgetStateColors; - typedef struct uiWidgetBase { int totvert, halfwayvert; @@ -116,6 +107,7 @@ typedef struct uiWidgetType { /* pointer to theme color definition */ uiWidgetColors *wcol_theme; + uiWidgetStateColors *wcol_state; /* converted colors for state */ uiWidgetColors wcol; @@ -918,6 +910,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB char inner_key_sel[4]; char inner_driven[4]; char inner_driven_sel[4]; + float blend; */ @@ -925,9 +918,10 @@ static struct uiWidgetStateColors wcol_state= { {115, 190, 76, 255}, {90, 166, 51, 255}, {240, 235, 100, 255}, - {148, 204, 76, 255}, + {215, 211, 75, 255}, {180, 0, 255, 255}, - {153, 0, 230, 255} + {153, 0, 230, 255}, + 0.5f, 0.0f }; /* uiWidgetColors @@ -1147,7 +1141,6 @@ static struct uiWidgetColors wcol_tmp= { /* called for theme init (new theme) and versions */ void ui_widget_color_init(ThemeUI *tui) { - tui->wcol_regular= wcol_regular; tui->wcol_tool= wcol_tool; tui->wcol_text= wcol_text; @@ -1162,24 +1155,37 @@ void ui_widget_color_init(ThemeUI *tui) tui->wcol_menu_item= wcol_menu_item; tui->wcol_box= wcol_box; tui->wcol_scroll= wcol_scroll; + + tui->wcol_state= wcol_state; } /* ************ button callbacks, state ***************** */ +static void widget_state_blend(char *cp, char *cpstate, float fac) +{ + if(fac != 0.0f) { + cp[0]= (int)((1.0f-fac)*cp[0] + fac*cpstate[0]); + cp[1]= (int)((1.0f-fac)*cp[1] + fac*cpstate[1]); + cp[2]= (int)((1.0f-fac)*cp[2] + fac*cpstate[2]); + } +} + /* copy colors from theme, and set changes in it based on state */ static void widget_state(uiWidgetType *wt, int state) { + uiWidgetStateColors *wcol_state= wt->wcol_state; + wt->wcol= *(wt->wcol_theme); if(state & UI_SELECT) { + QUATCOPY(wt->wcol.inner, wt->wcol.inner_sel) + if(state & UI_BUT_ANIMATED_KEY) - QUATCOPY(wt->wcol.inner, wcol_state.inner_key_sel) + widget_state_blend(wt->wcol.inner, wcol_state->inner_key_sel, wcol_state->blend); else if(state & UI_BUT_ANIMATED) - QUATCOPY(wt->wcol.inner, wcol_state.inner_anim_sel) + widget_state_blend(wt->wcol.inner, wcol_state->inner_anim_sel, wcol_state->blend); else if(state & UI_BUT_DRIVEN) - QUATCOPY(wt->wcol.inner, wcol_state.inner_driven_sel) - else - QUATCOPY(wt->wcol.inner, wt->wcol.inner_sel) + widget_state_blend(wt->wcol.inner, wcol_state->inner_driven_sel, wcol_state->blend); VECCOPY(wt->wcol.text, wt->wcol.text_sel); @@ -1190,11 +1196,11 @@ static void widget_state(uiWidgetType *wt, int state) } else { if(state & UI_BUT_ANIMATED_KEY) - QUATCOPY(wt->wcol.inner, wcol_state.inner_key) + widget_state_blend(wt->wcol.inner, wcol_state->inner_key, wcol_state->blend); else if(state & UI_BUT_ANIMATED) - QUATCOPY(wt->wcol.inner, wcol_state.inner_anim) + widget_state_blend(wt->wcol.inner, wcol_state->inner_anim, wcol_state->blend); else if(state & UI_BUT_DRIVEN) - QUATCOPY(wt->wcol.inner, wcol_state.inner_driven) + widget_state_blend(wt->wcol.inner, wcol_state->inner_driven, wcol_state->blend); if(state & UI_ACTIVE) { /* mouse over? */ wt->wcol.inner[0]= wt->wcol.inner[0]>=240? 255 : wt->wcol.inner[0]+15; @@ -2039,6 +2045,7 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type) /* defaults */ wt.wcol_theme= &btheme->tui.wcol_regular; + wt.wcol_state= &btheme->tui.wcol_state; wt.state= widget_state; wt.draw= widget_but; wt.custom= NULL; diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c index b89a13ce218..f7be323a4c5 100644 --- a/source/blender/editors/space_buttons/space_buttons.c +++ b/source/blender/editors/space_buttons/space_buttons.c @@ -377,6 +377,9 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn) ED_area_tag_redraw(sa); sbuts->preview= 1; } + + if(wmn->data == ND_KEYS) + ED_area_tag_redraw(sa); } /* only called once, from space/spacetypes.c */ diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 6563a7dc7df..e8c32d2a2c7 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -3239,7 +3239,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m case DRIVERS_EDITMODE_ADD: { /* add a new driver with the information obtained (only if valid) */ - ANIM_add_driver(id, path, array_index, flag); + ANIM_add_driver(id, path, array_index, flag, DRIVER_TYPE_AVERAGE); } break; case DRIVERS_EDITMODE_REMOVE: diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c index f58af47a6bd..adba7ef100a 100644 --- a/source/blender/editors/space_text/text_draw.c +++ b/source/blender/editors/space_text/text_draw.c @@ -95,13 +95,7 @@ static int text_font_draw_character(SpaceText *st, int x, int y, char c) BLF_position(x, y, 0); BLF_draw(str); - return text_font_width_character(st); -} - -int text_font_width_character(SpaceText *st) -{ - // XXX need quick BLF function, or cache it somewhere - return (st->lheight == 12)? 7: 9; + return st->cwidth; } int text_font_width(SpaceText *st, char *str) @@ -523,7 +517,7 @@ int wrap_width(SpaceText *st, ARegion *ar) int x, max; x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET; - max= (ar->winx-x)/text_font_width_character(st); + max= (ar->winx-x)/st->cwidth; return max>8 ? max : 8; } @@ -615,7 +609,7 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char len= flatten_string(st, &fs, str); str= fs.buf; - max= w/text_font_width_character(st); + max= w/st->cwidth; if(max<8) max= 8; basex= x; @@ -687,7 +681,7 @@ static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int dra } else { while(w-- && *acc++ < maxwidth) - r+= text_font_width_character(st); + r+= st->cwidth; } flatten_string_free(&fs); @@ -877,18 +871,18 @@ static void draw_markers(SpaceText *st, ARegion *ar) if(y1==y2) { y -= y1*st->lheight; glBegin(GL_LINE_LOOP); - glVertex2i(x+x2*text_font_width_character(st)+1, y); - glVertex2i(x+x1*text_font_width_character(st)-2, y); - glVertex2i(x+x1*text_font_width_character(st)-2, y-st->lheight); - glVertex2i(x+x2*text_font_width_character(st)+1, y-st->lheight); + glVertex2i(x+x2*st->cwidth+1, y); + glVertex2i(x+x1*st->cwidth-2, y); + glVertex2i(x+x1*st->cwidth-2, y-st->lheight); + glVertex2i(x+x2*st->cwidth+1, y-st->lheight); glEnd(); } else { y -= y1*st->lheight; glBegin(GL_LINE_STRIP); glVertex2i(ar->winx, y); - glVertex2i(x+x1*text_font_width_character(st)-2, y); - glVertex2i(x+x1*text_font_width_character(st)-2, y-st->lheight); + glVertex2i(x+x1*st->cwidth-2, y); + glVertex2i(x+x1*st->cwidth-2, y-st->lheight); glVertex2i(ar->winx, y-st->lheight); glEnd(); y-=st->lheight; @@ -905,8 +899,8 @@ static void draw_markers(SpaceText *st, ARegion *ar) glBegin(GL_LINE_STRIP); glVertex2i(x, y); - glVertex2i(x+x2*text_font_width_character(st)+1, y); - glVertex2i(x+x2*text_font_width_character(st)+1, y-st->lheight); + glVertex2i(x+x2*st->cwidth+1, y); + glVertex2i(x+x2*st->cwidth+1, y-st->lheight); glVertex2i(x, y-st->lheight); glEnd(); } @@ -940,18 +934,18 @@ static void draw_documentation(SpaceText *st, ARegion *ar) if(l<0) return; if(st->showlinenrs) { - x= text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4; + x= st->cwidth*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4; } else { - x= text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET - 4; + x= st->cwidth*(st->text->curc-st->left) + TXT_OFFSET - 4; } if(texttool_suggest_first()) { - x += SUGG_LIST_WIDTH*text_font_width_character(st) + 50; + x += SUGG_LIST_WIDTH*st->cwidth + 50; } top= y= ar->winy - st->lheight*l - 2; len= strlen(docs); - boxw= DOC_WIDTH*text_font_width_character(st) + 20; + boxw= DOC_WIDTH*st->cwidth + 20; boxh= (DOC_HEIGHT+1)*st->lheight; /* Draw panel */ @@ -1034,14 +1028,14 @@ static void draw_suggestion_list(SpaceText *st, ARegion *ar) if(l<0) return; if(st->showlinenrs) { - x = text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4; + x = st->cwidth*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4; } else { - x = text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET - 4; + x = st->cwidth*(st->text->curc-st->left) + TXT_OFFSET - 4; } y = ar->winy - st->lheight*l - 2; - boxw = SUGG_LIST_WIDTH*text_font_width_character(st) + 20; + boxw = SUGG_LIST_WIDTH*st->cwidth + 20; boxh = SUGG_LIST_SIZE*st->lheight + 8; UI_ThemeColor(TH_SHADE1); @@ -1111,9 +1105,9 @@ static void draw_cursor(SpaceText *st, ARegion *ar) if(vcurl==vsell) { y -= vcurl*st->lheight; if(vcurc < vselc) - glRecti(x+vcurc*text_font_width_character(st)-1, y, x+vselc*text_font_width_character(st), y-st->lheight); + glRecti(x+vcurc*st->cwidth-1, y, x+vselc*st->cwidth, y-st->lheight); else - glRecti(x+vselc*text_font_width_character(st)-1, y, x+vcurc*text_font_width_character(st), y-st->lheight); + glRecti(x+vselc*st->cwidth-1, y, x+vcurc*st->cwidth, y-st->lheight); } else { int froml, fromc, tol, toc; @@ -1128,11 +1122,11 @@ static void draw_cursor(SpaceText *st, ARegion *ar) } y -= froml*st->lheight; - glRecti(x+fromc*text_font_width_character(st)-1, y, ar->winx, y-st->lheight); y-=st->lheight; + glRecti(x+fromc*st->cwidth-1, y, ar->winx, y-st->lheight); y-=st->lheight; for(i=froml+1; iwinx, y-st->lheight), y-=st->lheight; - glRecti(x-4, y, x+toc*text_font_width_character(st), y-st->lheight); y-=st->lheight; + glRecti(x-4, y, x+toc*st->cwidth, y-st->lheight); y-=st->lheight; } } else { @@ -1149,13 +1143,13 @@ static void draw_cursor(SpaceText *st, ARegion *ar) if(!hidden) { /* Draw the cursor itself (we draw the sel. cursor as this is the leading edge) */ x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET; - x += vselc*text_font_width_character(st); + x += vselc*st->cwidth; y= ar->winy-2 - vsell*st->lheight; if(st->overwrite) { char ch= text->sell->line[text->selc]; if(!ch) ch= ' '; - w= text_font_width_character(st); + w= st->cwidth; UI_ThemeColor(TH_HILITE); glRecti(x, y-st->lheight-1, x+w, y-st->lheight+1); } @@ -1255,8 +1249,8 @@ static void draw_brackets(SpaceText *st, ARegion *ar) if(viewc >= 0){ viewl= txt_get_span(text->lines.first, startl) - st->top + offl; - text_font_draw_character(st, x+viewc*text_font_width_character(st), y-viewl*st->lheight, ch); - text_font_draw_character(st, x+viewc*text_font_width_character(st)+1, y-viewl*st->lheight, ch); + text_font_draw_character(st, x+viewc*st->cwidth, y-viewl*st->lheight, ch); + text_font_draw_character(st, x+viewc*st->cwidth+1, y-viewl*st->lheight, ch); } /* draw closing bracket */ @@ -1267,8 +1261,8 @@ static void draw_brackets(SpaceText *st, ARegion *ar) if(viewc >= 0) { viewl= txt_get_span(text->lines.first, endl) - st->top + offl; - text_font_draw_character(st, x+viewc*text_font_width_character(st), y-viewl*st->lheight, ch); - text_font_draw_character(st, x+viewc*text_font_width_character(st)+1, y-viewl*st->lheight, ch); + text_font_draw_character(st, x+viewc*st->cwidth, y-viewl*st->lheight, ch); + text_font_draw_character(st, x+viewc*st->cwidth+1, y-viewl*st->lheight, ch); } } @@ -1313,6 +1307,8 @@ void draw_text_main(SpaceText *st, ARegion *ar) } text_font_begin(st); + st->cwidth= BLF_fixed_width(); + st->cwidth= MAX2(st->cwidth, 1); /* draw cursor */ draw_cursor(st, ar); @@ -1371,6 +1367,14 @@ void draw_text_main(SpaceText *st, ARegion *ar) /************************** update ***************************/ +void text_update_character_width(SpaceText *st) +{ + text_font_begin(st); + st->cwidth= BLF_fixed_width(); + st->cwidth= MAX2(st->cwidth, 1); + text_font_end(st); +} + /* Moves the view to the cursor location, also used to make sure the view isnt outside the file */ void text_update_cursor_moved(SpaceText *st, ARegion *ar) @@ -1380,6 +1384,8 @@ void text_update_cursor_moved(SpaceText *st, ARegion *ar) if(!text || !text->curl) return; + text_update_character_width(st); + i= txt_get_span(text->lines.first, text->sell); if(st->top+st->viewlines <= i || st->top > i) st->top= i - st->viewlines/2; @@ -1391,7 +1397,7 @@ void text_update_cursor_moved(SpaceText *st, ARegion *ar) x= text_draw(st, text->sell->line, st->left, text->selc, 0, 0, 0, NULL); if(x==0 || x>ar->winx) - st->left= text->curc-0.5*(ar->winx)/text_font_width_character(st); + st->left= text->curc-0.5*(ar->winx)/st->cwidth; } if(st->top < 0) st->top= 0; diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h index 31d29ac7f17..5ea33e1660d 100644 --- a/source/blender/editors/space_text/text_intern.h +++ b/source/blender/editors/space_text/text_intern.h @@ -55,6 +55,7 @@ int text_font_width(struct SpaceText *st, char *str); void text_update_line_edited(struct Text *text, struct TextLine *line); void text_update_edited(struct Text *text); +void text_update_character_width(struct SpaceText *st); void text_update_cursor_moved(struct SpaceText *st, struct ARegion *ar); #define TEXTXLOC 38 diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index 5568900e621..f9485f17bdc 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -1289,6 +1289,8 @@ static void wrap_move_bol(SpaceText *st, ARegion *ar, short sel) Text *text= st->text; int offl, offc, lin; + text_update_character_width(st); + lin= txt_get_span(text->lines.first, text->sell); wrap_offset(st, ar, text->sell, text->selc, &offl, &offc); @@ -1307,6 +1309,8 @@ static void wrap_move_eol(SpaceText *st, ARegion *ar, short sel) Text *text= st->text; int offl, offc, lin, startl, c; + text_update_character_width(st); + lin= txt_get_span(text->lines.first, text->sell); wrap_offset(st, ar, text->sell, text->selc, &offl, &offc); startl= offl; @@ -1331,6 +1335,8 @@ static void wrap_move_up(SpaceText *st, ARegion *ar, short sel) Text *text= st->text; int offl, offl_1, offc, fromline, toline, c, target; + text_update_character_width(st); + wrap_offset(st, ar, text->sell, 0, &offl_1, &offc); wrap_offset(st, ar, text->sell, text->selc, &offl, &offc); fromline= toline= txt_get_span(text->lines.first, text->sell); @@ -1376,6 +1382,8 @@ static void wrap_move_down(SpaceText *st, ARegion *ar, short sel) Text *text= st->text; int offl, startoff, offc, fromline, toline, c, target; + text_update_character_width(st); + wrap_offset(st, ar, text->sell, text->selc, &offl, &offc); fromline= toline= txt_get_span(text->lines.first, text->sell); target= text->selc + offc; @@ -1754,6 +1762,8 @@ static void scroll_apply(bContext *C, wmOperator *op, wmEvent *event) TextScroll *tsc= op->customdata; short *mval= event->mval; + text_update_character_width(st); + if(tsc->first) { tsc->old[0]= mval[0]; tsc->old[1]= mval[1]; @@ -1763,7 +1773,7 @@ static void scroll_apply(bContext *C, wmOperator *op, wmEvent *event) } if(!tsc->scrollbar) { - tsc->delta[0]= (tsc->hold[0]-mval[0])/text_font_width_character(st); + tsc->delta[0]= (tsc->hold[0]-mval[0])/st->cwidth; tsc->delta[1]= (mval[1]-tsc->hold[1])/st->lheight; } else @@ -1906,6 +1916,8 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel) int *charp; int w; + text_update_character_width(st); + if(sel) { linep= &text->sell; charp= &text->selc; } else { linep= &text->curl; charp= &text->curc; } @@ -1917,7 +1929,7 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel) x-= TXT_OFFSET; if(x<0) x= 0; - x = (x/text_font_width_character(st)) + st->left; + x = (x/st->cwidth) + st->left; if(st->wordwrap) { int i, j, endj, curs, max, chop, start, end, chars, loop; diff --git a/source/blender/editors/space_text/text_python.c b/source/blender/editors/space_text/text_python.c index 4fa54cdf27b..b606f8cb141 100644 --- a/source/blender/editors/space_text/text_python.c +++ b/source/blender/editors/space_text/text_python.c @@ -66,16 +66,18 @@ int text_do_suggest_select(SpaceText *st, ARegion *ar) /* Count the visible lines to the cursor */ for(tmp=st->text->curl, l=-st->top; tmp; tmp=tmp->prev, l++); if(l<0) return 0; + + text_update_character_width(st); if(st->showlinenrs) { - x = text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4; + x = st->cwidth*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4; } else { - x = text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET - 4; + x = st->cwidth*(st->text->curc-st->left) + TXT_OFFSET - 4; } y = ar->winy - st->lheight*l - 2; - w = SUGG_LIST_WIDTH*text_font_width_character(st) + 20; + w = SUGG_LIST_WIDTH*st->cwidth + 20; h = SUGG_LIST_SIZE*st->lheight + 8; // XXX getmouseco_areawin(mval); diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index ed825886a05..00353cfc457 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -510,7 +510,6 @@ void transform_autoik_update(TransInfo *t, short mode); int count_set_pose_transflags(int *out_mode, short around, struct Object *ob); /* auto-keying stuff used by special_aftertrans_update */ -short autokeyframe_cfra_can_key(struct Scene *scene, struct Object *ob); void autokeyframe_ob_cb_func(struct Scene *scene, struct View3D *v3d, struct Object *ob, int tmode); void autokeyframe_pose_cb_func(struct Scene *scene, struct View3D *v3d, struct Object *ob, int tmode, short targetless_ik); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 60d209ae2db..2262c6cdeaa 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -4312,21 +4312,6 @@ static void clear_trans_object_base_flags(TransInfo *t) } } -/* auto-keyframing feature - checks for whether anything should be done for the current frame */ -// TODO: this should probably be done per channel instead... -short autokeyframe_cfra_can_key(Scene *scene, Object *ob) -{ - float cfra= (float)CFRA; // XXX for now, this will do - - /* only filter if auto-key mode requires this */ - if (IS_AUTOKEY_ON(scene) == 0) - return 0; - else if (IS_AUTOKEY_MODE(scene, NORMAL)) - return 1; - else - return id_frame_has_keyframe(&ob->id, cfra, ANIMFILTER_KEYS_LOCAL); -} - /* auto-keyframing feature - for objects * tmode: should be a transform mode */ @@ -4335,7 +4320,8 @@ void autokeyframe_ob_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode) ID *id= &ob->id; FCurve *fcu; - if (autokeyframe_cfra_can_key(scene, ob)) { + // TODO: this should probably be done per channel instead... + if (autokeyframe_cfra_can_key(scene, id)) { AnimData *adt= ob->adt; float cfra= (float)CFRA; // xxx this will do for now short flag = 0; @@ -4436,7 +4422,8 @@ void autokeyframe_pose_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode, bPoseChannel *pchan; FCurve *fcu; - if (autokeyframe_cfra_can_key(scene, ob)) { + // TODO: this should probably be done per channel instead... + if (autokeyframe_cfra_can_key(scene, id)) { float cfra= (float)CFRA; short flag= 0; char buf[512]; diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index dc0ec51fa4f..951b12b82fe 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -293,7 +293,8 @@ typedef struct SpaceText { int top, viewlines; short flags, menunr; - int lheight; + short lheight; /* user preference */ + short cwidth; /* runtime computed */ int left; int showlinenrs; int tabnumber; diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 0709d2d58b0..4fab0de1f0a 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -122,6 +122,16 @@ typedef struct uiWidgetColors { short pad; } uiWidgetColors; +typedef struct uiWidgetStateColors { + char inner_anim[4]; + char inner_anim_sel[4]; + char inner_key[4]; + char inner_key_sel[4]; + char inner_driven[4]; + char inner_driven_sel[4]; + float blend, pad; +} uiWidgetStateColors; + typedef struct ThemeUI { /* Interface Elements (buttons, menus, icons) */ @@ -130,6 +140,8 @@ typedef struct ThemeUI { uiWidgetColors wcol_num, wcol_numslider; uiWidgetColors wcol_menu, wcol_pulldown, wcol_menu_back, wcol_menu_item; uiWidgetColors wcol_box, wcol_scroll; + + uiWidgetStateColors wcol_state; char iconfile[80]; // FILE_MAXFILE length diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 9bf3f54e159..fa81af8f140 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -799,11 +799,6 @@ static void rna_def_space_text(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem font_size_items[] = { - {12, "12", 0, "12", ""}, - {15, "15", 0, "15", ""}, - {0, NULL, 0, NULL, NULL}}; - srna= RNA_def_struct(brna, "SpaceTextEditor", "Space"); RNA_def_struct_sdna(srna, "SpaceText"); RNA_def_struct_ui_text(srna, "Space Text Editor", "Text editor space data."); @@ -848,9 +843,9 @@ static void rna_def_space_text(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Tab Width", "Number of spaces to display tabs with."); RNA_def_property_update(prop, NC_TEXT|ND_DISPLAY, NULL); - prop= RNA_def_property(srna, "font_size", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "lheight"); - RNA_def_property_enum_items(prop, font_size_items); + prop= RNA_def_property(srna, "font_size", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "lheight"); + RNA_def_property_range(prop, 8, 32); RNA_def_property_ui_text(prop, "Font Size", "Font size to use for displaying the text."); RNA_def_property_update(prop, NC_TEXT|ND_DISPLAY, NULL); diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 977c43e6b95..ffe3751908d 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -268,7 +268,50 @@ static void rna_def_userdef_theme_ui_wcol(BlenderRNA *brna) RNA_def_property_range(prop, -100, 100); RNA_def_property_ui_text(prop, "Shade Down", ""); RNA_def_property_update(prop, NC_WINDOW, NULL); +} + +static void rna_def_userdef_theme_ui_wcol_state(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "ThemeWidgetStateColors", NULL); + RNA_def_struct_sdna(srna, "uiWidgetStateColors"); + RNA_def_struct_ui_text(srna, "Theme Widget State Color", "Theme settings for widget state colors."); + + prop= RNA_def_property(srna, "inner_anim", PROP_FLOAT, PROP_COLOR); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Animated", ""); + RNA_def_property_update(prop, NC_WINDOW, NULL); + + prop= RNA_def_property(srna, "inner_anim_sel", PROP_FLOAT, PROP_COLOR); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Animated Selected", ""); + RNA_def_property_update(prop, NC_WINDOW, NULL); + prop= RNA_def_property(srna, "inner_key", PROP_FLOAT, PROP_COLOR); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Keyframe", ""); + RNA_def_property_update(prop, NC_WINDOW, NULL); + + prop= RNA_def_property(srna, "inner_key_sel", PROP_FLOAT, PROP_COLOR); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Keyframe Selected", ""); + RNA_def_property_update(prop, NC_WINDOW, NULL); + + prop= RNA_def_property(srna, "inner_driven", PROP_FLOAT, PROP_COLOR); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Driven", ""); + RNA_def_property_update(prop, NC_WINDOW, NULL); + + prop= RNA_def_property(srna, "inner_driven_sel", PROP_FLOAT, PROP_COLOR); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Driven Selected", ""); + RNA_def_property_update(prop, NC_WINDOW, NULL); + + prop= RNA_def_property(srna, "blend", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_ui_text(prop, "Blend", ""); + RNA_def_property_update(prop, NC_WINDOW, NULL); } static void rna_def_userdef_theme_ui(BlenderRNA *brna) @@ -277,6 +320,7 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna) PropertyRNA *prop; rna_def_userdef_theme_ui_wcol(brna); + rna_def_userdef_theme_ui_wcol_state(brna); srna= RNA_def_struct(brna, "ThemeUserInterface", NULL); RNA_def_struct_sdna(srna, "ThemeUI"); @@ -365,6 +409,12 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna) RNA_def_property_struct_type(prop, "ThemeWidgetColors"); RNA_def_property_ui_text(prop, "Scroll Widget Colors", ""); RNA_def_property_update(prop, NC_WINDOW, NULL); + + prop= RNA_def_property(srna, "wcol_state", PROP_POINTER, PROP_NEVER_NULL); + RNA_def_property_pointer_sdna(prop, NULL, "wcol_state"); + RNA_def_property_struct_type(prop, "ThemeWidgetStateColors"); + RNA_def_property_ui_text(prop, "State Colors", ""); + RNA_def_property_update(prop, NC_WINDOW, NULL); prop= RNA_def_property(srna, "icon_file", PROP_STRING, PROP_FILEPATH); RNA_def_property_string_sdna(prop, NULL, "iconfile"); -- cgit v1.2.3