]> git.0d.be Git - empathy.git/commitdiff
Move the smiley menu code from EmpathyChatView to EmpathyChatManager.
authorXavier Claessens <xclaesse@src.gnome.org>
Tue, 16 Dec 2008 09:24:11 +0000 (09:24 +0000)
committerXavier Claessens <xclaesse@src.gnome.org>
Tue, 16 Dec 2008 09:24:11 +0000 (09:24 +0000)
svn path=/trunk/; revision=1986

libempathy-gtk/empathy-chat-view.c
libempathy-gtk/empathy-chat-view.h
libempathy-gtk/empathy-chat.c
libempathy-gtk/empathy-smiley-manager.c
libempathy-gtk/empathy-smiley-manager.h
src/empathy-chat-window.c

index f38ab17508923820578928eeb962b1136a97eabb..25c1721a4b8e9128741c09773e2fb9740bf79b47 100644 (file)
@@ -259,52 +259,3 @@ empathy_chat_view_get_last_contact (EmpathyChatView *view)
        return NULL;
 }
 
-GtkWidget *
-empathy_chat_view_get_smiley_menu (GCallback    callback,
-                                  gpointer     user_data)
-{
-       EmpathySmileyManager *smiley_manager;
-       GSList               *smileys, *l;
-       GtkWidget            *menu;
-       gint                  x = 0;
-       gint                  y = 0;
-
-       g_return_val_if_fail (callback != NULL, NULL);
-
-       menu = gtk_menu_new ();
-
-       smiley_manager = empathy_smiley_manager_new ();
-       smileys = empathy_smiley_manager_get_all (smiley_manager);
-       for (l = smileys; l; l = l->next) {
-               EmpathySmiley *smiley;
-               GtkWidget     *item;
-               GtkWidget     *image;
-
-               smiley = l->data;
-               image = gtk_image_new_from_pixbuf (smiley->pixbuf);
-
-               item = gtk_image_menu_item_new_with_label ("");
-               gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
-
-               gtk_menu_attach (GTK_MENU (menu), item,
-                                x, x + 1, y, y + 1);
-
-               gtk_widget_set_tooltip_text (item, smiley->str);
-
-               g_object_set_data  (G_OBJECT (item), "smiley_text", smiley->str);
-               g_signal_connect (item, "activate", callback, user_data);
-
-               if (x > 3) {
-                       y++;
-                       x = 0;
-               } else {
-                       x++;
-               }
-       }
-       g_object_unref (smiley_manager);
-
-       gtk_widget_show_all (menu);
-
-       return menu;
-}
-
index 1c4bd32cbb0aae11f4978346a164673453c5258d..bf5140001ceffcfbaa1a8065f6beb753182afd05 100644 (file)
@@ -111,9 +111,6 @@ void             empathy_chat_view_set_last_timestamp   (EmpathyChatView *view,
                                                         time_t           timestamp);
 EmpathyContact * empathy_chat_view_get_last_contact     (EmpathyChatView *view);
 
-GtkWidget *      empathy_chat_view_get_smiley_menu      (GCallback        callback,
-                                                        gpointer         user_data);
-
 G_END_DECLS
 
 #endif /* __EMPATHY_CHAT_VIEW_H__ */
index ec6a466641d74597ba8ead3b31601ec647de2a5c..e305f58ab1258b68f6a9c94daee9481b502fc061 100644 (file)
@@ -49,6 +49,7 @@
 #include "empathy-contact-list-view.h"
 #include "empathy-contact-menu.h"
 #include "empathy-chat-simple-view.h"
+#include "empathy-smiley-manager.h"
 #include "empathy-ui-utils.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_CHAT
@@ -868,19 +869,18 @@ chat_input_realize_cb (GtkWidget   *widget,
 }
 
 static void
-chat_insert_smiley_activate_cb (GtkWidget   *menuitem,
-                               EmpathyChat *chat)
+chat_insert_smiley_activate_cb (EmpathySmileyManager *manager,
+                               EmpathySmiley        *smiley,
+                               gpointer              user_data)
 {
+       EmpathyChat   *chat = EMPATHY_CHAT (user_data);
        GtkTextBuffer *buffer;
        GtkTextIter    iter;
-       const gchar   *smiley;
-
-       smiley = g_object_get_data (G_OBJECT (menuitem), "smiley_text");
 
        buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (chat->input_text_view));
 
        gtk_text_buffer_get_end_iter (buffer, &iter);
-       gtk_text_buffer_insert (buffer, &iter, smiley, -1);
+       gtk_text_buffer_insert (buffer, &iter, smiley->str, -1);
 
        gtk_text_buffer_get_end_iter (buffer, &iter);
        gtk_text_buffer_insert (buffer, &iter, " ", -1);
