parent
9637840886
commit
87238194c3
|
@ -160,40 +160,42 @@ static gboolean xed_file_browser_store_iter_children (GtkTreeModel *tree_model,
|
|||
static gboolean xed_file_browser_store_iter_has_child (GtkTreeModel *tree_model,
|
||||
GtkTreeIter *iter);
|
||||
static gint xed_file_browser_store_iter_n_children (GtkTreeModel *tree_model,
|
||||
GtkTreeIter * iter);
|
||||
static gboolean xed_file_browser_store_iter_nth_child (GtkTreeModel * tree_model,
|
||||
GtkTreeIter * iter,
|
||||
GtkTreeIter * parent,
|
||||
GtkTreeIter *iter);
|
||||
static gboolean xed_file_browser_store_iter_nth_child (GtkTreeModel *tree_model,
|
||||
GtkTreeIter *iter,
|
||||
GtkTreeIter *parent,
|
||||
gint n);
|
||||
static gboolean xed_file_browser_store_iter_parent (GtkTreeModel * tree_model,
|
||||
GtkTreeIter * iter,
|
||||
GtkTreeIter * child);
|
||||
static void xed_file_browser_store_row_inserted (GtkTreeModel * tree_model,
|
||||
GtkTreePath * path,
|
||||
GtkTreeIter * iter);
|
||||
static gboolean xed_file_browser_store_iter_parent (GtkTreeModel *tree_model,
|
||||
GtkTreeIter *iter,
|
||||
GtkTreeIter *child);
|
||||
static void xed_file_browser_store_row_inserted (GtkTreeModel *tree_model,
|
||||
GtkTreePath *path,
|
||||
GtkTreeIter *iter);
|
||||
|
||||
static void xed_file_browser_store_drag_source_init (GtkTreeDragSourceIface * iface);
|
||||
static gboolean xed_file_browser_store_row_draggable (GtkTreeDragSource * drag_source,
|
||||
GtkTreePath * path);
|
||||
static gboolean xed_file_browser_store_drag_data_delete (GtkTreeDragSource * drag_source,
|
||||
GtkTreePath * path);
|
||||
static gboolean xed_file_browser_store_drag_data_get (GtkTreeDragSource * drag_source,
|
||||
GtkTreePath * path,
|
||||
GtkSelectionData * selection_data);
|
||||
static void xed_file_browser_store_drag_source_init (GtkTreeDragSourceIface *iface);
|
||||
static gboolean xed_file_browser_store_row_draggable (GtkTreeDragSource *drag_source,
|
||||
GtkTreePath *path);
|
||||
static gboolean xed_file_browser_store_drag_data_delete (GtkTreeDragSource *drag_source,
|
||||
GtkTreePath *path);
|
||||
static gboolean xed_file_browser_store_drag_data_get (GtkTreeDragSource *drag_source,
|
||||
GtkTreePath *path,
|
||||
GtkSelectionData *selection_data);
|
||||
|
||||
static void file_browser_node_free (XedFileBrowserStore * model,
|
||||
FileBrowserNode * node);
|
||||
static void model_add_node (XedFileBrowserStore * model,
|
||||
FileBrowserNode * child,
|
||||
FileBrowserNode * parent);
|
||||
static void model_clear (XedFileBrowserStore * model,
|
||||
static void file_browser_node_free (XedFileBrowserStore *model,
|
||||
FileBrowserNode *node);
|
||||
static void model_add_node (XedFileBrowserStore *model,
|
||||
FileBrowserNode *child,
|
||||
FileBrowserNode *parent);
|
||||
static void model_clear (XedFileBrowserStore *model,
|
||||
gboolean free_nodes);
|
||||
static gint model_sort_default (FileBrowserNode * node1,
|
||||
FileBrowserNode * node2);
|
||||
static void model_check_dummy (XedFileBrowserStore * model,
|
||||
FileBrowserNode * node);
|
||||
static void next_files_async (GFileEnumerator * enumerator,
|
||||
AsyncNode * async);
|
||||
static gint model_sort_default (FileBrowserNode *node1,
|
||||
FileBrowserNode *node2);
|
||||
static void model_check_dummy (XedFileBrowserStore *model,
|
||||
FileBrowserNode *node);
|
||||
static void next_files_async (GFileEnumerator *enumerator,
|
||||
AsyncNode *async);
|
||||
|
||||
static void delete_files (AsyncData *data);
|
||||
|
||||
G_DEFINE_DYNAMIC_TYPE_EXTENDED (XedFileBrowserStore, xed_file_browser_store,
|
||||
G_TYPE_OBJECT,
|
||||
|
@ -3655,93 +3657,101 @@ emit_no_trash (AsyncData *data)
|
|||
return ret;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
static void
|
||||
delete_file_finished (GFile *file,
|
||||
GAsyncResult *res,
|
||||
AsyncData *data)
|
||||
{
|
||||
XedFileBrowserStore *model;
|
||||
GFile *file;
|
||||
} IdleDelete;
|
||||
GError *error = NULL;
|
||||
gboolean ok;
|
||||
|
||||
static gboolean
|
||||
file_deleted (IdleDelete *data)
|
||||
{
|
||||
FileBrowserNode *node;
|
||||
node = model_find_node (data->model, NULL, data->file);
|
||||
if (data->trash)
|
||||
{
|
||||
ok = g_file_trash_finish (file, res, &error);
|
||||
}
|
||||
else
|
||||
{
|
||||
ok = g_file_delete_finish (file, res, &error);
|
||||
}
|
||||
|
||||
if (ok)
|
||||
{
|
||||
/* Remove the file from the model */
|
||||
FileBrowserNode *node = model_find_node (data->model, NULL, file);
|
||||
|
||||
if (node != NULL)
|
||||
{
|
||||
model_remove_node (data->model, node, NULL, TRUE);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
delete_files (GIOSchedulerJob *job,
|
||||
GCancellable *cancellable,
|
||||
AsyncData *data)
|
||||
{
|
||||
GFile *file;
|
||||
GError *error = NULL;
|
||||
gboolean ret;
|
||||
gint code;
|
||||
IdleDelete delete;
|
||||
|
||||
/* Check if our job is done */
|
||||
if (!data->iter)
|
||||
{
|
||||
return FALSE;
|
||||
/* Process the next file */
|
||||
data->iter = data->iter->next;
|
||||
}
|
||||
|
||||
/* Move a file to the trash */
|
||||
file = G_FILE (data->iter->data);
|
||||
|
||||
if (data->trash)
|
||||
else if (!ok && error != NULL)
|
||||
{
|
||||
ret = g_file_trash (file, cancellable, &error);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = g_file_delete (file, cancellable, &error);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
{
|
||||
delete.model = data->model;
|
||||
delete.file = file;
|
||||
|
||||
/* Remove the file from the model in the main loop */
|
||||
g_io_scheduler_job_send_to_mainloop (job, (GSourceFunc)file_deleted, &delete, NULL);
|
||||
}
|
||||
else if (!ret && error)
|
||||
{
|
||||
code = error->code;
|
||||
gint code = error->code;
|
||||
g_error_free (error);
|
||||
|
||||
if (data->trash && code == G_IO_ERROR_NOT_SUPPORTED)
|
||||
{
|
||||
/* Trash is not supported on this system ... */
|
||||
if (g_io_scheduler_job_send_to_mainloop (job, (GSourceFunc)emit_no_trash, data, NULL))
|
||||
/* Trash is not supported on this system. Ask the user
|
||||
* if he wants to delete completely the files instead.
|
||||
*/
|
||||
if (emit_no_trash (data))
|
||||
{
|
||||
/* Changes this into a delete job */
|
||||
data->trash = FALSE;
|
||||
data->iter = data->files;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
/* End the job */
|
||||
return FALSE;
|
||||
async_data_free (data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (code == G_IO_ERROR_CANCELLED)
|
||||
{
|
||||
/* Job has been cancelled, just let the job end */
|
||||
return FALSE;
|
||||
/* Job has been cancelled, end the job */
|
||||
async_data_free (data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Process the next item */
|
||||
data->iter = data->iter->next;
|
||||
return TRUE;
|
||||
/* Continue the job */
|
||||
delete_files (data);
|
||||
}
|
||||
|
||||
static void
|
||||
delete_files (AsyncData *data)
|
||||
{
|
||||
GFile *file;
|
||||
|
||||
/* Check if our job is done */
|
||||
if (data->iter == NULL)
|
||||
{
|
||||
async_data_free (data);
|
||||
return;
|
||||
}
|
||||
|
||||
file = G_FILE (data->iter->data);
|
||||
|
||||
if (data->trash)
|
||||
{
|
||||
g_file_trash_async (file,
|
||||
G_PRIORITY_DEFAULT,
|
||||
data->cancellable,
|
||||
(GAsyncReadyCallback)delete_file_finished,
|
||||
data);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_file_delete_async (file,
|
||||
G_PRIORITY_DEFAULT,
|
||||
data->cancellable,
|
||||
(GAsyncReadyCallback)delete_file_finished,
|
||||
data);
|
||||
}
|
||||
}
|
||||
|
||||
XedFileBrowserStoreResult
|
||||
|
@ -3801,11 +3811,7 @@ xed_file_browser_store_delete_all (XedFileBrowserStore *model,
|
|||
|
||||
model->priv->async_handles = g_slist_prepend (model->priv->async_handles, data);
|
||||
|
||||
g_io_scheduler_push_job ((GIOSchedulerJobFunc)delete_files,
|
||||
data,
|
||||
(GDestroyNotify)async_data_free,
|
||||
G_PRIORITY_DEFAULT,
|
||||
data->cancellable);
|
||||
delete_files (data);
|
||||
g_list_free (rows);
|
||||
|
||||
return XED_FILE_BROWSER_STORE_RESULT_OK;
|
||||
|
|
Loading…
Reference in New Issue