summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2018-12-07 23:50:53 +0300
committerIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2018-12-07 23:50:53 +0300
commit0e8416f0be6af414282666699c98b1a216065bb7 (patch)
treeaa6ffd9dbf61031cebd7c6b6c5506a2cf6890e12
parentmerge stash and status (diff)
downloadgitbatch-0e8416f0be6af414282666699c98b1a216065bb7.tar.gz
reduced coupling in view navigation logic and minor refactor
-rw-r--r--pkg/git/stash.go4
-rw-r--r--pkg/gui/gui-navigate.go54
-rw-r--r--pkg/gui/gui-util.go78
-rw-r--r--pkg/gui/gui.go16
-rw-r--r--pkg/gui/keybindings.go56
-rw-r--r--pkg/gui/mainview.go44
-rw-r--r--pkg/gui/stashview.go50
-rw-r--r--pkg/gui/statusview.go49
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