Move Counter to utils module

This commit is contained in:
Alexandre Bury 2018-04-10 11:45:02 -07:00
parent d5178e778b
commit 063589b0cd
11 changed files with 74 additions and 48 deletions

30
src/utils/counter.rs Normal file
View File

@ -0,0 +1,30 @@
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
/// Atomic counter used by [`ProgressBar`].
///
/// [`ProgressBar`]: ../views/struct.ProgressBar.html
#[derive(Clone)]
pub struct Counter(pub Arc<AtomicUsize>);
impl Counter {
/// Creates a new `Counter` starting with the given value.
pub fn new(value: usize) -> Self {
Counter(Arc::new(AtomicUsize::new(value)))
}
/// Retrieves the current progress value.
pub fn get(&self) -> usize {
self.0.load(Ordering::Relaxed)
}
/// Sets the current progress value.
pub fn set(&self, value: usize) {
self.0.store(value, Ordering::Relaxed);
}
/// Increase the current progress by `ticks`.
pub fn tick(&self, ticks: usize) {
self.0.fetch_add(ticks, Ordering::Relaxed);
}
}

View File

@ -70,6 +70,10 @@ impl<'a> Iterator for LinesIterator<'a> {
let width = row.width;
Some(Row { start, end, width })
Some(Row {
start,
end,
width,
})
}
}

View File

@ -47,7 +47,10 @@ where
}
// Skip empty spans
if self.source.spans()[self.current_span].as_ref().is_empty() {
if self.source.spans()[self.current_span]
.as_ref()
.is_empty()
{
self.current_span += 1;
return self.next();
}
@ -120,9 +123,13 @@ where
self.current_span += 1;
// Skip empty spans
while let Some(true) =
self.source.spans().get(self.current_span).map(|span| {
span.as_ref().resolve(self.source.source()).is_empty()
while let Some(true) = self.source
.spans()
.get(self.current_span)
.map(|span| {
span.as_ref()
.resolve(self.source.source())
.is_empty()
}) {
self.current_span += 1;
}

View File

@ -76,8 +76,11 @@ where
self.width
};
let mut chunks =
prefix(&mut self.iter, allowed_width, &mut self.chunk_offset);
let mut chunks = prefix(
&mut self.iter,
allowed_width,
&mut self.chunk_offset,
);
// println!("Chunks..: {:?}", chunks);
@ -162,6 +165,9 @@ where
// TODO: merge consecutive segments of the same span
Some(Row { segments, width })
Some(Row {
segments,
width,
})
}
}

View File

@ -4,13 +4,13 @@
//!
//! Computed rows will include a list of span segments.
//! Each segment include the source span ID, and start/end byte offsets.
mod lines_iterator;
mod chunk_iterator;
mod segment_merge_iterator;
mod row;
mod prefix;
mod chunk;
mod chunk_iterator;
mod lines_iterator;
mod prefix;
mod row;
mod segment;
mod segment_merge_iterator;
#[cfg(test)]
mod tests;

View File

@ -8,7 +8,9 @@ fn input() -> StyledString {
text.append(StyledString::styled("didn't", Effect::Bold));
text.append(StyledString::plain(" say "));
text.append(StyledString::styled("half", Effect::Italic));
text.append(StyledString::plain(" the things people say I did."));
text.append(StyledString::plain(
" the things people say I did.",
));
text.append(StyledString::plain("\n"));
text.append(StyledString::plain("\n"));
text.append(StyledString::plain(" - A. Einstein"));

View File

@ -139,8 +139,10 @@ Attention
====
I *really* love __Cursive__!";
let spans = parse_spans(input);
let spans: Vec<_> =
spans.iter().map(|span| span.resolve(input)).collect();
let spans: Vec<_> = spans
.iter()
.map(|span| span.resolve(input))
.collect();
// println!("{:?}", spans);
assert_eq!(

View File

@ -1,8 +1,10 @@
//! Toolbox to make text layout easier.
mod reader;
pub mod span;
mod counter;
pub mod lines;
pub mod markup;
mod reader;
pub mod span;
pub use self::counter::Counter;
pub use self::reader::ProgressReader;

View File

@ -1,5 +1,5 @@
use std::io::{self, Read};
use views::Counter;
use utils::Counter;
/// Wrapper around a `Read` that reports the progress made.
///

View File

@ -77,7 +77,7 @@ pub use self::menu_popup::MenuPopup;
pub use self::menubar::Menubar;
pub use self::on_event_view::OnEventView;
pub use self::panel::Panel;
pub use self::progress_bar::{Counter, ProgressBar};
pub use self::progress_bar::ProgressBar;
pub use self::radio::{RadioButton, RadioGroup};
pub use self::select_view::SelectView;
pub use self::shadow_view::ShadowView;

View File

@ -1,40 +1,13 @@
use Printer;
use align::HAlign;
use std::cmp;
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;
use theme::{ColorStyle, Effect};
use utils::Counter;
use view::View;
// pub type CbPromise = Option<Box<Fn(&mut Cursive) + Send>>;
/// Atomic counter used by `ProgressBar`.
#[derive(Clone)]
pub struct Counter(pub Arc<AtomicUsize>);
impl Counter {
/// Creates a new `Counter` starting with the given value.
pub fn new(value: usize) -> Self {
Counter(Arc::new(AtomicUsize::new(value)))
}
/// Retrieves the current progress value.
pub fn get(&self) -> usize {
self.0.load(Ordering::Relaxed)
}
/// Sets the current progress value.
pub fn set(&self, value: usize) {
self.0.store(value, Ordering::Relaxed);
}
/// Increase the current progress by `ticks`.
pub fn tick(&self, ticks: usize) {
self.0.fetch_add(ticks, Ordering::Relaxed);
}
}
/// Animated bar showing a progress value.
///
/// This bar has an internal counter, and adapts the length of the displayed