first draft of miasma installer
This commit is contained in:
94
tui/steps/disk_sel.go
Normal file
94
tui/steps/disk_sel.go
Normal file
@@ -0,0 +1,94 @@
|
||||
package steps
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"miasma-installer/tui/styles"
|
||||
|
||||
"github.com/charmbracelet/bubbles/list"
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
)
|
||||
|
||||
type Disk struct {
|
||||
name, description string
|
||||
}
|
||||
|
||||
func (i Disk) FilterValue() string { return i.name }
|
||||
func (i Disk) Title() string { return i.name }
|
||||
func (i Disk) Description() string { return i.description }
|
||||
|
||||
type ItemDelegate struct{}
|
||||
|
||||
func (i ItemDelegate) Height() int { return 1 }
|
||||
func (i ItemDelegate) Width() int { return 0 }
|
||||
func (i ItemDelegate) Update(msg tea.Msg, m list.Model) tea.Cmd { return nil }
|
||||
func (i ItemDelegate) Render(w io.Writer, m list.Model, index int, item list.Item) {
|
||||
i, ok := item.(Disk)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
s := fmt.Sprintf("%d. %s - %s", index+1, i.Title(), i.Description())
|
||||
|
||||
// focus styles
|
||||
if index == m.Index() {
|
||||
s = styles.ActiveItemStyle.Render("> " + s)
|
||||
} else {
|
||||
s = styles.InactiveItemStyle.Render(" " + s)
|
||||
}
|
||||
fmt.Fprint(w, s)
|
||||
}
|
||||
|
||||
type DiskSelModel struct {
|
||||
list list.Model
|
||||
Finished bool
|
||||
SelectedDisk string
|
||||
}
|
||||
|
||||
func NewDiskSelModel(width, height int) DiskSelModel {
|
||||
// This is a placeholder - I need to update this to a tea.Cmd to scan the system for drives
|
||||
disks := []list.Item{
|
||||
Disk{name: "/dev/sda", description: "500GB Samsung NVME"},
|
||||
Disk{name: "/dev/sdb", description: "1TB Baracuda HDD"},
|
||||
Disk{name: "/dev/loop0", description: "2GB Fanxiang SSD"},
|
||||
}
|
||||
|
||||
l := list.New(disks, itemDelegate{}, width, height-5)
|
||||
l.Title = styles.TitleStyle.Render("Select Installation Disk")
|
||||
l.SetShowStatusBar(false)
|
||||
l.SetFilterEnabled(false)
|
||||
l.Styles.Title = styles.TitleStyle
|
||||
l.KeyMap.Unbind()
|
||||
|
||||
return DiskSelModel{list: l}
|
||||
}
|
||||
|
||||
func (m DiskSelModel) Init() tea.Cmd {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m DiskSelModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
if m.Finished {
|
||||
return m, nil
|
||||
}
|
||||
|
||||
switch msg := msg.(type) {
|
||||
case tea.KeyMsg:
|
||||
if msg.String() == "enter" {
|
||||
if item, ok := m.list.SelectedItem().(Disk); ok {
|
||||
m.SelectedDisk = item.name
|
||||
m.Finished = true
|
||||
return m, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
var cmd tea.Cmd
|
||||
m.list, cmd = m.list.Update(msg)
|
||||
return m, cmd
|
||||
}
|
||||
|
||||
func (m DiskSelModel) View() string {
|
||||
s := m.list.View()
|
||||
s += "\n" + styles.HelpStyle.Render("Use ↑/↓ to navigate, [Enter] to select disk.")
|
||||
return s
|
||||
}
|
||||
Reference in New Issue
Block a user