Skip to content

Commit 4400d3a

Browse files
committed
Making box more responsive.
1 parent ae4e15c commit 4400d3a

File tree

2 files changed

+53
-37
lines changed

2 files changed

+53
-37
lines changed

BBX/BBX.BAS

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,14 @@ $END IF
5050
SCREEN _NEWIMAGE(800, 600, 32)
5151
_TITLE "QB64_GJ_LIB BBX Bounding Box Library Demo - Arrows move, Ctrl+Arrows resize (Shift=10x)"
5252
$RESIZE:ON
53-
_DISPLAYORDER _SOFTWARE
5453
_MOUSESHOW
55-
5654
GJ_BBX_InitDefaults
5755

5856
DO
5957
CLS
6058
GJ_BBX_Tick _TRUE ' show HUD
6159
_DISPLAY
60+
_LIMIT 60 ' High framerate for instant mouse response
6261
LOOP UNTIL _KEYHIT = 27
6362
END
6463

BBX/BBX.BM

Lines changed: 52 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ $INCLUDEONCE
4848
'
4949
SUB GJ_BBX_InitDefaults
5050
' Default config
51-
GJ_BBX_CFG.HandleHalfSize = 6
51+
GJ_BBX_CFG.HandleHalfSize = 3
5252
GJ_BBX_CFG.HandleFullSize = GJ_BBX_CFG.HandleHalfSize * 2
53-
GJ_BBX_CFG.EdgeHalfSize = 4
53+
GJ_BBX_CFG.EdgeHalfSize = 3
5454
GJ_BBX_CFG.EdgeFullSize = GJ_BBX_CFG.EdgeHalfSize * 2
5555
GJ_BBX_CFG.HandleCornerSize = GJ_BBX_CFG.HandleFullSize
5656
GJ_BBX_CFG.HandleEdgeSize = GJ_BBX_CFG.EdgeFullSize
@@ -128,58 +128,68 @@ SUB GJ_BBX_Update
128128
GJ_BBX_PollMouse GJ_BBX_mouse, _FALSE
129129
GJ_BBX_box.hoverHandle = GJ_BBX_GetHoverHandle%(GJ_BBX_mouse.x, GJ_BBX_mouse.y, GJ_BBX_box)
130130

131+
DIM justStartedAction AS INTEGER: justStartedAction = _FALSE
132+
131133
IF GJ_BBX_box.state < GJ_BBX_STATE_RESIZE_BASE AND GJ_BBX_box.hoverHandle AND GJ_BBX_mouse.clicked THEN
132134
GJ_BBX_box.activeHandle = GJ_BBX_box.hoverHandle
133135
GJ_BBX_box.state = GJ_BBX_STATE_RESIZE_BASE + GJ_BBX_box.activeHandle
134136
GJ_BBX_box.selected = _TRUE
135137
GJ_BBX_box.wasClickedInside = _FALSE
138+
justStartedAction = _TRUE
139+
' Start resizing immediately on click
140+
GJ_BBX_ResizeFromHandle GJ_BBX_box, GJ_BBX_mouse
141+
IF GJ_BBX_box.w < GJ_BBX_CFG.MinBoxWidth THEN GJ_BBX_box.w = GJ_BBX_CFG.MinBoxWidth
142+
IF GJ_BBX_box.h < GJ_BBX_CFG.MinBoxHeight THEN GJ_BBX_box.h = GJ_BBX_CFG.MinBoxHeight
136143
ELSEIF GJ_BBX_box.state < GJ_BBX_STATE_RESIZE_BASE AND GJ_BBX_PointInBox%(GJ_BBX_mouse.x, GJ_BBX_mouse.y, GJ_BBX_box) AND GJ_BBX_mouse.clicked THEN
137144
GJ_BBX_box.offsetX = GJ_BBX_mouse.x - GJ_BBX_box.x
138145
GJ_BBX_box.offsetY = GJ_BBX_mouse.y - GJ_BBX_box.y
139146
GJ_BBX_box.state = GJ_BBX_STATE_DRAG
140147
GJ_BBX_box.selected = _TRUE
141148
GJ_BBX_box.wasClickedInside = _TRUE
149+
justStartedAction = _TRUE
142150
END IF
143151

