X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=cmd%2Fmicro%2Fmessenger.go;h=3fda5368fc092925c8c696c4fe963ee6058f514e;hb=97e2fb12883b10002e7b08feef3110495d22bb4a;hp=36e46889b577f937d56df7d07f8e108dcf587076;hpb=a1a307d858439282a671e710bea32851274e8d44;p=micro.git diff --git a/cmd/micro/messenger.go b/cmd/micro/messenger.go index 36e46889..3fda5368 100644 --- a/cmd/micro/messenger.go +++ b/cmd/micro/messenger.go @@ -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 {