aboutsummaryrefslogtreecommitdiff
path: root/ui/widget/room-view.go
diff options
context:
space:
mode:
Diffstat (limited to 'ui/widget/room-view.go')
-rw-r--r--ui/widget/room-view.go275
1 files changed, 0 insertions, 275 deletions
diff --git a/ui/widget/room-view.go b/ui/widget/room-view.go
deleted file mode 100644
index 4bab779..0000000
--- a/ui/widget/room-view.go
+++ /dev/null
@@ -1,275 +0,0 @@
-// 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 <http://www.gnu.org/licenses/>.
-
-package widget
-
-import (
- "fmt"
- "path/filepath"
- "strconv"
- "strings"
- "time"
-
- "github.com/gdamore/tcell"
- "maunium.net/go/gomuks/matrix/rooms"
- "maunium.net/go/gomuks/ui/types"
- "maunium.net/go/tview"
-)
-
-type RoomView struct {
- *tview.Box
-
- topic *tview.TextView
- content *MessageView
- status *tview.TextView
- userList *tview.TextView
- ulBorder *Border
- input *AdvancedInputField
- Room *rooms.Room
-}
-
-func NewRoomView(room *rooms.Room) *RoomView {
- view := &RoomView{
- Box: tview.NewBox(),
- topic: tview.NewTextView(),
- content: NewMessageView(),
- status: tview.NewTextView(),
- userList: tview.NewTextView(),
- ulBorder: NewBorder(),
- input: NewAdvancedInputField(),
- Room: room,
- }
-
- view.input.
- SetFieldBackgroundColor(tcell.ColorDefault).
- SetPlaceholder("Send a message...").
- SetPlaceholderExtColor(tcell.ColorGray)
-
- view.topic.
- SetText(strings.Replace(room.GetTopic(), "\n", " ", -1)).
- SetBackgroundColor(tcell.ColorDarkGreen)
-
- view.status.SetBackgroundColor(tcell.ColorDimGray)
-
- view.userList.
- SetDynamicColors(true).
- SetWrap(false)
-
- return view
-}
-
-func (view *RoomView) logPath(dir string) string {
- return filepath.Join(dir, fmt.Sprintf("%s.gmxlog", view.Room.ID))
-}
-
-func (view *RoomView) SaveHistory(dir string) error {
- return view.MessageView().SaveHistory(view.logPath(dir))
-}
-
-func (view *RoomView) LoadHistory(dir string) (int, error) {
- return view.MessageView().LoadHistory(view.logPath(dir))
-}
-
-func (view *RoomView) SetTabCompleteFunc(fn func(room *RoomView, text string, cursorOffset int) string) *RoomView {
- view.input.SetTabCompleteFunc(func(text string, cursorOffset int) string {
- return fn(view, text, cursorOffset)
- })
- return view
-}
-
-func (view *RoomView) SetInputCapture(fn func(room *RoomView, event *tcell.EventKey) *tcell.EventKey) *RoomView {
- view.input.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
- return fn(view, event)
- })
- return view
-}
-
-func (view *RoomView) SetMouseCapture(fn func(room *RoomView, event *tcell.EventMouse) *tcell.EventMouse) *RoomView {
- view.input.SetMouseCapture(func(event *tcell.EventMouse) *tcell.EventMouse {
- return fn(view, event)
- })
- return view
-}
-
-func (view *RoomView) SetInputSubmitFunc(fn func(room *RoomView, text string)) *RoomView {
- view.input.SetDoneFunc(func(key tcell.Key) {
- if key == tcell.KeyEnter {
- fn(view, view.input.GetText())
- }
- })
- return view
-}
-
-func (view *RoomView) SetInputChangedFunc(fn func(room *RoomView, text string)) *RoomView {
- view.input.SetChangedFunc(func(text string) {
- fn(view, text)
- })
- return view
-}
-
-func (view *RoomView) SetInputText(newText string) *RoomView {
- view.input.SetText(newText)
- return view
-}
-
-func (view *RoomView) GetInputText() string {
- return view.input.GetText()
-}
-
-func (view *RoomView) GetInputField() *AdvancedInputField {
- return view.input
-}
-
-func (view *RoomView) Focus(delegate func(p tview.Primitive)) {
- delegate(view.input)
-}
-
-// Constants defining the size of the room view grid.
-const (
- UserListBorderWidth = 1
- UserListWidth = 20
- StaticHorizontalSpace = UserListBorderWidth + UserListWidth
-
- TopicBarHeight = 1
- StatusBarHeight = 1
- InputBarHeight = 1
- StaticVerticalSpace = TopicBarHeight + StatusBarHeight + InputBarHeight
-)
-
-func (view *RoomView) Draw(screen tcell.Screen) {
- x, y, width, height := view.GetInnerRect()
- if width <= 0 || height <= 0 {
- return
- }
-
- // Calculate actual grid based on view rectangle and constants defined above.
- var (
- contentHeight = height - StaticVerticalSpace
- contentWidth = width - StaticHorizontalSpace
-
- userListBorderColumn = x + contentWidth
- userListColumn = userListBorderColumn + UserListBorderWidth
-
- topicRow = y
- contentRow = topicRow + TopicBarHeight
- statusRow = contentRow + contentHeight
- inputRow = statusRow + StatusBarHeight
- )
-
- // Update the rectangles of all the children.
- view.topic.SetRect(x, topicRow, width, TopicBarHeight)
- view.content.SetRect(x, contentRow, contentWidth, contentHeight)
- view.status.SetRect(x, statusRow, width, StatusBarHeight)
- if userListColumn > x {
- view.userList.SetRect(userListColumn, contentRow, UserListWidth, contentHeight)
- view.ulBorder.SetRect(userListBorderColumn, contentRow, UserListBorderWidth, contentHeight)
- }
- view.input.SetRect(x, inputRow, width, InputBarHeight)
-
- // Draw everything
- view.Box.Draw(screen)
- view.topic.Draw(screen)
- view.content.Draw(screen)
- view.status.Draw(screen)
- view.input.Draw(screen)
- view.ulBorder.Draw(screen)
- view.userList.Draw(screen)
-}
-
-func (view *RoomView) SetStatus(status string) {
- view.status.SetText(status)
-}
-
-func (view *RoomView) SetTyping(users []string) {
- for index, user := range users {
- member := view.Room.GetMember(user)
- if member != nil {
- users[index] = member.DisplayName
- }
- }
- if len(users) == 0 {
- view.status.SetText("")
- } else if len(users) < 2 {
- view.status.SetText("Typing: " + strings.Join(users, " and "))
- } else {
- view.status.SetText(fmt.Sprintf(
- "Typing: %s and %s",
- strings.Join(users[:len(users)-1], ", "), users[len(users)-1]))
- }
-}
-
-func (view *RoomView) AutocompleteUser(existingText string) (completions []string) {
- textWithoutPrefix := existingText
- if strings.HasPrefix(existingText, "@") {
- textWithoutPrefix = existingText[1:]
- }
- for _, user := range view.Room.GetMembers() {
- if strings.HasPrefix(user.DisplayName, textWithoutPrefix) {
- completions = append(completions, user.DisplayName)
- } else if strings.HasPrefix(user.UserID, existingText) {
- completions = append(completions, user.UserID)
- }
- }
- return
-}
-
-func (view *RoomView) MessageView() *MessageView {
- return view.content
-}
-
-func (view *RoomView) UpdateUserList() {
- var joined strings.Builder
- var invited strings.Builder
- for _, user := range view.Room.GetMembers() {
- if user.Membership == "join" {
- joined.WriteString(AddHashColor(user.DisplayName))
- joined.WriteRune('\n')
- } else if user.Membership == "invite" {
- invited.WriteString(AddHashColor(user.DisplayName))
- invited.WriteRune('\n')
- }
- }
- view.userList.Clear()
- fmt.Fprintf(view.userList, "%s\n", joined.String())
- if invited.Len() > 0 {
- fmt.Fprintf(view.userList, "\nInvited:\n%s", invited.String())
- }
-}
-
-func (view *RoomView) NewMessage(id, sender, msgtype, text string, timestamp time.Time) *types.Message {
- member := view.Room.GetMember(sender)
- if member != nil {
- sender = member.DisplayName
- }
- return view.content.NewMessage(id, sender, msgtype, text, timestamp)
-}
-
-func (view *RoomView) NewTempMessage(msgtype, text string) *types.Message {
- now := time.Now()
- id := strconv.FormatInt(now.UnixNano(), 10)
- sender := ""
- if ownerMember := view.Room.GetSessionOwner(); ownerMember != nil {
- sender = ownerMember.DisplayName
- }
- message := view.NewMessage(id, sender, msgtype, text, now)
- message.State = types.MessageStateSending
- view.AddMessage(message, AppendMessage)
- return message
-}
-
-func (view *RoomView) AddMessage(message *types.Message, direction MessageDirection) {
- view.content.AddMessage(message, direction)
-}