If I wanted to develop the widgets themselves separately from the layout, I would probably do something like this:

class Widget a where
    render :: a -> Html
    bbox :: a -> Size

type Layout = forall a. Widget a => Widget a
    | Rows Spacing [Layout]
    | Columns Spacing [Layout]
    | Grid Spacing [[Layout]]

type Page = Page String Layout

renderLayout :: Layout -> Html

renderPage :: Page -> Html

I'm unsure this gives what I'm after. I'm trying to have layouts consist of Widgets (e.g., header images, common menu), and as pages also consist of Widgets it seems like they can be modelled using a common type/construct.

Well if you want to abstract over the layout too, you can just add

instance Widget Layout where
    render = renderLayout
    bbox = ...

But just because you can, doesn't mean you should. I don't know the full details of your design, but what do you gain by allowing the layout to intermingle with the widgets? Is worth the extra complexity?

If you treat layout as "just another widget" then it becomes harder to answer specific questions about the page layout because you have less information in your tree.


Layout might not actually be the right term. Page template might be better.

What I'm trying to gain is best described with an example.

* I have a template with a header image, and footer text.
* I create another template defined as the previous, but with a menu bar down
  the left.
* I create a page based on the previous with some text.

The gain comes from when I want to change the header image, or add a Login/Register box on all pages, I only edit the first template.

Levi

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to