Sort rooms in RosterView by most recent message

This commit is contained in:
FIGBERT 2023-02-26 16:08:37 -08:00
parent 1a18a7e89b
commit 32665a2e5a
No known key found for this signature in database
GPG key ID: 67F1598D607A844B
2 changed files with 50 additions and 5 deletions

View file

@ -328,6 +328,7 @@ func (view *MainView) RemoveRoom(room *rooms.Room) {
}
debug.Print("Removing", room.ID, room.GetTitle())
view.rosterView.Remove(room)
view.roomList.Remove(room)
t, r := view.roomList.Selected()
view.switchRoom(t, r, false)
@ -344,6 +345,7 @@ func (view *MainView) addRoom(room *rooms.Room) *RoomView {
}
debug.Print("Adding", room.ID, room.GetTitle())
view.roomList.Add(room)
view.rosterView.Add(room)
view.roomsLock.Lock()
roomView := view.addRoomPage(room)
if !view.roomList.HasSelected() {
@ -363,6 +365,7 @@ func (view *MainView) SetRooms(rooms *rooms.RoomCache) {
continue
}
view.roomList.Add(room)
view.rosterView.Add(room)
view.addRoomPage(room)
}
t, r := view.roomList.First()

View file

@ -31,6 +31,7 @@ type RosterView struct {
mauview.Component
selected *rooms.Room
rooms []*rooms.Room
height, width int
@ -47,11 +48,52 @@ type RosterView struct {
func NewRosterView(mainView *MainView) *RosterView {
rstr := &RosterView{
parent: mainView,
rooms: make([]*rooms.Room, 0),
}
return rstr
}
func (rstr *RosterView) Add(room *rooms.Room) {
if room.IsReplaced() {
return
}
insertAt := len(rstr.rooms)
for i := 0; i < len(rstr.rooms); i++ {
if rstr.rooms[i] == room {
return
} else if room.LastReceivedMessage.After(rstr.rooms[i].LastReceivedMessage) {
insertAt = i
break
}
}
rstr.rooms = append(rstr.rooms, nil)
copy(rstr.rooms[insertAt+1:], rstr.rooms[insertAt:len(rstr.rooms)-1])
rstr.rooms[insertAt] = room
}
func (rstr *RosterView) Remove(room *rooms.Room) {
index := rstr.index(room)
if index < 0 || index > len(rstr.rooms) {
return
}
last := len(rstr.rooms) - 1
if index < last {
copy(rstr.rooms[index:], rstr.rooms[index+1:])
}
rstr.rooms[last] = nil
rstr.rooms = rstr.rooms[:last]
}
func (rstr *RosterView) index(room *rooms.Room) int {
for index, entry := range rstr.rooms {
if entry == room {
return index
}
}
return -1
}
func (rstr *RosterView) Draw(screen mauview.Screen) {
rstr.width, rstr.height = screen.Size()
@ -76,8 +118,8 @@ func (rstr *RosterView) Draw(screen mauview.Screen) {
)
y := 4
for _, room := range rstr.parent.rooms {
if room.Room.IsReplaced() {
for _, room := range rstr.rooms {
if room.IsReplaced() {
continue
}
@ -86,11 +128,11 @@ func (rstr *RosterView) Draw(screen mauview.Screen) {
renderHeight = rstr.height - y
}
isSelected := room.Room == rstr.selected
isSelected := room == rstr.selected
style := tcell.StyleDefault.
Foreground(rstr.mainTextColor).
Bold(room.Room.HasNewMessages())
Bold(room.HasNewMessages())
if isSelected {
style = style.
Foreground(rstr.selectedTextColor).
@ -99,7 +141,7 @@ func (rstr *RosterView) Draw(screen mauview.Screen) {
widget.WriteLinePadded(
screen, mauview.AlignCenter,
room.Room.GetTitle(),
room.GetTitle(),
2, y, rstr.width,
style,
)