Problem with eventX()

BlitzMax Forums/MaxGUI Module/Problem with eventX()

Smokey(Posted 2006) [#1]
Hi

can someone explain me what's wrong with this?
I really think that is a bug with EventX() but it's can be
me that don't understand how it's work .. here the code

the problem is when I try to position the panel in the window with the mouse I got strange thing the panel sometime don't position where the mouse is.

' createwindow.bmx

Strict 
Global MouseXEndPosi:Int
Global MouseYEndPosi:Int
Global selected:Int
Global window:TGadget=CreateWindow("My Window",40,40,320,240)
Global panelwindow:TGadget=CreatePanel(0,0,GadgetWidth(window),GadgetHeight(window),window,PANEL_ACTIVE)

Global SelectPan:TGadget=CreatePanel(20,20,30,30,panelwindow,PANEL_ACTIVE)
SetPanelColor( SelectPan,50,120,10 )

While True
	WaitEvent 
	Select EventID()
		Case EVENT_WINDOWCLOSE
			End
			
	    Case EVENT_MOUSEDOWN
	        If EventSource() = SelectPan Then selected = 1
	    Case EVENT_MOUSEMOVE
             MouseXEndPosi = EventX()
             MouseYEndPosi = EventY()
             Print MouseXEndPosi + "," + MouseYEndPosi
             Delay 100

	    Case EVENT_MOUSEUP
	          Local MouseXEndPosi = EventX()
             Local MouseYEndPosi = EventY()
	         Print "Before gadgetshape" + MouseXEndPosi + "," + MouseXEndPosi

	         SetGadgetShape( SelectPan,MouseXEndPosi,MouseYEndPosi,30,30 )
             Print "After gadgetshape" + MouseXEndPosi + "," + MouseXEndPosi
             Delay 100
	End Select
Wend



WendellM(Posted 2006) [#2]
I see two cases in which the panel isn't placed where the mouse cursor is when the button is clicked:

1. There's some lag caused by the two "Delay 100" statements, so that if the mouse is moved rapidly while clicking quickly, sometimes the green panel is placed at the position of the last click instead of the current one. Reducing the value of the Delay statements below 100 helps reduce this.

2. If the mouse is over the green, SelectPan, panel (30,30), it gets the coordinates within it, rather than within the usual panelwindow (320,240). This is because SelectPan is set to PANEL_ACTIVE. However, because the mouse events don't check the EventSource(), they treat these coordinates as if they were relative to the panelwindow and position SelectPanel somewhere between 0 and 29. This can be fixed by adding "If EventSource() = panelwindow Then" (or "If Not selected Then") before "SetGadgetShape( SelectPan,MouseXEndPosi,MouseYEndPosi,30,30 )".

I'm not certain that either of these is what you meant, but they're just what caught my eye.


Regular K(Posted 2006) [#3]


Works better, but if I double click on the panel, it reports 0,0 oddly...


Smokey(Posted 2006) [#4]
WendellM

What it suppost to do is if you click on SelectPan it set the var selected to 1 then I know that the mouse was click for this panel then I have another panel that cover the entire window then if the mouse move, it update the var MouseXendPosi then for the case mouseup I just try to position the panel you clicked at the new position.

remember that the SelectPan is only there for detecting if the mouse is click or not. I use EVENT_MOUSEUP to position the SelectPan where I want it to be and the
EVENT_MOUSEMOVE will be there to move in real time the SelectPan panel.

SelectPan is set ACTIVE because I want to move it when I click on it.... if I set it to PANEL_BORDER it's work
but it work all the time event if I don't click on it.


skidracer(Posted 2006) [#5]
You don't need panelwindow active, once a mouse has clicked down on a panel it is captured and all mousemove until mouseup events will come only from SelectPan.

Here's how I would do it:
Strict 

' offsets so pointer drag is relative to position panel was grabbed

Global selected:Int
Global selectx:Int
Global selecty:Int

Global window:TGadget=CreateWindow("My Window",40,40,320,240)
Global panelwindow:TGadget=CreatePanel(0,0,GadgetWidth(window),GadgetHeight(window),window,PANEL_ACTIVE)

Global SelectPan:TGadget=CreatePanel(20,20,30,30,panelwindow,PANEL_ACTIVE)
SetPanelColor( SelectPan,50,120,10 )

While True
	WaitEvent 
	Select EventID()
		Case EVENT_WINDOWCLOSE
			End
			
	    Case EVENT_MOUSEDOWN
	        If EventSource() = SelectPan
			selected=True
			selectx=EventX()
			selecty=EventY()
		EndIf

	    Case EVENT_MOUSEMOVE
		If selected
			Local x=GadgetX(SelectPan)+EventX()-selectx
			Local y=GadgetY(SelectPan)+EventY()-selecty
			Local w=GadgetWidth(SelectPan)
			Local h=GadgetHeight(SelectPan)
			SetGadgetShape( SelectPan,x,y,w,h)
		EndIf
				
	    Case EVENT_MOUSEUP
		selected=False
	End Select
Wend



Smokey(Posted 2006) [#6]
It's working :) I did't know about the panel thing

thanks skid

btw it's there a way to capture the mouse move
event if I pass over a gadget without having to press
the mouse button?