From 142e07ea3337651b669c38f24d610ec3fefbd46d Mon Sep 17 00:00:00 2001 From: ibrahim dursun Date: Fri, 7 Mar 2025 22:33:52 +0000 Subject: [PATCH] fix(revisions): render rows in sections This is to prevent highlight style from bleeding into before and after sections of each row --- internal/ui/graph/default_row_renderer.go | 33 +++++++++++-------- internal/ui/graph/graph_writer.go | 4 ++- internal/ui/graph/row_renderer.go | 9 +++++ .../ui/operations/evolog/evolog_operation.go | 2 +- internal/ui/revisions/revisions.go | 2 +- test/parse_test.go | 2 ++ 6 files changed, 35 insertions(+), 17 deletions(-) diff --git a/internal/ui/graph/default_row_renderer.go b/internal/ui/graph/default_row_renderer.go index c362b47..c7574bf 100644 --- a/internal/ui/graph/default_row_renderer.go +++ b/internal/ui/graph/default_row_renderer.go @@ -11,13 +11,18 @@ import ( ) type DefaultRowRenderer struct { + section RowSection Palette common.Palette HighlightBackground lipgloss.AdaptiveColor IsHighlighted bool Op operations.Operation } -func (s DefaultRowRenderer) RenderNormal(text string) string { +func (s *DefaultRowRenderer) BeginSection(section RowSection) { + s.section = section +} + +func (s *DefaultRowRenderer) RenderNormal(text string) string { normal := s.Palette.Normal if s.IsHighlighted { normal = normal.Background(s.HighlightBackground) @@ -25,29 +30,29 @@ func (s DefaultRowRenderer) RenderNormal(text string) string { return normal.Render(text) } -func (s DefaultRowRenderer) RenderConnection(connectionType jj.ConnectionType) string { +func (s *DefaultRowRenderer) RenderConnection(connectionType jj.ConnectionType) string { normal := s.Palette.Normal - if s.IsHighlighted { + if s.IsHighlighted && s.section == RowSectionRevision { normal = normal.Background(s.HighlightBackground) } return normal.Render(string(connectionType)) } -func (s DefaultRowRenderer) RenderBefore(*jj.Commit) string { +func (s *DefaultRowRenderer) RenderBefore(*jj.Commit) string { if s.IsHighlighted && s.Op.RenderPosition() == operations.RenderPositionBefore { return s.Op.Render() } return "" } -func (s DefaultRowRenderer) RenderAfter(*jj.Commit) string { +func (s *DefaultRowRenderer) RenderAfter(*jj.Commit) string { if s.IsHighlighted && s.Op.RenderPosition() == operations.RenderPositionAfter { return s.Op.Render() } return "" } -func (s DefaultRowRenderer) RenderGlyph(connection jj.ConnectionType, commit *jj.Commit) string { +func (s *DefaultRowRenderer) RenderGlyph(connection jj.ConnectionType, commit *jj.Commit) string { var style lipgloss.Style switch connection { case jj.GLYPH_IMMUTABLE: @@ -67,11 +72,11 @@ func (s DefaultRowRenderer) RenderGlyph(connection jj.ConnectionType, commit *jj return style.Render(string(connection) + opMarker) } -func (s DefaultRowRenderer) RenderTermination(connection jj.ConnectionType) string { +func (s *DefaultRowRenderer) RenderTermination(connection jj.ConnectionType) string { return s.Palette.Elided.Render(string(connection)) } -func (s DefaultRowRenderer) RenderChangeId(commit *jj.Commit) string { +func (s *DefaultRowRenderer) RenderChangeId(commit *jj.Commit) string { normalStyle := s.Palette.Normal changeIdStyle := s.Palette.ChangeId restStyle := s.Palette.Rest @@ -89,7 +94,7 @@ func (s DefaultRowRenderer) RenderChangeId(commit *jj.Commit) string { return changeId } -func (s DefaultRowRenderer) RenderCommitId(commit *jj.Commit) string { +func (s *DefaultRowRenderer) RenderCommitId(commit *jj.Commit) string { if commit.IsRoot() { return "" } @@ -102,7 +107,7 @@ func (s DefaultRowRenderer) RenderCommitId(commit *jj.Commit) string { return commitIdStyle.Render("", commit.CommitIdShort) + restStyle.Render(commit.CommitId[len(commit.ChangeIdShort):]) } -func (s DefaultRowRenderer) RenderAuthor(commit *jj.Commit) string { +func (s *DefaultRowRenderer) RenderAuthor(commit *jj.Commit) string { placeholderStyle := s.Palette.EmptyPlaceholder authorStyle := s.Palette.Author if s.IsHighlighted { @@ -115,7 +120,7 @@ func (s DefaultRowRenderer) RenderAuthor(commit *jj.Commit) string { return authorStyle.Render("", commit.Author) } -func (s DefaultRowRenderer) RenderDate(commit *jj.Commit) string { +func (s *DefaultRowRenderer) RenderDate(commit *jj.Commit) string { if commit.IsRoot() { return "" } @@ -126,7 +131,7 @@ func (s DefaultRowRenderer) RenderDate(commit *jj.Commit) string { return timestamp.Render("", commit.Timestamp) } -func (s DefaultRowRenderer) RenderBookmarks(commit *jj.Commit) string { +func (s *DefaultRowRenderer) RenderBookmarks(commit *jj.Commit) string { bookmarksStyle := s.Palette.Bookmarks if s.IsHighlighted { bookmarksStyle = bookmarksStyle.Background(s.HighlightBackground) @@ -145,7 +150,7 @@ func (s DefaultRowRenderer) RenderBookmarks(commit *jj.Commit) string { return w.String() } -func (s DefaultRowRenderer) RenderMarkers(commit *jj.Commit) string { +func (s *DefaultRowRenderer) RenderMarkers(commit *jj.Commit) string { conflictStyle := s.Palette.Conflict if s.IsHighlighted { conflictStyle = conflictStyle.Background(s.HighlightBackground) @@ -156,7 +161,7 @@ func (s DefaultRowRenderer) RenderMarkers(commit *jj.Commit) string { return "" } -func (s DefaultRowRenderer) RenderDescription(commit *jj.Commit) string { +func (s *DefaultRowRenderer) RenderDescription(commit *jj.Commit) string { emptyPlaceholderStyle := s.Palette.EmptyPlaceholder placeholderStyle := s.Palette.Placeholder normalStyle := s.Palette.Normal diff --git a/internal/ui/graph/graph_writer.go b/internal/ui/graph/graph_writer.go index 694f2ba..bcd9be7 100644 --- a/internal/ui/graph/graph_writer.go +++ b/internal/ui/graph/graph_writer.go @@ -81,6 +81,7 @@ func (w *GraphWriter) RenderRow(row jj.GraphRow, renderer RowRenderer) { w.row = row w.renderer = renderer w.connections = extendConnections(w.connections) + renderer.BeginSection(RowSectionBefore) // will render by extending the previous connections written, _ := w.Write([]byte(renderer.RenderBefore(row.Commit))) if written > 0 { @@ -90,6 +91,7 @@ func (w *GraphWriter) RenderRow(row jj.GraphRow, renderer RowRenderer) { w.connections = row.Connections[0] lw := strings.Builder{} prefix := len(w.connections)*2 + 1 + renderer.BeginSection(RowSectionRevision) fmt.Fprint(&lw, renderer.RenderChangeId(row.Commit)) fmt.Fprint(&lw, renderer.RenderAuthor(row.Commit)) fmt.Fprint(&lw, renderer.RenderDate(row.Commit)) @@ -109,7 +111,6 @@ func (w *GraphWriter) RenderRow(row jj.GraphRow, renderer RowRenderer) { if row.Commit.IsRoot() { return } - lastLineConnection := extendConnections(row.Connections[0]) if len(row.Connections) > 1 && !slices.Contains(row.Connections[1], jj.TERMINATION) { w.connectionPos = 1 @@ -136,6 +137,7 @@ func (w *GraphWriter) RenderRow(row jj.GraphRow, renderer RowRenderer) { } } + renderer.BeginSection(RowSectionAfter) w.connections = extendConnections(lastLineConnection) written, _ = w.Write([]byte(renderer.RenderAfter(row.Commit))) if written > 0 { diff --git a/internal/ui/graph/row_renderer.go b/internal/ui/graph/row_renderer.go index f09103f..5f9dc87 100644 --- a/internal/ui/graph/row_renderer.go +++ b/internal/ui/graph/row_renderer.go @@ -2,7 +2,16 @@ package graph import "github.com/idursun/jjui/internal/jj" +type RowSection int + +const ( + RowSectionRevision RowSection = iota + RowSectionBefore + RowSectionAfter +) + type RowRenderer interface { + BeginSection(section RowSection) RenderBefore(commit *jj.Commit) string RenderAfter(commit *jj.Commit) string RenderGlyph(connection jj.ConnectionType, commit *jj.Commit) string diff --git a/internal/ui/operations/evolog/evolog_operation.go b/internal/ui/operations/evolog/evolog_operation.go index b18faff..bde7989 100644 --- a/internal/ui/operations/evolog/evolog_operation.go +++ b/internal/ui/operations/evolog/evolog_operation.go @@ -87,7 +87,7 @@ func (o Operation) Render() string { selectedLineStart := -1 selectedLineEnd := -1 for i, row := range o.rows { - nodeRenderer := graph.DefaultRowRenderer{ + nodeRenderer := &graph.DefaultRowRenderer{ Palette: common.DefaultPalette, Op: &operations.Noop{}, IsHighlighted: i == o.cursor, diff --git a/internal/ui/revisions/revisions.go b/internal/ui/revisions/revisions.go index 196430b..eb5b303 100644 --- a/internal/ui/revisions/revisions.go +++ b/internal/ui/revisions/revisions.go @@ -251,7 +251,7 @@ func (m *Model) View() string { Dark: config.Current.UI.HighlightDark, } for i, row := range m.rows { - nodeRenderer := graph.DefaultRowRenderer{ + nodeRenderer := &graph.DefaultRowRenderer{ Palette: common.DefaultPalette, HighlightBackground: highlightColor, Op: m.op, diff --git a/test/parse_test.go b/test/parse_test.go index 13a88cc..ee8a41c 100644 --- a/test/parse_test.go +++ b/test/parse_test.go @@ -74,6 +74,8 @@ type TestRenderer struct { highlighted bool } +func (t TestRenderer) BeginSection(graph.RowSection) {} + func (t TestRenderer) RenderNormal(text string) string { return text }