[polari] roomStack: Only keep room widgets in stack as required



commit 132994557187d9ac5c80b8e07ace1ddf476eb884
Author: Florian Müllner <fmuellner gnome org>
Date:   Tue Mar 4 19:20:25 2014 +0100

    roomStack: Only keep room widgets in stack as required
    
    GtkStack tends to get slow when containing too many widgets. Work
    around this by only keeping the widgets that are actually visible
    in the stack (i.e. two during transitions, one otherwise) and
    remove widgets that are hidden.

 src/roomStack.js |   22 ++++++++++++++++++++--
 1 files changed, 20 insertions(+), 2 deletions(-)
---
diff --git a/src/roomStack.js b/src/roomStack.js
index 78dcbe2..84006cc 100644
--- a/src/roomStack.js
+++ b/src/roomStack.js
@@ -40,7 +40,8 @@ const RoomStack = new Lang.Class({
         this._rooms[id] = view;
 
         this._inputSizeGroup.add_widget(view.inputWidget);
-        this.widget.add_named(view.widget, id);
+        if (!this.widget.visible_child)
+            this.widget.add(view.widget);
     },
 
     _roomAdded: function(roomManager, room) {
@@ -53,9 +54,26 @@ const RoomStack = new Lang.Class({
     },
 
     _activeRoomChanged: function(manager, room) {
-        this.widget.set_visible_child_name(room ? room.id : 'placeholder');
+        let previous = this.widget.visible_child;
+        let next = this._rooms[room ? room.id : 'placeholder'];
+
+        if (!next.widget.get_parent())
+            this.widget.add(next.widget);
+        this.widget.set_visible_child(next.widget);
         this.widget.transition_type = room ? Gtk.StackTransitionType.CROSSFADE
                                            : Gtk.StackTransitionType.NONE;
+
+        if (!previous)
+            return;
+
+        let id = this.widget.connect('notify::transition-running', Lang.bind(this,
+            function() {
+                if (this.widget.transition_running)
+                    return;
+                if (previous.get_parent())
+                    this.widget.remove(previous);
+                this.widget.disconnect(id);
+            }));
     },
 
     _updateSensitivity: function() {


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