diff --git a/spinner/spinner.go b/spinner/spinner.go index 5b6860d..b035f53 100644 --- a/spinner/spinner.go +++ b/spinner/spinner.go @@ -1,13 +1,11 @@ package spinner import ( - "strings" "sync" "time" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" - "github.com/muesli/reflow/ansi" ) // Internal ID management for text inputs. Necessary for blink integrity when @@ -85,114 +83,17 @@ type Model struct { // https://github.com/charmbracelet/lipgloss Style lipgloss.Style - // MinimumLifetime is the minimum amount of time the spinner can run. Any - // logic around this can be implemented in view that implements this - // spinner. If HideFor is set MinimumLifetime will be added on top of - // HideFor. In other words, if HideFor is 100ms and MinimumLifetime is - // 200ms then MinimumLifetime will expire after 300ms. - // - // MinimumLifetime is optional. - // - // This is considered experimental and may not appear in future versions of - // this library. - MinimumLifetime time.Duration - - // HideFor can be used to wait to show the spinner until a certain amount - // of time has passed. This can be useful for preventing flicking when load - // times are very fast. - // Optional. - // - // This is considered experimental and may not appear in future versions of - // this library. - HideFor time.Duration - frame int startTime time.Time id int tag int } -// Start resets resets the spinner start time. For use with MinimumLifetime and -// MinimumStartTime. Optional. -// -// This function is optional and generally considered for advanced use only. -// Most of the time your application logic will obviate the need for this -// method. -// -// This is considered experimental and may not appear in future versions of -// this library. -func (m *Model) Start() { - m.startTime = time.Now() -} - -// Finish sets the internal timer to a completed state so long as the spinner -// isn't flagged to be showing. If it is showing, finish has no effect. The -// idea here is that you call Finish if your operation has completed and, if -// the spinner isn't showing yet (by virtue of HideFor) then Visible() doesn't -// show the spinner at all. -// -// This is intended to work in conjunction with MinimumLifetime and -// MinimumStartTime, is completely optional. -// -// This function is optional and generally considered for advanced use only. -// Most of the time your application logic will obviate the need for this -// method. -// -// This is considered experimental and may not appear in future versions of -// this library. -func (m *Model) Finish() { - if m.hidden() { - m.startTime = time.Time{} - } -} - // ID returns the spinner's unique ID. func (m Model) ID() int { return m.id } -// advancedMode returns whether or not the user is making use of HideFor and -// MinimumLifetime properties. -func (m Model) advancedMode() bool { - return m.HideFor > 0 && m.MinimumLifetime > 0 -} - -// hidden returns whether or not Model.HideFor is in effect. -func (m Model) hidden() bool { - if m.startTime.IsZero() { - return false - } - if m.HideFor == 0 { - return false - } - return m.startTime.Add(m.HideFor).After(time.Now()) -} - -// finished returns whether the minimum lifetime of this spinner has been -// exceeded. -func (m Model) finished() bool { - if m.startTime.IsZero() || m.MinimumLifetime == 0 { - return true - } - return m.startTime.Add(m.HideFor).Add(m.MinimumLifetime).Before(time.Now()) -} - -// Visible returns whether or not the view should be rendered. Works in -// conjunction with Model.HideFor and Model.MinimumLifetimeReached. You should -// use this method directly to determine whether or not to render this view in -// the parent view and whether to continue sending spin messaging in the -// parent update function. -// -// This function is optional and generally considered for advanced use only. -// Most of the time your application logic will obviate the need for this -// method. -// -// This is considered experimental and may not appear in future versions of -// this library. -func (m Model) Visible() bool { - return !m.hidden() && !m.finished() -} - // New returns a model with default values. func New() Model { return Model{ @@ -250,16 +151,7 @@ func (m Model) View() string { return "(error)" } - frame := m.Spinner.Frames[m.frame] - - // If we're using the fine-grained hide/show spinner rules and those rules - // deem that the spinner should be hidden, draw an empty space in place of - // the spinner. - if m.advancedMode() && !m.Visible() { - frame = strings.Repeat(" ", ansi.PrintableRuneWidth(frame)) - } - - return m.Style.Render(frame) + return m.Style.Render(m.Spinner.Frames[m.frame]) } // Tick is the command used to advance the spinner one frame. Use this command