ContactRequest: show vCard info

Show the photo, the username/ring id and the profile name which
come from the vCard of the ContactRequest.

Add icons for accept and block.

[SS: reduce code repetition; use nullptr instead of NULL; improve ci msg]

Change-Id: Ide07c99e5990572bae17c8726a77e35fc6d5a16f
Signed-off-by: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
Reviewed-by: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
diff --git a/src/pendingcontactrequests.cpp b/src/pendingcontactrequests.cpp
index 7343da2..c022d1b 100644
--- a/src/pendingcontactrequests.cpp
+++ b/src/pendingcontactrequests.cpp
@@ -28,11 +28,18 @@
 #include <pendingcontactrequestmodel.h>
 #include <account.h>
 #include <availableaccountmodel.h>
+#include <globalinstances.h>
+#include <contactrequest.h>
 
-// System
+// Gtk
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 
+// Qt
+#include <QtCore/QDateTime>
+#include <QtCore/QSize>
+#include <QtCore/QLocale>
+
 /**
  * gtk structure
  */
@@ -65,6 +72,93 @@
 #define PENDING_CONTACT_REQUESTS_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), PENDING_CONTACT_REQUESTS_VIEW_TYPE, PendingContactRequestsViewPrivate))
 
 /**
+ * callback function for rendering the contact photo
+ */
+static void
+render_contact_photo(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
+                     GtkCellRenderer *cell,
+                     GtkTreeModel *model,
+                     GtkTreeIter *iter,
+                     G_GNUC_UNUSED gpointer data)
+{
+    QModelIndex idx = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), iter);
+
+    std::shared_ptr<GdkPixbuf> image;
+    QVariant object = idx.data(static_cast<int>(Ring::Role::Object));
+
+    if (idx.isValid() && object.isValid()) {
+        QVariant var_photo;
+        if (auto cr = object.value<ContactRequest *>()) {
+            if (cr->peer())
+                var_photo = GlobalInstances::pixmapManipulator().contactPhoto(cr->peer(), QSize(50, 50), false);
+        }
+        if (var_photo.isValid())
+            image = var_photo.value<std::shared_ptr<GdkPixbuf>>();
+
+        g_object_set(G_OBJECT(cell), "height", 50, NULL);
+        g_object_set(G_OBJECT(cell), "width", 50, NULL);
+        g_object_set(G_OBJECT(cell), "pixbuf", image.get(), NULL);
+    }
+}
+
+/**
+ * callback function for rendering the best id of the peer and the date.
+ */
+static void
+render_name_and_info(G_GNUC_UNUSED GtkTreeViewColumn *tree_column,
+                     GtkCellRenderer *cell,
+                     GtkTreeModel *model,
+                     GtkTreeIter *iter,
+                     GtkTreeView *treeview)
+{
+    auto idx = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), iter);
+
+    if (not idx.isValid()) {
+        g_warning("could not get index for contact request");
+        return;
+    }
+
+    // check if this iter is selected
+    gboolean is_selected = FALSE;
+    if (GTK_IS_TREE_VIEW(treeview)) {
+        auto selection = gtk_tree_view_get_selection(treeview);
+        is_selected = gtk_tree_selection_iter_is_selected(selection, iter);
+    }
+
+    /* best id */
+    auto uri_qstring = idx.data(static_cast<int>(Qt::DisplayRole)).value<QString>();
+    auto uri_std = uri_qstring.toStdString();
+
+    /* profile name */
+    auto qt_model = idx.model();
+    auto idx_formatted_name = qt_model->index(idx.row(), static_cast<int>(PendingContactRequestModel::Columns::FORMATTED_NAME));
+    auto formatted_name_qstring = idx_formatted_name.data(static_cast<int>(Qt::DisplayRole)).value<QString>();
+    auto formatted_name_std = formatted_name_qstring.toStdString();
+
+    /* date */
+    auto idx_date = qt_model->index(idx.row(), static_cast<int>(PendingContactRequestModel::Columns::TIME));
+    auto date_q_date_time = idx_date.data(static_cast<int>(Qt::DisplayRole)).value<QDateTime>();
+    auto date_q_string = QLocale::system().toString(date_q_date_time.time(), QLocale::ShortFormat);
+    auto date_std = date_q_string.toStdString();
+
+    gchar *text = nullptr;
+
+    if(is_selected) // print in default color
+        text = g_markup_printf_escaped("<span font_weight=\"bold\">%s</span>\n%s\n"
+                                        "<span size=\"smaller\">%s</span>", formatted_name_std.c_str(),
+                                                                            uri_std.c_str(),
+                                                                            date_std.c_str());
+    else // use our colors
+        text = g_markup_printf_escaped("<span font_weight=\"bold\">%s</span>\n<span color=\"gray\">%s\n"
+                                        "<span size=\"smaller\">%s</span></span>", formatted_name_std.c_str(),
+                                                                                   uri_std.c_str(),
+                                                                                   date_std.c_str());
+
+    g_object_set(G_OBJECT(cell), "markup", text, nullptr);
+    g_free(text);
+}
+
+/**
  * gtk init function
  */
 static void
@@ -81,24 +175,46 @@
             pending_contact_requests_model = gtk_q_tree_model_new(
                 account->pendingContactRequestModel(),
                 1/*nmbr. of cols.*/,
-                0,
-                Qt::DisplayRole,
-                G_TYPE_STRING);
+                0, Qt::DisplayRole, G_TYPE_STRING);
 
             gtk_tree_view_set_model(GTK_TREE_VIEW(self), GTK_TREE_MODEL(pending_contact_requests_model));
+
         }
     });
 
-    GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
-    GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(C_("Account alias (name) column", "Alias"), renderer, "text", 0, NULL);
+    /* photo and name/contact method column */
+    GtkCellArea *area = gtk_cell_area_box_new();
+    GtkTreeViewColumn *column = gtk_tree_view_column_new_with_area(area);
 
-    /* layout */
+    /* photo renderer */
+    GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new();
+    gtk_cell_area_box_pack_start(GTK_CELL_AREA_BOX(area), renderer, FALSE, FALSE, FALSE);
+
+    /* get the photo */
+    gtk_tree_view_column_set_cell_data_func(
+      column,
+      renderer,
+      (GtkTreeCellDataFunc)render_contact_photo,
+      NULL,
+      NULL);
+
+    /* name and info renderer */
+    renderer = gtk_cell_renderer_text_new();
+    g_object_set(G_OBJECT(renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+    gtk_cell_area_box_pack_start(GTK_CELL_AREA_BOX(area), renderer, FALSE, FALSE, FALSE);
+
+    gtk_tree_view_column_set_cell_data_func(
+      column,
+      renderer,
+      (GtkTreeCellDataFunc)render_name_and_info,
+      self,
+      NULL);
+
     gtk_tree_view_append_column(GTK_TREE_VIEW(self), column);
     gtk_tree_view_column_set_resizable(column, TRUE);
     gtk_tree_view_column_set_expand(column, TRUE);
     gtk_tree_view_expand_all(GTK_TREE_VIEW(self));
 
-
     gtk_widget_show_all(GTK_WIDGET(self));
 }