b079c14d4539e1ffa2ea4576cf2f073c9b96eb5d

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
Ayman Bagabas <ayman.bagabas@gmail.com>
Date

Message

feat(ui): back using right mouse click and backspace key

Beware that most terminals block the right mouse click unless combined
with a modifier.

Fixes: https://github.com/charmbracelet/soft-serve/issues/138

Diff

This diff is truncated to protect this page.

  1diff --git a/ui/keymap/keymap.go b/ui/keymap/keymap.go
  2index fddfb11ca02ba92dd84e5286d88974ac236a098a..cf2cc2f74c166b0c628360b379c845613f79d3e9 100644
  3--- a/ui/keymap/keymap.go
  4+++ b/ui/keymap/keymap.go
  5@@ -183,6 +183,7 @@ func DefaultKeyMap() *KeyMap {
  6 		key.WithKeys(
  7 			"h",
  8 			"left",
  9+			"backspace",
 10 		),
 11 		key.WithHelp(
 12 			"←",
 13diff --git a/ui/pages/repo/files.go b/ui/pages/repo/files.go
 14index 065c491f76d3d036e050eb182230b933efb0b2d5..745016102a4c169f60381927f28f036b59167041 100644
 15--- a/ui/pages/repo/files.go
 16+++ b/ui/pages/repo/files.go
 17@@ -227,20 +227,21 @@ func (f *Files) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 18 				cmds = append(cmds, f.selectFileCmd)
 19 			}
 20 		}
 21+	case BackMsg:
 22+		cmds = append(cmds, f.deselectItemCmd)
 23 	case tea.KeyMsg:
 24 		switch f.activeView {
 25 		case filesViewFiles:
 26-			switch msg.String() {
 27-			case "l", "right":
 28+			switch {
 29+			case key.Matches(msg, f.common.KeyMap.SelectItem):
 30 				cmds = append(cmds, f.selector.SelectItem)
 31-			case "h", "left":
 32-				cmds = append(cmds, f.deselectItemCmd)
 33+			case key.Matches(msg, f.common.KeyMap.BackItem):
 34+				cmds = append(cmds, backCmd)
 35 			}
 36 		case filesViewContent:
 37-			keyStr := msg.String()
 38 			switch {
 39-			case keyStr == "h", keyStr == "left":
 40-				cmds = append(cmds, f.deselectItemCmd)
 41+			case key.Matches(msg, f.common.KeyMap.BackItem):
 42+				cmds = append(cmds, backCmd)
 43 			case key.Matches(msg, f.common.KeyMap.Copy):
 44 				f.common.Copy.Copy(f.currentContent.content)
 45 			case key.Matches(msg, lineNo):
 46diff --git a/ui/pages/repo/log.go b/ui/pages/repo/log.go
 47index cd624e4402b76ee5e66837485c6b3d65a4eec295..a1511a5ff37db765010d83757d5ac92808d4c164 100644
 48--- a/ui/pages/repo/log.go
 49+++ b/ui/pages/repo/log.go
 50@@ -211,10 +211,10 @@ func (l *Log) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 51 	case tea.KeyMsg, tea.MouseMsg:
 52 		switch l.activeView {
 53 		case logViewCommits:
 54-			switch key := msg.(type) {
 55+			switch kmsg := msg.(type) {
 56 			case tea.KeyMsg:
 57-				switch key.String() {
 58-				case "l", "right":
 59+				switch {
 60+				case key.Matches(kmsg, l.common.KeyMap.SelectItem):
 61 					cmds = append(cmds, l.selector.SelectItem)
 62 				}
 63 			}
 64@@ -233,15 +233,19 @@ func (l *Log) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 65 			}
 66 			cmds = append(cmds, cmd)
 67 		case logViewDiff:
 68-			switch key := msg.(type) {
 69+			switch kmsg := msg.(type) {
 70 			case tea.KeyMsg:
 71-				switch key.String() {
 72-				case "h", "left":
 73-					l.activeView = logViewCommits
 74-					l.selectedCommit = nil
 75+				switch {
 76+				case key.Matches(kmsg, l.common.KeyMap.BackItem):
 77+					cmds = append(cmds, backCmd)
 78 				}
 79 			}
 80 		}
 81+	case BackMsg:
 82+		if l.activeView == logViewDiff {
 83+			l.activeView = logViewCommits
 84+			l.selectedCommit = nil
 85+		}
 86 	case selector.ActiveMsg:
 87 		switch sel := msg.IdentifiableItem.(type) {
 88 		case LogItem:
 89diff --git a/ui/pages/repo/refs.go b/ui/pages/repo/refs.go
 90index b5b6c7fedf72af1251ad84c30bc0676bc98d85ae..308a26288372c3ecbcaa4b9b985e51075fb4136f 100644
 91--- a/ui/pages/repo/refs.go
 92+++ b/ui/pages/repo/refs.go
 93@@ -132,8 +132,8 @@ func (r *Refs) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 94 			)
 95 		}
 96 	case tea.KeyMsg:
 97-		switch msg.String() {
 98-		case "l", "right":
 99+		switch {
100+		case key.Matches(msg, r.common.KeyMap.SelectItem):
101 			cmds = append(cmds, r.selector.SelectItem)
102 		}
103 	}
104diff --git a/ui/pages/repo/repo.go b/ui/pages/repo/repo.go
105index 808ae9286cc35b71d96771a1074f32455d3e8ee3..5d0d4a58bed8b35b4a6c5b2f47aeb898fabfbd86 100644
106--- a/ui/pages/repo/repo.go
107+++ b/ui/pages/repo/repo.go
108@@ -45,11 +45,11 @@ func (t tab) String() string {
109 	}[t]
110 }
111 
112-// CopyUrlMsg is a message to copy the URL of the current repository.
113-type CopyUrlMsg struct{}
114+// CopyURLMsg is a message to copy the URL of the current repository.
115+type CopyURLMsg struct{}
116 
117-// ResetUrlMsg is a message to reset the URL string.
118-type ResetUrlMsg struct{}
119+// ResetURLMsg is a message to reset the URL string.
120+type ResetURLMsg struct{}
121 
122 // UpdateStatusBarMsg updates the status bar.
123 type UpdateStatusBarMsg struct{}
124@@ -60,6 +60,9 @@ type RepoMsg git.GitRepo
125 // RefMsg is a message that contains a git.Reference.
126 type RefMsg *ggit.Reference
127 
128+// BackMsg is a message to go back to the previous view.
129+type BackMsg struct{}
130+
131 // Repo is a view for a git repository.
132 type Repo struct {
133 	common       common.Common
134@@ -70,7 +73,7 @@ type Repo struct {
135 	statusbar    *statusbar.StatusBar
136 	panes        []common.Component
137 	ref          *ggit.Reference
138-	copyUrl      time.Time
139+	copyURL      time.Time
140 }
141 
142 // New returns a new Repo.
143@@ -198,20 +201,25 @@ func (r *Repo) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
144 			cmds = append(cmds, r.updateStatusBarCmd)
145 			switch msg := msg.(type) {
146 			case tea.MouseMsg:
147-				if msg.Type == tea.MouseLeft {
148+				switch msg.Type {
149+				case tea.MouseLeft:
150 					id := fmt.Sprintf("%s-url", r.selectedRepo.Repo())
151 					if r.common.Zone.Get(id).InBounds(msg) {
152 						cmds = append(cmds, r.copyUrlCmd())
153 					}
154+				case tea.MouseRight:
155+					if r.common.Zone.Get("repo-main").InBounds(msg) {
156+						cmds = append(cmds, backCmd)
157+					}
158 				}
159 			}
160 		}
161-	case CopyUrlMsg:
162+	case CopyURLMsg:
163 		r.common.Copy.Copy(
164 			git.RepoURL(r.cfg.Host, r.cfg.Port, r.selectedRepo.Repo()),
165 		)
166-	case ResetUrlMsg:
167-		r.copyUrl = time.Time{}
168+	case ResetURLMsg:
169+		r.copyURL = time.Time{}
170 	case ReadmeMsg:
171 	case FileItemsMsg:
172 		f, cmd := r.panes[filesTab].Update(msg)
173@@ -275,7 +283,10 @@ func (r *Repo) View() string {
174 		r.common.Styles.Tabs.GetVerticalFrameSize()
175 	mainStyle := repoBodyStyle.
176 		Height(r.common.Height - hm)
177-	main := r.panes[r.activeTab].View()
178+	main := r.common.Zone.Mark(
179+		"repo-main",
180+		r.panes[r.activeTab].View(),
181+	)
182 	view := lipgloss.JoinVertical(lipgloss.Top,
183 		r.headerView(),
184 		r.tabs.View(),
185@@ -306,7 +317,7 @@ func (r *Repo) headerView() string {
186 		Width(r.common.Width - lipgloss.Width(desc) - 1).
187 		Align(lipgloss.Right)
188 	url := git.RepoURL(cfg.Host, cfg.Port, r.selectedRepo.Repo())
189-	if !r.copyUrl.IsZero() && r.copyUrl.Add(time.Second).After(time.Now()) {
190+	if !r.copyURL.IsZero() && r.copyURL.Add(time.Second).After(time.Now()) {
191 		url = "copied!"
192 	}
193 	url = common.TruncateString(url, r.common.Width-lipgloss.Width(desc)-1)
194@@ -368,13 +379,13 @@ func (r *Repo) updateModels(msg tea.Msg) tea.Cmd {
195 }
196 
197 func (r *Repo) copyUrlCmd() tea.Cmd {
198-	r.copyUrl = time.Now()
199+	r.copyURL = time.Now()
200 	return tea.Batch(
201 		func() tea.Msg {
202-			return CopyUrlMsg{}
203+			return CopyURLMsg{}
204 		},
205 		tea.Tick(time.Second, func(time.Time) tea.Msg {
206-			return ResetUrlMsg{}
207+			return ResetURLMsg{}