summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Burke <rich.g.burke@gmail.com>2018-09-28 21:45:05 +0100
committerRichard Burke <rich.g.burke@gmail.com>2018-09-28 21:45:05 +0100
commit35c9744c2b2c332b61f743a5f6d9c6f767d3c266 (patch)
tree23bd58c6d7e467d124dbead88eed3df5aacae344
parent095b9285358dc8ddf3d97f041195759e84372b5f (diff)
Selecting row in summary view triggers child view to display
-rw-r--r--cmd/grv/commit_view.go55
-rw-r--r--cmd/grv/diff_view.go24
-rw-r--r--cmd/grv/git_summary_view.go76
-rw-r--r--cmd/grv/summary_view.go5
4 files changed, 127 insertions, 33 deletions
diff --git a/cmd/grv/commit_view.go b/cmd/grv/commit_view.go
index 057b2b5..bcce032 100644
--- a/cmd/grv/commit_view.go
+++ b/cmd/grv/commit_view.go
@@ -63,6 +63,7 @@ type CommitView struct {
commitGraphLoadCh chan commitGraphLoadRequest
commitSelectedCh chan *Commit
variables GRVVariableSetter
+ showBorder bool
waitGroup sync.WaitGroup
lock sync.Mutex
}
@@ -79,6 +80,7 @@ func NewCommitView(repoData RepoData, repoController RepoController, channels Ch
refViewData: make(map[string]*referenceViewData),
lastDotRenderTime: time.Now(),
variables: variables,
+ showBorder: true,
handlers: map[ActionType]commitViewHandler{
ActionAddFilter: addCommitFilter,
ActionRemoveFilter: removeCommitFilter,
@@ -203,36 +205,39 @@ func (commitView *CommitView) Render(win RenderWindow) (err error) {
}
}
- win.DrawBorder()
+ if commitView.showBorder {
+ win.DrawBorder()
- if err = win.SetTitle(CmpCommitviewTitle, "Commits for %v", commitView.activeRef.Shorthand()); err != nil {
- return
- }
+ if err = win.SetTitle(CmpCommitviewTitle, "Commits for %v", commitView.activeRef.Shorthand()); err != nil {
+ return
+ }
- var selectedCommit uint
- if commitSetState.commitNum == 0 {
- selectedCommit = 0
- } else {
- selectedCommit = viewPos.ActiveRowIndex() + 1
- }
+ var selectedCommit uint
+ if commitSetState.commitNum == 0 {
+ selectedCommit = 0
+ } else {
+ selectedCommit = viewPos.ActiveRowIndex() + 1
+ }
- var footerText bytes.Buffer
+ var footerText bytes.Buffer
- footerText.WriteString(fmt.Sprintf("Commit %v of %v", selectedCommit, commitSetState.commitNum))
+ footerText.WriteString(fmt.Sprintf("Commit %v of %v", selectedCommit, commitSetState.commitNum))
- if commitSetState.filterState != nil {
- filtersApplied := commitSetState.filterState.filtersApplied
- filtersTextSuffix := ""
+ if commitSetState.filterState != nil {
+ filtersApplied := commitSetState.filterState.filtersApplied
+ filtersTextSuffix := ""
- if filtersApplied > 1 {
- filtersTextSuffix = "s"
+ if filtersApplied > 1 {
+ filtersTextSuffix = "s"
+ }
+
+ footerText.WriteString(fmt.Sprintf(" (%v filter%v applied)", commitSetState.filterState.filtersApplied, filtersTextSuffix))
}
- footerText.WriteString(fmt.Sprintf(" (%v filter%v applied)", commitSetState.filterState.filtersApplied, filtersTextSuffix))
- }
+ if err = win.SetFooter(CmpCommitviewFooter, "%v", footerText.String()); err != nil {
+ return
+ }
- if err = win.SetFooter(CmpCommitviewFooter, "%v", footerText.String()); err != nil {
- return
}
if searchActive, searchPattern, lastSearchFoundMatch := commitView.viewSearch.SearchActive(); searchActive && lastSearchFoundMatch {
@@ -301,6 +306,14 @@ func (commitView *CommitView) renderCommit(tableFormatter *TableFormatter, rowIn
return
}
+// SetShowBorder controls whether a border is drawn around the view
+func (commitView *CommitView) SetShowBorder(showBorder bool) {
+ commitView.lock.Lock()
+ defer commitView.lock.Unlock()
+
+ commitView.showBorder = showBorder
+}
+
// RenderHelpBar shows key bindings custom to the commit view
func (commitView *CommitView) RenderHelpBar(lineBuilder *LineBuilder) (err error) {
RenderKeyBindingHelp(commitView.ViewID(), lineBuilder, commitView.config, []ActionMessage{
diff --git a/cmd/grv/diff_view.go b/cmd/grv/diff_view.go
index d2c7ef2..f9e6a5c 100644
--- a/cmd/grv/diff_view.go
+++ b/cmd/grv/diff_view.go
@@ -139,6 +139,7 @@ type DiffView struct {
handlers map[ActionType]diffViewHandler
diffLoadRequestCh chan diffLoadRequest
variables GRVVariableSetter
+ showBorder bool
waitGroup sync.WaitGroup
lock sync.Mutex
}
@@ -153,6 +154,7 @@ func NewDiffView(repoData RepoData, channels Channels, config Config, variables
diffs: make(map[diffID]*diffLines),
diffLoadRequestCh: make(chan diffLoadRequest, dvDiffLoadRequestChannelSize),
variables: variables,
+ showBorder: true,
handlers: map[ActionType]diffViewHandler{
ActionSelect: selectDiffLine,
},
@@ -269,14 +271,16 @@ func (diffView *DiffView) Render(win RenderWindow) (err error) {
return
}
- win.DrawBorder()
+ if diffView.showBorder {
+ win.DrawBorder()
- if err = win.SetTitle(CmpDiffviewTitle, "Diff for %v", diffView.activeDiff); err != nil {
- return
- }
+ if err = win.SetTitle(CmpDiffviewTitle, "Diff for %v", diffView.activeDiff); err != nil {
+ return
+ }
- if err = win.SetFooter(CmpDiffviewFooter, "Line %v of %v", viewPos.ActiveRowIndex()+1, lineNum); err != nil {
- return
+ if err = win.SetFooter(CmpDiffviewFooter, "Line %v of %v", viewPos.ActiveRowIndex()+1, lineNum); err != nil {
+ return
+ }
}
if searchActive, searchPattern, lastSearchFoundMatch := diffView.viewSearch.SearchActive(); searchActive && lastSearchFoundMatch {
@@ -288,6 +292,14 @@ func (diffView *DiffView) Render(win RenderWindow) (err error) {
return
}
+// SetShowBorder controls whether a border is drawn around the view
+func (diffView *DiffView) SetShowBorder(showBorder bool) {
+ diffView.lock.Lock()
+ defer diffView.lock.Unlock()
+
+ diffView.showBorder = showBorder
+}
+
// RenderHelpBar renders help information for the diff view
func (diffView *DiffView) RenderHelpBar(lineBuilder *LineBuilder) (err error) {
diffView.lock.Lock()
diff --git a/cmd/grv/git_summary_view.go b/cmd/grv/git_summary_view.go
index 757a126..67a17c6 100644
--- a/cmd/grv/git_summary_view.go
+++ b/cmd/grv/git_summary_view.go
@@ -19,6 +19,10 @@ type summaryViewLine interface {
isSelectable() bool
}
+type selectableLine interface {
+ onSelected() error
+}
+
type singleValueLine struct {
value string
themeComponentID ThemeComponentID
@@ -47,7 +51,8 @@ func newHeaderRenderer(header string) summaryViewLine {
}
type branchLine struct {
- head Ref
+ summaryView *SummaryView
+ head Ref
}
func (branchLine *branchLine) branchName() string {
@@ -84,11 +89,29 @@ func (branchLine *branchLine) isSelectable() bool {
return true
}
+func (branchLine *branchLine) onSelected() (err error) {
+ summaryView := branchLine.summaryView
+
+ if err = summaryView.commitView.OnRefSelect(branchLine.head); err != nil {
+ return
+ }
+
+ summaryView.child.SetChild(summaryView.commitView)
+ summaryView.channels.UpdateDisplay()
+
+ return
+}
+
type statusFileLine struct {
+ summaryView *SummaryView
statusType StatusType
statusEntry *StatusEntry
}
+func (statusFileLine *statusFileLine) filePath() string {
+ return statusFileLine.statusEntry.NewFilePath()
+}
+
func (statusFileLine *statusFileLine) lineParts() (prefix, files string) {
statusType := statusFileLine.statusType
statusEntry := statusFileLine.statusEntry
@@ -144,6 +167,16 @@ func (statusFileLine *statusFileLine) isSelectable() bool {
return true
}
+func (statusFileLine *statusFileLine) onSelected() (err error) {
+ summaryView := statusFileLine.summaryView
+
+ summaryView.diffView.OnFileSelected(statusFileLine.statusType, statusFileLine.filePath())
+ summaryView.child.SetChild(summaryView.diffView)
+ summaryView.channels.UpdateDisplay()
+
+ return
+}
+
// SummaryView displays a summary view of repo state
type SummaryView struct {
*SelectableRowView
@@ -156,11 +189,14 @@ type SummaryView struct {
variables GRVVariableSetter
handlers map[ActionType]summaryViewHandler
lines []summaryViewLine
+ child ChildViewContainer
+ commitView *CommitView
+ diffView *DiffView
lock sync.Mutex
}
// NewGitSummaryView creates a new summary view instance
-func NewGitSummaryView(repoData RepoData, repoController RepoController, channels Channels, config Config, variables GRVVariableSetter) *SummaryView {
+func NewGitSummaryView(repoData RepoData, repoController RepoController, channels Channels, config Config, variables GRVVariableSetter, child ChildViewContainer) *SummaryView {
summaryView := &SummaryView{
repoData: repoData,
repoController: repoController,
@@ -168,6 +204,9 @@ func NewGitSummaryView(repoData RepoData, repoController RepoController, channel
config: config,
activeViewPos: NewViewPosition(),
variables: variables,
+ child: child,
+ commitView: NewCommitView(repoData, repoController, channels, config, variables),
+ diffView: NewDiffView(repoData, channels, config, variables),
handlers: map[ActionType]summaryViewHandler{},
}
@@ -181,10 +220,22 @@ func (summaryView *SummaryView) Initialise() (err error) {
summaryView.lock.Lock()
defer summaryView.lock.Unlock()
+ if err = summaryView.commitView.Initialise(); err != nil {
+ return
+ }
+
+ if err = summaryView.diffView.Initialise(); err != nil {
+ return
+ }
+
+ summaryView.commitView.SetShowBorder(false)
+ summaryView.diffView.SetShowBorder(false)
+
summaryView.repoData.RegisterRefStateListener(summaryView)
summaryView.repoData.RegisterStatusListener(summaryView)
summaryView.generateRows()
- return summaryView.selectNearestSelectableRow()
+
+ return
}
// Render generates and writes the summary view to the provided window
@@ -260,6 +311,15 @@ func (summaryView *SummaryView) viewDimension() ViewDimension {
func (summaryView *SummaryView) onRowSelected(rowIndex uint) (err error) {
summaryView.SelectableRowView.setVariables()
+
+ if rowIndex >= summaryView.rows() {
+ return
+ }
+
+ if line, isSelectable := summaryView.lines[rowIndex].(selectableLine); isSelectable {
+ err = line.onSelected()
+ }
+
return
}
@@ -275,6 +335,10 @@ func (summaryView *SummaryView) generateRows() {
lines := summaryView.generateBranchRows()
lines = append(lines, summaryView.generateModifiedFiles()...)
summaryView.lines = lines
+
+ summaryView.selectNearestSelectableRow()
+ summaryView.onRowSelected(summaryView.viewPos().ActiveRowIndex())
+
summaryView.channels.UpdateDisplay()
}
@@ -283,7 +347,10 @@ func (summaryView *SummaryView) generateBranchRows() (rows []summaryViewLine) {
rows = append(rows,
emptyLine,
newHeaderRenderer("Branch"),
- &branchLine{head: ref},
+ &branchLine{
+ summaryView: summaryView,
+ head: ref,
+ },
emptyLine,
)
@@ -313,6 +380,7 @@ func (summaryView *SummaryView) generateModifiedFiles() (rows []summaryViewLine)
for _, statusEntry := range statusEntries {
rows = append(rows, &statusFileLine{
+ summaryView: summaryView,
statusType: statusType,
statusEntry: statusEntry,
})
diff --git a/cmd/grv/summary_view.go b/cmd/grv/summary_view.go
index ef1c0f8..5af18f9 100644
--- a/cmd/grv/summary_view.go
+++ b/cmd/grv/summary_view.go
@@ -7,13 +7,14 @@ const (
// NewSummaryView creates a new instance
func NewSummaryView(repoData RepoData, repoController RepoController, channels Channels, config Config, variables GRVVariableSetter) *ContainerView {
- gitSummaryView := NewGitSummaryView(repoData, repoController, channels, config, variables)
+ childViewContainer := NewWindowViewContainer(nil)
+ gitSummaryView := NewGitSummaryView(repoData, repoController, channels, config, variables, childViewContainer)
summaryView := NewContainerView(channels, config)
summaryView.SetTitle(SummaryViewTitle)
summaryView.SetOrientation(CoDynamic)
summaryView.SetViewID(ViewSummary)
- summaryView.AddChildViews(gitSummaryView)
+ summaryView.AddChildViews(gitSummaryView, childViewContainer)
return summaryView
}