image_view: Create functions to fill and clear carousel

This way we don't need to duplicate code for this functionality.
This commit is contained in:
Christopher Davis 2022-06-29 12:22:39 -04:00
parent 8612c317ba
commit 10cdb2c519

View file

@ -171,10 +171,7 @@ impl LpImageView {
if let Some(ref m) = *model { if let Some(ref m) = *model {
if m.directory().map_or(false, |f| !f.equal(parent)) { if m.directory().map_or(false, |f| !f.equal(parent)) {
// Clear the carousel before creating the new model // Clear the carousel before creating the new model
while carousel.n_pages() > 0 { self.clear_carousel(false);
carousel.remove(&carousel.nth_page(0));
}
*model = Some(LpFileModel::from_directory(parent)); *model = Some(LpFileModel::from_directory(parent));
log::debug!("new model created"); log::debug!("new model created");
} else { } else {
@ -194,24 +191,7 @@ impl LpImageView {
log::debug!("Currently at file {index} in the directory"); log::debug!("Currently at file {index} in the directory");
imp.filename.replace(util::get_file_display_name(file)); imp.filename.replace(util::get_file_display_name(file));
carousel.append(&LpImagePage::from_file(file)); carousel.append(&LpImagePage::from_file(file));
self.fill_carousel(model, index);
for i in 1..=N_PAGES {
if let Some(file) = model.item(index + i).and_then(|o| o.downcast().ok()) {
carousel.append(&LpImagePage::from_file(&file))
}
}
for i in 1..=N_PAGES {
if let Some(file) = index
.checked_sub(i)
.and_then(|i| model.item(i))
.and_then(|o| o.downcast().ok())
{
carousel.prepend(&LpImagePage::from_file(&file))
}
}
imp.prev_index.set(index);
} }
} }
@ -261,33 +241,56 @@ impl LpImageView {
carousel.scroll_to(&page, true); carousel.scroll_to(&page, true);
// Clear everything on either side, then refill // Clear everything on either side, then refill
for _ in 0..(carousel.position() as u32) { self.clear_carousel(true);
carousel.remove(&carousel.nth_page(0)); self.fill_carousel(model, new_index);
}
while carousel.n_pages() > 1 { drop(guard);
carousel.remove(&carousel.nth_page(carousel.n_pages() - 1)) }
}
// Fills the carousel with items on either side of the given `index` of `model`
fn fill_carousel(&self, model: &LpFileModel, index: u32) {
let imp = self.imp();
let carousel = imp.carousel.get();
// TODO: De-duplicate this into a function for filling from a model
for i in 1..=N_PAGES { for i in 1..=N_PAGES {
if let Some(file) = model.item(new_index + i).and_then(|o| o.downcast().ok()) { if let Some(ref file) = model.item(index + i).and_then(|o| o.downcast().ok()) {
carousel.append(&LpImagePage::from_file(&file)) carousel.append(&LpImagePage::from_file(file))
} }
} }
for i in 1..=N_PAGES { for i in 1..=N_PAGES {
if let Some(file) = new_index if let Some(ref file) = index
.checked_sub(i) .checked_sub(i)
.and_then(|i| model.item(i)) .and_then(|i| model.item(i))
.and_then(|o| o.downcast().ok()) .and_then(|o| o.downcast().ok())
{ {
carousel.prepend(&LpImagePage::from_file(&file)) carousel.prepend(&LpImagePage::from_file(file))
} }
} }
imp.prev_index.set(new_index); imp.prev_index.set(index);
drop(guard); }
// Clear the carousel, optionally preserving the current position
// as a point to refill from
fn clear_carousel(&self, preserve_current_page: bool) {
let carousel = self.imp().carousel.get();
if preserve_current_page {
// Remove everything before the current page
for _ in 0..(carousel.position() as u32) {
carousel.remove(&carousel.nth_page(0));
}
// Then everything after
while carousel.n_pages() > 1 {
carousel.remove(&carousel.nth_page(carousel.n_pages() - 1));
}
} else {
while carousel.n_pages() > 0 {
carousel.remove(&carousel.nth_page(0));
}
}
} }
pub fn update_action_state(&self, file: &gio::File) { pub fn update_action_state(&self, file: &gio::File) {