gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r18642 - in gnunet-gtk: contrib src/fs


From: gnunet
Subject: [GNUnet-SVN] r18642 - in gnunet-gtk: contrib src/fs
Date: Fri, 16 Dec 2011 20:03:56 +0100

Author: grothoff
Date: 2011-12-16 20:03:56 +0100 (Fri, 16 Dec 2011)
New Revision: 18642

Modified:
   gnunet-gtk/contrib/gnunet_fs_gtk_main_window.glade
   gnunet-gtk/src/fs/gnunet-fs-gtk-common.c
   gnunet-gtk/src/fs/gnunet-fs-gtk-event_handler.c
   gnunet-gtk/src/fs/gnunet-fs-gtk.c
Log:
LRN: Make metadata list items selectable, make metadata copyable and be more 
careful with strings (validation) - #1759

Modified: gnunet-gtk/contrib/gnunet_fs_gtk_main_window.glade
===================================================================
--- gnunet-gtk/contrib/gnunet_fs_gtk_main_window.glade  2011-12-16 19:01:22 UTC 
(rev 18641)
+++ gnunet-gtk/contrib/gnunet_fs_gtk_main_window.glade  2011-12-16 19:03:56 UTC 
(rev 18642)
@@ -602,7 +602,10 @@
                         <property name="hadjustment">adjustment1</property>
                         <property name="vadjustment">adjustment2</property>
                         <property name="search_column">0</property>
+                        <property name="rubber_banding">True</property>
                         <property name="enable_grid_lines">both</property>
+                        <signal name="button-press-event" 
handler="GNUNET_GTK_main_window_metadata_treeview_button_press_event_cb" 
swapped="no"/>
+                        <signal name="popup-menu" 
handler="GNUNET_GTK_main_window_metadata_treeview_popup_menu_cb" swapped="no"/>
                         <child>
                           <object class="GtkTreeViewColumn" 
id="GNUNET_GTK_main_window_metadata_type_column">
                             <property name="sizing">autosize</property>
@@ -628,7 +631,6 @@
                             <property name="sort_indicator">True</property>
                             <child>
                               <object class="GtkCellRendererText" 
id="GNUNET_GTK_main_window_metadata_value_renderer">
-                                <property name="sensitive">False</property>
                                 <property name="wrap_mode">word</property>
                               </object>
                               <attributes>
@@ -849,6 +851,20 @@
       <column type="gchararray"/>
     </columns>
   </object>
+  <object class="GtkMenu" id="metadata_popup_menu">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkMenuItem" id="Copy selection">
+        <property name="use_action_appearance">False</property>
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Copy selection</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="metadata_copy_selection_activated" 
swapped="no"/>
+      </object>
+    </child>
+  </object>
   <object class="GtkWindow" id="namespace_selector_window">
     <property name="can_focus">False</property>
     <property name="events">GDK_LEAVE_NOTIFY_MASK | 
GDK_STRUCTURE_MASK</property>

Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-common.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-common.c    2011-12-16 19:01:22 UTC (rev 
18641)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-common.c    2011-12-16 19:03:56 UTC (rev 
18642)
@@ -48,13 +48,32 @@
                                            const char *data_mime_type,
                                            const char *data, size_t data_len)
 {
+  gchar *data_to_insert = NULL;
+  gboolean freedata = FALSE;
   GtkListStore *ls = GTK_LIST_STORE (cls);
 
-  if ((format == EXTRACTOR_METAFORMAT_UTF8) ||
-      (format == EXTRACTOR_METAFORMAT_C_STRING))
+  if (format == EXTRACTOR_METAFORMAT_UTF8)
+  {
+    if (g_utf8_validate (data, data_len, NULL))
+      data_to_insert = data;
+    else
+      format = EXTRACTOR_METAFORMAT_C_STRING;
+  }
+  if (format == EXTRACTOR_METAFORMAT_C_STRING)
+  {
+    gsize rd, wr;
+    data_to_insert = g_locale_to_utf8 (data, data_len, &rd, &wr, NULL);
+    freedata = TRUE;
+  }
+
+  if (data_to_insert)
+  {
     gtk_list_store_insert_with_values (ls, NULL, G_MAXINT, 0, type, 1, format,
                                        2, EXTRACTOR_metatype_to_string (type),
-                                       3, data, -1);
+                                       3, data_to_insert, -1);
+    if (freedata)
+      g_free (data_to_insert);
+  }
   return 0;
 }
 

Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-event_handler.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-event_handler.c     2011-12-16 19:01:22 UTC 
(rev 18641)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-event_handler.c     2011-12-16 19:03:56 UTC 
(rev 18642)
@@ -1934,6 +1934,182 @@
   gtk_list_store_clear (ms);
 }
 
