[gthumb/ext: 32/79] Implemented create / rename / delete / cut / copy folder commands
- From: Paolo Bacchilega <paobac src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gthumb/ext: 32/79] Implemented create / rename / delete / cut / copy folder commands
- Date: Sun, 2 Aug 2009 20:26:35 +0000 (UTC)
commit de9d0ad74572fa1f2acb19dbf0c8d43f54d6b2e6
Author: Paolo Bacchilega <paobac src gnome org>
Date: Thu Jul 2 22:22:47 2009 +0200
Implemented create / rename / delete / cut / copy folder commands
extensions/catalogs/actions.c | 63 +++---
extensions/catalogs/callbacks.c | 6 +-
extensions/catalogs/dlg-add-to-catalog.c | 43 ++---
extensions/catalogs/gth-file-source-catalogs.c | 9 +-
extensions/file_manager/actions.c | 276 +++++++++++++++++++++++-
extensions/file_manager/actions.h | 7 +
extensions/file_manager/callbacks.c | 212 +++++++++++++++++--
extensions/file_manager/callbacks.h | 1 +
extensions/file_manager/main.c | 1 +
extensions/search/gth-search-task.c | 2 +-
gthumb/gio-utils.c | 13 ++
gthumb/glib-utils.h | 21 ++
gthumb/gth-browser-actions-callbacks.c | 26 ++--
gthumb/gth-browser.c | 222 +++++++-------------
gthumb/gth-browser.h | 2 +
gthumb/gth-file-data.c | 2 +-
gthumb/gth-file-data.h | 17 --
gthumb/gth-file-list.c | 53 +++++-
gthumb/gth-file-list.h | 3 +
gthumb/gth-file-source-vfs.c | 11 +-
gthumb/gth-file-source.c | 8 +-
gthumb/gth-file-source.h | 6 +-
gthumb/gth-file-store.c | 11 +
gthumb/gth-file-store.h | 4 +-
gthumb/gth-folder-tree.c | 161 +++++++-------
gthumb/gth-folder-tree.h | 4 +-
gthumb/gth-location-chooser.c | 2 +-
gthumb/gth-main-default-hooks.c | 7 +
gthumb/gth-source-tree.c | 6 +-
gthumb/gth-uri-list.c | 98 +++++-----
30 files changed, 882 insertions(+), 415 deletions(-)
---
diff --git a/extensions/catalogs/actions.c b/extensions/catalogs/actions.c
index 2842928..d82c331 100644
--- a/extensions/catalogs/actions.c
+++ b/extensions/catalogs/actions.c
@@ -175,7 +175,7 @@ void
gth_browser_activate_action_catalog_new (GtkAction *action,
GthBrowser *browser)
{
- GFile *selected_parent;
+ GthFileData *selected_parent;
GFile *parent;
GthFileSource *file_source;
GFile *gio_parent;
@@ -187,12 +187,12 @@ gth_browser_activate_action_catalog_new (GtkAction *action,
GthFileSource *file_source;
GFileInfo *info;
- file_source = gth_main_get_file_source (selected_parent);
- info = gth_file_source_get_file_info (file_source, selected_parent);
+ file_source = gth_main_get_file_source (selected_parent->file);
+ info = gth_file_source_get_file_info (file_source, selected_parent->file, GFILE_BASIC_ATTRIBUTES);
if (g_file_info_get_attribute_boolean (info, "gthumb::no-child"))
- parent = g_file_get_parent (selected_parent);
+ parent = g_file_get_parent (selected_parent->file);
else
- parent = g_file_dup (selected_parent);
+ parent = g_file_dup (selected_parent->file);
g_object_unref (info);
g_object_unref (file_source);
@@ -202,16 +202,16 @@ gth_browser_activate_action_catalog_new (GtkAction *action,
file_source = gth_main_get_file_source (parent);
gio_parent = gth_file_source_to_gio_file (file_source, parent);
- gio_file = _g_file_create_unique (gio_parent, _("New Catalog"), ".catalog", &error);
+ gio_file = _g_file_create_unique (gio_parent, _("untitled catalog"), ".catalog", &error);
if (gio_file != NULL) {
- GFile *file;
- GList *list;
- GFileInfo *info;
- GthFileData *file_data;
- GList *file_data_list;
+ GFile *file;
+ GList *list;
+ GFileInfo *info;
+ GthFileData *file_data;
+ GList *file_data_list;
file = gth_catalog_file_from_gio_file (gio_file, NULL);
- info = gth_file_source_get_file_info (file_source, file);
+ info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
file_data = gth_file_data_new (file, info);
file_data_list = g_list_prepend (NULL, file_data);
gth_folder_tree_add_children (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), parent, file_data_list);
@@ -242,11 +242,11 @@ void
gth_browser_activate_action_catalog_new_library (GtkAction *action,
GthBrowser *browser)
{
- GFile *selected_parent;
+ GthFileData *selected_parent;
GFile *parent;
GthFileSource *file_source;
GFile *gio_parent;
- GError *error;
+ GError *error = NULL;
GFile *gio_file;
selected_parent = gth_folder_tree_get_selected_or_parent (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
@@ -254,12 +254,12 @@ gth_browser_activate_action_catalog_new_library (GtkAction *action,
GthFileSource *file_source;
GFileInfo *info;
- file_source = gth_main_get_file_source (selected_parent);
- info = gth_file_source_get_file_info (file_source, selected_parent);
+ file_source = gth_main_get_file_source (selected_parent->file);
+ info = gth_file_source_get_file_info (file_source, selected_parent->file, GFILE_BASIC_ATTRIBUTES);
if (g_file_info_get_attribute_boolean (info, "gthumb::no-child"))
- parent = g_file_get_parent (selected_parent);
+ parent = g_file_get_parent (selected_parent->file);
else
- parent = g_file_dup (selected_parent);
+ parent = g_file_dup (selected_parent->file);
g_object_unref (info);
g_object_unref (file_source);
@@ -269,7 +269,7 @@ gth_browser_activate_action_catalog_new_library (GtkAction *action,
file_source = gth_main_get_file_source (parent);
gio_parent = gth_file_source_to_gio_file (file_source, parent);
- gio_file = _g_directory_create_unique (gio_parent, _("New Library"), "", &error);
+ gio_file = _g_directory_create_unique (gio_parent, _("untitled library"), "", &error);
if (gio_file != NULL) {
GFile *file;
GList *list;
@@ -278,7 +278,7 @@ gth_browser_activate_action_catalog_new_library (GtkAction *action,
GList *file_data_list;
file = gth_catalog_file_from_gio_file (gio_file, NULL);
- info = gth_file_source_get_file_info (file_source, file);
+ info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
file_data = gth_file_data_new (file, info);
file_data_list = g_list_prepend (NULL, file_data);
gth_folder_tree_add_children (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), parent, file_data_list);
@@ -310,27 +310,26 @@ gth_browser_activate_action_catalog_remove (GtkAction *action,
GthBrowser *browser)
{
GthFolderTree *folder_tree;
- GFile *file;
+ GthFileData *file_data;
GFile *gio_file;
GError *error = NULL;
folder_tree = GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser));
- file = gth_folder_tree_get_selected (folder_tree);
- gio_file = gth_main_get_gio_file (file);
+ file_data = gth_folder_tree_get_selected (folder_tree);
+ gio_file = gth_main_get_gio_file (file_data->file);
if (g_file_delete (gio_file, NULL, &error)) {
GFile *parent;
GList *files;
- parent = g_file_get_parent (file);
- files = g_list_prepend (NULL, g_object_ref (file));
+ parent = g_file_get_parent (file_data->file);
+ files = g_list_prepend (NULL, g_object_ref (file_data->file));
gth_monitor_folder_changed (gth_main_get_default_monitor (),
parent,
files,
GTH_MONITOR_EVENT_DELETED);
_g_object_list_unref (files);
- if (parent != NULL)
- g_object_unref (parent);
+ _g_object_unref (parent);
}
else
_gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser),
@@ -338,7 +337,7 @@ gth_browser_activate_action_catalog_remove (GtkAction *action,
&error);
g_object_unref (gio_file);
- g_object_unref (file);
+ g_object_unref (file_data);
}
@@ -347,11 +346,11 @@ gth_browser_activate_action_catalog_rename (GtkAction *action,
GthBrowser *browser)
{
GthFolderTree *folder_tree;
- GFile *file;
+ GthFileData *file_data;
folder_tree = GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser));
- file = gth_folder_tree_get_selected (folder_tree);
- gth_folder_tree_start_editing (folder_tree, file);
+ file_data = gth_folder_tree_get_selected (folder_tree);
+ gth_folder_tree_start_editing (folder_tree, file_data->file);
- g_object_unref (file);
+ g_object_unref (file_data);
}
diff --git a/extensions/catalogs/callbacks.c b/extensions/catalogs/callbacks.c
index e9d63bc..ea2851c 100644
--- a/extensions/catalogs/callbacks.c
+++ b/extensions/catalogs/callbacks.c
@@ -168,7 +168,7 @@ catalogs__gth_browser_update_sensitivity_cb (GthBrowser *browser)
void
catalogs__gth_browser_folder_tree_popup_before_cb (GthBrowser *browser,
GthFileSource *file_source,
- GFile *folder)
+ GthFileData *folder)
{
BrowserData *data;
@@ -190,11 +190,11 @@ catalogs__gth_browser_folder_tree_popup_before_cb (GthBrowser *browser,
}
action = gtk_action_group_get_action (data->actions, "Catalog_Remove");
- sensitive = folder != NULL;
+ sensitive = (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE);
g_object_set (action, "sensitive", sensitive, NULL);
action = gtk_action_group_get_action (data->actions, "Catalog_Rename");
- sensitive = folder != NULL;
+ sensitive = (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME);
g_object_set (action, "sensitive", sensitive, NULL);
}
else {
diff --git a/extensions/catalogs/dlg-add-to-catalog.c b/extensions/catalogs/dlg-add-to-catalog.c
index 54108eb..b8bde64 100644
--- a/extensions/catalogs/dlg-add-to-catalog.c
+++ b/extensions/catalogs/dlg-add-to-catalog.c
@@ -63,20 +63,11 @@ static GthFileData *
get_selected_catalog (DialogData *data)
{
GthFileData *file_data = NULL;
- GFile *file;
- file = gth_folder_tree_get_selected_or_parent (GTH_FOLDER_TREE (data->source_tree));
- if (file != NULL) {
- GthFileSource *file_source;
- GFileInfo *info;
-
- file_source = gth_main_get_file_source (file);
- info = gth_file_source_get_file_info (file_source, file);
- if (g_file_info_get_attribute_boolean (info, "gthumb::no-child"))
- file_data = gth_file_data_new (file, info);
-
- g_object_unref (info);
- g_object_unref (file);
+ file_data = gth_folder_tree_get_selected_or_parent (GTH_FOLDER_TREE (data->source_tree));
+ if (! g_file_info_get_attribute_boolean (file_data->info, "gthumb::no-child")) {
+ _g_object_unref (file_data);
+ file_data = NULL;
}
return file_data;
@@ -185,7 +176,7 @@ get_catalog_parent (GFile *selected_parent)
GFileInfo *info;
file_source = gth_main_get_file_source (selected_parent);
- info = gth_file_source_get_file_info (file_source, selected_parent);
+ info = gth_file_source_get_file_info (file_source, selected_parent, GFILE_BASIC_ATTRIBUTES);
if ((g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) &&
! g_file_info_get_attribute_boolean (info, "gthumb::no-child"))
{
@@ -208,7 +199,7 @@ static void
new_catalog_button_clicked_cb (GtkWidget *widget,
DialogData *data)
{
- GFile *selected_parent;
+ GthFileData *selected_parent;
GFile *parent;
GthFileSource *file_source;
GFile *gio_parent;
@@ -220,12 +211,12 @@ new_catalog_button_clicked_cb (GtkWidget *widget,
GthFileSource *file_source;
GFileInfo *info;
- file_source = gth_main_get_file_source (selected_parent);
- info = gth_file_source_get_file_info (file_source, selected_parent);
+ file_source = gth_main_get_file_source (selected_parent->file);
+ info = gth_file_source_get_file_info (file_source, selected_parent->file, GFILE_BASIC_ATTRIBUTES);
if (g_file_info_get_attribute_boolean (info, "gthumb::no-child"))
- parent = g_file_get_parent (selected_parent);
+ parent = g_file_get_parent (selected_parent->file);
else
- parent = g_file_dup (selected_parent);
+ parent = g_file_dup (selected_parent->file);
g_object_unref (info);
g_object_unref (file_source);
@@ -244,7 +235,7 @@ new_catalog_button_clicked_cb (GtkWidget *widget,
GList *file_data_list;
file = gth_catalog_file_from_gio_file (gio_file, NULL);
- info = gth_file_source_get_file_info (file_source, file);
+ info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES);
file_data = gth_file_data_new (file, info);
file_data_list = g_list_prepend (NULL, file_data);
gth_folder_tree_add_children (GTH_FOLDER_TREE (data->source_tree), parent, file_data_list);
@@ -275,11 +266,11 @@ static void
new_library_button_clicked_cb (GtkWidget *widget,
DialogData *data)
{
- char *display_name;
- GFile *selected_catalog;
- GFile *parent;
- GFile *new_library;
- GError *error = NULL;
+ char *display_name;
+ GthFileData *selected_catalog;
+ GFile *parent;
+ GFile *new_library;
+ GError *error = NULL;
display_name = _gtk_request_dialog_run (GTK_WINDOW (data->dialog),
GTK_DIALOG_MODAL,
@@ -292,7 +283,7 @@ new_library_button_clicked_cb (GtkWidget *widget,
return;
selected_catalog = gth_folder_tree_get_selected (GTH_FOLDER_TREE (data->source_tree));
- parent = get_catalog_parent (selected_catalog);
+ parent = get_catalog_parent (selected_catalog->file);
new_library = g_file_get_child_for_display_name (parent, display_name, &error);
if ((new_library != NULL) && (strchr (display_name, '/') != NULL)) {
diff --git a/extensions/catalogs/gth-file-source-catalogs.c b/extensions/catalogs/gth-file-source-catalogs.c
index 8e739d0..f4704ed 100644
--- a/extensions/catalogs/gth-file-source-catalogs.c
+++ b/extensions/catalogs/gth-file-source-catalogs.c
@@ -50,7 +50,7 @@ get_entry_points (GthFileSource *file_source)
GFileInfo *info;
file = g_file_new_for_uri ("catalog:///");
- info = gth_file_source_get_file_info (file_source, file);
+ info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES);
list = g_list_append (list, gth_file_data_new (file, info));
g_object_unref (info);
@@ -115,14 +115,15 @@ update_file_info (GthFileSource *file_source,
static GFileInfo *
gth_file_source_catalogs_get_file_info (GthFileSource *file_source,
- GFile *file)
+ GFile *file,
+ const char *attributes)
{
GFile *gio_file;
GFileInfo *file_info;
gio_file = gth_catalog_file_to_gio_file (file);
file_info = g_file_query_info (gio_file,
- "standard::display-name,standard::icon",
+ attributes,
G_FILE_QUERY_INFO_NONE,
NULL,
NULL);
@@ -370,7 +371,7 @@ gth_file_source_catalogs_read_attributes (GthFileSource *file_source,
gio_files = gth_file_source_to_gio_file_list (GTH_FILE_SOURCE (catalogs), files);
g_query_info_async (gio_files,
- GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE,
+ GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE,
catalogs->priv->cancellable,
info_ready_cb,
data);
diff --git a/extensions/file_manager/actions.c b/extensions/file_manager/actions.c
index b62a350..2caf417 100644
--- a/extensions/file_manager/actions.c
+++ b/extensions/file_manager/actions.c
@@ -134,20 +134,16 @@ clipboard_clear_cb (GtkClipboard *clipboard,
static void
_gth_browser_clipboard_copy_or_cut (GthBrowser *browser,
+ GList *file_list,
gboolean cut)
{
ClipboardData *data;
- GList *items;
- GList *file_list;
GtkTargetList *target_list;
GtkTargetEntry *targets;
int n_targets;
GList *scan;
int i;
- items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
- file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
-
data = g_new0 (ClipboardData, 1);
data->cut = cut;
data->n_uris = g_list_length (file_list);
@@ -172,8 +168,6 @@ _gth_browser_clipboard_copy_or_cut (GthBrowser *browser,
gtk_target_list_unref (target_list);
gtk_target_table_free (targets, n_targets);
- _g_object_list_unref (file_list);
- _gtk_tree_path_list_free (items);
}
@@ -181,7 +175,15 @@ void
gth_browser_activate_action_edit_cut_files (GtkAction *action,
GthBrowser *browser)
{
- _gth_browser_clipboard_copy_or_cut (browser, TRUE);
+ GList *items;
+ GList *file_list;
+
+ items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+ file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+ _gth_browser_clipboard_copy_or_cut (browser, file_list, TRUE);
+
+ _g_object_list_unref (file_list);
+ _gtk_tree_path_list_free (items);
}
@@ -189,7 +191,15 @@ void
gth_browser_activate_action_edit_copy_files (GtkAction *action,
GthBrowser *browser)
{
- _gth_browser_clipboard_copy_or_cut (browser, FALSE);
+ GList *items;
+ GList *file_list;
+
+ items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+ file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+ _gth_browser_clipboard_copy_or_cut (browser, file_list, FALSE);
+
+ _g_object_list_unref (file_list);
+ _gtk_tree_path_list_free (items);
}
@@ -345,8 +355,22 @@ delete_file_permanently (GtkWindow *window,
GError *error = NULL;
files = gth_file_data_list_to_file_list (file_list);
- if (! _g_delete_files (files, TRUE, &error))
+ if (! _g_delete_files (files, TRUE, &error)) {
_gtk_error_dialog_from_gerror_show (window, _("Could not delete the files"), &error);
+ }
+ else {
+ GthFileData *first;
+ GFile *parent;
+
+ first = files->data;
+ parent = g_file_get_parent (first->file);
+ gth_monitor_folder_changed (gth_main_get_default_monitor (),
+ parent,
+ files,
+ GTH_MONITOR_EVENT_DELETED);
+
+ g_object_unref (parent);
+ }
_g_object_list_unref (files);
}
@@ -357,10 +381,11 @@ delete_permanently_response_cb (GtkDialog *dialog,
int response_id,
gpointer user_data)
{
- GList *file_list = user_data;
+ GList *file_list = user_data;
if (response_id == GTK_RESPONSE_YES)
delete_file_permanently (gtk_window_get_transient_for (GTK_WINDOW (dialog)), file_list);
+
gtk_widget_destroy (GTK_WIDGET (dialog));
_g_object_list_unref (file_list);
}
@@ -449,3 +474,232 @@ gth_browser_activate_action_edit_delete (GtkAction *action,
g_free (prompt);
_gtk_tree_path_list_free (items);
}
+
+
+void
+gth_browser_activate_action_folder_create (GtkAction *action,
+ GthBrowser *browser)
+{
+ GthFileData *parent;
+ GthFileSource *file_source;
+ GError *error = NULL;
+ GFile *file;
+
+ parent = gth_folder_tree_get_selected_or_parent (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+ if (parent == NULL)
+ return;
+
+ file_source = gth_main_get_file_source (parent->file);
+ file = _g_directory_create_unique (parent->file, _("untitled folder"), "", &error);
+ if (file != NULL) {
+ GList *list;
+ GFileInfo *info;
+ GthFileData *file_data;
+ GList *file_data_list;
+
+ info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
+ file_data = gth_file_data_new (file, info);
+ file_data_list = g_list_prepend (NULL, file_data);
+ gth_folder_tree_add_children (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), parent->file, file_data_list);
+ gth_folder_tree_start_editing (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), file);
+
+ list = g_list_prepend (NULL, g_object_ref (file));
+ gth_monitor_folder_changed (gth_main_get_default_monitor (),
+ parent->file,
+ list,
+ GTH_MONITOR_EVENT_CREATED);
+
+ _g_object_list_unref (list);
+ g_list_free (file_data_list);
+ g_object_unref (file_data);
+ g_object_unref (info);
+ }
+ else
+ _gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser), _("Could not create the folder"), &error);
+
+ _g_object_unref (file);
+ g_object_unref (file_source);
+ g_object_unref (parent);
+}
+
+
+void
+gth_browser_activate_action_folder_rename (GtkAction *action,
+ GthBrowser *browser)
+{
+ GthFileData *file_data;
+
+ file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+ if (file_data == NULL)
+ return;
+
+ gth_folder_tree_start_editing (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)), file_data->file);
+
+ g_object_unref (file_data);
+}
+
+
+void
+gth_browser_activate_action_folder_cut (GtkAction *action,
+ GthBrowser *browser)
+{
+ GthFileData *file_data;
+ GList *file_list;
+
+ file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+ if (file_data == NULL)
+ return;
+
+ file_list = g_list_prepend (NULL, file_data);
+ _gth_browser_clipboard_copy_or_cut (browser, file_list, TRUE);
+
+ g_list_free (file_list);
+}
+
+
+void
+gth_browser_activate_action_folder_copy (GtkAction *action,
+ GthBrowser *browser)
+{
+ GthFileData *file_data;
+ GList *file_list;
+
+ file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+ if (file_data == NULL)
+ return;
+
+ file_list = g_list_prepend (NULL, file_data);
+ _gth_browser_clipboard_copy_or_cut (browser, file_list, FALSE);
+
+ g_list_free (file_list);
+}
+
+
+void
+gth_browser_activate_action_folder_paste (GtkAction *action,
+ GthBrowser *browser)
+{
+
+}
+
+
+/* -- gth_browser_activate_action_folder_trash -- */
+
+
+static void
+delete_folder_permanently (GtkWindow *window,
+ GthFileData *file_data)
+{
+ GList *files;
+ GError *error = NULL;
+
+ files = g_list_prepend (NULL, file_data->file);
+ if (! _g_delete_files (files, TRUE, &error)) {
+ _gtk_error_dialog_from_gerror_show (window, _("Could not delete the folder"), &error);
+ }
+ else {
+ GFile *parent;
+
+ parent = g_file_get_parent (file_data->file);
+ gth_monitor_folder_changed (gth_main_get_default_monitor (),
+ parent,
+ files,
+ GTH_MONITOR_EVENT_DELETED);
+
+ g_object_unref (parent);
+ }
+
+ g_list_free (files);
+}
+
+
+static void
+delete_folder_permanently_response_cb (GtkDialog *dialog,
+ int response_id,
+ gpointer user_data)
+{
+ GthFileData *file_data = user_data;
+
+ if (response_id == GTK_RESPONSE_YES)
+ delete_folder_permanently (gtk_window_get_transient_for (GTK_WINDOW (dialog)), file_data);
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ _g_object_unref (file_data);
+}
+
+
+void
+gth_browser_activate_action_folder_trash (GtkAction *action,
+ GthBrowser *browser)
+{
+ GthFileData *file_data;
+ GError *error = NULL;
+
+ file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+ if (file_data == NULL)
+ return;
+
+ if (! g_file_trash (file_data->file, NULL, &error)) {
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED)) {
+ GtkWidget *d;
+
+ g_clear_error (&error);
+
+ d = _gtk_yesno_dialog_new (GTK_WINDOW (browser),
+ GTK_DIALOG_MODAL,
+ _("The folder cannot be moved to the Trash. Do you want to delete it permanently?"),
+ GTK_STOCK_CANCEL,
+ GTK_STOCK_DELETE);
+ g_signal_connect (d, "response", G_CALLBACK (delete_folder_permanently_response_cb), file_data);
+ gtk_widget_show (d);
+
+ file_data = NULL;
+ }
+ else
+ _gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser), _("Could not move the folder to the Trash"), &error);
+ }
+ else {
+ GFile *parent;
+ GList *files;
+
+ parent = g_file_get_parent (file_data->file);
+ files = g_list_prepend (NULL, file_data->file);
+ gth_monitor_folder_changed (gth_main_get_default_monitor (),
+ parent,
+ files,
+ GTH_MONITOR_EVENT_DELETED);
+
+ g_list_free (files);
+ g_object_unref (parent);
+ }
+
+ _g_object_unref (file_data);
+}
+
+
+void
+gth_browser_activate_action_folder_delete (GtkAction *action,
+ GthBrowser *browser)
+{
+ GthFileData *file_data;
+ char *prompt;
+ GtkWidget *d;
+
+ file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+ if (file_data == NULL)
+ return;
+
+ prompt = g_strdup_printf (_("Are you sure you want to permanently delete \"%s\"?"), g_file_info_get_display_name (file_data->info));
+ d = _gtk_message_dialog_new (GTK_WINDOW (browser),
+ GTK_DIALOG_MODAL,
+ GTK_STOCK_DIALOG_QUESTION,
+ prompt,
+ _("If you delete a file, it will be permanently lost."),
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_DELETE, GTK_RESPONSE_YES,
+ NULL);
+ g_signal_connect (d, "response", G_CALLBACK (delete_folder_permanently_response_cb), file_data);
+ gtk_widget_show (d);
+
+ g_free (prompt);
+}
diff --git a/extensions/file_manager/actions.h b/extensions/file_manager/actions.h
index 06ce4fd..ec2befa 100644
--- a/extensions/file_manager/actions.h
+++ b/extensions/file_manager/actions.h
@@ -36,5 +36,12 @@ DEFINE_ACTION(gth_browser_activate_action_edit_duplicate)
DEFINE_ACTION(gth_browser_activate_action_edit_rename)
DEFINE_ACTION(gth_browser_activate_action_edit_trash)
DEFINE_ACTION(gth_browser_activate_action_edit_delete)
+DEFINE_ACTION(gth_browser_activate_action_folder_create)
+DEFINE_ACTION(gth_browser_activate_action_folder_rename)
+DEFINE_ACTION(gth_browser_activate_action_folder_cut)
+DEFINE_ACTION(gth_browser_activate_action_folder_copy)
+DEFINE_ACTION(gth_browser_activate_action_folder_paste)
+DEFINE_ACTION(gth_browser_activate_action_folder_trash)
+DEFINE_ACTION(gth_browser_activate_action_folder_delete)
#endif /* ACTIONS_H */
diff --git a/extensions/file_manager/callbacks.c b/extensions/file_manager/callbacks.c
index 0a1ae3c..6bbeb11 100644
--- a/extensions/file_manager/callbacks.c
+++ b/extensions/file_manager/callbacks.c
@@ -83,8 +83,16 @@ static const char *folder_popup_ui_info =
"<ui>"
" <popup name='FolderListPopup'>"
" <placeholder name='SourceCommands'>"
-" <menuitem action='File_NewFolder'/>"
-" <menuitem action='File_RenameFolder'/>"
+" <menuitem action='Folder_Create'/>"
+" <separator />"
+" <menuitem action='Folder_Cut'/>"
+" <menuitem action='Folder_Copy'/>"
+" <menuitem action='Folder_Paste'/>"
+" <separator />"
+" <menuitem action='Folder_Rename'/>"
+" <separator />"
+" <menuitem action='Folder_Trash'/>"
+" <menuitem action='Folder_Delete'/>"
" </placeholder>"
" </popup>"
"</ui>";
@@ -127,6 +135,34 @@ static GtkActionEntry action_entries[] = {
N_("_Delete"), "<shift>Delete",
N_("Delete the selected files"),
G_CALLBACK (gth_browser_activate_action_edit_delete) },
+ { "Folder_Create", NULL,
+ N_("Create _Folder"), NULL,
+ N_("Create a new empty folder inside this folder"),
+ G_CALLBACK (gth_browser_activate_action_folder_create) },
+ { "Folder_Rename", NULL,
+ N_("_Rename"), NULL,
+ NULL,
+ G_CALLBACK (gth_browser_activate_action_folder_rename) },
+ { "Folder_Cut", GTK_STOCK_CUT,
+ NULL, NULL,
+ NULL,
+ G_CALLBACK (gth_browser_activate_action_folder_cut) },
+ { "Folder_Copy", GTK_STOCK_COPY,
+ NULL, NULL,
+ NULL,
+ G_CALLBACK (gth_browser_activate_action_folder_copy) },
+ { "Folder_Paste", GTK_STOCK_PASTE,
+ N_("_Paste Into Folder"), NULL,
+ NULL,
+ G_CALLBACK (gth_browser_activate_action_folder_paste) },
+ { "Folder_Trash", "user-trash",
+ N_("Mo_ve to Trash"), NULL,
+ NULL,
+ G_CALLBACK (gth_browser_activate_action_folder_trash) },
+ { "Folder_Delete", "edit-delete",
+ N_("_Delete"), NULL,
+ NULL,
+ G_CALLBACK (gth_browser_activate_action_folder_delete) },
};
@@ -136,6 +172,7 @@ typedef struct {
guint browser_merge_id;
guint browser_vfs_merge_id;
guint folder_popup_merge_id;
+ gboolean can_paste;
} BrowserData;
@@ -264,7 +301,7 @@ fm__gth_browser_load_location_after_cb (GthBrowser *browser,
void
fm__gth_browser_folder_tree_popup_before_cb (GthBrowser *browser,
GthFileSource *file_source,
- GFile *folder)
+ GthFileData *folder)
{
BrowserData *data;
@@ -272,9 +309,6 @@ fm__gth_browser_folder_tree_popup_before_cb (GthBrowser *browser,
g_return_if_fail (data != NULL);
if (GTH_IS_FILE_SOURCE_VFS (file_source)) {
- GtkAction *action;
- gboolean sensitive;
-
if (data->folder_popup_merge_id == 0) {
GError *error = NULL;
@@ -284,10 +318,11 @@ fm__gth_browser_folder_tree_popup_before_cb (GthBrowser *browser,
g_error_free (error);
}
}
-
- action = gtk_action_group_get_action (data->action_group, "File_RenameFolder");
- sensitive = folder != NULL;
- g_object_set (action, "sensitive", sensitive, NULL);
+ set_action_sensitive (data, "Folder_Create", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE));
+ set_action_sensitive (data, "Folder_Rename", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME));
+ set_action_sensitive (data, "Folder_Delete", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
+ set_action_sensitive (data, "Folder_Trash", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH));
+ set_action_sensitive (data, "Folder_Cut", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
}
else {
if (data->folder_popup_merge_id != 0) {
@@ -306,18 +341,22 @@ clipboard_targets_received_cb (GtkClipboard *clipboard,
{
GthBrowser *browser = user_data;
BrowserData *data;
- gboolean can_paste;
int i;
+ GthFileData *folder;
data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
- can_paste = FALSE;
- for (i = 0; ! can_paste && (i < n_atoms); i++)
+ data->can_paste = FALSE;
+ for (i = 0; ! data->can_paste && (i < n_atoms); i++)
if (atoms[i] == GNOME_COPIED_FILES)
- can_paste = TRUE;
+ data->can_paste = TRUE;
- set_action_sensitive (data, "Edit_PasteInFolder", can_paste);
+ set_action_sensitive (data, "Edit_PasteInFolder", data->can_paste);
+ folder = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+ set_action_sensitive (data, "Folder_Paste", (folder != NULL) && data->can_paste && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE));
+
+ _g_object_unref (folder);
g_object_unref (browser);
}
@@ -331,6 +370,7 @@ _gth_browser_update_paste_command_sensitivity (GthBrowser *browser,
data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
g_return_if_fail (data != NULL);
+ data->can_paste = FALSE;
set_action_sensitive (data, "Edit_PasteInFolder", FALSE);
if (clipboard == NULL)
@@ -348,6 +388,7 @@ fm__gth_browser_update_sensitivity_cb (GthBrowser *browser)
GthFileSource *file_source;
int n_selected;
gboolean sensitive;
+ GthFileData *folder;
data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY);
g_return_if_fail (data != NULL);
@@ -365,7 +406,147 @@ fm__gth_browser_update_sensitivity_cb (GthBrowser *browser)
set_action_sensitive (data, "Edit_Duplicate", sensitive);
set_action_sensitive (data, "Edit_Rename", sensitive);
+ folder = gth_folder_tree_get_selected (GTH_FOLDER_TREE (gth_browser_get_folder_tree (browser)));
+ set_action_sensitive (data, "Folder_Create", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE));
+ set_action_sensitive (data, "Folder_Rename", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME));
+ set_action_sensitive (data, "Folder_Delete", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
+ set_action_sensitive (data, "Folder_Trash", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH));
+ set_action_sensitive (data, "Folder_Cut", (folder != NULL) && g_file_info_get_attribute_boolean (folder->info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE));
+
_gth_browser_update_paste_command_sensitivity (browser, NULL);
+
+ _g_object_unref (folder);
+}
+
+
+/* -- selection_changed -- */
+
+
+static void
+activate_open_with_application_item (GtkMenuItem *menuitem,
+ gpointer data)
+{
+ GthBrowser *browser = data;
+ GList *items;
+ GList *file_list;
+ GList *uris;
+ GList *scan;
+ GAppInfo *appinfo;
+ GError *error = NULL;
+
+ items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+ file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+
+ uris = NULL;
+ for (scan = file_list; scan; scan = scan->next) {
+ GthFileData *file_data = scan->data;
+ uris = g_list_prepend (uris, g_file_get_uri (file_data->file));
+ }
+
+ appinfo = g_object_get_data (G_OBJECT (menuitem), "appinfo");
+ g_return_if_fail (G_IS_APP_INFO (appinfo));
+
+ if (! g_app_info_launch_uris (appinfo, uris, NULL, &error))
+ _gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser),
+ _("Could not perform the operation"),
+ &error);
+
+ g_list_free (uris);
+ _g_object_list_unref (file_list);
+ _gtk_tree_path_list_free (items);
+}
+
+
+static void
+_gth_browser_update_open_menu (GthBrowser *browser)
+{
+ GtkWidget *openwith_item;
+ GtkWidget *menu;
+ GList *items;
+ GList *file_list;
+ GList *scan;
+ GList *appinfo_list;
+ GthIconCache *icon_cache;
+ GHashTable *used_apps;
+
+ openwith_item = gtk_ui_manager_get_widget (gth_browser_get_ui_manager (browser), "/FileListPopup/OpenWith");
+ menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (openwith_item));
+ _gtk_container_remove_children (GTK_CONTAINER (menu), NULL, NULL);
+
+ items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+ file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+
+ appinfo_list = NULL;
+ for (scan = file_list; scan; scan = scan->next) {
+ GthFileData *file_data = scan->data;
+ const char *mime_type;
+
+ mime_type = gth_file_data_get_mime_type (file_data);
+ if ((mime_type == NULL) || g_content_type_is_unknown (mime_type))
+ continue;
+
+ appinfo_list = g_list_concat (appinfo_list, g_app_info_get_all_for_type (mime_type));
+ }
+
+ icon_cache = gth_browser_get_menu_icon_cache (browser);
+ used_apps = g_hash_table_new (g_str_hash, g_str_equal);
+ for (scan = appinfo_list; scan; scan = scan->next) {
+ GAppInfo *appinfo = scan->data;
+ char *label;
+ GtkWidget *menu_item;
+ GIcon *icon;
+ GdkPixbuf *pixbuf;
+
+ if (strcmp (g_app_info_get_executable (appinfo), "gthumb") == 0)
+ continue;
+ if (g_hash_table_lookup (used_apps, g_app_info_get_id (appinfo)) != NULL)
+ continue;
+ g_hash_table_insert (used_apps, (gpointer) g_app_info_get_id (appinfo), GINT_TO_POINTER (1));
+
+ label = g_strdup_printf (_("Open with \"%s\""), g_app_info_get_name (appinfo));
+ menu_item = gtk_image_menu_item_new_with_label (label);
+
+ icon = g_app_info_get_icon (appinfo);
+ pixbuf = gth_icon_cache_get_pixbuf (icon_cache, icon);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), gtk_image_new_from_pixbuf (pixbuf));
+
+ gtk_widget_show (menu_item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+
+ g_object_set_data (G_OBJECT (menu_item), "appinfo", appinfo);
+ g_signal_connect (menu_item,
+ "activate",
+ G_CALLBACK (activate_open_with_application_item),
+ browser);
+
+ g_object_unref (pixbuf);
+ g_free (label);
+ }
+
+ /*
+ if (appinfo_list == NULL) {
+ GtkWidget *menu_item;
+
+ menu_item = gtk_image_menu_item_new_with_label (_("No application available"));
+ gtk_widget_set_sensitive (menu_item, FALSE);
+ gtk_widget_show (menu_item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+ }*/
+
+ gtk_widget_set_sensitive (openwith_item, appinfo_list != NULL);
+ gtk_widget_show (openwith_item);
+
+ g_hash_table_destroy (used_apps);
+ g_list_free (appinfo_list);
+ _g_object_list_unref (file_list);
+ _gtk_tree_path_list_free (items);
+}
+
+
+void
+fm__gth_browser_selection_changed_cb (GthBrowser *browser)
+{
+ _gth_browser_update_open_menu (browser);
}
@@ -401,4 +582,3 @@ fm__gth_browser_unrealize_cb (GthBrowser *browser)
G_CALLBACK (clipboard_owner_change_cb),
browser);
}
-
diff --git a/extensions/file_manager/callbacks.h b/extensions/file_manager/callbacks.h
index 2c5f71d..7e244cb 100644
--- a/extensions/file_manager/callbacks.h
+++ b/extensions/file_manager/callbacks.h
@@ -35,6 +35,7 @@ void fm__gth_browser_folder_tree_popup_before_cb (GthBrowser *browser,
GthFileSource *file_source,
GFile *folder);
void fm__gth_browser_update_sensitivity_cb (GthBrowser *browser);
+void fm__gth_browser_selection_changed_cb (GthBrowser *browser);
void fm__gth_browser_realize_cb (GthBrowser *browser);
void fm__gth_browser_unrealize_cb (GthBrowser *browser);
diff --git a/extensions/file_manager/main.c b/extensions/file_manager/main.c
index 1a9dc06..259a9b5 100644
--- a/extensions/file_manager/main.c
+++ b/extensions/file_manager/main.c
@@ -37,6 +37,7 @@ gthumb_extension_activate (void)
gth_hook_add_callback ("gth-browser-update-sensitivity", 10, G_CALLBACK (fm__gth_browser_update_sensitivity_cb), NULL);
gth_hook_add_callback ("gth-browser-realize", 10, G_CALLBACK (fm__gth_browser_realize_cb), NULL);
gth_hook_add_callback ("gth-browser-unrealize", 10, G_CALLBACK (fm__gth_browser_unrealize_cb), NULL);
+ gth_hook_add_callback ("gth-browser-selection-changed", 10, G_CALLBACK (fm__gth_browser_selection_changed_cb), NULL);
}
diff --git a/extensions/search/gth-search-task.c b/extensions/search/gth-search-task.c
index addd18a..db4cda8 100644
--- a/extensions/search/gth-search-task.c
+++ b/extensions/search/gth-search-task.c
@@ -297,7 +297,7 @@ browser_location_ready_cb (GthBrowser *browser,
g_directory_foreach_child (gth_search_get_folder (task->priv->search),
gth_search_is_recursive (task->priv->search),
TRUE,
- eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+ eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
task->priv->cancellable,
start_dir_func,
for_each_file_func,
diff --git a/gthumb/gio-utils.c b/gthumb/gio-utils.c
index 834c31c..71cf240 100644
--- a/gthumb/gio-utils.c
+++ b/gthumb/gio-utils.c
@@ -1867,6 +1867,11 @@ _g_directory_create_unique (GFile *parent,
int n;
file = g_file_get_child_for_display_name (parent, display_name, &local_error);
+ if (file == NULL) {
+ g_propagate_error (error, local_error);
+ return NULL;
+ }
+
n = 0;
do {
char *new_display_name;
@@ -1891,6 +1896,14 @@ _g_directory_create_unique (GFile *parent,
}
while (! created && (local_error == NULL));
+ if (local_error != NULL) {
+ g_object_unref (file);
+ file = NULL;
+ }
+
+ if (local_error != NULL)
+ g_propagate_error (error, local_error);
+
return file;
}
diff --git a/gthumb/glib-utils.h b/gthumb/glib-utils.h
index d45dd35..5431696 100644
--- a/gthumb/glib-utils.h
+++ b/gthumb/glib-utils.h
@@ -30,6 +30,27 @@
G_BEGIN_DECLS
+#define GFILE_BASIC_ATTRIBUTES "standard::display-name,standard::icon,standard::type"
+
+#define DEFINE_STANDARD_ATTRIBUTES(a) ( \
+ "standard::type," \
+ "standard::is-hidden," \
+ "standard::is-backup," \
+ "standard::name," \
+ "standard::display-name," \
+ "standard::edit-name," \
+ "standard::icon," \
+ "standard::size," \
+ "time::created," \
+ "time::created-usec," \
+ "time::modified," \
+ "time::modified-usec," \
+ "access::*" \
+ a)
+#define GFILE_STANDARD_ATTRIBUTES (DEFINE_STANDARD_ATTRIBUTES(""))
+#define GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE (DEFINE_STANDARD_ATTRIBUTES(",standard::fast-content-type"))
+#define GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE (DEFINE_STANDARD_ATTRIBUTES(",standard::content-type"))
+
#define GNOME_COPIED_FILES (gdk_atom_intern_static_string ("x-special/gnome-copied-files"))
#define IROUND(x) ((int)floor(((double)x) + 0.5))
#define FLOAT_EQUAL(a,b) (fabs (a - b) < 1e-6)
diff --git a/gthumb/gth-browser-actions-callbacks.c b/gthumb/gth-browser-actions-callbacks.c
index 186a2ef..bdf52c3 100644
--- a/gthumb/gth-browser-actions-callbacks.c
+++ b/gthumb/gth-browser-actions-callbacks.c
@@ -291,17 +291,17 @@ void
gth_browser_activate_action_folder_open (GtkAction *action,
GthBrowser *browser)
{
- GtkWidget *folder_tree;
- GFile *file;
+ GtkWidget *folder_tree;
+ GthFileData *file_data;
folder_tree = gth_browser_get_folder_tree (browser);
- file = gth_folder_tree_get_selected (GTH_FOLDER_TREE (folder_tree));
- if (file == NULL)
+ file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (folder_tree));
+ if (file_data == NULL)
return;
- gth_browser_load_location (browser, file);
+ gth_browser_load_location (browser, file_data->file);
- g_object_unref (file);
+ g_object_unref (file_data);
}
@@ -309,20 +309,20 @@ void
gth_browser_activate_action_folder_open_in_new_window (GtkAction *action,
GthBrowser *browser)
{
- GtkWidget *folder_tree;
- GFile *file;
- GtkWidget *new_browser;
+ GtkWidget *folder_tree;
+ GthFileData *file_data;
+ GtkWidget *new_browser;
folder_tree = gth_browser_get_folder_tree (browser);
- file = gth_folder_tree_get_selected (GTH_FOLDER_TREE (folder_tree));
- if (file == NULL)
+ file_data = gth_folder_tree_get_selected (GTH_FOLDER_TREE (folder_tree));
+ if (file_data == NULL)
return;
new_browser = gth_browser_new (NULL);
gtk_window_present (GTK_WINDOW (new_browser));
- gth_browser_load_location (GTH_BROWSER (new_browser), file);
+ gth_browser_load_location (GTH_BROWSER (new_browser), file_data->file);
- g_object_unref (file);
+ g_object_unref (file_data);
}
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 225142b..06e261c 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -354,7 +354,7 @@ _gth_browser_add_file_menu_item (GthBrowser *browser,
GFileInfo *info;
file_source = gth_main_get_file_source (file);
- info = gth_file_source_get_file_info (file_source, file);
+ info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES);
if (info != NULL) {
_gth_browser_add_file_menu_item_full (browser,
menu,
@@ -1026,7 +1026,7 @@ load_data_load_next_folder (LoadData *data)
gth_file_source_list (data->file_source,
folder_to_load,
- eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+ eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
_gth_browser_load_ready_cb,
data);
}
@@ -1844,7 +1844,7 @@ folder_tree_load_cb (GthFolderTree *folder_tree,
static void
folder_tree_folder_popup_cb (GthFolderTree *folder_tree,
- GFile *file,
+ GthFileData *file_data,
guint time,
gpointer user_data)
{
@@ -1852,15 +1852,15 @@ folder_tree_folder_popup_cb (GthFolderTree *folder_tree,
gboolean sensitive;
GthFileSource *file_source;
- sensitive = (file != NULL);
+ sensitive = (file_data != NULL);
_gth_browser_set_action_sensitive (browser, "Folder_Open", sensitive);
_gth_browser_set_action_sensitive (browser, "Folder_OpenInNewWindow", sensitive);
- if (file != NULL)
- file_source = gth_main_get_file_source (file);
+ if (file_data != NULL)
+ file_source = gth_main_get_file_source (file_data->file);
else
file_source = NULL;
- gth_hook_invoke ("gth-browser-folder-tree-popup-before", browser, file_source, file);
+ gth_hook_invoke ("gth-browser-folder-tree-popup-before", browser, file_source, file_data);
gtk_ui_manager_ensure_update (browser->priv->ui);
gtk_menu_popup (GTK_MENU (browser->priv->folder_popup),
@@ -2070,7 +2070,7 @@ folder_changed_cb (GthMonitor *monitor,
monitor_data->update_folder_tree = update_folder_tree;
gth_file_source_read_attributes (monitor_data->file_source,
list,
- eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+ eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
file_attributes_ready_cb,
monitor_data);
break;
@@ -2121,32 +2121,75 @@ folder_changed_cb (GthMonitor *monitor,
}
+typedef struct {
+ GthBrowser *browser;
+ GthFileSource *file_source;
+ GFile *file;
+ GFile *new_file;
+} RenameData;
+
+
+static void
+rename_data_free (RenameData *rename_data)
+{
+ g_object_unref (rename_data->file_source);
+ g_object_unref (rename_data->file);
+ g_object_unref (rename_data->new_file);
+ g_free (rename_data);
+}
+
+
+static void
+renamed_file_attributes_ready_cb (GthFileSource *file_source,
+ GList *files,
+ GError *error,
+ gpointer user_data)
+{
+ RenameData *rename_data = user_data;
+ GthBrowser *browser = rename_data->browser;
+ GthFileData *file_data;
+
+ if (error != NULL) {
+ rename_data_free (rename_data);
+ g_clear_error (&error);
+ return;
+ }
+
+ file_data = files->data;
+
+ gth_folder_tree_update_child (GTH_FOLDER_TREE (browser->priv->folder_tree), rename_data->file, file_data);
+ gth_file_list_rename_file (GTH_FILE_LIST (browser->priv->file_list), rename_data->file, file_data);
+
+ if (g_file_equal (rename_data->file, browser->priv->location))
+ _gth_browser_set_location (browser, rename_data->new_file);
+
+ rename_data_free (rename_data);
+}
+
+
static void
file_renamed_cb (GthMonitor *monitor,
GFile *file,
GFile *new_file,
GthBrowser *browser)
{
- GthFileSource *file_source;
- GFileInfo *info;
- GthFileData *file_data;
- GList *list;
-
- file_source = gth_main_get_file_source (new_file);
- info = gth_file_source_get_file_info (file_source, new_file);
- file_data = gth_file_data_new (new_file, info);
- gth_folder_tree_update_child (GTH_FOLDER_TREE (browser->priv->folder_tree), file, file_data);
+ RenameData *rename_data;
+ GList *list;
- list = g_list_prepend (NULL, file_data);
- gth_file_list_update_files (GTH_FILE_LIST (browser->priv->file_list), list);
+ rename_data = g_new0 (RenameData, 1);
+ rename_data->browser = browser;
+ rename_data->file_source = gth_main_get_file_source (new_file);
+ rename_data->file = g_file_dup (file);
+ rename_data->new_file = g_file_dup (new_file);
- if (g_file_equal (file, browser->priv->location))
- _gth_browser_set_location (browser, new_file);
+ list = g_list_prepend (NULL, new_file);
+ gth_file_source_read_attributes (rename_data->file_source,
+ list,
+ eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
+ renamed_file_attributes_ready_cb,
+ rename_data);
g_list_free (list);
- g_object_unref (file_data);
- g_object_unref (info);
- g_object_unref (file_source);
}
@@ -2256,125 +2299,6 @@ gth_file_list_button_press_cb (GtkWidget *widget,
static void
-activate_open_with_application_item (GtkMenuItem *menuitem,
- gpointer data)
-{
- GthBrowser *browser = data;
- GList *items;
- GList *file_list;
- GList *uris;
- GList *scan;
- GAppInfo *appinfo;
- GError *error = NULL;
-
- items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
- file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
-
- uris = NULL;
- for (scan = file_list; scan; scan = scan->next) {
- GthFileData *file_data = scan->data;
- uris = g_list_prepend (uris, g_file_get_uri (file_data->file));
- }
-
- appinfo = g_object_get_data (G_OBJECT (menuitem), "appinfo");
- g_return_if_fail (G_IS_APP_INFO (appinfo));
-
- if (! g_app_info_launch_uris (appinfo, uris, NULL, &error))
- _gtk_error_dialog_from_gerror_show (GTK_WINDOW (browser),
- _("Could not perform the operation"),
- &error);
-
- g_list_free (uris);
- _g_object_list_unref (file_list);
- _gtk_tree_path_list_free (items);
-}
-
-
-static void
-_gth_browser_update_open_menu (GthBrowser *browser)
-{
- GtkWidget *openwith_item;
- GtkWidget *menu;
- GList *items;
- GList *file_list;
- GList *scan;
- GList *appinfo_list;
- GHashTable *used_apps;
-
- openwith_item = gtk_ui_manager_get_widget (browser->priv->ui, "/FileListPopup/OpenWith");
- menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (openwith_item));
- _gtk_container_remove_children (GTK_CONTAINER (menu), NULL, NULL);
-
- items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
- file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
-
- appinfo_list = NULL;
- for (scan = file_list; scan; scan = scan->next) {
- GthFileData *file_data = scan->data;
- const char *mime_type;
-
- mime_type = gth_file_data_get_mime_type (file_data);
- if ((mime_type == NULL) || g_content_type_is_unknown (mime_type))
- continue;
-
- appinfo_list = g_list_concat (appinfo_list, g_app_info_get_all_for_type (mime_type));
- }
-
- used_apps = g_hash_table_new (g_str_hash, g_str_equal);
- for (scan = appinfo_list; scan; scan = scan->next) {
- GAppInfo *appinfo = scan->data;
- char *label;
- GtkWidget *menu_item;
- GIcon *icon;
- GdkPixbuf *pixbuf;
-
- if (strcmp (g_app_info_get_executable (appinfo), "gthumb") == 0)
- continue;
- if (g_hash_table_lookup (used_apps, g_app_info_get_id (appinfo)) != NULL)
- continue;
- g_hash_table_insert (used_apps, (gpointer) g_app_info_get_id (appinfo), GINT_TO_POINTER (1));
-
- label = g_strdup_printf (_("Open with \"%s\""), g_app_info_get_name (appinfo));
- menu_item = gtk_image_menu_item_new_with_label (label);
-
- icon = g_app_info_get_icon (appinfo);
- pixbuf = gth_icon_cache_get_pixbuf (browser->priv->menu_icon_cache, icon);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), gtk_image_new_from_pixbuf (pixbuf));
-
- gtk_widget_show (menu_item);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
-
- g_object_set_data (G_OBJECT (menu_item), "appinfo", appinfo);
- g_signal_connect (menu_item,
- "activate",
- G_CALLBACK (activate_open_with_application_item),
- browser);
-
- g_object_unref (pixbuf);
- g_free (label);
- }
-
- /*
- if (appinfo_list == NULL) {
- GtkWidget *menu_item;
-
- menu_item = gtk_image_menu_item_new_with_label (_("No application available"));
- gtk_widget_set_sensitive (menu_item, FALSE);
- gtk_widget_show (menu_item);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
- }*/
-
- gtk_widget_set_sensitive (openwith_item, appinfo_list != NULL);
- gtk_widget_show (openwith_item);
-
- g_hash_table_destroy (used_apps);
- g_list_free (appinfo_list);
- _g_object_list_unref (file_list);
- _gtk_tree_path_list_free (items);
-}
-
-
-static void
gth_file_view_selection_changed_cb (GtkIconView *iconview,
gpointer user_data)
{
@@ -2383,7 +2307,8 @@ gth_file_view_selection_changed_cb (GtkIconView *iconview,
gth_browser_update_sensitivity (browser);
_gth_browser_update_statusbar_list_info (browser);
- _gth_browser_update_open_menu (browser);
+
+ gth_hook_invoke ("gth-browser-selection-changed", browser);
if (gth_window_get_current_page (GTH_WINDOW (browser)) != GTH_BROWSER_PAGE_BROWSER)
return;
@@ -3183,6 +3108,13 @@ gth_browser_get_ui_manager (GthBrowser *browser)
}
+GthIconCache *
+gth_browser_get_menu_icon_cache (GthBrowser *browser)
+{
+ return browser->priv->menu_icon_cache;
+}
+
+
GtkWidget *
gth_browser_get_statusbar (GthBrowser *browser)
{
@@ -3909,7 +3841,7 @@ gth_browser_load_location (GthBrowser *browser,
list = g_list_prepend (NULL, g_object_ref (data->location));
gth_file_source_read_attributes (data->file_source,
list,
- eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+ eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
load_file_attributes_ready_cb,
data);
diff --git a/gthumb/gth-browser.h b/gthumb/gth-browser.h
index 5f817be..1a015b1 100644
--- a/gthumb/gth-browser.h
+++ b/gthumb/gth-browser.h
@@ -25,6 +25,7 @@
#include "gth-file-source.h"
#include "gth-file-store.h"
+#include "gth-icon-cache.h"
#include "gth-task.h"
#include "gth-window.h"
#include "typedefs.h"
@@ -87,6 +88,7 @@ void gth_browser_set_dialog (GthBrowser *browser,
GtkWidget * gth_browser_get_dialog (GthBrowser *browser,
const char *dialog_name);
GtkUIManager * gth_browser_get_ui_manager (GthBrowser *browser);
+GthIconCache * gth_browser_get_menu_icon_cache (GthBrowser *browser);
GtkWidget * gth_browser_get_statusbar (GthBrowser *browser);
GtkWidget * gth_browser_get_file_list (GthBrowser *browser);
GtkWidget * gth_browser_get_file_list_view (GthBrowser *browser);
diff --git a/gthumb/gth-file-data.c b/gthumb/gth-file-data.c
index 697cebf..e09b24f 100644
--- a/gthumb/gth-file-data.c
+++ b/gthumb/gth-file-data.c
@@ -264,7 +264,7 @@ gth_file_data_update_info (GthFileData *fd,
const char *attributes)
{
if (attributes == NULL)
- attributes = GTH_FILE_DATA_ATTRIBUTES;
+ attributes = GFILE_STANDARD_ATTRIBUTES;
if (fd->info != NULL)
g_object_unref (fd->info);
diff --git a/gthumb/gth-file-data.h b/gthumb/gth-file-data.h
index 8f1da8b..51499c1 100644
--- a/gthumb/gth-file-data.h
+++ b/gthumb/gth-file-data.h
@@ -29,23 +29,6 @@
G_BEGIN_DECLS
-#define GTH_FILE_DATA_ATTR(a) ("standard::type," \
- "standard::is-hidden," \
- "standard::is-backup," \
- "standard::name," \
- "standard::display-name," \
- "standard::edit-name," \
- "standard::icon," \
- "standard::size," \
- "time::created," \
- "time::created-usec," \
- "time::modified," \
- "time::modified-usec," \
- a)
-#define GTH_FILE_DATA_ATTRIBUTES (GTH_FILE_DATA_ATTR(""))
-#define GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE (GTH_FILE_DATA_ATTR("standard::fast-content-type"))
-#define GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE (GTH_FILE_DATA_ATTR("standard::content-type"))
-
#define GTH_TYPE_FILE_DATA (gth_file_data_get_type ())
#define GTH_FILE_DATA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTH_TYPE_FILE_DATA, GthFileData))
#define GTH_FILE_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTH_TYPE_FILE_DATA, GthFileDataClass))
diff --git a/gthumb/gth-file-list.c b/gthumb/gth-file-list.c
index e053604..f7d0e09 100644
--- a/gthumb/gth-file-list.c
+++ b/gthumb/gth-file-list.c
@@ -49,9 +49,9 @@ typedef enum {
GTH_FILE_LIST_OP_TYPE_DELETE_FILES,
GTH_FILE_LIST_OP_TYPE_SET_FILTER,
GTH_FILE_LIST_OP_TYPE_SET_SORT_FUNC,
- GTH_FILE_LIST_OP_TYPE_ENABLE_THUMBS
- /*GTH_FILE_LIST_OP_TYPE_RENAME,
- GTH_FILE_LIST_OP_TYPE_SET_THUMBS_SIZE,*/
+ GTH_FILE_LIST_OP_TYPE_ENABLE_THUMBS,
+ GTH_FILE_LIST_OP_TYPE_RENAME_FILE
+ /*GTH_FILE_LIST_OP_TYPE_SET_THUMBS_SIZE,*/
} GthFileListOpType;
@@ -66,6 +66,8 @@ typedef struct {
gboolean inverse_sort;
char *sval;
int ival;
+ GFile *file;
+ GthFileData *file_data;
} GthFileListOp;
@@ -148,6 +150,10 @@ gth_file_list_op_free (GthFileListOp *op)
case GTH_FILE_LIST_OP_TYPE_SET_FILTER:
g_object_unref (op->filter);
break;
+ case GTH_FILE_LIST_OP_TYPE_RENAME_FILE:
+ g_object_unref (op->file);
+ g_object_unref (op->file_data);
+ break;
default:
break;
}
@@ -800,6 +806,44 @@ gth_file_list_update_files (GthFileList *file_list,
static void
+gfl_rename_file (GthFileList *file_list,
+ GFile *file,
+ GthFileData *file_data)
+{
+ GthFileStore *file_store;
+ int abs_pos;
+
+ file_store = (GthFileStore*) gth_file_view_get_model (GTH_FILE_VIEW (file_list->priv->view));
+ abs_pos = gth_file_store_find (file_store, file);
+ if (abs_pos < 0)
+ return;
+
+ gth_file_store_queue_set (file_store,
+ abs_pos,
+ file_data,
+ NULL,
+ -1,
+ NULL);
+ gth_file_store_exec_set (file_store);
+ _gth_file_list_update_pane (file_list);
+}
+
+
+void
+gth_file_list_rename_file (GthFileList *file_list,
+ GFile *file,
+ GthFileData *file_data)
+{
+ GthFileListOp *op;
+
+ op = gth_file_list_op_new (GTH_FILE_LIST_OP_TYPE_RENAME_FILE);
+ op->file = g_object_ref (file);
+ op->file_data = g_object_ref (file_data);
+ _gth_file_list_queue_op (file_list, op);
+}
+
+
+static void
gfl_set_files (GthFileList *file_list,
GthFileSource *file_source,
GList *files)
@@ -1258,6 +1302,9 @@ _gth_file_list_exec_next_op (GthFileList *file_list)
case GTH_FILE_LIST_OP_TYPE_SET_SORT_FUNC:
gfl_set_sort_func (file_list, op->cmp_func, op->inverse_sort);
break;
+ case GTH_FILE_LIST_OP_TYPE_RENAME_FILE:
+ gfl_rename_file (file_list, op->file, op->file_data);
+ break;
default:
exec_next_op = FALSE;
break;
diff --git a/gthumb/gth-file-list.h b/gthumb/gth-file-list.h
index cca125f..2f10193 100644
--- a/gthumb/gth-file-list.h
+++ b/gthumb/gth-file-list.h
@@ -69,6 +69,9 @@ void gth_file_list_delete_files (GthFileList *file_list,
GList *list /* GFile */);
void gth_file_list_update_files (GthFileList *file_list,
GList *list /* GthFileData */);
+void gth_file_list_rename_file (GthFileList *file_list,
+ GFile *file,
+ GthFileData *file_data);
void gth_file_list_set_filter (GthFileList *file_list,
GthTest *filter);
void gth_file_list_set_sort_func (GthFileList *file_list,
diff --git a/gthumb/gth-file-source-vfs.c b/gthumb/gth-file-source-vfs.c
index 97f2ade..4f71cf3 100644
--- a/gthumb/gth-file-source-vfs.c
+++ b/gthumb/gth-file-source-vfs.c
@@ -65,14 +65,14 @@ get_entry_points (GthFileSource *file_source)
list = NULL;
file = g_file_new_for_uri (get_home_uri ());
- info = gth_file_source_get_file_info (file_source, file);
+ info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
g_file_info_set_display_name (info, _("Home Folder"));
list = g_list_append (list, gth_file_data_new (file, info));
g_object_unref (info);
g_object_unref (file);
file = g_file_new_for_uri ("file:///");
- info = gth_file_source_get_file_info (file_source, file);
+ info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
g_file_info_set_display_name (info, _("File System"));
list = g_list_append (list, gth_file_data_new (file, info));
g_object_unref (info);
@@ -87,7 +87,7 @@ get_entry_points (GthFileSource *file_source)
continue;
file = g_mount_get_root (mount);
- info = gth_file_source_get_file_info (file_source, file);
+ info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES ",access::*");
volume = g_mount_get_volume (mount);
if (volume != NULL) {
@@ -134,14 +134,15 @@ to_gio_file (GthFileSource *file_source,
static GFileInfo *
get_file_info (GthFileSource *file_source,
- GFile *file)
+ GFile *file,
+ const char *attributes)
{
GFile *gio_file;
GFileInfo *file_info;
gio_file = gth_file_source_to_gio_file (file_source, file);
file_info = g_file_query_info (gio_file,
- "standard::display-name,standard::icon,standard::type",
+ attributes,
G_FILE_QUERY_INFO_NONE,
NULL,
NULL);
diff --git a/gthumb/gth-file-source.c b/gthumb/gth-file-source.c
index 12d946a..7ebd28a 100644
--- a/gthumb/gth-file-source.c
+++ b/gthumb/gth-file-source.c
@@ -307,7 +307,8 @@ base_to_gio_file (GthFileSource *file_source,
static GFileInfo *
base_get_file_info (GthFileSource *file_source,
- GFile *file)
+ GFile *file,
+ const char *attributes)
{
return NULL;
}
@@ -544,9 +545,10 @@ gth_file_source_to_gio_file_list (GthFileSource *file_source,
GFileInfo *
gth_file_source_get_file_info (GthFileSource *file_source,
- GFile *file)
+ GFile *file,
+ const char *attributes)
{
- return GTH_FILE_SOURCE_GET_CLASS (G_OBJECT (file_source))->get_file_info (file_source, file);
+ return GTH_FILE_SOURCE_GET_CLASS (G_OBJECT (file_source))->get_file_info (file_source, file, attributes);
}
diff --git a/gthumb/gth-file-source.h b/gthumb/gth-file-source.h
index a026912..40cf2cc 100644
--- a/gthumb/gth-file-source.h
+++ b/gthumb/gth-file-source.h
@@ -71,7 +71,8 @@ struct _GthFileSourceClass
GFile * (*to_gio_file) (GthFileSource *file_source,
GFile *file);
GFileInfo * (*get_file_info) (GthFileSource *file_source,
- GFile *file);
+ GFile *file,
+ const char *attributes);
void (*list) (GthFileSource *file_source,
GFile *folder,
const char *attributes,
@@ -121,7 +122,8 @@ GFile * gth_file_source_to_gio_file (GthFileSource *file_source,
GList * gth_file_source_to_gio_file_list (GthFileSource *file_source,
GList *files);
GFileInfo * gth_file_source_get_file_info (GthFileSource *file_source,
- GFile *file);
+ GFile *file,
+ const char *attributes);
gboolean gth_file_source_is_active (GthFileSource *file_source);
void gth_file_source_cancel (GthFileSource *file_source);
void gth_file_source_list (GthFileSource *file_source,
diff --git a/gthumb/gth-file-store.c b/gthumb/gth-file-store.c
index 00ee185..ea2bc43 100644
--- a/gthumb/gth-file-store.c
+++ b/gthumb/gth-file-store.c
@@ -1149,6 +1149,17 @@ gth_file_store_get_file_at_pos (GthFileStore *file_store,
}
+GthFileData *
+gth_file_store_get_file_at_abs_pos (GthFileStore *file_store,
+ int abs_pos)
+{
+ if ((abs_pos < 0) || (abs_pos >= file_store->priv->tot_rows))
+ return NULL;
+ else
+ return g_object_ref (file_store->priv->all_rows[abs_pos]->file);
+}
+
+
int
gth_file_store_find (GthFileStore *file_store,
GFile *file)
diff --git a/gthumb/gth-file-store.h b/gthumb/gth-file-store.h
index 90c8c29..d3169c7 100644
--- a/gthumb/gth-file-store.h
+++ b/gthumb/gth-file-store.h
@@ -77,10 +77,12 @@ GthFileData * gth_file_store_get_file (GthFileStore *file_store
GtkTreeIter *iter);
GthFileData * gth_file_store_get_file_at_pos (GthFileStore *file_store,
int pos);
+GthFileData * gth_file_store_get_file_at_abs_pos (GthFileStore *file_store,
+ int abs_pos);
int gth_file_store_find (GthFileStore *file_store,
GFile *file);
int gth_file_store_find_visible (GthFileStore *file_store,
- GFile *file);
+ GFile *file);
void gth_file_store_add (GthFileStore *file_store,
GthFileData *file,
GdkPixbuf *thumbnail,
diff --git a/gthumb/gth-folder-tree.c b/gthumb/gth-folder-tree.c
index 93393c5..f9111dd 100644
--- a/gthumb/gth-folder-tree.c
+++ b/gthumb/gth-folder-tree.c
@@ -52,7 +52,7 @@ enum {
COLUMN_WEIGHT,
COLUMN_ICON,
COLUMN_TYPE,
- COLUMN_FILE,
+ COLUMN_FILE_DATA,
COLUMN_SORT_KEY,
COLUMN_SORT_ORDER,
COLUMN_NAME,
@@ -190,7 +190,7 @@ text_renderer_edited_cb (GtkCellRendererText *renderer,
GtkTreePath *tree_path;
GtkTreeIter iter;
EntryType entry_type;
- GFile *file;
+ GthFileData *file_data;
char *name;
tree_path = gtk_tree_path_new_from_string (path);
@@ -206,15 +206,14 @@ text_renderer_edited_cb (GtkCellRendererText *renderer,
gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
&iter,
COLUMN_TYPE, &entry_type,
- COLUMN_FILE, &file,
+ COLUMN_FILE_DATA, &file_data,
COLUMN_NAME, &name,
-1);
if ((entry_type == ENTRY_TYPE_FILE) && (g_utf8_collate (name, new_text) != 0))
- g_signal_emit (folder_tree, gth_folder_tree_signals[RENAME], 0, file, new_text);
+ g_signal_emit (folder_tree, gth_folder_tree_signals[RENAME], 0, file_data->file, new_text);
- if (file != NULL)
- g_object_unref (file);
+ _g_object_unref (file_data);
g_free (name);
}
@@ -259,13 +258,13 @@ add_columns (GthFolderTree *folder_tree,
static void
open_uri (GthFolderTree *folder_tree,
- GFile *file,
+ GthFileData *file_data,
EntryType entry_type)
{
if (entry_type == ENTRY_TYPE_PARENT)
g_signal_emit (folder_tree, gth_folder_tree_signals[OPEN_PARENT], 0);
else if (entry_type == ENTRY_TYPE_FILE)
- g_signal_emit (folder_tree, gth_folder_tree_signals[OPEN], 0, file);
+ g_signal_emit (folder_tree, gth_folder_tree_signals[OPEN], 0, file_data->file);
}
@@ -278,7 +277,7 @@ row_activated_cb (GtkTreeView *tree_view,
GthFolderTree *folder_tree = user_data;
GtkTreeIter iter;
EntryType entry_type;
- GFile *file;
+ GthFileData *file_data;
if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (folder_tree->priv->tree_store),
&iter,
@@ -290,12 +289,11 @@ row_activated_cb (GtkTreeView *tree_view,
gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
&iter,
COLUMN_TYPE, &entry_type,
- COLUMN_FILE, &file,
+ COLUMN_FILE_DATA, &file_data,
-1);
- open_uri (folder_tree, file, entry_type);
+ open_uri (folder_tree, file_data, entry_type);
- if (file != NULL)
- g_object_unref (file);
+ _g_object_unref (file_data);
return TRUE;
}
@@ -309,7 +307,7 @@ row_expanded_cb (GtkTreeView *tree_view,
{
GthFolderTree *folder_tree = user_data;
EntryType entry_type;
- GFile *file;
+ GthFileData *file_data;
gboolean loaded;
if ((folder_tree->priv->click_path == NULL)
@@ -321,18 +319,17 @@ row_expanded_cb (GtkTreeView *tree_view,
gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
expanded_iter,
COLUMN_TYPE, &entry_type,
- COLUMN_FILE, &file,
+ COLUMN_FILE_DATA, &file_data,
COLUMN_LOADED, &loaded,
-1);
if ((entry_type == ENTRY_TYPE_FILE) && ! loaded)
- g_signal_emit (folder_tree, gth_folder_tree_signals[LIST_CHILDREN], 0, file);
+ g_signal_emit (folder_tree, gth_folder_tree_signals[LIST_CHILDREN], 0, file_data->file);
gtk_tree_path_free (folder_tree->priv->click_path);
folder_tree->priv->click_path = NULL;
- if (file != NULL)
- g_object_unref (file);
+ _g_object_unref (file_data);
return FALSE;
}
@@ -402,13 +399,13 @@ button_press_cb (GtkWidget *widget,
}
if (event->button == 3) {
- EntryType entry_type;
- GFile *file;
+ EntryType entry_type;
+ GthFileData *file_data;
gtk_tree_model_get (GTK_TREE_MODEL (tree_store),
&iter,
COLUMN_TYPE, &entry_type,
- COLUMN_FILE, &file,
+ COLUMN_FILE_DATA, &file_data,
-1);
if (entry_type == ENTRY_TYPE_FILE) {
@@ -427,13 +424,12 @@ button_press_cb (GtkWidget *widget,
g_signal_emit (folder_tree,
gth_folder_tree_signals[FOLDER_POPUP],
0,
- file,
+ file_data,
event->time);
retval = TRUE;
}
- if (file != NULL)
- g_object_unref (file);
+ _g_object_unref (file_data);
}
else if ((event->button == 1) && (event->type == GDK_BUTTON_PRESS)) {
GtkTreeSelection *selection;
@@ -487,10 +483,10 @@ button_press_cb (GtkWidget *widget,
static void
load_uri (GthFolderTree *folder_tree,
EntryType entry_type,
- GFile *file)
+ GthFileData *file_data)
{
if (entry_type == ENTRY_TYPE_FILE)
- g_signal_emit (folder_tree, gth_folder_tree_signals[LOAD], 0, file);
+ g_signal_emit (folder_tree, gth_folder_tree_signals[LOAD], 0, file_data->file);
}
@@ -530,19 +526,18 @@ return FALSE;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_tree));
if (gtk_tree_selection_iter_is_selected (selection, &iter)) {
- EntryType entry_type;
- GFile *file;
+ EntryType entry_type;
+ GthFileData *file_data;
gtk_tree_model_get (GTK_TREE_MODEL (tree_store),
&iter,
COLUMN_TYPE, &entry_type,
- COLUMN_FILE, &file,
+ COLUMN_FILE_DATA, &file_data,
-1);
- load_uri (folder_tree, entry_type, file);
+ load_uri (folder_tree, entry_type, file_data);
- if (file != NULL)
- g_object_unref (file);
+ _g_object_unref (file_data);
}
gtk_tree_path_free (path);
@@ -559,7 +554,7 @@ selection_changed_cb (GtkTreeSelection *selection,
GtkTreeIter iter;
GtkTreePath *selected_path;
EntryType entry_type;
- GFile *file;
+ GthFileData *file_data;
if (! gtk_tree_selection_get_selected (selection, NULL, &iter))
return FALSE;
@@ -584,13 +579,12 @@ selection_changed_cb (GtkTreeSelection *selection,
gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
&iter,
COLUMN_TYPE, &entry_type,
- COLUMN_FILE, &file,
+ COLUMN_FILE_DATA, &file_data,
-1);
- load_uri (folder_tree, entry_type, file);
+ load_uri (folder_tree, entry_type, file_data);
- if (file != NULL)
- g_object_unref (file);
+ _g_object_unref (file_data);
gtk_tree_path_free (selected_path);
return FALSE;
@@ -655,15 +649,17 @@ gth_folder_tree_get_iter (GthFolderTree *folder_tree,
return FALSE;
if (root != NULL) {
- GFile *root_file;
- gboolean found;
+ GthFileData *root_file_data;
+ EntryType root_type;
+ gboolean found;
- gtk_tree_model_get (tree_model, root, COLUMN_FILE, &root_file, -1);
-
- found = (root_file != NULL) && g_file_equal (file, root_file);
+ gtk_tree_model_get (tree_model, root,
+ COLUMN_FILE_DATA, &root_file_data,
+ COLUMN_TYPE, &root_type,
+ -1);
+ found = (root_type == ENTRY_TYPE_FILE) && (root_file_data != NULL) && g_file_equal (file, root_file_data->file);
- if (root_file != NULL)
- g_object_unref (root_file);
+ _g_object_unref (root_file_data);
if (found) {
*file_iter = *root;
@@ -779,7 +775,7 @@ _gth_folder_tree_set_file_data (GthFolderTree *folder_tree,
COLUMN_STYLE, PANGO_STYLE_NORMAL,
COLUMN_ICON, pixbuf,
COLUMN_TYPE, ENTRY_TYPE_FILE,
- COLUMN_FILE, file_data->file,
+ COLUMN_FILE_DATA, file_data,
COLUMN_NAME, name,
COLUMN_SORT_KEY, sort_key,
COLUMN_SORT_ORDER, g_file_info_get_sort_order (file_data->info),
@@ -1029,11 +1025,15 @@ _gth_folder_tree_get_children (GthFolderTree *folder_tree,
list = NULL;
do {
- GFile *file;
+ GthFileData *file_data;
+ EntryType file_type;
- gtk_tree_model_get (tree_model, &iter, COLUMN_FILE, &file, -1);
- if (file != NULL)
- list = g_list_prepend (list, file);
+ gtk_tree_model_get (tree_model, &iter,
+ COLUMN_FILE_DATA, &file_data,
+ COLUMN_TYPE, &file_type,
+ -1);
+ if ((file_type == ENTRY_TYPE_FILE) && (file_data != NULL))
+ list = g_list_prepend (list, file_data);
}
while (gtk_tree_model_iter_next (tree_model, &iter));
@@ -1097,10 +1097,10 @@ gth_folder_tree_set_children (GthFolderTree *folder_tree,
old_files = _gth_folder_tree_get_children (folder_tree, p_parent_iter);
for (scan = old_files; scan; scan = scan->next) {
- GFile *file = scan->data;
+ GthFileData *file_data = scan->data;
- if (! gth_file_data_list_find_file (files, file)
- && gth_folder_tree_get_iter (folder_tree, file, &iter, p_parent_iter))
+ if (! gth_file_data_list_find_file (files, file_data->file)
+ && gth_folder_tree_get_iter (folder_tree, file_data->file, &iter, p_parent_iter))
{
gtk_tree_store_remove (folder_tree->priv->tree_store, &iter);
}
@@ -1182,16 +1182,17 @@ _gth_folder_tree_file_is_in_children (GthFolderTree *folder_tree,
return FALSE;
do {
- GFile *test_file;
+ GthFileData *test_file_data;
+ EntryType file_entry_type;
gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store), &iter,
- COLUMN_FILE, &test_file,
+ COLUMN_FILE_DATA, &test_file_data,
+ COLUMN_TYPE, &file_entry_type,
-1);
- if ((test_file != NULL) && g_file_equal (file, test_file))
+ if ((file_entry_type == ENTRY_TYPE_FILE) && (test_file_data != NULL) && g_file_equal (file, test_file_data->file))
found = TRUE;
- if (test_file != NULL)
- g_object_unref (test_file);
+ _g_object_unref (test_file_data);
}
while (! found && gtk_tree_model_iter_next (GTK_TREE_MODEL (folder_tree->priv->tree_store), &iter));
@@ -1244,13 +1245,20 @@ _gth_folder_tree_get_child (GthFolderTree *folder_tree,
return FALSE;
do {
- GFile *test_file;
+ GthFileData *test_file_data;
+ EntryType file_entry_type;
- gtk_tree_model_get (tree_model, &iter, COLUMN_FILE, &test_file, -1);
- if ((test_file != NULL) && g_file_equal (file, test_file)) {
+ gtk_tree_model_get (tree_model, &iter,
+ COLUMN_FILE_DATA, &test_file_data,
+ COLUMN_TYPE, &file_entry_type,
+ -1);
+ if ((file_entry_type == ENTRY_TYPE_FILE) && (test_file_data != NULL) && g_file_equal (file, test_file_data->file)) {
+ _g_object_unref (test_file_data);
*file_iter = iter;
return TRUE;
}
+
+ _g_object_unref (test_file_data);
}
while (gtk_tree_model_iter_next (tree_model, &iter));
@@ -1350,6 +1358,7 @@ gth_folder_tree_start_editing (GthFolderTree *folder_tree,
tree_column = gtk_tree_view_get_column (GTK_TREE_VIEW (folder_tree), 0);
gtk_tree_view_expand_to_path (GTK_TREE_VIEW (folder_tree), tree_path);
+ gtk_tree_view_collapse_row (GTK_TREE_VIEW (folder_tree), tree_path);
gtk_tree_view_set_cursor (GTK_TREE_VIEW (folder_tree),
tree_path,
tree_column,
@@ -1450,14 +1459,14 @@ gth_folder_tree_get_root (GthFolderTree *folder_tree)
}
-GFile *
+GthFileData *
gth_folder_tree_get_selected (GthFolderTree *folder_tree)
{
GtkTreeSelection *selection;
GtkTreeModel *tree_model;
GtkTreeIter iter;
EntryType entry_type;
- GFile *file;
+ GthFileData *file_data;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_tree));
if (selection == NULL)
@@ -1470,20 +1479,19 @@ gth_folder_tree_get_selected (GthFolderTree *folder_tree)
gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
&iter,
COLUMN_TYPE, &entry_type,
- COLUMN_FILE, &file,
+ COLUMN_FILE_DATA, &file_data,
-1);
if (entry_type != ENTRY_TYPE_FILE) {
- if (file != NULL)
- g_object_unref (file);
- file = NULL;
+ _g_object_unref (file_data);
+ file_data = NULL;
}
- return file;
+ return file_data;
}
-GFile *
+GthFileData *
gth_folder_tree_get_selected_or_parent (GthFolderTree *folder_tree)
{
GtkTreeSelection *selection;
@@ -1491,11 +1499,11 @@ gth_folder_tree_get_selected_or_parent (GthFolderTree *folder_tree)
GtkTreeIter iter;
GtkTreeIter parent;
EntryType entry_type;
- GFile *file;
+ GthFileData *file_data;
- file = gth_folder_tree_get_selected (folder_tree);
- if (file != NULL)
- return file;
+ file_data = gth_folder_tree_get_selected (folder_tree);
+ if (file_data != NULL)
+ return file_data;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_tree));
if (selection == NULL)
@@ -1511,14 +1519,13 @@ gth_folder_tree_get_selected_or_parent (GthFolderTree *folder_tree)
gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store),
&parent,
COLUMN_TYPE, &entry_type,
- COLUMN_FILE, &file,
+ COLUMN_FILE_DATA, &file_data,
-1);
if (entry_type != ENTRY_TYPE_FILE) {
- if (file != NULL)
- g_object_unref (file);
- file = NULL;
+ _g_object_unref (file_data);
+ file_data = NULL;
}
- return file;
+ return file_data;
}
diff --git a/gthumb/gth-folder-tree.h b/gthumb/gth-folder-tree.h
index 16bfc53..346dc05 100644
--- a/gthumb/gth-folder-tree.h
+++ b/gthumb/gth-folder-tree.h
@@ -101,8 +101,8 @@ void gth_folder_tree_expand_row (GthFolderTree *folder_tree,
void gth_folder_tree_select_path (GthFolderTree *folder_tree,
GtkTreePath *path);
GFile * gth_folder_tree_get_root (GthFolderTree *folder_tree);
-GFile * gth_folder_tree_get_selected (GthFolderTree *folder_tree);
-GFile * gth_folder_tree_get_selected_or_parent
+GthFileData * gth_folder_tree_get_selected (GthFolderTree *folder_tree);
+GthFileData * gth_folder_tree_get_selected_or_parent
(GthFolderTree *folder_tree);
G_END_DECLS
diff --git a/gthumb/gth-location-chooser.c b/gthumb/gth-location-chooser.c
index ec05012..db7f7e1 100644
--- a/gthumb/gth-location-chooser.c
+++ b/gthumb/gth-location-chooser.c
@@ -711,7 +711,7 @@ gth_location_chooser_set_current (GthLocationChooser *chooser,
GFile *file = scan->data;
GFileInfo *info;
- info = gth_file_source_get_file_info (chooser->priv->file_source, file);
+ info = gth_file_source_get_file_info (chooser->priv->file_source, file, GFILE_BASIC_ATTRIBUTES);
if (info == NULL)
continue;
add_file_source_entries (chooser,
diff --git a/gthumb/gth-main-default-hooks.c b/gthumb/gth-main-default-hooks.c
index 61f0dbb..b5d45aa 100644
--- a/gthumb/gth-main-default-hooks.c
+++ b/gthumb/gth-main-default-hooks.c
@@ -120,6 +120,13 @@ gth_main_register_default_hooks (void)
gth_hook_register ("gth-browser-view-file", 2);
/**
+ * Called when the selection changes
+ *
+ * @browser (GthBrowser*): the relative window.
+ **/
+ gth_hook_register ("gth-browser-selection-changed", 1);
+
+ /**
* Called in _gdk_pixbuf_save_async
*
* @data (SavePixbufData*):
diff --git a/gthumb/gth-source-tree.c b/gthumb/gth-source-tree.c
index 7e08259..c45ea82 100644
--- a/gthumb/gth-source-tree.c
+++ b/gthumb/gth-source-tree.c
@@ -127,7 +127,7 @@ load_data_run (LoadData *load_data,
{
gth_file_source_list (load_data->file_source,
load_data->folder,
- eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+ eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
func,
load_data);
}
@@ -258,7 +258,7 @@ monitor_folder_changed_cb (GthMonitor *monitor,
monitor_data->source_tree = source_tree;
gth_file_source_read_attributes (source_tree->priv->file_source,
list,
- eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GTH_FILE_DATA_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GTH_FILE_DATA_ATTRIBUTES_WITH_CONTENT_TYPE,
+ eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
file_attributes_ready_cb,
monitor_data);
break;
@@ -282,7 +282,7 @@ monitor_file_renamed_cb (GthMonitor *monitor,
GFileInfo *info;
GthFileData *file_data;
- info = gth_file_source_get_file_info (source_tree->priv->file_source, new_file);
+ info = gth_file_source_get_file_info (source_tree->priv->file_source, new_file, GFILE_BASIC_ATTRIBUTES);
file_data = gth_file_data_new (new_file, info);
gth_folder_tree_update_child (GTH_FOLDER_TREE (source_tree), file, file_data);
diff --git a/gthumb/gth-uri-list.c b/gthumb/gth-uri-list.c
index ad3e991..494ae38 100644
--- a/gthumb/gth-uri-list.c
+++ b/gthumb/gth-uri-list.c
@@ -23,7 +23,7 @@
#include <config.h>
#include <gtk/gtk.h>
#include "glib-utils.h"
-#include "gth-file-source.h"
+#include "gth-file-source.h"
#include "gth-icon-cache.h"
#include "gth-main.h"
#include "gth-uri-list.h"
@@ -89,15 +89,15 @@ static gboolean
order_changed (gpointer user_data)
{
GthUriList *uri_list = user_data;
-
+
if (uri_list->priv->changed_id != 0)
g_source_remove (uri_list->priv->changed_id);
uri_list->priv->changed_id = 0;
-
+
g_signal_emit (G_OBJECT (uri_list),
uri_list_signals[ORDER_CHANGED],
0);
-
+
return FALSE;
}
@@ -108,7 +108,7 @@ row_deleted_cb (GtkTreeModel *tree_model,
gpointer user_data)
{
GthUriList *uri_list = user_data;
-
+
if (uri_list->priv->changed_id != 0)
g_source_remove (uri_list->priv->changed_id);
uri_list->priv->changed_id = g_timeout_add (ORDER_CHANGED_DELAY, order_changed, uri_list);
@@ -122,10 +122,10 @@ row_inserted_cb (GtkTreeModel *tree_model,
gpointer user_data)
{
GthUriList *uri_list = user_data;
-
+
if (uri_list->priv->changed_id != 0)
g_source_remove (uri_list->priv->changed_id);
- uri_list->priv->changed_id = g_timeout_add (ORDER_CHANGED_DELAY, order_changed, uri_list);
+ uri_list->priv->changed_id = g_timeout_add (ORDER_CHANGED_DELAY, order_changed, uri_list);
}
@@ -133,7 +133,7 @@ static void
gth_uri_list_init (GthUriList *uri_list)
{
uri_list->priv = g_new0 (GthUriListPrivate, 1);
-
+
uri_list->priv->list_store = gtk_list_store_new (URI_LIST_NUM_COLUMNS,
GDK_TYPE_PIXBUF,
G_TYPE_STRING,
@@ -141,22 +141,22 @@ gth_uri_list_init (GthUriList *uri_list)
g_signal_connect (uri_list->priv->list_store,
"row-deleted",
G_CALLBACK (row_deleted_cb),
- uri_list);
+ uri_list);
g_signal_connect (uri_list->priv->list_store,
"row-inserted",
G_CALLBACK (row_inserted_cb),
uri_list);
-
+
gtk_tree_view_set_model (GTK_TREE_VIEW (uri_list), GTK_TREE_MODEL (uri_list->priv->list_store));
g_object_unref (uri_list->priv->list_store);
-
+
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (uri_list), FALSE);
add_columns (GTK_TREE_VIEW (uri_list));
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (uri_list), FALSE);
gtk_tree_view_set_enable_search (GTK_TREE_VIEW (uri_list), TRUE);
gtk_tree_view_set_search_column (GTK_TREE_VIEW (uri_list), URI_LIST_COLUMN_NAME);
gtk_tree_view_set_reorderable (GTK_TREE_VIEW (uri_list), TRUE);
-
+
uri_list->priv->icon_cache = gth_icon_cache_new_for_widget (GTK_WIDGET (uri_list), GTK_ICON_SIZE_MENU);
uri_list->priv->changed_id = 0;
}
@@ -166,21 +166,21 @@ static void
gth_uri_list_finalize (GObject *object)
{
GthUriList *uri_list = GTH_URI_LIST (object);
-
+
if (uri_list->priv != NULL) {
g_free (uri_list->priv);
uri_list->priv = NULL;
}
-
+
G_OBJECT_CLASS (parent_class)->finalize (object);
}
-static void
-gth_uri_list_class_init (GthUriListClass *klass)
+static void
+gth_uri_list_class_init (GthUriListClass *klass)
{
GObjectClass *gobject_class;
-
+
parent_class = g_type_class_peek_parent (klass);
gobject_class = G_OBJECT_CLASS (klass);
@@ -198,36 +198,36 @@ gth_uri_list_class_init (GthUriListClass *klass)
}
-GType
-gth_uri_list_get_type (void)
+GType
+gth_uri_list_get_type (void)
{
static GType type = 0;
-
+
if (type == 0) {
- static const GTypeInfo g_define_type_info = {
- sizeof (GthUriListClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) gth_uri_list_class_init,
- (GClassFinalizeFunc) NULL,
- NULL,
- sizeof (GthUriList),
- 0,
- (GInstanceInitFunc) gth_uri_list_init,
- NULL
+ static const GTypeInfo g_define_type_info = {
+ sizeof (GthUriListClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gth_uri_list_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL,
+ sizeof (GthUriList),
+ 0,
+ (GInstanceInitFunc) gth_uri_list_init,
+ NULL
};
- type = g_type_register_static (GTK_TYPE_TREE_VIEW,
- "GthUriList",
- &g_define_type_info,
+ type = g_type_register_static (GTK_TYPE_TREE_VIEW,
+ "GthUriList",
+ &g_define_type_info,
0);
}
-
+
return type;
}
GtkWidget *
-gth_uri_list_new (void)
+gth_uri_list_new (void)
{
return g_object_new (GTH_TYPE_URI_LIST, NULL);
}
@@ -243,7 +243,7 @@ gth_uri_list_set_uris (GthUriList *uri_list,
g_signal_handlers_block_by_func (uri_list->priv->list_store, row_deleted_cb, uri_list);
g_signal_handlers_block_by_func (uri_list->priv->list_store, row_inserted_cb, uri_list);
-
+
gtk_list_store_clear (uri_list->priv->list_store);
for (i = 0; uris[i] != NULL; i++) {
@@ -255,11 +255,11 @@ gth_uri_list_set_uris (GthUriList *uri_list,
GIcon *icon;
GdkPixbuf *pixbuf;
GtkTreeIter iter;
-
+
file = g_file_new_for_uri (uri);
- file_source = gth_main_get_file_source (file);
- info = gth_file_source_get_file_info (file_source, file);
-
+ file_source = gth_main_get_file_source (file);
+ info = gth_file_source_get_file_info (file_source, file, GFILE_BASIC_ATTRIBUTES);
+
display_name = g_file_info_get_display_name (info);
icon = g_file_info_get_icon (info);
pixbuf = gth_icon_cache_get_pixbuf (uri_list->priv->icon_cache, icon);
@@ -275,7 +275,7 @@ gth_uri_list_set_uris (GthUriList *uri_list,
g_object_unref (file_source);
g_object_unref (file);
}
-
+
g_signal_handlers_unblock_by_func (uri_list->priv->list_store, row_deleted_cb, uri_list);
g_signal_handlers_unblock_by_func (uri_list->priv->list_store, row_inserted_cb, uri_list);
}
@@ -286,12 +286,12 @@ gth_uri_list_get_uri (GthUriList *uri_list,
GtkTreeIter *iter)
{
char *uri;
-
+
gtk_tree_model_get (GTK_TREE_MODEL (uri_list->priv->list_store),
iter,
URI_LIST_COLUMN_URI, &uri,
-1);
-
+
return uri;
}
@@ -314,7 +314,7 @@ gth_uri_list_get_selected (GthUriList *uri_list)
&iter,
URI_LIST_COLUMN_URI, &uri,
-1);
-
+
return uri;
}
@@ -328,14 +328,14 @@ gth_uri_list_get_uris (GthUriList *uri_list)
if (! gtk_tree_model_get_iter_first (model, &iter))
return NULL;
-
+
do {
char *uri;
-
+
gtk_tree_model_get (model, &iter, URI_LIST_COLUMN_URI, &uri, -1);
uris = g_list_prepend (uris, uri);
- }
+ }
while (gtk_tree_model_iter_next (model, &iter));
-
+
return g_list_reverse (uris);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]