From 4db41167976e111c0c2991b408752ef3caeb28d4 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 15 Mar 2018 18:21:14 +0200 Subject: [PATCH] Here have code --- gomuks.go | 10 ++++++ matrix.go | 10 ++++-- ui.go | 14 +++++--- view-main.go | 93 +++++++++++++++++++++++++++++++++++++++++----------- 4 files changed, 101 insertions(+), 26 deletions(-) diff --git a/gomuks.go b/gomuks.go index e87da59..13b6672 100644 --- a/gomuks.go +++ b/gomuks.go @@ -34,6 +34,7 @@ type Gomuks interface { Start() Stop() + Recover() } type gomuks struct { @@ -79,6 +80,15 @@ func (gmx *gomuks) Stop() { } } +func (gmx *gomuks) Recover() { + if p := recover(); p != nil { + if gmx.App().GetScreen() != nil { + gmx.App().GetScreen().Fini() + } + panic(p) + } +} + func (gmx *gomuks) Start() { if err := gmx.app.Run(); err != nil { panic(err) diff --git a/matrix.go b/matrix.go index 2639af7..dc433a8 100644 --- a/matrix.go +++ b/matrix.go @@ -117,6 +117,7 @@ func (c *MatrixContainer) UpdateRoomList() { } func (c *MatrixContainer) Start() { + defer c.gmx.Recover() c.debug.Print("Starting sync...") c.running = true c.ui.SetView(ViewMain) @@ -150,9 +151,14 @@ func (c *MatrixContainer) HandleMessage(evt *gomatrix.Event) { } func (c *MatrixContainer) HandleTyping(evt *gomatrix.Event) { - users := evt.Content["user_ids"].([]string) + users := evt.Content["user_ids"].([]interface{}) c.debug.Print(users, "are typing") - c.ui.SetTyping(evt.RoomID, users) + + strUsers := make([]string, len(users)) + for i, user := range users { + strUsers[i] = user.(string) + } + c.ui.SetTyping(evt.RoomID, strUsers...) } func (c *MatrixContainer) SendMessage(roomID, message string) { diff --git a/ui.go b/ui.go index 8eec7fe..272d0ba 100644 --- a/ui.go +++ b/ui.go @@ -17,6 +17,7 @@ package main import ( + "github.com/gdamore/tcell" "maunium.net/go/tview" ) @@ -34,13 +35,18 @@ type GomuksUI struct { config *Config views *tview.Pages - mainView *tview.Grid + mainView *tview.Grid mainViewRoomList *tview.List mainViewRoomView *tview.Pages - mainViewInput *tview.InputField - mainViewRooms map[string]*RoomView + mainViewInput *tview.InputField + mainViewRooms map[string]*RoomView currentRoomIndex int - roomList []string + roomList []string +} + +func init() { + tview.Styles.PrimitiveBackgroundColor = tcell.ColorDefault + tview.Styles.ContrastBackgroundColor = tcell.ColorDefault } func NewGomuksUI(gmx Gomuks) (ui *GomuksUI) { diff --git a/view-main.go b/view-main.go index 131e872..68d8ab8 100644 --- a/view-main.go +++ b/view-main.go @@ -26,37 +26,84 @@ import ( ) type RoomView struct { - *tview.Grid - content *tview.TextView - status *tview.TextView - name, topic string + *tview.Box + + topic *tview.TextView + content *tview.TextView + status *tview.TextView + userlist *tview.TextView + name string } func NewRoomView(name, topic string) *RoomView { view := &RoomView{ - tview.NewGrid(), - tview.NewTextView(), - tview.NewTextView(), - name, topic, + Box: tview.NewBox(), + topic: tview.NewTextView(), + content: tview.NewTextView(), + status: tview.NewTextView(), + userlist: tview.NewTextView(), + name: name, } - view.content.SetTitle(topic).SetBorder(true) - view.status.SetText("Waiting for status data...") - view.SetColumns(0).SetRows(0, 1) - view.AddItem(view.content, 0, 0, 1, 1, 0, 0, false) - view.AddItem(view.status, 1, 0, 1, 1, 0, 0, false) + view.topic.SetText(topic).SetBackgroundColor(tcell.ColorDarkGreen) + view.status.SetBackgroundColor(tcell.ColorDimGray) + view.userlist.SetText("@tulir:maunium.net\n@tulir_test:maunium.net") return view } +func (view *RoomView) Draw(screen tcell.Screen) { + x, y, width, height := view.GetRect() + view.topic.SetRect(x, y, width, 1) + view.content.SetRect(x, y+1, width-30, height-2) + view.status.SetRect(x, y+height-1, width,1) + view.userlist.SetRect(x+width-29, y+1, 29, height - 2) + + view.topic.Draw(screen) + view.content.Draw(screen) + view.status.Draw(screen) + + borderX := x+width-30 + background := tcell.StyleDefault.Background(view.GetBackgroundColor()).Foreground(view.GetBorderColor()) + for borderY := y + 1; borderY < y + height - 1; borderY++ { + screen.SetContent(borderX, borderY, tview.GraphicsVertBar, nil, background) + } + view.userlist.Draw(screen) +} + +type Border struct { + *tview.Box +} + +func NewBorder() *Border { + return &Border{tview.NewBox()} +} + +func (border *Border) Draw(screen tcell.Screen) { + background := tcell.StyleDefault.Background(border.GetBackgroundColor()).Foreground(border.GetBorderColor()) + x, y, width, height := border.GetRect() + if width == 1 { + for borderY := y; borderY < y + height; borderY++ { + screen.SetContent(x, borderY, tview.GraphicsVertBar, nil, background) + } + } else if height == 1 { + for borderX := x; borderX < x + width; borderX++ { + screen.SetContent(borderX, y, tview.GraphicsHoriBar, nil, background) + } + } +} + func (ui *GomuksUI) MakeMainUI() tview.Primitive { - ui.mainView = tview.NewGrid().SetColumns(30, 0).SetRows(0, 1) + ui.mainView = tview.NewGrid() + ui.mainView.SetColumns(30, 1, 0).SetRows(0, 1) ui.mainViewRoomList = tview.NewList().ShowSecondaryText(false) - ui.mainViewRoomList.SetBorder(true).SetTitle("Rooms") + ui.mainViewRoomList.SetBorderPadding(0, 0, 0, 1) ui.mainView.AddItem(ui.mainViewRoomList, 0, 0, 2, 1, 0, 0, false) + ui.mainView.AddItem(NewBorder(), 0, 1, 2, 1, 0, 0, false) + ui.mainViewRoomView = tview.NewPages() ui.mainViewRoomView.SetChangedFunc(ui.Render) - ui.mainView.AddItem(ui.mainViewRoomView, 0, 1, 1, 1, 0, 0, false) + ui.mainView.AddItem(ui.mainViewRoomView, 0, 2, 1, 1, 0, 0, false) ui.mainViewInput = tview.NewInputField() ui.mainViewInput.SetChangedFunc(func(_ string) { @@ -78,7 +125,7 @@ func (ui *GomuksUI) MakeMainUI() tview.Primitive { ui.mainViewInput.SetText("") } }) - ui.mainView.AddItem(ui.mainViewInput, 1, 1, 1, 1, 0, 0, true) + ui.mainView.AddItem(ui.mainViewInput, 1, 2, 1, 1, 0, 0, true) ui.debug.Print(ui.mainViewInput.SetInputCapture(ui.MainUIKeyHandler)) @@ -154,6 +201,7 @@ func (ui *GomuksUI) SetRoomList(rooms []string) { topicEvt := roomStore.GetStateEvent("m.room.topic", "") if topicEvt != nil { topic, _ = topicEvt.Content["topic"].(string) + topic = strings.Replace(topic, "\n", " ", -1) } } ui.mainViewRoomList.AddItem(name, "", 0, func() { @@ -180,13 +228,18 @@ func (ui *GomuksUI) SwitchRoom(roomIndex int) { roomIndex = len(ui.roomList) - 1 } ui.currentRoomIndex = roomIndex % len(ui.roomList) - ui.mainViewRoomView.SwitchToPage(ui.roomList[ui.currentRoomIndex]) + ui.mainViewRoomView.SwitchToPage(ui.currentRoom()) } -func (ui *GomuksUI) SetTyping(room string, users []string) { +func (ui *GomuksUI) SetTyping(room string, users ...string) { roomView, ok := ui.mainViewRooms[room] if ok { - roomView.status.SetText("Typing: " + strings.Join(users, ", ")) + if len(users) > 0 { + roomView.status.SetText("Typing: " + strings.Join(users, ", ")) + } else { + roomView.status.SetText("") + } + ui.Render() } }