[polari] roomList: Add "Connect" menu item



commit c9706cd483e7ade51ef657c1623405454f65d67e
Author: Florian Müllner <fmuellner gnome org>
Date:   Tue Jul 26 18:04:46 2016 +0200

    roomList: Add "Connect" menu item
    
    The existing reconnect action only works for accounts that are not
    offline (by user request). However there are cases where initiating
    a connection can be useful, mostly when not joining channels through
    the UI, but via an external service like webirc or bouncers. To
    account for this, show a "Connect" item when the "Reconnect" action
    isn't available.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=769192

 data/resources/room-list-header.ui |    8 ++++++++
 src/application.js                 |    2 ++
 src/chatroomManager.js             |   13 +++++++++++++
 src/roomList.js                    |   15 +++++++++++++++
 4 files changed, 38 insertions(+), 0 deletions(-)
---
diff --git a/data/resources/room-list-header.ui b/data/resources/room-list-header.ui
index d824f23..fed89c5 100644
--- a/data/resources/room-list-header.ui
+++ b/data/resources/room-list-header.ui
@@ -130,6 +130,14 @@
           </object>
         </child>
         <child>
+          <object class="GtkModelButton" id="popoverConnect">
+            <property name="xalign">0</property>
+            <property name="visible">True</property>
+            <property name="action-name">app.connect-account</property>
+            <property name="text" translatable="yes">Connect</property>
+          </object>
+        </child>
+        <child>
           <object class="GtkModelButton" id="popoverReconnect">
             <property name="xalign">0</property>
             <property name="visible">True</property>
diff --git a/src/application.js b/src/application.js
index 7df0b07..b98389b 100644
--- a/src/application.js
+++ b/src/application.js
@@ -79,6 +79,8 @@ const Application = new Lang.Class({
             accels: ['<Primary>w'] },
           { name: 'authenticate-account',
             parameter_type: GLib.VariantType.new('(os)') },
+          { name: 'connect-account',
+            parameter_type: GLib.VariantType.new('o') },
           { name: 'reconnect-account',
             parameter_type: GLib.VariantType.new('o') },
           { name: 'user-list',
diff --git a/src/chatroomManager.js b/src/chatroomManager.js
index 7cddd98..3fe7726 100644
--- a/src/chatroomManager.js
+++ b/src/chatroomManager.js
@@ -174,6 +174,9 @@ const _ChatroomManager = new Lang.Class({
         let leaveAction = this._app.lookup_action('leave-room');
         leaveAction.connect('activate', Lang.bind(this, this._onLeaveActivated));
 
+        let connectAction = this._app.lookup_action('connect-account');
+        connectAction.connect('activate', Lang.bind(this, this._onConnectAccountActivated));
+
         let reconnectAction = this._app.lookup_action('reconnect-account');
         reconnectAction.connect('activate', Lang.bind(this, this._onReconnectAccountActivated));
 
@@ -278,6 +281,16 @@ const _ChatroomManager = new Lang.Class({
         action.activate(parameter);
     },
 
+    _onConnectAccountActivated: function(action, parameter) {
+        let accountPath = parameter.deep_unpack();
+        let factory = Tp.AccountManager.dup().get_factory();
+        let account = factory.ensure_account(accountPath, []);
+        account.request_presence_async(Tp.ConnectionPresenceType.AVAILABLE,
+                                       'available',
+                                       account.requested_status_message,
+                                       null);
+    },
+
     _onReconnectAccountActivated: function(action, parameter) {
         let accountPath = parameter.deep_unpack();
         let factory = Tp.AccountManager.dup().get_factory();
diff --git a/src/roomList.js b/src/roomList.js
index 10f3cf5..d7b1db1 100644
--- a/src/roomList.js
+++ b/src/roomList.js
@@ -151,6 +151,7 @@ const RoomListHeader = new Lang.Class({
                        'popoverStatus',
                        'popoverTitle',
                        'popoverPassword',
+                       'popoverConnect',
                        'popoverReconnect',
                        'popoverRemove',
                        'popoverProperties',
@@ -173,6 +174,7 @@ const RoomListHeader = new Lang.Class({
             }));
 
         let target = new GLib.Variant('o', this._account.get_object_path());
+        this._popoverConnect.action_target = target;
         this._popoverReconnect.action_target = target;
         this._popoverRemove.action_target = target;
         this._popoverProperties.action_target = target;
@@ -197,9 +199,15 @@ const RoomListHeader = new Lang.Class({
                                   Lang.bind(this, this._onConnectionStatusChanged));
         this._onConnectionStatusChanged();
 
+        let presenceChangedId =
+            this._account.connect('notify::requested-presence-type',
+                                  Lang.bind(this, this._onRequestedPresenceChanged));
+        this._onRequestedPresenceChanged();
+
         this.connect('destroy', Lang.bind(this, function() {
             this._account.disconnect(displayNameChangedId);
             this._account.disconnect(connectionStatusChangedId);
+            this._account.disconnect(presenceChangedId);
         }));
     },
 
@@ -279,6 +287,13 @@ const RoomListHeader = new Lang.Class({
         }
     },
 
+    _onRequestedPresenceChanged: function() {
+        let presence = this._account.requested_presence_type;
+        let offline = presence == Tp.ConnectionPresenceType.OFFLINE;
+        this._popoverConnect.visible = offline;
+        this._popoverReconnect.visible = !offline;
+    },
+
     _getStatusLabel: function() {
         switch (this._account.connection_status) {
             case Tp.ConnectionStatus.CONNECTED:


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