~edwargix/tallyard

089f9884b5f4c3e7a9d1675bbbba8f3b82fbe699 — David Florness 4 years ago cb7bccf
Sort rooms by name in room list TUI
1 files changed, 30 insertions(+), 10 deletions(-)

M ui/tui.go
M ui/tui.go => ui/tui.go +30 -10
@@ 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) {