diff options
author | Martin Poirier <theeth@yahoo.com> | 2009-12-10 03:28:18 +0300 |
---|---|---|
committer | Martin Poirier <theeth@yahoo.com> | 2009-12-10 03:28:18 +0300 |
commit | 456c11c822191ac289120f56d06846d3a0e93549 (patch) | |
tree | c9dc00d67cc8e5d58b739456c81fee29a46afd44 /source | |
parent | ce65569708e666cd9bdb8cc620185394104eed24 (diff) |
textedit string needs to be one byte longer than maxlen, for terminator.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 161 |
1 files changed, 46 insertions, 115 deletions
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index fe6635d60ab..4a7f00d7520 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -71,78 +71,6 @@ #define BUTTON_AUTO_OPEN_THRESH 0.3 #define BUTTON_MOUSE_TOWARDS_THRESH 1.0 -typedef enum uiButtonActivateType { - BUTTON_ACTIVATE_OVER, - BUTTON_ACTIVATE, - BUTTON_ACTIVATE_APPLY, - BUTTON_ACTIVATE_TEXT_EDITING, - BUTTON_ACTIVATE_OPEN -} uiButtonActivateType; - -typedef enum uiHandleButtonState { - BUTTON_STATE_INIT, - BUTTON_STATE_HIGHLIGHT, - BUTTON_STATE_WAIT_FLASH, - BUTTON_STATE_WAIT_RELEASE, - BUTTON_STATE_WAIT_KEY_EVENT, - BUTTON_STATE_NUM_EDITING, - BUTTON_STATE_TEXT_EDITING, - BUTTON_STATE_TEXT_SELECTING, - BUTTON_STATE_MENU_OPEN, - BUTTON_STATE_EXIT -} uiHandleButtonState; - -typedef struct uiHandleButtonData { - wmWindowManager *wm; - wmWindow *window; - ARegion *region; - - int interactive; - - /* overall state */ - uiHandleButtonState state; - int cancel, escapecancel, retval; - int applied, appliedinteractive; - wmTimer *flashtimer; - - /* edited value */ - char *str, *origstr; - double value, origvalue, startvalue; - float vec[3], origvec[3]; - int togdual, togonly; - ColorBand *coba; - CurveMapping *cumap; - - /* tooltip */ - ARegion *tooltip; - wmTimer *tooltiptimer; - - /* auto open */ - int used_mouse; - wmTimer *autoopentimer; - - /* text selection/editing */ - int maxlen, selextend, selstartx; - - /* number editing / dragging */ - int draglastx, draglasty; - int dragstartx, dragstarty; - int dragchange, draglock, dragsel; - float dragf, dragfstart; - CBData *dragcbd; - - /* menu open */ - uiPopupBlockHandle *menu; - int menuretval; - - /* search box */ - ARegion *searchbox; - - /* post activate */ - uiButtonActivateType posttype; - uiBut *postbut; -} uiHandleButtonData; - typedef struct uiAfterFunc { struct uiAfterFunc *next, *prev; @@ -1411,7 +1339,7 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data) /* retrieve string */ data->maxlen= ui_get_but_string_max_length(but); - data->str= MEM_callocN(sizeof(char)*data->maxlen, "textedit str"); + data->str= MEM_callocN(sizeof(char)*data->maxlen + 1, "textedit str"); /* +1 for terminator */ ui_get_but_string(but, data->str, data->maxlen); data->origstr= BLI_strdup(data->str); @@ -1689,7 +1617,7 @@ static void ui_do_but_textedit_select(bContext *C, uiBlock *block, uiBut *but, u static void ui_numedit_begin(uiBut *but, uiHandleButtonData *data) { - float softrange, softmin, softmax; + float softmin, softmax; if(but->type == BUT_CURVE) { data->cumap= (CurveMapping*)but->poin; @@ -1712,9 +1640,9 @@ static void ui_numedit_begin(uiBut *but, uiHandleButtonData *data) softmin= but->softmin; softmax= but->softmax; - softrange= softmax - softmin; + data->softrange = (float)pow(10, floorf(log10(softmax - softmin) + 0.5)); - data->dragfstart= (softrange == 0.0)? 0.0: (data->value - softmin)/softrange; + data->dragfstart= (data->softrange == 0.0)? 0.0: (data->value - softmin)/data->softrange; data->dragf= data->dragfstart; } @@ -2036,12 +1964,16 @@ static float ui_numedit_apply_snap(int temp, float softmin, float softmax, int s return temp; } -static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, int snap, int mx) +static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, int snap, int mx, int my) { - float deler, tempf, softmin, softmax, softrange; + float deler, tempf, softmin, softmax; + //float ladder = powf(10.0, floorf((my - data->dragstarty + 25) / 50.0f)); + float ladder = 1.0f; int lvalue, temp, changed= 0; - if(mx == data->draglastx) + printf("(%i, %i)\n", mx, my); + + if(mx == data->draglastx && my == data->draglasty) return changed; /* drag-lock - prevent unwanted scroll adjustments */ @@ -2056,16 +1988,14 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i softmin= but->softmin; softmax= but->softmax; - softrange= softmax - softmin; - if(ui_is_a_warp_but(but)) { /* Mouse location isn't screen clamped to the screen so use a linear mapping * 2px == 1-int, or 1px == 1-ClickStep */ if(ui_is_but_float(but)) { fac *= 0.01*but->a1; - tempf = data->startvalue + ((mx - data->dragstartx) * fac); - tempf= ui_numedit_apply_snapf(tempf, softmin, softmax, softrange, snap); + tempf = data->startvalue + ((mx - data->dragstartx) * fac) * ladder; + tempf= ui_numedit_apply_snapf(tempf, softmin, softmax, data->softrange, snap); #if 1 /* fake moving the click start, nicer for dragging back after passing the limit */ if(tempf < softmin) { @@ -2088,8 +2018,12 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i else { fac = 0.5; /* simple 2px == 1 */ - temp= data->startvalue + ((mx - data->dragstartx) * fac); + temp= data->startvalue + floorf((mx - data->dragstartx) * fac) * ladder; temp= ui_numedit_apply_snap(temp, softmin, softmax, snap); + +// printf("x %i y %i\n", mx, my); +// printf("temp %i, dragstartx %i ladder %f\n", temp, data->dragstartx, ladder); + #if 1 /* fake moving the click start, nicer for dragging back after passing the limit */ if(temp < softmin) { @@ -2109,33 +2043,31 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i changed= 1; } } - - data->draglastx= mx; } else { /* Use a non-linear mapping of the mouse drag especially for large floats (normal behavior) */ - deler= 500; + deler= 1000; if(!ui_is_but_float(but)) { - if((softrange)<100) deler= 200.0; - if((softrange)<25) deler= 50.0; + if((data->softrange)<100) deler= 200.0; + if((data->softrange)<25) deler= 50.0; } deler /= fac; - if(ui_is_but_float(but) && softrange > 11) { + if(ui_is_but_float(but) && data->softrange > 11) { /* non linear change in mouse input- good for high precicsion */ - data->dragf+= (((float)(mx-data->draglastx))/deler) * (fabs(data->dragstartx-mx)*0.002); - } else if (!ui_is_but_float(but) && softrange > 129) { /* only scale large int buttons */ + data->dragf+= (((float)(mx-data->draglastx))/deler) * (fabs(data->dragstartx-mx)*0.002)*ladder; + } else if (!ui_is_but_float(but) && data->softrange > 129) { /* only scale large int buttons */ /* non linear change in mouse input- good for high precicsionm ints need less fine tuning */ - data->dragf+= (((float)(mx-data->draglastx))/deler) * (fabs(data->dragstartx-mx)*0.004); + data->dragf+= (((float)(mx-data->draglastx))/deler) * (fabs(data->dragstartx-mx)*0.004)*ladder; } else { /*no scaling */ - data->dragf+= ((float)(mx-data->draglastx))/deler ; + data->dragf+= ((float)(mx-data->draglastx))/deler*ladder ; } - if(data->dragf>1.0) data->dragf= 1.0; - if(data->dragf<0.0) data->dragf= 0.0; - data->draglastx= mx; - tempf= (softmin + data->dragf*softrange); + tempf= (softmin + data->dragf*data->softrange); + + if (tempf > softmax) data->dragf = (softmax - softmin) / data->softrange; + if (tempf < softmin) data->dragf = softmin / data->softrange; if(!ui_is_but_float(but)) { @@ -2154,7 +2086,7 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i } else { temp= 0; - tempf= ui_numedit_apply_snapf(tempf, softmin, softmax, softrange, snap); + tempf= ui_numedit_apply_snapf(tempf, softmin, softmax, data->softrange, snap); CLAMP(tempf, softmin, softmax); @@ -2166,6 +2098,8 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i } } + data->draglastx= mx; + data->draglasty= my; return changed; } @@ -2199,6 +2133,7 @@ static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButton } else if(event->type == LEFTMOUSE) { data->dragstartx= data->draglastx= ui_is_a_warp_but(but) ? screen_mx:mx; + data->dragstarty= data->draglasty= ui_is_a_warp_but(but) ? screen_my:my; button_activate_state(C, but, BUTTON_STATE_NUM_EDITING); retval= WM_UI_HANDLER_BREAK; } @@ -2229,7 +2164,7 @@ static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButton snap= (event->ctrl)? (event->shift)? 2: 1: 0; - if(ui_numedit_but_NUM(but, data, fac, snap, (ui_is_a_warp_but(but) ? screen_mx:mx))) + if(ui_numedit_but_NUM(but, data, fac, snap, (ui_is_a_warp_but(but) ? screen_mx:mx), (ui_is_a_warp_but(but) ? screen_my:my))) ui_numedit_apply(C, block, but, data); } retval= WM_UI_HANDLER_BREAK; @@ -2309,12 +2244,11 @@ static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButton static int ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, int shift, int ctrl, int mx) { - float deler, f, tempf, softmin, softmax, softrange; + float deler, f, tempf, softmin, softmax; int temp, lvalue, changed= 0; softmin= but->softmin; softmax= but->softmax; - softrange= softmax - softmin; if(but->type==NUMSLI) deler= ((but->x2-but->x1) - 5.0*but->aspect); else if(but->type==HSVSLI) deler= ((but->x2-but->x1)/2 - 5.0*but->aspect); @@ -2330,8 +2264,8 @@ static int ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, int shift, i if(shift) f= (f-data->dragfstart)/10.0 + data->dragfstart; - CLAMP(f, 0.0, 1.0); - tempf= softmin + f*softrange; + //CLAMP(f, 0.0, 1.0); + tempf= softmin + f * data->softrange; temp= floor(tempf+.5); if(ctrl) { @@ -2415,7 +2349,9 @@ static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButton } else if(event->type == LEFTMOUSE) { data->dragstartx= mx; + data->dragstarty= my; data->draglastx= mx; + data->draglasty= my; button_activate_state(C, but, BUTTON_STATE_NUM_EDITING); retval= WM_UI_HANDLER_BREAK; } @@ -2453,14 +2389,13 @@ static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButton if(click) { if (click==2) { /* nudge slider to the left or right */ - float f, tempf, softmin, softmax, softrange; + float f, tempf, softmin, softmax; int temp; button_activate_state(C, but, BUTTON_STATE_NUM_EDITING); softmin= but->softmin; softmax= but->softmax; - softrange= softmax - softmin; tempf= data->value; temp= (int)data->value; @@ -2469,7 +2404,7 @@ static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButton if(but->type==SLI) f= (float)(mx-but->x1)/(but->x2-but->x1); else f= (float)(mx- but->x1)/(but->x2-but->x1); - f= softmin + f*softrange; + f= softmin + f * data->softrange; if(!ui_is_but_float(but)) { if(f<temp) temp--; @@ -2516,14 +2451,10 @@ static int ui_do_but_SCROLL(bContext *C, uiBlock *block, uiBut *but, uiHandleBut if(data->state == BUTTON_STATE_HIGHLIGHT) { if(event->val==KM_PRESS) { if(event->type == LEFTMOUSE) { - if(horizontal) { - data->dragstartx= mx; - data->draglastx= mx; - } - else { - data->dragstartx= my; - data->draglastx= my; - } + data->dragstartx= mx; + data->draglastx= mx; + data->dragstartx= my; + data->draglastx= my; button_activate_state(C, but, BUTTON_STATE_NUM_EDITING); retval= WM_UI_HANDLER_BREAK; } |