module Yi.UI.Pango.ProjectTree
( projectTreeNew
, loadProjectTree
) where
import Data.Tree
import Shim.ProjectContent
import qualified Graphics.UI.Gtk.ModelView as MView
import qualified Graphics.UI.Gtk as Gtk
import Graphics.UI.Gtk.Gdk.Pixbuf (Pixbuf)
import Graphics.UI.Gtk.ModelView.TreeView ( treeViewHeadersVisible
, onRowActivated
)
import System.Glib.Attributes
import Yi.Keymap
import Yi.Dired
import Yi.UI.Pango.Utils
projectTreeNew :: (Action -> IO ()) -> Gtk.TreeStore ProjectItem -> IO Gtk.TreeView
projectTreeNew post store = do
projectTree <- MView.treeViewNewWithModel store
set projectTree [treeViewHeadersVisible := False]
col1 <- MView.treeViewColumnNew
col2 <- MView.treeViewColumnNew
renderer1 <- MView.cellRendererPixbufNew
renderer2 <- MView.cellRendererTextNew
MView.cellLayoutPackStart col1 renderer1 True
MView.cellLayoutPackStart col2 renderer2 True
icoProject <- loadIcon "project.png"
icoDependencies <- loadIcon "dependencies.png"
icoPlainFolder <- loadIcon "plain-folder.png"
icoHsSourceFolder <- loadIcon "hs-source-folder.png"
icoExposedModule <- loadIcon "exposed-module.png"
icoHiddenModule <- loadIcon "hidden-module.png"
icoExposedFileModule<- loadIcon "exposed-file-module.png"
icoHiddenFileModule <- loadIcon "hidden-file-module.png"
icoCSource <- loadIcon "c-source.png"
icoHSource <- loadIcon "h-source.png"
icoTextFile <- loadIcon "text-file.png"
icoLicenseFile <- loadIcon "license-file.png"
icoPackage <- loadIcon "package.png"
icoSetupScript <- loadIcon "setup-script.png"
let icos = Icons icoProject
icoDependencies
icoPlainFolder
icoHsSourceFolder
icoExposedModule
icoHiddenModule
icoExposedFileModule
icoHiddenFileModule
icoCSource
icoHSource
icoTextFile
icoLicenseFile
icoPackage
icoSetupScript
MView.cellLayoutSetAttributes col1 renderer1 store $ \row -> [MView.cellPixbuf := itemIcon icos row]
MView.cellLayoutSetAttributes col2 renderer2 store $ \row -> [MView.cellText := itemName row]
MView.treeViewAppendColumn projectTree col1
MView.treeViewAppendColumn projectTree col2
onRowActivated projectTree $ \path _col -> do
item <- MView.treeStoreGetValue store path
case item of
FileItem {itemFPath=path} -> post (makeAction (fnewE path))
ModuleItem{itemFPath=path} -> post (makeAction (fnewE path))
_ -> return ()
return projectTree
loadProjectTree :: Gtk.TreeStore a -> Tree a -> IO ()
loadProjectTree projectStore tree = do
MView.treeStoreClear projectStore
MView.treeStoreInsertTree projectStore [] 0 tree
data Icons
= Icons
{ icoProject :: Pixbuf
, icoDependencies :: Pixbuf
, icoPlainFolder :: Pixbuf
, icoHsSourceFolder :: Pixbuf
, icoExposedModule :: Pixbuf
, icoHiddenModule :: Pixbuf
, icoExposedFileModule:: Pixbuf
, icoHiddenFileModule :: Pixbuf
, icoCSource :: Pixbuf
, icoHSource :: Pixbuf
, icoTextFile :: Pixbuf
, icoLicenseFile :: Pixbuf
, icoPackage :: Pixbuf
, icoSetupScript :: Pixbuf
}
itemIcon icos (ProjectItem{}) = icoProject icos
itemIcon icos (DependenciesItem{}) = icoDependencies icos
itemIcon icos (FolderItem{folderKind=kind})= folderIcon icos kind
itemIcon icos (FileItem{fileKind=kind}) = fileIcon icos kind
itemIcon icos (ModuleItem{moduleKind=kind})= moduleIcon icos kind icoExposedModule icoHiddenModule
itemIcon icos (PackageItem{}) = icoPackage icos
fileIcon icos (HsSource kind) = moduleIcon icos kind icoExposedFileModule icoHiddenFileModule
fileIcon icos CSource = icoCSource icos
fileIcon icos HSource = icoHSource icos
fileIcon icos TextFile = icoTextFile icos
fileIcon icos SetupScript = icoSetupScript icos
fileIcon icos LicenseText = icoLicenseFile icos
folderIcon icos HsSourceFolder = icoHsSourceFolder icos
folderIcon icos PlainFolder = icoPlainFolder icos
moduleIcon icos ExposedModule icoE _ = icoE icos
moduleIcon icos HiddenModule _ icoH = icoH icos