+static void
+copy_metadata_to_clipboard (GtkTreeModel *model, GtkTreePath *path,
+    GtkTreeIter *iter, gpointer user_data)
+{
+  gchar *type, *value;
+  GList **l = (GList **) user_data;
 
+  gtk_tree_model_get (model, iter, 2, &type, 3, &value, -1);
 
+  *l = g_list_prepend (*l, type);
+  *l = g_list_prepend (*l, value);
+}
+
+void
+metadata_copy_selection_activated (GtkMenuItem *menuitem, gpointer user_data)
+{
+  GtkBuilder *builder;
+  GtkTreeView *tree;
+  GtkClipboard *cb;
+  GList *pairs = NULL, *l, *next, *value, *type;
+  guint total_len;
+  gchar *s, *p;
+
+  builder = GTK_BUILDER (user_data);
+  tree = GTK_TREE_VIEW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_main_window_metadata_treeview"));
+
+  gtk_tree_selection_selected_foreach (gtk_tree_view_get_selection (tree),
+      copy_metadata_to_clipboard, &pairs);
+
+  total_len = 0;
+  pairs = g_list_reverse (pairs);
+  for (l = pairs; l; l = next)
+  {
+    type = l;
+    value = l->next;
+    if (!value)
+      break;
+    next = value->next;
+    total_len += strlen ((gchar *) type->data)
+        + strlen ((gchar *) value->data) + 2 /* ": " */ + (next ? 1 : 0) /* 
"\n" */;
+  }
+  if (total_len > 0)
+  {
+    total_len += 1; /* "\0" */
+    s = g_new0 (gchar, total_len);
+    p = s;
+    for (l = pairs; l; l = next)
+    {
+      type = l;
+      value = l->next;
+      if (value)
+      {
+        next = value->next;
+        p = g_stpcpy (p, (gchar *) type->data);
+        p = g_stpcpy (p, ": ");
+        p = g_stpcpy (p, (gchar *) value->data);
+        if (next)
+          p = g_stpcpy (p, "\n");
+      }
+      else
+        next = NULL;
+    }
+  }
+  g_list_foreach (pairs, (GFunc) g_free, NULL);
+  g_list_free (pairs);
+  pairs = NULL;
+
+  if (total_len > 0)
+  {
+    cb = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+    gtk_clipboard_set_text (cb, s, -1);
+    gtk_clipboard_store (cb);
+    g_free (s);
+  }
+}
+
+void
+metadata_menu_popup_position (GtkMenu *menu, gint *x, gint *y, gboolean 
*push_in,
+    gpointer user_data)
+{
+  GtkBuilder *builder;
+  GtkTreeView *tree;
+  GtkTreeSelection *sel;
+  GList *rows;
+  GtkTreePath *p;
+  GtkAllocation tree_allocation;
+  GdkWindow *main_window_gdk;
+  gint mwg_x, mwg_y, t_x, t_y, popup_x, popup_y;
+
+  builder = GTK_BUILDER (user_data);
+
+  tree = GTK_TREE_VIEW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_main_window_metadata_treeview"));
+
+  gtk_widget_get_allocation (GTK_WIDGET (tree), &tree_allocation);
+
+  main_window_gdk = gtk_widget_get_window (GTK_WIDGET (tree));
+
+  gdk_window_get_origin (main_window_gdk, &mwg_x, &mwg_y);
+
+  t_x = mwg_x + tree_allocation.x;
+  t_y = mwg_y + tree_allocation.y;
+  popup_x = t_x;
+  popup_y = t_y;
+
+  sel = gtk_tree_view_get_selection (tree);
+
+  rows = gtk_tree_selection_get_selected_rows (sel, NULL);
+
+  if (rows->data)
+  {
+    GdkRectangle r;
+    p = (GtkTreePath *) rows->data;
+    gtk_tree_view_get_cell_area (tree, p, NULL, &r);
+    popup_x += r.x;
+    popup_y += r.y;
+  }
+
+  g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
+  g_list_free (rows);
+  *x = popup_x;
+  *y = popup_y;
+  *push_in = FALSE;
+}
+
+static void
+do_metadata_popup_menu (GtkWidget *widget, GdkEventButton *event,
+    gpointer user_data)
+{
+  GtkMenu *menu;
+  GtkBuilder *builder;
+  int button, event_time;
+  GtkMenuPositionFunc mpf = NULL;
+
+  builder = GTK_BUILDER (user_data);
+
+  menu = GTK_MENU (gtk_builder_get_object (builder, "metadata_popup_menu"));
+
+  if (event)
+    {
+      button = event->button;
+      event_time = event->time;
+    }
+  else
+    {
+      button = 0;
+      event_time = gtk_get_current_event_time ();
+    }
+
+  gtk_menu_attach_to_widget (menu, widget, NULL);
+  gtk_menu_popup (menu, NULL, NULL, mpf, user_data, 
+                  button, event_time);
+}
+
+gboolean
+GNUNET_GTK_main_window_metadata_treeview_button_press_event_cb (GtkWidget 
*widget,
+    GdkEventButton *event, gpointer user_data)
+{
+ /* Ignore double-clicks and triple-clicks */
+  if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
+  {
+    do_metadata_popup_menu (widget, event, user_data);
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+gboolean
+GNUNET_GTK_main_window_metadata_treeview_popup_menu_cb (GtkWidget *widget,
+    gpointer user_data)
+{
+  do_metadata_popup_menu (widget, NULL, user_data);
+  return TRUE;
+}
+
+
 /* end of gnunet-fs-gtk-event_handler.c */

Modified: gnunet-gtk/src/fs/gnunet-fs-gtk.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk.c   2011-12-16 19:01:22 UTC (rev 18641)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk.c   2011-12-16 19:03:56 UTC (rev 18642)
@@ -572,6 +572,7 @@
   GtkTreeStore *namespace_treestore;
   GtkBuilder *builder;
   GtkWidget *namespace_selector_window;
+  GtkTreeView *metadata_tree;
 
   builder = GTK_BUILDER (user_data);
 
@@ -579,7 +580,12 @@
       ("main_window_search_namespace_treestore"));
   namespace_tree = GTK_TREE_VIEW (GNUNET_FS_GTK_get_main_window_object
       ("namespace_selector_treeview"));
+  metadata_tree = GTK_TREE_VIEW (GNUNET_FS_GTK_get_main_window_object
+      ("GNUNET_GTK_main_window_metadata_treeview"));
 
+  /* Allow multiple selection in metadata view */
+  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (metadata_tree), 
GTK_SELECTION_MULTIPLE);
+
   /* FIXME: find a way to manage pseudonyms.
    * Right now the list will be filled with ALL and ANY pseudonyms that we
    * find, these are held as files in a special directory.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]