From f56048fbf7a55afc4d4a0abb93253dd9c11a2f3a Mon Sep 17 00:00:00 2001 From: IllusionMan1212 Date: Mon, 13 Dec 2021 09:38:07 +0200 Subject: [PATCH] WIP: working on adding inputbox and wrapping the messages in a viewport --- .gitignore | 2 ++ main.go | 5 ++++- ui/app/app.go | 4 ++++ ui/login/login.go | 1 + ui/mainscreen/input.go | 42 +++++++++++++++++++++++++++++++++++++ ui/mainscreen/mainscreen.go | 42 +++++++++++++++++++++++++++++++------ ui/mainscreen/styles.go | 37 ++++++++++++++++++++++++++++++++ ui/styles.go | 4 ++-- 8 files changed, 128 insertions(+), 9 deletions(-) create mode 100644 .gitignore create mode 100644 ui/mainscreen/input.go create mode 100644 ui/mainscreen/styles.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..441ef88 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# binary +gorc diff --git a/main.go b/main.go index 569d7fe..2170014 100644 --- a/main.go +++ b/main.go @@ -24,7 +24,10 @@ import ( ) func main() { - if err := tea.NewProgram(app.InitialState(), tea.WithAltScreen()).Start(); err != nil { + if err := tea.NewProgram(app.InitialState(), + tea.WithAltScreen(), + tea.WithMouseCellMotion(), + ).Start(); err != nil { log.Fatal(err) } } diff --git a/ui/app/app.go b/ui/app/app.go index a86fcdd..a4c2cb5 100644 --- a/ui/app/app.go +++ b/ui/app/app.go @@ -59,6 +59,7 @@ func initialUiState() UI { return UI{ login: login.NewLogin(), + mainScreen: mainscreen.NewMainScreen(), windowWidth: width, windowHeight: height, } @@ -100,6 +101,9 @@ func (s State) Update(msg tea.Msg) (tea.Model, tea.Cmd) { Width(msg.Width). Height(msg.Height) + s.ui.mainScreen.Viewport.Width = msg.Width + s.ui.mainScreen.Viewport.Height = msg.Height - mainscreen.InputBoxHeight + return s, nil case login.ConnectingMsg: host := s.ui.login.Inputs[0].Value() diff --git a/ui/login/login.go b/ui/login/login.go index 1a8826d..74364ee 100644 --- a/ui/login/login.go +++ b/ui/login/login.go @@ -41,6 +41,7 @@ func NewLogin() State { for i := range ls.Inputs { t = textinput.NewModel() t.CursorStyle = ui.CursorStyle + t.Prompt = "| " switch i { case 0: diff --git a/ui/mainscreen/input.go b/ui/mainscreen/input.go new file mode 100644 index 0000000..86baf3d --- /dev/null +++ b/ui/mainscreen/input.go @@ -0,0 +1,42 @@ +// gorc project +// Copyright (C) 2021 IllusionMan1212 +// +// 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 https://www.gnu.org/licenses. + +package mainscreen + +import ( + "github.com/charmbracelet/bubbles/textinput" + tea "github.com/charmbracelet/bubbletea" +) + +type InputState struct { + input textinput.Model +} + +func NewInputBox() InputState { + var input textinput.Model + input.Placeholder = "Send a message..." + state := InputState{input} + + return state +} + +func (s InputState) Update(msg tea.Msg) (InputState, tea.Cmd) { + return s, nil +} + +func (s InputState) View() string { + return InputboxStyle.Render(s.input.View()) +} diff --git a/ui/mainscreen/mainscreen.go b/ui/mainscreen/mainscreen.go index ffd97c6..7214fad 100644 --- a/ui/mainscreen/mainscreen.go +++ b/ui/mainscreen/mainscreen.go @@ -21,25 +21,49 @@ import ( "fmt" "strings" + "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" "github.com/illusionman1212/gorc/client" "github.com/illusionman1212/gorc/parser" + "github.com/illusionman1212/gorc/ui" ) type State struct { - content string - Reader *bufio.Reader - Client *client.Client + Content string + Reader *bufio.Reader + Client *client.Client + Viewport viewport.Model + + inputBox InputState +} + +func NewMainScreen() State { + newViewport := viewport.Model{Width: ui.MainStyle.GetWidth(), Height: ui.MainStyle.GetHeight() - InputBoxHeight} + newViewport.HighPerformanceRendering = false + newViewport.SetContent("") + + state := State{ + Content: "", + Reader: nil, + Client: nil, + Viewport: newViewport, + inputBox: NewInputBox(), + } + return state } func (s State) Update(msg tea.Msg) (State, tea.Cmd) { + var cmd tea.Cmd switch msg := msg.(type) { case InitialReadMsg: return s, s.readFromServer case ReceivedIRCCommandMsg: message := parser.ParseIRCMessage(msg.Msg) fullMsg := fmt.Sprintf("%s %s %s %s", message.Tags, message.Source, message.Command, strings.Join(message.Parameters, " ")) - s.content += fullMsg + s.Content += fullMsg + + s.Viewport.SetContent(s.Content) // TODO: handle different commands switch message.Command { @@ -51,9 +75,15 @@ func (s State) Update(msg tea.Msg) (State, tea.Cmd) { return s, s.readFromServer } - return s, nil + s.Viewport, cmd = s.Viewport.Update(msg) + + return s, cmd } func (s State) View() string { - return s.content + mainscreen := s.Viewport.View() + + screen := lipgloss.JoinVertical(0, MessagesStyle.Render(mainscreen), s.inputBox.View()) + + return screen } diff --git a/ui/mainscreen/styles.go b/ui/mainscreen/styles.go new file mode 100644 index 0000000..b2c3d1f --- /dev/null +++ b/ui/mainscreen/styles.go @@ -0,0 +1,37 @@ +// gorc project +// Copyright (C) 2021 IllusionMan1212 +// +// 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 https://www.gnu.org/licenses. + +package mainscreen + +import ( + "github.com/charmbracelet/lipgloss" + "github.com/illusionman1212/gorc/ui" +) + +var ( + InputboxStyle = lipgloss.NewStyle(). + Border(lipgloss.NormalBorder(), true). + Padding(0, 1). + Width(ui.MainStyle.GetWidth()). + BorderForeground(lipgloss.Color("105")) + MessagesStyle = lipgloss.NewStyle(). + Border(lipgloss.NormalBorder(), true). + Width(ui.MainStyle.GetWidth()). + Height(ui.MainStyle.GetHeight() - InputBoxHeight). + BorderForeground(lipgloss.Color("105")) + + InputBoxHeight = 1 +) diff --git a/ui/styles.go b/ui/styles.go index 46c0614..c2b80eb 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -19,7 +19,7 @@ package ui import "github.com/charmbracelet/lipgloss" var ( - Border = lipgloss.Border{ + BorderRound = lipgloss.Border{ Top: "─", Bottom: "─", Left: "│", @@ -35,7 +35,7 @@ var ( Height(40) DialogStyle = lipgloss.NewStyle(). - Border(Border, true). + Border(BorderRound, true). Align(lipgloss.Center). Width(50). Padding(3, 6).