File: DirList.hs

package info (click to toggle)
haskell-gtk3 0.15.9-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,756 kB
  • sloc: haskell: 3,375; ansic: 826; makefile: 160
file content (81 lines) | stat: -rw-r--r-- 2,188 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
{-# OPTIONS -cpp #-}
-- Test file for the ListView widget.
module Main(main) where

import Graphics.UI.Gtk
import Graphics.UI.Gtk.ModelView as New

import Control.Exception
import System.Directory
import System.IO
import System.Locale
import Data.Time

data FileInfo = FileInfo {
  fName :: String,
  fSize :: Integer,
  fTime :: UTCTime
}

main = do
  initGUI
  win <- windowNew
  on win objectDestroy mainQuit

  curDir <- getCurrentDirectory
  files <- getDirectoryContents curDir
  fInfos <- (flip mapM) files $ \f -> do
    s <- handle (\e ->
#if __GLASGOW_HASKELL__>=610
                 case e :: SomeException of
                   e ->
#endif
                        return 0) $ do
              h <- openFile f ReadMode
              s <- hFileSize h
              hClose h
              return s
    t <- getModificationTime f
    return FileInfo { fName = f
                    , fSize = s
                    , fTime = t }

  store <- New.listStoreNew fInfos

  tv <- New.treeViewNewWithModel store
  containerAdd win tv

  tvc <- New.treeViewColumnNew
  set tvc [ New.treeViewColumnTitle := "File name"
          , New.treeViewColumnResizable := True ]
  New.treeViewAppendColumn tv tvc

  name <- New.cellRendererTextNew
  New.treeViewColumnPackStart tvc name True
  New.cellLayoutSetAttributes tvc name store $ \FileInfo { fName = name } ->
    [ New.cellText := name ]

  tvc <- New.treeViewColumnNew
  set tvc [ New.treeViewColumnTitle := "Size"
          , New.treeViewColumnResizable := True ]
  New.treeViewAppendColumn tv tvc

  size <- New.cellRendererTextNew
  New.treeViewColumnPackStart tvc size True
  New.cellLayoutSetAttributes tvc size store $ \FileInfo { fSize = size } ->
    [ New.cellText := show size ]

  tvc <- New.treeViewColumnNew
  set tvc [ New.treeViewColumnTitle := "Modification time"
          , New.treeViewColumnResizable := True ]
  New.treeViewAppendColumn tv tvc

  time <- New.cellRendererTextNew
  New.treeViewColumnPackStart tvc time True
  New.cellLayoutSetAttributes tvc time store $ \FileInfo { fTime = time } ->
    [ New.cellText :=>
        return (formatTime defaultTimeLocale "%D %T" time)
    ]

  widgetShowAll win
  mainGUI