]> cgit.babelmonkeys.de Git - jubjub.git/blobdiff - src/gui/gtk/JubGtkRosterUI.m
Track current presence
[jubjub.git] / src / gui / gtk / JubGtkRosterUI.m
index d63608e08be91b81d4b82a72e08ac16732cbaf4e..90bad6fa50c53abd97a0c916afa7c816e5405610 100644 (file)
@@ -1,11 +1,12 @@
+#import <ObjXMPP/namespaces.h>
+#include <string.h>
+
 #import "JubGtkRosterUI.h"
 #import "JubGObjectMap.h"
 #import "JubGtkChatUI.h"
 #import "JubGtkHelper.h"
 
-#include <string.h>
-
-static gboolean roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path,
+static void roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path,
     GtkTreeViewColumn *column, gpointer data)
 {
        JubGtkRosterUI *roster = data;
@@ -20,7 +21,7 @@ static gboolean roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path,
        gtk_tree_model_get(tree_model, &row_iter, 1, &jid_s, -1);
 
        // This was a group row
-       if (!jid_s) return TRUE;
+       if (!jid_s) return;
 
        pool = [OFAutoreleasePool new];
        jid = [XMPPJID JIDWithString: [OFString stringWithUTF8String: jid_s]];
@@ -29,8 +30,6 @@ static gboolean roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path,
                                 withObject: jid
                              waitUntilDone: NO];
        [pool release];
-
-       return TRUE;
 }
 
 static void presence_changed(GtkComboBox *combo_box, gpointer data)
@@ -82,14 +81,13 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
 }
 
 @implementation JubGtkRosterUI
-- initWithBuilder: (GtkBuilder*)builder_
-       connection: (XMPPConnection*)connection_
+- initWithClient: (JubChatClient*)client;
 {
        self = [super init];
 
        @try {
                GtkTreeView *roster_view;
-               GtkComboBox *presence_combo;
+               GtkBuilder *builder;
 
                groupMap = [[OFMapTable alloc]
                    initWithKeyFunctions: keyFunctions
@@ -97,9 +95,19 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
                contactMap = [[OFMutableDictionary alloc] init];
                chatMap = [[OFMutableDictionary alloc] init];
                presences = [[OFCountedSet alloc] init];
-               connection = [connection_ retain];
+               connection = [client.connection retain];
 
-               builder = g_object_ref(builder_);
+               [connection addDelegate: self];
+               [client.roster addDelegate: self];
+
+               builder = gtk_builder_new();
+               gtk_builder_add_from_file(builder, "data/gtk/roster.ui", NULL);
+               gtk_builder_connect_signals(builder, NULL);
+
+               roster_window =
+                   GTK_WIDGET(gtk_builder_get_object(builder, "RosterWindow"));
+
+               gtk_widget_show(roster_window);
 
                roster_model = GTK_TREE_STORE(gtk_builder_get_object(builder,
                    "RosterTreeStore"));
@@ -121,6 +129,8 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
 
                g_signal_connect(presence_combo, "changed",
                    G_CALLBACK(presence_changed), connection);
+
+               g_object_unref(G_OBJECT(builder));
        } @catch (id e) {
                [self release];
                @throw e;
@@ -133,16 +143,11 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
 {
        [groupMap release];
        [contactMap release];
+       [chatMap release];
        [presences release];
        [connection release];
 
-       if (roster_model)
-               g_object_unref(roster_model);
-
-       if (roster_filter)
-               g_object_unref(roster_filter);
-
-       g_object_unref(builder);
+       gtk_widget_destroy(roster_window);
 
        [super dealloc];
 }
@@ -357,4 +362,35 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
        }
 }
 
+-      (void)client: (JubChatClient*)client
+  didChangePresence: (XMPPPresence*)presence
+{
+       OFString *tooltip = @"";
+       OFString *show =
+           [[presence elementForName: @"show"
+                           namespace: XMPP_NS_CLIENT] stringValue];
+       OFString *status =
+           [[presence elementForName: @"status"
+                           namespace: XMPP_NS_CLIENT] stringValue];
+
+       if (status != nil)
+               tooltip = [@"<b>Status:</b> " stringByAppendingString: status];
+
+       // FIXME: Changing the active id will send another presence
+       g_idle_add_block(^{
+               if ([presence.type isEqual: @"unavailable"])
+                       gtk_combo_box_set_active_id(presence_combo,
+                           "unavailable");
+               else if (show == nil)
+                       gtk_combo_box_set_active_id(presence_combo,
+                           "available");
+               else
+                       gtk_combo_box_set_active_id(presence_combo,
+                           [show UTF8String]);
+
+
+               gtk_widget_set_tooltip_markup(GTK_WIDGET(presence_combo),
+                   [tooltip UTF8String]);
+       });
+}
 @end