瀏覽代碼

Async stuff

Billy Barrow 2 年之前
父節點
當前提交
90f6b9f7c7

+ 6 - 6
src/DocumentView/DocumentViewManager.vala

@@ -58,22 +58,22 @@ namespace PpubViewer.DocumentView {
             current_view.set_scroll_position(position);
         }
 
-        public void load_asset(Ppub.Publication publication, Ppub.Asset asset) {
+        public async void load_asset(Ppub.Publication publication, Ppub.Asset asset) {
             if(asset.mimetype == "text/markdown") {
                 set_view(markdown_view);
-                markdown_view.load_asset(publication, asset);
+                yield markdown_view.load_asset(publication, asset);
             }
             else if(asset.mimetype == "application/x-ppvm") {
                 set_view(video_view);
-                video_view.load_asset(publication, asset);
+                yield video_view.load_asset(publication, asset);
             }
             else if(asset.mimetype.has_prefix("text/")) {
                 set_view(text_view);
-                text_view.load_asset(publication, asset);
+                yield text_view.load_asset(publication, asset);
             }
             else {
                 set_view(unsupported_view);
-                unsupported_view.load_asset(publication, asset);
+                yield unsupported_view.load_asset(publication, asset);
             }
         }
 
@@ -105,7 +105,7 @@ namespace PpubViewer.DocumentView {
         public abstract double get_scroll_position();
         public abstract void set_zoom_percentage(int percent);
         public abstract void set_scroll_position(double position);
-        public abstract void load_asset(Ppub.Publication publication, Ppub.Asset asset);
+        public abstract async void load_asset(Ppub.Publication publication, Ppub.Asset asset);
         public virtual void reflow() {}
         public signal void link_clicked(string href);
     }

+ 9 - 6
src/DocumentView/MarkdownView.vala

@@ -45,22 +45,25 @@ namespace PpubViewer.DocumentView {
             scrolled_window.vadjustment.set_value (position);
         }
         
-        public virtual void load_asset (Ppub.Publication publication, Ppub.Asset asset) {
+        public virtual async void load_asset (Ppub.Publication publication, Ppub.Asset asset) {
             this.publication = publication;
             markdown_view.buffer.set_text("", 0);
-            markdown_view.load_from_stream (publication.read_asset (asset.name));
+            yield markdown_view.load_from_stream_async (publication.read_asset (asset.name));
         }
 
-        protected void widget_embedded(GtkCommonMark.MarkdownViewEmbeddedWidgetHost widget, string file, string title) {
-            var pixbuf = new Gdk.Pixbuf.from_stream (publication.read_asset (file));
-            var image = new Gtk.Picture.for_pixbuf (pixbuf);
+        protected async void widget_embedded(GtkCommonMark.MarkdownViewEmbeddedWidgetHost widget, string file, string title) {
+            var image = new Gtk.Picture();
             image.content_fit = Gtk.ContentFit.FILL;
+            widget.append (image);
+
+            var pixbuf = yield new Gdk.Pixbuf.from_stream_async (publication.read_asset (file), null);
+            image.set_pixbuf (pixbuf);
+
             widget.available_width_changed.connect(wid => {
                 image.width_request = wid;
                 var ratio = image.get_paintable().get_intrinsic_aspect_ratio ();
                 image.height_request = (int)(wid / ratio);
             });
-            widget.append (image);
         }
 
 

+ 2 - 2
src/DocumentView/PlainTextView.vala

@@ -48,10 +48,10 @@ namespace PpubViewer.DocumentView {
             scrolled_window.vadjustment.set_value (position);
         }
         
-        public void load_asset (Ppub.Publication publication, Ppub.Asset asset) {
+        public async void load_asset (Ppub.Publication publication, Ppub.Asset asset) {
             text_view.buffer.set_text("", 0);
             MemoryOutputStream os = new MemoryOutputStream (null, GLib.realloc, GLib.free);
-            os.splice (publication.read_asset (asset.name), OutputStreamSpliceFlags.CLOSE_SOURCE | OutputStreamSpliceFlags.CLOSE_TARGET);
+            yield os.splice_async (publication.read_asset (asset.name), OutputStreamSpliceFlags.CLOSE_SOURCE | OutputStreamSpliceFlags.CLOSE_TARGET);
             var text = os.steal_data ();
             text.length = (int) os.get_data_size ();
 

+ 1 - 1
src/DocumentView/UnsupportedView.vala

@@ -17,7 +17,7 @@ namespace PpubViewer.DocumentView {
             return;
         }
 
-        public void load_asset (Ppub.Publication publication, Ppub.Asset asset) {
+        public async void load_asset (Ppub.Publication publication, Ppub.Asset asset) {
             status_page.description = @"Files of type '$(asset.mimetype)' cannot be displayed by this application.";
         }
 

+ 5 - 13
src/DocumentView/VideoView.vala

@@ -45,7 +45,7 @@ namespace PpubViewer.DocumentView {
             box.append (clamp);
         }
 
-        public override void load_asset (Ppub.Publication publication, Ppub.Asset asset) {
+        public override async void load_asset (Ppub.Publication publication, Ppub.Asset asset) {
             this.publication = publication;
             video_stack.visible_child = spinner;
 
@@ -55,35 +55,27 @@ namespace PpubViewer.DocumentView {
             ratio_frac = ppvm.ratio[1] / ppvm.ratio[0];
             
             var description_asset = publication.get_asset (ppvm.description_file_name);
-            base.load_asset (publication, description_asset);
+            yield base.load_asset (publication, description_asset);
 
             new Thread<void>("ppvm_video_extractor", () => prepare_stream(ppvm.streams.first()));
         }
 
-        private void prepare_stream(Ppub.VideoDescription video) throws Error {
+        private async void prepare_stream(Ppub.VideoDescription video_desc) throws Error {
 
             cleanup();
 
-            var s = publication.read_asset(ppvm.streams.first().file_name);
+            var s = publication.read_asset(video_desc.file_name);
             FileIOStream fios;
             temp = File.new_tmp("ppub_ppvm_tmp_video_XXXXXX", out fios);
 
-            fios.output_stream.splice(s, OutputStreamSpliceFlags.CLOSE_SOURCE | OutputStreamSpliceFlags.CLOSE_TARGET);
-
-            GLib.Idle.add(video_ready);
-
-        }
-
-        private bool video_ready() {
+            yield fios.output_stream.splice_async(s, OutputStreamSpliceFlags.CLOSE_SOURCE | OutputStreamSpliceFlags.CLOSE_TARGET);
 
             var mf = MediaFile.for_file (temp);
             video.set_media_stream(mf);
             video_stack.visible_child = video;
 
-            return false;
         }
 
-
         public override void reflow() {
             var video_height = video_stack.get_width () * ratio_frac;
             video_stack.height_request = (int)video_height;