ekiga r6454 - trunk/lib/engine/gui/gtk-frontend
- From: jpuydt svn gnome org
- To: svn-commits-list gnome org
- Subject: ekiga r6454 - trunk/lib/engine/gui/gtk-frontend
- Date: Mon, 14 Jul 2008 20:51:17 +0000 (UTC)
Author: jpuydt
Date: Mon Jul 14 20:51:17 2008
New Revision: 6454
URL: http://svn.gnome.org/viewvc/ekiga?rev=6454&view=rev
Log:
Made the chat area more beautiful with nice bold/italic/underline buttons (and corresponding display)
Modified:
trunk/lib/engine/gui/gtk-frontend/chat-area.cpp
Modified: trunk/lib/engine/gui/gtk-frontend/chat-area.cpp
==============================================================================
--- trunk/lib/engine/gui/gtk-frontend/chat-area.cpp (original)
+++ trunk/lib/engine/gui/gtk-frontend/chat-area.cpp Mon Jul 14 20:51:17 2008
@@ -36,6 +36,9 @@
*/
#include "chat-area.h"
+#include "gmtextviewaddon.h"
+#include "gmtextbufferaddon.h"
+#include "gmtexttagaddon.h"
class ChatAreaHelper;
@@ -88,6 +91,16 @@
/* declaration of callbacks */
+
+static void on_bold_clicked (GtkButton* button,
+ gpointer data);
+
+static void on_italic_clicked (GtkButton* button,
+ gpointer data);
+
+static void on_underline_clicked (GtkButton* button,
+ gpointer data);
+
static void on_entry_activated (GtkWidget* entry,
gpointer data);
@@ -106,7 +119,7 @@
str = g_strdup_printf ("NOTICE: %s\n", txt);
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->priv->text_view));
gtk_text_buffer_get_end_iter (buffer, &iter);
- gtk_text_buffer_insert (buffer, &iter, str, -1);
+ gtk_text_buffer_insert_with_regex (buffer, &iter, str);
g_free (str);
}
@@ -122,16 +135,91 @@
str = g_strdup_printf ("%s says: %s\n", from, txt);
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->priv->text_view));
gtk_text_buffer_get_end_iter (buffer, &iter);
- gtk_text_buffer_insert (buffer, &iter, str, -1);
+ gtk_text_buffer_insert_with_regex (buffer, &iter, str);
g_free (str);
}
/* implementation of callbacks */
static void
-on_chat_removed (ChatArea* self)
+on_bold_clicked (G_GNUC_UNUSED GtkButton* button,
+ gpointer data)
{
- gtk_widget_hide (self->priv->entry);
+ ChatArea* self = NULL;
+ gint start;
+ gint end;
+ gint position;
+
+ self = (ChatArea*)data;
+
+ if (gtk_editable_get_selection_bounds (GTK_EDITABLE (self->priv->entry),
+ &start, & end)) {
+ gtk_editable_insert_text (GTK_EDITABLE (self->priv->entry),
+ "</b>", 4, &end);
+ gtk_editable_insert_text (GTK_EDITABLE (self->priv->entry),
+ "<b>", 3, &start);
+ gtk_editable_select_region (GTK_EDITABLE (self->priv->entry),
+ start, end - 1);
+ } else {
+
+ position = gtk_editable_get_position (GTK_EDITABLE (self->priv->entry));
+ gtk_editable_insert_text (GTK_EDITABLE (self->priv->entry),
+ "<b></b>", 7, &position);
+ }
+}
+
+static void
+on_italic_clicked (G_GNUC_UNUSED GtkButton* button,
+ gpointer data)
+{
+ ChatArea* self = NULL;
+ gint start;
+ gint end;
+ gint position;
+
+ self = (ChatArea*)data;
+
+ if (gtk_editable_get_selection_bounds (GTK_EDITABLE (self->priv->entry),
+ &start, & end)) {
+ gtk_editable_insert_text (GTK_EDITABLE (self->priv->entry),
+ "</i>", 4, &end);
+ gtk_editable_insert_text (GTK_EDITABLE (self->priv->entry),
+ "<i>", 3, &start);
+ gtk_editable_select_region (GTK_EDITABLE (self->priv->entry),
+ start, end - 1);
+ } else {
+
+ position = gtk_editable_get_position (GTK_EDITABLE (self->priv->entry));
+ gtk_editable_insert_text (GTK_EDITABLE (self->priv->entry),
+ "<i></i>", 7, &position);
+ }
+}
+
+static void
+on_underline_clicked (G_GNUC_UNUSED GtkButton* button,
+ gpointer data)
+{
+ ChatArea* self = NULL;
+ gint start;
+ gint end;
+ gint position;
+
+ self = (ChatArea*)data;
+
+ if (gtk_editable_get_selection_bounds (GTK_EDITABLE (self->priv->entry),
+ &start, & end)) {
+ gtk_editable_insert_text (GTK_EDITABLE (self->priv->entry),
+ "</u>", 4, &end);
+ gtk_editable_insert_text (GTK_EDITABLE (self->priv->entry),
+ "<u>", 3, &start);
+ gtk_editable_select_region (GTK_EDITABLE (self->priv->entry),
+ start, end - 1);
+ } else {
+
+ position = gtk_editable_get_position (GTK_EDITABLE (self->priv->entry));
+ gtk_editable_insert_text (GTK_EDITABLE (self->priv->entry),
+ "<u></u>", 7, &position);
+ }
}
static void
@@ -152,6 +240,12 @@
}
}
+static void
+on_chat_removed (ChatArea* self)
+{
+ gtk_widget_hide (self->priv->entry);
+}
+
/* GObject code */
static void
@@ -273,17 +367,91 @@
ChatAreaPrivate);
self->priv->chat = NULL;
- self->priv->text_view = gtk_text_view_new ();
+ /* first, the area has a text view with a quite rich set of features */
+ GtkTextBuffer* buffer = NULL;
+ GtkTextTag* tag = NULL;
+
+ self->priv->text_view = gtk_text_view_new_with_regex ();
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->priv->text_view));
+
+ gtk_text_view_set_editable (GTK_TEXT_VIEW (self->priv->text_view), FALSE);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (self->priv->text_view),
+ FALSE);
+ gtk_text_view_set_justification (GTK_TEXT_VIEW (self->priv->text_view),
+ GTK_JUSTIFY_LEFT);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (self->priv->text_view),
+ GTK_WRAP_WORD);
+
+ tag = gtk_text_buffer_create_tag (buffer, "bold",
+ "weight", PANGO_WEIGHT_BOLD,
+ NULL);
+ if (gtk_text_tag_set_regex (tag, "<b>.*</b>"))
+ gtk_text_tag_set_regex_display (tag, gtk_text_buffer_insert_markup);
+ else
+ g_object_unref (tag);
+
+ tag = gtk_text_buffer_create_tag (buffer, "italic",
+ "style", PANGO_STYLE_ITALIC,
+ NULL);
+ if (gtk_text_tag_set_regex (tag, "<i>.*</i>"))
+ gtk_text_tag_set_regex_display (tag, gtk_text_buffer_insert_markup);
+ else
+ g_object_unref (tag);
+
+ tag = gtk_text_buffer_create_tag (buffer, "underline",
+ "underline", PANGO_UNDERLINE_SINGLE,
+ NULL);
+ if (gtk_text_tag_set_regex (tag, "<u>.*</u>"))
+ gtk_text_tag_set_regex_display (tag, gtk_text_buffer_insert_markup);
+ else
+ g_object_unref (tag);
+
gtk_widget_show (self->priv->text_view);
gtk_box_pack_start (GTK_BOX (self), self->priv->text_view,
TRUE, TRUE, 2);
- self->priv->entry = gtk_entry_new ();
- gtk_widget_show (self->priv->entry);
- gtk_box_pack_end (GTK_BOX (self), self->priv->entry,
+ /* and then the chat area has a nice entry system */
+ GtkWidget* vbox = NULL;
+ GtkWidget* bbox = NULL;
+ GtkWidget* button = NULL;
+
+ vbox = gtk_vbox_new (FALSE, 2);
+ gtk_box_pack_end (GTK_BOX (self), vbox,
FALSE, TRUE, 2);
+ gtk_widget_show (vbox);
+
+ bbox = gtk_hbutton_box_new ();
+ gtk_box_pack_start (GTK_BOX (vbox), bbox,
+ FALSE, TRUE, 2);
+ gtk_widget_show (bbox);
+
+ button = gtk_button_new_from_stock (GTK_STOCK_BOLD);
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (on_bold_clicked), self);
+ gtk_box_pack_start (GTK_BOX (bbox), button,
+ FALSE, TRUE, 2);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_from_stock (GTK_STOCK_ITALIC);
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (on_italic_clicked), self);
+ gtk_box_pack_start (GTK_BOX (bbox), button,
+ FALSE, TRUE, 2);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_from_stock (GTK_STOCK_UNDERLINE);
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (on_underline_clicked), self);
+ gtk_box_pack_start (GTK_BOX (bbox), button,
+ FALSE, TRUE, 2);
+ gtk_widget_show (button);
+
+ self->priv->entry = gtk_entry_new ();
+ gtk_box_pack_start (GTK_BOX (vbox), self->priv->entry,
+ FALSE, TRUE, 2);
g_signal_connect (self->priv->entry, "activate",
G_CALLBACK (on_entry_activated), self);
+ gtk_widget_show (self->priv->entry);
}
@@ -317,7 +485,7 @@
/* public api */
-GtkWidget*
+GtkWidget*
chat_area_new (Ekiga::Chat& chat)
{
return (GtkWidget*)g_object_new (TYPE_CHAT_AREA,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]