From 4a0d94e4893cd77a0bb498b355d3e1b3cbeed2df Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Wed, 27 Nov 2024 22:04:55 +0200 Subject: Worked on the UI for the network list --- internal/client/ui/colors/colors.go | 4 + internal/client/ui/core/core.go | 125 ++++++++++++--------- .../ui/core/networkcreation/networkcreation.go | 4 +- internal/client/ui/core/networklist/networklist.go | 63 +++++++++++ internal/client/ui/core/networks/networks.go | 95 ---------------- internal/client/ui/core/state/state.go | 14 +++ 6 files changed, 154 insertions(+), 151 deletions(-) create mode 100644 internal/client/ui/core/networklist/networklist.go delete mode 100644 internal/client/ui/core/networks/networks.go create mode 100644 internal/client/ui/core/state/state.go (limited to 'internal/client') diff --git a/internal/client/ui/colors/colors.go b/internal/client/ui/colors/colors.go index 67d91fc..bd4e708 100644 --- a/internal/client/ui/colors/colors.go +++ b/internal/client/ui/colors/colors.go @@ -11,11 +11,15 @@ var ( LightBlue = lipgloss.Color("#5874FF") Blue = lipgloss.Color("#0029f5") DarkCyan = lipgloss.Color("#007E8A") + DarkerCyan = lipgloss.Color("#005d66") DarkMidnightBlue = lipgloss.Color("#1E1E2E") Turquoise = lipgloss.Color("#54D7A9") Red = lipgloss.Color("#F16265") White = lipgloss.Color("#FFFFFF") Black = lipgloss.Color("#000000") + Green = lipgloss.Color("#46d46c") + Purple = lipgloss.Color("#BB91F0") + DarkPurple = lipgloss.Color("#87123d") Background = DarkMidnightBlue Error = Red diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go index 1f86121..737029f 100644 --- a/internal/client/ui/core/core.go +++ b/internal/client/ui/core/core.go @@ -12,8 +12,10 @@ import ( "github.com/kyren223/eko/internal/client/gateway" "github.com/kyren223/eko/internal/client/ui" "github.com/kyren223/eko/internal/client/ui/core/networkcreation" - "github.com/kyren223/eko/internal/client/ui/core/networks" + "github.com/kyren223/eko/internal/client/ui/core/networklist" + "github.com/kyren223/eko/internal/client/ui/core/state" "github.com/kyren223/eko/internal/client/ui/loadscreen" + "github.com/kyren223/eko/internal/packet" "github.com/kyren223/eko/pkg/snowflake" ) @@ -29,11 +31,11 @@ type Model struct { name string privKey ed25519.PrivateKey - networks networks.Model - loading loadscreen.Model - timer timer.Model - timeout time.Duration - connected bool + networkList networklist.Model + loading loadscreen.Model + timer timer.Model + timeout time.Duration + connected bool id snowflake.ID @@ -42,13 +44,13 @@ type Model struct { func New(privKey ed25519.PrivateKey, name string) Model { return Model{ - name: name, - privKey: privKey, - networks: networks.New(), - loading: loadscreen.New(connectingToServer), - timer: newTimer(initialTimeout), - timeout: initialTimeout, - connected: false, + name: name, + privKey: privKey, + networkList: networklist.New(), + loading: loadscreen.New(connectingToServer), + timer: newTimer(initialTimeout), + timeout: initialTimeout, + connected: false, } } @@ -61,7 +63,7 @@ func (m Model) View() string { return m.loading.View() } - result := m.networks.View() + result := m.networkList.View() result = lipgloss.Place( ui.Width, ui.Height, @@ -80,50 +82,65 @@ func (m Model) View() string { } func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - if !m.connected { - switch msg := msg.(type) { - case gateway.ConnectionEstablished: - m.id = snowflake.ID(msg) - m.connected = true - m.timeout = initialTimeout - return m, m.timer.Stop() - - case gateway.ConnectionFailed: - m.timer = newTimer(m.timeout) - m.updateLoadScreenContent() - return m, m.timer.Start() - - case timer.TimeoutMsg: - m.timeout = min(m.timeout*2, time.Minute) - m.loading.SetContent(connectingToServer) - return m, gateway.Connect(m.privKey, connectionTimeout) - - case timer.StartStopMsg: - var cmd tea.Cmd - m.timer, cmd = m.timer.Update(msg) - return m, cmd - - case timer.TickMsg: - m.updateLoadScreenContent() - var cmd tea.Cmd - m.timer, cmd = m.timer.Update(msg) - return m, cmd - - case spinner.TickMsg: - var loadscreenCmd tea.Cmd - m.loading, loadscreenCmd = m.loading.Update(msg) - return m, loadscreenCmd + if m.connected { + cmd := m.updateConnected(msg) + return m, cmd + } else { + cmd := m.updateNotConnected(msg) + return m, cmd + } +} - default: - return m, nil - } +func (m *Model) updateNotConnected(msg tea.Msg) tea.Cmd { + switch msg := msg.(type) { + case gateway.ConnectionEstablished: + m.id = snowflake.ID(msg) + m.connected = true + m.timeout = initialTimeout + return m.timer.Stop() + + case gateway.ConnectionFailed: + m.timer = newTimer(m.timeout) + m.updateLoadScreenContent() + return m.timer.Start() + + case timer.TimeoutMsg: + m.timeout = min(m.timeout*2, time.Minute) + m.loading.SetContent(connectingToServer) + return gateway.Connect(m.privKey, connectionTimeout) + + case timer.StartStopMsg: + var cmd tea.Cmd + m.timer, cmd = m.timer.Update(msg) + return cmd + + case timer.TickMsg: + m.updateLoadScreenContent() + var cmd tea.Cmd + m.timer, cmd = m.timer.Update(msg) + return cmd + + case spinner.TickMsg: + var loadscreenCmd tea.Cmd + m.loading, loadscreenCmd = m.loading.Update(msg) + return loadscreenCmd + + default: + return nil } +} +func (m *Model) updateConnected(msg tea.Msg) tea.Cmd { switch msg := msg.(type) { case gateway.ConnectionLost: m.connected = false m.timeout = initialTimeout - return m, tea.Batch(gateway.Connect(m.privKey, connectionTimeout), m.loading.Init()) + return tea.Batch(gateway.Connect(m.privKey, connectionTimeout), m.loading.Init()) + + case *packet.NetworksInfo: + for _, network := range msg.Networks { + state.State.Networks[network.ID] = network + } case ui.QuitMsg: gateway.Disconnect() @@ -148,19 +165,19 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if cmd != nil { m.networkCreationPopup = nil } - return m, cmd + return cmd } default: if m.networkCreationPopup != nil { popup, cmd := m.networkCreationPopup.Update(msg) m.networkCreationPopup = &popup - return m, cmd + return cmd } } } - return m, nil + return nil } func (m *Model) updateLoadScreenContent() { diff --git a/internal/client/ui/core/networkcreation/networkcreation.go b/internal/client/ui/core/networkcreation/networkcreation.go index b7f76d4..4575143 100644 --- a/internal/client/ui/core/networkcreation/networkcreation.go +++ b/internal/client/ui/core/networkcreation/networkcreation.go @@ -9,7 +9,7 @@ import ( "github.com/charmbracelet/lipgloss" "github.com/kyren223/eko/internal/client/gateway" "github.com/kyren223/eko/internal/client/ui/colors" - "github.com/kyren223/eko/internal/client/ui/core/networks" + "github.com/kyren223/eko/internal/client/ui/core/networklist" "github.com/kyren223/eko/internal/client/ui/field" "github.com/kyren223/eko/internal/client/ui/layouts/flex" "github.com/kyren223/eko/internal/packet" @@ -156,7 +156,7 @@ func (m Model) Init() tea.Cmd { func (m Model) View() string { name := m.name.View() - iconPreview := networks.IconStyle(m.lastFg, m.lastBg).Render(m.icon.Value()) + iconPreview := networklist.IconStyle(m.lastFg, m.lastBg).Render(m.icon.Value()) iconPreview = lipgloss.NewStyle().Width(m.nameWidth).Align(lipgloss.Center).Render(iconPreview) color := colors.Gray diff --git a/internal/client/ui/core/networklist/networklist.go b/internal/client/ui/core/networklist/networklist.go new file mode 100644 index 0000000..7b191e8 --- /dev/null +++ b/internal/client/ui/core/networklist/networklist.go @@ -0,0 +1,63 @@ +package networklist + +import ( + "strings" + + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" + "github.com/kyren223/eko/internal/client/ui" + "github.com/kyren223/eko/internal/client/ui/colors" + "github.com/kyren223/eko/internal/client/ui/core/state" +) + +var ( + style = lipgloss.NewStyle().Border(lipgloss.ThickBorder(), true, false) + partialIconStyle = lipgloss.NewStyle().Width(6).Height(3).PaddingTop(1).Margin(0, 1). + Align(lipgloss.Center). + Border(lipgloss.ThickBorder(), false, false) + trustedUsersButton = IconStyle(lipgloss.Color(colors.Turquoise), lipgloss.Color(colors.DarkerCyan)). + MarginBottom(1).Render(" ") +) + +func IconStyle(fg, bg lipgloss.Color) lipgloss.Style { + return partialIconStyle.Foreground(fg).Background(bg) +} + +type Model struct{} + +func New() Model { + return Model{} +} + +func (m Model) Init() tea.Cmd { + return nil +} + +func (m Model) View() string { + // border := lipgloss.ThickBorder() + var builder strings.Builder + + // top := strings.Repeat(border.Top, 6) + // builder.WriteString(fmt.Sprintf("%s%s%s\n", border.TopLeft, top, border.TopRight)) + builder.WriteString("\n") + builder.WriteString(trustedUsersButton) + builder.WriteString("\n") + for _, network := range state.State.Networks { + builder.WriteString(IconStyle(lipgloss.Color(network.FgHexColor), lipgloss.Color(network.BgHexColor)). + MarginBottom(1).Render(network.Icon)) + builder.WriteString("\n") + } + // bottom := strings.Repeat(border.Bottom, 6) + // builder.WriteString(fmt.Sprintf("\n%s%s%s", border.BottomLeft, bottom, border.BottomRight)) + + result := builder.String() + + sep := lipgloss.NewStyle().Border(lipgloss.ThickBorder(), false, true, false, false).Height(ui.Height).Width(0) + result = lipgloss.JoinHorizontal(lipgloss.Top, result, sep.Render("")) + + return result +} + +func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { + return m, nil +} diff --git a/internal/client/ui/core/networks/networks.go b/internal/client/ui/core/networks/networks.go deleted file mode 100644 index 5de9f38..0000000 --- a/internal/client/ui/core/networks/networks.go +++ /dev/null @@ -1,95 +0,0 @@ -package networks - -import ( - "strings" - - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - "github.com/kyren223/eko/internal/client/ui" - "github.com/kyren223/eko/internal/data" -) - -var ( - style = lipgloss.NewStyle().Border(lipgloss.ThickBorder(), true, false) - partialIconStyle = lipgloss.NewStyle().Width(6).Height(3).PaddingTop(1).Margin(0, 1). - Align(lipgloss.Center). - Border(lipgloss.ThickBorder(), false, false) - networks = []string{ - "󰜈 ", - " ", - "Kr", - " ", - // "Test", - // "██████\n██████\n██████", - // " ▄▄▄▄ \n █ █ \n ▀▀▀▀ ", - // " \n 󰜈 \n ", - // "Hmm", - // "Another", - } - - reverse = lipgloss.NewStyle().Foreground(lipgloss.Color("#20999D")) - // Render("") - - label1 = lipgloss.NewStyle(). - Background(lipgloss.Color("#20999D")).Foreground(lipgloss.Color("#000000")). - Padding(0, 1). - Bold(true). - Render("󰜈") - label2 = reverse.Render("") + label1 + reverse.Render("") - label3 = "" - label4 = lipgloss.NewStyle(). - Foreground(lipgloss.Color("#20999D")). - Bold(true). - Render("󰜈") - - name = lipgloss.NewStyle(). - Bold(true). - Render("Kyren223") - user = lipgloss.JoinHorizontal(lipgloss.Center, label4, " ", name) -) - -func IconStyle(fg, bg lipgloss.Color) lipgloss.Style { - return partialIconStyle.Foreground(fg).Background(bg) -} - -type Model struct { - networks []string - a data.Network -} - -func New() Model { - return Model{ - networks: networks, - } -} - -func (m Model) Init() tea.Cmd { - return nil -} - -func (m Model) View() string { - // border := lipgloss.ThickBorder() - var builder strings.Builder - - // top := strings.Repeat(border.Top, 6) - // builder.WriteString(fmt.Sprintf("%s%s%s\n", border.TopLeft, top, border.TopRight)) - builder.WriteString("\n") - for _, network := range m.networks { - builder.WriteString(IconStyle(lipgloss.Color("#ffbf00"), lipgloss.Color("#4a3d5c")). - MarginBottom(1).Render(network)) - builder.WriteString("\n") - } - // bottom := strings.Repeat(border.Bottom, 6) - // builder.WriteString(fmt.Sprintf("\n%s%s%s", border.BottomLeft, bottom, border.BottomRight)) - - result := builder.String() - - sep := lipgloss.NewStyle().Border(lipgloss.ThickBorder(), false, true, false, false).Height(ui.Height).Width(0) - result = lipgloss.JoinHorizontal(lipgloss.Top, result, sep.Render("")) - - return result + user -} - -func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { - return m, nil -} diff --git a/internal/client/ui/core/state/state.go b/internal/client/ui/core/state/state.go new file mode 100644 index 0000000..eeba245 --- /dev/null +++ b/internal/client/ui/core/state/state.go @@ -0,0 +1,14 @@ +package state + +import ( + "github.com/kyren223/eko/internal/packet" + "github.com/kyren223/eko/pkg/snowflake" +) + +type state struct { + Networks map[snowflake.ID]packet.FullNetwork +} + +var State state = state{ + Networks: make(map[snowflake.ID]packet.FullNetwork), +} -- cgit v1.3.1