add keybinds for selection: all, none, invert
This commit is contained in:
parent
5942eee85d
commit
00b5808b1a
|
@ -178,6 +178,9 @@ func newFilesModel(fs files.Files, width, height int, readonly, preselected bool
|
||||||
type keyMap struct {
|
type keyMap struct {
|
||||||
mark key.Binding
|
mark key.Binding
|
||||||
doit key.Binding
|
doit key.Binding
|
||||||
|
todo key.Binding
|
||||||
|
nada key.Binding
|
||||||
|
invr key.Binding
|
||||||
quit key.Binding
|
quit key.Binding
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,15 +188,27 @@ func defaultKeyMap() keyMap {
|
||||||
return keyMap{
|
return keyMap{
|
||||||
mark: key.NewBinding(
|
mark: key.NewBinding(
|
||||||
key.WithKeys(space),
|
key.WithKeys(space),
|
||||||
key.WithHelp("space", "toggle selected"),
|
key.WithHelp("space", "toggle"),
|
||||||
),
|
),
|
||||||
doit: key.NewBinding(
|
doit: key.NewBinding(
|
||||||
key.WithKeys("enter", "y"),
|
key.WithKeys("enter", "y"),
|
||||||
key.WithHelp("enter/y", "confirm"),
|
key.WithHelp("enter/y", "confirm"),
|
||||||
),
|
),
|
||||||
|
todo: key.NewBinding(
|
||||||
|
key.WithKeys("a", "ctrl+a"),
|
||||||
|
key.WithHelp("a", "select all"),
|
||||||
|
),
|
||||||
|
nada: key.NewBinding(
|
||||||
|
key.WithKeys("n", "ctrl+n"),
|
||||||
|
key.WithHelp("n", "select none"),
|
||||||
|
),
|
||||||
|
invr: key.NewBinding(
|
||||||
|
key.WithKeys("i", "ctrl+i"),
|
||||||
|
key.WithHelp("i", "invert selection"),
|
||||||
|
),
|
||||||
quit: key.NewBinding(
|
quit: key.NewBinding(
|
||||||
key.WithKeys("q", "ctrl+c"),
|
key.WithKeys("q", "ctrl+c"),
|
||||||
key.WithHelp("q/^c", "quit"),
|
key.WithHelp("q", "quit"),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -212,14 +227,19 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||||
case tea.KeyMsg:
|
case tea.KeyMsg:
|
||||||
switch {
|
switch {
|
||||||
case key.Matches(msg, m.keys.mark):
|
case key.Matches(msg, m.keys.mark):
|
||||||
m.select_item(m.table.SelectedRow(), m.table.Cursor())
|
m.toggle_item(m.table.Cursor())
|
||||||
case key.Matches(msg, m.keys.doit):
|
case key.Matches(msg, m.keys.doit):
|
||||||
if !m.readonly {
|
if !m.readonly {
|
||||||
return m, tea.Quit
|
return m, tea.Quit
|
||||||
}
|
}
|
||||||
|
case key.Matches(msg, m.keys.nada):
|
||||||
|
m.unselect_all()
|
||||||
|
case key.Matches(msg, m.keys.todo):
|
||||||
|
m.select_all()
|
||||||
|
case key.Matches(msg, m.keys.invr):
|
||||||
|
m.invert_selection()
|
||||||
case key.Matches(msg, m.keys.quit):
|
case key.Matches(msg, m.keys.quit):
|
||||||
m.selected = []int{}
|
return m.quit()
|
||||||
return m, tea.Quit
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,8 +288,30 @@ func (m model) footer() string {
|
||||||
return regulartext.Render(m.showHelp())
|
return regulartext.Render(m.showHelp())
|
||||||
}
|
}
|
||||||
|
|
||||||
// select_item selects an item, and returns its current selected state
|
func (m model) quit() (model, tea.Cmd) {
|
||||||
func (m *model) select_item(row table.Row, index int) (selected bool) {
|
m.unselect_all()
|
||||||
|
m.table.SetStyles(makeUnselectedStyle())
|
||||||
|
return m, tea.Quit
|
||||||
|
}
|
||||||
|
|
||||||
|
// update_row updates row of `index` with `row`
|
||||||
|
func (m *model) update_row(index int, selected bool /* , row table.Row */) {
|
||||||
|
rows := m.table.Rows()
|
||||||
|
row := rows[index]
|
||||||
|
rows[index] = table.Row{
|
||||||
|
row[0],
|
||||||
|
row[1],
|
||||||
|
row[2],
|
||||||
|
row[3],
|
||||||
|
getCheck(selected),
|
||||||
|
}
|
||||||
|
|
||||||
|
m.table.SetRows(rows)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// toggle_item toggles an item's selected state, and returns the state
|
||||||
|
func (m *model) toggle_item(index int) (selected bool) {
|
||||||
if m.readonly {
|
if m.readonly {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -286,20 +328,39 @@ func (m *model) select_item(row table.Row, index int) (selected bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the rows with the state
|
// update the rows with the state
|
||||||
rows := m.table.Rows()
|
m.update_row(index, selected)
|
||||||
rows[index] = table.Row{
|
return
|
||||||
row[0],
|
|
||||||
row[1],
|
|
||||||
row[2],
|
|
||||||
row[3],
|
|
||||||
getCheck(selected),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m.table.SetRows(rows)
|
func (m *model) select_all() {
|
||||||
|
if m.readonly {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m.selected = []int{}
|
||||||
|
for i := range m.table.Rows() {
|
||||||
|
m.selected = append(m.selected, i)
|
||||||
|
m.update_row(i, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *model) unselect_all() {
|
||||||
|
if m.readonly {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
m.selected = []int{}
|
||||||
|
for i := range m.table.Rows() {
|
||||||
|
m.update_row(i, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *model) invert_selection() {
|
||||||
|
for i := range m.table.Rows() {
|
||||||
|
m.toggle_item(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func InfoTable(is trash.Infos, width, height int, readonly, preselected bool) ([]int, error) {
|
func InfoTable(is trash.Infos, width, height int, readonly, preselected bool) ([]int, error) {
|
||||||
if endmodel, err := tea.NewProgram(newInfosModel(is, width, height, readonly, preselected)).Run(); err != nil {
|
if endmodel, err := tea.NewProgram(newInfosModel(is, width, height, readonly, preselected)).Run(); err != nil {
|
||||||
return []int{}, err
|
return []int{}, err
|
||||||
|
@ -344,13 +405,7 @@ func createTable(columns []table.Column, rows []table.Row, height int, readonlyo
|
||||||
)
|
)
|
||||||
t.KeyMap = fixTableKeymap()
|
t.KeyMap = fixTableKeymap()
|
||||||
if readonlyonepage {
|
if readonlyonepage {
|
||||||
style := makeStyle()
|
t.SetStyles(makeUnselectedStyle())
|
||||||
style.Selected = style.Selected.
|
|
||||||
Foreground(lipgloss.NoColor{}).
|
|
||||||
Background(lipgloss.NoColor{}).
|
|
||||||
Bold(false)
|
|
||||||
|
|
||||||
t.SetStyles(style)
|
|
||||||
} else {
|
} else {
|
||||||
t.SetStyles(makeStyle())
|
t.SetStyles(makeStyle())
|
||||||
}
|
}
|
||||||
|
@ -384,3 +439,12 @@ func makeStyle() table.Styles {
|
||||||
|
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func makeUnselectedStyle() table.Styles {
|
||||||
|
style := makeStyle()
|
||||||
|
style.Selected = style.Selected.
|
||||||
|
Foreground(lipgloss.NoColor{}).
|
||||||
|
Background(lipgloss.NoColor{}).
|
||||||
|
Bold(false)
|
||||||
|
return style
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue