Re: Are windows just ordinary widgets?

Wolfgang Thaller <[email protected]>
Newsgroups gmane.comp.lang.haskell.gui
Message-ID <[email protected]>
Axel Simon wrote:
> IMHO the classes should just reflect the object hierarchy. If we have 
> e.g.
>
> class Button b where...
> class ToggleButton b where...
> instance Button ToggleButton where...
>
> then we can have the simple function
>
> onActivate :: Button b => b -> IO () -> IO ()
>
> and use it with ToggleButton as well (but not with a plain Widget or
> anything on the other branches of the tree). Having onActivate as a 
> class
> member doesn't give any improvement in type safety, is less efficient
> (bigger dictionaries) and doesn't lend itself to automatic creation of
> this type hierarchy.
>
> Axel.

I'm no longer entirely sure what we are talking about. What is "the 
object hierarchy"?

Could somebody who has an opinion on these issues knock up a concrete 
example; I'm not thinking of code, just some class declarations and 
signatures...

Here's a summary of what's in the FLTK-based example that David Sankel 
posted a while ago. I've added some comments.

class IsWidget a where
	toWidget :: a -> IO Widget

data Widget
instance IsWidget Widget

class HasOnActivate a where
   doOnActivate :: a -> IO () -> IO( IO() )

class HasTitle w where
   title :: Attr w String

-- This should be left to layout management:
class HasPosition w where
   position :: Attr w (Int,Int)

class HasSize w where
   size :: Attr w (Int,Int)

-- The following two are not possible, because of some toolkits' 
inability to reparent widgets after creation:

class HasAddChild a where
	addChild :: IsWidget b => a -> b -> IO ()
class HasChildren w ehere
	children :: Attr w [Widget]

-- ===

data Window
mkWindow :: [Prop Window] -> IO Window

instance IsWidget window
instance HasAddChild window
instance HasChildren window
visible :: Attr Window Bool

-- ===

data Button
mkButton :: [Prop Button] -> IO Button

instance IsWidget Button
instance HasTitle Button
instance HasOnActivate Button
instance HasPosition Button
instance HasSize Button

-- ===
-- The whole "Box" widget should probably be replaced by different 
kinds of boxes
-- that do different kinds of layout.

data Box
mkBox :: [Prop Box] -> IO Box

instance IsWidget Box
instance HasTitle Box -- <= it seems that in fltk, a box is more than 
just a simple container....
instance HasPosition Box
instance HasSize Box

-- ===

Some more notes:
If we want to implement a dynamic layout manager in Haskell for 
platforms that don't support that natively,
we will need a way to query things like minimum size when we have just 
values of some general type
(like Widget, though I already suggesting having a generic type that 
only includes all widgets _except_ windows).
The current "CGA example" doesn't provide that.
Also, the CGA example currently has completely separate code for the 
"HasSize" instances for Buttons and Boxes; but in the end, they both 
call the same virtual member function on a C++ object. There should be 
a way for backend implementors to avoid that needless duplication of 
work.

Cheers,

Wolfgang
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.