@@ -942,17 +942,18 @@ chat_input_populate_popup_cb (GtkTextView *view,
                              GtkMenu     *menu,
                              EmpathyChat *chat)
 {
-       EmpathyChatPriv  *priv;
-       GtkTextBuffer   *buffer;
-       GtkTextTagTable *table;
-       GtkTextTag      *tag;
-       gint             x, y;
-       GtkTextIter      iter, start, end;
-       GtkWidget       *item;
-       gchar           *str = NULL;
-       EmpathyChatSpell *chat_spell;
-       GtkWidget       *smiley_menu;
-       GtkWidget       *image;
+       EmpathyChatPriv      *priv;
+       GtkTextBuffer        *buffer;
+       GtkTextTagTable      *table;
+       GtkTextTag           *tag;
+       gint                  x, y;
+       GtkTextIter           iter, start, end;
+       GtkWidget            *item;
+       gchar                *str = NULL;
+       EmpathyChatSpell      *chat_spell;
+       EmpathySmileyManager *smiley_manager;
+       GtkWidget            *smiley_menu;
+       GtkWidget            *image;
 
        priv = GET_PRIV (chat);
        buffer = gtk_text_view_get_buffer (view);
@@ -969,10 +970,12 @@ chat_input_populate_popup_cb (GtkTextView *view,
        gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item);
        gtk_widget_show (item);
 
-       smiley_menu = empathy_chat_view_get_smiley_menu (
-               G_CALLBACK (chat_insert_smiley_activate_cb),
-               chat);
+       smiley_manager = empathy_smiley_manager_new ();
+       smiley_menu = empathy_smiley_menu_new (smiley_manager,
+                                              chat_insert_smiley_activate_cb,
+                                              chat);
        gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), smiley_menu);
+       g_object_unref (smiley_manager);
 
        /* Add the Send menu item. */
        gtk_text_buffer_get_bounds (buffer, &start, &end);
index c9322c8eb2f9df2065a8f7d66aeaa75cf46b15e1..4137db63d512b0bc45196ccfedd782a6798722c9 100644 (file)
@@ -347,3 +347,87 @@ empathy_smiley_manager_get_all (EmpathySmileyManager *manager)
        return priv->smileys;
 }
 
+typedef struct {
+       EmpathySmileyManager *manager;
+       EmpathySmiley        *smiley;
+       EmpathySmileyMenuFunc func;    
+       gpointer              user_data;         
+} ActivateData;
+
+static void
+smiley_menu_data_free (gpointer  user_data,
+                      GClosure *closure)
+{
+       ActivateData *data = (ActivateData*) user_data;
+
+       g_object_unref (data->manager);
+       g_slice_free (ActivateData, data);
+}
+
+static void
+smiley_menu_activate_cb (GtkMenuItem *menuitem,
+                        gpointer     user_data)
+{
+       ActivateData *data = (ActivateData*) user_data;
+
+       data->func (data->manager, data->smiley, data->user_data);
+}
+
+GtkWidget *
+empathy_smiley_menu_new (EmpathySmileyManager *manager,
+                        EmpathySmileyMenuFunc func,
+                        gpointer              user_data)
+{
+       EmpathySmileyManagerPriv *priv = GET_PRIV (manager);
+       GSList                   *l;
+       GtkWidget                *menu;
+       gint                      x = 0;
+       gint                      y = 0;
+
+       g_return_val_if_fail (EMPATHY_IS_SMILEY_MANAGER (manager), NULL);
+       g_return_val_if_fail (func != NULL, NULL);
+
+       menu = gtk_menu_new ();
+
+       for (l = priv->smileys; l; l = l->next) {
+               EmpathySmiley *smiley;
+               GtkWidget     *item;
+               GtkWidget     *image;
+               ActivateData  *data;
+
+               smiley = l->data;
+               image = gtk_image_new_from_pixbuf (smiley->pixbuf);
+
+               item = gtk_image_menu_item_new_with_label ("");
+               gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+
+               gtk_menu_attach (GTK_MENU (menu), item,
+                                x, x + 1, y, y + 1);
+
+               gtk_widget_set_tooltip_text (item, smiley->str);
+
+               data = g_slice_new (ActivateData);
+               data->manager = g_object_ref (manager);
+               data->smiley = smiley;
+               data->func = func;
+               data->user_data = user_data;
+
+               g_signal_connect_data (item, "activate",
+                                      G_CALLBACK (smiley_menu_activate_cb),
+                                      data,
+                                      smiley_menu_data_free,
+                                      0);
+
+               if (x > 3) {
+                       y++;
+                       x = 0;
+               } else {
+                       x++;
+               }
+       }
+
+       gtk_widget_show_all (menu);
+
+       return menu;
+}
+
index 394215ed6618137d3d830df2e63a2f357db27fdb..c73675742102ba6da460d838549236b5fc8895ec 100644 (file)
@@ -52,6 +52,10 @@ typedef struct {
        gchar     *str;
 } EmpathySmiley;
 
