aboutsummaryrefslogtreecommitdiff
path: root/view-main.go
diff options
context:
space:
mode:
authorTulir Asokan <tulir@maunium.net>2018-03-13 21:58:43 +0200
committerTulir Asokan <tulir@maunium.net>2018-03-13 21:58:43 +0200
commit90629c5c78916ba9be982afb9b8435ea58be166b (patch)
tree3c1720f695e43e4de8a0f68f0d3c9da65ffd82d1 /view-main.go
parentf0333df1b2b6e0ef54a580668cb759a094b56010 (diff)
Code additions/edits
Diffstat (limited to 'view-main.go')
-rw-r--r--view-main.go164
1 files changed, 164 insertions, 0 deletions
diff --git a/view-main.go b/view-main.go
new file mode 100644
index 0000000..acacddb
--- /dev/null
+++ b/view-main.go
@@ -0,0 +1,164 @@
+// 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 main
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/gdamore/tcell"
+ "github.com/rivo/tview"
+)
+
+type RoomView struct {
+ *tview.Grid
+
+ sender, message *tview.TextView
+}
+
+func NewRoomView() *RoomView {
+ view := &RoomView{
+ tview.NewGrid(),
+ tview.NewTextView(),
+ tview.NewTextView(),
+ }
+ view.SetColumns(30, 0).SetRows(0)
+
+ view.sender.SetTextAlign(tview.AlignRight)
+ view.sender.SetScrollable(true)
+ view.message.SetScrollable(true)
+
+ view.AddItem(view.sender, 0, 0, 1, 1, 1, 1, false)
+ view.AddItem(view.message, 0, 1, 1, 1, 1, 1, false)
+
+ return view
+}
+
+func (ui *GomuksUI) MakeMainUI() tview.Primitive {
+ ui.mainView = tview.NewGrid().SetColumns(40, 0).SetRows(0, 2)
+
+ ui.mainViewRoomList = tview.NewList().ShowSecondaryText(false)
+ ui.mainViewRoomList.SetBorderPadding(1, 1, 1, 1)
+ ui.mainView.AddItem(ui.mainViewRoomList, 0, 0, 2, 1, 2, 1, false)
+
+ ui.mainViewRoomView = tview.NewPages()
+ ui.mainViewRoomView.SetChangedFunc(ui.Render)
+ ui.mainView.AddItem(ui.mainViewRoomView, 0, 1, 1, 1, 1, 1, false)
+
+ ui.mainViewInput = tview.NewInputField()
+ ui.mainViewInput.SetDoneFunc(func(key tcell.Key) {
+ if key == tcell.KeyEnter {
+ room, text := ui.currentRoom(), ui.mainViewInput.GetText()
+ if len(text) == 0 {
+ return
+ } else if text[0] == '/' {
+ args := strings.SplitN(text, " ", 2)
+ command := strings.ToLower(args[0])
+ args = args[1:]
+ ui.HandleCommand(room, command, args)
+ } else {
+ ui.matrix.SendMessage(room, text)
+ }
+ ui.mainViewInput.SetText("")
+ }
+ })
+ ui.mainView.AddItem(ui.mainViewInput, 1, 1, 1, 1, 1, 1, true)
+
+ ui.debug.Print(ui.mainViewInput.SetInputCapture(ui.MainUIKeyHandler))
+
+ ui.mainViewRooms = make(map[string]*RoomView)
+
+ return ui.mainView
+}
+
+func (ui *GomuksUI) HandleCommand(room, command string, args []string) {
+ switch command {
+ case "quit":
+ ui.matrix.Stop()
+ ui.app.Stop()
+ case "part":
+ case "leave":
+ ui.matrix.client.LeaveRoom(room)
+ case "join":
+ if len(args) == 0 {
+ ui.Append(room, "*", "Usage: /join <room>")
+ }
+ mxid := args[0]
+ server := mxid[strings.Index(mxid, ":")+1:]
+ ui.matrix.client.JoinRoom(mxid, server, nil)
+ }
+}
+
+func (ui *GomuksUI) MainUIKeyHandler(key *tcell.EventKey) *tcell.EventKey {
+ ui.debug.Print(key)
+ if key.Modifiers() == tcell.ModCtrl {
+ if key.Key() == tcell.KeyDown {
+ ui.SwitchRoom(ui.currentRoomIndex + 1)
+ ui.mainViewRoomList.SetCurrentItem(ui.currentRoomIndex)
+ } else if key.Key() == tcell.KeyUp {
+ ui.SwitchRoom(ui.currentRoomIndex - 1)
+ ui.mainViewRoomList.SetCurrentItem(ui.currentRoomIndex)
+ }
+ } else if key.Key() == tcell.KeyPgUp || key.Key() == tcell.KeyPgDn {
+ ui.mainViewRooms[ui.currentRoom()].sender.InputHandler()(key, nil)
+ ui.mainViewRooms[ui.currentRoom()].message.InputHandler()(key, nil)
+ } else {
+ return key
+ }
+ return nil
+}
+
+func (ui *GomuksUI) SetRoomList(rooms []string) {
+ ui.roomList = rooms
+ ui.mainViewRoomList.Clear()
+ for index, room := range rooms {
+ localRoomIndex := index
+ ui.mainViewRoomList.AddItem(room, "", 0, func() {
+ ui.SwitchRoom(localRoomIndex)
+ })
+ if !ui.mainViewRoomView.HasPage(room) {
+ roomView := NewRoomView()
+ ui.mainViewRooms[room] = roomView
+ ui.mainViewRoomView.AddPage(room, roomView, true, false)
+ }
+ }
+ ui.SwitchRoom(0)
+}
+
+func (ui *GomuksUI) currentRoom() string {
+ if len(ui.roomList) == 0 {
+ return ""
+ }
+ return ui.roomList[ui.currentRoomIndex]
+}
+
+func (ui *GomuksUI) SwitchRoom(roomIndex int) {
+ if roomIndex < 0 {
+ roomIndex = len(ui.roomList) - 1
+ }
+ ui.currentRoomIndex = roomIndex % len(ui.roomList)
+ ui.mainViewRoomView.SwitchToPage(ui.roomList[ui.currentRoomIndex])
+}
+
+func (ui *GomuksUI) Append(room, sender, message string) {
+ roomView, ok := ui.mainViewRooms[room]
+ if ok {
+ fmt.Fprintf(roomView.sender, sender)
+ fmt.Fprintf(roomView.message, sender)
+ ui.Render()
+ }
+}