[sushi/wip/cosimoc/no-clutter: 29/50] Remove prepare step from renderers



commit c22de0e6dc1aa9df9474aed5fd60b595ca6c0d89
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sat Jun 15 12:18:02 2019 -0700

    Remove prepare step from renderers
    
    Have a single API entry point and return a widget directly.
    This allows us to simplify the renderers, but also fixes the gstreamer
    plugin, which needs to be parented before it can start playing.

 src/js/ui/fallbackRenderer.js |  6 +-----
 src/js/ui/mainWindow.js       | 41 ++++++++++++++++-------------------------
 src/js/viewers/audio.js       |  7 +------
 src/js/viewers/evince.js      | 31 ++++++++++++-------------------
 src/js/viewers/font.js        | 12 +-----------
 src/js/viewers/gst.js         | 21 ++++++++++++++-------
 src/js/viewers/html.js        |  7 +------
 src/js/viewers/image.js       | 15 +++++++--------
 src/js/viewers/text.js        | 38 ++++++++++++++++----------------------
 9 files changed, 69 insertions(+), 109 deletions(-)
---
diff --git a/src/js/ui/fallbackRenderer.js b/src/js/ui/fallbackRenderer.js
index f95b8f9..4968700 100644
--- a/src/js/ui/fallbackRenderer.js
+++ b/src/js/ui/fallbackRenderer.js
@@ -45,7 +45,7 @@ var FallbackRenderer = new Lang.Class({
         this.canFullScreen = false;
     },
 
-    prepare : function(file, mainWindow, callback) {
+    render : function(file, mainWindow) {
         this._mainWindow = mainWindow;
         this._lastWidth = 0;
         this._lastHeight = 0;
@@ -98,10 +98,6 @@ var FallbackRenderer = new Lang.Class({
 
         this._box.show_all();
 
-        callback();
-    },
-
-    render : function() {
         return this._box;
     },
 
diff --git a/src/js/ui/mainWindow.js b/src/js/ui/mainWindow.js
index 9c60fff..808eb5e 100644
--- a/src/js/ui/mainWindow.js
+++ b/src/js/ui/mainWindow.js
@@ -42,7 +42,6 @@ var MainWindow = new Lang.Class({
 
     _init : function(application) {
         this._isFullScreen = false;
-        this._pendingRenderer = null;
         this._renderer = null;
         this._view = null;
         this._toolbar = null;
@@ -192,37 +191,29 @@ var MainWindow = new Lang.Class({
          Gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
          Gio.FileQueryInfoFlags.NONE,
          GLib.PRIORITY_DEFAULT, null,
-         Lang.bind (this,
-                    function(obj, res) {
-                        try {
-                            this._fileInfo = obj.query_info_finish(res);
-                            this.setTitle(this._fileInfo.get_display_name());
-
-                            /* now prepare the real renderer */
-                            this._pendingRenderer = 
this._mimeHandler.getObject(this._fileInfo.get_content_type());
-                            this._pendingRenderer.prepare(file, this, Lang.bind(this, 
this._onRendererPrepared));
-                        } catch(e) {
-                            /* FIXME: report the error */
-                            logError(e, 'Error calling prepare() on viewer');
-                        }}));
+         Lang.bind (this, function(obj, res) {
+             try {
+                 this._fileInfo = obj.query_info_finish(res);
+                 this.setTitle(this._fileInfo.get_display_name());
+
+                 /* now prepare the real renderer */
+                 this._renderer = this._mimeHandler.getObject(this._fileInfo.get_content_type());
+                 this._createView(file);
+                 this._createToolbar();
+             } catch(e) {
+                 /* FIXME: report the error */
+                 logError(e, 'Error calling prepare() on viewer');
+             }})
+        );
     },
 
-    _onRendererPrepared : function() {
-        this._renderer = this._pendingRenderer;
-        this._pendingRenderer = null;
-
-        /* generate the texture and toolbar for the new renderer */
-        this._createView();
-        this._createToolbar();
-    },
-
-    _createView : function() {
+    _createView : function(file) {
         if (this._view) {
             this._view.destroy();
             this._view = null;
         }
 
-        this._view = this._renderer.render();
+        this._view = this._renderer.render(file, this);
         this._view.expand = true;
         this._view.show();
 
diff --git a/src/js/viewers/audio.js b/src/js/viewers/audio.js
index 5209831..b3071f0 100644
--- a/src/js/viewers/audio.js
+++ b/src/js/viewers/audio.js
@@ -62,10 +62,9 @@ const AudioRenderer = new Lang.Class({
         this.canFullScreen = false;
     },
 
-    prepare : function(file, mainWindow, callback) {
+    render : function(file, mainWindow) {
         this._mainWindow = mainWindow;
         this._file = file;
-        this._callback = callback;
 
         this._createPlayer(file);
 
@@ -96,10 +95,6 @@ const AudioRenderer = new Lang.Class({
 
         this._box.show_all();
 
-        this._callback();
-    },
-
-    render : function() {
         return this._box;
     },
 
diff --git a/src/js/viewers/evince.js b/src/js/viewers/evince.js
index b93b8f8..8ea35ce 100644
--- a/src/js/viewers/evince.js
+++ b/src/js/viewers/evince.js
@@ -46,18 +46,24 @@ const EvinceRenderer = new Lang.Class({
         this.canFullScreen = true;
     },
 
-    prepare : function(file, mainWindow, callback) {
+    render : function(file, mainWindow) {
         this._mainWindow = mainWindow;
         this._file = file;
-        this._callback = callback;
 
         this._pdfLoader = new Sushi.PdfLoader();
         this._pdfLoader.connect('notify::document',
                                 Lang.bind(this, this._onDocumentLoaded));
         this._pdfLoader.uri = file.get_uri();
-    },
 
-    render : function() {
+        this._scrolledWin = new Gtk.ScrolledWindow();
+        this._scrolledWin.set_min_content_width(Constants.VIEW_MIN);
+        this._scrolledWin.set_min_content_height(Constants.VIEW_MIN);
+        this._scrolledWin.show();
+
+        this._view = EvView.View.new();
+        this._view.show();
+        this._scrolledWin.add(this._view);
+
         return this._scrolledWin;
     },
 
@@ -73,24 +79,13 @@ const EvinceRenderer = new Lang.Class({
 
     _onDocumentLoaded : function(pdfLoader) {
         this._model = EvView.DocumentModel.new_with_document(pdfLoader.document);
-
         this._model.set_sizing_mode(EvView.SizingMode.FIT_WIDTH);
-       this._model.set_continuous(true);
+        this._model.set_continuous(true);
 
         this._model.connect('page-changed', Lang.bind(this, this._updatePageLabel));
-
-        this._view = EvView.View.new();
-        this._view.show();
-
-        this._scrolledWin = new Gtk.ScrolledWindow();
-        this._scrolledWin.set_min_content_width(Constants.VIEW_MIN);
-        this._scrolledWin.set_min_content_height(Constants.VIEW_MIN);
-        this._scrolledWin.show();
+        this._updatePageLabel();
 
         this._view.set_model(this._model);
-        this._scrolledWin.add(this._view);
-
-        this._callback();
     },
 
     getSizeForAllocation : function(allocation) {
@@ -138,8 +133,6 @@ const EvinceRenderer = new Lang.Class({
 
         let toolbarZoom = Utils.createFullScreenButton(this._mainWindow);
         toolbar.insert(toolbarZoom, -1);
-
-        this._updatePageLabel();
     },
 
     clear : function() {
diff --git a/src/js/viewers/font.js b/src/js/viewers/font.js
index 4871f76..8f89311 100644
--- a/src/js/viewers/font.js
+++ b/src/js/viewers/font.js
@@ -39,22 +39,12 @@ const FontRenderer = new Lang.Class({
         this.canFullScreen = true;
     },
 
-    prepare : function(file, mainWindow, callback) {
-        this._mainWindow = mainWindow;
+    render : function(file, mainWindow) {
         this._file = file;
-        this._callback = callback;
 
         this._fontWidget = new Sushi.FontWidget({ uri: file.get_uri() });
         this._fontWidget.show();
-        this._fontWidget.connect('loaded',
-                                 Lang.bind(this, this._onFontLoaded));
-    },
-
-    _onFontLoaded : function() {
-        this._callback();
-    },
 
-    render : function() {
         return this._fontWidget;
     },
 
diff --git a/src/js/viewers/gst.js b/src/js/viewers/gst.js
index 858f391..6296902 100644
--- a/src/js/viewers/gst.js
+++ b/src/js/viewers/gst.js
@@ -23,7 +23,7 @@
  *
  */
 
-const Sushi = imports.gi.Sushi;
+const {GLib, Sushi} = imports.gi;
 
 const Lang = imports.lang;
 
@@ -40,21 +40,28 @@ const GstRenderer = new Lang.Class({
         this.canFullScreen = false;
     },
 
-    prepare : function(file, mainWindow, callback) {
+    render : function(file, mainWindow) {
         this._player = new Sushi.MediaBin({ uri: file.get_uri() });
-        this._player.play();
         this._player.connect('size-change', function() {
             mainWindow.refreshSize();
         });
-        callback();
-    },
 
-    render : function() {
+        this._autoplayId = GLib.idle_add(0, () => {
+            this._autoplayId = 0;
+            this._player.play();
+            return false;
+        });
+
         return this._player;
     },
 
     clear : function() {
-        this._player.stop();
+        if (this._autoplayId > 0) {
+            GLib.source_remove(this._autoplayId);
+            this._autoplayId = 0;
+        } else {
+            this._player.stop();
+        }
     },
 
     getSizeForAllocation : function(allocation) {
diff --git a/src/js/viewers/html.js b/src/js/viewers/html.js
index a26e4a3..adcba85 100644
--- a/src/js/viewers/html.js
+++ b/src/js/viewers/html.js
@@ -40,10 +40,9 @@ const HTMLRenderer = new Lang.Class({
         this.canFullScreen = true;
     },
 
-    prepare : function(file, mainWindow, callback) {
+    render : function(file, mainWindow) {
         this._mainWindow = mainWindow;
         this._file = file;
-        this._callback = callback;
 
         this._webView = new WebKit.WebView();
         this._webView.show_all();
@@ -54,10 +53,6 @@ const HTMLRenderer = new Lang.Class({
 
         this._webView.load_uri(file.get_uri());
 
-        this._callback();
-    },
-
-    render : function() {
         return this._webView;
     },
 
diff --git a/src/js/viewers/image.js b/src/js/viewers/image.js
index 260e592..ae44761 100644
--- a/src/js/viewers/image.js
+++ b/src/js/viewers/image.js
@@ -56,6 +56,9 @@ const Image = new Lang.Class({
     },
 
     _ensureScaledPix: function() {
+        if (!this._pix)
+            return;
+
         let scaleFactor = this.get_scale_factor();
         let width = this.get_allocated_width() * scaleFactor;
         let height = this.get_allocated_height() * scaleFactor;
@@ -132,15 +135,11 @@ const ImageRenderer = new Lang.Class({
         this.canFullScreen = true;
     },
 
-    prepare : function(file, mainWindow, callback) {
+    render : function(file, mainWindow) {
         this._mainWindow = mainWindow;
         this._file = file;
-        this._callback = callback;
 
         this._createImageTexture(file);
-    },
-
-    render : function() {
         return this._texture;
     },
 
@@ -173,9 +172,6 @@ const ImageRenderer = new Lang.Class({
              if (!anim.is_static_image())
                  this._startTimeout();
 
-             /* we're ready now */
-             this._callback();
-
              stream.close_async(GLib.PRIORITY_DEFAULT,
                                 null, function(object, res) {
                                     try {
@@ -188,6 +184,9 @@ const ImageRenderer = new Lang.Class({
     },
 
     getSizeForAllocation : function(allocation) {
+        if (!this._texture.pix)
+            return allocation;
+
         let width = this._texture.pix.get_width();
         let height = this._texture.pix.get_height();
         return Utils.getScaledSize([width, height], allocation, false);
diff --git a/src/js/viewers/text.js b/src/js/viewers/text.js
index 1c0cd4a..0f3d13d 100644
--- a/src/js/viewers/text.js
+++ b/src/js/viewers/text.js
@@ -58,38 +58,19 @@ const TextRenderer = new Lang.Class({
         this.canFullScreen = true;
     },
 
-    prepare : function(file, mainWindow, callback) {
+    render : function(file, mainWindow) {
         this._mainWindow = mainWindow;
         this._file = file;
-        this._callback = callback;
 
         let textLoader = new Sushi.TextLoader();
         textLoader.connect('loaded',
                            Lang.bind(this, this._onBufferLoaded));
         textLoader.uri = file.get_uri();
-    },
-
-    render : function() {
-        return this._scrolledWin;
-    },
-
-    _onBufferLoaded : function(loader, buffer) {
-        buffer.highlight_syntax = true;
 
-        let styleManager = GtkSource.StyleSchemeManager.get_default();
-        let geditScheme = _getGeditScheme();
-        let scheme = styleManager.get_scheme(geditScheme);
-        this._buffer.set_style_scheme(scheme);
-
-        this._view = new GtkSource.View({ buffer: buffer,
-                                          editable: false,
+        this._view = new GtkSource.View({ editable: false,
                                           cursor_visible: false,
                                           monospace: true });
         this._view.set_can_focus(false);
-
-        if (buffer.get_language())
-            this._view.set_show_line_numbers(true);
-
         this._view.connect('button-press-event', Lang.bind(this, function(view, event) {
             let [, button] = event.get_button();
             if (button == Gdk.BUTTON_SECONDARY)
@@ -102,7 +83,20 @@ const TextRenderer = new Lang.Class({
         this._scrolledWin.add(this._view);
         this._scrolledWin.show_all();
 
-        this._callback();
+        return this._scrolledWin;
+    },
+
+    _onBufferLoaded : function(loader, buffer) {
+        buffer.highlight_syntax = true;
+
+        let styleManager = GtkSource.StyleSchemeManager.get_default();
+        let geditScheme = _getGeditScheme();
+        let scheme = styleManager.get_scheme(geditScheme);
+        buffer.set_style_scheme(scheme);
+
+        this._view.set_buffer(buffer);
+        if (buffer.get_language())
+            this._view.set_show_line_numbers(true);
     },
 
     getSizeForAllocation : function(allocation) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]