+typedef void (*EmpathySmileyMenuFunc) (EmpathySmileyManager *manager,
+                                      EmpathySmiley        *smiley,
+                                      gpointer              user_data);
+
 GType                 empathy_smiley_manager_get_type        (void) G_GNUC_CONST;
 EmpathySmileyManager *empathy_smiley_manager_new             (void);
 void                  empathy_smiley_manager_load            (EmpathySmileyManager *manager);
@@ -66,6 +70,9 @@ void                  empathy_smiley_manager_add_from_pixbuf (EmpathySmileyManag
 GSList *              empathy_smiley_manager_get_all         (EmpathySmileyManager *manager);
 GSList *              empathy_smiley_manager_parse           (EmpathySmileyManager *manager,
                                                              const gchar          *text);
+GtkWidget *           empathy_smiley_menu_new                (EmpathySmileyManager *manager,
+                                                             EmpathySmileyMenuFunc func,
+                                                             gpointer              user_data);
 void                  empathy_smiley_free                    (EmpathySmiley        *smiley);
 
 G_END_DECLS
index ae63b894e8a4996dd38c8aa3f0d4a5b463a1ae5b..c5e933908bf6204fae8e1272a5a273b132d2ac00 100644 (file)
@@ -49,6 +49,7 @@
 #include <libempathy-gtk/empathy-contact-dialogs.h>
 #include <libempathy-gtk/empathy-log-window.h>
 #include <libempathy-gtk/empathy-geometry.h>
+#include <libempathy-gtk/empathy-smiley-manager.h>
 #include <libempathy-gtk/empathy-ui-utils.h>
 
 #include "empathy-chat-window.h"
@@ -465,25 +466,20 @@ chat_window_chat_notify_cb (EmpathyChat *chat)
 }
 
 static void
-chat_window_insert_smiley_activate_cb (GtkWidget         *menuitem,
-                                      EmpathyChatWindow *window)
+chat_window_insert_smiley_activate_cb (EmpathySmileyManager *manager,
+                                      EmpathySmiley        *smiley,
+                                      gpointer              window)
 {
-       EmpathyChatWindowPriv *priv;
+       EmpathyChatWindowPriv *priv = GET_PRIV (window);
        EmpathyChat           *chat;
-       GtkTextBuffer        *buffer;
-       GtkTextIter           iter;
-       const gchar          *smiley;
-
-       priv = GET_PRIV (window);
+       GtkTextBuffer         *buffer;
+       GtkTextIter            iter;
 
        chat = priv->current_chat;
 
-       smiley = g_object_get_data (G_OBJECT (menuitem), "smiley_text");
-
        buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (chat->input_text_view));
        gtk_text_buffer_get_end_iter (buffer, &iter);
-       gtk_text_buffer_insert (buffer, &iter,
-                               smiley, -1);
+       gtk_text_buffer_insert (buffer, &iter, smiley->str, -1);
 }
 
 static void
@@ -1183,6 +1179,7 @@ empathy_chat_window_init (EmpathyChatWindow *window)
        gint                   i;
        GtkWidget             *chat_vbox;
        gchar                 *filename;
+       EmpathySmileyManager  *smiley_manager;
        EmpathyChatWindowPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (window,
                EMPATHY_TYPE_CHAT_WINDOW, EmpathyChatWindowPriv);
 
@@ -1257,10 +1254,12 @@ empathy_chat_window_init (EmpathyChatWindow *window)
        g_object_unref (accel_group);
 
        /* Set up smiley menu */
-       menu = empathy_chat_view_get_smiley_menu (
-               G_CALLBACK (chat_window_insert_smiley_activate_cb),
-               window);
-       gtk_menu_item_set_submenu (GTK_MENU_ITEM (priv->menu_conv_insert_smiley), menu);
+       smiley_manager = empathy_smiley_manager_new ();
+       menu = empathy_smiley_menu_new (smiley_manager,
+                                       chat_window_insert_smiley_activate_cb,
+                                       window);
+       gtk_menu_item_set_submenu (GTK_MENU_ITEM (priv->menu_conv_insert_smiley),
+                                  menu);
 
        /* Set up signals we can't do with glade since we may need to
         * block/unblock them at some later stage.