Ruby Forum IronRuby > Events?

Posted by Sean Clark Hess (Guest)
on 14.08.2008 21:11
(Received via mailing list)
Hi all,
Is there a built-in event system for IronRuby?  I know I can handle 
events
with button.click { }, but what if I want to dispatch my own, custom 
events
(from a class I created myself?).

I wrote my own event system, but I would prefer to use a built-in 
dispatch
method if it exists.

Thanks!
~sean
Posted by Tomas Matousek (Guest)
on 14.08.2008 22:23
(Received via mailing list)
I'm not sure I understand the scenario. Would you like to declare an 
event on Ruby object that you want to hook from C# code? Like 
rubyEngine.Operations.GetMember(obj, "my_event") += delegate { ...}?

Tomas

From: ironruby-core-bounces@rubyforge.org 
[mailto:ironruby-core-bounces@rubyforge.org] On Behalf Of Sean Clark 
Hess
Sent: Thursday, August 14, 2008 12:04 PM
To: ironruby-core@rubyforge.org
Subject: [Ironruby-core] Events?

Hi all,

Is there a built-in event system for IronRuby?  I know I can handle 
events with button.click { }, but what if I want to dispatch my own, 
custom events (from a class I created myself?).

I wrote my own event system, but I would prefer to use a built-in 
dispatch method if it exists.

Thanks!
~sean
Posted by Sean Clark Hess (Guest)
on 14.08.2008 22:29
(Received via mailing list)
Let's say I create a class called MovieControls, that wraps some 
existing
xaml.  The xaml has several buttons, including a toggle play/pause 
button,
and a previous and next button.
MovieControls would listen to the click of the play/pause button, and 
would
dispatch a "play" event when they clicked it to play it, and "pause" for 
the
opposite.

I want to be able to listen to MovieControls to know when to tell my 
video
to "play" and "pause".

So, it would be something like this...  In MovieControls
play_pause_button.click { if (isPlayState) dispatch("play") else
dispatch("pause") end }

Then, in my app
myMovieControls.play { doPlay }
myMovieControls.pause { doPause }

Does that make more sense now? If this seems totally out of the blue, 
how
are people currently handling abstracting away this kind of 
functionality?

Thanks
~sean

On Thu, Aug 14, 2008 at 2:22 PM, Tomas Matousek <
Posted by Tomas Matousek (Guest)
on 15.08.2008 00:09
(Received via mailing list)
It seems that both parts of the code are Ruby. So you should use Ruby 
language features. It's possible to emulate CLR events by a list of 
blocks.

event = []

# adding a handler:
handler = lambda { ... }
event << handler

# removing a handler:
event.delete handler

# firing an event:
event.each { |handler| handler[args] }

Tomas

From: ironruby-core-bounces@rubyforge.org 
[mailto:ironruby-core-bounces@rubyforge.org] On Behalf Of Sean Clark 
Hess
Sent: Thursday, August 14, 2008 1:29 PM
To: ironruby-core@rubyforge.org
Subject: Re: [Ironruby-core] Events?

Let's say I create a class called MovieControls, that wraps some 
existing xaml.  The xaml has several buttons, including a toggle 
play/pause button, and a previous and next button.

MovieControls would listen to the click of the play/pause button, and 
would dispatch a "play" event when they clicked it to play it, and 
"pause" for the opposite.

I want to be able to listen to MovieControls to know when to tell my 
video to "play" and "pause".

So, it would be something like this...  In MovieControls
play_pause_button.click { if (isPlayState) dispatch("play") else 
dispatch("pause") end }

Then, in my app
myMovieControls.play { doPlay }
myMovieControls.pause { doPause }

Does that make more sense now? If this seems totally out of the blue, 
how are people currently handling abstracting away this kind of 
functionality?

Thanks
~sean

On Thu, Aug 14, 2008 at 2:22 PM, Tomas Matousek 
<Tomas.Matousek@microsoft.com<mailto:Tomas.Matousek@microsoft.com>> 
wrote:

I'm not sure I understand the scenario. Would you like to declare an 
event on Ruby object that you want to hook from C# code? Like 
rubyEngine.Operations.GetMember(obj, "my_event") += delegate { ...}?



Tomas



From: 
ironruby-core-bounces@rubyforge.org<mailto:ironruby-core-bounces@rubyforge.org> 
[mailto:ironruby-core-bounces@rubyforge.org<mailto:ironruby-core-bounces@rubyforge.org>] 
On Behalf Of Sean Clark Hess
Sent: Thursday, August 14, 2008 12:04 PM
To: ironruby-core@rubyforge.org<mailto:ironruby-core@rubyforge.org>
Subject: [Ironruby-core] Events?



Hi all,



Is there a built-in event system for IronRuby?  I know I can handle 
events with button.click { }, but what if I want to dispatch my own, 
custom events (from a class I created myself?).



I wrote my own event system, but I would prefer to use a built-in 
dispatch method if it exists.



Thanks!

~sean
Posted by Sean Clark Hess (Guest)
on 15.08.2008 00:17
(Received via mailing list)
Cool... that's pretty much what I did.  Thanks
On Thu, Aug 14, 2008 at 4:08 PM, Tomas Matousek <
Posted by Ivan Porto carrero (casualjim)
on 15.08.2008 08:28
(Received via mailing list)
I actually use a customized version of Observable that includes the 
sender
of the event.
It's that approach but a little bit more formalized. It's in the 
IronNails
framework
http://github.com/casualjim/ironnails/tree/master/IronNails/vendor/iron_nails/lib/observable.rb
That should look a lot like how events are implemented in C#.



2008/8/15 Sean Clark Hess <seanhess@gmail.com>
Posted by Sean Clark Hess (Guest)
on 15.08.2008 14:13
(Received via mailing list)
Awesome, thanks for the example Ivan.  It's good to see it done 
"correctly"
;P   Actually, mine includes the sender of the event and an event object 
to,
I just wasn't paying attention to them in the handler example, but yours 
is
definitely more formal.  Thanks again
Posted by Stefan Dobrev (Guest)
on 15.08.2008 19:27
(Received via mailing list)
Here is another way to do it:

   - In the XAML add commands to the appropriate buttons. You can use
   MediaCommands - Play, Pause, Stop, etc.
   - Have something like a ViewModel that holds the logic for what 
should
   happen when each command get executed.
   - Somehow add/attach/inject the view model to the view and create
   CommandBinding foreach of the supported commands. Add this command 
bindings
   to some visual element from the XAML, maybe the root.

Regards,
Stefan

2008/8/15 Sean Clark Hess <seanhess@gmail.com>