gtk2hs: запрос на пересчет размера окон после удаления виджета - PullRequest
3 голосов
/ 02 августа 2011

У меня есть окно с тремя виджетами ввода и одной кнопкой. Я использую кнопку, чтобы удалить один из виджетов программно. Проблема в том, что главное окно не меняет свой размер, чтобы соответствовать новому макету после его удаления.

Я могу себе представить, что мне нужно отправить какой-нибудь Сигнал или Событие в основной цикл, что вызовет пересчет, но я не смог найти такую ​​функциональность.

Вот пример кода:

import Graphics.UI.Gtk
import Data.IORef
import qualified Graphics.UI.Gtk as G hiding (Point)
import qualified Graphics.UI.Gtk.Gdk.EventM as E
import qualified Graphics.UI.Gtk.Abstract.Widget as W
import qualified Graphics.Rendering.Cairo as C


makeEntry :: String -> IO Entry
makeEntry str = do e <- entryNew
                   entrySetText e str
                   return e

main :: IO ()
main = do
  initGUI
  window <- windowNew
  box <- vBoxNew False 0
  G.on window G.keyPressEvent $ E.tryEvent $ do
    "Escape" <- E.eventKeyName
    C.liftIO $ G.widgetDestroy window

  set window [ containerChild := box ]

  e1 <- makeEntry "e1"
  boxPackStart box e1 PackNatural 0

  e2 <- makeEntry "e2"
  boxPackStart box e2 PackNatural 0

  e3 <- makeEntry "e3"
  boxPackStart box e3 PackNatural 0

  button <- buttonNew
  set button [ buttonLabel := "Remove" ]
  boxPackStart box button PackNatural 0

  onClicked button (containerRemove box e2)
  onDestroy window mainQuit
  widgetShowAll window
  mainGUI

1 Ответ

3 голосов
/ 02 августа 2011

Вы можете спросить ваше окно верхнего уровня, насколько оно велико, и сделать его таким большим:

refresh window = do
    Requisition w h <- widgetSizeRequest window
    windowResize window w h

Чтобы использовать это, вставьте его в обработчик нажатия кнопки:

onClicked button (containerRemove box e2 >> refresh window)
...