[Top][All Lists]
[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.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r18642 - in gnunet-gtk: contrib src/fs,
gnunet <=