RUBY - XY Surface

For general discussion related FlowStone
Rocko
Posts: 186
Joined: Tue May 15, 2012 12:42 pm

RUBY - XY Surface

Post by Rocko »

Dear all,

I'm practicing RUBY and feel a bit frustrated (even after peeping into 'FlowStone GURU' which is amazing...).

I'd built this XY surface pad, but mouse is still 'hand shaped' even after mouse is dragged out of draw area.
How can I limit this? I couldn't get to changing any of the methods correctly...

appreciated !
Attachments
XY_surface.fsm
(1.24 KiB) Downloaded 1124 times
tulamide
Posts: 2714
Joined: Sat Jun 21, 2014 2:48 pm
Location: Germany

Re: RUBY - XY Surface

Post by tulamide »

Just replace

Code: Select all

mouseLUp

by

Code: Select all

mouseLUpCaptured


See also http://www.dsprobotics.com/support/viewtopic.php?f=3&t=3507
"There lies the dog buried" (German saying translated literally)
Rocko
Posts: 186
Joined: Tue May 15, 2012 12:42 pm

Re: RUBY - XY Surface

Post by Rocko »

Thanks Tulamide, appreciated. Please notice that it doesn't seem to do the trick..

I had changed the 'LUp' to 'LUpCatpured' and the perfromance is the same. Even if mouse is out of 'view' area, the XY float values still change.
Please see attached schematic.

On the 'FlowStone GURU' forum, 'basic switch', you mention:

Another important method we will need is “isInMousePoint”, this tells Flowstone that our Ruby component wants to enable mouse actions (click, drag ect). This is very important! If you forget to define this method but implement other mouse methods such as “mouseLDown” they will not work. So if you need mouse events always remember “isInMousePoint”. The method returns either true or false. You can assign the mouse area to a specific region using this method, you just check if the x and y values are within an area and return true or else return false. In this simple button example we will not worry about areas and instead just return true, now the whole of the button area will be clickable.


How can I achieve limiting the 'isinmousepoint to the size of view screen only? I can't get the syntax right.

Thanks,
Rocko
Attachments
XY_surface_v2.fsm
(1.35 KiB) Downloaded 1121 times
tulamide
Posts: 2714
Joined: Sat Jun 21, 2014 2:48 pm
Location: Germany

Re: RUBY - XY Surface

Post by tulamide »

Hey Rocko,

sorry for the confusion, I was just reacting to
I'd built this XY surface pad, but mouse is still 'hand shaped' even after mouse is dragged out of draw area.


This lead me to think you had the usual issue of not receiving the mouse up message. I've done 3 in-depth tutorials about Ruby, but the one you quote is by Exo ;)

Now that you described your issue more clearly, I hope the attached fsm will solve it. You can't use the "isInMousePoint" method for that. The method is only reporting outside of any "captured" methods. What you need is to tell Ruby in the "mouseMoveCaptured" method, what exactly you want to output. You do that using the if-statement. The example should be self-explanatory.
Attachments
XY_surface_v2[tula].fsm
(1.41 KiB) Downloaded 1101 times
"There lies the dog buried" (German saying translated literally)
Rocko
Posts: 186
Joined: Tue May 15, 2012 12:42 pm

Re: RUBY - XY Surface

Post by Rocko »

Hi,

Thanks appreciated. I'm learning the syntax... So, thank you and Exo for the explanations.

With the new schematic, if I drag the 'black dot' all the way out of the 'view' it is still operative at least in one axis. This is because of the build of the 'if' statement.
My question is if there is a good way for the mouse to stop being 'hand shaped' and stop being responsive (black dot stays at last coordinate) once the mouse is dragged out of the view itself.

Kind of:
if (mouse is out of view) then (pointer = arrow and black_dot at last position)

I'll be playing with it, but if you have any hints, please share - thanks !
tulamide
Posts: 2714
Joined: Sat Jun 21, 2014 2:48 pm
Location: Germany

Re: RUBY - XY Surface

Post by tulamide »

Haha, now we come closer to the real goal. Ok, here's a few things:

The black dot is only out of the view, because you start the draw at the mouse position. If you want the dot to be visible at all times, you must reduce the mouse area by the width and height of the dot.

I would not recommend to stop any movement as long as the mouse is outside the view. Just think of this: The mouse is just at the center of the view. Now the user moves his mouse ultra-fast (no problem with a high dpi mouse). The next position that the system reports to Ruby will be out of the view, so no movement of the dot at all is happening. This will confuse the user, as he will think that the control doesn't work.

If you want to do it that way nevertheless, you again just have to use if-statements that reflect your wishes. But you can't reset the mouse cursor postion, that is system controlled. You can only influence what's drawn in the view.

if (mouse is out of view) then (pointer = arrow and black_dot at last position)

It is easy, once you are used to. First part
"if (mouse is out of view)"
The user manual tells you everything about Ruby in chapter 8. One thing mentioned there is the class method "getViewSize". It returns an array in this form [w, h]. You can use that to only allow any dot movement, when the mouse is inside that rectangle:

Code: Select all

if x.between?(0, getViewSize[0]) and y.between?(0, getViewSize[1])
    # do your code
end

Now the dot is not moved anymore whenever the mouse is outside the view.

You can change the mousecursor appearance with the method "mouseCursor x, y", as stated in the user manual. However, this will normally only be active, if the mouse is inside the view. You could try it, but I don't think it works.
"There lies the dog buried" (German saying translated literally)
Rocko
Posts: 186
Joined: Tue May 15, 2012 12:42 pm

Re: RUBY - XY Surface

Post by Rocko »

Thanks for the answer. Very good points...

This is what I have done then:

Code: Select all

@x_size=getViewSize[0]-1
@y_size=getViewSize[1]-1

def isInMousePoint x,y
   true
end

def mouseLDown x,y
   captureMouse
end


def mouseMoveCaptured x,y
   if (x<0) then self.output 0,0 else
      if (x>@x_size) then self.output 0,@x_size else self.output 0,x end
      end
    if (y<0) then self.output 1,0 else
      if (y>@y_size) then self.output 1,@y_size else self.output 1,y end
      end      
end            

def mouseLUpCaptured x,y
   releaseMouse
end   
Rocko
Posts: 186
Joined: Tue May 15, 2012 12:42 pm

Re: RUBY - XY Surface

Post by Rocko »

Hi,

In my code, I have many repeating instances such as:

getViewSize[1]*0.5

To cut down this small calculation, as well as make the code more readable, I was thinking of declaring this at start of code:

@SY = getViewSize[1]*0.5

However, this crashes the RUBY code when I try to restart it.
On a blank RUBY code, it performs OK...

What am I missing ??
RJHollins
Posts: 1573
Joined: Thu Mar 08, 2012 7:58 pm

Re: RUBY - XY Surface

Post by RJHollins »

is it the capital letters for variable name? [@sy instead of @SY]
tulamide
Posts: 2714
Joined: Sat Jun 21, 2014 2:48 pm
Location: Germany

Re: RUBY - XY Surface

Post by tulamide »

RJ is right, in Ruby you have to use lower case as the first letter of variables.

But the issue, I think, is that you use getViewSize before the view is defined. That would explain why it crashes after restart. Flowstone initializes a schematic after load in the order that you built it. If you first place a RubyEdit in the schematic and then a module with an mgui, the RubyEdit will be initialzed first. If something like that is the case, cut the RubyEdit and paste it back in, then save. Now the order is module -> RubyEdit. If that still leads to crashes, you have to share your code, so that we are able to inspect it.
"There lies the dog buried" (German saying translated literally)
Post Reply