summaryrefslogtreecommitdiff
path: root/pkg/gui/mainview.go
diff options
context:
space:
mode:
authorIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2018-12-19 00:05:39 +0300
committerGitHub <noreply@github.com>2018-12-19 00:05:39 +0300
commit68bcd82ca27198c31bfe06858e3ae85e48648dab (patch)
tree3747cb46200821616a89b77a1fc142aaaff7606f /pkg/gui/mainview.go
parentMerge pull request #35 from isacikgoz/develop (diff)
parentminor code style imrovements and code reduction (diff)
downloadgitbatch-68bcd82ca27198c31bfe06858e3ae85e48648dab.tar.gz
Merge pull request #36 from isacikgoz/develop
Develop
Diffstat (limited to 'pkg/gui/mainview.go')
-rw-r--r--pkg/gui/mainview.go104
1 files changed, 59 insertions, 45 deletions
diff --git a/pkg/gui/mainview.go b/pkg/gui/mainview.go
index 389d66d..e4c0159 100644
--- a/pkg/gui/mainview.go
+++ b/pkg/gui/mainview.go
@@ -6,6 +6,7 @@ import (
"github.com/isacikgoz/gitbatch/pkg/git"
"github.com/jroimartin/gocui"
+ log "github.com/sirupsen/logrus"
)
// this is the initial function for filling the values for the main view. the
@@ -16,9 +17,7 @@ func (gui *Gui) fillMain(g *gocui.Gui) error {
if err != nil {
return err
}
- for _, r := range gui.State.Repositories {
- fmt.Fprintln(v, gui.displayString(r))
- }
+ // if there is still a loading screen we better get rid of it
err = g.DeleteView(loadingViewFeature.Name)
if err != nil {
return err
@@ -26,26 +25,39 @@ func (gui *Gui) fillMain(g *gocui.Gui) error {
if _, err = gui.setCurrentViewOnTop(g, mainViewFeature.Name); err != nil {
return err
}
+ // Sort by name is default behavior as expected, so it handles initial
+ // rendering of the main view
if err = gui.sortByName(g, v); err != nil {
return err
}
- entity := gui.getSelectedRepository()
- gui.refreshViews(g, entity)
return nil
})
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)
+func (gui *Gui) renderMain() error {
+ gui.mutex.Lock()
+ defer gui.mutex.Unlock()
+
+ mainView, err := gui.g.View(mainViewFeature.Name)
if err != nil {
return err
}
mainView.Clear()
for _, r := range gui.State.Repositories {
- fmt.Fprintln(mainView, gui.displayString(r))
+ fmt.Fprintln(mainView, gui.repositoryLabel(r))
}
+ // while refreshing, refresh sideViews for selected entity, something may
+ // be changed?
+ return gui.renderSideViews(gui.getSelectedRepository())
+}
+
+// listens the event -> "repository.updated"
+func (gui *Gui) repositoryUpdated(event *git.RepositoryEvent) error {
+ gui.g.Update(func(g *gocui.Gui) error {
+ return gui.renderMain()
+ })
return nil
}
@@ -62,18 +74,12 @@ func (gui *Gui) cursorDown(g *gocui.Gui, v *gocui.View) error {
return nil
}
if err := v.SetCursor(cx, cy+1); err != nil {
-
if err := v.SetOrigin(ox, oy+1); err != nil {
return err
}
}
- entity := gui.getSelectedRepository()
- if err := gui.refreshMain(g); err != nil {
- return err
- }
- gui.refreshViews(g, entity)
}
- return nil
+ return gui.renderMain()
}
// moves the cursor upwards for the main view
@@ -86,13 +92,8 @@ func (gui *Gui) cursorUp(g *gocui.Gui, v *gocui.View) error {
return err
}
}
- entity := gui.getSelectedRepository()
- if err := gui.refreshMain(g); err != nil {
- return err
- }
- gui.refreshViews(g, entity)
}
- return nil
+ return gui.renderMain()
}
// returns the entity at cursors position by taking its position in the gui's
@@ -103,9 +104,6 @@ func (gui *Gui) getSelectedRepository() *git.RepoEntity {
v, _ := gui.g.View(mainViewFeature.Name)
_, oy := v.Origin()
_, cy := v.Cursor()
- // if _, err := v.Line(cy); err != nil {
- // return r, err
- // }
return gui.State.Repositories[cy+oy]
}
@@ -129,7 +127,7 @@ func (gui *Gui) addToQueue(entity *git.RepoEntity) error {
if err != nil {
return err
}
- entity.State = git.Queued
+ entity.SetState(git.Queued)
return nil
}
@@ -139,7 +137,36 @@ func (gui *Gui) removeFromQueue(entity *git.RepoEntity) error {
if err != nil {
return err
}
- entity.State = git.Available
+ entity.SetState(git.Available)
+ return nil
+}
+
+// this function starts the queue and updates the gui with the result of an
+// operation
+func (gui *Gui) startQueue(g *gocui.Gui, v *gocui.View) error {
+ go func(gui_go *Gui, g_go *gocui.Gui) {
+ for {
+ job, finished, err := gui_go.State.Queue.StartNext()
+
+ if err != nil {
+ if err == git.ErrAuthenticationRequired {
+ // pause the job, so it will be indicated to being blocking
+ job.Entity.SetState(git.Paused)
+ err := gui_go.openAuthenticationView(g, gui_go.State.Queue, job, v.Name())
+ if err != nil {
+ log.Warn(err.Error())
+ return
+ }
+ }
+ return
+ // with not returning here, we simply ignore and continue
+ }
+ // if queue is finished simply return from this goroutine
+ if finished {
+ return
+ }
+ }
+ }(gui, g)
return nil
}
@@ -148,18 +175,15 @@ func (gui *Gui) removeFromQueue(entity *git.RepoEntity) error {
func (gui *Gui) markRepository(g *gocui.Gui, v *gocui.View) error {
r := gui.getSelectedRepository()
// maybe, failed entities may be added to queue again
- if r.State == git.Available || r.State == git.Success || r.State == git.Paused {
+ if r.State().Ready {
if err := gui.addToQueue(r); err != nil {
return err
}
- } else if r.State == git.Queued {
+ } else if r.State() == git.Queued {
if err := gui.removeFromQueue(r); err != nil {
return err
}
- } else {
- return nil
}
- gui.refreshMain(g)
return nil
}
@@ -167,7 +191,7 @@ func (gui *Gui) markRepository(g *gocui.Gui, v *gocui.View) error {
// current state into account before adding it
func (gui *Gui) markAllRepositories(g *gocui.Gui, v *gocui.View) error {
for _, r := range gui.State.Repositories {
- if r.State == git.Available || r.State == git.Success {
+ if r.State().Ready {
if err := gui.addToQueue(r); err != nil {
return err
}
@@ -175,7 +199,6 @@ func (gui *Gui) markAllRepositories(g *gocui.Gui, v *gocui.View) error {
continue
}
}
- gui.refreshMain(g)
return nil
}
@@ -183,7 +206,7 @@ func (gui *Gui) markAllRepositories(g *gocui.Gui, v *gocui.View) error {
// current state into account before removing it
func (gui *Gui) unmarkAllRepositories(g *gocui.Gui, v *gocui.View) error {
for _, r := range gui.State.Repositories {
- if r.State == git.Queued {
+ if r.State() == git.Queued {
if err := gui.removeFromQueue(r); err != nil {
return err
}
@@ -191,14 +214,13 @@ func (gui *Gui) unmarkAllRepositories(g *gocui.Gui, v *gocui.View) error {
continue
}
}
- gui.refreshMain(g)
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)
+ gui.renderMain()
return nil
}
@@ -206,14 +228,6 @@ func (gui *Gui) sortByName(g *gocui.Gui, v *gocui.View) error {
// 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)
+ gui.renderMain()
return nil
}