imageView: Skip unsupported formats when sliding
If an image with unsupported format is opened directly, the error is shown. Closes #92 Part-of: <https://gitlab.gnome.org/Incubator/loupe/-/merge_requests/212>
This commit is contained in:
parent
8f55668cd6
commit
6db58463bf
5 changed files with 83 additions and 25 deletions
|
|
@ -109,6 +109,7 @@ mod imp {
|
|||
pub struct LpImage {
|
||||
pub(super) file: RefCell<Option<gio::File>>,
|
||||
pub(super) is_deleted: Cell<bool>,
|
||||
pub(super) is_unsupported: Cell<bool>,
|
||||
/// Track changes to this image
|
||||
pub(super) file_monitor: RefCell<Option<gio::FileMonitor>>,
|
||||
pub(super) frame_buffer: Arc<ArcSwap<tiling::FrameBuffer>>,
|
||||
|
|
@ -200,6 +201,9 @@ mod imp {
|
|||
glib::ParamSpecBoolean::builder("is-loaded")
|
||||
.read_only()
|
||||
.build(),
|
||||
glib::ParamSpecBoolean::builder("is-unsupported")
|
||||
.read_only()
|
||||
.build(),
|
||||
glib::ParamSpecString::builder("error").read_only().build(),
|
||||
glib::ParamSpecObject::builder::<LpImageMetadata>("metadata")
|
||||
.read_only()
|
||||
|
|
@ -241,6 +245,7 @@ mod imp {
|
|||
"file" => obj.file().to_value(),
|
||||
"is-deleted" => obj.is_deleted().to_value(),
|
||||
"is-loaded" => obj.is_loaded().to_value(),
|
||||
"is-unsupported" => obj.is_unsupported().to_value(),
|
||||
"error" => obj.error().to_value(),
|
||||
"metadata" => obj.metadata().to_value(),
|
||||
"format-name" => obj.format_name().to_value(),
|
||||
|
|
@ -759,13 +764,7 @@ impl LpImage {
|
|||
// Reset background color for reloads
|
||||
self.set_background_color(None);
|
||||
|
||||
let (decoder, mut decoder_update) = match Decoder::new(file.clone(), tiles.clone()).await {
|
||||
Ok(x) => x,
|
||||
Err(err) => {
|
||||
self.set_error(err);
|
||||
return;
|
||||
}
|
||||
};
|
||||
let (decoder_res, mut decoder_update) = Decoder::new(file.clone(), tiles.clone()).await;
|
||||
|
||||
let weak_obj = self.downgrade();
|
||||
spawn(async move {
|
||||
|
|
@ -777,8 +776,10 @@ impl LpImage {
|
|||
log::debug!("Stopped listening to decoder since sender is gone");
|
||||
});
|
||||
|
||||
let decoder = Arc::new(decoder);
|
||||
self.imp().decoder.replace(Some(decoder));
|
||||
if let Ok(decoder) = decoder_res {
|
||||
let decoder = Arc::new(decoder);
|
||||
self.imp().decoder.replace(Some(decoder));
|
||||
}
|
||||
}
|
||||
|
||||
/// Called when decoder sends update
|
||||
|
|
@ -837,6 +838,12 @@ impl LpImage {
|
|||
imp.tick_callback.replace(Some(callback_id));
|
||||
}
|
||||
}
|
||||
DecoderUpdate::UnsupportedFormat => {
|
||||
if !self.is_unsupported() {
|
||||
imp.is_unsupported.set(true);
|
||||
self.notify("is-unsupported");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -874,6 +881,10 @@ impl LpImage {
|
|||
self.imp().is_deleted.get()
|
||||
}
|
||||
|
||||
pub fn is_unsupported(&self) -> bool {
|
||||
self.imp().is_unsupported.get()
|
||||
}
|
||||
|
||||
/// Zoom level that makes the image fit in widget
|
||||
///
|
||||
/// During image rotation the image does not actually fit into widget.
|
||||
|
|
|
|||
|
|
@ -256,7 +256,7 @@ impl LpImageView {
|
|||
if let Some(first) = files.first().cloned() {
|
||||
let model = LpFileModel::from_files(files);
|
||||
self.set_model(model);
|
||||
let page = LpImagePage::from_file(&first);
|
||||
let page = self.new_image_page(&first);
|
||||
|
||||
sliding_view.clear();
|
||||
sliding_view.append(&page);
|
||||
|
|
@ -356,7 +356,7 @@ impl LpImageView {
|
|||
let page = if let Some(page) = sliding_view.get(new_file) {
|
||||
page
|
||||
} else {
|
||||
let page = LpImagePage::from_file(new_file);
|
||||
let page = self.new_image_page(new_file);
|
||||
|
||||
if new_index > current_index {
|
||||
sliding_view.append(&page);
|
||||
|
|
@ -397,7 +397,7 @@ impl LpImageView {
|
|||
if let Some(page) = existing.get(&file.uri()) {
|
||||
sliding_view.move_to(page, position);
|
||||
} else {
|
||||
sliding_view.insert(&LpImagePage::from_file(file), position);
|
||||
sliding_view.insert(&self.new_image_page(file), position);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -438,6 +438,32 @@ impl LpImageView {
|
|||
self.imp().model.borrow().clone()
|
||||
}
|
||||
|
||||
/// Create new image that communicates updates to file model
|
||||
fn new_image_page(&self, file: &gio::File) -> LpImagePage {
|
||||
let page = LpImagePage::from_file(file);
|
||||
|
||||
page.image().connect_notify_local(
|
||||
Some("is-unsupported"),
|
||||
glib::clone!(@weak self as obj => move |image, _| {
|
||||
if image.is_unsupported() {
|
||||
if obj.current_image().as_ref() == Some(image) {
|
||||
log::debug!(
|
||||
"Image format unsupported but not removing since current image"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if let Some(file) = image.file() {
|
||||
log::debug!("Removing image with unsupported format {:?}", file.uri());
|
||||
obj.model().remove(&file);
|
||||
}
|
||||
}
|
||||
}),
|
||||
);
|
||||
|
||||
page
|
||||
}
|
||||
|
||||
fn set_model(&self, model: LpFileModel) {
|
||||
model.connect_changed(
|
||||
glib::clone!(@weak self as obj => move || obj.model_content_changed_cb()),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue