Как передать данные из функции onClick

Я создаю небольшое графическое приложение на Haskell в качестве упражнения для себя, используя библиотеку gtk2hs, но я застрял в какой-то момент. Поэтому я хочу показать FileChooserDialog, где пользователь может выбрать несколько изображений, и я сделал функцию, которая делает все это, но теперь я не могу придумать, как вернуть эти значения в основную функцию, чтобы они могли работать с выбранным файлы. Это моя основная функция, которая создает главное окно:

main :: IO ()
main = do
    initGUI
    window <- windowNew
    set window [windowDefaultWidth := 300, windowDefaultHeight := 150, containerBorderWidth := 10]
    table <- tableNew 3 4 True
    containerAdd window table
    startButton <- buttonNewWithLabel "Start"
    tableAttachDefaults table startButton 0 4 2 3
    selectButton <- buttonNewWithLabel "Select images"
    tableAttachDefaults table selectButton 0 2 0 1
    selectedLabel <- labelNew (Just "0 images selected")
    tableAttachDefaults table selectedLabel 2 4 0 1
    onClicked selectButton (selectImages selectedLabel window)
    shiftLabel <- labelNew (Just "Days to shift: ")
    -- Left align text in label
    miscSetAlignment shiftLabel 0.0 0.5
    tableAttachDefaults table shiftLabel 0 3 1 2
    adjustment <- adjustmentNew 0.0 (-5000.0) 5000.0 1.0 10.0 0.0
    spinner <- spinButtonNew adjustment 0.5 0
    tableAttachDefaults table spinner 3 4 1 2
    widgetShowAll window
    mainGUI

Функция, которая показывает FileChooserDialog, является функцией selectImages и является функцией onClick для selectButton. Эта функция работает так:

selectImages :: LabelClass self => self -> Window -> IO ()
selectImages resultLabel parent = do
    chooser <- fileChooserDialogNew (Just "Select images") (Just parent) FileChooserActionOpen [("Cancel", ResponseCancel), ("Open", ResponseAccept)]
    fileChooserSetSelectMultiple chooser True
    widgetShow chooser
    response <- dialogRun chooser
    case response of
        ResponseCancel -> putStrLn "Cancelled"
        ResponseAccept -> do
            files <- fileChooserGetFilenames chooser
            labelSetText resultLabel $ (show (length files)) ++ " images selected"
    widgetDestroy chooser

Теперь я хочу вернуть массив файлов из функции selectImages основной функции для дальнейшей обработки. Как я могу это сделать? Должен ли я как-то использовать трансформатор StateT? Или что-то другое?

0 ответов

Другие вопросы по тегам