Вызвать менеджер раскладки после удаления кнопок - PullRequest
1 голос
/ 29 ноября 2011

Я пишу простой калькулятор на GTK, используя Haskell и привязки gtk2hs. Я пытаюсь реализовать базовый / научный вид, как в калькуляторе Windows, используя Glade.

У меня есть GTKTable кнопок, но когда я пытаюсь скрыть некоторые из них, там, где находятся кнопки, остается пустое место. Чтобы скрыть кнопки, у меня есть такой код:

bSqrt <- xmlGetWidget xml castToButton "bSqrt"
widgetHide bSqrt

Но когда я скрываю четыре кнопки, которые я хочу, у меня появляется пробел, как показано ниже: enter image description here

Я новичок в GTK, и я не смог найти менеджеров верстки, как вы в Java Swing. Есть ли более простой способ сделать это? Можно ли как-нибудь вызвать менеджер раскладки, чтобы изменить размер кнопок для меня? Я не смог найти способ сделать это в документации.

Заранее спасибо,

1 Ответ

1 голос
/ 05 декабря 2011

Рассмотрите возможность использования вложенной комбинации HBox и VBox для достижения табличного эффекта. Вызов widgetHideAll на VBox «научных» кнопок скроет этот столбец и обновит отображение по желанию.

import Control.Monad (forM_)
import Data.IORef as IORef
import qualified Graphics.UI.Gtk as Gtk

data Mode = Basic | Scientific

main = do
    Gtk.initGUI

    window <- Gtk.windowNew
    outerVbox <- Gtk.vBoxNew False 0

    -- Create a "table" of buttons as an HBox of VBoxes.
    hbox <- Gtk.hBoxNew True 5

    -- Load the "table" with dummy 'basic' buttons.
    forM_ [0..2] $ \i -> do
        vbox <- Gtk.vBoxNew False 5
        forM_ [0..2] $ \j -> do
            dummy <- Gtk.buttonNewWithLabel $ show (3*i+j :: Int)
            Gtk.boxPackStartDefaults vbox dummy
        Gtk.boxPackStartDefaults hbox vbox

    -- Load rightmost column with 'scientific' buttons.
    scibox <- Gtk.vBoxNew False 5
    forM_ [0..2] $ \j -> do
        dummy <- Gtk.buttonNewWithLabel $ "sci" ++ show (j :: Int)
        Gtk.boxPackStartDefaults scibox dummy
    Gtk.boxPackStartDefaults hbox scibox

    -- Begin in Scientific mode.
    let mode = Scientific
    modeRef <- IORef.newIORef mode

    -- Create a mode-toggling Button.
    button <- Gtk.buttonNewWithLabel $ getButtonText mode
    Gtk.on button Gtk.buttonActivated $
        toggleMode button modeRef scibox

    -- Pack the "table" and button vertically into window.
    Gtk.boxPackStartDefaults outerVbox hbox
    Gtk.boxPackStartDefaults outerVbox button
    Gtk.containerAdd window outerVbox

    -- Standard Gtk stuff.
    Gtk.onDestroy window Gtk.mainQuit
    Gtk.widgetShowAll window
    Gtk.mainGUI

getButtonText Basic = "Switch to Scientific"
getButtonText Scientific = "Switch to Basic"


toggleMode button modeRef scibox = do
    mode <- IORef.readIORef modeRef
    case mode of
        Basic -> do
            IORef.writeIORef modeRef Scientific
            Gtk.buttonSetLabel button $ getButtonText Scientific
            Gtk.widgetShowAll scibox
        Scientific -> do
            IORef.writeIORef modeRef Basic
            Gtk.buttonSetLabel button $ getButtonText Basic
            Gtk.widgetHideAll scibox
...