refactoring bar filler
Vladimir Bauer
6 years ago
| 110 | 110 | defer w.Write(s.format[rRight]) |
| 111 | 111 | |
| 112 | 112 | cwidth := int(internal.PercentageRound(stat.Total, stat.Current, width)) |
| 113 | bb := make([][]byte, cwidth) | |
| 114 | 113 | space := &space{ |
| 115 | 114 | space: s.format[rSpace], |
| 116 | 115 | rwidth: s.rwidth[rSpace], |
| 117 | 116 | count: width - cwidth, |
| 118 | 117 | } |
| 119 | if cwidth == 0 { | |
| 120 | s.flush(w, space, bb) | |
| 121 | return | |
| 118 | ||
| 119 | index, refill := 0, 0 | |
| 120 | bb := make([][]byte, cwidth) | |
| 121 | ||
| 122 | if cwidth > 0 && cwidth != width { | |
| 123 | bb[index] = s.tip | |
| 124 | cwidth -= s.rwidth[rTip] | |
| 125 | index++ | |
| 122 | 126 | } |
| 123 | 127 | |
| 124 | index := 0 | |
| 125 | if space.count != 0 { | |
| 126 | bb[index] = s.tip | |
| 127 | cwidth -= s.rwidth[rTip] | |
| 128 | } else { | |
| 129 | bb[index] = s.format[rFill] | |
| 130 | cwidth -= s.rwidth[rFill] | |
| 131 | } | |
| 132 | index++ | |
| 133 | ||
| 134 | rwidth := 0 | |
| 135 | 128 | if s.refill > 0 { |
| 136 | rwidth = cwidth | |
| 129 | refill = cwidth | |
| 137 | 130 | if s.refill < stat.Current { |
| 138 | rwidth = int(internal.PercentageRound(stat.Total, int64(s.refill), width)) | |
| 131 | refill = int(internal.PercentageRound(stat.Total, int64(s.refill), width)) | |
| 139 | 132 | } |
| 140 | cwidth -= rwidth | |
| 133 | cwidth -= refill | |
| 141 | 134 | } |
| 142 | 135 | |
| 143 | 136 | for cwidth > 0 { |
| 146 | 139 | index++ |
| 147 | 140 | } |
| 148 | 141 | |
| 149 | for rwidth > 0 { | |
| 142 | for refill > 0 { | |
| 150 | 143 | bb[index] = s.format[rRefill] |
| 151 | rwidth -= s.rwidth[rRefill] | |
| 144 | refill -= s.rwidth[rRefill] | |
| 152 | 145 | index++ |
| 153 | 146 | } |
| 154 | 147 | |
| 155 | if index != len(bb) || space.rwidth > 1 { | |
| 148 | if cwidth+refill < 0 || space.rwidth > 1 { | |
| 156 | 149 | buf := new(bytes.Buffer) |
| 157 | 150 | s.flush(buf, space, bb[:index]) |
| 158 | 151 | io.WriteString(w, runewidth.Truncate(buf.String(), width, "…")) |