From 5e764402b9abb19410afb462b95b9c580be4742b Mon Sep 17 00:00:00 2001 From: Michael Dvorkin Date: Sun, 6 Oct 2013 18:06:02 -0700 Subject: [PATCH] More robust pause implementation --- cmd/mop.go | 4 ++-- screen.go | 33 ++++++++++++++++++++------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/cmd/mop.go b/cmd/mop.go index a089eca..b7d2bdb 100644 --- a/cmd/mop.go +++ b/cmd/mop.go @@ -68,7 +68,7 @@ loop: } } else if event.Ch == 'p' || event.Ch == 'P' { paused = !paused - screen.Draw(paused) + screen.Pause(paused).Draw(time.Now()) } else if event.Ch == '?' || event.Ch == 'h' || event.Ch == 'H' { showingHelp = true screen.Clear().Draw(help) @@ -82,7 +82,7 @@ loop: columnEditor = nil } } else if showingHelp { - showingHelp, paused = false, false + showingHelp = false screen.Clear().Draw(market, quotes) } case termbox.EventResize: diff --git a/screen.go b/screen.go index 99b8c94..685cfb9 100644 --- a/screen.go +++ b/screen.go @@ -13,11 +13,12 @@ import ( // Screen is thin wrapper aroung Termbox library to provide basic display // capabilities as requied by Mop. type Screen struct { - width int // Current number of columns. - height int // Current number of rows. - cleared bool // True after the screens gets cleared. - layout *Layout // Pointer to layout (gets created by screen). - markup *Markup // Pointer to markup processor (gets created by screen). + width int // Current number of columns. + height int // Current number of rows. + cleared bool // True after the screens gets cleared. + layout *Layout // Pointer to layout (gets created by screen). + markup *Markup // Pointer to markup processor (gets created by screen). + pausedAt *time.Time // Timestamp of the pause request or nil if none. } // Initialize loads the Termbox, allocates and initializes layout and markup, @@ -49,6 +50,17 @@ func (screen *Screen) Resize() *Screen { return screen } +func (screen *Screen) Pause(pause bool) *Screen { + if pause { + screen.pausedAt = new(time.Time) + *screen.pausedAt = time.Now() + } else { + screen.pausedAt = nil + } + + return screen +} + // Clear makes the entire screen blank using default background color. func (screen *Screen) Clear() *Screen { termbox.Clear(termbox.ColorDefault, termbox.ColorDefault) @@ -71,6 +83,9 @@ func (screen *Screen) ClearLine(x int, y int) *Screen { // Draw accepts variable number of arguments and knows how to display the // market data, stock quotes, current time, and an arbitrary string. func (screen *Screen) Draw(objects ...interface{}) *Screen { + if screen.pausedAt != nil { + defer screen.DrawLine(0, 0, `` + screen.pausedAt.Format(`3:04:05pm PST`) + ``) + } for _, ptr := range objects { switch ptr.(type) { case *Market: @@ -82,14 +97,6 @@ func (screen *Screen) Draw(objects ...interface{}) *Screen { case time.Time: timestamp := ptr.(time.Time).Format(`3:04:05pm PST`) screen.DrawLine(0, 0, `` + timestamp + ``) - case bool: - timestamp := time.Now().Format(`3:04:05pm PST`) - if ptr.(bool) { - timestamp = `Paused ` + timestamp + `` - } else { - timestamp = ` ` + timestamp - } - screen.DrawLine(0, 0, `` + timestamp + ``) default: screen.draw(ptr.(string)) }