[sushi/wip/cosimoc/no-clutter: 48/66] Remove prepare step from renderers
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [sushi/wip/cosimoc/no-clutter: 48/66] Remove prepare step from renderers
- Date: Sat, 8 Jun 2019 18:44:11 +0000 (UTC)
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]