[sushi/wip/cosimoc/no-clutter: 29/50] Remove prepare step from renderers
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [sushi/wip/cosimoc/no-clutter: 29/50] Remove prepare step from renderers
- Date: Mon, 17 Jun 2019 18:35:03 +0000 (UTC)
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]