diff --git a/_examples/merge/main.go b/_examples/merge/main.go index 2efabe1..cde6c42 100644 --- a/_examples/merge/main.go +++ b/_examples/merge/main.go @@ -21,9 +21,11 @@ var pdecorators mpb.BarOption if i == 0 { pdecorators = mpb.PrependDecorators( - // Merge to sync width with decorators on lines 37 and 38 decor.Merge( - newVariadicSpinner(decor.WCSyncSpace), + decor.OnComplete( + newVariadicSpinner(decor.WCSyncSpace), + "done", + ), decor.WCSyncSpace, // Placeholder ), ) @@ -58,27 +60,19 @@ func newVariadicSpinner(wc decor.WC) decor.Decorator { d := &variadicSpinner{ - WC: wc.Init(), - d: decor.Spinner(nil), + WC: wc.Init(), + base: decor.Spinner(nil), } return d } type variadicSpinner struct { decor.WC - d decor.Decorator - complete *string + base decor.Decorator } func (d *variadicSpinner) Decor(st *decor.Statistics) string { - if st.Completed && d.complete != nil { - return d.FormatMsg(*d.complete) - } - msg := d.d.Decor(st) + msg := d.base.Decor(st) msg = strings.Repeat(msg, int(st.Current/3)) return d.FormatMsg(msg) } - -func (d *variadicSpinner) OnCompleteMessage(msg string) { - d.complete = &msg -} diff --git a/bar_option.go b/bar_option.go index d938e41..bb79ac6 100644 --- a/bar_option.go +++ b/bar_option.go @@ -17,9 +17,7 @@ func (s *bState) addDecorators(dest *[]decor.Decorator, decorators ...decor.Decorator) { for _, decorator := range decorators { if mw, ok := decorator.(mergeWrapper); ok { - dd := mw.MergeUnwrap() - s.mDecorators = append(s.mDecorators, dd[0]) - *dest = append(*dest, dd[1:]...) + *dest = append(*dest, mw.MergeUnwrap()...) } *dest = append(*dest, decorator) } diff --git a/decor/merge.go b/decor/merge.go index b0ed244..3a67883 100644 --- a/decor/merge.go +++ b/decor/merge.go @@ -25,9 +25,12 @@ } decorator.SetConf(&WC{}) for i, wc := range placeholders { + if (wc.C & DSyncWidth) == 0 { + return decorator + } md.placeHolders[i] = &placeHolderDecorator{ - WC: wc.Init(), - wsync: make(chan int), + WC: wc.Init(), + wch: make(chan int), } } return md @@ -40,10 +43,9 @@ } func (d *mergeDecorator) MergeUnwrap() []Decorator { - decorators := make([]Decorator, len(d.placeHolders)+1) - decorators[0] = d.Decorator + decorators := make([]Decorator, len(d.placeHolders)) for i, ph := range d.placeHolders { - decorators[i+1] = ph + decorators[i] = ph } return decorators } @@ -52,32 +54,36 @@ return d.wc.Sync() } +func (d *mergeDecorator) Base() Decorator { + return d.Decorator +} + func (d *mergeDecorator) Decor(st *Statistics) string { msg := d.Decorator.Decor(st) msgLen := utf8.RuneCountInString(msg) - var pWidth int + var space int for _, ph := range d.placeHolders { - pWidth += <-ph.wsync + space += <-ph.wch } - d.wc.wsync <- msgLen - pWidth + d.wc.wsync <- msgLen - space max := <-d.wc.wsync if (d.wc.C & DextraSpace) != 0 { max++ } - return fmt.Sprintf(fmt.Sprintf(d.wc.dynFormat, max+pWidth), msg) + return fmt.Sprintf(fmt.Sprintf(d.wc.dynFormat, max+space), msg) } type placeHolderDecorator struct { WC - wsync chan int + wch chan int } func (d *placeHolderDecorator) Decor(st *Statistics) string { go func() { - d.wsync <- utf8.RuneCountInString(d.FormatMsg("")) + d.wch <- utf8.RuneCountInString(d.FormatMsg("")) }() return "" } diff --git a/decor/on_complete.go b/decor/on_complete.go index 1c88684..bb4a563 100644 --- a/decor/on_complete.go +++ b/decor/on_complete.go @@ -9,7 +9,6 @@ func OnComplete(decorator Decorator, message string) Decorator { d := &onCompleteWrapper{ Decorator: decorator, - wc: decorator.GetConf(), msg: message, } return d @@ -17,13 +16,17 @@ type onCompleteWrapper struct { Decorator - wc WC msg string } func (d *onCompleteWrapper) Decor(st *Statistics) string { if st.Completed { - return d.wc.FormatMsg(d.msg) + wc := d.GetConf() + return wc.FormatMsg(d.msg) } return d.Decorator.Decor(st) } + +func (d *onCompleteWrapper) Base() Decorator { + return d.Decorator +}