From: Shawn T. <0x...@gm...> - 2007-07-18 10:04:16
|
Hi there, I'm building an application that requires a sort of read-only console with scrolling capability. I'd like the "console" to be a blank white area with a vertical scrollbar. I then want to be able to write to the console within the mainGUI loop, and have the text show up at the bottom, potentially pushing up the previous lines and growing the scroll area (that is, shrinking the size of the scroll bar). I started out by trying to add a VBox to a Viewport within a Scrolled Window. Then to "write" to the console I packed labels at the end of the VBox. This didn't work at all. I couldn't get the background to be white, and I never got the labels to show up. Does anyone have any suggestions for creating this setup? I'd appreciate any pointers. I'm quite new to GTK. I've read through a lot of the gtk2hs API, but found nothing to help me. Thanks, Shawn Tice |
From: Axel S. <A....@ke...> - 2007-07-18 10:37:17
|
On Jul 18, 2007, at 11:04, Shawn Tice wrote: > Hi there, > > I'm building an application that requires a sort of read-only console > with scrolling capability. I'd like the "console" to be a blank white > area with a vertical scrollbar. I then want to be able to write to the > console within the mainGUI loop, and have the text show up at the > bottom, potentially pushing up the previous lines and growing the > scroll area (that is, shrinking the size of the scroll bar). > > I started out by trying to add a VBox to a Viewport within a Scrolled > Window. Then to "write" to the console I packed labels at the end of > the VBox. This didn't work at all. I couldn't get the background to be > white, and I never got the labels to show up. > > Does anyone have any suggestions for creating this setup? I'd > appreciate any pointers. I'm quite new to GTK. I've read through a lot > of the gtk2hs API, but found nothing to help me. Yes, there's a much easier way: The TextView and TextBuffer under Graphics.UI.Gtk.Multiline. You basically create a TextBuffer to hold your text into which you add new output using textBufferGetEndIter and textBufferInsertText. You can view this text in a many windows as you want (even none) by creating a TextView widget with this buffer. You can set the TextView so that no editing can happen by the user. You might also be able to set the cursor such that every TextView automatically scrolls to the end where your new output appears. Hope this helps, Axel. |
From: david48 <dav...@gm...> - 2007-07-18 20:25:28
|
On Jul 18, 2007, at 11:04, Shawn Tice wrote: > Hi there, > > I'm building an application that requires a sort of read-only console > with scrolling capability. I'd like the "console" to be a blank white > area with a vertical scrollbar. I then want to be able to write to the > console within the mainGUI loop, and have the text show up at the > bottom, potentially pushing up the previous lines and growing the > scroll area (that is, shrinking the size of the scroll bar). I created a TextView with Glade, and here's the code to use it : -- *********************************************************************** -- process pending events -- *********************************************************************** guiUpdate :: IO () guiUpdate = do ep <- eventsPending if ep == 0 then return() else mainIteration >> guiUpdate then somewhere in you main function : initGUI Just xml <- xmlNew "fchange.glade" textview <- xmlGetWidget xml castToTextView "textview1" let -- that function is to clear the textview textviewEmpty tv = do buf <- textViewGetBuffer tv deb <- textBufferGetStartIter buf fin <- textBufferGetEndIter buf textBufferDelete buf deb fin -- this one to add a string trace :: String -> IO () trace str = do putStrLn str buffer <- textViewGetBuffer textview iter <- textBufferGetEndIter buffer textBufferInsert buffer iter $ str ++ "\n" textViewScrollToIter textview iter 0 Nothing guiUpdate return () -- function that uses trace somefunction = do trace "hahahahahaha" return () |