]> git.lizzy.rs Git - micro.git/blobdiff - cmd/micro/messenger.go
Use messenger error instead of termerror
[micro.git] / cmd / micro / messenger.go
index 36e46889b577f937d56df7d07f8e108dcf587076..3fda5368fc092925c8c696c4fe963ee6058f514e 100644 (file)
@@ -21,10 +21,10 @@ func TermMessage(msg ...interface{}) {
        screenWasNil := screen == nil
        if !screenWasNil {
                screen.Fini()
+               screen = nil
        }
 
        fmt.Println(msg...)
-       messenger.AddLog(fmt.Sprint(msg...))
        fmt.Print("\nPress enter to continue")
 
        reader := bufio.NewReader(os.Stdin)
@@ -78,44 +78,76 @@ func (m *Messenger) AddLog(msg string) {
 
 func (m *Messenger) getBuffer() *Buffer {
        if m.log == nil {
-               m.log = NewBuffer([]byte{}, "")
-               m.log.Name = "Log"
+               m.log = NewBufferFromString("", "")
+               m.log.name = "Log"
        }
        return m.log
 }
 
 // Message sends a message to the user
 func (m *Messenger) Message(msg ...interface{}) {
-       m.message = fmt.Sprint(msg...)
-       m.style = defStyle
+       displayMessage := fmt.Sprint(msg...)
+       // only display a new message if there isn't an active prompt
+       // this is to prevent overwriting an existing prompt to the user
+       if m.hasPrompt == false {
+               // if there is no active prompt then style and display the message as normal
+               m.message = displayMessage
 
-       if _, ok := colorscheme["message"]; ok {
-               m.style = colorscheme["message"]
+               m.style = defStyle
+
+               if _, ok := colorscheme["message"]; ok {
+                       m.style = colorscheme["message"]
+               }
+
+               m.hasMessage = true
        }
-       m.AddLog(m.message)
-       m.hasMessage = true
+       // add the message to the log regardless of active prompts
+       m.AddLog(displayMessage)
 }
 
 // Error sends an error message to the user
 func (m *Messenger) Error(msg ...interface{}) {
        buf := new(bytes.Buffer)
        fmt.Fprint(buf, msg...)
-       m.message = buf.String()
-       m.style = defStyle.
-               Foreground(tcell.ColorBlack).
-               Background(tcell.ColorMaroon)
 
-       if _, ok := colorscheme["error-message"]; ok {
-               m.style = colorscheme["error-message"]
+       // only display a new message if there isn't an active prompt
+       // this is to prevent overwriting an existing prompt to the user
+       if m.hasPrompt == false {
+               // if there is no active prompt then style and display the message as normal
+               m.message = buf.String()
+               m.style = defStyle.
+                       Foreground(tcell.ColorBlack).
+                       Background(tcell.ColorMaroon)
+
+               if _, ok := colorscheme["error-message"]; ok {
+                       m.style = colorscheme["error-message"]
+               }
+               m.hasMessage = true
        }
-       m.AddLog(m.message)
+       // add the message to the log regardless of active prompts
+       m.AddLog(buf.String())
+}
+
+func (m *Messenger) PromptText(msg ...interface{}) {
+       displayMessage := fmt.Sprint(msg...)
+       // if there is no active prompt then style and display the message as normal
+       m.message = displayMessage
+
+       m.style = defStyle
+
+       if _, ok := colorscheme["message"]; ok {
+               m.style = colorscheme["message"]
+       }
+
        m.hasMessage = true
+       // add the message to the log regardless of active prompts
+       m.AddLog(displayMessage)
 }
 
 // YesNoPrompt asks the user a yes or no question (waits for y or n) and returns the result
 func (m *Messenger) YesNoPrompt(prompt string) (bool, bool) {
        m.hasPrompt = true
-       m.Message(prompt)
+       m.PromptText(prompt)
 
        _, h := screen.Size()
        for {
@@ -129,17 +161,19 @@ func (m *Messenger) YesNoPrompt(prompt string) (bool, bool) {
                case *tcell.EventKey:
                        switch e.Key() {
                        case tcell.KeyRune:
-                               if e.Rune() == 'y' {
+                               if e.Rune() == 'y' || e.Rune() == 'Y' {
                                        m.AddLog("\t--> y")
                                        m.hasPrompt = false
                                        return true, false
-                               } else if e.Rune() == 'n' {
+                               } else if e.Rune() == 'n' || e.Rune() == 'N' {
                                        m.AddLog("\t--> n")
                                        m.hasPrompt = false
                                        return false, false
                                }
                        case tcell.KeyCtrlC, tcell.KeyCtrlQ, tcell.KeyEscape:
                                m.AddLog("\t--> (cancel)")
+                               m.Clear()
+                               m.Reset()
                                m.hasPrompt = false
                                return false, true
                        }
@@ -150,7 +184,7 @@ func (m *Messenger) YesNoPrompt(prompt string) (bool, bool) {
 // LetterPrompt gives the user a prompt and waits for a one letter response
 func (m *Messenger) LetterPrompt(prompt string, responses ...rune) (rune, bool) {
        m.hasPrompt = true
-       m.Message(prompt)
+       m.PromptText(prompt)
 
        _, h := screen.Size()
        for {
@@ -198,9 +232,9 @@ const (
 
 // Prompt sends the user a message and waits for a response to be typed in
 // This function blocks the main loop while waiting for input
-func (m *Messenger) Prompt(prompt, historyType string, completionTypes ...Completion) (string, bool) {
+func (m *Messenger) Prompt(prompt, placeholder, historyType string, completionTypes ...Completion) (string, bool) {
        m.hasPrompt = true
-       m.Message(prompt)
+       m.PromptText(prompt)
        if _, ok := m.history[historyType]; !ok {
                m.history[historyType] = []string{""}
        } else {
@@ -208,7 +242,9 @@ func (m *Messenger) Prompt(prompt, historyType string, completionTypes ...Comple
        }
        m.historyNum = len(m.history[historyType]) - 1
 
-       response, canceled := "", true
+       response, canceled := placeholder, true
+       m.response = response
+       m.cursorx = Count(placeholder)
 
        RedrawAll()
        for m.hasPrompt {