diff options
Diffstat (limited to 'poe.go')
-rw-r--r-- | poe.go | 240 |
1 files changed, 13 insertions, 227 deletions
@@ -4,155 +4,27 @@ import ( "flag" "fmt" "os" - "path/filepath" "runtime" - "github.com/gdamore/tcell" - "github.com/prodhe/poe/gapbuffer" + "github.com/prodhe/poe/editor" + "github.com/prodhe/poe/ui" ) -const ( - FnMessageWin = "+poe" - FnEmptyWin = "" - RuneWidthZero = '?' -) - -var ( - // Main screen terminal - screen tcell.Screen - - // menu is the main tagline above everything else - menu *View - - // workspace contains windows. - workspace *Workspace - - // CurWin is a pointer to the currently focused window. - CurWin *Window - - // Channels - events chan tcell.Event - quit chan bool - - // baseDir stores the dir from which the program started in - baseDir string -) - -// InitScreen initializes the tcell terminal. -func InitScreen() { - var err error - screen, err = tcell.NewScreen() - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) - } - if err = screen.Init(); err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) - } - screen.SetStyle(bodyStyle) - screen.EnableMouse() - screen.Clear() - screen.Sync() -} - -func InitMenu() { - menu = &View{ - text: &Text{buf: gapbuffer.New()}, - what: ViewMenu, - style: bodyStyle, - cursorStyle: bodyCursorStyle, - hilightStyle: bodyHilightStyle, - tabstop: 4, - } - fmt.Fprintf(menu, "Exit New Newcol") -} - -func InitWorkspace() { - workspace = &Workspace{} // first resize event will set proper dimensions - workspace.AddCol() -} - -// LoadBuffers reads files from disk and loads them into windows. Screen need to be initialized. -func LoadBuffers(fns []string) { - if len(fns) < 1 { - fns = append(fns, FnEmptyWin) - } - - // setup windows - for i, fn := range fns { - win := NewWindow(fn) - win.LoadBuffer() - if i == 0 { // first window gets focus - CurWin = win - } - workspace.Col(0).AddWindow(win) - } - - // add a base directory listing in new col - workspace.AddCol() - CmdOpen(baseDir) -} - -func printMsg(format string, a ...interface{}) { - // get output window - var poewin *Window - for _, win := range AllWindows() { - poename := win.Dir() + string(filepath.Separator) + FnMessageWin - poename = filepath.Clean(poename) - if win.NameAbs() == poename && CurWin.Dir() == win.Dir() { - poewin = win - } - } - - if poewin == nil { - poewin = NewWindow(CurWin.Dir() + string(filepath.Separator) + FnMessageWin) - poewin.body.what = ViewScratch - - if len(workspace.cols) < 2 { - workspace.AddCol() - } - workspace.LastCol().AddWindow(poewin) - } - - poewin.body.SetCursor(poewin.body.text.buf.Len(), 0) - - if a == nil { - fmt.Fprintf(poewin.body, format) - return - } - fmt.Fprintf(poewin.body, format, a...) - -} - -func Redraw() { - menu.Draw() - workspace.Draw() - screen.Show() -} - func main() { flag.Parse() - // store current working dir - var err error - baseDir, err = filepath.Abs(".") - if err != nil { - fmt.Println(err) - os.Exit(1) - } - //baseDir += string(filepath.Separator) + e := editor.New() + + e.LoadBuffers(flag.Args()) - // Init - InitStyles() - InitScreen() + ui := ui.NewTcell() + //ui := ui.NewCli() + ui.Init(e) - // proper closing and terminal cleanup on exit and error message on a possible panic + // close ui and show stack trace on panic defer func() { - if screen != nil { - screen.Clear() - screen.Fini() - } + ui.Close() + if err := recover(); err != nil { buf := make([]byte, 1<<16) n := runtime.Stack(buf, true) @@ -162,92 +34,6 @@ func main() { } }() - // Setup top menu - InitMenu() - - // Create initial workspace - InitWorkspace() - - InitCommands() - - // This loads all buffers reading file names from command line and populates the workspace. - LoadBuffers(flag.Args()) - - events = make(chan tcell.Event, 100) - quit = make(chan bool, 1) - - go func() { - for { - if screen != nil { - events <- screen.PollEvent() - } - } - }() - - // main loop -loop: - for { - Redraw() - - // Check for events - var event tcell.Event - select { - case <-quit: - break loop - case event = <-events: - } - - for event != nil { - switch e := event.(type) { - case *tcell.EventResize: - w, h := screen.Size() - menu.Resize(0, 0, w, 1) - workspace.Resize(0, 1, w, h-1) - screen.Clear() - screen.Sync() - case *tcell.EventKey: // system wide shortcuts - switch e.Key() { - case tcell.KeyCtrlL: // refresh terminal - screen.Clear() - screen.Sync() - default: // let the focused view handle event - if menu.focused { - menu.HandleEvent(e) - break - } - CurWin.HandleEvent(e) - } - case *tcell.EventMouse: - mx, my := e.Position() - - // find which window to send the event to - for _, win := range AllWindows() { - win.UnFocus() - if mx >= win.x && mx < win.x+win.w && - my >= win.y && my < win.y+win.h { - CurWin = win - } - } - - // check if we are in the menu - menu.focused = false - if my < 1 { - menu.focused = true - menu.HandleEvent(e) - break - } - - CurWin.HandleEvent(e) - } - - event = nil - - // check tcell event queue before returning to main event check - select { - case event = <-events: - default: - event = nil - } - } - } + // This will loop and listen on chosen UI. + ui.Listen() } |