Haskell: сетка в wxHaskell - PullRequest
       22

Haskell: сетка в wxHaskell

0 голосов
/ 12 мая 2010

Может кто-нибудь объяснить мне, что этот код делает построчно?

как правильно понимать первую строку с объявлением? что это значит: [Prop (Grid ())]?

спасибо за помощь

gridCtrl :: Window a -> [Prop (Grid ())] -> IO (Grid ())
gridCtrl parent props
  = feed2 props 0 $
    initialWindow $ \id rect -> \props flags ->
    do g <- gridCreate parent id rect flags
       gridCreateGrid g 0 0 0
       set g props
       return g

1 Ответ

4 голосов
/ 24 мая 2010

В wxHaskell к элементам управления прикреплены свойства, которые можно прочитать или изменить.Раздел [Prop (Grid ())] можно понимать как «список свойств для любого типа сетки».

Это способ wxHaskell справиться с тем фактом, что библиотека wxWidgets, на которой он построенявляется объектно-ориентированным.Grid () на самом деле означает «что-либо в иерархии наследования, из которого происходит Grid» - т.е. Grid, ScrolledWindow, Panel, Window, EvtHandler, wxObject (вы можете выполнить это, если начнете с http://wxhaskell.sourceforge.net/doc/Graphics-UI-WXCore-WxcClassTypes.html#204)

КогдаЕсли вы посмотрите документацию элемента управления (например, ListCtrl), то обнаружите, что он имеет набор атрибутов и экземпляров. По сути, вы можете использовать те, которые применяются к иерархии для Grid. Например, Grid происходит от ScrolledWindow,поэтому вы можете использовать:

  • Атрибут scrollRate
  • Атрибуты класса Colour, например, bgcolor, color
  • и т. д.

Вы используете этиследующие свойства, например

g <- gridCtrl parent [color := red, bgcolor := green, scrollRate := 41]
...
set g [color := blue]

Строка за строкой, код выглядит примерно так:

  • Использование предоставленных свойств ( props )
  • и initialWindow (который заполнит окно id и начальные rect и flags ), вызовут обтекание потокафункции по порядку:
  • gridCreate для создания нового экземпляра сетки
  • Используя новый экземпляр сетки, установите сетку внутри с 0 строками, 0 столбцами и ничем не выделенными.
  • Примените свойства ( реквизиты ), предоставленные вызывающей стороной к сетке (например, вставьте данные, установите стили и т. Д.)

Часть, которая делает код труднее для чтения, это feed2 и тот факт, что код написан в стиле '$', чтобы обеспечить правильные параметры для feed2.Моего пояснения, приведенного выше, должно быть достаточно, но если вы хотите понять детали, поймите, что feed2 - это просто приложение с инвертированной функцией

feed2 x y f = f x y

, затем замените приложения '$' на круглые скобки.Это не выглядит мило, но его легче читать.

gridCtrl parent props =
  feed2 props 0
    (initialWindow (\id rect ->
                      \props flags ->
                        do
                        g <- gridCreate parent id rect flags
                        gridCreateGrid g 0 0 0
                        set g props
                        return g )))
...