From eda2b575f06e72040ebf82d24a7ec1ac84b7948c Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 9 Apr 2018 23:45:54 +0300 Subject: Refactor UI to use interfaces everywhere --- ui/room-list.go | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 ui/room-list.go (limited to 'ui/room-list.go') diff --git a/ui/room-list.go b/ui/room-list.go new file mode 100644 index 0000000..2ff3ed7 --- /dev/null +++ b/ui/room-list.go @@ -0,0 +1,141 @@ +// gomuks - A terminal Matrix client written in Go. +// Copyright (C) 2018 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package ui + +import ( + "fmt" + "strconv" + + "github.com/gdamore/tcell" + "maunium.net/go/gomuks/matrix/rooms" + "maunium.net/go/gomuks/ui/widget" + "maunium.net/go/tview" +) + +type RoomList struct { + *tview.Box + + indices map[*rooms.Room]int + items []*rooms.Room + selected *rooms.Room + + // The item main text color. + mainTextColor tcell.Color + // The text color for selected items. + selectedTextColor tcell.Color + // The background color for selected items. + selectedBackgroundColor tcell.Color +} + +func NewRoomList() *RoomList { + return &RoomList{ + Box: tview.NewBox(), + indices: make(map[*rooms.Room]int), + items: []*rooms.Room{}, + + mainTextColor: tcell.ColorWhite, + selectedTextColor: tcell.ColorWhite, + selectedBackgroundColor: tcell.ColorDarkGreen, + } +} + +func (list *RoomList) Add(room *rooms.Room) { + list.indices[room] = len(list.items) + list.items = append(list.items, room) + if list.selected == nil { + list.selected = room + } +} + +func (list *RoomList) Remove(room *rooms.Room) { + index, ok := list.indices[room] + if !ok { + return + } + delete(list.indices, room) + list.items = append(list.items[0:index], list.items[index+1:]...) + if len(list.items) == 0 { + list.selected = nil + } +} + +func (list *RoomList) Clear() { + list.indices = make(map[*rooms.Room]int) + list.items = []*rooms.Room{} + list.selected = nil +} + +func (list *RoomList) SetSelected(room *rooms.Room) { + list.selected = room +} + +// Draw draws this primitive onto the screen. +func (list *RoomList) Draw(screen tcell.Screen) { + list.Box.Draw(screen) + + x, y, width, height := list.GetInnerRect() + bottomLimit := y + height + + var offset int + currentItemIndex, hasSelected := list.indices[list.selected] + if hasSelected && currentItemIndex >= height { + offset = currentItemIndex + 1 - height + } + + // Draw the list items. + for index, item := range list.items { + if index < offset { + continue + } + + if y >= bottomLimit { + break + } + + text := item.GetTitle() + + lineWidth := width + + style := tcell.StyleDefault.Foreground(list.mainTextColor) + if item == list.selected { + style = style.Foreground(list.selectedTextColor).Background(list.selectedBackgroundColor) + } + if item.HasNewMessages { + style = style.Bold(true) + } + + if item.UnreadMessages > 0 { + unreadMessageCount := "99+" + if item.UnreadMessages < 100 { + unreadMessageCount = strconv.Itoa(item.UnreadMessages) + } + if item.Highlighted { + unreadMessageCount += "!" + } + unreadMessageCount = fmt.Sprintf("(%s)", unreadMessageCount) + widget.WriteLine(screen, tview.AlignRight, unreadMessageCount, x+lineWidth-6, y, 6, style) + lineWidth -= len(unreadMessageCount) + 1 + } + + widget.WriteLine(screen, tview.AlignLeft, text, x, y, lineWidth, style) + + y++ + if y >= bottomLimit { + break + } + } +} -- cgit v1.2.3