diff --git a/ui/view-main.go b/ui/view-main.go index ed92e3a..1e79de6 100644 --- a/ui/view-main.go +++ b/ui/view-main.go @@ -45,6 +45,7 @@ type MainView struct { roomList *RoomList roomView *mauview.Box + rosterView *RosterView currentRoom *RoomView rooms map[id.RoomID]*RoomView roomsLock sync.RWMutex @@ -73,6 +74,7 @@ func (ui *GomuksUI) NewMainView() mauview.Component { parent: ui, } mainView.roomList = NewRoomList(mainView) + mainView.rosterView = NewRosterView(mainView) mainView.cmdProcessor = NewCommandProcessor(mainView) mainView.flex. @@ -103,7 +105,9 @@ func (view *MainView) HideModal() { } func (view *MainView) Draw(screen mauview.Screen) { - if view.config.Preferences.HideRoomList { + if view.config.Preferences.DisplayMode == config.DisplayModeModern { + view.rosterView.Draw(screen) + } else if view.config.Preferences.HideRoomList { view.roomView.Draw(screen) } else { view.flex.Draw(screen) diff --git a/ui/view-roster.go b/ui/view-roster.go new file mode 100644 index 0000000..3d2d877 --- /dev/null +++ b/ui/view-roster.go @@ -0,0 +1,90 @@ +// gomuks - A terminal Matrix client written in Go. +// Copyright (C) 2020 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 . + +package ui + +import ( + "go.mau.fi/mauview" + "go.mau.fi/tcell" + + "maunium.net/go/gomuks/matrix/rooms" + "maunium.net/go/gomuks/ui/widget" +) + +type RosterView struct { + mauview.Component + + selected *rooms.Room + + height, width int + + // 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 + + parent *MainView +} + +func NewRosterView(mainView *MainView) *RosterView { + rstr := &RosterView{ + parent: mainView, + } + + return rstr +} + +func (rstr *RosterView) Draw(screen mauview.Screen) { + rstr.width, rstr.height = screen.Size() + y := 0 + + for _, room := range rstr.parent.rooms { + if room.Room.IsReplaced() { + continue + } + + renderHeight := 1 + if y+renderHeight >= rstr.height { + renderHeight = rstr.height - y + } + + isSelected := room.Room == rstr.selected + + style := tcell.StyleDefault. + Foreground(rstr.mainTextColor). + Bold(room.Room.HasNewMessages()) + if isSelected { + style = style. + Foreground(rstr.selectedTextColor). + Background(rstr.selectedBackgroundColor) + } + + widget.WriteLinePadded( + screen, + mauview.AlignLeft, + room.Room.GetTitle(), + 0, y, rstr.width, + style, + ) + + y += renderHeight + if y >= rstr.height { + break + } + } +}