Compare commits

..

No commits in common. "b5cad4483859954b3211f80318df98c9f2a0378f" and "e2c8ea8441b0cf1bbeddb73f1c9fff577ec4d2ea" have entirely different histories.

4 changed files with 16 additions and 15 deletions

View file

@ -83,24 +83,20 @@ impl<T> VecBuffer<T>
where
T: Clone + Send + Sync + 'static,
{
pub fn with_data_arc_port(data: Arc<RwLock<Vec<T>>>, port: InnerViewPort<RwLock<Vec<T>>>) -> Self {
pub fn with_data_port(data: Vec<T>, port: InnerViewPort<RwLock<Vec<T>>>) -> Self {
let data = Arc::new(RwLock::new(data));
port.set_view(Some(data.clone()));
for x in data.read().unwrap().iter().cloned() {
port.notify(&VecDiff::Push(x));
}
VecBuffer {
data,
port
}
}
pub fn with_data_port(data: Vec<T>, port: InnerViewPort<RwLock<Vec<T>>>) -> Self {
let data = Arc::new(RwLock::new(data));
Self::with_data_arc_port( data, port )
}
pub fn attach_to(&self, port: OuterViewPort< dyn ListView<T> >) -> Arc<RwLock<VecBufferTarget<T>>> {
self.port.0.add_update_hook(Arc::new(port.0.clone()));
@ -275,7 +271,7 @@ mod tests {
buf.push('b');
buf2.get_port().0.update();
list_view.0.update();
assert_eq!(buf2.len(), 2);
assert_eq!(buf2.get(0), 'a');
assert_eq!(buf2.get(1), 'b');
@ -283,7 +279,7 @@ mod tests {
buf.push('c');
buf.remove(0);
buf2.get_port().0.update();
list_view.0.update();
assert_eq!(buf2.len(), 2);
assert_eq!(buf2.get(0), 'b');
assert_eq!(buf2.get(1), 'c');

View file

@ -78,20 +78,24 @@ where Item: Clone + Send + Sync + 'static,
if let Some(v) = self.src_view.as_ref() {
self.end = v.len().unwrap();
for idx in 0 .. self.end {
let val = v.get( &(self.end - idx - 1) ).unwrap();
self.cast.notify(&ListDiff::Insert{ idx: idx, val });
if idx < self.end {
let val = v.get( &(self.end - idx - 1) ).unwrap();
self.cast.notify(&ListDiff::Insert{ idx: idx, val });
}
}
} else {
self.end = 0;
}
}
fn notify(&mut self, msg: &ListDiff<Item>) {
/* todo optimize
*/
//let len = self.src_view.len().unwrap();
self.cast.notify(&match msg {
ListDiff::Clear => {
self.end = 0;
ListDiff::Clear
}
},
ListDiff::Remove(mut idx) => {
self.end -= 1;
idx = self.end - idx;

View file

@ -67,7 +67,6 @@ where
fn notify(&mut self, diff: &VecDiff<T>) {
match diff {
VecDiff::Clear => {
self.cur_len = 0;
self.cast.notify(&ListDiff::Clear);
}
VecDiff::Push(val) => {

View file

@ -107,6 +107,8 @@ where V::Msg: Clone
pub fn attach_to_port(&self, other_port: ViewPort<V>) {
self.set_view( other_port.view.read().unwrap().clone() );
other_port.add_observer( self.cast.clone() );
// todo: forward reset() ?
self.update_hooks.write().unwrap().clear();
self.add_update_hook( Arc::new(other_port) );
}