@@ 7,7 7,13 @@ use {
theme::Style,
vec::Vec2
},
- ted::cache::CharCache
+ ted::{
+ cache::CharCache,
+ num::{
+ NumDigits,
+ Digits
+ }
+ }
};
pub struct LineNumbers {
@@ 27,39 33,27 @@ impl LineNumbers {
pad_right: 1,
space: CharCache::new(' '),
size: range.sample_with(|range| Vec2::new(
- range_width(&*range),
+ Self::range_width(&*range).into(),
range.end - range.start
)),
range
}
}
-}
-impl LineNumbers {
fn width(&self) -> usize {
- self.num_width() + self.pad_right
+ usize::from(self.nums_width()) + self.pad_right
}
- fn num_width(&self) -> usize {
- self.range.sample_with(|range| range_width(&*range))
+ fn nums_width(&self) -> u8 {
+ self.range.sample_with(|range| Self::range_width(&*range))
}
-}
-fn num_width(mut num: usize) -> usize {
- // numbers are in ASCII range so one column per char
- let mut width = 1;
- while num >= 10 {
- num /= 10;
- width += 1;
- }
- width
-}
-
-fn range_width(range: &Range<usize>) -> usize {
- if range.start < range.end {
- num_width(range.end - 1)
- } else {
- 0
+ fn range_width(range: &Range<usize>) -> u8 {
+ if range.start < range.end {
+ (range.end - 1).num_digits()
+ } else {
+ 0
+ }
}
}
@@ 79,14 73,20 @@ impl View for LineNumbers {
fn draw(&self, printer: &Printer) {
printer.with_style(self.style, |printer| {
- let num_width = self.size.x - self.pad_right;
+ let nums_width: usize = self.nums_width().into();
for (y, line) in self.range.sample().enumerate().take(self.size.y) {
// print line number
- printer.print((0, y), &format!("{:1$}", line, num_width)); // XXX cache number strings
+ let mut x = nums_width;
+ for digit in line.digits().str() {
+ x -= 1;
+ printer.print((x, y), digit);
+ }
+ // print left indent
+ printer.print((0, y), self.space.get(x).expect("not enough space allocated"));
// print right padding
- printer.print((num_width, y), self.space.get(self.pad_right).expect("not enough space allocated"));
+ printer.print((nums_width, y), self.space.get(self.pad_right).expect("not enough space allocated"));
}
});
}