动态添加和删除小部件

时间:2014-10-21 22:54:42

标签: haskell wxwidgets wxhaskell

我想在wxHaskell应用程序中动态添加和删除小部件。

我的问题是:

  • 窗口可以调整大小,但是当手动变大时,单击“更多”按钮会显示它会快速闪回到最小尺寸。如果没有windowReLayout调用,窗口根本不会改变大小。

  • windowRemoveChild看起来像我想要的但是它不是从WXCore导出的,所以我猜这不是要在这一层使用(编辑:也是我没有在没有程序崩溃的情况下找到一种方法来使用它,因为它试图绘制到一个不存在的窗口,即使首先从布局中删除它然后从它的父项中删除它。但我找不到另类选择。 This answer建议只是隐藏窗口小部件,但在我的真实应用程序中,我使用的是复杂的自定义窗口小部件,我希望收集垃圾。

  • 创建窗口小部件时已经定义了父/子关系,我可以再次为布局做这件事吗?例如,我是否可以为面板提供一个布局,将row 5自动应用于其所有子项,而无需为每次更改重建布局? (如果我只是从布局中删除子项但不从父项中删除它们,它们只是位于原点,是否由一种默认布局控制?)

这是一个最小的示例,展示了我当前如何添加小部件,以及我是如何尝试删除小部件的。

module Main where

import Graphics.UI.WX

main :: IO ()
main = start $ do
   count <- varCreate 100
   items <- varCreate []
   f <- frame []
   cont <- panel f []

   -- add a button
   more <- button f
      [ text := "more"
      , on command := do
            n <- varGet count
            varSet count (n + 1)
            new <- button cont
                     [ text := show n
                     , on command := print n ]
            is <- varGet items
            let is' = new : is
            varSet items is'
            set cont [ layout := row 5 (map widget is') ]
            windowReLayout f
      ]

   -- remove a button
   less <- button f
      [ text := "less"
      , on command := do
            is <- varGet items
            case is of
               i : is' -> do
                  -- windowRemoveChild f i   -- crash
                  set i [ visible := False ] -- leak
                  set cont [ layout := row 5 (map widget is') ]
                  varSet items is'
                  return ()
               _ -> return ()
      ]

   set f [ layout := margin 5
                   $ column 5 [ row 5 [ widget more
                                      , widget less ]
                              , widget cont ] ]

0 个答案:

没有答案