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:
authorMartin Poirier <theeth@yahoo.com>2009-12-10 03:28:18 +0300
committerMartin Poirier <theeth@yahoo.com>2009-12-10 03:28:18 +0300
commit456c11c822191ac289120f56d06846d3a0e93549 (patch)
treec9dc00d67cc8e5d58b739456c81fee29a46afd44 /source
parentce65569708e666cd9bdb8cc620185394104eed24 (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.c161
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;
}