- wrapping failed with the cursor at the screen edge,
authorCampbell Barton <ideasman42@gmail.com>
Sat, 17 Oct 2009 14:54:13 +0000 (14:54 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 17 Oct 2009 14:54:13 +0000 (14:54 +0000)
- changed numbuts behavior with continuous grab so dragging back after passing the button limit immediately adjusts the value

intern/ghost/GHOST_Rect.h
intern/ghost/intern/GHOST_SystemX11.cpp
source/blender/editors/interface/interface_handlers.c

index 98169ad2aa496c4e20ef25b721f3ecf1042e1d4b..6a29b1ffc262e494be83d9529b6173517ee7ea61 100644 (file)
@@ -228,20 +228,19 @@ inline void GHOST_Rect::unionPoint(GHOST_TInt32 x, GHOST_TInt32 y)
        if (y < m_t) m_t = y;
        if (y > m_b) m_b = y;
 }
-
+#include <stdio.h>
 inline void GHOST_Rect::wrapPoint(GHOST_TInt32 &x, GHOST_TInt32 &y, GHOST_TInt32 ofs)
 {
        GHOST_TInt32 w= getWidth();
        GHOST_TInt32 h= getHeight();
 
        /* highly unlikely but avoid eternal loop */
-       if(w-ofs <= 0 || h-ofs <= 0)
+       if(w-ofs*2 <= 0 || h-ofs*2 <= 0)
                return;
-
-       while(x-ofs < m_l)              x+= w;
-       while(y-ofs < m_t)              y+= h;
-       while(x+ofs > m_r)              x-= w;
-       while(y+ofs > m_b)              y-= h;
+       while(x-ofs < m_l)              x+= w-(ofs*2);
+       while(y-ofs < m_t)              y+= h-(ofs*2);
+       while(x+ofs > m_r)              x-= w-(ofs*2);
+       while(y+ofs > m_b)              y-= h-(ofs*2);
 }
 
 inline bool GHOST_Rect::isInside(GHOST_TInt32 x, GHOST_TInt32 y) const
index abf0b612f9a7b65a993c76b0faf7fa609309ace6..122e6c55241de5a03c51846ee4e6c9654aa3bd68 100644 (file)
@@ -399,9 +399,7 @@ GHOST_SystemX11::processEvent(XEvent *xe)
 
                                /* could also clamp to screen bounds
                                 * wrap with a window outside the view will fail atm  */
-
-                               bounds.wrapPoint(x_new, y_new, 1); /* offset of one incase blender is at screen bounds */
-
+                               bounds.wrapPoint(x_new, y_new, 2); /* offset of one incase blender is at screen bounds */
                                window->getCursorGrabAccum(x_accum, y_accum);
 
                                if(x_new != xme.x_root || y_new != xme.y_root) {
index bce3806689963d71ddad6b76fadba8be71b2719d..018098b539bf0178609d124c5b4f11eabb5c452a 100644 (file)
@@ -2056,9 +2056,21 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i
                /* 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)) {
-                       tempf = data->startvalue + ((mx - data->dragstartx) * fac * 0.01*but->a1);
+                       fac *= 0.01*but->a1;
+                       tempf = data->startvalue + ((mx - data->dragstartx) * fac);
                        tempf= ui_numedit_apply_snapf(tempf, softmin, softmax, softrange, snap);
+
+#if 1          /* fake moving the click start, nicer for dragging back after passing the limit */
+                       if(tempf < softmin) {
+                               data->dragstartx -= (softmin-tempf) / fac;
+                               tempf= softmin;
+                       } else if (tempf > softmax) {
+                               data->dragstartx += (tempf-softmax) / fac;
+                               tempf= softmax;
+                       }
+#else
                        CLAMP(tempf, softmin, softmax);
+#endif
 
                        if(tempf != data->value) {
                                data->dragchange= 1;
@@ -2067,9 +2079,22 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i
                        }
                }
                else {
-                       temp= data->startvalue + (mx - data->dragstartx)/2; /* simple 2px == 1 */
+                       fac = 0.5; /* simple 2px == 1 */
+
+                       temp= data->startvalue + ((mx - data->dragstartx) * fac);
                        temp= ui_numedit_apply_snap(temp, softmin, softmax, snap);
+
+#if 1          /* fake moving the click start, nicer for dragging back after passing the limit */
+                       if(temp < softmin) {
+                               data->dragstartx -= (softmin-temp) / fac;
+                               temp= softmin;
+                       } else if (temp > softmax) {
+                               data->dragstartx += (temp-softmax) / fac;
+                               temp= softmax;
+                       }
+#else
                        CLAMP(temp, softmin, softmax);
+#endif
 
                        if(temp != data->value) {
                                data->dragchange= 1;
@@ -2077,6 +2102,8 @@ 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) */