ekiga r6490 - trunk/lib/engine/gui/gtk-frontend



Author: jpuydt
Date: Thu Jul 24 13:43:30 2008
New Revision: 6490
URL: http://svn.gnome.org/viewvc/ekiga?rev=6490&view=rev

Log:
Made ChatWindow count the unread messages for each page, thus showing how many unread there are for each of them

Modified:
   trunk/lib/engine/gui/gtk-frontend/chat-window.cpp

Modified: trunk/lib/engine/gui/gtk-frontend/chat-window.cpp
==============================================================================
--- trunk/lib/engine/gui/gtk-frontend/chat-window.cpp	(original)
+++ trunk/lib/engine/gui/gtk-frontend/chat-window.cpp	Thu Jul 24 13:43:30 2008
@@ -56,6 +56,18 @@
 
 /* signal callbacks (declarations) */
 
+static void on_switch_page (GtkNotebook* notebook,
+			    GtkNotebookPage* page,
+			    guint num,
+			    gpointer data);
+
+static gboolean on_focus_in_event (GtkWidget* widget,
+				   GdkEventFocus* event,
+				   gpointer data);
+
+static void on_message_notice_event (GtkWidget* page,
+				     gpointer data);
+
 static bool on_dialect_added (ChatWindow* self,
 			      Ekiga::Dialect& dialect);
 static bool on_simple_chat_added (ChatWindow* self,
@@ -67,6 +79,92 @@
 
 /* signal callbacks (implementations) */
 
+static void
+on_switch_page (G_GNUC_UNUSED GtkNotebook* notebook,
+		G_GNUC_UNUSED GtkNotebookPage* page_,
+		guint num,
+		gpointer data)
+{
+  ChatWindow* self = (ChatWindow*)data;
+  GtkWidget* page = NULL;
+  GtkWidget* label = NULL;
+
+  page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (self->priv->notebook), num);
+  label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (self->priv->notebook),
+				      page);
+  gtk_label_set_text (GTK_LABEL (label),
+		      (const gchar*)g_object_get_data (G_OBJECT (label),
+						       "base-title"));
+  g_object_set_data (G_OBJECT (label), "unread-count",
+		     GUINT_TO_POINTER (0));
+}
+
+static gboolean
+on_focus_in_event (G_GNUC_UNUSED GtkWidget* widget,
+		   G_GNUC_UNUSED GdkEventFocus* event,
+		   gpointer data)
+{
+  ChatWindow* self = (ChatWindow*)data;
+  gint num;
+  GtkWidget* page = NULL;
+  GtkWidget* label = NULL;
+
+  num = gtk_notebook_get_current_page (GTK_NOTEBOOK (self->priv->notebook));
+  page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (self->priv->notebook), num);
+  label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (self->priv->notebook),
+				      page);
+  gtk_label_set_text (GTK_LABEL (label),
+		      (const gchar*)g_object_get_data (G_OBJECT (label),
+						       "base-title"));
+  g_object_set_data (G_OBJECT (label), "unread-count",
+		     GUINT_TO_POINTER (0));
+
+  return FALSE;
+}
+
+static void
+on_message_notice_event (GtkWidget* page,
+			 gpointer data)
+{
+  ChatWindow* self = (ChatWindow*)data;
+  gint num = -1;
+
+  for (gint ii = 0;
+       ii < gtk_notebook_get_n_pages (GTK_NOTEBOOK (self->priv->notebook)) ;
+       ii++) {
+
+    if (page == gtk_notebook_get_nth_page (GTK_NOTEBOOK (self->priv->notebook),
+					   ii)) {
+
+      num = ii;
+      break;
+    }
+  }
+
+  if (num
+      != gtk_notebook_get_current_page (GTK_NOTEBOOK (self->priv->notebook))) {
+
+    GtkWidget* label = NULL;
+    guint unread_count = 0;
+    const gchar* base_title = NULL;
+    gchar* txt = NULL;
+
+    label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (self->priv->notebook),
+					page);
+    base_title = (const gchar*)g_object_get_data (G_OBJECT (label),
+						  "base-title");
+    unread_count = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (label),
+							"unread-count"));
+    unread_count = unread_count + 1;
+    g_object_set_data (G_OBJECT (label), "unread-count",
+		       GUINT_TO_POINTER (unread_count));
+
+    txt = g_strdup_printf ("[%d] %s", unread_count, base_title);
+    gtk_label_set_text (GTK_LABEL (label), txt);
+    g_free (txt);
+  }
+}
+
 static bool
 on_dialect_added (ChatWindow* self,
 		  Ekiga::Dialect& dialect)
@@ -92,9 +190,15 @@
   page = simple_chat_page_new (chat);
   label = gtk_label_new (chat.get_title ().c_str ());
 
+  g_object_set_data_full (G_OBJECT (label), "base-title",
+			  g_strdup (chat.get_title ().c_str ()),
+			  g_free);
+
   num = gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook),
 				  page, label);
   gtk_widget_show (page);
+  g_signal_connect (page, "message-notice-event",
+		    G_CALLBACK (on_message_notice_event), self);
 
   if (on_user_request) {
 
@@ -228,8 +332,8 @@
   ChatWindow* result = NULL;
 
   result = (ChatWindow*)g_object_new (CHAT_WINDOW_TYPE,
-				     "key", key.c_str (),
-				     NULL);
+				      "key", key.c_str (),
+				      NULL);
 
   result->priv = new ChatWindowPrivate (core);
 
@@ -237,6 +341,11 @@
   gtk_container_add (GTK_CONTAINER (result), result->priv->notebook);
   gtk_widget_show (result->priv->notebook);
 
+  g_signal_connect (result, "focus-in-event",
+		    G_CALLBACK (on_focus_in_event), result);
+  g_signal_connect (result->priv->notebook, "switch-page",
+		    G_CALLBACK (on_switch_page), result);
+
   result->priv->dialect_added_connection = core.dialect_added.connect (sigc::hide_return(sigc::bind<0>(sigc::ptr_fun (on_dialect_added), result)));
   core.visit_dialects (sigc::bind<0>(sigc::ptr_fun (on_dialect_added), result));
 



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