Sunday, January 31, 2010

“Hello Glade#” from F#

Another bit of spiking, a rather tardy follow up from raw GTK#, starting from the C# example at the Mono Project site, but incorporating the earlier example, so as to build in a clean application exit, for one thing.

In the .glade file, I changed the label size from 38, as in

<widget class="GtkLabel" id="label1">
       <property name="width_request">38</property>

to 88, so as to allow the displayed text to be longer.

In VS2008 I added the .glade file by including a new F# script file, but renaming it to gui.glade, pasting in the XML, and setting its properties to have a Build Action of Embedded Resource. The code looks like:

open System
open Gtk
open Glade
let mutable click_count = 0
type Handler() = class
[<Widget>]
[<DefaultValue(true)>]
val mutable button1 : Button
[<Widget>]
[<DefaultValue(true)>]
val mutable label1 : Label
[<Widget>]
[<DefaultValue(true)>]
val mutable window1 : Window
end
let OnClick (h : Handler) =
//h.label1.Text <- "Mono" -- original example's code
click_count <- click_count + 1
// Console.WriteLine("Button Click {0}", click_count)
h.label1.Text <- String.Format("Button Click {0}", click_count)
let OnDelete (args:DeleteEventArgs) =
Application.Quit()
args.RetVal <- true
[<EntryPoint>]
let main a =
Application.Init()
// Developed with Glade 3.8.3 http://ftp.gnome.org/pub/GNOME/binaries/win32/glade/3.8/glade-3-8-3-installer.exe
// Needs libglade project file format
let gxml = new Glade.XML (null, "gui.glade", "window1", null)
let handler = new Handler()
gxml.Autoconnect (handler)
handler.button1.Clicked
|> Event.add (fun _ -> OnClick handler)
handler.window1.DeleteEvent
|> Event.add OnDelete
handler.window1.ShowAll()
Application.Run()
0 // needs an int return
view raw Program.fs hosted with ❤ by GitHub

Here the widgets are surfaced via a plain data object, Handler, and their events are wired up much as before via F#'s first class reactive events, which are much more natural (especially when combining events to one handler is required). The project needs a reference to the glade-sharp assembly, above and beyond the ones already required for pure GTK#

Unfortunately, the need for CLR attributes on members is problematic for IronPython -- the least nasty way to achieve the equivalent of the Handler class would be to compile some C# on the fly.

Unchanged by version 1.9.9.9, February 2010 CTP.

Unchanged by version 3.1.1, January 2014 (except that Add Existing Item works better for the .glade file in VS2010 and up).

No comments :