X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fel-home-applet.c;h=901e4d8e1d898450c52b4416ca163331441e36a3;hb=fc46490870f77892214ac9322672f5d49c3e2229;hp=c73026dd84eaf1e80625cf4bed64c3d4f2630a21;hpb=b5e7ce6b32941e831e325ea2503dc698eee91b5e;p=conv-inbox diff --git a/src/el-home-applet.c b/src/el-home-applet.c index c73026d..901e4d8 100644 --- a/src/el-home-applet.c +++ b/src/el-home-applet.c @@ -36,12 +36,14 @@ #include #include +#include + #define EL_HOME_APPLET_GET_PRIVATE(obj) ( \ G_TYPE_INSTANCE_GET_PRIVATE (obj, \ EL_TYPE_HOME_APPLET, ELHomeAppletPrivate)) #define BOX_WIDTH 352 -#define BOX_HEIGHT 276 +#define BOX_HEIGHT 284 #define CONTENT_OFFSET_X HILDON_MARGIN_HALF #define CONTENT_OFFSET_Y_TOP 4*HILDON_MARGIN_HALF @@ -50,7 +52,11 @@ #define C_HEIGHT (BOX_HEIGHT - (CONTENT_OFFSET_Y_TOP + CONTENT_OFFSET_Y_BOTTOM)) #define HEADER_HEIGHT 48 -#define MESSAGE_HEIGHT (C_HEIGHT - HEADER_HEIGHT) +#define FOOTER_HEIGHT 24 +#define FOOTER_HEIGHT_PRESS 48 /* approx, used only for checking clicks, bigger than controls */ +#define FOOTER_WIDTH C_WIDTH/4 + +#define MESSAGE_HEIGHT (C_HEIGHT - HEADER_HEIGHT - FOOTER_HEIGHT) #define MESSAGE_WIDTH (C_WIDTH - 2*HILDON_MARGIN_DEFAULT) #define BOX_RADIOUS 10 @@ -63,6 +69,13 @@ #define NOTIFICATION_UI_DBUS_PATH "/org/freedesktop/Telepathy/Client/NotificationUI" #define NOTIFICATION_UI_DBUS_IFACE "com.nokia.RtcomNotificationUi" +typedef enum { + SELECTED_NONE, + SELECTED_HEADER, + SELECTED_BODY, + SELECTED_FOOTER +} WidgetActiveSelection; + struct _ELHomeAppletPrivate { RTComEl *eventlogger; @@ -78,8 +91,7 @@ struct _ELHomeAppletPrivate gchar *message; gint event_id; - gboolean active_body; - gboolean active_header; + WidgetActiveSelection active; guint unread_count; @@ -287,9 +299,7 @@ expose_event (GtkWidget *self, GdkEventExpose *event) { ELHomeAppletPrivate *priv = EL_HOME_APPLET(self)->priv; cairo_t *cr; - int message_height; - - message_height = C_HEIGHT - priv->received->allocation.height - HEADER_HEIGHT; + cairo_pattern_t *grad; cr = gdk_cairo_create (self->window); gdk_cairo_region (cr, event->region); @@ -325,14 +335,18 @@ expose_event (GtkWidget *self, GdkEventExpose *event) cairo_close_path (cr); - if (priv->active_header) + switch (priv->active) { + case SELECTED_HEADER: cairo_set_source_rgba (cr, priv->active_color.red, priv->active_color.green, priv->active_color.blue, 0.8f); - else + break; + default: cairo_set_source_rgba (cr, 0.2f, 0.2f, 0.2f, 0.8f); + } + cairo_fill (cr); cairo_move_to (cr, 0, HEADER_HEIGHT); @@ -345,21 +359,26 @@ expose_event (GtkWidget *self, GdkEventExpose *event) cairo_stroke (cr); /* draw body */ - cairo_move_to (cr, 0, HEADER_HEIGHT); - cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS); - cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT); - cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, C_HEIGHT); - cairo_curve_to (cr, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT - BOX_RADIOUS); - cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT); - cairo_line_to (cr, 0, HEADER_HEIGHT); - cairo_close_path (cr); + if (!priv->message) { + cairo_move_to (cr, 0, HEADER_HEIGHT); + cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS); + cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT); + cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, C_HEIGHT); + cairo_curve_to (cr, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT - BOX_RADIOUS); + cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT); + cairo_line_to (cr, 0, HEADER_HEIGHT); + cairo_close_path (cr); + } + else + cairo_rectangle (cr, 0, HEADER_HEIGHT, + C_WIDTH, MESSAGE_HEIGHT); /* draw body filling depending on (in)active state */ - cairo_pattern_t *grad; grad = cairo_pattern_create_linear (0, HEADER_HEIGHT, - 0, C_HEIGHT); + 0, C_HEIGHT - FOOTER_HEIGHT); - if (priv->active_body) { + switch (priv->active) { + case SELECTED_BODY: cairo_pattern_add_color_stop_rgba (grad, 0.5f, priv->active_color.red, @@ -372,58 +391,86 @@ expose_event (GtkWidget *self, GdkEventExpose *event) priv->active_color.green/2, priv->active_color.blue/2, 0.8f); - } - else { + break; + default: cairo_pattern_add_color_stop_rgba (grad, 0.5f, 0.4f, 0.4f, 0.4f, 0.8f); cairo_pattern_add_color_stop_rgba (grad, 1.0f, 0.2f, 0.2f, 0.2f, 0.8f); } + cairo_set_source (cr, grad); cairo_fill (cr); - /* cairo_set_source_rgba (cr, red, green, blue, 1.0f); */ - /* cairo_translate (cr, -CONTENT_OFFSET_X, -C_Y); */ - /* rounded_rectangle (cr, */ - /* CONTENT_OFFSET_X, */ - /* C_Y, */ - /* BOX_WIDTH - 2*CONTENT_OFFSET_X, */ - /* BOX_HEIGHT - 2*C_Y, */ - /* BOX_RADIOUS); */ - /* cairo_close_path (cr); */ - /* cairo_stroke (cr); */ - - /* draw message */ - if (!priv->message_surface) { - gint height; - - priv->message_surface = draw_text (cr, - priv->font_desc, - priv->message, - MESSAGE_WIDTH, - &height); - - priv->hidden_message_height = height - message_height; - priv->scroll_on_click = priv->hidden_message_height > 0; - if (priv->scroll_on_click) - gtk_widget_show (priv->cut_message); - } + cairo_pattern_destroy (grad); - cairo_rectangle (cr, - 2*CONTENT_OFFSET_X, - TEXT_Y_OFFSET, - MESSAGE_WIDTH, - message_height); - cairo_clip (cr); + if (priv->message) { + /* draw footer unread part bg */ + cairo_move_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT); + cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS); + cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT); + cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT); + cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT); + cairo_line_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT); + cairo_close_path (cr); + + /* draw body filling depending on (in)active state */ + switch (priv->active) { + case SELECTED_FOOTER: + cairo_set_source_rgba (cr, + priv->active_color.red, + priv->active_color.green, + priv->active_color.blue, + 0.8f); + break; + default: + cairo_set_source_rgba (cr, 0.1f, 0.1f, 0.1f, 0.9f); + } + cairo_fill (cr); - cairo_set_source_surface (cr, - priv->message_surface, - 2*CONTENT_OFFSET_X, - TEXT_Y_OFFSET - priv->scroll_offset); - cairo_set_operator (cr, CAIRO_OPERATOR_OVER); - cairo_paint (cr); + /* draw footer received part bg */ + cairo_move_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT); + cairo_rel_line_to (cr, 0, FOOTER_HEIGHT); + cairo_rel_line_to (cr, C_WIDTH - FOOTER_WIDTH - BOX_RADIOUS, 0); + cairo_rel_curve_to (cr, BOX_RADIOUS, 0, BOX_RADIOUS, 0, BOX_RADIOUS, -BOX_RADIOUS); + cairo_rel_line_to (cr, 0, -(FOOTER_HEIGHT - BOX_RADIOUS)); + cairo_rel_line_to (cr, -(C_WIDTH - FOOTER_WIDTH), 0); + cairo_close_path (cr); + + cairo_set_source_rgba (cr, 0.2f, 0.2f, 0.2f, 0.8f); + cairo_fill (cr); + + /* draw message */ + if (!priv->message_surface) { + gint height; + + priv->message_surface = draw_text (cr, + priv->font_desc, + priv->message, + MESSAGE_WIDTH, + &height); + + priv->hidden_message_height = height - MESSAGE_HEIGHT; + priv->scroll_on_click = priv->hidden_message_height > 0; + if (priv->scroll_on_click) + gtk_widget_show (priv->cut_message); + } + + cairo_rectangle (cr, + 2*CONTENT_OFFSET_X, + TEXT_Y_OFFSET, + MESSAGE_WIDTH, + MESSAGE_HEIGHT); + cairo_clip (cr); + + cairo_set_source_surface (cr, + priv->message_surface, + 2*CONTENT_OFFSET_X, + TEXT_Y_OFFSET - priv->scroll_offset); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_paint (cr); + } - cairo_pattern_destroy (grad); cairo_destroy (cr); return GTK_WIDGET_CLASS (el_home_applet_parent_class)->expose_event (self, event); @@ -504,7 +551,6 @@ aggregator_ready_cb (OssoABookWaitable *waitable, const GError *error, gpointer userdata) { - g_warning (G_STRFUNC); ELHomeApplet *self = EL_HOME_APPLET(userdata); ELHomeAppletPrivate *priv = self->priv; GList *contacts = NULL; @@ -548,6 +594,7 @@ aggregator_ready_cb (OssoABookWaitable *waitable, priv->contact = g_object_ref (OSSO_ABOOK_CONTACT (contacts->data)); gtk_label_set_text (GTK_LABEL (priv->sender), osso_abook_contact_get_display_name (priv->contact)); + avatar_image = osso_abook_avatar_get_image_rounded (OSSO_ABOOK_AVATAR (priv->contact), HILDON_ICON_PIXEL_SIZE_THUMB, @@ -556,12 +603,6 @@ aggregator_ready_cb (OssoABookWaitable *waitable, -1, priv->border_color); - g_warning ("contact's name %s\nid=%s\npid=%s", - osso_abook_contact_get_display_name (priv->contact), - osso_abook_contact_get_uid (priv->contact), - osso_abook_contact_get_persistent_uid (priv->contact)); - - if (avatar_image) { gtk_image_set_from_pixbuf (GTK_IMAGE (priv->avatar), avatar_image); @@ -579,8 +620,6 @@ resolve_contact (ELHomeApplet *self) EBookQuery *query = NULL; GError *error = NULL; - g_warning ("%s %s %s %s", G_STRFUNC, priv->contact_id, priv->local_id, priv->remote_id); - if (priv->local_id && priv->remote_id) { const gchar *vcard = osso_abook_account_manager_get_vcard_field (NULL, priv->local_id); @@ -613,7 +652,6 @@ resolve_contact (ELHomeApplet *self) self, NULL); osso_abook_roster_start (priv->aggregator); - g_warning ("AGG STARTED"); } } @@ -645,44 +683,46 @@ static void show_event (ELHomeApplet *self, RTComElIter *it) { ELHomeAppletPrivate *priv = self->priv; - g_warning (G_STRFUNC); gchar *remote = NULL; gchar *received = NULL; - const gchar *icon_name = NULL; + /* const gchar *icon_name = NULL; */ if (it && rtcom_el_iter_first (it)) { rtcom_el_iter_dup_string (it, "free-text", &priv->message); if (priv->message) { - const gchar *service; + /* const gchar *service; */ time_t received_t; rtcom_el_iter_get_int (it, "id", &priv->event_id); if (rtcom_el_iter_get_int (it, "start-time", (gint*)&received_t)) received = format_time (received_t); - rtcom_el_iter_dup_string (it, "remote-uid", &priv->remote_id); - if (!rtcom_el_iter_dup_string (it, "remote-name", &remote)) - remote = g_strdup (priv->remote_id); - - rtcom_el_iter_dup_string (it, "remote-ebook-uid", &priv->contact_id); - rtcom_el_iter_dup_string (it, "local-uid", &priv->local_id); - g_warning ("abook uid %s", priv->contact_id); + if (rtcom_el_iter_dup_string (it, "remote-uid", &priv->remote_id)) { + if (priv->remote_id && priv->remote_id[0]) { + if (!rtcom_el_iter_dup_string (it, "remote-name", &remote)) + remote = g_strdup (priv->remote_id); + + rtcom_el_iter_dup_string (it, "remote-ebook-uid", &priv->contact_id); + rtcom_el_iter_dup_string (it, "local-uid", &priv->local_id); + } + else if (priv->remote_id) { + g_free (priv->remote_id); + priv->remote_id = NULL; + } + } +#if 0 service = rtcom_el_iter_get_service (it); if (!g_strcmp0 (service, "RTCOM_EL_SERVICE_SMS")) icon_name = "chat_unread_sms"; else if (!g_strcmp0 (service, "RTCOM_EL_SERVICE_CHAT")) icon_name = "chat_unread_chat"; +#endif } } else { priv->event_id = -1; } - g_warning ("event_id=%d\nremote-uid=%s\nremote_name=%s", - priv->event_id, - priv->remote_id, - remote); - gtk_widget_hide (priv->avatar); if (priv->message) { @@ -768,11 +808,14 @@ static void update_unread_label (ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; - gchar *text; if (priv->unread_count > 0) { - text = g_strdup_printf ("%d", priv->unread_count); - gtk_label_set_text (GTK_LABEL (priv->unread), text); + gchar *text; + text = g_strdup_printf + ("%d*", + priv->unread_count); + + gtk_label_set_markup (GTK_LABEL (priv->unread), text); g_free (text); } else @@ -815,7 +858,6 @@ query_unread_events (RTComEl *el) static void read_event (ELHomeApplet *self) { - g_warning (G_STRFUNC); ELHomeAppletPrivate *priv = self->priv; RTComElIter *it = NULL; @@ -897,7 +939,7 @@ static void mark_as_read (ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; - g_warning (G_STRFUNC); + if (priv->event_id >= 0) { rtcom_el_set_read_event (priv->eventlogger, priv->event_id, @@ -907,11 +949,40 @@ mark_as_read (ELHomeApplet *self) } } +static void +open_conversation (ELHomeApplet *self) +{ + ELHomeAppletPrivate *priv = self->priv; + McAccount *account; + McAccountChannelrequestData request; + + if (!(priv->remote_id && priv->local_id)) + return; + + account = osso_abook_account_manager_lookup_by_name (NULL, + priv->local_id); + if (!account) + return; + + MC_ACCOUNT_CRD_INIT (&request); + MC_ACCOUNT_CRD_SET (&request, channel_type, TP_IFACE_QUARK_CHANNEL_TYPE_TEXT); + MC_ACCOUNT_CRD_SET (&request, target_handle_type, TP_HANDLE_TYPE_CONTACT); + MC_ACCOUNT_CRD_SET (&request, target_id, priv->remote_id); + + mc_account_channelrequest ( + account, + &request, + time (NULL), + NULL, /* handler */ + MC_ACCOUNT_CR_FLAG_USE_EXISTING, + NULL, NULL, NULL, NULL); +} + static gboolean read_new_event (ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; - g_warning (G_STRFUNC); + read_event (self); priv->unread_count = query_unread_events (priv->eventlogger); update_unread_label (self); @@ -973,18 +1044,23 @@ button_press_event_cb (GtkWidget *widget, GdkEventButton *event, ELHomeApplet *self) { - g_warning (G_STRFUNC); ELHomeAppletPrivate *priv = self->priv; if (priv->event_id > 0) { + stop_scroll_anim (priv); + if (event->y < CONTENT_OFFSET_Y_TOP + HEADER_HEIGHT) { if (priv->aggregator && osso_abook_waitable_is_ready (OSSO_ABOOK_WAITABLE (priv->aggregator), NULL)) - priv->active_header = TRUE; + priv->active = SELECTED_HEADER; } + else if (event->y > (BOX_HEIGHT - CONTENT_OFFSET_Y_BOTTOM - FOOTER_HEIGHT_PRESS) && + event->x < FOOTER_WIDTH) + priv->active = SELECTED_FOOTER; else - priv->active_body = TRUE; + priv->active = SELECTED_BODY; + gtk_widget_queue_draw (widget); } @@ -1048,11 +1124,9 @@ button_release_event_cb (GtkWidget *widget, ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; - g_warning (G_STRFUNC); - if (priv->active_body) { - priv->active_body = FALSE; - stop_scroll_anim (priv); + switch (priv->active) { + case SELECTED_BODY: if (priv->scroll_on_click) { priv->scroll_on_click = FALSE; priv->scroll_anim_id = g_timeout_add (SCROLL_PERIOD, @@ -1061,15 +1135,14 @@ button_release_event_cb (GtkWidget *widget, } else { #ifndef DEBUG_LAYOUT - mark_as_read (self); + open_conversation (self); #endif } - gtk_widget_queue_draw (widget); - } - if (priv->active_header) { + + break; + case SELECTED_HEADER: { GtkWidget *dialog = NULL; - priv->active_header = FALSE; if (priv->aggregator && priv->contact_id) dialog = create_contact_starter_dialog @@ -1086,7 +1159,14 @@ button_release_event_cb (GtkWidget *widget, gtk_widget_queue_draw (widget); } + break; + case SELECTED_FOOTER: + mark_as_read (self); + break; + default:; + } + priv->active = SELECTED_NONE; return TRUE; } @@ -1097,17 +1177,19 @@ leave_notify_event_cb (GtkWidget *widget, { ELHomeAppletPrivate *priv = self->priv; - if (priv->active_body) { - priv->active_body = FALSE; - priv->active_header = FALSE; + switch (priv->active) { + case SELECTED_BODY: stop_scroll_anim (priv); gtk_widget_queue_draw (widget); - } - if (priv->active_header) { - priv->active_header = FALSE; + break; + case SELECTED_HEADER: + case SELECTED_FOOTER: gtk_widget_queue_draw (widget); + break; + default:; } + priv->active = SELECTED_NONE; return FALSE; } @@ -1124,13 +1206,9 @@ el_home_applet_init (ELHomeApplet *self) gtk_widget_set_app_paintable (GTK_WIDGET (self), TRUE); priv->unread = gtk_label_new ("12"); - hildon_helper_set_logical_color (priv->unread, - GTK_RC_FG, - GTK_STATE_NORMAL, - "ActiveTextColor"); gtk_misc_set_alignment (GTK_MISC (priv->unread), - 1.0f, - 1.0f); + 0.0f, + 0.5f); hildon_helper_set_logical_font (priv->unread, "SmallSystemFont"); /* gtk_widget_set_size_request (priv->unread, */ /* -1, */ @@ -1187,7 +1265,7 @@ el_home_applet_init (ELHomeApplet *self) gtk_box_pack_start (GTK_BOX (hbox), priv->sender, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (hbox), priv->avatar, FALSE, FALSE, 0); - footer = gtk_hbox_new (FALSE, 0); + footer = gtk_hbox_new (FALSE, HILDON_MARGIN_DEFAULT); gtk_box_pack_start (GTK_BOX (footer), priv->unread, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (footer), priv->cut_message, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (footer), priv->received, FALSE, FALSE, 0);