Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "io/ioutil"
- "os"
- "path/filepath"
- "github.com/gdamore/tcell"
- "github.com/rivo/tview"
- )
- func main() {
- //Define the Application
- app := tview.NewApplication()
- //Define the Grid
- grid := tview.NewGrid().
- SetRows(2, 0, 2).
- SetColumns(20, 0, 20).
- SetBorders(true).
- AddItem(newPrimitive("File Viewer"), 0, 0, 1, 2, 0, 0, false)
- //Define Content
- main := newText()
- //Define FileTree
- TreePrimitive := func() (tview.Primitive, tview.Primitive) {
- text, tree := getFileNode(main, getFileTree())
- tree.SetAlign(false).SetGraphics(true)
- return text, tree
- }
- content, tree := TreePrimitive()
- // Layout for screens narrower than 100 cells (menu and side bar are hidden).
- grid.AddItem(tree, 0, 0, 0, 0, 0, 0, false).
- AddItem(content, 1, 0, 1, 3, 0, 0, false)
- // Layout for screens wider than 100 cells.
- grid.AddItem(tree, 1, 0, 1, 1, 0, 100, false).
- AddItem(content, 1, 1, 1, 1, 0, 100, false)
- app = app.SetRoot(grid, true)
- app = app.SetFocus(tree)
- if err := app.Run(); err != nil {
- panic(err)
- }
- }
- func getFileNode(text *tview.TextView, tree *tview.TreeView) (*tview.TextView, *tview.TreeView) {
- // If a directory was selected, open it.
- tree.SetSelectedFunc(func(node *tview.TreeNode) {
- reference := node.GetReference()
- if reference == nil {
- return // Selecting the root node does nothing.
- }
- path := reference.(string)
- file, err := os.Open(path)
- children := node.GetChildren()
- if err != nil {
- return
- }
- info, err := file.Stat()
- if err != nil {
- return
- }
- mode := info.Mode()
- if mode.IsDir() {
- if len(children) == 0 {
- // Load and show files in this directory.
- add(node, path)
- } else {
- // Collapse if visible, expand if collapsed.
- node.SetExpanded(!node.IsExpanded())
- }
- } else {
- switch filepath.Ext(path) {
- default:
- text = text.Clear()
- b, err := ioutil.ReadAll(file)
- if err != nil {
- return
- }
- _, err = text.Write(b)
- if err != nil {
- return
- }
- }
- }
- })
- return text, tree
- }
- func getFileTree() *tview.TreeView {
- rootDir := "."
- root := tview.NewTreeNode(rootDir).
- SetColor(tcell.ColorRed)
- tree := tview.NewTreeView().
- SetRoot(root).
- SetCurrentNode(root)
- add(root, rootDir)
- return tree
- }
- func add(target *tview.TreeNode, path string) {
- files, err := ioutil.ReadDir(path)
- if err != nil {
- panic(err)
- }
- for _, file := range files {
- node := tview.NewTreeNode(file.Name()).
- SetReference(filepath.Join(path, file.Name())).
- SetSelectable(true)
- if file.IsDir() {
- node.SetColor(tcell.ColorGreen)
- }
- target.AddChild(node)
- }
- }
- func newPrimitive(text string) tview.Primitive {
- return tview.NewTextView().SetTextAlign(tview.AlignCenter).SetText(text)
- }
- func newText() *tview.TextView {
- return tview.NewTextView().SetTextAlign(tview.AlignLeft)
- }
Add Comment
Please, Sign In to add comment