No way to do mouseovers

Just starting out? Need help? Post your questions and find answers here.
tj1010
Posts: 218
Joined: Wed May 27, 2015 1:36 pm
Contact:

No way to do mouseovers

Post by tj1010 »

I don't see a way to do mouse over for image gadgets or any gadgets. I've looked in bindevent and I looked for other gadgets with mouse-over to maybe use in some hack, and inline JS has nothing but DOM structure to work with.. Using canvas which has flexible input requires widgets and handling to be coded.

In PB you did this with API hacks or coordinate monitoring, but bindevent doesn't get called on coordinate change.
bmon
Posts: 18
Joined: Thu Jun 04, 2015 4:21 pm

Re: No way to do mouseovers

Post by bmon »

Here is an example of one way. Although I'm sure that there may be more.

Code: Select all

EnableExplicit

Structure struct_MouseOverGadget
  id_Gadget.i
  x.i
  y.i
  width.i
  height.i
  id_ImageOff.i
  id_ImageOn.i
  mouseOver.i
EndStructure

Global MouseOverGadget.struct_MouseOverGadget
  
MouseOverGadget\id_Gadget = 10
MouseOverGadget\id_ImageOff = 0
MouseOverGadget\id_ImageOn = 1
MouseOverGadget\x = 20
MouseOverGadget\y = 20
MouseOverGadget\width = 30
MouseOverGadget\height = 30
MouseOverGadget\mouseOver = 0

Structure struct_Mouse
  x.i
  y.i
  buttonStatus.i
EndStructure

Global Mouse.struct_Mouse

CreateImage(MouseOverGadget\id_ImageOff,MouseOverGadget\width,MouseOverGadget\height)  ; CREATE THE IMAGE FOR OFF - BLUE SQUARE
If IsImage(MouseOverGadget\id_ImageOff)
  StartDrawing(ImageOutput(MouseOverGadget\id_ImageOff))
  Box(0,0,40,40,RGB(0,0,255))
  StopDrawing()
EndIf
CreateImage(MouseOverGadget\id_ImageOn,MouseOverGadget\width,MouseOverGadget\height)   ; CREATE THE IMAGE FOR ON - YELLOW SQUARE
If IsImage(MouseOverGadget\id_ImageOn)
  StartDrawing(ImageOutput(MouseOverGadget\id_ImageOn))
  Box(0,0,40,40,RGB(255,255,0))
  StopDrawing()
EndIf

Procedure _CanvasGadget()  ; CHECK FOR CANVAS GADGET EVENTS IN THIS PROCEDURE
  
  If EventType() = #PB_EventType_MouseMove
    Mouse\x = GetGadgetAttribute(1,#PB_Canvas_MouseX)
    Mouse\y = GetGadgetAttribute(1,#PB_Canvas_MouseY)    ; **BUG?** - RETURNS A FLOAT VALUE FOR SOME REASON
    Debug Str(Mouse\x) + "  " + Str(Mouse\y)
  EndIf
  
  ; CHECK MOUSE POSITION TO SEE IF OVER THE AREA
  If Mouse\x > MouseOverGadget\x And Mouse\x < MouseOverGadget\x + MouseOverGadget\width And Mouse\y > MouseOverGadget\y And Mouse\y < MouseOverGadget\y + MouseOverGadget\height
    If MouseOverGadget\mouseOver = 0    
      MouseOverGadget\mouseOver = 1
      SetGadgetState(MouseOverGadget\id_Gadget,ImageID(MouseOverGadget\id_ImageOn))  ; SET IMAGE TO ON (YELLOW SQUARE)
      SetGadgetAttribute(1,#PB_Canvas_Cursor,#PB_Cursor_Hand)  ; **BUG?** CURRENTLY NOT WORKING
    EndIf
  Else  ; NOT OVER THE AREA
    If MouseOverGadget\mouseOver = 1
      MouseOverGadget\mouseOver = 0
      SetGadgetState(MouseOverGadget\id_Gadget,ImageID(MouseOverGadget\id_ImageOff))  ; SET IMAGE TO OFF (BLUE SQUARE)
      SetGadgetAttribute(1,#PB_Canvas_Cursor,#PB_Cursor_Default)  ; **BUG?** CURRENTLY NOT WORKING
    EndIf
  EndIf
  
EndProcedure

If OpenWindow(1,0,0,640,480,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ;CanvasGadget(1,0,0,640,480)  ; **BUG?** - UNCOMMENT THIS LINE TO SEE THAT _CanvasGadget() ROUTINE DOESN'T FIRE WHEN MOUSE OVER THE SPECIFIED AREA
  ImageGadget(MouseOverGadget\id_Gadget,MouseOverGadget\x,MouseOverGadget\y,MouseOverGadget\width,MouseOverGadget\height,ImageID(MouseOverGadget\id_ImageOff))
  CanvasGadget(1,0,0,640,480) ; DECLARE CanvasGadget() AS THE LAST GADGET(SEE LINE ABOVE WHEN DECLARED EARLIER)
EndIf

BindGadgetEvent(1,@_CanvasGadget())   ; MUST BE DECLARED AFTER THE CANVAS GADGET IS CREATED

Please note that some of the features aren't working as expected. Possibly bugs? ... Hope this helps
Post Reply