1
0
Fork 0
forked from Mirrors/gomuks

Add keybindings to roster view

This commit is contained in:
FIGBERT 2023-03-06 16:40:11 -08:00
parent 167b4a497b
commit a5ac5ec86e
No known key found for this signature in database
GPG key ID: 67F1598D607A844B
4 changed files with 57 additions and 13 deletions

View file

@ -90,6 +90,7 @@ type Keybind struct {
type ParsedKeybindings struct { type ParsedKeybindings struct {
Main map[Keybind]string Main map[Keybind]string
Roster map[Keybind]string
Room map[Keybind]string Room map[Keybind]string
Modal map[Keybind]string Modal map[Keybind]string
Visual map[Keybind]string Visual map[Keybind]string
@ -97,6 +98,7 @@ type ParsedKeybindings struct {
type RawKeybindings struct { type RawKeybindings struct {
Main map[string]string `yaml:"main,omitempty"` Main map[string]string `yaml:"main,omitempty"`
Roster map[string]string `yaml:"roster,omitempty"`
Room map[string]string `yaml:"room,omitempty"` Room map[string]string `yaml:"room,omitempty"`
Modal map[string]string `yaml:"modal,omitempty"` Modal map[string]string `yaml:"modal,omitempty"`
Visual map[string]string `yaml:"visual,omitempty"` Visual map[string]string `yaml:"visual,omitempty"`
@ -277,6 +279,7 @@ func (config *Config) LoadKeybindings() {
_ = config.load("keybindings", config.Dir, "keybindings.yaml", &inputConfig) _ = config.load("keybindings", config.Dir, "keybindings.yaml", &inputConfig)
config.Keybindings.Main = parseKeybindings(inputConfig.Main) config.Keybindings.Main = parseKeybindings(inputConfig.Main)
config.Keybindings.Roster = parseKeybindings(inputConfig.Roster)
config.Keybindings.Room = parseKeybindings(inputConfig.Room) config.Keybindings.Room = parseKeybindings(inputConfig.Room)
config.Keybindings.Modal = parseKeybindings(inputConfig.Modal) config.Keybindings.Modal = parseKeybindings(inputConfig.Modal)
config.Keybindings.Visual = parseKeybindings(inputConfig.Visual) config.Keybindings.Visual = parseKeybindings(inputConfig.Visual)

View file

@ -15,6 +15,13 @@ main:
'Alt+a': next_active_room 'Alt+a': next_active_room
'Alt+l': show_bare 'Alt+l': show_bare
roster:
'j': next_room
'k': prev_room
'Down': next_room
'Up': prev_room
'Escape': clear
modal: modal:
'Tab': select_next 'Tab': select_next
'Down': select_next 'Down': select_next

View file

@ -172,6 +172,8 @@ func (view *MainView) OnKeyEvent(event mauview.KeyEvent) bool {
if view.modal != nil { if view.modal != nil {
return view.modal.OnKeyEvent(event) return view.modal.OnKeyEvent(event)
} else if view.config.Preferences.DisplayMode == config.DisplayModeModern {
return view.rosterView.OnKeyEvent(event)
} }
kb := config.Keybind{ kb := config.Keybind{

View file

@ -22,6 +22,7 @@ import (
"go.mau.fi/mauview" "go.mau.fi/mauview"
"go.mau.fi/tcell" "go.mau.fi/tcell"
"maunium.net/go/gomuks/config"
"maunium.net/go/gomuks/matrix/rooms" "maunium.net/go/gomuks/matrix/rooms"
"maunium.net/go/gomuks/ui/widget" "maunium.net/go/gomuks/ui/widget"
"maunium.net/go/mautrix/event" "maunium.net/go/mautrix/event"
@ -35,13 +36,6 @@ type RosterView struct {
height, width int height, width int
// The item main text color.
mainTextColor tcell.Color
// The text color for selected items.
selectedTextColor tcell.Color
// The background color for selected items.
selectedBackgroundColor tcell.Color
parent *MainView parent *MainView
} }
@ -116,7 +110,7 @@ func (rstr *RosterView) getMostRecentMessage(room *rooms.Room) (string, bool) {
func (rstr *RosterView) Draw(screen mauview.Screen) { func (rstr *RosterView) Draw(screen mauview.Screen) {
rstr.width, rstr.height = screen.Size() rstr.width, rstr.height = screen.Size()
titleStyle := tcell.StyleDefault.Foreground(rstr.mainTextColor).Bold(true) titleStyle := tcell.StyleDefault.Foreground(tcell.ColorDefault).Bold(true)
mainStyle := titleStyle.Bold(false) mainStyle := titleStyle.Bold(false)
now := time.Now() now := time.Now()
@ -145,12 +139,12 @@ func (rstr *RosterView) Draw(screen mauview.Screen) {
isSelected := room == rstr.selected isSelected := room == rstr.selected
style := tcell.StyleDefault. style := tcell.StyleDefault.
Foreground(rstr.mainTextColor). Foreground(tcell.ColorDefault).
Bold(room.HasNewMessages()) Bold(room.HasNewMessages())
if isSelected { if isSelected {
style = style. style = style.
Foreground(rstr.selectedTextColor). Foreground(tcell.ColorBlack).
Background(rstr.selectedBackgroundColor) Background(tcell.ColorWhite)
} }
timestamp := room.LastReceivedMessage timestamp := room.LastReceivedMessage
@ -167,11 +161,14 @@ func (rstr *RosterView) Draw(screen mauview.Screen) {
lastMessage, received := rstr.getMostRecentMessage(room) lastMessage, received := rstr.getMostRecentMessage(room)
msgStyle := style.Foreground(tcell.ColorGray).Italic(!received) msgStyle := style.Foreground(tcell.ColorGray).Italic(!received)
if isSelected {
msgStyle = msgStyle.Background(tcell.ColorWhite)
}
tmX := rstr.width - 3 - len(tm) tmX := rstr.width - 3 - len(tm)
widget.WriteLine(screen, mauview.AlignLeft, room.GetTitle(), 2, y, tmX, style) widget.WriteLinePadded(screen, mauview.AlignLeft, room.GetTitle(), 2, y, tmX, style)
widget.WriteLine(screen, mauview.AlignLeft, tm, tmX, y, 2+len(tm), style) widget.WriteLine(screen, mauview.AlignLeft, tm, tmX, y, 2+len(tm), style)
widget.WriteLine(screen, mauview.AlignLeft, lastMessage, 2, y+1, rstr.width-5, msgStyle) widget.WriteLinePadded(screen, mauview.AlignLeft, lastMessage, 2, y+1, rstr.width-5, msgStyle)
y += renderHeight y += renderHeight
if y >= rstr.height { if y >= rstr.height {
@ -179,3 +176,38 @@ func (rstr *RosterView) Draw(screen mauview.Screen) {
} }
} }
} }
func (rstr *RosterView) OnKeyEvent(event mauview.KeyEvent) bool {
kb := config.Keybind{
Key: event.Key(),
Ch: event.Rune(),
Mod: event.Modifiers(),
}
switch rstr.parent.config.Keybindings.Roster[kb] {
case "next_room":
if index := rstr.index(rstr.selected); index == -1 || index == len(rstr.rooms)-1 {
rstr.selected = rstr.First()
} else {
rstr.selected = rstr.rooms[index+1]
}
case "prev_room":
if index := rstr.index(rstr.selected); index < 1 {
rstr.selected = rstr.Last()
} else {
rstr.selected = rstr.rooms[index-1]
}
case "clear":
rstr.selected = nil
default:
return false
}
return true
}
func (rstr *RosterView) First() *rooms.Room {
return rstr.rooms[0]
}
func (rstr *RosterView) Last() *rooms.Room {
return rstr.rooms[len(rstr.rooms)-1]
}