mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-24 11:14:23 +01:00
wip: refactoring tui
This commit is contained in:
@@ -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,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
58
internal/tui/components/qr/qr.go
Normal file
58
internal/tui/components/qr/qr.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user