From 32665a2e5a61b456070bab8aa57cb7ec74123dfe Mon Sep 17 00:00:00 2001 From: FIGBERT Date: Sun, 26 Feb 2023 16:08:37 -0800 Subject: [PATCH] Sort rooms in RosterView by most recent message --- ui/view-main.go | 3 +++ ui/view-roster.go | 52 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/ui/view-main.go b/ui/view-main.go index 1e79de6..c1b87f7 100644 --- a/ui/view-main.go +++ b/ui/view-main.go @@ -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() diff --git a/ui/view-roster.go b/ui/view-roster.go index f4756c4..64d8855 100644 --- a/ui/view-roster.go +++ b/ui/view-roster.go @@ -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, )