forked from varia/go-sh-manymanuals
wip: very dodgy attempt at styles
This commit is contained in:
parent
6fd65285ae
commit
6bbd94cba6
57
gshmm.go
57
gshmm.go
@ -4,6 +4,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@ -15,6 +16,7 @@ import (
|
|||||||
"github.com/charmbracelet/lipgloss"
|
"github.com/charmbracelet/lipgloss"
|
||||||
pdf "github.com/johbar/go-poppler"
|
pdf "github.com/johbar/go-poppler"
|
||||||
"github.com/sahilm/fuzzy"
|
"github.com/sahilm/fuzzy"
|
||||||
|
"golang.org/x/term"
|
||||||
)
|
)
|
||||||
|
|
||||||
// filenameFilterMode searches by PDF file name.
|
// filenameFilterMode searches by PDF file name.
|
||||||
@ -68,16 +70,16 @@ func readPDF(name string) (string, error) {
|
|||||||
// model offers the core of the state for the entire UI.
|
// model offers the core of the state for the entire UI.
|
||||||
type model struct {
|
type model struct {
|
||||||
input textinput.Model // Fuzzy search interface
|
input textinput.Model // Fuzzy search interface
|
||||||
|
filterMode string // The filtering mode ("filename", "content")
|
||||||
|
|
||||||
datasheets []datasheet // All datasheets under cwd
|
datasheets []datasheet // All datasheets under cwd
|
||||||
datasheetNames []string // All datasheet names (caching)
|
datasheetNames []string // All datasheet names (caching)
|
||||||
|
datasheetsStyle lipgloss.Style // Style to use for listing datasheets
|
||||||
filteredDatasheets []string // Filtered view on all datasheets
|
filteredDatasheets []string // Filtered view on all datasheets
|
||||||
loadDatasheetSpinner spinner.Model // Spinner to show while loading datasheets
|
loadDatasheetSpinner spinner.Model // Spinner to show while loading datasheets
|
||||||
datasheetsLoaded bool // Whether or not the datasheets are loaded or not
|
datasheetsLoaded bool // Whether or not the datasheets are loaded or not
|
||||||
|
|
||||||
datasheetViewport viewport.Model // Viewport for the PDF content
|
datasheetViewport viewport.Model // Viewport for the PDF content
|
||||||
|
datasheetViewportStyle lipgloss.Style // Style to show while showing datasheet viewport
|
||||||
filterMode string // The filtering mode ("filename", "content")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// datasheetFromName retrieves a datasheet via a name.
|
// datasheetFromName retrieves a datasheet via a name.
|
||||||
@ -107,25 +109,38 @@ type datasheet struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// initialModel constucts an initial state for the UI.
|
// initialModel constucts an initial state for the UI.
|
||||||
func initialModel() model {
|
func initialModel(width int, height int) model {
|
||||||
input := textinput.New()
|
input := textinput.New()
|
||||||
input.Focus()
|
input.Focus()
|
||||||
|
|
||||||
// TODO: set width/heigh to match terminal. this should also
|
datasheetViewport := viewport.New(width/2+20, height/2)
|
||||||
// be set in relation to the list of filenames also. they
|
datasheetViewportStyle := lipgloss.NewStyle().
|
||||||
// should have some visually pleasing ratio set i imagine
|
BorderStyle(lipgloss.NormalBorder()).
|
||||||
viewp := viewport.New(60, 30)
|
BorderForeground(lipgloss.Color("63")).
|
||||||
|
Padding(2)
|
||||||
|
|
||||||
loadDatasheetSpinner := spinner.New()
|
loadDatasheetSpinner := spinner.New()
|
||||||
loadDatasheetSpinner.Spinner = spinner.Dot
|
loadDatasheetSpinner.Spinner = spinner.Dot
|
||||||
loadDatasheetSpinner.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205"))
|
loadDatasheetSpinner.Style = lipgloss.NewStyle().
|
||||||
|
Foreground(lipgloss.Color("205"))
|
||||||
|
|
||||||
|
datasheetsStyle := lipgloss.NewStyle().
|
||||||
|
Width(width/2 - 30).
|
||||||
|
Height(height/2 - 30).
|
||||||
|
MarginRight(2).
|
||||||
|
BorderStyle(lipgloss.NormalBorder()).
|
||||||
|
BorderForeground(lipgloss.Color("63")).
|
||||||
|
Padding(2)
|
||||||
|
|
||||||
m := model{
|
m := model{
|
||||||
input: input,
|
input: input,
|
||||||
|
filterMode: filenameFilterMode,
|
||||||
|
|
||||||
datasheetsLoaded: false,
|
datasheetsLoaded: false,
|
||||||
loadDatasheetSpinner: loadDatasheetSpinner,
|
loadDatasheetSpinner: loadDatasheetSpinner,
|
||||||
datasheetViewport: viewp,
|
datasheetViewport: datasheetViewport,
|
||||||
filterMode: filenameFilterMode,
|
datasheetViewportStyle: datasheetViewportStyle,
|
||||||
|
datasheetsStyle: datasheetsStyle,
|
||||||
}
|
}
|
||||||
|
|
||||||
return m
|
return m
|
||||||
@ -235,7 +250,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
m.datasheetViewport.SetContent(viewportText)
|
m.datasheetViewport.SetContent(viewportText)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: handle terminal resizing
|
|
||||||
switch msg := msg.(type) {
|
switch msg := msg.(type) {
|
||||||
case loadedDatasheetsMsg:
|
case loadedDatasheetsMsg:
|
||||||
m.datasheets = msg.datasheets
|
m.datasheets = msg.datasheets
|
||||||
@ -246,6 +260,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
m.datasheetViewport.SetContent(selectedDatasheet)
|
m.datasheetViewport.SetContent(selectedDatasheet)
|
||||||
|
|
||||||
m.datasheetsLoaded = true
|
m.datasheetsLoaded = true
|
||||||
|
case tea.WindowSizeMsg:
|
||||||
|
// TODO: handle terminal resizing
|
||||||
|
// resize listing / viewport
|
||||||
case tea.KeyMsg:
|
case tea.KeyMsg:
|
||||||
switch msg.String() {
|
switch msg.String() {
|
||||||
case "ctrl+c":
|
case "ctrl+c":
|
||||||
@ -271,7 +288,11 @@ func (m model) View() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: style further with lipgloss, e.g. borders, margins, etc.
|
// TODO: style further with lipgloss, e.g. borders, margins, etc.
|
||||||
panes := lipgloss.JoinHorizontal(lipgloss.Left, sheets, m.datasheetViewport.View())
|
panes := lipgloss.JoinHorizontal(
|
||||||
|
lipgloss.Left,
|
||||||
|
m.datasheetsStyle.Render(sheets),
|
||||||
|
m.datasheetViewportStyle.Render(m.datasheetViewport.View()),
|
||||||
|
)
|
||||||
|
|
||||||
body.WriteString(panes)
|
body.WriteString(panes)
|
||||||
|
|
||||||
@ -303,13 +324,17 @@ func main() {
|
|||||||
|
|
||||||
f, err := tea.LogToFile("debug.log", "debug")
|
f, err := tea.LogToFile("debug.log", "debug")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("fatal:", err)
|
log.Fatal(err)
|
||||||
os.Exit(1)
|
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
|
width, height, err := term.GetSize(0)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
p := tea.NewProgram(
|
p := tea.NewProgram(
|
||||||
initialModel(),
|
initialModel(width, height),
|
||||||
tea.WithAltScreen(),
|
tea.WithAltScreen(),
|
||||||
tea.WithMouseCellMotion(),
|
tea.WithMouseCellMotion(),
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user