mirror of
https://github.com/mrusme/neonmodem.git
synced 2024-10-13 05:03:37 -04:00
Refactored UI head, navigation -> header
This commit is contained in:
parent
2ab0c4be67
commit
54acfe873c
68
ui/header/header.go
Normal file
68
ui/header/header.go
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
package header
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mrusme/gobbs/ui/ctx"
|
||||||
|
|
||||||
|
"github.com/charmbracelet/bubbles/spinner"
|
||||||
|
tea "github.com/charmbracelet/bubbletea"
|
||||||
|
"github.com/charmbracelet/lipgloss"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
highlight = lipgloss.AdaptiveColor{Light: "#874BFD", Dark: "#7D56F4"}
|
||||||
|
)
|
||||||
|
|
||||||
|
type Model struct {
|
||||||
|
ctx *ctx.Ctx
|
||||||
|
spinner spinner.Model
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewModel(c *ctx.Ctx) Model {
|
||||||
|
m := Model{
|
||||||
|
ctx: c,
|
||||||
|
}
|
||||||
|
|
||||||
|
m.spinner = spinner.New()
|
||||||
|
m.spinner.Spinner = spinner.Dot
|
||||||
|
m.spinner.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205"))
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Model) Init() tea.Cmd {
|
||||||
|
return m.spinner.Tick
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
|
||||||
|
var cmds []tea.Cmd
|
||||||
|
|
||||||
|
if m.ctx.Loading == true {
|
||||||
|
cmds = append(cmds, m.spinner.Tick)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch msg := msg.(type) {
|
||||||
|
case spinner.TickMsg:
|
||||||
|
var cmd tea.Cmd
|
||||||
|
m.spinner, cmd = m.spinner.Update(msg)
|
||||||
|
cmds = append(cmds, cmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
return m, tea.Batch(cmds...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Model) View() string {
|
||||||
|
var items []string
|
||||||
|
|
||||||
|
row := lipgloss.JoinHorizontal(
|
||||||
|
lipgloss.Top,
|
||||||
|
items...,
|
||||||
|
)
|
||||||
|
|
||||||
|
if m.ctx.Loading == false {
|
||||||
|
row = lipgloss.JoinHorizontal(lipgloss.Bottom, row, " THING HERE ")
|
||||||
|
} else {
|
||||||
|
row = lipgloss.JoinHorizontal(lipgloss.Bottom, row, " THING HERE ", " ", m.spinner.View())
|
||||||
|
}
|
||||||
|
|
||||||
|
return lipgloss.JoinHorizontal(lipgloss.Top, row, "\n\n")
|
||||||
|
}
|
@ -1,151 +0,0 @@
|
|||||||
package navigation
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/mrusme/gobbs/ui/ctx"
|
|
||||||
|
|
||||||
"github.com/charmbracelet/bubbles/spinner"
|
|
||||||
tea "github.com/charmbracelet/bubbletea"
|
|
||||||
"github.com/charmbracelet/lipgloss"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
highlight = lipgloss.AdaptiveColor{Light: "#874BFD", Dark: "#7D56F4"}
|
|
||||||
|
|
||||||
activeTabBorder = lipgloss.Border{
|
|
||||||
Top: "─",
|
|
||||||
Bottom: " ",
|
|
||||||
Left: "│",
|
|
||||||
Right: "│",
|
|
||||||
TopLeft: "╭",
|
|
||||||
TopRight: "╮",
|
|
||||||
BottomLeft: "┘",
|
|
||||||
BottomRight: "└",
|
|
||||||
}
|
|
||||||
|
|
||||||
tabBorder = lipgloss.Border{
|
|
||||||
Top: "─",
|
|
||||||
Bottom: "─",
|
|
||||||
Left: "│",
|
|
||||||
Right: "│",
|
|
||||||
TopLeft: "╭",
|
|
||||||
TopRight: "╮",
|
|
||||||
BottomLeft: "┴",
|
|
||||||
BottomRight: "┴",
|
|
||||||
}
|
|
||||||
|
|
||||||
tab = lipgloss.NewStyle().
|
|
||||||
Border(tabBorder, true).
|
|
||||||
BorderForeground(highlight).
|
|
||||||
Padding(0, 1)
|
|
||||||
|
|
||||||
activeTab = tab.Copy().Border(activeTabBorder, true)
|
|
||||||
|
|
||||||
tabGap = tab.Copy().
|
|
||||||
BorderTop(false).
|
|
||||||
BorderLeft(false).
|
|
||||||
BorderRight(false)
|
|
||||||
)
|
|
||||||
|
|
||||||
var Navigation = []string{}
|
|
||||||
|
|
||||||
type Model struct {
|
|
||||||
CurrentId int
|
|
||||||
ctx *ctx.Ctx
|
|
||||||
spinner spinner.Model
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewModel(c *ctx.Ctx) Model {
|
|
||||||
m := Model{
|
|
||||||
CurrentId: 0,
|
|
||||||
ctx: c,
|
|
||||||
}
|
|
||||||
|
|
||||||
m.spinner = spinner.New()
|
|
||||||
m.spinner.Spinner = spinner.Dot
|
|
||||||
m.spinner.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205"))
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m Model) Init() tea.Cmd {
|
|
||||||
return m.spinner.Tick
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
|
|
||||||
var cmds []tea.Cmd
|
|
||||||
|
|
||||||
if m.ctx.Loading == true {
|
|
||||||
cmds = append(cmds, m.spinner.Tick)
|
|
||||||
}
|
|
||||||
|
|
||||||
switch msg := msg.(type) {
|
|
||||||
case spinner.TickMsg:
|
|
||||||
var cmd tea.Cmd
|
|
||||||
m.spinner, cmd = m.spinner.Update(msg)
|
|
||||||
cmds = append(cmds, cmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, tea.Batch(cmds...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m Model) View() string {
|
|
||||||
var items []string
|
|
||||||
|
|
||||||
for i, nav := range Navigation {
|
|
||||||
if m.CurrentId == i {
|
|
||||||
items = append(items, activeTab.Render(nav))
|
|
||||||
} else {
|
|
||||||
items = append(items, tab.Render(nav))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
row := lipgloss.JoinHorizontal(
|
|
||||||
lipgloss.Top,
|
|
||||||
items...,
|
|
||||||
)
|
|
||||||
|
|
||||||
if m.ctx.Loading == false {
|
|
||||||
gap := tabGap.Render(strings.Repeat(" ", max(0, m.ctx.Screen[0]-lipgloss.Width(row)-2)))
|
|
||||||
row = lipgloss.JoinHorizontal(lipgloss.Bottom, row, gap)
|
|
||||||
} else {
|
|
||||||
gap := tabGap.Render(strings.Repeat(" ", max(0, m.ctx.Screen[0]-lipgloss.Width(row)-4)))
|
|
||||||
row = lipgloss.JoinHorizontal(lipgloss.Bottom, row, gap, " ", m.spinner.View())
|
|
||||||
}
|
|
||||||
|
|
||||||
return lipgloss.JoinHorizontal(lipgloss.Top, row, "\n\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
func max(a, b int) int {
|
|
||||||
if a > b {
|
|
||||||
return a
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Model) NthTab(nth int) {
|
|
||||||
if nth > len(Navigation) {
|
|
||||||
nth = len(Navigation)
|
|
||||||
} else if nth < 1 {
|
|
||||||
nth = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
m.CurrentId = nth - 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Model) PrevTab() {
|
|
||||||
m.CurrentId--
|
|
||||||
|
|
||||||
if m.CurrentId < 0 {
|
|
||||||
m.CurrentId = len(Navigation) - 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Model) NextTab() {
|
|
||||||
m.CurrentId++
|
|
||||||
|
|
||||||
if m.CurrentId >= len(Navigation) {
|
|
||||||
m.CurrentId = 0
|
|
||||||
}
|
|
||||||
}
|
|
35
ui/ui.go
35
ui/ui.go
@ -6,7 +6,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/mrusme/gobbs/ui/ctx"
|
"github.com/mrusme/gobbs/ui/ctx"
|
||||||
"github.com/mrusme/gobbs/ui/navigation"
|
"github.com/mrusme/gobbs/ui/header"
|
||||||
"github.com/mrusme/gobbs/ui/views/posts"
|
"github.com/mrusme/gobbs/ui/views/posts"
|
||||||
|
|
||||||
"github.com/mrusme/gobbs/ui/views"
|
"github.com/mrusme/gobbs/ui/views"
|
||||||
@ -16,21 +16,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type KeyMap struct {
|
type KeyMap struct {
|
||||||
FirstTab key.Binding
|
|
||||||
SecondTab key.Binding
|
|
||||||
ThirdTab key.Binding
|
|
||||||
FourthTab key.Binding
|
|
||||||
FifthTab key.Binding
|
|
||||||
SixthTab key.Binding
|
|
||||||
SeventhTab key.Binding
|
|
||||||
EightTab key.Binding
|
|
||||||
NinthTab key.Binding
|
|
||||||
TenthTab key.Binding
|
|
||||||
EleventhTab key.Binding
|
|
||||||
TwelfthTab key.Binding
|
|
||||||
ThirteenthTab key.Binding
|
|
||||||
PrevTab key.Binding
|
|
||||||
NextTab key.Binding
|
|
||||||
Up key.Binding
|
Up key.Binding
|
||||||
Down key.Binding
|
Down key.Binding
|
||||||
Quit key.Binding
|
Quit key.Binding
|
||||||
@ -53,18 +38,20 @@ var DefaultKeyMap = KeyMap{
|
|||||||
|
|
||||||
type Model struct {
|
type Model struct {
|
||||||
keymap KeyMap
|
keymap KeyMap
|
||||||
nav navigation.Model
|
header header.Model
|
||||||
views []views.View
|
views []views.View
|
||||||
|
currentView int
|
||||||
ctx *ctx.Ctx
|
ctx *ctx.Ctx
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewModel(c *ctx.Ctx) Model {
|
func NewModel(c *ctx.Ctx) Model {
|
||||||
m := Model{
|
m := Model{
|
||||||
keymap: DefaultKeyMap,
|
keymap: DefaultKeyMap,
|
||||||
|
currentView: 0,
|
||||||
ctx: c,
|
ctx: c,
|
||||||
}
|
}
|
||||||
|
|
||||||
m.nav = navigation.NewModel(m.ctx)
|
m.header = header.NewModel(m.ctx)
|
||||||
for _, capability := range (*m.ctx.Systems[0]).GetCapabilities() { // TODO
|
for _, capability := range (*m.ctx.Systems[0]).GetCapabilities() { // TODO
|
||||||
switch capability.ID {
|
switch capability.ID {
|
||||||
case "posts":
|
case "posts":
|
||||||
@ -102,12 +89,12 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
v, cmd := m.views[m.nav.CurrentId].Update(msg)
|
v, cmd := m.views[m.currentView].Update(msg)
|
||||||
m.views[m.nav.CurrentId] = v
|
m.views[m.currentView] = v
|
||||||
cmds = append(cmds, cmd)
|
cmds = append(cmds, cmd)
|
||||||
|
|
||||||
nav, cmd := m.nav.Update(msg)
|
header, cmd := m.header.Update(msg)
|
||||||
m.nav = nav
|
m.header = header
|
||||||
cmds = append(cmds, cmd)
|
cmds = append(cmds, cmd)
|
||||||
|
|
||||||
return m, tea.Batch(cmds...)
|
return m, tea.Batch(cmds...)
|
||||||
@ -115,8 +102,8 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
|
|
||||||
func (m Model) View() string {
|
func (m Model) View() string {
|
||||||
s := strings.Builder{}
|
s := strings.Builder{}
|
||||||
s.WriteString(m.nav.View() + "\n\n")
|
s.WriteString(m.header.View() + "\n\n")
|
||||||
s.WriteString(m.views[m.nav.CurrentId].View())
|
s.WriteString(m.views[m.currentView].View())
|
||||||
return s.String()
|
return s.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user