diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-10-17 18:08:01 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-10-17 18:08:01 +0400 |
commit | 91d89c1ff7c215744e46957a1e7cc40adb7ac066 (patch) | |
tree | a811c95542f7fd40ff13cf592dfff1077a34f7d4 /intern/ghost/GHOST_Rect.h | |
parent | 53624a53d9054a91688a1a988c6f3515ab601923 (diff) |
Adjustments to continuous grab
- Use an enum for grab modes rather then boolean options.
-- GHOST_kGrabNormal: continuous grab userpref disabled
-- GHOST_kGrabWrap: wrap the mouse at the screen bounds *
-- GHOST_kGrabHide: hide the mouse while grabbing and restore the mouse where it was initially pressed *
GrabWrap is nice for transform and tools where you want some idea where the cursor is, previously I found both restoring the mouse at its original location and restoring at a clamped location was confusing with operators like transform, wrapping is not ideal but IMHO the best of a bad bunch of options.
GrabHide is for numbuts, where restoring the mouse at the initial location isnt so confusing.
Diffstat (limited to 'intern/ghost/GHOST_Rect.h')
-rw-r--r-- | intern/ghost/GHOST_Rect.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/intern/ghost/GHOST_Rect.h b/intern/ghost/GHOST_Rect.h index 6271ecad408..98169ad2aa4 100644 --- a/intern/ghost/GHOST_Rect.h +++ b/intern/ghost/GHOST_Rect.h @@ -127,6 +127,13 @@ public: virtual inline void unionPoint(GHOST_TInt32 x, GHOST_TInt32 y); /** + * Grows the rectangle to included a point. + * @param x The x-coordinate of the point. + * @param y The y-coordinate of the point. + */ + virtual inline void wrapPoint(GHOST_TInt32 &x, GHOST_TInt32 &y, GHOST_TInt32 ofs); + + /** * Returns whether the point is inside this rectangle. * Point on the boundary is considered inside. * @param x x-coordinate of point to test. @@ -222,6 +229,21 @@ inline void GHOST_Rect::unionPoint(GHOST_TInt32 x, GHOST_TInt32 y) if (y > m_b) m_b = y; } +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) + 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; +} + inline bool GHOST_Rect::isInside(GHOST_TInt32 x, GHOST_TInt32 y) const { return (x >= m_l) && (x <= m_r) && (y >= m_t) && (y <= m_b); |