From: Axel S. <Axe...@en...> - 2009-04-14 19:30:21
|
On Apr 14, 2009, at 5:09, Magicloud Magiclouds wrote: > Hi, > I just noticed a mail named "gtk2hs question - derive SettingsWindow > from Window" in gtk2hs ML. As it said, I wonder, is it possible to > subclass a widget? If I use newtype as the mail said, is the "newtype > MyWindow" a widget, so I can use it like "containerAdd myWin"? > The use of the Haskell type class system to model the object sub- typing relationship is not really meant to be extended using Haskell values. In fact, the classes of most widgets contain no methods at all such that the compiler can optimize the class contexts away. Creating a new Haskell type that contains a pointer to a Widget w and making it appear as if it were a value of type w is not easily possible in this setting. We could add the appropriate methods to the type classes but this would incur the overhead to each method that is of no use except for this special case. The benefit of being able to create a Haskell value that looks like a Gtk object is not that clear to me. Furthermore, if it seems important to extend a given Gtk object, a lightweight alternative is to simply add new fields to the object using 'objectCreateAttribute' in Glib.System.GObject: type MyWidget = Label extraData :: Attr MyWidget (Maybe String) extraData = unsafePerformIO objectCreateAttribute myWidgetGetData :: MyWidget -> IO String myWidgetGetData w = do mData <- get w extraData case mData of Just v -> return v Nothing -> error "myWidgetGetData: extraData not present in Label" myWidgetSetData :: MyWidget -> String -> IO () myWidgetSetData w s = set w [extraData := s] This is obviously not quite what a true sub-type can give you since the type synonym MyWidget gives you no guarantee that the new field always exists (hence the need for the error message). But I think this is a good enough compromise between the full version that incurs a lot of overhead for all Gtk2Hs programs and the ability to extend an object. Cheers, Axel. |