[sushi/wip/cosimoc/no-clutter: 44/50] Refactor how fullscreen state is stored



commit e28a9424054c7ff78406beb2742f05481b6d18aa
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sat Jun 15 16:30:57 2019 -0700

    Refactor how fullscreen state is stored
    
    Make it owned by the renderer itself. This way the renderer can
    change e.g. its sizing behavior depending on whether it is fullscreen.

 src/ui/fallbackRenderer.js |  5 +++--
 src/ui/mainWindow.js       | 34 +++++++++++++---------------------
 src/ui/renderer.js         | 20 ++++++++++++++++++++
 src/ui/utils.js            | 10 ++++------
 src/viewers/audio.js       |  5 +++--
 src/viewers/evince.js      | 12 +++++-------
 src/viewers/font.js        |  5 +++--
 src/viewers/gst.js         | 11 ++++++++---
 src/viewers/html.js        |  7 ++++---
 src/viewers/image.js       | 11 +++++------
 src/viewers/text.js        |  4 +++-
 11 files changed, 71 insertions(+), 53 deletions(-)
---
diff --git a/src/ui/fallbackRenderer.js b/src/ui/fallbackRenderer.js
index 62c13ad..3c342d2 100644
--- a/src/ui/fallbackRenderer.js
+++ b/src/ui/fallbackRenderer.js
@@ -30,6 +30,9 @@ const Renderer = imports.ui.renderer;
 var FallbackRenderer = GObject.registerClass({
     Implements: [Renderer.Renderer],
     Properties: {
+        fullscreen: GObject.ParamSpec.boolean('fullscreen', '', '',
+                                              GObject.ParamFlags.READABLE,
+                                              false),
         ready: GObject.ParamSpec.boolean('ready', '', '',
                                          GObject.ParamFlags.READABLE,
                                          false)
@@ -39,8 +42,6 @@ var FallbackRenderer = GObject.registerClass({
         super._init({ orientation: Gtk.Orientation.HORIZONTAL,
                       spacing: 6 });
 
-        this.canFullScreen = false;
-
         this._fileLoader = new Sushi.FileLoader();
         this._fileLoader.file = file;
         this._fileLoaderId = this._fileLoader.connect('notify', this._onFileInfoChanged.bind(this));
diff --git a/src/ui/mainWindow.js b/src/ui/mainWindow.js
index a74f49d..aee6650 100644
--- a/src/ui/mainWindow.js
+++ b/src/ui/mainWindow.js
@@ -60,7 +60,6 @@ const Embed = GObject.registerClass(class Embed extends Gtk.Overlay {
 
 var MainWindow = GObject.registerClass(class MainWindow extends Gtk.Window {
     _init(application) {
-        this._isFullScreen = false;
         this._renderer = null;
         this._lastWindowSize = [0, 0];
         this._toolbar = null;
@@ -116,7 +115,7 @@ var MainWindow = GObject.registerClass(class MainWindow extends Gtk.Window {
 
         if (key == Gdk.KEY_f ||
             key == Gdk.KEY_F11)
-            this.toggleFullScreen();
+            this._renderer.toggleFullscreen();
 
         return false;
     }
@@ -144,6 +143,15 @@ var MainWindow = GObject.registerClass(class MainWindow extends Gtk.Window {
     /**************************************************************************
      *********************** texture allocation *******************************
      **************************************************************************/
+    _onRendererFullscreen() {
+        this._removeToolbarTimeout();
+
+        if (this._renderer.fullscreen)
+            this.fullscreen();
+        else
+            this.unfullscreen();
+    }
+
     _onRendererReady() {
         if (this._renderer.ready) {
             this._resizeWindow();
@@ -155,10 +163,10 @@ var MainWindow = GObject.registerClass(class MainWindow extends Gtk.Window {
     }
 
     _resizeWindow() {
-        if (this._isFullScreen)
+        if (!this._renderer)
             return;
 
-        if (!this._renderer)
+        if (this._renderer.fullscreen)
             return;
 
         let maxSize = [Constants.VIEW_MAX_W, Constants.VIEW_MAX_H];
@@ -215,6 +223,7 @@ var MainWindow = GObject.registerClass(class MainWindow extends Gtk.Window {
         this._renderer.expand = true;
         this._embed.add(this._renderer);
 
+        this._renderer.connect('notify::fullscreen', this._onRendererFullscreen.bind(this));
         this._renderer.connect('notify::ready', this._onRendererReady.bind(this));
         this._onRendererReady();
 
@@ -297,21 +306,4 @@ var MainWindow = GObject.registerClass(class MainWindow extends Gtk.Window {
     setTitle(label) {
         this.set_title(label);
     }
-
-    toggleFullScreen() {
-        if (!this._renderer.canFullScreen)
-            return false;
-
-        this._removeToolbarTimeout();
-
-        if (this._isFullScreen) {
-            this._isFullScreen = false;
-            this.unfullscreen();
-        } else {
-            this._isFullScreen = true;
-            this.fullscreen();
-        }
-
-        return this._isFullScreen;
-    }
 });
diff --git a/src/ui/renderer.js b/src/ui/renderer.js
index 17aafa2..82fb618 100644
--- a/src/ui/renderer.js
+++ b/src/ui/renderer.js
@@ -10,6 +10,9 @@ var ResizePolicy = {
 var Renderer = GObject.registerClass({
     Requires: [Gtk.Widget],
     Properties: {
+        fullscreen: GObject.ParamSpec.boolean('fullscreen', '', '',
+                                              GObject.ParamFlags.READABLE,
+                                              false),
         ready: GObject.ParamSpec.boolean('ready', '', '',
                                          GObject.ParamFlags.READABLE,
                                          false)
@@ -20,6 +23,23 @@ var Renderer = GObject.registerClass({
         this.notify('ready');
     }
 
+    toggleFullscreen() {
+        if (!this.canFullscreen)
+            return;
+
+        this._fullscreen = !this.fullscreen;
+        this.notify('fullscreen');
+    }
+
+    get canFullscreen() {
+        // by default, we can fullscreen if we're resizable
+        return this.resizable;
+    }
+
+    get fullscreen() {
+        return !!this._fullscreen;
+    }
+
     get moveOnClick() {
         return true;
     }
diff --git a/src/ui/utils.js b/src/ui/utils.js
index 6bf7153..77a3db9 100644
--- a/src/ui/utils.js
+++ b/src/ui/utils.js
@@ -66,16 +66,14 @@ function createToolButton(iconName, callback) {
     return button;
 }
 
-function createFullScreenButton(mainWindow) {
-    let button = createToolButton('view-fullscreen-symbolic', function() {
-        let fullscreen = mainWindow.toggleFullScreen();
-        if (fullscreen)
+function createFullscreenButton(renderer) {
+    return createToolButton('view-fullscreen-symbolic', function(button) {
+        renderer.toggleFullscreen();
+        if (renderer.fullscreen)
             button.icon_name = 'view-restore-symbolic';
         else
             button.icon_name = 'view-fullscreen-symbolic';
     });
-
-    return button;
 }
 
 function createOpenButton(file, mainWindow) {
diff --git a/src/viewers/audio.js b/src/viewers/audio.js
index 6240752..6d914df 100644
--- a/src/viewers/audio.js
+++ b/src/viewers/audio.js
@@ -50,6 +50,9 @@ function _formatTimeString(timeVal) {
 var Klass = GObject.registerClass({
     Implements: [Renderer.Renderer],
     Properties: {
+        fullscreen: GObject.ParamSpec.boolean('fullscreen', '', '',
+                                              GObject.ParamFlags.READABLE,
+                                              false),
         ready: GObject.ParamSpec.boolean('ready', '', '',
                                          GObject.ParamFlags.READABLE,
                                          false)
@@ -59,8 +62,6 @@ var Klass = GObject.registerClass({
         super._init({ orientation: Gtk.Orientation.HORIZONTAL,
                       spacing: 6 });
 
-        this.canFullScreen = false;
-
         this._mainWindow = mainWindow;
         this._file = file;
 
diff --git a/src/viewers/evince.js b/src/viewers/evince.js
index f2c660e..abb2839 100644
--- a/src/viewers/evince.js
+++ b/src/viewers/evince.js
@@ -32,21 +32,19 @@ const Utils = imports.ui.utils;
 var Klass = GObject.registerClass({
     Implements: [Renderer.Renderer],
     Properties: {
+        fullscreen: GObject.ParamSpec.boolean('fullscreen', '', '',
+                                              GObject.ParamFlags.READABLE,
+                                              false),
         ready: GObject.ParamSpec.boolean('ready', '', '',
                                          GObject.ParamFlags.READABLE,
                                          false)
     },
 }, class EvinceRenderer extends Gtk.ScrolledWindow {
-    _init(file, mainWindow) {
+    _init(file) {
         super._init({ visible: true,
                       min_content_height: Constants.VIEW_MIN,
                       min_content_width: Constants.VIEW_MIN });
 
-        this.canFullScreen = true;
-
-        this._mainWindow = mainWindow;
-        this._file = file;
-
         this._pdfLoader = new Sushi.PdfLoader();
         this._pdfLoader.connect('notify::document', this._onDocumentLoaded.bind(this));
         this._pdfLoader.uri = file.get_uri();
@@ -103,7 +101,7 @@ var Klass = GObject.registerClass({
         let separator = new Gtk.Separator({ orientation: Gtk.Orientation.VERTICAL });
         toolbar.add(separator);
 
-        let toolbarZoom = Utils.createFullScreenButton(this._mainWindow);
+        let toolbarZoom = Utils.createFullscreenButton(this);
         toolbar.add(toolbarZoom);
     }
 
diff --git a/src/viewers/font.js b/src/viewers/font.js
index 242a832..9bba13d 100644
--- a/src/viewers/font.js
+++ b/src/viewers/font.js
@@ -30,6 +30,9 @@ const Renderer = imports.ui.renderer;
 var Klass = GObject.registerClass({
     Implements: [Renderer.Renderer],
     Properties: {
+        fullscreen: GObject.ParamSpec.boolean('fullscreen', '', '',
+                                              GObject.ParamFlags.READABLE,
+                                              false),
         ready: GObject.ParamSpec.boolean('ready', '', '',
                                          GObject.ParamFlags.READABLE,
                                          false)
@@ -39,8 +42,6 @@ var Klass = GObject.registerClass({
         super._init({ uri: file.get_uri(),
                       visible: true })
 
-        this.canFullScreen = true;
-
         this.isReady();
     }
 });
diff --git a/src/viewers/gst.js b/src/viewers/gst.js
index 6843c5d..096b6b8 100644
--- a/src/viewers/gst.js
+++ b/src/viewers/gst.js
@@ -32,6 +32,9 @@ const Utils = imports.ui.utils;
 var Klass = GObject.registerClass({
     Implements: [Renderer.Renderer],
     Properties: {
+        fullscreen: GObject.ParamSpec.boolean('fullscreen', '', '',
+                                              GObject.ParamFlags.READABLE,
+                                              false),
         ready: GObject.ParamSpec.boolean('ready', '', '',
                                          GObject.ParamFlags.READABLE,
                                          false)
@@ -40,9 +43,6 @@ var Klass = GObject.registerClass({
     _init(file) {
         super._init({ uri: file.get_uri() });
 
-        // fullscreen is handled internally by the widget
-        this.canFullScreen = false;
-
         this._autoplayId = GLib.idle_add(0, () => {
             this._autoplayId = 0;
             this.play();
@@ -60,6 +60,11 @@ var Klass = GObject.registerClass({
         }
     }
 
+    get canFullscreen() {
+        // fullscreen is handled internally by the widget
+        return false;
+    }
+
     get resizePolicy() {
         return Renderer.ResizePolicy.STRETCHED;
     }
diff --git a/src/viewers/html.js b/src/viewers/html.js
index dfae974..119c753 100644
--- a/src/viewers/html.js
+++ b/src/viewers/html.js
@@ -31,6 +31,9 @@ const Utils = imports.ui.utils;
 var Klass = GObject.registerClass({
     Implements: [Renderer.Renderer],
     Properties: {
+        fullscreen: GObject.ParamSpec.boolean('fullscreen', '', '',
+                                              GObject.ParamFlags.READABLE,
+                                              false),
         ready: GObject.ParamSpec.boolean('ready', '', '',
                                          GObject.ParamFlags.READABLE,
                                          false)
@@ -39,8 +42,6 @@ var Klass = GObject.registerClass({
     _init(file, mainWindow) {
         super._init();
 
-        this.canFullScreen = true;
-
         this._mainWindow = mainWindow;
         this._file = file;
 
@@ -57,7 +58,7 @@ var Klass = GObject.registerClass({
     }
 
     populateToolbar(toolbar) {
-        let toolbarZoom = Utils.createFullScreenButton(this._mainWindow);
+        let toolbarZoom = Utils.createFullscreenButton(this);
         toolbar.add(toolbarZoom);
 
         let separator = new Gtk.Separator({ orientation: Gtk.Orientation.VERTICAL });
diff --git a/src/viewers/image.js b/src/viewers/image.js
index c8eced3..f5b7f52 100644
--- a/src/viewers/image.js
+++ b/src/viewers/image.js
@@ -33,21 +33,20 @@ const Utils = imports.ui.utils;
 var Klass = GObject.registerClass({
     Implements: [Renderer.Renderer],
     Properties: {
+        fullscreen: GObject.ParamSpec.boolean('fullscreen', '', '',
+                                              GObject.ParamFlags.READABLE,
+                                              false),
         ready: GObject.ParamSpec.boolean('ready', '', '',
                                          GObject.ParamFlags.READABLE,
                                          false)
     },
 }, class ImageRenderer extends Gtk.DrawingArea {
-    _init(file, mainWindow) {
+    _init(file) {
         super._init();
 
         this._pix = null;
         this._scaledSurface = null;
         this._timeoutId = 0;
-        this.canFullScreen = true;
-
-        this._mainWindow = mainWindow;
-        this._file = file;
 
         this._createImageTexture(file);
 
@@ -163,7 +162,7 @@ var Klass = GObject.registerClass({
     }
 
     populateToolbar(toolbar) {
-        let toolbarZoom = Utils.createFullScreenButton(this._mainWindow);
+        let toolbarZoom = Utils.createFullscreenButton(this);
         toolbar.add(toolbarZoom);
     }
 
diff --git a/src/viewers/text.js b/src/viewers/text.js
index 2a45a74..4189eec 100644
--- a/src/viewers/text.js
+++ b/src/viewers/text.js
@@ -45,6 +45,9 @@ function _getGeditScheme() {
 var Klass = GObject.registerClass({
     Implements: [Renderer.Renderer],
     Properties: {
+        fullscreen: GObject.ParamSpec.boolean('fullscreen', '', '',
+                                              GObject.ParamFlags.READABLE,
+                                              false),
         ready: GObject.ParamSpec.boolean('ready', '', '',
                                          GObject.ParamFlags.READABLE,
                                          false)
@@ -53,7 +56,6 @@ var Klass = GObject.registerClass({
     _init(file, mainWindow) {
         super._init();
 
-        this.canFullScreen = true;
         this._mainWindow = mainWindow;
         this._file = file;
 


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