mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-05-13 22:17:05 +02:00
Make columnPositions include entries for removed columns
We will pass these positions back to clients for rendering non-model items, and it's important that clients can consistently rely on them no matter which columns were removed.
This commit is contained in:
parent
7953f7fa86
commit
4ee4f6f34b
@ -40,7 +40,7 @@ func WithPadding(str string, padding int, alignment Alignment) string {
|
|||||||
// returns a list of strings that should be joined with "\n", and an array of
|
// returns a list of strings that should be joined with "\n", and an array of
|
||||||
// the column positions
|
// the column positions
|
||||||
func RenderDisplayStrings(displayStringsArr [][]string, columnAlignments []Alignment) ([]string, []int) {
|
func RenderDisplayStrings(displayStringsArr [][]string, columnAlignments []Alignment) ([]string, []int) {
|
||||||
displayStringsArr, columnAlignments = excludeBlankColumns(displayStringsArr, columnAlignments)
|
displayStringsArr, columnAlignments, removedColumns := excludeBlankColumns(displayStringsArr, columnAlignments)
|
||||||
padWidths := getPadWidths(displayStringsArr)
|
padWidths := getPadWidths(displayStringsArr)
|
||||||
columnConfigs := make([]ColumnConfig, len(padWidths))
|
columnConfigs := make([]ColumnConfig, len(padWidths))
|
||||||
columnPositions := make([]int, len(padWidths)+1)
|
columnPositions := make([]int, len(padWidths)+1)
|
||||||
@ -58,13 +58,21 @@ func RenderDisplayStrings(displayStringsArr [][]string, columnAlignments []Align
|
|||||||
}
|
}
|
||||||
columnPositions[i+1] = columnPositions[i] + padWidth + 1
|
columnPositions[i+1] = columnPositions[i] + padWidth + 1
|
||||||
}
|
}
|
||||||
|
// Add the removed columns back into columnPositions (a removed column gets
|
||||||
|
// the same position as the following column); clients should be able to rely
|
||||||
|
// on them all to be there
|
||||||
|
for _, removedColumn := range removedColumns {
|
||||||
|
if removedColumn < len(columnPositions) {
|
||||||
|
columnPositions = slices.Insert(columnPositions, removedColumn, columnPositions[removedColumn])
|
||||||
|
}
|
||||||
|
}
|
||||||
return getPaddedDisplayStrings(displayStringsArr, columnConfigs), columnPositions
|
return getPaddedDisplayStrings(displayStringsArr, columnConfigs), columnPositions
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: this mutates the input slice for the sake of performance
|
// NOTE: this mutates the input slice for the sake of performance
|
||||||
func excludeBlankColumns(displayStringsArr [][]string, columnAlignments []Alignment) ([][]string, []Alignment) {
|
func excludeBlankColumns(displayStringsArr [][]string, columnAlignments []Alignment) ([][]string, []Alignment, []int) {
|
||||||
if len(displayStringsArr) == 0 {
|
if len(displayStringsArr) == 0 {
|
||||||
return displayStringsArr, columnAlignments
|
return displayStringsArr, columnAlignments, []int{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if all rows share a blank column, we want to remove that column
|
// if all rows share a blank column, we want to remove that column
|
||||||
@ -80,7 +88,7 @@ outer:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(toRemove) == 0 {
|
if len(toRemove) == 0 {
|
||||||
return displayStringsArr, columnAlignments
|
return displayStringsArr, columnAlignments, []int{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove the columns
|
// remove the columns
|
||||||
@ -97,7 +105,7 @@ outer:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return displayStringsArr, columnAlignments
|
return displayStringsArr, columnAlignments, toRemove
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPaddedDisplayStrings(stringArrays [][]string, columnConfigs []ColumnConfig) []string {
|
func getPaddedDisplayStrings(stringArrays [][]string, columnConfigs []ColumnConfig) []string {
|
||||||
|
@ -169,7 +169,7 @@ func TestRenderDisplayStrings(t *testing.T) {
|
|||||||
input: [][]string{{""}, {""}},
|
input: [][]string{{""}, {""}},
|
||||||
columnAlignments: nil,
|
columnAlignments: nil,
|
||||||
expectedOutput: "",
|
expectedOutput: "",
|
||||||
expectedColumnPositions: []int{0},
|
expectedColumnPositions: []int{0, 0},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: [][]string{{"a"}, {""}},
|
input: [][]string{{"a"}, {""}},
|
||||||
@ -193,43 +193,49 @@ func TestRenderDisplayStrings(t *testing.T) {
|
|||||||
input: [][]string{{"a", "", "c"}, {"d", "", "f"}},
|
input: [][]string{{"a", "", "c"}, {"d", "", "f"}},
|
||||||
columnAlignments: nil,
|
columnAlignments: nil,
|
||||||
expectedOutput: "a c\nd f",
|
expectedOutput: "a c\nd f",
|
||||||
expectedColumnPositions: []int{0, 2},
|
expectedColumnPositions: []int{0, 2, 2},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: [][]string{{"a", "", "c", ""}, {"d", "", "f", ""}},
|
input: [][]string{{"a", "", "c", ""}, {"d", "", "f", ""}},
|
||||||
columnAlignments: nil,
|
columnAlignments: nil,
|
||||||
expectedOutput: "a c\nd f",
|
expectedOutput: "a c\nd f",
|
||||||
expectedColumnPositions: []int{0, 2},
|
expectedColumnPositions: []int{0, 2, 2},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
|
input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
|
||||||
columnAlignments: nil,
|
columnAlignments: nil,
|
||||||
expectedOutput: "abc d\ne f",
|
expectedOutput: "abc d\ne f",
|
||||||
expectedColumnPositions: []int{0, 4},
|
expectedColumnPositions: []int{0, 4, 4},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: [][]string{{"", "abc", "", "", "d", "e"}, {"", "f", "", "", "g", "h"}},
|
||||||
|
columnAlignments: nil,
|
||||||
|
expectedOutput: "abc d e\nf g h",
|
||||||
|
expectedColumnPositions: []int{0, 0, 4, 4, 4, 6},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
|
input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
|
||||||
columnAlignments: []Alignment{AlignLeft, AlignLeft}, // same as nil (default)
|
columnAlignments: []Alignment{AlignLeft, AlignLeft}, // same as nil (default)
|
||||||
expectedOutput: "abc d\ne f",
|
expectedOutput: "abc d\ne f",
|
||||||
expectedColumnPositions: []int{0, 4},
|
expectedColumnPositions: []int{0, 4, 4},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
|
input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
|
||||||
columnAlignments: []Alignment{AlignRight, AlignLeft},
|
columnAlignments: []Alignment{AlignRight, AlignLeft},
|
||||||
expectedOutput: "abc d\n e f",
|
expectedOutput: "abc d\n e f",
|
||||||
expectedColumnPositions: []int{0, 4},
|
expectedColumnPositions: []int{0, 4, 4},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: [][]string{{"a", "", "bcd", "efg", "h"}, {"i", "", "j", "k", "l"}},
|
input: [][]string{{"a", "", "bcd", "efg", "h"}, {"i", "", "j", "k", "l"}},
|
||||||
columnAlignments: []Alignment{AlignLeft, AlignLeft, AlignRight, AlignLeft},
|
columnAlignments: []Alignment{AlignLeft, AlignLeft, AlignRight, AlignLeft},
|
||||||
expectedOutput: "a bcd efg h\ni j k l",
|
expectedOutput: "a bcd efg h\ni j k l",
|
||||||
expectedColumnPositions: []int{0, 2, 6, 10},
|
expectedColumnPositions: []int{0, 2, 2, 6, 10},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
|
input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
|
||||||
columnAlignments: []Alignment{AlignRight}, // gracefully defaults unspecified columns to left-align
|
columnAlignments: []Alignment{AlignRight}, // gracefully defaults unspecified columns to left-align
|
||||||
expectedOutput: "abc d\n e f",
|
expectedOutput: "abc d\n e f",
|
||||||
expectedColumnPositions: []int{0, 4},
|
expectedColumnPositions: []int{0, 4, 4},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user