1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
import Graphics.UI.Gtk
import Graphics.UI.Gtk.ModelView as New
import Data.Tree
main = do
initGUI
win <- windowNew
-- Create a tree model with some unsorted data.
rawmodel <- New.treeStoreNew
[Node ("zoo",8) [], Node ("foo",5) [],
Node ("bar",20) [], Node ("baz",2) []]
-- Create a sorting proxy model, that is, a model that permutates the
-- rows of a different model such that they appear to be sorted.
model <- New.treeModelSortNewWithModel rawmodel
-- Define two sorting functions, one being the default sorting function and
-- the other one being the sorting function for the 'SortColumnId' 2.
-- 'SortColumnId's are arbitrary positive numbers, i.e., we could have chosen
-- any other unique number.
New.treeSortableSetDefaultSortFunc model $ Just $ \iter1 iter2 -> do
(t1,_) <- New.treeModelGetRow rawmodel iter1
(t2,_) <- New.treeModelGetRow rawmodel iter2
return (compare t1 t2)
New.treeSortableSetSortFunc model 2 $ \iter1 iter2 -> do
(_,n1) <- New.treeModelGetRow rawmodel iter1
(_,n2) <- New.treeModelGetRow rawmodel iter2
return (compare n1 n2)
-- Create the view.
view <- New.treeViewNewWithModel model
-- Create and insert two columns, one with the heading Name, one with the
-- heading Number. Associate the 'SortColumnId' 2 with the latter column such
-- that clicking on the Number header will sort the rows by the numbers.
col <- New.treeViewColumnNew
New.treeViewColumnSetTitle col "Name"
rend <- New.cellRendererTextNew
New.cellLayoutPackStart col rend True
New.cellLayoutSetAttributeFunc col rend model $ \iter -> do
cIter <- New.treeModelSortConvertIterToChildIter model iter
(n,_) <- New.treeModelGetRow rawmodel cIter
set rend [New.cellText := n]
New.treeViewAppendColumn view col
col' <- New.treeViewColumnNew
New.treeViewColumnSetTitle col' "Number"
rend <- New.cellRendererTextNew
New.cellLayoutPackStart col' rend True
New.cellLayoutSetAttributeFunc col' rend model $ \iter -> do
cIter <- New.treeModelSortConvertIterToChildIter model iter
(_,c) <- New.treeModelGetRow rawmodel cIter
set rend [New.cellText := show c]
New.treeViewAppendColumn view col'
New.treeViewColumnSetSortColumnId col' 2
-- Create a button that shows information on the current state of the sorting
-- settings.
button <- buttonNewWithLabel "Dump Info"
on button buttonActivated $ do
sId <- New.treeViewColumnGetSortColumnId col
putStrLn ("tvc1 sort id is "++show sId)
sId <- New.treeViewColumnGetSortColumnId col'
putStrLn ("tvc2 sort id is "++show sId)
sId <- New.treeSortableGetSortColumnId model
putStrLn ("sort id is "++show sId)
-- Show all entries of the proxy model
let recurse Nothing = return ()
recurse (Just iter) = do
cIter <- New.treeModelSortConvertIterToChildIter model iter
row <- New.treeModelGetRow rawmodel cIter
putStrLn ("iter "++show cIter++": "++show row)
mIter <- New.treeModelIterNext model iter
recurse mIter
mIter <- New.treeModelGetIterFirst model
recurse mIter
-- Put it all together.
vBox <- vBoxNew False 3
-- boxPackStartDefaults vBox view
boxPackStart vBox view PackRepel 0
boxPackEnd vBox button PackNatural 0
containerAdd win vBox
widgetShowAll win
on win objectDestroy mainQuit
mainGUI
|