Simplify implementation of trees somewhat

master
Jos van den Oever 2017-08-22 17:02:12 +02:00
parent 3ba1ffb5eb
commit a89c1bbfbb
4 changed files with 44 additions and 57 deletions

View File

@ -94,7 +94,7 @@ pub trait Item: Default {
pub type Tree = RGeneralItemModel<DirEntry>;
struct Entry<T: Item> {
id: usize,
parent: usize,
row: usize,
children: Option<Vec<usize>>,
data: T,
@ -112,24 +112,16 @@ impl<T: Item> RGeneralItemModel<T> where T: Sync + Send {
fn reset(&mut self) {
self.model.begin_reset_model();
self.entries.clear();
let none0 = Entry {
id: 0,
row: 0,
children: Some(vec![1]),
data: T::default(),
};
self.entries.push(none0);
let none1 = Entry {
id: 0,
self.entries.push(Entry {
parent: 0,
row: 0,
children: None,
data: T::default(),
};
self.entries.push(none1);
});
if let Some(ref path) = self.path {
self.entries[1].children = Some(vec![2]);
self.entries[0].children = Some(vec![1]);
let root = Entry {
id: 1,
parent: 0,
row: 0,
children: None,
data: T::create(&path),
@ -138,16 +130,6 @@ impl<T: Item> RGeneralItemModel<T> where T: Sync + Send {
}
self.model.end_reset_model();
}
fn get_index(&self, item: usize, row: usize) -> Option<usize> {
// for an invalid index return the root
if item == 0 {
return Some(1);
}
self.entries.get(item)
.and_then(|i| i.children.as_ref())
.and_then(|i| i.get(row))
.map(|i| *i)
}
fn get(&self, item: usize) -> &Entry<T> {
&self.entries[item]
}
@ -157,34 +139,35 @@ impl<T: Item> RGeneralItemModel<T> where T: Sync + Send {
T::retrieve(item, parents, incoming, self.emit.clone());
}
fn process_incoming(&mut self) {
let mut incoming = self.incoming.lock().unwrap();
for (id, entries) in incoming.drain() {
if self.entries[id].children.is_some() {
continue;
}
let mut new_entries = Vec::new();
let mut children = Vec::new();
{
for (r, d) in entries.into_iter().enumerate() {
let e = Entry {
id: id,
row: r,
children: None,
data: d,
};
children.push(self.entries.len() + r);
new_entries.push(e);
if let Ok(ref mut incoming) = self.incoming.try_lock() {
for (id, entries) in incoming.drain() {
if self.entries[id].children.is_some() {
continue;
}
let mut new_entries = Vec::new();
let mut children = Vec::new();
{
for (r, d) in entries.into_iter().enumerate() {
let e = Entry {
parent: id,
row: r,
children: None,
data: d,
};
children.push(self.entries.len() + r);
new_entries.push(e);
}
if new_entries.len() > 0 {
self.model.begin_insert_rows(id, 0,
(new_entries.len() - 1));
}
}
self.entries[id].children = Some(children);
if new_entries.len() > 0 {
self.model.begin_insert_rows(id, 0,
(new_entries.len() - 1));
self.entries.append(&mut new_entries);
self.model.end_insert_rows();
}
}
self.entries[id].children = Some(children);
if new_entries.len() > 0 {
self.entries.append(&mut new_entries);
self.model.end_insert_rows();
}
}
}
fn get_parents(&self, id: usize) -> Vec<&T> {
@ -192,7 +175,7 @@ impl<T: Item> RGeneralItemModel<T> where T: Sync + Send {
let mut e = Vec::new();
while pos > 0 {
e.push(pos);
pos = self.entries[pos].id;
pos = self.entries[pos].parent;
}
e.into_iter().rev().map(|i| &self.entries[i].data).collect()
}
@ -245,14 +228,18 @@ impl<T: Item> TreeTrait for RGeneralItemModel<T> where T: Sync + Send {
r
}
fn index(&self, item: usize, row: usize) -> usize {
self.get_index(item, row).unwrap_or(0)
self.entries.get(item)
.and_then(|i| i.children.as_ref())
.and_then(|i| i.get(row))
.map(|i| *i)
.unwrap_or(0)
}
fn parent(&self, index: usize) -> QModelIndex {
if index >= self.entries.len() {
fn parent(&self, item: usize) -> QModelIndex {
if item >= self.entries.len() || item == 0 {
return QModelIndex::invalid();
}
let entry = &self.entries[index];
QModelIndex::create(entry.row as i32, entry.id)
let entry = &self.entries[item];
QModelIndex::create(entry.row as i32, entry.parent)
}
fn file_name(&self, item: usize) -> String {
self.get(item).data.file_name()

View File

@ -106,7 +106,7 @@ QModelIndex Tree::parent(const QModelIndex &index) const
return QModelIndex();
}
const qmodelindex_t parent = tree_parent(d, index.internalId());
return parent.id ?createIndex(parent.row, 0, parent.id) :QModelIndex();
return parent.row >= 0 ?createIndex(parent.row, 0, parent.id) :QModelIndex();
}
bool Tree::canFetchMore(const QModelIndex &parent) const

View File

@ -178,7 +178,7 @@ QModelIndex %1::parent(const QModelIndex &index) const
return QModelIndex();
}
const qmodelindex_t parent = %2_parent(d, index.internalId());
return parent.id ?createIndex(parent.row, 0, parent.id) :QModelIndex();
return parent.row >= 0 ?createIndex(parent.row, 0, parent.id) :QModelIndex();
}
bool %1::canFetchMore(const QModelIndex &parent) const

View File

@ -102,7 +102,7 @@ QModelIndex Persons::parent(const QModelIndex &index) const
return QModelIndex();
}
const qmodelindex_t parent = persons_parent(d, index.internalId());
return parent.id ?createIndex(parent.row, 0, parent.id) :QModelIndex();
return parent.row >= 0 ?createIndex(parent.row, 0, parent.id) :QModelIndex();
}
bool Persons::canFetchMore(const QModelIndex &parent) const