mirror of
https://github.com/JockeTF/fimfareader.git
synced 2024-11-27 15:38:00 +01:00
Clean up tree view detachment
This commit is contained in:
parent
136b53af6c
commit
9db565d540
2 changed files with 37 additions and 56 deletions
35
Cargo.lock
generated
35
Cargo.lock
generated
|
@ -10,7 +10,7 @@ name = "arrayvec"
|
|||
version = "0.4.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -165,7 +165,7 @@ dependencies = [
|
|||
"nom 5.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"zip 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -187,12 +187,13 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "flate2"
|
||||
version = "1.0.11"
|
||||
version = "1.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"miniz_oxide 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"miniz_oxide 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -407,7 +408,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "miniz_oxide"
|
||||
version = "0.3.2"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -415,7 +416,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "nodrop"
|
||||
version = "0.1.13"
|
||||
version = "0.1.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
|
@ -490,7 +491,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.4"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -501,7 +502,7 @@ name = "quote"
|
|||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -580,14 +581,14 @@ name = "serde_derive"
|
|||
version = "1.0.101"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.40"
|
||||
version = "1.0.41"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -605,7 +606,7 @@ name = "syn"
|
|||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -655,7 +656,7 @@ version = "0.5.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"flate2 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"flate2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -678,7 +679,7 @@ dependencies = [
|
|||
"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b"
|
||||
"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
|
||||
"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
|
||||
"checksum flate2 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "2adaffba6388640136149e18ed080b77a78611c1e1d6de75aedcdf78df5d4682"
|
||||
"checksum flate2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ad3c5233c9a940c8719031b423d7e6c16af66e031cb0420b0896f5245bf181d3"
|
||||
"checksum fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f8140122fa0d5dcb9fc8627cfce2b37cc1500f752636d46ea28bc26785c2f9"
|
||||
"checksum gdk 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6243e995f41f3a61a31847e54cc719edce93dd9140c89dca3b9919be1cfe22d5"
|
||||
"checksum gdk-pixbuf 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9726408ee1bbada83094326a99b9c68fea275f9dbb515de242a69e72051f4fcc"
|
||||
|
@ -698,8 +699,8 @@ dependencies = [
|
|||
"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
|
||||
"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
|
||||
"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f"
|
||||
"checksum miniz_oxide 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7108aff85b876d06f22503dcce091e29f76733b2bfdd91eebce81f5e68203a10"
|
||||
"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
|
||||
"checksum miniz_oxide 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "304f66c19be2afa56530fa7c39796192eef38618da8d19df725ad7c6d6b2aaae"
|
||||
"checksum nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
|
||||
"checksum nom 5.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c618b63422da4401283884e6668d39f819a106ef51f5f59b81add00075da35ca"
|
||||
"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09"
|
||||
"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32"
|
||||
|
@ -708,7 +709,7 @@ dependencies = [
|
|||
"checksum pango-sys 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ee97abcad820f9875e032656257ad1c790e7b11a0e6ce2516a8f5b0d8f8213f"
|
||||
"checksum pkg-config 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "72d5370d90f49f70bd033c3d75e87fc529fbfff9d6f7cccef07d6170079d91ea"
|
||||
"checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd"
|
||||
"checksum proc-macro2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afdc77cc74ec70ed262262942ebb7dac3d479e9e5cfa2da1841c0806f6cdabcc"
|
||||
"checksum proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90cf5f418035b98e655e9cdb225047638296b862b42411c4e45bb88d700f7fc0"
|
||||
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
|
||||
"checksum rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83a27732a533a1be0a0035a111fe76db89ad312f6f0347004c220c57f209a123"
|
||||
"checksum rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98dcf634205083b17d0861252431eb2acbfb698ab7478a2d20de07954f47ec7b"
|
||||
|
@ -721,7 +722,7 @@ dependencies = [
|
|||
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||
"checksum serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd"
|
||||
"checksum serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "4b133a43a1ecd55d4086bd5b4dc6c1751c68b1bfbeba7a5040442022c7e7c02e"
|
||||
"checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704"
|
||||
"checksum serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2"
|
||||
"checksum static_assertions 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7f3eb36b47e512f8f1c9e3d10c2c1965bc992bd9cdb024fa581e2194501c83d3"
|
||||
"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
|
||||
"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
|
||||
|
|
|
@ -25,7 +25,7 @@ pub struct StoryView {
|
|||
filter: TreeModelFilter,
|
||||
rows: Vec<TreeIter>,
|
||||
store: ListStore,
|
||||
view: Option<TreeView>,
|
||||
view: TreeView,
|
||||
visible: Vec<bool>,
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ pub struct AppWindow {
|
|||
}
|
||||
|
||||
impl StoryView {
|
||||
pub fn new(fetcher: Fetcher<BufReader<File>>) -> Self {
|
||||
pub fn new(fetcher: Fetcher<BufReader<File>>, view: TreeView) -> Self {
|
||||
const LENGTH: usize = 4;
|
||||
|
||||
let types: [Type; LENGTH] = [
|
||||
|
@ -50,7 +50,6 @@ impl StoryView {
|
|||
let store = ListStore::new(&types);
|
||||
let filter = TreeModelFilter::new(&store, None);
|
||||
let columns: [u32; LENGTH] = [0, 1, 2, 3];
|
||||
let view = None;
|
||||
|
||||
let mut rows: Vec<TreeIter> = Vec::with_capacity(fetcher.len());
|
||||
let mut visible: Vec<bool> = Vec::with_capacity(fetcher.len());
|
||||
|
@ -68,6 +67,7 @@ impl StoryView {
|
|||
}
|
||||
|
||||
filter.set_visible_column(1);
|
||||
view.set_model(Some(&filter));
|
||||
|
||||
StoryView {
|
||||
fetcher,
|
||||
|
@ -79,48 +79,34 @@ impl StoryView {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn attach(&mut self, view: TreeView) -> Option<TreeView> {
|
||||
view.set_model(Some(&self.filter));
|
||||
|
||||
self.view.replace(view).and_then(|view| {
|
||||
view.set_model(None::<&TreeModel>);
|
||||
Some(view)
|
||||
})
|
||||
pub fn detach(mut self) -> TreeView {
|
||||
replace(&mut self.view, TreeView::new())
|
||||
}
|
||||
|
||||
pub fn detach(&mut self) -> Option<TreeView> {
|
||||
self.view.take().and_then(|view| {
|
||||
view.set_model(None::<&TreeModel>);
|
||||
Some(view)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn filter<T>(&mut self, filter: T)
|
||||
pub fn filter<T>(&mut self, f: &T)
|
||||
where
|
||||
T: Sync + Fn(&Story) -> bool,
|
||||
{
|
||||
let store = &self.store;
|
||||
let visible = &mut self.visible;
|
||||
|
||||
let bitmap: Vec<bool> = self.fetcher.par_iter().map(&filter).collect();
|
||||
self.view.set_model(None::<&ListStore>);
|
||||
let visible: Vec<bool> = self.fetcher.par_iter().map(f).collect();
|
||||
|
||||
for (i, row) in self.rows.iter().enumerate() {
|
||||
let new = bitmap[i];
|
||||
let old = visible[i];
|
||||
let old = self.visible[i];
|
||||
let new = visible[i];
|
||||
|
||||
if new != old {
|
||||
store.set_value(row, 1, &new.to_value());
|
||||
self.store.set_value(row, 1, &new.to_value());
|
||||
}
|
||||
}
|
||||
|
||||
self.visible = bitmap;
|
||||
self.visible = visible;
|
||||
self.view.set_model(Some(&self.filter));
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for StoryView {
|
||||
fn drop(&mut self) {
|
||||
println!("DROP!");
|
||||
self.detach();
|
||||
self.view.set_model(None::<&ListStore>);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -170,17 +156,11 @@ impl AppWindow {
|
|||
let view = match replace(&mut self.store, Empty) {
|
||||
Empty => panic!(),
|
||||
Detached(view) => view,
|
||||
Attached(mut store) => {
|
||||
let view = store.detach();
|
||||
drop(store);
|
||||
view.unwrap()
|
||||
}
|
||||
Attached(store) => store.detach(),
|
||||
};
|
||||
|
||||
let fetcher = Fetcher::from(path).unwrap();
|
||||
let mut store = StoryView::new(fetcher);
|
||||
|
||||
store.attach(view);
|
||||
let store = StoryView::new(fetcher, view);
|
||||
|
||||
self.store = Attached(store);
|
||||
}
|
||||
|
@ -195,13 +175,13 @@ impl AppWindow {
|
|||
};
|
||||
|
||||
if query.trim() == "" {
|
||||
model.filter(|_| true);
|
||||
model.filter(&|_| true);
|
||||
return;
|
||||
}
|
||||
|
||||
match parse(query) {
|
||||
Err(_) => model.filter(|_| false),
|
||||
Ok(filter) => model.filter(filter),
|
||||
Err(_) => model.filter(&|_| false),
|
||||
Ok(filter) => model.filter(&filter),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue