# A tiny DSL to build Windows::Forms menus from IronRuby - review wanted

**URL:** <https://www.ruby-forum.com/t/a-tiny-dsl-to-build-windows-forms-menus-from-ironruby-review-wanted/161502>\
**Category:** IronRuby\
**Created:** [February 26, 2009, 11:28pm UTC](https://www.ruby-forum.com/t/a-tiny-dsl-to-build-windows-forms-menus-from-ironruby-review-wanted/161502 "2009-02-26T23:28:22Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![thbar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/eb8c5e/32.png) [@thbar](https://www.ruby-forum.com/u/thbar)\
**Post date:** [February 26, 2009, 11:28pm UTC](https://www.ruby-forum.com/t/a-tiny-dsl-to-build-windows-forms-menus-from-ironruby-review-wanted/161502/1 "2009-02-26T23:28:22Z")

</div>

Hi,  
I started working on UI bits, both for Ivan book and because my  
customers  
are interested (and well - because it’s fun, too!). First topic is how  
to  
build menus more easily (next one will be long running operations and  
how to  
sugar them).

I’d be interested to get your opinion on both the DSL syntax (below for  
quick read or  
here[http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/003\_dsl\_menu.rb](http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/003_dsl_menu.rb)  
on  
github) and the  
implementation[http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/menu\_builder.rb](http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/menu_builder.rb)  
.

form.menu = MainMenu.build do  
item(“&File”) {  
item(“&New”) {  
item(“Spreadsheet”)  
item(“Document”)  
}  
item “&Quit”, lambda { Application.Exit }  
}  
item(“&Tools”) {

item “&PowerBlade”, lambda { MessageBox.Show(“Powerblades are  
amazing…”) }  
item “&Scissors”  
}  
end

what do you think ?

cheers,

Thibaut BarrÃ¨re

---

<div class="post-metadata">

**Author:** ![thbar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/eb8c5e/32.png) [@thbar](https://www.ruby-forum.com/u/thbar)\
**Post date:** [February 27, 2009, 12:33am UTC](https://www.ruby-forum.com/t/a-tiny-dsl-to-build-windows-forms-menus-from-ironruby-review-wanted/161502/2 "2009-02-27T00:33:20Z")

</div>

I think it looks very nice. It’s a shame that you have to resort to  
direct lambda’s since you can’t pass two lambda’s in, but otherwise it’s  
a nice visual representation of the menu, in code.

JD

From: removed\_email\_address@domain.invalid  
[[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)] On Behalf Of Thibaut  
BarrÃ¨re  
Sent: Thursday, February 26, 2009 2:26 PM  
To: ironruby-core  
Subject: [Ironruby-core] A tiny DSL to build Windows::Forms menus from  
IronRuby - review wanted

Hi,

I started working on UI bits, both for Ivan book and because my  
customers are interested (and well - because it’s fun, too!). First  
topic is how to build menus more easily (next one will be long running  
operations and how to sugar them).

I’d be interested to get your opinion on both the DSL syntax (below for  
quick read or  
here[http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/003\_dsl\_menu.rb](http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/003_dsl_menu.rb)  
on github) and the  
implementation[http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/menu\_builder.rb](http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/menu_builder.rb).

form.menu = MainMenu.build do  
item(“&File”) {  
item(“&New”) {  
item(“Spreadsheet”)  
item(“Document”)  
}  
item “&Quit”, lambda { Application.Exit }  
}  
item(“&Tools”) {  
item “&PowerBlade”, lambda { MessageBox.Show(“Powerblades are  
amazing…”) }  
item “&Scissors”  
}  
end

what do you think ?

cheers,

Thibaut BarrÃ¨re

---

<div class="post-metadata">

**Author:** ![thbar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/eb8c5e/32.png) [@thbar](https://www.ruby-forum.com/u/thbar)\
**Post date:** [February 27, 2009, 9:15pm UTC](https://www.ruby-forum.com/t/a-tiny-dsl-to-build-windows-forms-menus-from-ironruby-review-wanted/161502/3 "2009-02-27T21:15:57Z")

</div>

Hi,

> I think it looks very nice. Itâ€™s a shame that you have to resort to direct  
> lambdaâ€™s since you canâ€™t pass two lambdaâ€™s in, but otherwise itâ€™s a nice  
> visual representation of the menu, in code.

thanks for the feedback, appreciated!

I just realised that I can also use this (without modifying the  
implementation):

```
item("&PowerBlade").click { MessageBox.Show("Powerblades are

```

amazing…") }

instead of

```
item("&PowerBlade", lambda { MessageBox.Show("Powerblades are

```

amazing…") }

same effect, slightly more readable though.

cheers, and I shall move on to long running operations.

– Thibaut

---

<div class="post-metadata">

**Author:** ![thbar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/eb8c5e/32.png) [@thbar](https://www.ruby-forum.com/u/thbar)\
**Post date:** [February 27, 2009, 11:46pm UTC](https://www.ruby-forum.com/t/a-tiny-dsl-to-build-windows-forms-menus-from-ironruby-review-wanted/161502/4 "2009-02-27T23:46:21Z")

</div>

After chatting with Ivan, I created some code to build Forms too:

form = Magic.build do  
form(:text =\> “Hello”) do  
flow\_layout\_panel(:dock =\> DockStyle.fill) do  
button(:text =\> “Click me!”, :click =\> lambda {  
MessageBox.Show(“Hello”) })  
button(:text =\> “Quit”, :click =\> lambda { Application.Exit })  
end  
end  
end  
\*  
\*

I use method\_missing and transform the method name from  
flow\_layout\_panel to  
FlowLayoutPanel class etc.

After using these a bit, I’m pretty sure we’ll end up with some  
community  
project sharing that kind of stuff, at some point.

Nb: I hope it’s not OT for the core list - or is it time to create a  
user  
group ?

cheers,

– Thibaut

On Fri, Feb 27, 2009 at 8:54 PM, Thibaut BarrÃ¨re

---

<div class="post-metadata">

**Author:** ![thbar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/eb8c5e/32.png) [@thbar](https://www.ruby-forum.com/u/thbar)\
**Post date:** [February 28, 2009, 1:09am UTC](https://www.ruby-forum.com/t/a-tiny-dsl-to-build-windows-forms-menus-from-ironruby-review-wanted/161502/5 "2009-02-28T01:09:30Z")

</div>

Awesome stuff! If you make this into its own github project, I can add  
it to [http://github.com/ironruby/ironruby-contrib](http://github.com/ironruby/ironruby-contrib) as a submodule.  
That’ll force me to keep it updated =)

From: removed\_email\_address@domain.invalid  
[[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)] On Behalf Of Thibaut  
BarrÃ¨re  
Sent: Friday, February 27, 2009 2:46 PM  
To: removed\_email\_address@domain.invalid  
Subject: Re: [Ironruby-core] A tiny DSL to build Windows::Forms menus  
from IronRuby - review wanted

After chatting with Ivan, I created some code to build Forms too:

form = Magic.build do

form(:text =\> “Hello”) do

```
flow_layout_panel(:dock => DockStyle.fill) do

  button(:text => "Click me!", :click => lambda { 

```

MessageBox.Show(“Hello”) })

```
  button(:text => "Quit", :click => lambda { Application.Exit })

end

```

end

end

I use method\_missing and transform the method name from  
flow\_layout\_panel to FlowLayoutPanel class etc.

After using these a bit, I’m pretty sure we’ll end up with some  
community project sharing that kind of stuff, at some point.

Nb: I hope it’s not OT for the core list - or is it time to create a  
user group ?

cheers,

– Thibaut

On Fri, Feb 27, 2009 at 8:54 PM, Thibaut BarrÃ¨re  
\<removed\_email\_address@domain.invalid[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:  
Hi,

I think it looks very nice. It’s a shame that you have to resort to  
direct lambda’s since you can’t pass two lambda’s in, but otherwise it’s  
a nice visual representation of the menu, in code.  
thanks for the feedback, appreciated!

I just realised that I can also use this (without modifying the  
implementation):

```
item("&PowerBlade").click { MessageBox.Show("Powerblades are 

```

amazing…") }

instead of

```
item("&PowerBlade", lambda { MessageBox.Show("Powerblades are 

```

amazing…") }

same effect, slightly more readable though.

cheers, and I shall move on to long running operations.

– Thibaut

JD

From:  
removed\_email\_address@domain.invalid[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)]  
On Behalf Of Thibaut BarrÃ¨re  
Sent: Thursday, February 26, 2009 2:26 PM  
To: ironruby-core  
Subject: [Ironruby-core] A tiny DSL to build Windows::Forms menus from  
IronRuby - review wanted

Hi,

I started working on UI bits, both for Ivan book and because my  
customers are interested (and well - because it’s fun, too!). First  
topic is how to build menus more easily (next one will be long running  
operations and how to sugar them).

I’d be interested to get your opinion on both the DSL syntax (below for  
quick read or  
here[http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/003\_dsl\_menu.rb](http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/003_dsl_menu.rb)  
on github) and the  
implementation[http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/menu\_builder.rb](http://github.com/thbar/ironruby-labs/blob/66b45fd6f13d2b3c8aa8021ee3f58303a9bb7eae/ui/menu_builder.rb).

form.menu = MainMenu.build do  
item(“&File”) {  
item(“&New”) {  
item(“Spreadsheet”)  
item(“Document”)  
}  
item “&Quit”, lambda { Application.Exit }  
}  
item(“&Tools”) {  
item “&PowerBlade”, lambda { MessageBox.Show(“Powerblades are  
amazing…”) }  
item “&Scissors”  
}  
end

what do you think ?

cheers,

Thibaut BarrÃ¨re

–  
LoGeek  
[blog] [http://evolvingworker.com](http://evolvingworker.com) - tools for a better day  
[blog] [http://blog.logeek.fr](http://blog.logeek.fr) - about writing software

---

<div class="post-metadata">

**Author:** ![thbar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/eb8c5e/32.png) [@thbar](https://www.ruby-forum.com/u/thbar)\
**Post date:** [February 28, 2009, 11:44am UTC](https://www.ruby-forum.com/t/a-tiny-dsl-to-build-windows-forms-menus-from-ironruby-review-wanted/161502/6 "2009-02-28T11:44:56Z")

</div>

Hi Jimmy,

> Awesome stuff! If you make this into its own github project, I can add it  
> to [http://github.com/ironruby/ironruby-contrib](http://github.com/ironruby/ironruby-contrib) as a submodule. Thatâ€™ll  
> force me to keep it updated =)

glad you like it! I’ll definitely extract it to a separate github  
project  
later on - I’ll ping you when I do so.

– Thibaut

---

<div class="post-metadata">

**Author:** ![thbar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/eb8c5e/32.png) [@thbar](https://www.ruby-forum.com/u/thbar)\
**Post date:** [March 4, 2009, 10:01am UTC](https://www.ruby-forum.com/t/a-tiny-dsl-to-build-windows-forms-menus-from-ironruby-review-wanted/161502/7 "2009-03-04T10:01:17Z")

</div>

Hi Jimmy et al,

> > Awesome stuff! If you make this into its own github project, I can add it to  
> > [http://github.com/ironruby/ironruby-contrib](http://github.com/ironruby/ironruby-contrib) as a submodule. That’ll force me  
> > to keep it updated =)

> glad you like it! I’ll definitely extract it to a separate github project later on - I’ll ping you when I do so.

not sure if my annoucement was clear - the separate project is now  
available. It’s called Magic:

> **[GitHub - thbar/magic: IronRuby sugar for WPF, Silverlight and Windows Forms.](https://github.com/thbar/magic/tree/master)**
>
> master

At the end I realize the syntax is totally shooesesque  
([http://shoooes.net/](http://shoooes.net/)).

I’m in the process of evolving it so that it works well with WPF and  
Silverlight (and QuickGraph, too).

cheers,

– Thibaut
