@@ -48,9 +48,9 @@ $INCLUDEONCE
4848'
4949SUB 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
369385END 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