package ui import ( "fmt" "github.com/rivo/tview" "git.warky.dev/wdevs/relspecgo/pkg/models" ) // SchemaEditor represents the interactive schema editor type SchemaEditor struct { db *models.Database app *tview.Application pages *tview.Pages loadConfig *LoadConfig saveConfig *SaveConfig } // NewSchemaEditor creates a new schema editor func NewSchemaEditor(db *models.Database) *SchemaEditor { return &SchemaEditor{ db: db, app: tview.NewApplication(), pages: tview.NewPages(), loadConfig: nil, saveConfig: nil, } } // NewSchemaEditorWithConfigs creates a new schema editor with load/save configurations func NewSchemaEditorWithConfigs(db *models.Database, loadConfig *LoadConfig, saveConfig *SaveConfig) *SchemaEditor { return &SchemaEditor{ db: db, app: tview.NewApplication(), pages: tview.NewPages(), loadConfig: loadConfig, saveConfig: saveConfig, } } // Run starts the interactive editor func (se *SchemaEditor) Run() error { // If no database is loaded, show load screen if se.db == nil { se.showLoadScreen() } else { // Create main menu view mainMenu := se.createMainMenu() se.pages.AddPage("main", mainMenu, true, true) } // Run the application if err := se.app.SetRoot(se.pages, true).Run(); err != nil { return fmt.Errorf("application error: %w", err) } return nil } // GetDatabase returns the current database func (se *SchemaEditor) GetDatabase() *models.Database { return se.db } // Helper function to get sorted column names func getColumnNames(table *models.Table) []string { names := make([]string, 0, len(table.Columns)) for name := range table.Columns { names = append(names, name) } return names }