144-
IF GJ_BBX_box.state >= GJ_BBX_STATE_RESIZE_BASE THEN
145-
IF GJ_BBX_mouse.held THEN
146-
GJ_BBX_ResizeFromHandle GJ_BBX_box, GJ_BBX_mouse
147-
IF GJ_BBX_box.w < GJ_BBX_CFG.MinBoxWidth THEN GJ_BBX_box.w = GJ_BBX_CFG.MinBoxWidth
148-
IF GJ_BBX_box.h < GJ_BBX_CFG.MinBoxHeight THEN GJ_BBX_box.h = GJ_BBX_CFG.MinBoxHeight
149-
ELSE
150-
GJ_BBX_box.state = GJ_BBX_STATE_SELECTED
151-
END IF
152-
ELSEIF GJ_BBX_box.state = GJ_BBX_STATE_DRAG THEN
153-
IF GJ_BBX_mouse.held THEN
154-
GJ_BBX_box.x = GJ_BBX_mouse.x - GJ_BBX_box.offsetX
155-
GJ_BBX_box.y = GJ_BBX_mouse.y - GJ_BBX_box.offsetY
156-
ELSE
157-
GJ_BBX_box.state = GJ_BBX_STATE_SELECTED
158-
GJ_BBX_box.selected = _TRUE
159-
END IF
160-
ELSE
161-
IF GJ_BBX_mouse.released THEN
162-
IF GJ_BBX_box.wasClickedInside THEN
163-
GJ_BBX_box.selected = _TRUE
164-
GJ_BBX_box.wasClickedInside = _FALSE
165-
ELSEIF NOT GJ_BBX_PointInBox%(GJ_BBX_mouse.x, GJ_BBX_mouse.y, GJ_BBX_box) THEN
166-
GJ_BBX_box.selected = _FALSE
167-
GJ_BBX_box.state = GJ_BBX_STATE_IDLE
168-
GJ_BBX_box.wasClickedInside = _FALSE
152+
IF NOT justStartedAction THEN
153+
IF GJ_BBX_box.state >= GJ_BBX_STATE_RESIZE_BASE THEN
154+
IF GJ_BBX_mouse.held THEN
155+
GJ_BBX_ResizeFromHandle GJ_BBX_box, GJ_BBX_mouse
156+
IF GJ_BBX_box.w < GJ_BBX_CFG.MinBoxWidth THEN GJ_BBX_box.w = GJ_BBX_CFG.MinBoxWidth
157+
IF GJ_BBX_box.h < GJ_BBX_CFG.MinBoxHeight THEN GJ_BBX_box.h = GJ_BBX_CFG.MinBoxHeight
158+
ELSE
159+
GJ_BBX_box.state = GJ_BBX_STATE_SELECTED
169160
END IF
170-
END IF
171-
172-
IF GJ_BBX_box.selected THEN
173-
IF GJ_BBX_PointInBox%(GJ_BBX_mouse.x, GJ_BBX_mouse.y, GJ_BBX_box) THEN
174-
GJ_BBX_box.state = GJ_BBX_STATE_SELECTED_HOVER
161+
ELSEIF GJ_BBX_box.state = GJ_BBX_STATE_DRAG THEN
162+
IF GJ_BBX_mouse.held THEN
163+
GJ_BBX_box.x = GJ_BBX_mouse.x - GJ_BBX_box.offsetX
164+
GJ_BBX_box.y = GJ_BBX_mouse.y - GJ_BBX_box.offsetY
175165
ELSE
176166
GJ_BBX_box.state = GJ_BBX_STATE_SELECTED
167+
GJ_BBX_box.selected = _TRUE
177168
END IF
178169
ELSE
179-
IF GJ_BBX_PointInBox%(GJ_BBX_mouse.x, GJ_BBX_mouse.y, GJ_BBX_box) THEN
180-
GJ_BBX_box.state = GJ_BBX_STATE_HOVER
170+
IF GJ_BBX_mouse.released THEN
171+
IF GJ_BBX_box.wasClickedInside THEN
172+
GJ_BBX_box.selected = _TRUE
173+
GJ_BBX_box.wasClickedInside = _FALSE
174+
ELSEIF NOT GJ_BBX_PointInBox%(GJ_BBX_mouse.x, GJ_BBX_mouse.y, GJ_BBX_box) THEN
175+
GJ_BBX_box.selected = _FALSE
176+
GJ_BBX_box.state = GJ_BBX_STATE_IDLE
177+
GJ_BBX_box.wasClickedInside = _FALSE
178+
END IF
179+
END IF
180+
181+
IF GJ_BBX_box.selected THEN
182+
IF GJ_BBX_PointInBox%(GJ_BBX_mouse.x, GJ_BBX_mouse.y, GJ_BBX_box) THEN
183+
GJ_BBX_box.state = GJ_BBX_STATE_SELECTED_HOVER
184+
ELSE
185+
GJ_BBX_box.state = GJ_BBX_STATE_SELECTED
186+
END IF
181187
ELSE
182-
GJ_BBX_box.state = GJ_BBX_STATE_IDLE
188+
IF GJ_BBX_PointInBox%(GJ_BBX_mouse.x, GJ_BBX_mouse.y, GJ_BBX_box) THEN
189+
GJ_BBX_box.state = GJ_BBX_STATE_HOVER
190+
ELSE
191+
GJ_BBX_box.state = GJ_BBX_STATE_IDLE
192+
END IF
183193
END IF
184194
END IF
185195
END IF
@@ -365,6 +375,12 @@ SUB GJ_BBX_Draw (showHUD AS INTEGER)
365375
COLOR _RGB32(255, 255, 255)
366376
LOCATE 2, 2
367377
PRINT "State:"; GJ_BBX_box.state; " HoverHandle:"; GJ_BBX_box.hoverHandle; " Selected:"; GJ_BBX_box.selected
378+
LOCATE 3, 2
379+
PRINT "Mouse- X:"; GJ_BBX_mouse.x; "Y:"; GJ_BBX_mouse.y; "Held:"; GJ_BBX_mouse.held; "Clicked:"; GJ_BBX_mouse.clicked
380+
LOCATE 4, 2
381+
PRINT "Box- X:"; GJ_BBX_box.x; "Y:"; GJ_BBX_box.y; "W:"; GJ_BBX_box.w; "H:"; GJ_BBX_box.h
382+
LOCATE 5, 2
383+
PRINT "ActiveHandle:"; GJ_BBX_box.activeHandle; " wasClickedInside:"; GJ_BBX_box.wasClickedInside
368384
END IF
369385
END SUB
370386

@@ -389,6 +405,7 @@ SUB GJ_BBX_PollMouse (m AS GJ_BBX_MouseState, init AS INTEGER)
389405
STATIC lastX AS INTEGER, lastY AS INTEGER, lastHeld AS INTEGER
390406

391407
IF init THEN
408+
WHILE _MOUSEINPUT: WEND
392409
lastX = _MOUSEX: lastY = _MOUSEY: lastHeld = _MOUSEBUTTON(1)
393410
m.x = lastX: m.y = lastY: m.dx = 0: m.dy = 0
394411
m.held = lastHeld: m.clicked = _FALSE: m.released = _FALSE

0 commit comments

Comments
 (0)