diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/caja-query-editor.c | 123 | 
1 files changed, 123 insertions, 0 deletions
diff --git a/src/caja-query-editor.c b/src/caja-query-editor.c index 8319db25..5bfbf7ae 100644 --- a/src/caja-query-editor.c +++ b/src/caja-query-editor.c @@ -38,6 +38,7 @@ typedef enum  {      CAJA_QUERY_EDITOR_ROW_LOCATION,      CAJA_QUERY_EDITOR_ROW_TYPE, +    CAJA_QUERY_EDITOR_ROW_TAGS,      CAJA_QUERY_EDITOR_ROW_LAST  } CajaQueryEditorRowType; @@ -95,6 +96,8 @@ static guint signals[LAST_SIGNAL] = { 0 };  static void  caja_query_editor_class_init       (CajaQueryEditorClass *class);  static void  caja_query_editor_init             (CajaQueryEditor      *editor); +static void go_search_cb (GtkButton *clicked_button, CajaQueryEditor *editor); +  static void entry_activate_cb (GtkWidget *entry, CajaQueryEditor *editor);  static void entry_changed_cb  (GtkWidget *entry, CajaQueryEditor *editor);  static void caja_query_editor_changed_force (CajaQueryEditor *editor, @@ -109,6 +112,14 @@ static void       location_row_add_to_query    (CajaQueryEditorRow *row,  static void       location_row_free_data       (CajaQueryEditorRow *row);  static void       location_add_rows_from_query (CajaQueryEditor    *editor,          CajaQuery          *query); + +static GtkWidget *tags_row_create_widgets      (CajaQueryEditorRow *row); +static void       tags_row_add_to_query        (CajaQueryEditorRow *row, +                                                CajaQuery          *query); +static void       tags_row_free_data           (CajaQueryEditorRow *row); +static void       tags_add_rows_from_query     (CajaQueryEditor    *editor, +                                                CajaQuery          *query); +  static GtkWidget *type_row_create_widgets      (CajaQueryEditorRow *row);  static void       type_row_add_to_query        (CajaQueryEditorRow *row,          CajaQuery          *query); @@ -134,6 +145,13 @@ static CajaQueryEditorRowOps row_type[] =          type_row_free_data,          type_add_rows_from_query      }, +    { +        N_("Tags"), +        tags_row_create_widgets, +        tags_row_add_to_query, +        tags_row_free_data, +        tags_add_rows_from_query +    }  };  EEL_CLASS_BOILERPLATE (CajaQueryEditor, @@ -344,6 +362,111 @@ location_add_rows_from_query (CajaQueryEditor    *editor,      g_free (folder);  } +/* Tags */ +static void +tags_entry_changed_cb (GtkWidget *entry, gpointer *data) +{ +  /* remove commas from string */ +  const gchar *text = gtk_entry_get_text ( GTK_ENTRY (entry)); +  if (g_strrstr (text, ",") == NULL) { +    return; +  } + +  gchar **words = g_strsplit (text, ",", -1); +  gchar *sanitized = g_strjoinv ("", words); +  g_strfreev (words); + +  gtk_entry_set_text (GTK_ENTRY (entry), sanitized); +  g_free(sanitized); +} + +#define MAX_TAGS_ENTRY_LEN 4096 // arbitrary value. + +static GtkWidget * +tags_row_create_widgets (CajaQueryEditorRow *row) +{ +    GtkWidget *entry = gtk_entry_new(); +    gtk_entry_set_max_length (GTK_ENTRY (entry), MAX_TAGS_ENTRY_LEN); +    gtk_widget_set_tooltip_text (entry, +        _("Tags separated by spaces. " +          "Matches files that contains ALL specified tags.")); + +    gtk_entry_set_placeholder_text (GTK_ENTRY (entry), +        _("Tags separated by spaces. " +          "Matches files that contains ALL specified tags.")); + +    gtk_widget_show (entry); +    gtk_box_pack_start (GTK_BOX (row->hbox), entry, TRUE, TRUE, 0); +    g_signal_connect (entry, "changed", G_CALLBACK (tags_entry_changed_cb), entry); +    g_signal_connect (entry, "activate", G_CALLBACK (go_search_cb), row->editor); + +    return entry; +} + +static void +tags_row_add_to_query (CajaQueryEditorRow *row, +                           CajaQuery      *query) +{ +    GtkEntry *entry = GTK_ENTRY (row->type_widget); +    const gchar *tags = gtk_entry_get_text (entry); + +    char **strv = g_strsplit (tags, " ", -1); +    guint len = g_strv_length (strv); +    for (int i=0; i<len; ++i) { +        strv[i] = g_strstrip (strv[i]); +        if (strlen (strv[i]) > 0) { +            caja_query_add_tag (query, strv[i]); +        } +    } +    g_strfreev (strv); +} + +static void +tags_row_free_data (CajaQueryEditorRow *row) +{ +} + +gchar * +xattr_tags_list_to_str (const GList *tags) +{ +    gchar *result = NULL; + +    const GList *tags_iter = NULL; +    for (tags_iter = tags; tags_iter; tags_iter = tags_iter->next) { +        gchar *tmp; + +        if (result != NULL) { +            tmp = g_strconcat (result, ",", tags_iter->data, NULL); +            g_free (result); +        } else { +            tmp = g_strdup (tags_iter->data); +        } + +        result = tmp; +    } + +    return result; +} + +static void +tags_add_rows_from_query (CajaQueryEditor *editor, +                              CajaQuery   *query) +{ +    GList *tags = caja_query_get_tags (query); +    if (tags == NULL) { +        return; +    } + +    CajaQueryEditorRow *row; +    row = caja_query_editor_add_row (editor, CAJA_QUERY_EDITOR_ROW_TAGS); + +    const gchar *tags_str = xattr_tags_list_to_str (tags); +    g_list_free_full (tags, g_free); + +    gtk_entry_set_text (GTK_ENTRY (row->type_widget), tags_str); +    g_free (tags_str); +} +  /* Type */  | 
