Re: Are windows just ordinary widgets?

Axel Simon <[email protected]>
Newsgroups gmane.comp.lang.haskell.gui
Message-ID <[email protected]>
On Fri, May 02, 2003 at 12:08:41AM +0200, Wolfgang Thaller wrote:
> >This was my proposal:
> >http://haskell.org/pipermail/gui/2003-April/000459.html
> 
> OK so you're talking about upcast & downcast functions (as class 
> members). At least that's how I would try to describe your approach. 
> The question where to put the actual functions remains open.

I vote for not having them in classes at all. Overlap of function names of
different types are minimal and lumping (some) functions together into
categories is ad-hoc, hard to get right and impossible to change
afterwards without breaking code.

> I think upcast and downcast functions become ugly as soon as the 
> hierarchy doesn't match the underlying backend.

That might be true. I don't see a good way to interface an agreed object 
hierarchy to the existing Gtk type classes in gtk2hs. Yet.

> What "upcasted" generic types do we need anyway?
> As I said, we need a
> data Pane = ....
> class PaneClass p where
>     toPane :: p -> Pane
>     fromPane :: Pane -> Maybe p
> 
> ... at least in order to be able to implement dynamic layout in Haskell 
> (for platforms that don't have it).
> I'm using the term Pane to mean any widget that can be placed inside a 
> window; that is widgets minus windows and menu items.

I don't mind the name, Pane or Widget is fine with me.

> Do we need any other upcast/downcast functionality?

Dunno. Do you have anything in mind?

> Does anyone want to have a list of _any kind_ of widget, mixing windows 
> and buttons and layout containers etc?

I am currently assuming that I am able to compose layout containers into
other layout containers. As such, I layout containers and widgets have to
be in one class.

But I think it's a good idea to separate top-level windows by giving them 
a different root class.

> Does anyone want to have a list of any kind of buttons, that may 
> contain both push buttons and toggle buttons, but no edit text fields 
> and labels?

I thought about it and couldn't find a compelling "yes".

> If the answer is no, then let's not include any more upcast/downcast 
> functions, at least not in CGA 1.0, because they will never be 
> conveniently implementable on all platforms at the same time.
> 
> We could then just have classes that contain some functionality, and 
> some plain functions where a certain functionality is only available at 
> one widget.

I don't understand what you mean with more upcast/downcast functions. 
Could you explain or give an example?

> The next question we need to ask is, which widget type supports what 
> functionality?

I guess we do that widget-by-widget. And don't make these functions part 
of the widget type class.

I'd like to have

setButtonLabel :: ButtonClass b => b -> String -> IO ()
setButtonLabel b name = ... (toButtonClass b) ...

> Below I've attached what I'm currently thinking of... could we have 
> another quick "yes"/"no, because" vote and/or some counter-proposals?
> 
> Cheers,
> 
> Wolfgang
> 
> ================== cut here ==================
> 
> import Attributes -- from the CGA example (indirectly from HToolkit)
> 
> data Pane = ....
> class PaneClass p where
>     toPane :: p -> Pane
>     fromPane :: Pane -> Maybe p
Yes.

>     -- plus any functions and attributes that are supported by all 
> kinds of panes
>     -- and not supported by any window or other object
No. Every function that is supported by all panes can be implemented like 
the setButtonLabel example. I don't see any advantage of making these 
functions memebers of the class. The disadvantage is large dictionaries 
which probably all contain the same virtual function for a specific entry.

> 
> instance PaneClass Pane where
>     toPane = id
>     fromPane = Just
>     -- ...
Yes.

> 
> class Container c where
>     -- ...
> 
> class HasOnActivate a where
> 	doOnActivate :: a -> IO () -> IO( IO() )

No. As above.

> 
> data Button = ...
> instance PaneClass Button where
>     -- ...

I admit that I find it weird that the Button doesn't have a class. But if 
it is a leave then it's probably not necessary.

> mkButton :: Container c => c -> [Prop Button] -> IO Button
newButton. Please!?

[..]
No unexpected change of opinion.

Axel.
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.