diff options
author | Richard Burke <rich.g.burke@gmail.com> | 2018-09-28 21:45:05 +0100 |
---|---|---|
committer | Richard Burke <rich.g.burke@gmail.com> | 2018-09-28 21:45:05 +0100 |
commit | 35c9744c2b2c332b61f743a5f6d9c6f767d3c266 (patch) | |
tree | 23bd58c6d7e467d124dbead88eed3df5aacae344 | |
parent | 095b9285358dc8ddf3d97f041195759e84372b5f (diff) |
Selecting row in summary view triggers child view to display
-rw-r--r-- | cmd/grv/commit_view.go | 55 | ||||
-rw-r--r-- | cmd/grv/diff_view.go | 24 | ||||
-rw-r--r-- | cmd/grv/git_summary_view.go | 76 | ||||
-rw-r--r-- | cmd/grv/summary_view.go | 5 |
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 } |