diff --git a/gui/gui.go b/gui/gui.go index 9cd5b6e..af47d88 100644 --- a/gui/gui.go +++ b/gui/gui.go @@ -1,6 +1,7 @@ package gui import ( + "bytes" "encoding/json" "fmt" "io/ioutil" @@ -155,3 +156,40 @@ func (g *Gui) walk(node *tview.TreeNode, text string) []*tview.TreeNode { return nodes } + +func (g *Gui) SaveJSON() { + pageName := "save_to_file" + form := tview.NewForm() + form.AddInputField("file", "", 0, nil, nil). + AddButton("save", func() { + fileName := form.GetFormItem(0).(*tview.InputField).GetText() + fileName = os.ExpandEnv(fileName) + + var b bytes.Buffer + enc := json.NewEncoder(&b) + enc.SetIndent("", " ") + + if err := enc.Encode(g.Tree.OriginJSON); err != nil { + msg := fmt.Sprintf("can't make json: %s", err) + log.Println(msg) + g.Message(msg, "main", func() {}) + return + } + + if err := ioutil.WriteFile(fileName, b.Bytes(), 0666); err != nil { + msg := fmt.Sprintf("can't create file: %s", err) + log.Println(msg) + g.Message(msg, "main", func() {}) + return + } + g.Pages.RemovePage(pageName) + }). + AddButton("cancel", func() { + g.Pages.RemovePage(pageName) + }) + + form.SetBorder(true).SetTitle("save to file"). + SetTitleAlign(tview.AlignLeft) + + g.Pages.AddAndSwitchToPage(pageName, g.Modal(form, 0, 8), true).ShowPage("main") +} diff --git a/gui/tree.go b/gui/tree.go index d49199d..1580773 100644 --- a/gui/tree.go +++ b/gui/tree.go @@ -11,6 +11,7 @@ import ( type Tree struct { *tview.TreeView OriginRoot *tview.TreeNode + OriginJSON interface{} } func NewTree() *Tree { @@ -28,6 +29,7 @@ func (t *Tree) UpdateView(g *Gui, i interface{}) { t.SetRoot(root).SetCurrentNode(root) originRoot := *root t.OriginRoot = &originRoot + t.OriginJSON = i }) } @@ -91,6 +93,8 @@ func (t *Tree) SetKeybindings(g *Gui) { t.GetCurrentNode().SetExpanded(true) case 'r': g.LoadJSON() + case 's': + g.SaveJSON() case '/': g.Search() }