File: TreeSort.hs

package info (click to toggle)
haskell-gtk 0.15.7-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 3,964 kB
  • sloc: haskell: 3,346; ansic: 826; makefile: 161
file content (86 lines) | stat: -rw-r--r-- 3,367 bytes parent folder | download | duplicates (9)
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