package tui import ( "os" "tui-ascii-mapper/internal/config" "tui-ascii-mapper/internal/mapio" "tui-ascii-mapper/internal/model" "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" ) type FilePickerState struct { Files []os.DirEntry CurDir string Selected int PopupX int PopupY int ListTop int } type ColorPickerState struct { Active bool Cursor model.Point Selected []string ForText bool GridX int GridY int } type AppModel struct { map_ *model.Map rootMap *model.Map cursor model.Point offset model.Point prevCursor model.Point tool model.Tool selected int brushWidth int unicode bool colorMode bool fillShapes bool mode model.Mode dialog model.DialogType ti textinput.Model lineStart model.Point linePreview []model.Point rectStart model.Point rectPreview []model.Point circleCenter model.Point circlePreview []model.Point textEditing bool textInput textinput.Model textColor string movingLabel int dragLabelOrigin model.Point dragMouseOrigin model.Point textCursorStart model.Point mouseDown bool mouseBtn int mouseStart model.Point lastPaint model.Point drawHeld bool eraseHeld bool undo *model.UndoStack width int height int quitting bool cfg config.Config dialogMsg string colorPicker *ColorPickerState dirty bool undoPosAtSave int hotkeySelect [10]int palettePage int filePicker *FilePickerState } func (m *AppModel) curMap() *model.Map { return m.map_ } func (m *AppModel) curPalette() []model.Terrain { if m.map_ != nil { return m.map_.Palette } return nil } func NewAppModel(cfg config.Config) *AppModel { palette := make([]model.Terrain, len(cfg.Symbols)) copy(palette, cfg.Symbols) root := model.NewMap("untitled", cfg.DefaultMapWidth, cfg.DefaultMapHeight, palette) undo := &model.UndoStack{} undo.Push(root) undoAtSave := undo.Pos() ti := textinput.New() ti.Placeholder = "" ti.Prompt = "" ti.CharLimit = 64 textTI := textinput.New() textTI.Placeholder = "" textTI.Prompt = "" textTI.CharLimit = 256 return &AppModel{ map_: root, rootMap: root, cursor: model.Point{X: 0, Y: 0}, prevCursor: model.Point{X: -1, Y: -1}, tool: model.ToolBrush, brushWidth: 1, selected: 0, unicode: true, colorMode: true, mode: model.ModeNormal, undo: undo, cfg: cfg, ti: ti, textInput: textTI, movingLabel: -1, lastPaint: model.Point{X: -1, Y: -1}, undoPosAtSave: undoAtSave, } } func (m *AppModel) Init() tea.Cmd { return tea.Batch( textinput.Blink, tea.EnableMouseCellMotion, ) } func (m *AppModel) loadMapCmd(path string) tea.Cmd { return func() tea.Msg { md, err := mapio.DeserializeMap(path) return mapLoadedMsg{data: md, err: err} } } type mapLoadedMsg struct { data *model.Map err error }