wip: refactoring tui

This commit is contained in:
adamdottv
2025-05-30 08:29:37 -05:00
parent 189d0e5fb2
commit 9bf024f8be
4 changed files with 68 additions and 3 deletions

View File

@@ -9,6 +9,7 @@ import (
"github.com/charmbracelet/lipgloss"
"github.com/sst/opencode/internal/config"
"github.com/sst/opencode/internal/tui/app"
"github.com/sst/opencode/internal/tui/components/qr"
"github.com/sst/opencode/internal/tui/state"
"github.com/sst/opencode/internal/tui/styles"
"github.com/sst/opencode/internal/tui/theme"
@@ -52,6 +53,11 @@ func (m *sidebarCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
func (m *sidebarCmp) View() string {
baseStyle := styles.BaseStyle()
qrcode := ""
if m.app.Session.ShareID != nil {
url := "https://dev.opencode.ai/share?id="
qrcode, _, _ = qr.Generate(url + m.app.Session.Id)
}
return baseStyle.
Width(m.width).
@@ -64,9 +70,7 @@ func (m *sidebarCmp) View() string {
" ",
m.sessionSection(),
" ",
lspsConfigured(m.width),
" ",
m.modifiedFiles(),
qrcode,
),
)
}

View File

@@ -0,0 +1,58 @@
package qr
import (
"strings"
"github.com/charmbracelet/lipgloss"
"github.com/sst/opencode/internal/tui/theme"
"rsc.io/qr"
)
var tops_bottoms = []rune{' ', '▀', '▄', '█'}
// Generate a text string to a QR code, which you can write to a terminal or file.
func Generate(text string) (string, int, error) {
code, err := qr.Encode(text, qr.Level(0))
if err != nil {
return "", 0, err
}
t := theme.CurrentTheme()
if t == nil {
return "", 0, err
}
// Create lipgloss style for QR code with theme colors
qrStyle := lipgloss.NewStyle().
Foreground(t.Text()).
Background(t.Background())
var result strings.Builder
// content
for y := 0; y < code.Size-1; y += 2 {
var line strings.Builder
for x := 0; x < code.Size; x += 1 {
var num int8
if code.Black(x, y) {
num += 1
}
if code.Black(x, y+1) {
num += 2
}
line.WriteRune(tops_bottoms[num])
}
result.WriteString(qrStyle.Render(line.String()) + "\n")
}
// add lower border when required (only required when QR size is odd)
if code.Size%2 == 1 {
var borderLine strings.Builder
for range code.Size {
borderLine.WriteRune('▀')
}
result.WriteString(qrStyle.Render(borderLine.String()) + "\n")
}
return result.String(), code.Size, nil
}