feat(ui): selector click mouse support

Ayman Bagabas created

Change summary

ui/components/selector/selector.go | 14 ++++++++++++++
ui/pages/repo/filesitem.go         | 13 ++++++++-----
ui/pages/repo/logitem.go           | 17 ++++++++++-------
ui/pages/repo/refsitem.go          |  7 ++++++-
ui/pages/selection/item.go         |  6 +++++-
ui/ui.go                           |  2 ++
6 files changed, 45 insertions(+), 14 deletions(-)

Detailed changes

ui/components/selector/selector.go 🔗

@@ -143,6 +143,20 @@ func (s *Selector) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 			s.Model.CursorUp()
 		case tea.MouseWheelDown:
 			s.Model.CursorDown()
+		case tea.MouseLeft:
+			curIdx := s.Model.Index()
+			for i, item := range s.Model.Items() {
+				item, _ := item.(IdentifiableItem)
+				// Check each item to see if it's in bounds.
+				if item != nil && s.common.Zone.Get(item.ID()).InBounds(msg) {
+					if i == curIdx {
+						cmds = append(cmds, s.selectCmd)
+					} else {
+						s.Model.Select(i)
+					}
+					break
+				}
+			}
 		}
 	case tea.KeyMsg:
 		filterState := s.Model.FilterState()

ui/pages/repo/filesitem.go 🔗

@@ -146,10 +146,13 @@ func (d FileItemDelegate) Render(w io.Writer, m list.Model, index int, listItem
 		s.Selector.GetHorizontalFrameSize() -
 		s.Selector.GetWidth())
 	fmt.Fprint(w,
-		truncate.Render(fmt.Sprintf("%s%s%s",
-			modeStr,
-			size,
-			name,
-		)),
+		d.common.Zone.Mark(
+			i.ID(),
+			truncate.Render(fmt.Sprintf("%s%s%s",
+				modeStr,
+				size,
+				name,
+			)),
+		),
 	)
 }

ui/pages/repo/logitem.go 🔗

@@ -137,13 +137,16 @@ func (d LogItemDelegate) Render(w io.Writer, m list.Model, index int, listItem l
 	who += styles.Desc.Render("on ") + styles.Keyword.Render(date)
 	who = common.TruncateString(who, m.Width()-horizontalFrameSize)
 	fmt.Fprint(w,
-		styles.Base.Render(
-			lipgloss.JoinVertical(lipgloss.Top,
-				truncate.String(fmt.Sprintf("%s%s",
-					title,
-					hash,
-				), uint(m.Width()-horizontalFrameSize)),
-				who,
+		d.common.Zone.Mark(
+			i.ID(),
+			styles.Base.Render(
+				lipgloss.JoinVertical(lipgloss.Top,
+					truncate.String(fmt.Sprintf("%s%s",
+						title,
+						hash,
+					), uint(m.Width()-horizontalFrameSize)),
+					who,
+				),
 			),
 		),
 	)

ui/pages/repo/refsitem.go 🔗

@@ -121,5 +121,10 @@ func (d RefItemDelegate) Render(w io.Writer, m list.Model, index int, listItem l
 		s.Normal.Item.GetMarginLeft()
 	ref = common.TruncateString(ref, refMaxWidth)
 	ref = st.Render(ref)
-	fmt.Fprint(w, selector, ref)
+	fmt.Fprint(w,
+		d.common.Zone.Mark(
+			i.ID(),
+			fmt.Sprint(selector, ref),
+		),
+	)
 }

ui/pages/selection/item.go 🔗

@@ -141,5 +141,9 @@ func (d ItemDelegate) Render(w io.Writer, m list.Model, index int, listItem list
 		cmd = styles.Command.Render("Copied!")
 	}
 	s.WriteString(cmd)
-	fmt.Fprint(w, styles.Base.Render(s.String()))
+	fmt.Fprint(w,
+		d.common.Zone.Mark(i.ID(),
+			styles.Base.Render(s.String()),
+		),
+	)
 }

ui/ui.go 🔗

@@ -186,6 +186,8 @@ func (ui *UI) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 			case key.Matches(msg, ui.common.KeyMap.Help):
 				cmds = append(cmds, footer.ToggleFooterCmd)
 			case key.Matches(msg, ui.common.KeyMap.Quit):
+				// Stop bubblezone background workers.
+				ui.common.Zone.Close()
 				return ui, tea.Quit
 			case ui.activePage == repoPage && key.Matches(msg, ui.common.KeyMap.Back):
 				ui.activePage = selectionPage