[sushi/wip/cosimoc/no-clutter: 48/66] Remove prepare step from renderers



commit 6e98383b7bfee79944cec7a5e6171b3a469cfb56
Author: Cosimo Cecchi <cosimo endlessm com>
Date:   Tue Jun 4 23:04:27 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       | 37 ++++++++++++++++---------------------
 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        | 40 ++++++++++++++++++----------------------
 9 files changed, 71 insertions(+), 105 deletions(-)
---
diff --git a/src/js/ui/fallbackRenderer.js b/src/js/ui/fallbackRenderer.js
index d4d577d..5d30ca1 100644
--- a/src/js/ui/fallbackRenderer.js
+++ b/src/js/ui/fallbackRenderer.js
@@ -43,7 +43,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;
@@ -96,10 +96,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 d4cbf4f..331178d 100644
--- a/src/js/ui/mainWindow.js
+++ b/src/js/ui/mainWindow.js
@@ -175,34 +175,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._renderer = this._mimeHandler.getObject(this._fileInfo.get_content_type());
-                            this._renderer.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(renderer) {
-        /* 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 67116ac..7548fe7 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 15865f8..a1e2cca 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.resizeWindow();
         });
-        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 15403c8..a83a579 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;
     },
 
@@ -172,9 +171,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 {
@@ -187,6 +183,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 40af9ea..34c1d9f 100644
--- a/src/js/viewers/text.js
+++ b/src/js/viewers/text.js
@@ -44,10 +44,9 @@ 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',
@@ -64,29 +63,11 @@ const TextRenderer = new Lang.Class({
                 this._geditScheme = geditSchemeName;
         }
 
-    },
-
-    render : function() {
-        return this._scrolledWin;
-    },
-
-    _onBufferLoaded : function(loader, buffer) {
-        this._buffer = buffer;
-        this._buffer.highlight_syntax = true;
-
-        let styleManager = GtkSource.StyleSchemeManager.get_default();
-        let scheme = styleManager.get_scheme(this._geditScheme);
-        this._buffer.set_style_scheme(scheme);
 
-        this._view = new GtkSource.View({ buffer: this._buffer,
-                                          editable: false,
+        this._view = new GtkSource.View({ editable: false,
                                           cursor_visible: false,
                                           monospace: true });
         this._view.set_can_focus(false);
-
-        if (this._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)
@@ -98,8 +79,23 @@ const TextRenderer = new Lang.Class({
         this._scrolledWin = new Gtk.ScrolledWindow();
         this._scrolledWin.add(this._view);
         this._scrolledWin.show_all();
+    },
+
+    render : function() {
+        return this._scrolledWin;
+    },
+
+    _onBufferLoaded : function(loader, buffer) {
+        this._buffer = buffer;
+        this._buffer.highlight_syntax = true;
+
+        let styleManager = GtkSource.StyleSchemeManager.get_default();
+        let scheme = styleManager.get_scheme(this._geditScheme);
+        this._buffer.set_style_scheme(scheme);
 
-        this._callback();
+        this._view.set_buffer(this._buffer);
+        if (this._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]