Guest User

Untitled

a guest
Feb 18th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.76 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "io/ioutil"
  5. "os"
  6. "path/filepath"
  7.  
  8. "github.com/gdamore/tcell"
  9. "github.com/rivo/tview"
  10. )
  11.  
  12. func main() {
  13. //Define the Application
  14. app := tview.NewApplication()
  15.  
  16. //Define the Grid
  17. grid := tview.NewGrid().
  18. SetRows(2, 0, 2).
  19. SetColumns(20, 0, 20).
  20. SetBorders(true).
  21. AddItem(newPrimitive("File Viewer"), 0, 0, 1, 2, 0, 0, false)
  22.  
  23. //Define Content
  24. main := newText()
  25.  
  26. //Define FileTree
  27. TreePrimitive := func() (tview.Primitive, tview.Primitive) {
  28. text, tree := getFileNode(main, getFileTree())
  29. tree.SetAlign(false).SetGraphics(true)
  30. return text, tree
  31. }
  32. content, tree := TreePrimitive()
  33.  
  34. // Layout for screens narrower than 100 cells (menu and side bar are hidden).
  35. grid.AddItem(tree, 0, 0, 0, 0, 0, 0, false).
  36. AddItem(content, 1, 0, 1, 3, 0, 0, false)
  37.  
  38. // Layout for screens wider than 100 cells.
  39. grid.AddItem(tree, 1, 0, 1, 1, 0, 100, false).
  40. AddItem(content, 1, 1, 1, 1, 0, 100, false)
  41.  
  42. app = app.SetRoot(grid, true)
  43. app = app.SetFocus(tree)
  44.  
  45. if err := app.Run(); err != nil {
  46. panic(err)
  47. }
  48. }
  49.  
  50. func getFileNode(text *tview.TextView, tree *tview.TreeView) (*tview.TextView, *tview.TreeView) {
  51. // If a directory was selected, open it.
  52. tree.SetSelectedFunc(func(node *tview.TreeNode) {
  53. reference := node.GetReference()
  54. if reference == nil {
  55. return // Selecting the root node does nothing.
  56. }
  57. path := reference.(string)
  58. file, err := os.Open(path)
  59. children := node.GetChildren()
  60. if err != nil {
  61. return
  62. }
  63. info, err := file.Stat()
  64. if err != nil {
  65. return
  66. }
  67. mode := info.Mode()
  68. if mode.IsDir() {
  69. if len(children) == 0 {
  70. // Load and show files in this directory.
  71. add(node, path)
  72. } else {
  73. // Collapse if visible, expand if collapsed.
  74. node.SetExpanded(!node.IsExpanded())
  75. }
  76. } else {
  77. switch filepath.Ext(path) {
  78. default:
  79. text = text.Clear()
  80. b, err := ioutil.ReadAll(file)
  81. if err != nil {
  82. return
  83. }
  84. _, err = text.Write(b)
  85. if err != nil {
  86. return
  87. }
  88. }
  89. }
  90. })
  91. return text, tree
  92. }
  93.  
  94. func getFileTree() *tview.TreeView {
  95. rootDir := "."
  96. root := tview.NewTreeNode(rootDir).
  97. SetColor(tcell.ColorRed)
  98. tree := tview.NewTreeView().
  99. SetRoot(root).
  100. SetCurrentNode(root)
  101.  
  102. add(root, rootDir)
  103. return tree
  104.  
  105. }
  106.  
  107. func add(target *tview.TreeNode, path string) {
  108. files, err := ioutil.ReadDir(path)
  109. if err != nil {
  110. panic(err)
  111. }
  112. for _, file := range files {
  113. node := tview.NewTreeNode(file.Name()).
  114. SetReference(filepath.Join(path, file.Name())).
  115. SetSelectable(true)
  116. if file.IsDir() {
  117. node.SetColor(tcell.ColorGreen)
  118. }
  119. target.AddChild(node)
  120. }
  121. }
  122.  
  123. func newPrimitive(text string) tview.Primitive {
  124. return tview.NewTextView().SetTextAlign(tview.AlignCenter).SetText(text)
  125. }
  126.  
  127. func newText() *tview.TextView {
  128. return tview.NewTextView().SetTextAlign(tview.AlignLeft)
  129. }
Add Comment
Please, Sign In to add comment