From 089f9884b5f4c3e7a9d1675bbbba8f3b82fbe699 Mon Sep 17 00:00:00 2001 From: David Florness Date: Sun, 31 Jan 2021 12:45:32 -0500 Subject: [PATCH] Sort rooms by name in room list TUI --- ui/tui.go | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/ui/tui.go b/ui/tui.go index e3a0ea4..61c183a 100644 --- a/ui/tui.go +++ b/ui/tui.go @@ -25,17 +25,37 @@ func TUI(client *mautrix.Client, elections *election.ElectionsMap) (el *election if err != nil { panic(err) } + // sorts rooms by name (putting rooms without names at the end) + cmpRooms := func(i, j id.RoomID) bool { + roomI := client.Store.LoadRoom(i) + roomJ := client.Store.LoadRoom(j) + if roomJ == nil { + return true + } + if roomI == nil { + return false + } + var nameI, nameJ string + if nameEvt, ok := roomJ.State[event.StateRoomName][""]; ok { + nameJ = nameEvt.Content.AsRoomName().Name + } else { + return true + } + if nameEvt, ok := roomI.State[event.StateRoomName][""]; ok { + nameI = nameEvt.Content.AsRoomName().Name + } else { + return false + } + return nameI < nameJ + } + // try to sort by room name (if available) + sort.Slice(resp.JoinedRooms, func(i, j int) bool { + return cmpRooms(resp.JoinedRooms[i], resp.JoinedRooms[j]) + }) list := tview.NewList() list.SetTitle("Select a room").SetBorder(true) for _, roomID := range resp.JoinedRooms { - name := string(roomID) - room := client.Store.LoadRoom(roomID) - if room != nil { - if roomNameEvent, ok := room.State[event.StateRoomName][""]; ok { - name = roomNameEvent.Content.AsRoomName().Name - } - } - list.AddItem(name, string(roomID), 0, nil) + list.AddItem(roomID.String(), roomID.String(), 0, nil) } update := func() { for i, roomID := range resp.JoinedRooms { @@ -45,14 +65,14 @@ func TUI(client *mautrix.Client, elections *election.ElectionsMap) (el *election } if roomNameEvent, ok := room.State[event.StateRoomName][""]; ok { name := roomNameEvent.Content.AsRoomName().Name - list.SetItemText(i, name, string(roomID)) + list.SetItemText(i, name, roomID.String()) } } } go func() { for alive { - time.Sleep(100 * time.Millisecond) // syncing right away can be slow, so this is before the next line app.QueueUpdateDraw(update) + time.Sleep(300 * time.Millisecond) } }() list.SetSelectedFunc(func(i int, _ string, _ string, _ rune) { -- 2.38.4