From: Peter S. <ps....@gm...> - 2010-08-27 01:48:55
|
I have been experimenting with some of the gtk2hs demo programs, using Glade (with GtkBuilder; not Libglade) and the FileChooser. Copying code from one of the demos, I can get the following code to work fine. It uses a _generic_ button (openFileButton) defined in glade, but its File Chooser dialog is created here in Haskell. We do get the filepath the user selected. (Please pardon all the leading comments; I'm using those to maintain indents in the email.) -- module Main where -- -- import Graphics.UI.Gtk -- import Graphics.UI.Gtk.Builder -- import Graphics.UI.Gtk.Selectors.FileChooser -- import System.Glib.GError -- -- main :: IO () -- main = do -- initGUI -- -- -- Create the builder, and load the UI file -- builder <- builderNew -- -- FYI, added some of my own error handling here: -- handleGError (\(GError dom code msg) -> fail msg) $ -- builderAddFromFile builder "LC.glade" -- -- -- get widget handles -- mainWindow <- builderGetObject builder castToWindow "mainWindow" -- openFileButton <- builderGetObject builder castToButton "openFileButton" -- exitButton <- builderGetObject builder castToButton "exitButton" -- -- -- signal handlers ------------------------------------------------------------------ -- onClicked openFileButton $ do -- openOpenFileDialog mainWindow -- -- -- exiting ------ -- onDestroy mainWindow mainQuit -- onClicked exitButton mainQuit -- -- -- Display the window -- widgetShowAll mainWindow -- mainGUI -- -- -- openOpenFileDialog :: Window -> IO () -- openOpenFileDialog parentWindow = do -- dialog <- fileChooserDialogNew -- (Just $ "Select coding file") --dialog title -- (Just parentWindow) --the parent window -- FileChooserActionOpen --the kind of dialog we want -- [("gtk-open" , ResponseAccept) -- ,("gtk-cancel" , ResponseCancel)] --The buttons to display -- -- widgetShow dialog -- response <- dialogRun dialog -- case response of -- ResponseAccept -> do -- Just fileName <- fileChooserGetFilename dialog -- putStrLn $ "you selected the file " ++ show fileName -- ResponseCancel -> putStrLn "dialog canceled" -- ResponseDeleteEvent -> putStrLn "dialog closed" -- widgetHide dialog So, I thought, why not use Glade to instead create a "genuine" FileChooserButton (the one that automatically displays the currently selected filename _in_ the button), so I can reduce the amount of Haskell code (don't have to create a dialog in the Haskell code this way?). >From the Glade palette, under Control and Display, add a "File Chooser Button". Then, Haskell code mods are: under: -- -- get widget handles add: -- fileChooserButton <- builderGetObject builder castToFileChooserButton "fileChooserButton" under: -- -- signal handlers ------------------------------------------------------------------ add: -- onFileActivated fileChooserButton $ do -- file <- fileChooserGetFilename fileChooserButton -- case file of -- Nothing -> putStrLn "No file selected." -- Just file -> putStrLn ( "File selected: " ++ file ) Only 5 lines of code, versus the longer openOpenFileDialog function. It compiles, and seems to run okay, except that the "onFileActivated fileChooserButton $ do" signal handler never seems to get called. When I click the new FileChooserButton in mainWindow, I get a FileChooserDialog like before, but after selecting a file there, I get no output in the shell window from its handler. The selected file _does_ get displayed in the button in the app, which is normal for that widget. I'm kind of puzzled about this. I've studied the demo code and the wonderful tutorial at: http://www.muitovar.com/gtk2hs/chap5-2.html. The tutorial has some code "onCurrentFolderChanged fchd $ ..." that I tried to model my added code after. If anyone could shed some light or offer a tip, I'd appreciate it. (If I can get this to work, I could submit it as a demo.) Thanks much, -- Peter |