diff options
author | Tulir Asokan <tulir@maunium.net> | 2019-04-13 14:27:50 +0300 |
---|---|---|
committer | Tulir Asokan <tulir@maunium.net> | 2019-04-13 14:27:50 +0300 |
commit | e5264a242d7fc6ac6b3f7bdca548163bb584875b (patch) | |
tree | 754f9dcae9cfb1ae8a8b0bd11bab35b5952ac688 /ui/member-list.go | |
parent | 43a7bdab7262c015b50e3e673e80389f9514f9ca (diff) |
Fix user list
Diffstat (limited to 'ui/member-list.go')
-rw-r--r-- | ui/member-list.go | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/ui/member-list.go b/ui/member-list.go new file mode 100644 index 0000000..82a6125 --- /dev/null +++ b/ui/member-list.go @@ -0,0 +1,99 @@ +// gomuks - A terminal Matrix client written in Go. +// Copyright (C) 2019 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see <https://www.gnu.org/licenses/>. + +package ui + +import ( + "sort" + "strings" + + "github.com/mattn/go-runewidth" + + "maunium.net/go/gomuks/debug" + "maunium.net/go/gomuks/ui/widget" + "maunium.net/go/mautrix" + "maunium.net/go/mauview" + "maunium.net/go/tcell" +) + +type MemberList struct { + list roomMemberList +} + +func NewMemberList() *MemberList { + return &MemberList{} +} + +type memberListItem struct { + mautrix.Member + PowerLevel int + UserID string + Color tcell.Color +} + +type roomMemberList []*memberListItem + +func (rml roomMemberList) Len() int { + return len(rml) +} + +func (rml roomMemberList) lessMembership(i, j int) bool { + return rml[j].Membership == "invite" && rml[i].Membership == "join" +} + +func (rml roomMemberList) Less(i, j int) bool { + return rml.lessMembership(i, j) || + rml[i].PowerLevel > rml[j].PowerLevel || + strings.Compare(rml[i].Displayname, rml[j].Displayname) < 0 +} + +func (rml roomMemberList) Swap(i, j int) { + rml[i], rml[j] = rml[j], rml[i] +} + +func (ml *MemberList) Update(data map[string]*mautrix.Member, levels *mautrix.PowerLevels) *MemberList { + ml.list = make(roomMemberList, len(data)) + i := 0 + debug.Print(levels) + for userID, member := range data { + ml.list[i] = &memberListItem{ + Member: *member, + UserID: userID, + PowerLevel: levels.GetUserLevel(userID), + Color: widget.GetHashColor(userID), + } + i++ + } + sort.Sort(ml.list) + return ml +} + +func (ml *MemberList) Draw(screen mauview.Screen) { + width, _ := screen.Size() + for y, member := range ml.list { + if member.Membership == "invite" { + widget.WriteLineSimpleColor(screen, member.Displayname, 1, y, member.Color) + screen.SetCell(0, y, tcell.StyleDefault, '(') + if sw := runewidth.StringWidth(member.Displayname); sw < width { + screen.SetCell(sw+1, y, tcell.StyleDefault, ')') + } else { + screen.SetCell(width-1, y, tcell.StyleDefault, ')') + } + } else { + widget.WriteLineSimpleColor(screen, member.Displayname, 0, y, member.Color) + } + } +} |