diff options
| author | Ibrahim Serdar Acikgoz <serdaracikgoz86@gmail.com> | 2018-12-07 23:50:53 +0300 |
|---|---|---|
| committer | Ibrahim Serdar Acikgoz <serdaracikgoz86@gmail.com> | 2018-12-07 23:50:53 +0300 |
| commit | 0e8416f0be6af414282666699c98b1a216065bb7 (patch) | |
| tree | aa6ffd9dbf61031cebd7c6b6c5506a2cf6890e12 | |
| parent | merge stash and status (diff) | |
| download | gitbatch-0e8416f0be6af414282666699c98b1a216065bb7.tar.gz | |
reduced coupling in view navigation logic and minor refactor
| -rw-r--r-- | pkg/git/stash.go | 4 | ||||
| -rw-r--r-- | pkg/gui/gui-navigate.go | 54 | ||||
| -rw-r--r-- | pkg/gui/gui-util.go | 78 | ||||
| -rw-r--r-- | pkg/gui/gui.go | 16 | ||||
| -rw-r--r-- | pkg/gui/keybindings.go | 56 | ||||
| -rw-r--r-- | pkg/gui/mainview.go | 44 | ||||
| -rw-r--r-- | pkg/gui/stashview.go | 50 | ||||
| -rw-r--r-- | pkg/gui/statusview.go | 49 |
8 files changed, 177 insertions, 174 deletions
diff --git a/pkg/git/stash.go b/pkg/git/stash.go index 04e100b..caaaf90 100644 --- a/pkg/git/stash.go +++ b/pkg/git/stash.go @@ -81,13 +81,13 @@ func (entity *RepoEntity) loadStashedItems() error { hash := stashHashRegex.FindString(trimmed) // trim hash - trimmed = stashHashRegex.Split(trimmed, 2)[1][1:] + desc := stashHashRegex.Split(trimmed, 2)[1][1:] entity.Stasheds = append(entity.Stasheds, &StashedItem{ StashID: i, BranchName: branchName, Hash: hash, - Description: trimmed, + Description: desc, }) } return nil diff --git a/pkg/gui/gui-navigate.go b/pkg/gui/gui-navigate.go deleted file mode 100644 index 56d96de..0000000 --- a/pkg/gui/gui-navigate.go +++ /dev/null @@ -1,54 +0,0 @@ -package gui - -import ( - log "github.com/sirupsen/logrus" - "github.com/jroimartin/gocui" -) - -// focus to next view -func (gui *Gui) nextView(g *gocui.Gui, v *gocui.View) error { - var focusedViewName string - if v == nil || v.Name() == mainViews[len(mainViews)-1].Name { - focusedViewName = mainViews[0].Name - } else { - for i := range mainViews { - if v.Name() == mainViews[i].Name { - focusedViewName = mainViews[i+1].Name - break - } - if i == len(mainViews)-1 { - return nil - } - } - } - if _, err := g.SetCurrentView(focusedViewName); err != nil { - log.Warn("Loading view cannot be focused.") - return nil - } - gui.updateKeyBindingsView(g, focusedViewName) - return nil -} - -// focus to previous view -func (gui *Gui) previousView(g *gocui.Gui, v *gocui.View) error { - var focusedViewName string - if v == nil || v.Name() == mainViews[0].Name { - focusedViewName = mainViews[len(mainViews)-1].Name - } else { - for i := range mainViews { - if v.Name() == mainViews[i].Name { - focusedViewName = mainViews[i-1].Name - break - } - if i == len(mainViews)-1 { - return nil - } - } - } - if _, err := g.SetCurrentView(focusedViewName); err != nil { - log.Warn("Loading view cannot be focused.") - return nil - } - gui.updateKeyBindingsView(g, focusedViewName) - return nil -} diff --git a/pkg/gui/gui-util.go b/pkg/gui/gui-util.go index 2ae8cae..2338bac 100644 --- a/pkg/gui/gui-util.go +++ b/pkg/gui/gui-util.go @@ -1,11 +1,10 @@ package gui import ( - "sort" - "github.com/isacikgoz/gitbatch/pkg/git" "github.com/isacikgoz/gitbatch/pkg/helpers" "github.com/jroimartin/gocui" + log "github.com/sirupsen/logrus" ) // refreshes the side views of the application for given git.RepoEntity struct @@ -26,6 +25,58 @@ func (gui *Gui) refreshViews(g *gocui.Gui, entity *git.RepoEntity) error { return err } +// focus to next view +func (gui *Gui) nextViewOfGroup(g *gocui.Gui, v *gocui.View, group []viewFeature) error { + var focusedViewName string + if v == nil || v.Name() == group[len(group)-1].Name { + focusedViewName = group[0].Name + } else { + for i := range group { + if v.Name() == group[i].Name { + focusedViewName = group[i+1].Name + break + } + if i == len(group)-1 { + return nil + } + } + } + if _, err := g.SetCurrentView(focusedViewName); err != nil { + log.WithFields(log.Fields{ + "view": focusedViewName, + }).Warn("View cannot be focused.") + return nil + } + gui.updateKeyBindingsView(g, focusedViewName) + return nil +} + +// focus to previous view +func (gui *Gui) previousViewOfGroup(g *gocui.Gui, v *gocui.View, group []viewFeature) error { + var focusedViewName string + if v == nil || v.Name() == group[0].Name { + focusedViewName = group[len(group)-1].Name + } else { + for i := range group { + if v.Name() == group[i].Name { + focusedViewName = group[i-1].Name + break + } + if i == len(group)-1 { + return nil + } + } + } + if _, err := g.SetCurrentView(focusedViewName); err != nil { + log.WithFields(log.Fields{ + "view": focusedViewName, + }).Warn("View cannot be focused.") + return nil + } + gui.updateKeyBindingsView(g, focusedViewName) + return nil +} + // siwtch the app mode // TODO: switching can be made with conventional iteration func (gui *Gui) switchMode(g *gocui.Gui, v *gocui.View) error { @@ -110,29 +161,6 @@ func writeRightHandSide(v *gocui.View, text string, cx, cy int) error { return nil } -// sortByName sorts the repositories by A to Z order -func (gui *Gui) sortByName(g *gocui.Gui, v *gocui.View) error { - sort.Sort(git.Alphabetical(gui.State.Repositories)) - gui.refreshAfterSort(g) - return nil -} - -// sortByMod sorts the repositories according to last modifed date -// the top element will be the last modified -func (gui *Gui) sortByMod(g *gocui.Gui, v *gocui.View) error { - sort.Sort(git.LastModified(gui.State.Repositories)) - gui.refreshAfterSort(g) - return nil -} - -// utility function that refreshes main and side views after that -func (gui *Gui) refreshAfterSort(g *gocui.Gui) error { - gui.refreshMain(g) - entity := gui.getSelectedRepository() - gui.refreshViews(g, entity) - return nil -} - // cursor down acts like half-page down for faster scrolling func (gui *Gui) fastCursorDown(g *gocui.Gui, v *gocui.View) error { if v != nil { diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 0598383..5c32bc0 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -194,6 +194,22 @@ func (gui *Gui) layout(g *gocui.Gui) error { return nil } +// focus to next view +func (gui *Gui) nextMainView(g *gocui.Gui, v *gocui.View) error { + if err := gui.nextViewOfGroup(g, v, mainViews); err != nil { + return err + } + return nil +} + +// focus to previous view +func (gui *Gui) previousMainView(g *gocui.Gui, v *gocui.View) error { + if err := gui.previousViewOfGroup(g, v, mainViews); err != nil { + return err + } + return nil +} + // quit from the gui and end its loop func (gui *Gui) quit(g *gocui.Gui, v *gocui.View) error { return gocui.ErrQuit diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index 0cfd113..26df3fa 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -43,7 +43,7 @@ func (gui *Gui) generateKeybindings() error { View: view.Name, Key: gocui.KeyArrowLeft, Modifier: gocui.ModNone, - Handler: gui.previousView, + Handler: gui.previousMainView, Display: "←", Description: "Previous Panel", Vital: false, @@ -51,7 +51,7 @@ func (gui *Gui) generateKeybindings() error { View: view.Name, Key: gocui.KeyArrowRight, Modifier: gocui.ModNone, - Handler: gui.nextView, + Handler: gui.nextMainView, Display: "→", Description: "Next Panel", Vital: false, @@ -59,7 +59,7 @@ func (gui *Gui) generateKeybindings() error { View: view.Name, Key: 'l', Modifier: gocui.ModNone, - Handler: gui.nextView, + Handler: gui.nextMainView, Display: "l", Description: "Previous Panel", Vital: false, @@ -67,7 +67,7 @@ func (gui *Gui) generateKeybindings() error { View: view.Name, Key: 'h', Modifier: gocui.ModNone, - Handler: gui.previousView, + Handler: gui.previousMainView, Display: "h", Description: "Next Panel", Vital: false, @@ -77,6 +77,54 @@ func (gui *Gui) generateKeybindings() error { gui.KeyBindings = append(gui.KeyBindings, binding) } } + for _, view := range statusViews { + statusKeybindings := []*KeyBinding{ + { + View: view.Name, + Key: 'c', + Modifier: gocui.ModNone, + Handler: gui.closeStatusView, + Display: "c", + Description: "Close/Cancel", + Vital: true, + }, { + View: view.Name, + Key: gocui.KeyArrowLeft, + Modifier: gocui.ModNone, + Handler: gui.previousStatusView, + Display: "←", + Description: "Previous Panel", + Vital: false, + }, { + View: view.Name, + Key: gocui.KeyArrowRight, + Modifier: gocui.ModNone, + Handler: gui.nextStatusView, + Display: "→", + Description: "Next Panel", + Vital: false, + }, { + View: view.Name, + Key: 'l', + Modifier: gocui.ModNone, + Handler: gui.nextStatusView, + Display: "l", + Description: "Previous Panel", + Vital: false, + }, { + View: view.Name, + Key: 'h', + Modifier: gocui.ModNone, + Handler: gui.previousStatusView, + Display: "h", + Description: "Next Panel", + Vital: false, + }, + } + for _, binding := range statusKeybindings { + gui.KeyBindings = append(gui.KeyBindings, binding) + } + } individualKeybindings := []*KeyBinding{ { View: mainViewFeature.Name, diff --git a/pkg/gui/mainview.go b/pkg/gui/mainview.go index 58f8422..f912382 100644 --- a/pkg/gui/mainview.go +++ b/pkg/gui/mainview.go @@ -2,6 +2,7 @@ package gui import ( "fmt" + "sort" "github.com/isacikgoz/gitbatch/pkg/git" "github.com/isacikgoz/gitbatch/pkg/queue" @@ -36,6 +37,19 @@ func (gui *Gui) fillMain(g *gocui.Gui) error { return nil } +// refresh the main view and re-render the repository representations +func (gui *Gui) refreshMain(g *gocui.Gui) error { + mainView, err := g.View(mainViewFeature.Name) + if err != nil { + return err + } + mainView.Clear() + for _, r := range gui.State.Repositories { + fmt.Fprintln(mainView, gui.displayString(r)) + } + return nil +} + // moves the cursor downwards for the main view and if it goes to bottom it // prevents from going further func (gui *Gui) cursorDown(g *gocui.Gui, v *gocui.View) error { @@ -181,15 +195,25 @@ func (gui *Gui) unmarkAllRepositories(g *gocui.Gui, v *gocui.View) error { return nil } -// refresh the main view and re-render the repository representations -func (gui *Gui) refreshMain(g *gocui.Gui) error { - mainView, err := g.View(mainViewFeature.Name) - if err != nil { - return err - } - mainView.Clear() - for _, r := range gui.State.Repositories { - fmt.Fprintln(mainView, gui.displayString(r)) - } +// sortByName sorts the repositories by A to Z order +func (gui *Gui) sortByName(g *gocui.Gui, v *gocui.View) error { + sort.Sort(git.Alphabetical(gui.State.Repositories)) + gui.refreshAfterSort(g) + return nil +} + +// sortByMod sorts the repositories according to last modifed date +// the top element will be the last modified +func (gui *Gui) sortByMod(g *gocui.Gui, v *gocui.View) error { + sort.Sort(git.LastModified(gui.State.Repositories)) + gui.refreshAfterSort(g) + return nil +} + +// utility function that refreshes main and side views after that +func (gui *Gui) refreshAfterSort(g *gocui.Gui) error { + gui.refreshMain(g) + entity := gui.getSelectedRepository() + gui.refreshViews(g, entity) return nil } diff --git a/pkg/gui/stashview.go b/pkg/gui/stashview.go deleted file mode 100644 index 8deb6d0..0000000 --- a/pkg/gui/stashview.go +++ /dev/null @@ -1,50 +0,0 @@ -package gui - -import ( - "fmt" - - "github.com/jroimartin/gocui" -) - -var stashReturnView string - -func (gui *Gui) openStashesView(g *gocui.Gui, returnViewName string) error { - maxX, maxY := g.Size() - stashReturnView = returnViewName - v, err := g.SetView("stash", maxX/2-30, maxY/2-3, maxX/2+30, maxY/2+3) - if err != nil { - if err != gocui.ErrUnknownView { - return err - } - v.Title = " Stashed Items " - v.Wrap = true - entity := gui.getSelectedRepository() - stashedItems := entity.Stasheds - for _, stashedItem := range stashedItems { - fmt.Fprintln(v, stashedItem) - } - - } - gui.updateKeyBindingsView(g, "stash") - if _, err := g.SetCurrentView("stash"); err != nil { - return err - } - return nil -} - -func (gui *Gui) closeStashesView(g *gocui.Gui, v *gocui.View) error { - - if err := g.DeleteView(v.Name()); err != nil { - return nil - } - if _, err := g.SetCurrentView(stashReturnView); err != nil { - return err - } - gui.updateKeyBindingsView(g, stashReturnView) - return nil -} - -func (gui *Gui) showStashesView(g *gocui.Gui, v *gocui.View) (err error) { - // gui.openStashView(g, mainViewFeature.Name) - return nil -} diff --git a/pkg/gui/statusview.go b/pkg/gui/statusview.go index 8ea6327..f9ab29d 100644 --- a/pkg/gui/statusview.go +++ b/pkg/gui/statusview.go @@ -8,10 +8,12 @@ import ( var ( statusHeaderViewFeature = viewFeature{Name: "status-header", Title: " Status Header "} - statusViewFeature = viewFeature{Name: "status", Title: " Status "} + // statusViewFeature = viewFeature{Name: "status", Title: " Status "} stageViewFeature = viewFeature{Name: "staged", Title: " Staged "} unstageViewFeature = viewFeature{Name: "unstaged", Title: " Unstaged "} stashViewFeature = viewFeature{Name: "stash", Title: " Stash "} + + statusViews = []viewFeature{stageViewFeature, unstageViewFeature, stashViewFeature} ) // open the status layout @@ -23,10 +25,20 @@ func (gui *Gui) openStatusView(g *gocui.Gui, v *gocui.View) error { return nil } -// iteration handler for the status layout +// focus to next view func (gui *Gui) nextStatusView(g *gocui.Gui, v *gocui.View) error { - var err error - return err + if err := gui.nextViewOfGroup(g, v, statusViews); err != nil { + return err + } + return nil +} + +// focus to previous view +func (gui *Gui) previousStatusView(g *gocui.Gui, v *gocui.View) error { + if err := gui.previousViewOfGroup(g, v, statusViews); err != nil { + return err + } + return nil } // header og the status layout @@ -42,10 +54,6 @@ func (gui *Gui) openStatusHeaderView(g *gocui.Gui) error { // v.Frame = false v.Wrap = true } - gui.updateKeyBindingsView(g, statusHeaderViewFeature.Name) - if _, err := g.SetCurrentView(statusHeaderViewFeature.Name); err != nil { - return err - } return nil } @@ -61,6 +69,10 @@ func (gui *Gui) openStageView(g *gocui.Gui) error { v.Title = stageViewFeature.Title v.Wrap = true } + gui.updateKeyBindingsView(g, stageViewFeature.Name) + if _, err := g.SetCurrentView(stageViewFeature.Name); err != nil { + return err + } return nil } @@ -79,7 +91,6 @@ func (gui *Gui) openUnStagedView(g *gocui.Gui) error { return nil } - // stash view func (gui *Gui) openStashView(g *gocui.Gui) error { maxX, maxY := g.Size() @@ -120,23 +131,3 @@ func (gui *Gui) closeStatusView(g *gocui.Gui, v *gocui.View) error { gui.updateKeyBindingsView(g, mainViewFeature.Name) return nil } - - // { - // View: statusHeaderViewFeature.Name, - // Key: 'c', - // Modifier: gocui.ModNone, - // Handler: gui.closeStatusView, - // Display: "c", - // Description: "close/cancel", - // Vital: true, - // }, - - // { - // View: mainViewFeature.Name, - // Key: 't', - // Modifier: gocui.ModNone, - // Handler: gui.openStatusView, - // Display: "t", - // Description: "Open Status", - // Vital: true, - // },
\ No newline at end of file |
