File: | plugins/filebrowser/lapiz-file-browser-store.c |
Warning: | line 2066, column 8 Although the value stored to 'node' is used in the enclosing expression, the value is never actually read from 'node' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* |
2 | * lapiz-file-browser-store.c - Lapiz plugin providing easy file access |
3 | * from the sidepanel |
4 | * |
5 | * Copyright (C) 2006 - Jesse van den Kieboom <jesse@icecrew.nl> |
6 | * |
7 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by |
9 | * the Free Software Foundation; either version 2, or (at your option) |
10 | * any later version. |
11 | * |
12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. |
16 | * |
17 | * You should have received a copy of the GNU General Public License |
18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. |
20 | */ |
21 | |
22 | #ifdef HAVE_CONFIG_H1 |
23 | #include <config.h> |
24 | #endif |
25 | |
26 | #include <string.h> |
27 | #include <glib/gi18n-lib.h> |
28 | #include <gio/gio.h> |
29 | |
30 | #include "lapiz-file-browser-store.h" |
31 | #include "lapiz-file-browser-marshal.h" |
32 | #include "lapiz-file-browser-enum-types.h" |
33 | #include "lapiz-file-browser-error.h" |
34 | #include "lapiz-file-browser-utils.h" |
35 | |
36 | #define NODE_IS_DIR(node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )) (FILE_IS_DIR((node)->flags)((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )) |
37 | #define NODE_IS_HIDDEN(node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN )) (FILE_IS_HIDDEN((node)->flags)((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN )) |
38 | #define NODE_IS_TEXT(node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_TEXT )) (FILE_IS_TEXT((node)->flags)((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_TEXT )) |
39 | #define NODE_LOADED(node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED )) (FILE_LOADED((node)->flags)((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED)) |
40 | #define NODE_IS_FILTERED(node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_FILTERED )) (FILE_IS_FILTERED((node)->flags)((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_FILTERED )) |
41 | #define NODE_IS_DUMMY(node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY )) (FILE_IS_DUMMY((node)->flags)((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY )) |
42 | |
43 | #define FILE_BROWSER_NODE_DIR(node)((FileBrowserNodeDir *)(node)) ((FileBrowserNodeDir *)(node)) |
44 | |
45 | #define DIRECTORY_LOAD_ITEMS_PER_CALLBACK100 100 |
46 | #define STANDARD_ATTRIBUTE_TYPES"standard::type" "," "standard::is-hidden" "," "standard::is-backup" "," "standard::name" "," "standard::content-type" "," "standard::icon" G_FILE_ATTRIBUTE_STANDARD_TYPE"standard::type" "," \ |
47 | G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN"standard::is-hidden" "," \ |
48 | G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP"standard::is-backup" "," \ |
49 | G_FILE_ATTRIBUTE_STANDARD_NAME"standard::name" "," \ |
50 | G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE"standard::content-type" "," \ |
51 | G_FILE_ATTRIBUTE_STANDARD_ICON"standard::icon" |
52 | |
53 | typedef struct _FileBrowserNode FileBrowserNode; |
54 | typedef struct _FileBrowserNodeDir FileBrowserNodeDir; |
55 | typedef struct _AsyncData AsyncData; |
56 | typedef struct _AsyncNode AsyncNode; |
57 | |
58 | typedef gint (*SortFunc) (FileBrowserNode * node1, |
59 | FileBrowserNode * node2); |
60 | |
61 | struct _AsyncData |
62 | { |
63 | LapizFileBrowserStore * model; |
64 | GCancellable * cancellable; |
65 | gboolean trash; |
66 | GList * files; |
67 | GList * iter; |
68 | gboolean removed; |
69 | }; |
70 | |
71 | struct _AsyncNode |
72 | { |
73 | FileBrowserNodeDir *dir; |
74 | GCancellable *cancellable; |
75 | GSList *original_children; |
76 | }; |
77 | |
78 | typedef struct { |
79 | LapizFileBrowserStore * model; |
80 | gchar * virtual_root; |
81 | GMountOperation * operation; |
82 | GCancellable * cancellable; |
83 | } MountInfo; |
84 | |
85 | struct _FileBrowserNode |
86 | { |
87 | GFile *file; |
88 | guint flags; |
89 | gchar *name; |
90 | |
91 | GdkPixbuf *icon; |
92 | GdkPixbuf *emblem; |
93 | |
94 | FileBrowserNode *parent; |
95 | gint pos; |
96 | gboolean inserted; |
97 | }; |
98 | |
99 | struct _FileBrowserNodeDir |
100 | { |
101 | FileBrowserNode node; |
102 | GSList *children; |
103 | |
104 | GCancellable *cancellable; |
105 | GFileMonitor *monitor; |
106 | LapizFileBrowserStore *model; |
107 | }; |
108 | |
109 | struct _LapizFileBrowserStorePrivate |
110 | { |
111 | FileBrowserNode *root; |
112 | FileBrowserNode *virtual_root; |
113 | GType column_types[LAPIZ_FILE_BROWSER_STORE_COLUMN_NUM]; |
114 | |
115 | LapizFileBrowserStoreFilterMode filter_mode; |
116 | LapizFileBrowserStoreFilterFunc filter_func; |
117 | gpointer filter_user_data; |
118 | |
119 | SortFunc sort_func; |
120 | |
121 | GSList *async_handles; |
122 | MountInfo *mount_info; |
123 | }; |
124 | |
125 | static FileBrowserNode *model_find_node (LapizFileBrowserStore *model, |
126 | FileBrowserNode *node, |
127 | GFile *uri); |
128 | static void model_remove_node (LapizFileBrowserStore * model, |
129 | FileBrowserNode * node, |
130 | CtkTreePath * path, |
131 | gboolean free_nodes); |
132 | |
133 | static void set_virtual_root_from_node (LapizFileBrowserStore * model, |
134 | FileBrowserNode * node); |
135 | |
136 | static void lapiz_file_browser_store_iface_init (CtkTreeModelIface * iface); |
137 | static CtkTreeModelFlags lapiz_file_browser_store_get_flags (CtkTreeModel * tree_model); |
138 | static gint lapiz_file_browser_store_get_n_columns (CtkTreeModel * tree_model); |
139 | static GType lapiz_file_browser_store_get_column_type (CtkTreeModel * tree_model, |
140 | gint index); |
141 | static gboolean lapiz_file_browser_store_get_iter (CtkTreeModel * tree_model, |
142 | CtkTreeIter * iter, |
143 | CtkTreePath * path); |
144 | static CtkTreePath *lapiz_file_browser_store_get_path (CtkTreeModel * tree_model, |
145 | CtkTreeIter * iter); |
146 | static void lapiz_file_browser_store_get_value (CtkTreeModel * tree_model, |
147 | CtkTreeIter * iter, |
148 | gint column, |
149 | GValue * value); |
150 | static gboolean lapiz_file_browser_store_iter_next (CtkTreeModel * tree_model, |
151 | CtkTreeIter * iter); |
152 | static gboolean lapiz_file_browser_store_iter_children (CtkTreeModel * tree_model, |
153 | CtkTreeIter * iter, |
154 | CtkTreeIter * parent); |
155 | static gboolean lapiz_file_browser_store_iter_has_child (CtkTreeModel * tree_model, |
156 | CtkTreeIter * iter); |
157 | static gint lapiz_file_browser_store_iter_n_children (CtkTreeModel * tree_model, |
158 | CtkTreeIter * iter); |
159 | static gboolean lapiz_file_browser_store_iter_nth_child (CtkTreeModel * tree_model, |
160 | CtkTreeIter * iter, |
161 | CtkTreeIter * parent, |
162 | gint n); |
163 | static gboolean lapiz_file_browser_store_iter_parent (CtkTreeModel * tree_model, |
164 | CtkTreeIter * iter, |
165 | CtkTreeIter * child); |
166 | static void lapiz_file_browser_store_row_inserted (CtkTreeModel * tree_model, |
167 | CtkTreePath * path, |
168 | CtkTreeIter * iter); |
169 | |
170 | static void lapiz_file_browser_store_drag_source_init (CtkTreeDragSourceIface * iface); |
171 | static gboolean lapiz_file_browser_store_row_draggable (CtkTreeDragSource * drag_source, |
172 | CtkTreePath * path); |
173 | static gboolean lapiz_file_browser_store_drag_data_delete (CtkTreeDragSource * drag_source, |
174 | CtkTreePath * path); |
175 | static gboolean lapiz_file_browser_store_drag_data_get (CtkTreeDragSource * drag_source, |
176 | CtkTreePath * path, |
177 | CtkSelectionData * selection_data); |
178 | |
179 | static void file_browser_node_free (LapizFileBrowserStore * model, |
180 | FileBrowserNode * node); |
181 | static void model_add_node (LapizFileBrowserStore * model, |
182 | FileBrowserNode * child, |
183 | FileBrowserNode * parent); |
184 | static void model_clear (LapizFileBrowserStore * model, |
185 | gboolean free_nodes); |
186 | static gint model_sort_default (FileBrowserNode * node1, |
187 | FileBrowserNode * node2); |
188 | static void model_check_dummy (LapizFileBrowserStore * model, |
189 | FileBrowserNode * node); |
190 | static void next_files_async (GFileEnumerator * enumerator, |
191 | AsyncNode * async); |
192 | |
193 | static void delete_files (AsyncData *data); |
194 | |
195 | G_DEFINE_DYNAMIC_TYPE_EXTENDED (LapizFileBrowserStore, lapiz_file_browser_store,static void lapiz_file_browser_store_init (LapizFileBrowserStore *self); static void lapiz_file_browser_store_class_init (LapizFileBrowserStoreClass *klass); static void lapiz_file_browser_store_class_finalize (LapizFileBrowserStoreClass *klass); static gpointer lapiz_file_browser_store_parent_class = ((void*)0); static GType lapiz_file_browser_store_type_id = 0; static gint LapizFileBrowserStore_private_offset; static void lapiz_file_browser_store_class_intern_init (gpointer klass) { lapiz_file_browser_store_parent_class = g_type_class_peek_parent (klass); if (LapizFileBrowserStore_private_offset != 0) g_type_class_adjust_private_offset (klass, &LapizFileBrowserStore_private_offset); lapiz_file_browser_store_class_init ((LapizFileBrowserStoreClass*) klass); } __attribute__ ((__unused__ )) static inline gpointer lapiz_file_browser_store_get_instance_private (LapizFileBrowserStore *self) { return (((gpointer) ((guint8 *) (self) + (glong) (LapizFileBrowserStore_private_offset)))) ; } GType lapiz_file_browser_store_get_type (void) { return lapiz_file_browser_store_type_id ; } static void lapiz_file_browser_store_register_type (GTypeModule *type_module) { GType g_define_type_id __attribute__ ((__unused__ )); const GTypeInfo g_define_type_info = { sizeof (LapizFileBrowserStoreClass ), (GBaseInitFunc) ((void*)0), (GBaseFinalizeFunc) ((void*)0) , (GClassInitFunc)(void (*)(void)) lapiz_file_browser_store_class_intern_init , (GClassFinalizeFunc)(void (*)(void)) lapiz_file_browser_store_class_finalize , ((void*)0), sizeof (LapizFileBrowserStore), 0, (GInstanceInitFunc )(void (*)(void)) lapiz_file_browser_store_init, ((void*)0) } ; lapiz_file_browser_store_type_id = g_type_module_register_type (type_module, ((GType) ((20) << (2))), "LapizFileBrowserStore" , &g_define_type_info, (GTypeFlags) 0); g_define_type_id = lapiz_file_browser_store_type_id; { { LapizFileBrowserStore_private_offset = sizeof (LapizFileBrowserStorePrivate); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc)(void (*) (void)) lapiz_file_browser_store_iface_init, ((void*)0), ((void *)0) }; g_type_module_add_interface (type_module, g_define_type_id , (ctk_tree_model_get_type ()), &g_implement_interface_info ); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc )(void (*)(void)) lapiz_file_browser_store_drag_source_init, ( (void*)0), ((void*)0) }; g_type_module_add_interface (type_module , g_define_type_id, (ctk_tree_drag_source_get_type ()), & g_implement_interface_info); } ; } } |
196 | G_TYPE_OBJECT,static void lapiz_file_browser_store_init (LapizFileBrowserStore *self); static void lapiz_file_browser_store_class_init (LapizFileBrowserStoreClass *klass); static void lapiz_file_browser_store_class_finalize (LapizFileBrowserStoreClass *klass); static gpointer lapiz_file_browser_store_parent_class = ((void*)0); static GType lapiz_file_browser_store_type_id = 0; static gint LapizFileBrowserStore_private_offset; static void lapiz_file_browser_store_class_intern_init (gpointer klass) { lapiz_file_browser_store_parent_class = g_type_class_peek_parent (klass); if (LapizFileBrowserStore_private_offset != 0) g_type_class_adjust_private_offset (klass, &LapizFileBrowserStore_private_offset); lapiz_file_browser_store_class_init ((LapizFileBrowserStoreClass*) klass); } __attribute__ ((__unused__ )) static inline gpointer lapiz_file_browser_store_get_instance_private (LapizFileBrowserStore *self) { return (((gpointer) ((guint8 *) (self) + (glong) (LapizFileBrowserStore_private_offset)))) ; } GType lapiz_file_browser_store_get_type (void) { return lapiz_file_browser_store_type_id ; } static void lapiz_file_browser_store_register_type (GTypeModule *type_module) { GType g_define_type_id __attribute__ ((__unused__ )); const GTypeInfo g_define_type_info = { sizeof (LapizFileBrowserStoreClass ), (GBaseInitFunc) ((void*)0), (GBaseFinalizeFunc) ((void*)0) , (GClassInitFunc)(void (*)(void)) lapiz_file_browser_store_class_intern_init , (GClassFinalizeFunc)(void (*)(void)) lapiz_file_browser_store_class_finalize , ((void*)0), sizeof (LapizFileBrowserStore), 0, (GInstanceInitFunc )(void (*)(void)) lapiz_file_browser_store_init, ((void*)0) } ; lapiz_file_browser_store_type_id = g_type_module_register_type (type_module, ((GType) ((20) << (2))), "LapizFileBrowserStore" , &g_define_type_info, (GTypeFlags) 0); g_define_type_id = lapiz_file_browser_store_type_id; { { LapizFileBrowserStore_private_offset = sizeof (LapizFileBrowserStorePrivate); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc)(void (*) (void)) lapiz_file_browser_store_iface_init, ((void*)0), ((void *)0) }; g_type_module_add_interface (type_module, g_define_type_id , (ctk_tree_model_get_type ()), &g_implement_interface_info ); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc )(void (*)(void)) lapiz_file_browser_store_drag_source_init, ( (void*)0), ((void*)0) }; g_type_module_add_interface (type_module , g_define_type_id, (ctk_tree_drag_source_get_type ()), & g_implement_interface_info); } ; } } |
197 | 0,static void lapiz_file_browser_store_init (LapizFileBrowserStore *self); static void lapiz_file_browser_store_class_init (LapizFileBrowserStoreClass *klass); static void lapiz_file_browser_store_class_finalize (LapizFileBrowserStoreClass *klass); static gpointer lapiz_file_browser_store_parent_class = ((void*)0); static GType lapiz_file_browser_store_type_id = 0; static gint LapizFileBrowserStore_private_offset; static void lapiz_file_browser_store_class_intern_init (gpointer klass) { lapiz_file_browser_store_parent_class = g_type_class_peek_parent (klass); if (LapizFileBrowserStore_private_offset != 0) g_type_class_adjust_private_offset (klass, &LapizFileBrowserStore_private_offset); lapiz_file_browser_store_class_init ((LapizFileBrowserStoreClass*) klass); } __attribute__ ((__unused__ )) static inline gpointer lapiz_file_browser_store_get_instance_private (LapizFileBrowserStore *self) { return (((gpointer) ((guint8 *) (self) + (glong) (LapizFileBrowserStore_private_offset)))) ; } GType lapiz_file_browser_store_get_type (void) { return lapiz_file_browser_store_type_id ; } static void lapiz_file_browser_store_register_type (GTypeModule *type_module) { GType g_define_type_id __attribute__ ((__unused__ )); const GTypeInfo g_define_type_info = { sizeof (LapizFileBrowserStoreClass ), (GBaseInitFunc) ((void*)0), (GBaseFinalizeFunc) ((void*)0) , (GClassInitFunc)(void (*)(void)) lapiz_file_browser_store_class_intern_init , (GClassFinalizeFunc)(void (*)(void)) lapiz_file_browser_store_class_finalize , ((void*)0), sizeof (LapizFileBrowserStore), 0, (GInstanceInitFunc )(void (*)(void)) lapiz_file_browser_store_init, ((void*)0) } ; lapiz_file_browser_store_type_id = g_type_module_register_type (type_module, ((GType) ((20) << (2))), "LapizFileBrowserStore" , &g_define_type_info, (GTypeFlags) 0); g_define_type_id = lapiz_file_browser_store_type_id; { { LapizFileBrowserStore_private_offset = sizeof (LapizFileBrowserStorePrivate); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc)(void (*) (void)) lapiz_file_browser_store_iface_init, ((void*)0), ((void *)0) }; g_type_module_add_interface (type_module, g_define_type_id , (ctk_tree_model_get_type ()), &g_implement_interface_info ); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc )(void (*)(void)) lapiz_file_browser_store_drag_source_init, ( (void*)0), ((void*)0) }; g_type_module_add_interface (type_module , g_define_type_id, (ctk_tree_drag_source_get_type ()), & g_implement_interface_info); } ; } } |
198 | G_ADD_PRIVATE_DYNAMIC (LapizFileBrowserStore)static void lapiz_file_browser_store_init (LapizFileBrowserStore *self); static void lapiz_file_browser_store_class_init (LapizFileBrowserStoreClass *klass); static void lapiz_file_browser_store_class_finalize (LapizFileBrowserStoreClass *klass); static gpointer lapiz_file_browser_store_parent_class = ((void*)0); static GType lapiz_file_browser_store_type_id = 0; static gint LapizFileBrowserStore_private_offset; static void lapiz_file_browser_store_class_intern_init (gpointer klass) { lapiz_file_browser_store_parent_class = g_type_class_peek_parent (klass); if (LapizFileBrowserStore_private_offset != 0) g_type_class_adjust_private_offset (klass, &LapizFileBrowserStore_private_offset); lapiz_file_browser_store_class_init ((LapizFileBrowserStoreClass*) klass); } __attribute__ ((__unused__ )) static inline gpointer lapiz_file_browser_store_get_instance_private (LapizFileBrowserStore *self) { return (((gpointer) ((guint8 *) (self) + (glong) (LapizFileBrowserStore_private_offset)))) ; } GType lapiz_file_browser_store_get_type (void) { return lapiz_file_browser_store_type_id ; } static void lapiz_file_browser_store_register_type (GTypeModule *type_module) { GType g_define_type_id __attribute__ ((__unused__ )); const GTypeInfo g_define_type_info = { sizeof (LapizFileBrowserStoreClass ), (GBaseInitFunc) ((void*)0), (GBaseFinalizeFunc) ((void*)0) , (GClassInitFunc)(void (*)(void)) lapiz_file_browser_store_class_intern_init , (GClassFinalizeFunc)(void (*)(void)) lapiz_file_browser_store_class_finalize , ((void*)0), sizeof (LapizFileBrowserStore), 0, (GInstanceInitFunc )(void (*)(void)) lapiz_file_browser_store_init, ((void*)0) } ; lapiz_file_browser_store_type_id = g_type_module_register_type (type_module, ((GType) ((20) << (2))), "LapizFileBrowserStore" , &g_define_type_info, (GTypeFlags) 0); g_define_type_id = lapiz_file_browser_store_type_id; { { LapizFileBrowserStore_private_offset = sizeof (LapizFileBrowserStorePrivate); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc)(void (*) (void)) lapiz_file_browser_store_iface_init, ((void*)0), ((void *)0) }; g_type_module_add_interface (type_module, g_define_type_id , (ctk_tree_model_get_type ()), &g_implement_interface_info ); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc )(void (*)(void)) lapiz_file_browser_store_drag_source_init, ( (void*)0), ((void*)0) }; g_type_module_add_interface (type_module , g_define_type_id, (ctk_tree_drag_source_get_type ()), & g_implement_interface_info); } ; } } |
199 | G_IMPLEMENT_INTERFACE_DYNAMIC (CTK_TYPE_TREE_MODEL,static void lapiz_file_browser_store_init (LapizFileBrowserStore *self); static void lapiz_file_browser_store_class_init (LapizFileBrowserStoreClass *klass); static void lapiz_file_browser_store_class_finalize (LapizFileBrowserStoreClass *klass); static gpointer lapiz_file_browser_store_parent_class = ((void*)0); static GType lapiz_file_browser_store_type_id = 0; static gint LapizFileBrowserStore_private_offset; static void lapiz_file_browser_store_class_intern_init (gpointer klass) { lapiz_file_browser_store_parent_class = g_type_class_peek_parent (klass); if (LapizFileBrowserStore_private_offset != 0) g_type_class_adjust_private_offset (klass, &LapizFileBrowserStore_private_offset); lapiz_file_browser_store_class_init ((LapizFileBrowserStoreClass*) klass); } __attribute__ ((__unused__ )) static inline gpointer lapiz_file_browser_store_get_instance_private (LapizFileBrowserStore *self) { return (((gpointer) ((guint8 *) (self) + (glong) (LapizFileBrowserStore_private_offset)))) ; } GType lapiz_file_browser_store_get_type (void) { return lapiz_file_browser_store_type_id ; } static void lapiz_file_browser_store_register_type (GTypeModule *type_module) { GType g_define_type_id __attribute__ ((__unused__ )); const GTypeInfo g_define_type_info = { sizeof (LapizFileBrowserStoreClass ), (GBaseInitFunc) ((void*)0), (GBaseFinalizeFunc) ((void*)0) , (GClassInitFunc)(void (*)(void)) lapiz_file_browser_store_class_intern_init , (GClassFinalizeFunc)(void (*)(void)) lapiz_file_browser_store_class_finalize , ((void*)0), sizeof (LapizFileBrowserStore), 0, (GInstanceInitFunc )(void (*)(void)) lapiz_file_browser_store_init, ((void*)0) } ; lapiz_file_browser_store_type_id = g_type_module_register_type (type_module, ((GType) ((20) << (2))), "LapizFileBrowserStore" , &g_define_type_info, (GTypeFlags) 0); g_define_type_id = lapiz_file_browser_store_type_id; { { LapizFileBrowserStore_private_offset = sizeof (LapizFileBrowserStorePrivate); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc)(void (*) (void)) lapiz_file_browser_store_iface_init, ((void*)0), ((void *)0) }; g_type_module_add_interface (type_module, g_define_type_id , (ctk_tree_model_get_type ()), &g_implement_interface_info ); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc )(void (*)(void)) lapiz_file_browser_store_drag_source_init, ( (void*)0), ((void*)0) }; g_type_module_add_interface (type_module , g_define_type_id, (ctk_tree_drag_source_get_type ()), & g_implement_interface_info); } ; } } |
200 | lapiz_file_browser_store_iface_init)static void lapiz_file_browser_store_init (LapizFileBrowserStore *self); static void lapiz_file_browser_store_class_init (LapizFileBrowserStoreClass *klass); static void lapiz_file_browser_store_class_finalize (LapizFileBrowserStoreClass *klass); static gpointer lapiz_file_browser_store_parent_class = ((void*)0); static GType lapiz_file_browser_store_type_id = 0; static gint LapizFileBrowserStore_private_offset; static void lapiz_file_browser_store_class_intern_init (gpointer klass) { lapiz_file_browser_store_parent_class = g_type_class_peek_parent (klass); if (LapizFileBrowserStore_private_offset != 0) g_type_class_adjust_private_offset (klass, &LapizFileBrowserStore_private_offset); lapiz_file_browser_store_class_init ((LapizFileBrowserStoreClass*) klass); } __attribute__ ((__unused__ )) static inline gpointer lapiz_file_browser_store_get_instance_private (LapizFileBrowserStore *self) { return (((gpointer) ((guint8 *) (self) + (glong) (LapizFileBrowserStore_private_offset)))) ; } GType lapiz_file_browser_store_get_type (void) { return lapiz_file_browser_store_type_id ; } static void lapiz_file_browser_store_register_type (GTypeModule *type_module) { GType g_define_type_id __attribute__ ((__unused__ )); const GTypeInfo g_define_type_info = { sizeof (LapizFileBrowserStoreClass ), (GBaseInitFunc) ((void*)0), (GBaseFinalizeFunc) ((void*)0) , (GClassInitFunc)(void (*)(void)) lapiz_file_browser_store_class_intern_init , (GClassFinalizeFunc)(void (*)(void)) lapiz_file_browser_store_class_finalize , ((void*)0), sizeof (LapizFileBrowserStore), 0, (GInstanceInitFunc )(void (*)(void)) lapiz_file_browser_store_init, ((void*)0) } ; lapiz_file_browser_store_type_id = g_type_module_register_type (type_module, ((GType) ((20) << (2))), "LapizFileBrowserStore" , &g_define_type_info, (GTypeFlags) 0); g_define_type_id = lapiz_file_browser_store_type_id; { { LapizFileBrowserStore_private_offset = sizeof (LapizFileBrowserStorePrivate); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc)(void (*) (void)) lapiz_file_browser_store_iface_init, ((void*)0), ((void *)0) }; g_type_module_add_interface (type_module, g_define_type_id , (ctk_tree_model_get_type ()), &g_implement_interface_info ); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc )(void (*)(void)) lapiz_file_browser_store_drag_source_init, ( (void*)0), ((void*)0) }; g_type_module_add_interface (type_module , g_define_type_id, (ctk_tree_drag_source_get_type ()), & g_implement_interface_info); } ; } } |
201 | G_IMPLEMENT_INTERFACE_DYNAMIC (CTK_TYPE_TREE_DRAG_SOURCE,static void lapiz_file_browser_store_init (LapizFileBrowserStore *self); static void lapiz_file_browser_store_class_init (LapizFileBrowserStoreClass *klass); static void lapiz_file_browser_store_class_finalize (LapizFileBrowserStoreClass *klass); static gpointer lapiz_file_browser_store_parent_class = ((void*)0); static GType lapiz_file_browser_store_type_id = 0; static gint LapizFileBrowserStore_private_offset; static void lapiz_file_browser_store_class_intern_init (gpointer klass) { lapiz_file_browser_store_parent_class = g_type_class_peek_parent (klass); if (LapizFileBrowserStore_private_offset != 0) g_type_class_adjust_private_offset (klass, &LapizFileBrowserStore_private_offset); lapiz_file_browser_store_class_init ((LapizFileBrowserStoreClass*) klass); } __attribute__ ((__unused__ )) static inline gpointer lapiz_file_browser_store_get_instance_private (LapizFileBrowserStore *self) { return (((gpointer) ((guint8 *) (self) + (glong) (LapizFileBrowserStore_private_offset)))) ; } GType lapiz_file_browser_store_get_type (void) { return lapiz_file_browser_store_type_id ; } static void lapiz_file_browser_store_register_type (GTypeModule *type_module) { GType g_define_type_id __attribute__ ((__unused__ )); const GTypeInfo g_define_type_info = { sizeof (LapizFileBrowserStoreClass ), (GBaseInitFunc) ((void*)0), (GBaseFinalizeFunc) ((void*)0) , (GClassInitFunc)(void (*)(void)) lapiz_file_browser_store_class_intern_init , (GClassFinalizeFunc)(void (*)(void)) lapiz_file_browser_store_class_finalize , ((void*)0), sizeof (LapizFileBrowserStore), 0, (GInstanceInitFunc )(void (*)(void)) lapiz_file_browser_store_init, ((void*)0) } ; lapiz_file_browser_store_type_id = g_type_module_register_type (type_module, ((GType) ((20) << (2))), "LapizFileBrowserStore" , &g_define_type_info, (GTypeFlags) 0); g_define_type_id = lapiz_file_browser_store_type_id; { { LapizFileBrowserStore_private_offset = sizeof (LapizFileBrowserStorePrivate); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc)(void (*) (void)) lapiz_file_browser_store_iface_init, ((void*)0), ((void *)0) }; g_type_module_add_interface (type_module, g_define_type_id , (ctk_tree_model_get_type ()), &g_implement_interface_info ); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc )(void (*)(void)) lapiz_file_browser_store_drag_source_init, ( (void*)0), ((void*)0) }; g_type_module_add_interface (type_module , g_define_type_id, (ctk_tree_drag_source_get_type ()), & g_implement_interface_info); } ; } } |
202 | lapiz_file_browser_store_drag_source_init))static void lapiz_file_browser_store_init (LapizFileBrowserStore *self); static void lapiz_file_browser_store_class_init (LapizFileBrowserStoreClass *klass); static void lapiz_file_browser_store_class_finalize (LapizFileBrowserStoreClass *klass); static gpointer lapiz_file_browser_store_parent_class = ((void*)0); static GType lapiz_file_browser_store_type_id = 0; static gint LapizFileBrowserStore_private_offset; static void lapiz_file_browser_store_class_intern_init (gpointer klass) { lapiz_file_browser_store_parent_class = g_type_class_peek_parent (klass); if (LapizFileBrowserStore_private_offset != 0) g_type_class_adjust_private_offset (klass, &LapizFileBrowserStore_private_offset); lapiz_file_browser_store_class_init ((LapizFileBrowserStoreClass*) klass); } __attribute__ ((__unused__ )) static inline gpointer lapiz_file_browser_store_get_instance_private (LapizFileBrowserStore *self) { return (((gpointer) ((guint8 *) (self) + (glong) (LapizFileBrowserStore_private_offset)))) ; } GType lapiz_file_browser_store_get_type (void) { return lapiz_file_browser_store_type_id ; } static void lapiz_file_browser_store_register_type (GTypeModule *type_module) { GType g_define_type_id __attribute__ ((__unused__ )); const GTypeInfo g_define_type_info = { sizeof (LapizFileBrowserStoreClass ), (GBaseInitFunc) ((void*)0), (GBaseFinalizeFunc) ((void*)0) , (GClassInitFunc)(void (*)(void)) lapiz_file_browser_store_class_intern_init , (GClassFinalizeFunc)(void (*)(void)) lapiz_file_browser_store_class_finalize , ((void*)0), sizeof (LapizFileBrowserStore), 0, (GInstanceInitFunc )(void (*)(void)) lapiz_file_browser_store_init, ((void*)0) } ; lapiz_file_browser_store_type_id = g_type_module_register_type (type_module, ((GType) ((20) << (2))), "LapizFileBrowserStore" , &g_define_type_info, (GTypeFlags) 0); g_define_type_id = lapiz_file_browser_store_type_id; { { LapizFileBrowserStore_private_offset = sizeof (LapizFileBrowserStorePrivate); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc)(void (*) (void)) lapiz_file_browser_store_iface_init, ((void*)0), ((void *)0) }; g_type_module_add_interface (type_module, g_define_type_id , (ctk_tree_model_get_type ()), &g_implement_interface_info ); } { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc )(void (*)(void)) lapiz_file_browser_store_drag_source_init, ( (void*)0), ((void*)0) }; g_type_module_add_interface (type_module , g_define_type_id, (ctk_tree_drag_source_get_type ()), & g_implement_interface_info); } ; } } |
203 | |
204 | /* Properties */ |
205 | enum { |
206 | PROP_0, |
207 | |
208 | PROP_ROOT, |
209 | PROP_VIRTUAL_ROOT, |
210 | PROP_FILTER_MODE |
211 | }; |
212 | |
213 | /* Signals */ |
214 | enum |
215 | { |
216 | BEGIN_LOADING, |
217 | END_LOADING, |
218 | ERROR, |
219 | NO_TRASH, |
220 | RENAME, |
221 | BEGIN_REFRESH, |
222 | END_REFRESH, |
223 | UNLOAD, |
224 | NUM_SIGNALS |
225 | }; |
226 | |
227 | static guint model_signals[NUM_SIGNALS] = { 0 }; |
228 | |
229 | static void |
230 | cancel_mount_operation (LapizFileBrowserStore *obj) |
231 | { |
232 | if (obj->priv->mount_info != NULL((void*)0)) |
233 | { |
234 | obj->priv->mount_info->model = NULL((void*)0); |
235 | g_cancellable_cancel (obj->priv->mount_info->cancellable); |
236 | obj->priv->mount_info = NULL((void*)0); |
237 | } |
238 | } |
239 | |
240 | static void |
241 | lapiz_file_browser_store_finalize (GObject * object) |
242 | { |
243 | LapizFileBrowserStore *obj = LAPIZ_FILE_BROWSER_STORE (object)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((object)), ((lapiz_file_browser_store_get_type ())))))); |
244 | GSList *item; |
245 | |
246 | /* Free all the nodes */ |
247 | file_browser_node_free (obj, obj->priv->root); |
248 | |
249 | /* Cancel any asynchronous operations */ |
250 | for (item = obj->priv->async_handles; item; item = item->next) |
251 | { |
252 | AsyncData *data = (AsyncData *) (item->data); |
253 | g_cancellable_cancel (data->cancellable); |
254 | |
255 | data->removed = TRUE(!(0)); |
256 | } |
257 | |
258 | cancel_mount_operation (obj); |
259 | |
260 | g_slist_free (obj->priv->async_handles); |
261 | G_OBJECT_CLASS (lapiz_file_browser_store_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((lapiz_file_browser_store_parent_class)), (((GType) ((20) << (2))))))))->finalize (object); |
262 | } |
263 | |
264 | static void |
265 | set_gvalue_from_node (GValue *value, |
266 | FileBrowserNode *node) |
267 | { |
268 | gchar * uri; |
269 | |
270 | if (node == NULL((void*)0) || !node->file) { |
271 | g_value_set_string (value, NULL((void*)0)); |
272 | } else { |
273 | uri = g_file_get_uri (node->file); |
274 | g_value_take_string (value, uri); |
275 | } |
276 | } |
277 | |
278 | static void |
279 | lapiz_file_browser_store_get_property (GObject *object, |
280 | guint prop_id, |
281 | GValue *value, |
282 | GParamSpec *pspec) |
283 | { |
284 | LapizFileBrowserStore *obj = LAPIZ_FILE_BROWSER_STORE (object)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((object)), ((lapiz_file_browser_store_get_type ())))))); |
285 | |
286 | switch (prop_id) |
287 | { |
288 | case PROP_ROOT: |
289 | set_gvalue_from_node (value, obj->priv->root); |
290 | break; |
291 | case PROP_VIRTUAL_ROOT: |
292 | set_gvalue_from_node (value, obj->priv->virtual_root); |
293 | break; |
294 | case PROP_FILTER_MODE: |
295 | g_value_set_flags (value, obj->priv->filter_mode); |
296 | break; |
297 | default: |
298 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec *_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id = ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'" , "lapiz-file-browser-store.c", 298, ("property"), _glib__property_id , _glib__pspec->name, g_type_name ((((((GTypeClass*) (((GTypeInstance *) (_glib__pspec))->g_class))->g_type)))), (g_type_name ((((((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class ))->g_type)))))); } while (0); |
299 | break; |
300 | } |
301 | } |
302 | |
303 | static void |
304 | lapiz_file_browser_store_set_property (GObject *object, |
305 | guint prop_id, |
306 | const GValue *value, |
307 | GParamSpec *pspec) |
308 | { |
309 | LapizFileBrowserStore *obj = LAPIZ_FILE_BROWSER_STORE (object)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((object)), ((lapiz_file_browser_store_get_type ())))))); |
310 | |
311 | switch (prop_id) |
312 | { |
313 | case PROP_FILTER_MODE: |
314 | lapiz_file_browser_store_set_filter_mode (obj, |
315 | g_value_get_flags (value)); |
316 | break; |
317 | default: |
318 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec *_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id = ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'" , "lapiz-file-browser-store.c", 318, ("property"), _glib__property_id , _glib__pspec->name, g_type_name ((((((GTypeClass*) (((GTypeInstance *) (_glib__pspec))->g_class))->g_type)))), (g_type_name ((((((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class ))->g_type)))))); } while (0); |
319 | break; |
320 | } |
321 | } |
322 | |
323 | static void |
324 | lapiz_file_browser_store_class_init (LapizFileBrowserStoreClass * klass) |
325 | { |
326 | GObjectClass *object_class = G_OBJECT_CLASS (klass)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((klass)), (((GType) ((20) << (2)))))))); |
327 | |
328 | object_class->finalize = lapiz_file_browser_store_finalize; |
329 | |
330 | object_class->get_property = lapiz_file_browser_store_get_property; |
331 | object_class->set_property = lapiz_file_browser_store_set_property; |
332 | |
333 | g_object_class_install_property (object_class, PROP_ROOT, |
334 | g_param_spec_string ("root", |
335 | "Root", |
336 | "The root uri", |
337 | NULL((void*)0), |
338 | G_PARAM_READABLE)); |
339 | |
340 | g_object_class_install_property (object_class, PROP_VIRTUAL_ROOT, |
341 | g_param_spec_string ("virtual-root", |
342 | "Virtual Root", |
343 | "The virtual root uri", |
344 | NULL((void*)0), |
345 | G_PARAM_READABLE)); |
346 | |
347 | g_object_class_install_property (object_class, PROP_FILTER_MODE, |
348 | g_param_spec_flags ("filter-mode", |
349 | "Filter Mode", |
350 | "The filter mode", |
351 | LAPIZ_TYPE_FILE_BROWSER_STORE_FILTER_MODE(lapiz_file_browser_store_filter_mode_get_type()), |
352 | lapiz_file_browser_store_filter_mode_get_default (), |
353 | G_PARAM_READWRITE)); |
354 | |
355 | model_signals[BEGIN_LOADING] = |
356 | g_signal_new ("begin-loading", |
357 | G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)), |
358 | G_SIGNAL_RUN_LAST, |
359 | G_STRUCT_OFFSET (LapizFileBrowserStoreClass,((glong) __builtin_offsetof(LapizFileBrowserStoreClass, begin_loading )) |
360 | begin_loading)((glong) __builtin_offsetof(LapizFileBrowserStoreClass, begin_loading )), NULL((void*)0), NULL((void*)0), |
361 | g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE((GType) ((1) << (2))), 1, |
362 | CTK_TYPE_TREE_ITER(ctk_tree_iter_get_type ())); |
363 | model_signals[END_LOADING] = |
364 | g_signal_new ("end-loading", |
365 | G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)), |
366 | G_SIGNAL_RUN_LAST, |
367 | G_STRUCT_OFFSET (LapizFileBrowserStoreClass,((glong) __builtin_offsetof(LapizFileBrowserStoreClass, end_loading )) |
368 | end_loading)((glong) __builtin_offsetof(LapizFileBrowserStoreClass, end_loading )), NULL((void*)0), NULL((void*)0), |
369 | g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE((GType) ((1) << (2))), 1, |
370 | CTK_TYPE_TREE_ITER(ctk_tree_iter_get_type ())); |
371 | model_signals[ERROR] = |
372 | g_signal_new ("error", G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)), |
373 | G_SIGNAL_RUN_LAST, |
374 | G_STRUCT_OFFSET (LapizFileBrowserStoreClass,((glong) __builtin_offsetof(LapizFileBrowserStoreClass, error )) |
375 | error)((glong) __builtin_offsetof(LapizFileBrowserStoreClass, error )), NULL((void*)0), NULL((void*)0), |
376 | lapiz_file_browser_marshal_VOID__UINT_STRING, |
377 | G_TYPE_NONE((GType) ((1) << (2))), 2, G_TYPE_UINT((GType) ((7) << (2))), G_TYPE_STRING((GType) ((16) << (2)))); |
378 | model_signals[NO_TRASH] = |
379 | g_signal_new ("no-trash", G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)), |
380 | G_SIGNAL_RUN_LAST, |
381 | G_STRUCT_OFFSET (LapizFileBrowserStoreClass,((glong) __builtin_offsetof(LapizFileBrowserStoreClass, no_trash )) |
382 | no_trash)((glong) __builtin_offsetof(LapizFileBrowserStoreClass, no_trash )), g_signal_accumulator_true_handled, NULL((void*)0), |
383 | lapiz_file_browser_marshal_BOOLEAN__POINTER, |
384 | G_TYPE_BOOLEAN((GType) ((5) << (2))), 1, G_TYPE_POINTER((GType) ((17) << (2)))); |
385 | model_signals[RENAME] = |
386 | g_signal_new ("rename", |
387 | G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)), |
388 | G_SIGNAL_RUN_LAST, |
389 | G_STRUCT_OFFSET (LapizFileBrowserStoreClass,((glong) __builtin_offsetof(LapizFileBrowserStoreClass, rename )) |
390 | rename)((glong) __builtin_offsetof(LapizFileBrowserStoreClass, rename )), NULL((void*)0), NULL((void*)0), |
391 | lapiz_file_browser_marshal_VOID__STRING_STRING, |
392 | G_TYPE_NONE((GType) ((1) << (2))), 2, |
393 | G_TYPE_STRING((GType) ((16) << (2))), |
394 | G_TYPE_STRING((GType) ((16) << (2)))); |
395 | model_signals[BEGIN_REFRESH] = |
396 | g_signal_new ("begin-refresh", |
397 | G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)), |
398 | G_SIGNAL_RUN_LAST, |
399 | G_STRUCT_OFFSET (LapizFileBrowserStoreClass,((glong) __builtin_offsetof(LapizFileBrowserStoreClass, begin_refresh )) |
400 | begin_refresh)((glong) __builtin_offsetof(LapizFileBrowserStoreClass, begin_refresh )), NULL((void*)0), NULL((void*)0), |
401 | g_cclosure_marshal_VOID__VOID, |
402 | G_TYPE_NONE((GType) ((1) << (2))), 0); |
403 | model_signals[END_REFRESH] = |
404 | g_signal_new ("end-refresh", |
405 | G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)), |
406 | G_SIGNAL_RUN_LAST, |
407 | G_STRUCT_OFFSET (LapizFileBrowserStoreClass,((glong) __builtin_offsetof(LapizFileBrowserStoreClass, end_refresh )) |
408 | end_refresh)((glong) __builtin_offsetof(LapizFileBrowserStoreClass, end_refresh )), NULL((void*)0), NULL((void*)0), |
409 | g_cclosure_marshal_VOID__VOID, |
410 | G_TYPE_NONE((GType) ((1) << (2))), 0); |
411 | model_signals[UNLOAD] = |
412 | g_signal_new ("unload", |
413 | G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)), |
414 | G_SIGNAL_RUN_LAST, |
415 | G_STRUCT_OFFSET (LapizFileBrowserStoreClass,((glong) __builtin_offsetof(LapizFileBrowserStoreClass, unload )) |
416 | unload)((glong) __builtin_offsetof(LapizFileBrowserStoreClass, unload )), NULL((void*)0), NULL((void*)0), |
417 | g_cclosure_marshal_VOID__STRING, |
418 | G_TYPE_NONE((GType) ((1) << (2))), 1, |
419 | G_TYPE_STRING((GType) ((16) << (2)))); |
420 | } |
421 | |
422 | static void |
423 | lapiz_file_browser_store_class_finalize (LapizFileBrowserStoreClass *klass G_GNUC_UNUSED__attribute__ ((__unused__))) |
424 | { |
425 | /* dummy function - used by G_DEFINE_DYNAMIC_TYPE_EXTENDED */ |
426 | } |
427 | |
428 | static void |
429 | lapiz_file_browser_store_iface_init (CtkTreeModelIface * iface) |
430 | { |
431 | iface->get_flags = lapiz_file_browser_store_get_flags; |
432 | iface->get_n_columns = lapiz_file_browser_store_get_n_columns; |
433 | iface->get_column_type = lapiz_file_browser_store_get_column_type; |
434 | iface->get_iter = lapiz_file_browser_store_get_iter; |
435 | iface->get_path = lapiz_file_browser_store_get_path; |
436 | iface->get_value = lapiz_file_browser_store_get_value; |
437 | iface->iter_next = lapiz_file_browser_store_iter_next; |
438 | iface->iter_children = lapiz_file_browser_store_iter_children; |
439 | iface->iter_has_child = lapiz_file_browser_store_iter_has_child; |
440 | iface->iter_n_children = lapiz_file_browser_store_iter_n_children; |
441 | iface->iter_nth_child = lapiz_file_browser_store_iter_nth_child; |
442 | iface->iter_parent = lapiz_file_browser_store_iter_parent; |
443 | iface->row_inserted = lapiz_file_browser_store_row_inserted; |
444 | } |
445 | |
446 | static void |
447 | lapiz_file_browser_store_drag_source_init (CtkTreeDragSourceIface * iface) |
448 | { |
449 | iface->row_draggable = lapiz_file_browser_store_row_draggable; |
450 | iface->drag_data_delete = lapiz_file_browser_store_drag_data_delete; |
451 | iface->drag_data_get = lapiz_file_browser_store_drag_data_get; |
452 | } |
453 | |
454 | static void |
455 | lapiz_file_browser_store_init (LapizFileBrowserStore * obj) |
456 | { |
457 | obj->priv = lapiz_file_browser_store_get_instance_private (obj); |
458 | |
459 | obj->priv->column_types[LAPIZ_FILE_BROWSER_STORE_COLUMN_URI] = |
460 | G_TYPE_STRING((GType) ((16) << (2))); |
461 | obj->priv->column_types[LAPIZ_FILE_BROWSER_STORE_COLUMN_NAME] = |
462 | G_TYPE_STRING((GType) ((16) << (2))); |
463 | obj->priv->column_types[LAPIZ_FILE_BROWSER_STORE_COLUMN_FLAGS] = |
464 | G_TYPE_UINT((GType) ((7) << (2))); |
465 | obj->priv->column_types[LAPIZ_FILE_BROWSER_STORE_COLUMN_ICON] = |
466 | GDK_TYPE_PIXBUF(gdk_pixbuf_get_type ()); |
467 | obj->priv->column_types[LAPIZ_FILE_BROWSER_STORE_COLUMN_EMBLEM] = |
468 | GDK_TYPE_PIXBUF(gdk_pixbuf_get_type ()); |
469 | |
470 | // Default filter mode is hiding the hidden files |
471 | obj->priv->filter_mode = lapiz_file_browser_store_filter_mode_get_default (); |
472 | obj->priv->sort_func = model_sort_default; |
473 | } |
474 | |
475 | static gboolean |
476 | node_has_parent (FileBrowserNode * node, FileBrowserNode * parent) |
477 | { |
478 | if (node->parent == NULL((void*)0)) |
479 | return FALSE(0); |
480 | |
481 | if (node->parent == parent) |
482 | return TRUE(!(0)); |
483 | |
484 | return node_has_parent (node->parent, parent); |
485 | } |
486 | |
487 | static gboolean |
488 | node_in_tree (LapizFileBrowserStore * model, FileBrowserNode * node) |
489 | { |
490 | return node_has_parent (node, model->priv->virtual_root); |
491 | } |
492 | |
493 | static gboolean |
494 | model_node_visibility (LapizFileBrowserStore * model, |
495 | FileBrowserNode * node) |
496 | { |
497 | if (node == NULL((void*)0)) |
498 | return FALSE(0); |
499 | |
500 | if (NODE_IS_DUMMY (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY ))) |
501 | return !NODE_IS_HIDDEN (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN )); |
502 | |
503 | if (node == model->priv->virtual_root) |
504 | return TRUE(!(0)); |
505 | |
506 | if (!node_has_parent (node, model->priv->virtual_root)) |
507 | return FALSE(0); |
508 | |
509 | return !NODE_IS_FILTERED (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_FILTERED )); |
510 | } |
511 | |
512 | static gboolean |
513 | model_node_inserted (LapizFileBrowserStore * model, |
514 | FileBrowserNode * node) |
515 | { |
516 | return node == model->priv->virtual_root || (model_node_visibility (model, node) && node->inserted); |
517 | } |
518 | |
519 | /* Interface implementation */ |
520 | |
521 | static CtkTreeModelFlags |
522 | lapiz_file_browser_store_get_flags (CtkTreeModel * tree_model) |
523 | { |
524 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((CtkTreeModelFlags) 0); } } while (0) |
525 | (CtkTreeModelFlags) 0)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((CtkTreeModelFlags) 0); } } while (0); |
526 | |
527 | return CTK_TREE_MODEL_ITERS_PERSIST; |
528 | } |
529 | |
530 | static gint |
531 | lapiz_file_browser_store_get_n_columns (CtkTreeModel * tree_model) |
532 | { |
533 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model), 0)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return (0); } } while (0); |
534 | |
535 | return LAPIZ_FILE_BROWSER_STORE_COLUMN_NUM; |
536 | } |
537 | |
538 | static GType |
539 | lapiz_file_browser_store_get_column_type (CtkTreeModel * tree_model, gint idx) |
540 | { |
541 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return (((GType) ((0) << (2)))); } } while (0) |
542 | G_TYPE_INVALID)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return (((GType) ((0) << (2)))); } } while (0); |
543 | g_return_val_if_fail (idx < LAPIZ_FILE_BROWSER_STORE_COLUMN_NUM &&do { if ((idx < LAPIZ_FILE_BROWSER_STORE_COLUMN_NUM && idx >= 0)) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "idx < LAPIZ_FILE_BROWSER_STORE_COLUMN_NUM && idx >= 0" ); return (((GType) ((0) << (2)))); } } while (0) |
544 | idx >= 0, G_TYPE_INVALID)do { if ((idx < LAPIZ_FILE_BROWSER_STORE_COLUMN_NUM && idx >= 0)) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "idx < LAPIZ_FILE_BROWSER_STORE_COLUMN_NUM && idx >= 0" ); return (((GType) ((0) << (2)))); } } while (0); |
545 | |
546 | return LAPIZ_FILE_BROWSER_STORE (tree_model)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((tree_model)), ((lapiz_file_browser_store_get_type ()))))))->priv->column_types[idx]; |
547 | } |
548 | |
549 | static gboolean |
550 | lapiz_file_browser_store_get_iter (CtkTreeModel * tree_model, |
551 | CtkTreeIter * iter, CtkTreePath * path) |
552 | { |
553 | gint * indices, depth, i; |
554 | FileBrowserNode * node; |
555 | LapizFileBrowserStore * model; |
556 | gint num; |
557 | |
558 | g_assert (LAPIZ_IS_FILE_BROWSER_STORE (tree_model))do { if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) ; else g_assertion_message_expr (((gchar*) 0), "lapiz-file-browser-store.c" , 558, ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); } while (0); |
559 | g_assert (path != NULL)do { if (path != ((void*)0)) ; else g_assertion_message_expr ( ((gchar*) 0), "lapiz-file-browser-store.c", 559, ((const char *) (__func__)), "path != NULL"); } while (0); |
560 | |
561 | model = LAPIZ_FILE_BROWSER_STORE (tree_model)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((tree_model)), ((lapiz_file_browser_store_get_type ())))))); |
562 | indices = ctk_tree_path_get_indices (path); |
563 | depth = ctk_tree_path_get_depth (path); |
564 | node = model->priv->virtual_root; |
565 | |
566 | for (i = 0; i < depth; ++i) { |
567 | GSList * item; |
568 | |
569 | if (node == NULL((void*)0)) |
570 | return FALSE(0); |
571 | |
572 | num = 0; |
573 | |
574 | if (!NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) |
575 | return FALSE(0); |
576 | |
577 | for (item = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children; item; item = item->next) { |
578 | FileBrowserNode * child; |
579 | |
580 | child = (FileBrowserNode *) (item->data); |
581 | |
582 | if (model_node_inserted (model, child)) { |
583 | if (num == indices[i]) { |
584 | node = child; |
585 | break; |
586 | } |
587 | |
588 | num++; |
589 | } |
590 | } |
591 | |
592 | if (item == NULL((void*)0)) |
593 | return FALSE(0); |
594 | |
595 | node = (FileBrowserNode *) (item->data); |
596 | } |
597 | |
598 | iter->user_data = node; |
599 | iter->user_data2 = NULL((void*)0); |
600 | iter->user_data3 = NULL((void*)0); |
601 | |
602 | return node != NULL((void*)0); |
603 | } |
604 | |
605 | static CtkTreePath * |
606 | lapiz_file_browser_store_get_path_real (LapizFileBrowserStore * model, |
607 | FileBrowserNode * node) |
608 | { |
609 | CtkTreePath *path; |
610 | gint num = 0; |
611 | |
612 | path = ctk_tree_path_new (); |
613 | |
614 | while (node != model->priv->virtual_root) { |
615 | GSList *item; |
616 | |
617 | if (node->parent == NULL((void*)0)) { |
618 | ctk_tree_path_free (path); |
619 | return NULL((void*)0); |
620 | } |
621 | |
622 | num = 0; |
623 | |
624 | for (item = FILE_BROWSER_NODE_DIR (node->parent)((FileBrowserNodeDir *)(node->parent))->children; item; item = item->next) { |
625 | FileBrowserNode *check; |
626 | |
627 | check = (FileBrowserNode *) (item->data); |
628 | |
629 | if (model_node_visibility (model, check) && (check == node || check->inserted)) { |
630 | if (check == node) { |
631 | ctk_tree_path_prepend_index (path, |
632 | num); |
633 | break; |
634 | } |
635 | |
636 | ++num; |
637 | } else if (check == node) { |
638 | if (NODE_IS_DUMMY (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY ))) |
639 | g_warning ("Dummy not visible???"); |
640 | |
641 | ctk_tree_path_free (path); |
642 | return NULL((void*)0); |
643 | } |
644 | } |
645 | |
646 | node = node->parent; |
647 | } |
648 | |
649 | return path; |
650 | } |
651 | |
652 | static CtkTreePath * |
653 | lapiz_file_browser_store_get_path (CtkTreeModel * tree_model, |
654 | CtkTreeIter * iter) |
655 | { |
656 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return (((void*)0)); } } while (0); |
657 | g_return_val_if_fail (iter != NULL, NULL)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return (((void*)0)); } } while (0); |
658 | g_return_val_if_fail (iter->user_data != NULL, NULL)do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return (((void*)0)); } } while (0); |
659 | |
660 | return lapiz_file_browser_store_get_path_real (LAPIZ_FILE_BROWSER_STORE (tree_model)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((tree_model)), ((lapiz_file_browser_store_get_type ())))))), |
661 | (FileBrowserNode *) (iter->user_data)); |
662 | } |
663 | |
664 | static void |
665 | lapiz_file_browser_store_get_value (CtkTreeModel * tree_model, |
666 | CtkTreeIter * iter, |
667 | gint column, |
668 | GValue * value) |
669 | { |
670 | FileBrowserNode *node; |
671 | |
672 | g_return_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return; } } while (0); |
673 | g_return_if_fail (iter != NULL)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ; } } while (0); |
674 | g_return_if_fail (iter->user_data != NULL)do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return; } } while (0); |
675 | |
676 | node = (FileBrowserNode *) (iter->user_data); |
677 | |
678 | g_value_init (value, LAPIZ_FILE_BROWSER_STORE (tree_model)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((tree_model)), ((lapiz_file_browser_store_get_type ()))))))->priv->column_types[column]); |
679 | |
680 | switch (column) { |
681 | case LAPIZ_FILE_BROWSER_STORE_COLUMN_URI: |
682 | set_gvalue_from_node (value, node); |
683 | break; |
684 | case LAPIZ_FILE_BROWSER_STORE_COLUMN_NAME: |
685 | g_value_set_string (value, node->name); |
686 | break; |
687 | case LAPIZ_FILE_BROWSER_STORE_COLUMN_FLAGS: |
688 | g_value_set_uint (value, node->flags); |
689 | break; |
690 | case LAPIZ_FILE_BROWSER_STORE_COLUMN_ICON: |
691 | g_value_set_object (value, node->icon); |
692 | break; |
693 | case LAPIZ_FILE_BROWSER_STORE_COLUMN_EMBLEM: |
694 | g_value_set_object (value, node->emblem); |
695 | break; |
696 | default: |
697 | g_return_if_reached ()do { g_log (((gchar*) 0), G_LOG_LEVEL_CRITICAL, "file %s: line %d (%s): should not be reached" , "lapiz-file-browser-store.c", 697, ((const char*) (__func__ ))); return; } while (0); |
698 | } |
699 | } |
700 | |
701 | static gboolean |
702 | lapiz_file_browser_store_iter_next (CtkTreeModel * tree_model, |
703 | CtkTreeIter * iter) |
704 | { |
705 | LapizFileBrowserStore * model; |
706 | FileBrowserNode * node; |
707 | GSList * item; |
708 | GSList * first; |
709 | |
710 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0) |
711 | FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0); |
712 | g_return_val_if_fail (iter != NULL, FALSE)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ((0)); } } while (0); |
713 | g_return_val_if_fail (iter->user_data != NULL, FALSE)do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return ((0)); } } while (0); |
714 | |
715 | model = LAPIZ_FILE_BROWSER_STORE (tree_model)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((tree_model)), ((lapiz_file_browser_store_get_type ())))))); |
716 | node = (FileBrowserNode *) (iter->user_data); |
717 | |
718 | if (node->parent == NULL((void*)0)) |
719 | return FALSE(0); |
720 | |
721 | first = g_slist_next (g_slist_find (FILE_BROWSER_NODE_DIR (node->parent)->children, node))((g_slist_find (((FileBrowserNodeDir *)(node->parent))-> children, node)) ? (((GSList *)(g_slist_find (((FileBrowserNodeDir *)(node->parent))->children, node)))->next) : ((void *)0)); |
722 | |
723 | for (item = first; item; item = item->next) { |
724 | if (model_node_inserted (model, (FileBrowserNode *) (item->data))) { |
725 | iter->user_data = item->data; |
726 | return TRUE(!(0)); |
727 | } |
728 | } |
729 | |
730 | return FALSE(0); |
731 | } |
732 | |
733 | static gboolean |
734 | lapiz_file_browser_store_iter_children (CtkTreeModel * tree_model, |
735 | CtkTreeIter * iter, |
736 | CtkTreeIter * parent) |
737 | { |
738 | FileBrowserNode * node; |
739 | LapizFileBrowserStore * model; |
740 | GSList * item; |
741 | |
742 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0) |
743 | FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0); |
744 | g_return_val_if_fail (parent == NULLdo { if ((parent == ((void*)0) || parent->user_data != ((void *)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "parent == NULL || parent->user_data != NULL" ); return ((0)); } } while (0) |
745 | || parent->user_data != NULL, FALSE)do { if ((parent == ((void*)0) || parent->user_data != ((void *)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "parent == NULL || parent->user_data != NULL" ); return ((0)); } } while (0); |
746 | |
747 | model = LAPIZ_FILE_BROWSER_STORE (tree_model)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((tree_model)), ((lapiz_file_browser_store_get_type ())))))); |
748 | |
749 | if (parent == NULL((void*)0)) |
750 | node = model->priv->virtual_root; |
751 | else |
752 | node = (FileBrowserNode *) (parent->user_data); |
753 | |
754 | if (node == NULL((void*)0)) |
755 | return FALSE(0); |
756 | |
757 | if (!NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) |
758 | return FALSE(0); |
759 | |
760 | for (item = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children; item; item = item->next) { |
761 | if (model_node_inserted (model, (FileBrowserNode *) (item->data))) { |
762 | iter->user_data = item->data; |
763 | return TRUE(!(0)); |
764 | } |
765 | } |
766 | |
767 | return FALSE(0); |
768 | } |
769 | |
770 | static gboolean |
771 | filter_tree_model_iter_has_child_real (LapizFileBrowserStore * model, |
772 | FileBrowserNode * node) |
773 | { |
774 | GSList *item; |
775 | |
776 | if (!NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) |
777 | return FALSE(0); |
778 | |
779 | for (item = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children; item; item = item->next) { |
780 | if (model_node_inserted (model, (FileBrowserNode *) (item->data))) |
781 | return TRUE(!(0)); |
782 | } |
783 | |
784 | return FALSE(0); |
785 | } |
786 | |
787 | static gboolean |
788 | lapiz_file_browser_store_iter_has_child (CtkTreeModel * tree_model, |
789 | CtkTreeIter * iter) |
790 | { |
791 | FileBrowserNode *node; |
792 | LapizFileBrowserStore *model; |
793 | |
794 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0) |
795 | FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0); |
796 | g_return_val_if_fail (iter == NULLdo { if ((iter == ((void*)0) || iter->user_data != ((void* )0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter == NULL || iter->user_data != NULL" ); return ((0)); } } while (0) |
797 | || iter->user_data != NULL, FALSE)do { if ((iter == ((void*)0) || iter->user_data != ((void* )0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter == NULL || iter->user_data != NULL" ); return ((0)); } } while (0); |
798 | |
799 | model = LAPIZ_FILE_BROWSER_STORE (tree_model)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((tree_model)), ((lapiz_file_browser_store_get_type ())))))); |
800 | |
801 | if (iter == NULL((void*)0)) |
802 | node = model->priv->virtual_root; |
803 | else |
804 | node = (FileBrowserNode *) (iter->user_data); |
805 | |
806 | return filter_tree_model_iter_has_child_real (model, node); |
807 | } |
808 | |
809 | static gint |
810 | lapiz_file_browser_store_iter_n_children (CtkTreeModel * tree_model, |
811 | CtkTreeIter * iter) |
812 | { |
813 | FileBrowserNode *node; |
814 | LapizFileBrowserStore *model; |
815 | GSList *item; |
816 | gint num = 0; |
817 | |
818 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0) |
819 | FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0); |
820 | g_return_val_if_fail (iter == NULLdo { if ((iter == ((void*)0) || iter->user_data != ((void* )0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter == NULL || iter->user_data != NULL" ); return ((0)); } } while (0) |
821 | || iter->user_data != NULL, FALSE)do { if ((iter == ((void*)0) || iter->user_data != ((void* )0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter == NULL || iter->user_data != NULL" ); return ((0)); } } while (0); |
822 | |
823 | model = LAPIZ_FILE_BROWSER_STORE (tree_model)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((tree_model)), ((lapiz_file_browser_store_get_type ())))))); |
824 | |
825 | if (iter == NULL((void*)0)) |
826 | node = model->priv->virtual_root; |
827 | else |
828 | node = (FileBrowserNode *) (iter->user_data); |
829 | |
830 | if (!NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) |
831 | return 0; |
832 | |
833 | for (item = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children; item; item = item->next) |
834 | if (model_node_inserted (model, (FileBrowserNode *) (item->data))) |
835 | ++num; |
836 | |
837 | return num; |
838 | } |
839 | |
840 | static gboolean |
841 | lapiz_file_browser_store_iter_nth_child (CtkTreeModel * tree_model, |
842 | CtkTreeIter * iter, |
843 | CtkTreeIter * parent, gint n) |
844 | { |
845 | FileBrowserNode *node; |
846 | LapizFileBrowserStore *model; |
847 | GSList *item; |
848 | gint num = 0; |
849 | |
850 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0) |
851 | FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0); |
852 | g_return_val_if_fail (parent == NULLdo { if ((parent == ((void*)0) || parent->user_data != ((void *)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "parent == NULL || parent->user_data != NULL" ); return ((0)); } } while (0) |
853 | || parent->user_data != NULL, FALSE)do { if ((parent == ((void*)0) || parent->user_data != ((void *)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "parent == NULL || parent->user_data != NULL" ); return ((0)); } } while (0); |
854 | |
855 | model = LAPIZ_FILE_BROWSER_STORE (tree_model)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((tree_model)), ((lapiz_file_browser_store_get_type ())))))); |
856 | |
857 | if (parent == NULL((void*)0)) |
858 | node = model->priv->virtual_root; |
859 | else |
860 | node = (FileBrowserNode *) (parent->user_data); |
861 | |
862 | if (!NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) |
863 | return FALSE(0); |
864 | |
865 | for (item = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children; item; |
866 | item = item->next) { |
867 | if (model_node_inserted (model, (FileBrowserNode *) (item->data))) { |
868 | if (num == n) { |
869 | iter->user_data = item->data; |
870 | return TRUE(!(0)); |
871 | } |
872 | |
873 | ++num; |
874 | } |
875 | } |
876 | |
877 | return FALSE(0); |
878 | } |
879 | |
880 | static gboolean |
881 | lapiz_file_browser_store_iter_parent (CtkTreeModel * tree_model, |
882 | CtkTreeIter * iter, |
883 | CtkTreeIter * child) |
884 | { |
885 | FileBrowserNode *node; |
886 | LapizFileBrowserStore *model; |
887 | |
888 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return ((0)); } } while (0); |
889 | g_return_val_if_fail (child != NULL, FALSE)do { if ((child != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "child != NULL"); return ((0)); } } while (0); |
890 | g_return_val_if_fail (child->user_data != NULL, FALSE)do { if ((child->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "child->user_data != NULL" ); return ((0)); } } while (0); |
891 | |
892 | node = (FileBrowserNode *) (child->user_data); |
893 | model = LAPIZ_FILE_BROWSER_STORE (tree_model)((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((tree_model)), ((lapiz_file_browser_store_get_type ())))))); |
894 | |
895 | if (!node_in_tree (model, node)) |
896 | return FALSE(0); |
897 | |
898 | if (node->parent == NULL((void*)0)) |
899 | return FALSE(0); |
900 | |
901 | iter->user_data = node->parent; |
902 | return TRUE(!(0)); |
903 | } |
904 | |
905 | static void |
906 | lapiz_file_browser_store_row_inserted (CtkTreeModel *tree_model G_GNUC_UNUSED__attribute__ ((__unused__)), |
907 | CtkTreePath *path G_GNUC_UNUSED__attribute__ ((__unused__)), |
908 | CtkTreeIter *iter) |
909 | { |
910 | FileBrowserNode * node = (FileBrowserNode *)(iter->user_data); |
911 | |
912 | node->inserted = TRUE(!(0)); |
913 | } |
914 | |
915 | static gboolean |
916 | lapiz_file_browser_store_row_draggable (CtkTreeDragSource * drag_source, |
917 | CtkTreePath * path) |
918 | { |
919 | CtkTreeIter iter; |
920 | LapizFileBrowserStoreFlag flags; |
921 | |
922 | if (!ctk_tree_model_get_iter (CTK_TREE_MODEL (drag_source)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((drag_source)), ((ctk_tree_model_get_type ())))))), |
923 | &iter, path)) |
924 | { |
925 | return FALSE(0); |
926 | } |
927 | |
928 | ctk_tree_model_get (CTK_TREE_MODEL (drag_source)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((drag_source)), ((ctk_tree_model_get_type ())))))), &iter, |
929 | LAPIZ_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags, |
930 | -1); |
931 | |
932 | return !FILE_IS_DUMMY(flags)(flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY); |
933 | } |
934 | |
935 | static gboolean |
936 | lapiz_file_browser_store_drag_data_delete (CtkTreeDragSource *drag_source G_GNUC_UNUSED__attribute__ ((__unused__)), |
937 | CtkTreePath *path G_GNUC_UNUSED__attribute__ ((__unused__))) |
938 | { |
939 | return FALSE(0); |
940 | } |
941 | |
942 | static gboolean |
943 | lapiz_file_browser_store_drag_data_get (CtkTreeDragSource * drag_source, |
944 | CtkTreePath * path, |
945 | CtkSelectionData * selection_data) |
946 | { |
947 | CtkTreeIter iter; |
948 | gchar *uri; |
949 | gchar *uris[2] = {0, }; |
950 | gboolean ret; |
951 | |
952 | if (!ctk_tree_model_get_iter (CTK_TREE_MODEL (drag_source)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((drag_source)), ((ctk_tree_model_get_type ())))))), |
953 | &iter, path)) |
954 | { |
955 | return FALSE(0); |
956 | } |
957 | |
958 | ctk_tree_model_get (CTK_TREE_MODEL (drag_source)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((drag_source)), ((ctk_tree_model_get_type ())))))), &iter, |
959 | LAPIZ_FILE_BROWSER_STORE_COLUMN_URI, &uri, |
960 | -1); |
961 | |
962 | g_assert (uri)do { if (uri) ; else g_assertion_message_expr (((gchar*) 0), "lapiz-file-browser-store.c" , 962, ((const char*) (__func__)), "uri"); } while (0); |
963 | |
964 | uris[0] = uri; |
965 | ret = ctk_selection_data_set_uris (selection_data, uris); |
966 | |
967 | g_free (uri); |
968 | |
969 | return ret; |
970 | } |
971 | |
972 | #define FILTER_HIDDEN(mode)(mode & LAPIZ_FILE_BROWSER_STORE_FILTER_MODE_HIDE_HIDDEN) (mode & LAPIZ_FILE_BROWSER_STORE_FILTER_MODE_HIDE_HIDDEN) |
973 | #define FILTER_BINARY(mode)(mode & LAPIZ_FILE_BROWSER_STORE_FILTER_MODE_HIDE_BINARY) (mode & LAPIZ_FILE_BROWSER_STORE_FILTER_MODE_HIDE_BINARY) |
974 | |
975 | /* Private */ |
976 | static void |
977 | model_begin_loading (LapizFileBrowserStore * model, FileBrowserNode * node) |
978 | { |
979 | CtkTreeIter iter; |
980 | |
981 | iter.user_data = node; |
982 | g_signal_emit (model, model_signals[BEGIN_LOADING], 0, &iter); |
983 | } |
984 | |
985 | static void |
986 | model_end_loading (LapizFileBrowserStore * model, FileBrowserNode * node) |
987 | { |
988 | CtkTreeIter iter; |
989 | |
990 | iter.user_data = node; |
991 | g_signal_emit (model, model_signals[END_LOADING], 0, &iter); |
992 | } |
993 | |
994 | static void |
995 | model_node_update_visibility (LapizFileBrowserStore * model, |
996 | FileBrowserNode * node) |
997 | { |
998 | CtkTreeIter iter; |
999 | |
1000 | node->flags &= ~LAPIZ_FILE_BROWSER_STORE_FLAG_IS_FILTERED; |
1001 | |
1002 | if (FILTER_HIDDEN (model->priv->filter_mode)(model->priv->filter_mode & LAPIZ_FILE_BROWSER_STORE_FILTER_MODE_HIDE_HIDDEN ) && |
1003 | NODE_IS_HIDDEN (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN ))) |
1004 | node->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_IS_FILTERED; |
1005 | else if (FILTER_BINARY (model->priv->filter_mode)(model->priv->filter_mode & LAPIZ_FILE_BROWSER_STORE_FILTER_MODE_HIDE_BINARY ) && |
1006 | (!NODE_IS_TEXT (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_TEXT )) && !NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )))) |
1007 | node->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_IS_FILTERED; |
1008 | else if (model->priv->filter_func) { |
1009 | iter.user_data = node; |
1010 | |
1011 | if (!model->priv-> |
1012 | filter_func (model, &iter, |
1013 | model->priv->filter_user_data)) |
1014 | node->flags |= |
1015 | LAPIZ_FILE_BROWSER_STORE_FLAG_IS_FILTERED; |
1016 | } |
1017 | } |
1018 | |
1019 | static gint |
1020 | collate_nodes (FileBrowserNode * node1, FileBrowserNode * node2) |
1021 | { |
1022 | if (node1->name == NULL((void*)0)) |
1023 | return -1; |
1024 | else if (node2->name == NULL((void*)0)) |
1025 | return 1; |
1026 | else { |
1027 | gchar *k1, *k2; |
1028 | gint result; |
1029 | |
1030 | k1 = g_utf8_collate_key_for_filename (node1->name, -1); |
1031 | k2 = g_utf8_collate_key_for_filename (node2->name, -1); |
1032 | |
1033 | result = strcmp (k1, k2); |
1034 | |
1035 | g_free (k1); |
1036 | g_free (k2); |
1037 | |
1038 | return result; |
1039 | } |
1040 | } |
1041 | |
1042 | static gint |
1043 | model_sort_default (FileBrowserNode * node1, FileBrowserNode * node2) |
1044 | { |
1045 | gint f1; |
1046 | gint f2; |
1047 | |
1048 | f1 = NODE_IS_DUMMY (node1)(((node1)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY )); |
1049 | f2 = NODE_IS_DUMMY (node2)(((node2)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY )); |
1050 | |
1051 | if (f1 && f2) |
1052 | { |
1053 | return 0; |
1054 | } |
1055 | else if (f1 || f2) |
1056 | { |
1057 | return f1 ? -1 : 1; |
1058 | } |
1059 | |
1060 | f1 = NODE_IS_DIR (node1)(((node1)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )); |
1061 | f2 = NODE_IS_DIR (node2)(((node2)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )); |
1062 | |
1063 | if (f1 != f2) |
1064 | { |
1065 | return f1 ? -1 : 1; |
1066 | } |
1067 | |
1068 | f1 = NODE_IS_HIDDEN (node1)(((node1)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN )); |
1069 | f2 = NODE_IS_HIDDEN (node2)(((node2)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN )); |
1070 | |
1071 | if (f1 != f2) |
1072 | { |
1073 | return f2 ? -1 : 1; |
1074 | } |
1075 | |
1076 | return collate_nodes (node1, node2); |
1077 | } |
1078 | |
1079 | static void |
1080 | model_resort_node (LapizFileBrowserStore * model, FileBrowserNode * node) |
1081 | { |
1082 | FileBrowserNodeDir *dir; |
1083 | GSList *item; |
1084 | FileBrowserNode *child; |
1085 | gint pos = 0; |
1086 | CtkTreeIter iter; |
1087 | CtkTreePath *path; |
1088 | gint *neworder; |
1089 | |
1090 | dir = FILE_BROWSER_NODE_DIR (node->parent)((FileBrowserNodeDir *)(node->parent)); |
1091 | |
1092 | if (!model_node_visibility (model, node->parent)) { |
1093 | /* Just sort the children of the parent */ |
1094 | dir->children = g_slist_sort (dir->children, |
1095 | (GCompareFunc) (model->priv-> |
1096 | sort_func)); |
1097 | } else { |
1098 | /* Store current positions */ |
1099 | for (item = dir->children; item; item = item->next) { |
1100 | child = (FileBrowserNode *) (item->data); |
1101 | |
1102 | if (model_node_visibility (model, child)) |
1103 | child->pos = pos++; |
1104 | } |
1105 | |
1106 | dir->children = g_slist_sort (dir->children, |
1107 | (GCompareFunc) (model->priv-> |
1108 | sort_func)); |
1109 | neworder = g_new (gint, pos)((gint *) g_malloc_n ((pos), sizeof (gint))); |
1110 | pos = 0; |
1111 | |
1112 | /* Store the new positions */ |
1113 | for (item = dir->children; item; item = item->next) { |
1114 | child = (FileBrowserNode *) (item->data); |
1115 | |
1116 | if (model_node_visibility (model, child)) |
1117 | neworder[pos++] = child->pos; |
1118 | } |
1119 | |
1120 | iter.user_data = node->parent; |
1121 | path = |
1122 | lapiz_file_browser_store_get_path_real (model, |
1123 | node->parent); |
1124 | |
1125 | ctk_tree_model_rows_reordered (CTK_TREE_MODEL (model)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), ((ctk_tree_model_get_type ())))))), |
1126 | path, &iter, neworder); |
1127 | |
1128 | g_free (neworder); |
1129 | ctk_tree_path_free (path); |
1130 | } |
1131 | } |
1132 | |
1133 | static void |
1134 | row_changed (LapizFileBrowserStore * model, |
1135 | CtkTreePath ** path, |
1136 | CtkTreeIter * iter) |
1137 | { |
1138 | CtkTreeRowReference *ref = ctk_tree_row_reference_new (CTK_TREE_MODEL (model)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), ((ctk_tree_model_get_type ())))))), *path); |
1139 | |
1140 | /* Insert a copy of the actual path here because the row-inserted |
1141 | signal may alter the path */ |
1142 | ctk_tree_model_row_changed (CTK_TREE_MODEL(model)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), ((ctk_tree_model_get_type ())))))), *path, iter); |
1143 | ctk_tree_path_free (*path); |
1144 | |
1145 | *path = ctk_tree_row_reference_get_path (ref); |
1146 | ctk_tree_row_reference_free (ref); |
1147 | } |
1148 | |
1149 | static void |
1150 | row_inserted (LapizFileBrowserStore * model, |
1151 | CtkTreePath ** path, |
1152 | CtkTreeIter * iter) |
1153 | { |
1154 | /* This function creates a row reference for the path because it's |
1155 | uncertain what might change the actual model/view when we insert |
1156 | a node, maybe another directory load is triggered for example. |
1157 | Because functions that use this function rely on the notion that |
1158 | the path remains pointed towards the inserted node, we use the |
1159 | reference to keep track. */ |
1160 | CtkTreeRowReference *ref = ctk_tree_row_reference_new (CTK_TREE_MODEL (model)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), ((ctk_tree_model_get_type ())))))), *path); |
1161 | CtkTreePath * copy = ctk_tree_path_copy (*path); |
1162 | |
1163 | ctk_tree_model_row_inserted (CTK_TREE_MODEL(model)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), ((ctk_tree_model_get_type ())))))), copy, iter); |
1164 | ctk_tree_path_free (copy); |
1165 | |
1166 | if (ref) |
1167 | { |
1168 | ctk_tree_path_free (*path); |
1169 | |
1170 | /* To restore the path, we get the path from the reference. But, since |
1171 | we inserted a row, the path will be one index further than the |
1172 | actual path of our node. We therefore call ctk_tree_path_prev */ |
1173 | *path = ctk_tree_row_reference_get_path (ref); |
1174 | ctk_tree_path_prev (*path); |
1175 | } |
1176 | |
1177 | ctk_tree_row_reference_free (ref); |
1178 | } |
1179 | |
1180 | static void |
1181 | row_deleted (LapizFileBrowserStore * model, |
1182 | const CtkTreePath * path) |
1183 | { |
1184 | CtkTreePath *copy = ctk_tree_path_copy (path); |
1185 | |
1186 | /* Delete a copy of the actual path here because the row-deleted |
1187 | signal may alter the path */ |
1188 | ctk_tree_model_row_deleted (CTK_TREE_MODEL(model)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), ((ctk_tree_model_get_type ())))))), copy); |
1189 | ctk_tree_path_free (copy); |
1190 | } |
1191 | |
1192 | static void |
1193 | model_refilter_node (LapizFileBrowserStore * model, |
1194 | FileBrowserNode * node, |
1195 | CtkTreePath ** path) |
1196 | { |
1197 | gboolean old_visible; |
1198 | gboolean new_visible; |
1199 | FileBrowserNodeDir *dir; |
1200 | GSList *item; |
1201 | CtkTreeIter iter; |
1202 | CtkTreePath *tmppath = NULL((void*)0); |
1203 | gboolean in_tree; |
1204 | |
1205 | if (node == NULL((void*)0)) |
1206 | return; |
1207 | |
1208 | old_visible = model_node_visibility (model, node); |
1209 | model_node_update_visibility (model, node); |
1210 | |
1211 | in_tree = node_in_tree (model, node); |
1212 | |
1213 | if (path == NULL((void*)0)) |
1214 | { |
1215 | if (in_tree) |
1216 | tmppath = lapiz_file_browser_store_get_path_real (model, |
1217 | node); |
1218 | else |
1219 | tmppath = ctk_tree_path_new_first (); |
1220 | |
1221 | path = &tmppath; |
1222 | } |
1223 | |
1224 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) { |
1225 | if (in_tree) |
1226 | ctk_tree_path_down (*path); |
1227 | |
1228 | dir = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node)); |
1229 | |
1230 | for (item = dir->children; item; item = item->next) { |
1231 | model_refilter_node (model, |
1232 | (FileBrowserNode *) (item->data), |
1233 | path); |
1234 | } |
1235 | |
1236 | if (in_tree) |
1237 | ctk_tree_path_up (*path); |
1238 | } |
1239 | |
1240 | if (in_tree) { |
1241 | new_visible = model_node_visibility (model, node); |
1242 | |
1243 | if (old_visible != new_visible) { |
1244 | if (old_visible) { |
1245 | node->inserted = FALSE(0); |
1246 | row_deleted (model, *path); |
1247 | } else { |
1248 | iter.user_data = node; |
1249 | row_inserted (model, path, &iter); |
1250 | ctk_tree_path_next (*path); |
1251 | } |
1252 | } else if (old_visible) { |
1253 | ctk_tree_path_next (*path); |
1254 | } |
1255 | } |
1256 | |
1257 | model_check_dummy (model, node); |
1258 | |
1259 | if (tmppath) |
1260 | ctk_tree_path_free (tmppath); |
1261 | } |
1262 | |
1263 | static void |
1264 | model_refilter (LapizFileBrowserStore * model) |
1265 | { |
1266 | model_refilter_node (model, model->priv->root, NULL((void*)0)); |
1267 | } |
1268 | |
1269 | static void |
1270 | file_browser_node_set_name (FileBrowserNode * node) |
1271 | { |
1272 | g_free (node->name); |
1273 | |
1274 | if (node->file) { |
1275 | node->name = lapiz_file_browser_utils_file_basename (node->file); |
1276 | } else { |
1277 | node->name = NULL((void*)0); |
1278 | } |
1279 | } |
1280 | |
1281 | static void |
1282 | file_browser_node_init (FileBrowserNode * node, GFile * file, |
1283 | FileBrowserNode * parent) |
1284 | { |
1285 | if (file != NULL((void*)0)) { |
1286 | node->file = g_object_ref (file)((__typeof__ (file)) (g_object_ref) (file)); |
1287 | file_browser_node_set_name (node); |
1288 | } |
1289 | |
1290 | node->parent = parent; |
1291 | } |
1292 | |
1293 | static FileBrowserNode * |
1294 | file_browser_node_new (GFile * file, FileBrowserNode * parent) |
1295 | { |
1296 | FileBrowserNode *node = g_slice_new0 (FileBrowserNode)((FileBrowserNode*) g_slice_alloc0 (sizeof (FileBrowserNode)) ); |
1297 | |
1298 | file_browser_node_init (node, file, parent); |
1299 | return node; |
1300 | } |
1301 | |
1302 | static FileBrowserNode * |
1303 | file_browser_node_dir_new (LapizFileBrowserStore * model, |
1304 | GFile * file, FileBrowserNode * parent) |
1305 | { |
1306 | FileBrowserNode *node = |
1307 | (FileBrowserNode *) g_slice_new0 (FileBrowserNodeDir)((FileBrowserNodeDir*) g_slice_alloc0 (sizeof (FileBrowserNodeDir ))); |
1308 | |
1309 | file_browser_node_init (node, file, parent); |
1310 | |
1311 | node->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY; |
1312 | |
1313 | FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->model = model; |
1314 | |
1315 | return node; |
1316 | } |
1317 | |
1318 | static void |
1319 | file_browser_node_free_children (LapizFileBrowserStore * model, |
1320 | FileBrowserNode * node) |
1321 | { |
1322 | GSList *item; |
1323 | |
1324 | if (node == NULL((void*)0)) |
1325 | return; |
1326 | |
1327 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) { |
1328 | for (item = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children; item; |
1329 | item = item->next) |
1330 | file_browser_node_free (model, |
1331 | (FileBrowserNode *) (item-> |
1332 | data)); |
1333 | |
1334 | g_slist_free (FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children); |
1335 | FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children = NULL((void*)0); |
1336 | |
1337 | /* This node is no longer loaded */ |
1338 | node->flags &= ~LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED; |
1339 | } |
1340 | } |
1341 | |
1342 | static void |
1343 | file_browser_node_free (LapizFileBrowserStore * model, |
1344 | FileBrowserNode * node) |
1345 | { |
1346 | gchar *uri; |
1347 | |
1348 | if (node == NULL((void*)0)) |
1349 | return; |
1350 | |
1351 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) |
1352 | { |
1353 | FileBrowserNodeDir *dir; |
1354 | |
1355 | dir = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node)); |
1356 | |
1357 | if (dir->cancellable) { |
1358 | g_cancellable_cancel (dir->cancellable); |
1359 | g_object_unref (dir->cancellable); |
1360 | |
1361 | model_end_loading (model, node); |
1362 | } |
1363 | |
1364 | file_browser_node_free_children (model, node); |
1365 | |
1366 | if (dir->monitor) { |
1367 | g_file_monitor_cancel (dir->monitor); |
1368 | g_object_unref (dir->monitor); |
1369 | } |
1370 | } |
1371 | |
1372 | if (node->file) |
1373 | { |
1374 | uri = g_file_get_uri (node->file); |
1375 | g_signal_emit (model, model_signals[UNLOAD], 0, uri); |
1376 | |
1377 | g_free (uri); |
1378 | g_object_unref (node->file); |
1379 | } |
1380 | |
1381 | if (node->icon) |
1382 | g_object_unref (node->icon); |
1383 | |
1384 | if (node->emblem) |
1385 | g_object_unref (node->emblem); |
1386 | |
1387 | g_free (node->name); |
1388 | |
1389 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) |
1390 | g_slice_free (FileBrowserNodeDir, (FileBrowserNodeDir *)node)do { if (1) g_slice_free1 (sizeof (FileBrowserNodeDir), ((FileBrowserNodeDir *)node)); else (void) ((FileBrowserNodeDir*) 0 == ((FileBrowserNodeDir *)node)); } while (0); |
1391 | else |
1392 | g_slice_free (FileBrowserNode, (FileBrowserNode *)node)do { if (1) g_slice_free1 (sizeof (FileBrowserNode), ((FileBrowserNode *)node)); else (void) ((FileBrowserNode*) 0 == ((FileBrowserNode *)node)); } while (0); |
1393 | } |
1394 | |
1395 | /** |
1396 | * model_remove_node_children: |
1397 | * @model: the #LapizFileBrowserStore |
1398 | * @node: the FileBrowserNode to remove |
1399 | * @path: the path of the node, or NULL to let the path be calculated |
1400 | * @free_nodes: whether to also remove the nodes from memory |
1401 | * |
1402 | * Removes all the children of node from the model. This function is used |
1403 | * to remove the child nodes from the _model_. Don't use it to just free |
1404 | * a node. |
1405 | **/ |
1406 | static void |
1407 | model_remove_node_children (LapizFileBrowserStore * model, |
1408 | FileBrowserNode * node, |
1409 | CtkTreePath * path, |
1410 | gboolean free_nodes) |
1411 | { |
1412 | FileBrowserNodeDir *dir; |
1413 | CtkTreePath *path_child; |
1414 | GSList *list; |
1415 | GSList *item; |
1416 | |
1417 | if (node == NULL((void*)0) || !NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) |
1418 | return; |
1419 | |
1420 | dir = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node)); |
1421 | |
1422 | if (dir->children == NULL((void*)0)) |
1423 | return; |
1424 | |
1425 | if (!model_node_visibility (model, node)) { |
1426 | // Node is invisible and therefore the children can just |
1427 | // be freed |
1428 | if (free_nodes) |
1429 | file_browser_node_free_children (model, node); |
1430 | |
1431 | return; |
1432 | } |
1433 | |
1434 | if (path == NULL((void*)0)) |
1435 | path_child = |
1436 | lapiz_file_browser_store_get_path_real (model, node); |
1437 | else |
1438 | path_child = ctk_tree_path_copy (path); |
1439 | |
1440 | ctk_tree_path_down (path_child); |
1441 | |
1442 | list = g_slist_copy (dir->children); |
1443 | |
1444 | for (item = list; item; item = item->next) { |
1445 | model_remove_node (model, (FileBrowserNode *) (item->data), |
1446 | path_child, free_nodes); |
1447 | } |
1448 | |
1449 | g_slist_free (list); |
1450 | ctk_tree_path_free (path_child); |
1451 | } |
1452 | |
1453 | /** |
1454 | * model_remove_node: |
1455 | * @model: the #LapizFileBrowserStore |
1456 | * @node: the FileBrowserNode to remove |
1457 | * @path: the path to use to remove this node, or NULL to use the path |
1458 | * calculated from the node itself |
1459 | * @free_nodes: whether to also remove the nodes from memory |
1460 | * |
1461 | * Removes this node and all its children from the model. This function is used |
1462 | * to remove the node from the _model_. Don't use it to just free |
1463 | * a node. |
1464 | **/ |
1465 | static void |
1466 | model_remove_node (LapizFileBrowserStore * model, |
1467 | FileBrowserNode * node, |
1468 | CtkTreePath * path, |
1469 | gboolean free_nodes) |
1470 | { |
1471 | gboolean free_path = FALSE(0); |
1472 | FileBrowserNode *parent; |
1473 | |
1474 | if (path == NULL((void*)0)) { |
1475 | path = |
1476 | lapiz_file_browser_store_get_path_real (model, node); |
1477 | free_path = TRUE(!(0)); |
1478 | } |
1479 | |
1480 | model_remove_node_children (model, node, path, free_nodes); |
1481 | |
1482 | /* Only delete if the node is visible in the tree (but only when it's |
1483 | not the virtual root) */ |
1484 | if (model_node_visibility (model, node) && node != model->priv->virtual_root) |
1485 | { |
1486 | node->inserted = FALSE(0); |
1487 | row_deleted (model, path); |
1488 | } |
1489 | |
1490 | if (free_path) |
1491 | ctk_tree_path_free (path); |
1492 | |
1493 | parent = node->parent; |
1494 | |
1495 | if (free_nodes) { |
1496 | /* Remove the node from the parents children list */ |
1497 | if (parent) |
1498 | FILE_BROWSER_NODE_DIR (node->parent)((FileBrowserNodeDir *)(node->parent))->children = |
1499 | g_slist_remove (FILE_BROWSER_NODE_DIR((FileBrowserNodeDir *)(node->parent)) |
1500 | (node->parent)((FileBrowserNodeDir *)(node->parent))->children, |
1501 | node); |
1502 | } |
1503 | |
1504 | /* If this is the virtual root, than set the parent as the virtual root */ |
1505 | if (node == model->priv->virtual_root) |
1506 | set_virtual_root_from_node (model, parent); |
1507 | else if (parent && model_node_visibility (model, parent) && !(free_nodes && NODE_IS_DUMMY(node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY )))) |
1508 | model_check_dummy (model, parent); |
1509 | |
1510 | /* Now free the node if necessary */ |
1511 | if (free_nodes) |
1512 | file_browser_node_free (model, node); |
1513 | } |
1514 | |
1515 | /** |
1516 | * model_clear: |
1517 | * @model: the #LapizFileBrowserStore |
1518 | * @free_nodes: whether to also remove the nodes from memory |
1519 | * |
1520 | * Removes all nodes from the model. This function is used |
1521 | * to remove all the nodes from the _model_. Don't use it to just free the |
1522 | * nodes in the model. |
1523 | **/ |
1524 | static void |
1525 | model_clear (LapizFileBrowserStore * model, gboolean free_nodes) |
1526 | { |
1527 | CtkTreePath *path; |
1528 | FileBrowserNodeDir *dir; |
1529 | FileBrowserNode *dummy; |
1530 | |
1531 | path = ctk_tree_path_new (); |
1532 | model_remove_node_children (model, model->priv->virtual_root, path, |
1533 | free_nodes); |
1534 | ctk_tree_path_free (path); |
1535 | |
1536 | /* Remove the dummy if there is one */ |
1537 | if (model->priv->virtual_root) { |
1538 | dir = FILE_BROWSER_NODE_DIR (model->priv->virtual_root)((FileBrowserNodeDir *)(model->priv->virtual_root)); |
1539 | |
1540 | if (dir->children != NULL((void*)0)) { |
1541 | dummy = (FileBrowserNode *) (dir->children->data); |
1542 | |
1543 | if (NODE_IS_DUMMY (dummy)(((dummy)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY )) |
1544 | && model_node_visibility (model, dummy)) { |
1545 | path = ctk_tree_path_new_first (); |
1546 | |
1547 | dummy->inserted = FALSE(0); |
1548 | row_deleted (model, path); |
1549 | ctk_tree_path_free (path); |
1550 | } |
1551 | } |
1552 | } |
1553 | } |
1554 | |
1555 | static void |
1556 | file_browser_node_unload (LapizFileBrowserStore * model, |
1557 | FileBrowserNode * node, gboolean remove_children) |
1558 | { |
1559 | FileBrowserNodeDir *dir; |
1560 | |
1561 | if (node == NULL((void*)0)) |
1562 | return; |
1563 | |
1564 | if (!NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )) || !NODE_LOADED (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED ))) |
1565 | return; |
1566 | |
1567 | dir = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node)); |
1568 | |
1569 | if (remove_children) |
1570 | model_remove_node_children (model, node, NULL((void*)0), TRUE(!(0))); |
1571 | |
1572 | if (dir->cancellable) { |
1573 | g_cancellable_cancel (dir->cancellable); |
1574 | g_object_unref (dir->cancellable); |
1575 | |
1576 | model_end_loading (model, node); |
1577 | dir->cancellable = NULL((void*)0); |
1578 | } |
1579 | |
1580 | if (dir->monitor) { |
1581 | g_file_monitor_cancel (dir->monitor); |
1582 | g_object_unref (dir->monitor); |
1583 | |
1584 | dir->monitor = NULL((void*)0); |
1585 | } |
1586 | |
1587 | node->flags &= ~LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED; |
1588 | } |
1589 | |
1590 | static void |
1591 | model_recomposite_icon_real (LapizFileBrowserStore * tree_model, |
1592 | FileBrowserNode * node, |
1593 | GFileInfo * info) |
1594 | { |
1595 | GdkPixbuf *icon; |
1596 | |
1597 | g_return_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return; } } while (0); |
1598 | g_return_if_fail (node != NULL)do { if ((node != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "node != NULL"); return ; } } while (0); |
1599 | |
1600 | if (node->file == NULL((void*)0)) |
1601 | return; |
1602 | |
1603 | if (info) { |
1604 | GIcon *gicon = g_file_info_get_icon (info); |
1605 | if (gicon != NULL((void*)0)) |
1606 | icon = lapiz_file_browser_utils_pixbuf_from_icon (gicon, CTK_ICON_SIZE_MENU); |
1607 | else |
1608 | icon = NULL((void*)0); |
1609 | } else { |
1610 | icon = lapiz_file_browser_utils_pixbuf_from_file (node->file, CTK_ICON_SIZE_MENU); |
1611 | } |
1612 | |
1613 | if (node->icon) |
1614 | g_object_unref (node->icon); |
1615 | |
1616 | if (node->emblem) { |
1617 | gint icon_size; |
1618 | |
1619 | ctk_icon_size_lookup (CTK_ICON_SIZE_MENU, NULL((void*)0), &icon_size); |
1620 | |
1621 | if (icon == NULL((void*)0)) { |
1622 | node->icon = |
1623 | gdk_pixbuf_new (gdk_pixbuf_get_colorspace (node->emblem), |
1624 | gdk_pixbuf_get_has_alpha (node->emblem), |
1625 | gdk_pixbuf_get_bits_per_sample (node->emblem), |
1626 | icon_size, |
1627 | icon_size); |
1628 | } else { |
1629 | node->icon = gdk_pixbuf_copy (icon); |
1630 | g_object_unref (icon); |
1631 | } |
1632 | |
1633 | gdk_pixbuf_composite (node->emblem, node->icon, |
1634 | icon_size - 10, icon_size - 10, 10, |
1635 | 10, icon_size - 10, icon_size - 10, |
1636 | 1, 1, GDK_INTERP_NEAREST, 255); |
1637 | } else { |
1638 | node->icon = icon; |
1639 | } |
1640 | } |
1641 | |
1642 | static void |
1643 | model_recomposite_icon (LapizFileBrowserStore * tree_model, |
1644 | CtkTreeIter * iter) |
1645 | { |
1646 | g_return_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return; } } while (0); |
1647 | g_return_if_fail (iter != NULL)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ; } } while (0); |
1648 | g_return_if_fail (iter->user_data != NULL)do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return; } } while (0); |
1649 | |
1650 | model_recomposite_icon_real (tree_model, |
1651 | (FileBrowserNode *) (iter->user_data), |
1652 | NULL((void*)0)); |
1653 | } |
1654 | |
1655 | static FileBrowserNode * |
1656 | model_create_dummy_node (LapizFileBrowserStore *model G_GNUC_UNUSED__attribute__ ((__unused__)), |
1657 | FileBrowserNode *parent) |
1658 | { |
1659 | FileBrowserNode *dummy; |
1660 | |
1661 | dummy = file_browser_node_new (NULL((void*)0), parent); |
1662 | dummy->name = g_strdup (_("(Empty)"))g_strdup_inline (((char *) g_dgettext ("lapiz", "(Empty)"))); |
1663 | |
1664 | dummy->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY; |
1665 | dummy->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN; |
1666 | |
1667 | return dummy; |
1668 | } |
1669 | |
1670 | static FileBrowserNode * |
1671 | model_add_dummy_node (LapizFileBrowserStore * model, |
1672 | FileBrowserNode * parent) |
1673 | { |
1674 | FileBrowserNode *dummy; |
1675 | |
1676 | dummy = model_create_dummy_node (model, parent); |
1677 | |
1678 | if (model_node_visibility (model, parent)) |
1679 | dummy->flags &= ~LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN; |
1680 | |
1681 | model_add_node (model, dummy, parent); |
1682 | |
1683 | return dummy; |
1684 | } |
1685 | |
1686 | static void |
1687 | model_check_dummy (LapizFileBrowserStore * model, FileBrowserNode * node) |
1688 | { |
1689 | // Hide the dummy child if needed |
1690 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) { |
1691 | FileBrowserNode *dummy; |
1692 | CtkTreeIter iter; |
1693 | CtkTreePath *path; |
1694 | guint flags; |
1695 | FileBrowserNodeDir *dir; |
1696 | |
1697 | dir = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node)); |
1698 | |
1699 | if (dir->children == NULL((void*)0)) { |
1700 | model_add_dummy_node (model, node); |
1701 | return; |
1702 | } |
1703 | |
1704 | dummy = (FileBrowserNode *) (dir->children->data); |
1705 | |
1706 | if (!NODE_IS_DUMMY (dummy)(((dummy)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY ))) { |
1707 | dummy = model_create_dummy_node (model, node); |
1708 | dir->children = g_slist_prepend (dir->children, dummy); |
1709 | } |
1710 | |
1711 | if (!model_node_visibility (model, node)) { |
1712 | dummy->flags |= |
1713 | LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN; |
1714 | return; |
1715 | } |
1716 | |
1717 | /* Temporarily set the node to invisible to check |
1718 | * for real children */ |
1719 | flags = dummy->flags; |
1720 | dummy->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN; |
1721 | |
1722 | if (!filter_tree_model_iter_has_child_real (model, node)) { |
1723 | dummy->flags &= |
1724 | ~LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN; |
1725 | |
1726 | if (FILE_IS_HIDDEN (flags)(flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN)) { |
1727 | // Was hidden, needs to be inserted |
1728 | iter.user_data = dummy; |
1729 | path = |
1730 | lapiz_file_browser_store_get_path_real |
1731 | (model, dummy); |
1732 | |
1733 | row_inserted (model, &path, &iter); |
1734 | ctk_tree_path_free (path); |
1735 | } |
1736 | } else { |
1737 | if (!FILE_IS_HIDDEN (flags)(flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN)) { |
1738 | // Was shown, needs to be removed |
1739 | |
1740 | // To get the path we need to set it to visible temporarily |
1741 | dummy->flags &= |
1742 | ~LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN; |
1743 | path = |
1744 | lapiz_file_browser_store_get_path_real |
1745 | (model, dummy); |
1746 | dummy->flags |= |
1747 | LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN; |
1748 | |
1749 | dummy->inserted = FALSE(0); |
1750 | row_deleted (model, path); |
1751 | ctk_tree_path_free (path); |
1752 | } |
1753 | } |
1754 | } |
1755 | } |
1756 | |
1757 | static void |
1758 | insert_node_sorted (LapizFileBrowserStore * model, |
1759 | FileBrowserNode * child, |
1760 | FileBrowserNode * parent) |
1761 | { |
1762 | FileBrowserNodeDir *dir; |
1763 | |
1764 | dir = FILE_BROWSER_NODE_DIR (parent)((FileBrowserNodeDir *)(parent)); |
1765 | |
1766 | if (model->priv->sort_func == NULL((void*)0)) { |
1767 | dir->children = g_slist_append (dir->children, child); |
1768 | } else { |
1769 | dir->children = |
1770 | g_slist_insert_sorted (dir->children, child, |
1771 | (GCompareFunc) (model->priv-> |
1772 | sort_func)); |
1773 | } |
1774 | } |
1775 | |
1776 | static void |
1777 | model_add_node (LapizFileBrowserStore * model, FileBrowserNode * child, |
1778 | FileBrowserNode * parent) |
1779 | { |
1780 | /* Add child to parents children */ |
1781 | insert_node_sorted (model, child, parent); |
1782 | |
1783 | if (model_node_visibility (model, parent) && |
1784 | model_node_visibility (model, child)) { |
1785 | CtkTreeIter iter; |
1786 | CtkTreePath *path; |
1787 | |
1788 | iter.user_data = child; |
1789 | path = lapiz_file_browser_store_get_path_real (model, child); |
1790 | |
1791 | /* Emit row inserted */ |
1792 | row_inserted (model, &path, &iter); |
1793 | ctk_tree_path_free (path); |
1794 | } |
1795 | |
1796 | model_check_dummy (model, parent); |
1797 | model_check_dummy (model, child); |
1798 | } |
1799 | |
1800 | static void |
1801 | model_add_nodes_batch (LapizFileBrowserStore * model, |
1802 | GSList * children, |
1803 | FileBrowserNode * parent) |
1804 | { |
1805 | GSList *sorted_children; |
1806 | GSList *child; |
1807 | GSList *prev; |
1808 | GSList *l; |
1809 | FileBrowserNodeDir *dir; |
1810 | |
1811 | dir = FILE_BROWSER_NODE_DIR (parent)((FileBrowserNodeDir *)(parent)); |
1812 | |
1813 | sorted_children = g_slist_sort (children, (GCompareFunc) model->priv->sort_func); |
1814 | |
1815 | child = sorted_children; |
1816 | l = dir->children; |
1817 | prev = NULL((void*)0); |
1818 | |
1819 | model_check_dummy (model, parent); |
1820 | |
1821 | while (child) { |
1822 | FileBrowserNode *node = child->data; |
1823 | CtkTreeIter iter; |
1824 | CtkTreePath *path; |
1825 | |
1826 | /* reached the end of the first list, just append the second */ |
1827 | if (l == NULL((void*)0)) { |
1828 | |
1829 | dir->children = g_slist_concat (dir->children, child); |
1830 | |
1831 | for (l = child; l; l = l->next) { |
1832 | if (model_node_visibility (model, parent) && |
1833 | model_node_visibility (model, l->data)) { |
1834 | iter.user_data = l->data; |
1835 | path = lapiz_file_browser_store_get_path_real (model, l->data); |
1836 | |
1837 | // Emit row inserted |
1838 | row_inserted (model, &path, &iter); |
1839 | ctk_tree_path_free (path); |
1840 | } |
1841 | |
1842 | model_check_dummy (model, l->data); |
1843 | } |
1844 | |
1845 | break; |
1846 | } |
1847 | |
1848 | if (model->priv->sort_func (l->data, node) > 0) { |
1849 | GSList *next_child; |
1850 | |
1851 | if (prev == NULL((void*)0)) { |
1852 | /* prepend to the list */ |
1853 | dir->children = g_slist_prepend (dir->children, child); |
1854 | } else { |
1855 | prev->next = child; |
1856 | } |
1857 | |
1858 | next_child = child->next; |
1859 | prev = child; |
1860 | child->next = l; |
1861 | child = next_child; |
1862 | |
1863 | if (model_node_visibility (model, parent) && |
1864 | model_node_visibility (model, node)) { |
1865 | iter.user_data = node; |
1866 | path = lapiz_file_browser_store_get_path_real (model, node); |
1867 | |
1868 | // Emit row inserted |
1869 | row_inserted (model, &path, &iter); |
1870 | ctk_tree_path_free (path); |
1871 | } |
1872 | |
1873 | model_check_dummy (model, node); |
1874 | |
1875 | /* try again at the same l position with the |
1876 | * next child */ |
1877 | } else { |
1878 | |
1879 | /* Move to the next item in the list */ |
1880 | prev = l; |
1881 | l = l->next; |
1882 | } |
1883 | } |
1884 | } |
1885 | |
1886 | static gchar const * |
1887 | backup_content_type (GFileInfo * info) |
1888 | { |
1889 | gchar const * content; |
1890 | |
1891 | if (!g_file_info_get_is_backup (info)) |
1892 | return NULL((void*)0); |
1893 | |
1894 | content = g_file_info_get_content_type (info); |
1895 | |
1896 | if (!content || g_content_type_equals (content, "application/x-trash")) |
1897 | return "text/plain"; |
1898 | |
1899 | return content; |
1900 | } |
1901 | |
1902 | static void |
1903 | file_browser_node_set_from_info (LapizFileBrowserStore * model, |
1904 | FileBrowserNode * node, |
1905 | GFileInfo * info, |
1906 | gboolean isadded) |
1907 | { |
1908 | gchar const * content; |
1909 | gboolean free_info = FALSE(0); |
1910 | CtkTreePath * path; |
1911 | gchar * uri; |
1912 | GError * error = NULL((void*)0); |
1913 | |
1914 | if (info == NULL((void*)0)) { |
1915 | info = g_file_query_info (node->file, |
1916 | STANDARD_ATTRIBUTE_TYPES"standard::type" "," "standard::is-hidden" "," "standard::is-backup" "," "standard::name" "," "standard::content-type" "," "standard::icon", |
1917 | G_FILE_QUERY_INFO_NONE, |
1918 | NULL((void*)0), |
1919 | &error); |
1920 | |
1921 | if (!info) { |
1922 | if (!(error->domain == G_IO_ERRORg_io_error_quark() && error->code == G_IO_ERROR_NOT_FOUND)) { |
1923 | uri = g_file_get_uri (node->file); |
1924 | g_warning ("Could not get info for %s: %s", uri, error->message); |
1925 | g_free (uri); |
1926 | } |
1927 | g_error_free (error); |
1928 | |
1929 | return; |
1930 | } |
1931 | |
1932 | free_info = TRUE(!(0)); |
1933 | } |
1934 | |
1935 | if (g_file_info_get_is_hidden (info) || g_file_info_get_is_backup (info)) |
1936 | node->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN; |
1937 | |
1938 | if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) |
1939 | node->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY; |
1940 | else { |
1941 | if (!(content = backup_content_type (info))) |
1942 | content = g_file_info_get_content_type (info); |
1943 | |
1944 | if (!content || |
1945 | g_content_type_is_unknown (content) || |
1946 | g_content_type_is_a (content, "text/plain")) |
1947 | node->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_IS_TEXT; |
1948 | } |
1949 | |
1950 | model_recomposite_icon_real (model, node, info); |
1951 | |
1952 | if (free_info) |
1953 | g_object_unref (info); |
1954 | |
1955 | if (isadded) { |
1956 | path = lapiz_file_browser_store_get_path_real (model, node); |
1957 | model_refilter_node (model, node, &path); |
1958 | ctk_tree_path_free (path); |
1959 | |
1960 | model_check_dummy (model, node->parent); |
1961 | } else { |
1962 | model_node_update_visibility (model, node); |
1963 | } |
1964 | } |
1965 | |
1966 | static FileBrowserNode * |
1967 | node_list_contains_file (GSList *children, GFile * file) |
1968 | { |
1969 | GSList *item; |
1970 | |
1971 | for (item = children; item; item = item->next) { |
1972 | FileBrowserNode *node; |
1973 | |
1974 | node = (FileBrowserNode *) (item->data); |
1975 | |
1976 | if (node->file != NULL((void*)0) |
1977 | && g_file_equal (node->file, file)) |
1978 | return node; |
1979 | } |
1980 | |
1981 | return NULL((void*)0); |
1982 | } |
1983 | |
1984 | static FileBrowserNode * |
1985 | model_add_node_from_file (LapizFileBrowserStore * model, |
1986 | FileBrowserNode * parent, |
1987 | GFile * file, |
1988 | GFileInfo * info) |
1989 | { |
1990 | FileBrowserNode *node; |
1991 | gboolean free_info = FALSE(0); |
1992 | GError * error = NULL((void*)0); |
1993 | |
1994 | if ((node = node_list_contains_file (FILE_BROWSER_NODE_DIR (parent)((FileBrowserNodeDir *)(parent))->children, file)) == NULL((void*)0)) { |
1995 | if (info == NULL((void*)0)) { |
1996 | info = g_file_query_info (file, |
1997 | STANDARD_ATTRIBUTE_TYPES"standard::type" "," "standard::is-hidden" "," "standard::is-backup" "," "standard::name" "," "standard::content-type" "," "standard::icon", |
1998 | G_FILE_QUERY_INFO_NONE, |
1999 | NULL((void*)0), |
2000 | &error); |
2001 | free_info = TRUE(!(0)); |
2002 | } |
2003 | |
2004 | if (!info) { |
2005 | g_warning ("Error querying file info: %s", error->message); |
2006 | g_error_free (error); |
2007 | |
2008 | /* FIXME: What to do now then... */ |
2009 | node = file_browser_node_new (file, parent); |
2010 | } else if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) { |
2011 | node = file_browser_node_dir_new (model, file, parent); |
2012 | } else { |
2013 | node = file_browser_node_new (file, parent); |
2014 | } |
2015 | |
2016 | file_browser_node_set_from_info (model, node, info, FALSE(0)); |
2017 | model_add_node (model, node, parent); |
2018 | |
2019 | if (info && free_info) |
2020 | g_object_unref (info); |
2021 | } |
2022 | |
2023 | return node; |
2024 | } |
2025 | |
2026 | /* We pass in a copy of the list of parent->children so that we do |
2027 | * not have to check if a file already exists among the ones we just |
2028 | * added */ |
2029 | static void |
2030 | model_add_nodes_from_files (LapizFileBrowserStore * model, |
2031 | FileBrowserNode * parent, |
2032 | GSList * original_children, |
2033 | GList * files) |
2034 | { |
2035 | GList *item; |
2036 | GSList *nodes = NULL((void*)0); |
2037 | |
2038 | for (item = files; item; item = item->next) { |
2039 | GFileInfo *info = G_FILE_INFO (item->data)((((GFileInfo*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((item->data)), ((g_file_info_get_type ())))))); |
2040 | GFileType type; |
2041 | gchar const * name; |
2042 | GFile * file; |
2043 | FileBrowserNode *node; |
2044 | |
2045 | type = g_file_info_get_file_type (info); |
2046 | |
2047 | /* Skip all non regular, non directory files */ |
2048 | if (type != G_FILE_TYPE_REGULAR && |
2049 | type != G_FILE_TYPE_DIRECTORY && |
2050 | type != G_FILE_TYPE_SYMBOLIC_LINK) { |
2051 | g_object_unref (info); |
2052 | continue; |
2053 | } |
2054 | |
2055 | name = g_file_info_get_name (info); |
2056 | |
2057 | /* Skip '.' and '..' directories */ |
2058 | if (type == G_FILE_TYPE_DIRECTORY && |
2059 | (strcmp (name, ".") == 0 || |
2060 | strcmp (name, "..") == 0)) { |
2061 | continue; |
2062 | } |
2063 | |
2064 | file = g_file_get_child (parent->file, name); |
2065 | |
2066 | if ((node = node_list_contains_file (original_children, file)) == NULL((void*)0)) { |
Although the value stored to 'node' is used in the enclosing expression, the value is never actually read from 'node' | |
2067 | |
2068 | if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) { |
2069 | node = file_browser_node_dir_new (model, file, parent); |
2070 | } else { |
2071 | node = file_browser_node_new (file, parent); |
2072 | } |
2073 | |
2074 | file_browser_node_set_from_info (model, node, info, FALSE(0)); |
2075 | |
2076 | nodes = g_slist_prepend (nodes, node); |
2077 | } |
2078 | |
2079 | g_object_unref (file); |
2080 | g_object_unref (info); |
2081 | } |
2082 | |
2083 | if (nodes) |
2084 | model_add_nodes_batch (model, nodes, parent); |
2085 | } |
2086 | |
2087 | static FileBrowserNode * |
2088 | model_add_node_from_dir (LapizFileBrowserStore * model, |
2089 | FileBrowserNode * parent, |
2090 | GFile * file) |
2091 | { |
2092 | FileBrowserNode *node; |
2093 | |
2094 | /* Check if it already exists */ |
2095 | if ((node = node_list_contains_file (FILE_BROWSER_NODE_DIR (parent)((FileBrowserNodeDir *)(parent))->children, file)) == NULL((void*)0)) { |
2096 | node = file_browser_node_dir_new (model, file, parent); |
2097 | file_browser_node_set_from_info (model, node, NULL((void*)0), FALSE(0)); |
2098 | |
2099 | if (node->name == NULL((void*)0)) { |
2100 | file_browser_node_set_name (node); |
2101 | } |
2102 | |
2103 | if (node->icon == NULL((void*)0)) { |
2104 | node->icon = lapiz_file_browser_utils_pixbuf_from_theme ("folder", CTK_ICON_SIZE_MENU); |
2105 | } |
2106 | |
2107 | model_add_node (model, node, parent); |
2108 | } |
2109 | |
2110 | return node; |
2111 | } |
2112 | |
2113 | static void |
2114 | on_directory_monitor_event (GFileMonitor *monitor G_GNUC_UNUSED__attribute__ ((__unused__)), |
2115 | GFile *file, |
2116 | GFile *other_file G_GNUC_UNUSED__attribute__ ((__unused__)), |
2117 | GFileMonitorEvent event_type, |
2118 | FileBrowserNode *parent) |
2119 | { |
2120 | FileBrowserNode *node; |
2121 | FileBrowserNodeDir *dir = FILE_BROWSER_NODE_DIR (parent)((FileBrowserNodeDir *)(parent)); |
2122 | |
2123 | switch (event_type) { |
2124 | case G_FILE_MONITOR_EVENT_DELETED: |
2125 | node = node_list_contains_file (dir->children, file); |
2126 | |
2127 | if (node != NULL((void*)0)) { |
2128 | model_remove_node (dir->model, node, NULL((void*)0), TRUE(!(0))); |
2129 | } |
2130 | break; |
2131 | case G_FILE_MONITOR_EVENT_CREATED: |
2132 | if (g_file_query_exists (file, NULL((void*)0))) { |
2133 | model_add_node_from_file (dir->model, parent, file, NULL((void*)0)); |
2134 | } |
2135 | |
2136 | break; |
2137 | default: |
2138 | break; |
2139 | } |
2140 | } |
2141 | |
2142 | static void |
2143 | async_node_free (AsyncNode *async) |
2144 | { |
2145 | g_object_unref (async->cancellable); |
2146 | g_slist_free (async->original_children); |
2147 | g_free (async); |
2148 | } |
2149 | |
2150 | static void |
2151 | model_iterate_next_files_cb (GFileEnumerator * enumerator, |
2152 | GAsyncResult * result, |
2153 | AsyncNode * async) |
2154 | { |
2155 | GList * files; |
2156 | GError * error = NULL((void*)0); |
2157 | FileBrowserNodeDir * dir = async->dir; |
2158 | FileBrowserNode * parent = (FileBrowserNode *)dir; |
2159 | |
2160 | files = g_file_enumerator_next_files_finish (enumerator, result, &error); |
2161 | |
2162 | if (files == NULL((void*)0)) { |
2163 | g_file_enumerator_close (enumerator, NULL((void*)0), NULL((void*)0)); |
2164 | async_node_free (async); |
2165 | |
2166 | if (!error) |
2167 | { |
2168 | /* We're done loading */ |
2169 | g_object_unref (dir->cancellable); |
2170 | dir->cancellable = NULL((void*)0); |
2171 | |
2172 | /* |
2173 | * FIXME: This is temporarly, it is a bug in gio: |
2174 | * http://bugzilla.gnome.org/show_bug.cgi?id=565924 |
2175 | */ |
2176 | if (g_file_is_native (parent->file) && dir->monitor == NULL((void*)0)) { |
2177 | dir->monitor = g_file_monitor_directory (parent->file, |
2178 | G_FILE_MONITOR_NONE, |
2179 | NULL((void*)0), |
2180 | NULL((void*)0)); |
2181 | if (dir->monitor != NULL((void*)0)) |
2182 | { |
2183 | g_signal_connect (dir->monitor,g_signal_connect_data ((dir->monitor), ("changed"), (((GCallback ) (on_directory_monitor_event))), (parent), ((void*)0), (GConnectFlags ) 0) |
2184 | "changed",g_signal_connect_data ((dir->monitor), ("changed"), (((GCallback ) (on_directory_monitor_event))), (parent), ((void*)0), (GConnectFlags ) 0) |
2185 | G_CALLBACK (on_directory_monitor_event),g_signal_connect_data ((dir->monitor), ("changed"), (((GCallback ) (on_directory_monitor_event))), (parent), ((void*)0), (GConnectFlags ) 0) |
2186 | parent)g_signal_connect_data ((dir->monitor), ("changed"), (((GCallback ) (on_directory_monitor_event))), (parent), ((void*)0), (GConnectFlags ) 0); |
2187 | } |
2188 | } |
2189 | |
2190 | model_check_dummy (dir->model, parent); |
2191 | model_end_loading (dir->model, parent); |
2192 | } else { |
2193 | /* Simply return if we were cancelled */ |
2194 | if (error->domain == G_IO_ERRORg_io_error_quark() && error->code == G_IO_ERROR_CANCELLED) |
2195 | return; |
2196 | |
2197 | /* Otherwise handle the error appropriately */ |
2198 | g_signal_emit (dir->model, |
2199 | model_signals[ERROR], |
2200 | 0, |
2201 | LAPIZ_FILE_BROWSER_ERROR_LOAD_DIRECTORY, |
2202 | error->message); |
2203 | |
2204 | file_browser_node_unload (dir->model, (FileBrowserNode *)parent, TRUE(!(0))); |
2205 | g_error_free (error); |
2206 | } |
2207 | } else if (g_cancellable_is_cancelled (async->cancellable)) { |
2208 | /* Check cancel state manually */ |
2209 | g_file_enumerator_close (enumerator, NULL((void*)0), NULL((void*)0)); |
2210 | async_node_free (async); |
2211 | } else { |
2212 | model_add_nodes_from_files (dir->model, parent, async->original_children, files); |
2213 | |
2214 | g_list_free (files); |
2215 | next_files_async (enumerator, async); |
2216 | } |
2217 | } |
2218 | |
2219 | static void |
2220 | next_files_async (GFileEnumerator * enumerator, |
2221 | AsyncNode * async) |
2222 | { |
2223 | g_file_enumerator_next_files_async (enumerator, |
2224 | DIRECTORY_LOAD_ITEMS_PER_CALLBACK100, |
2225 | G_PRIORITY_DEFAULT0, |
2226 | async->cancellable, |
2227 | (GAsyncReadyCallback)model_iterate_next_files_cb, |
2228 | async); |
2229 | } |
2230 | |
2231 | static void |
2232 | model_iterate_children_cb (GFile * file, |
2233 | GAsyncResult * result, |
2234 | AsyncNode * async) |
2235 | { |
2236 | GError * error = NULL((void*)0); |
2237 | GFileEnumerator * enumerator; |
2238 | |
2239 | if (g_cancellable_is_cancelled (async->cancellable)) |
2240 | { |
2241 | async_node_free (async); |
2242 | return; |
2243 | } |
2244 | |
2245 | enumerator = g_file_enumerate_children_finish (file, result, &error); |
2246 | |
2247 | if (enumerator == NULL((void*)0)) { |
2248 | /* Simply return if we were cancelled or if the dir is not there */ |
2249 | FileBrowserNodeDir *dir = async->dir; |
2250 | |
2251 | /* Otherwise handle the error appropriately */ |
2252 | g_signal_emit (dir->model, |
2253 | model_signals[ERROR], |
2254 | 0, |
2255 | LAPIZ_FILE_BROWSER_ERROR_LOAD_DIRECTORY, |
2256 | error->message); |
2257 | |
2258 | file_browser_node_unload (dir->model, (FileBrowserNode *)dir, TRUE(!(0))); |
2259 | g_error_free (error); |
2260 | async_node_free (async); |
2261 | } else { |
2262 | next_files_async (enumerator, async); |
2263 | } |
2264 | } |
2265 | |
2266 | static void |
2267 | model_load_directory (LapizFileBrowserStore * model, |
2268 | FileBrowserNode * node) |
2269 | { |
2270 | FileBrowserNodeDir *dir; |
2271 | AsyncNode *async; |
2272 | |
2273 | g_return_if_fail (NODE_IS_DIR (node))do { if (((((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "NODE_IS_DIR (node)"); return; } } while (0); |
2274 | |
2275 | dir = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node)); |
2276 | |
2277 | /* Cancel a previous load */ |
2278 | if (dir->cancellable != NULL((void*)0)) { |
2279 | file_browser_node_unload (dir->model, node, TRUE(!(0))); |
2280 | } |
2281 | |
2282 | node->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED; |
2283 | model_begin_loading (model, node); |
2284 | |
2285 | dir->cancellable = g_cancellable_new (); |
2286 | |
2287 | async = g_new (AsyncNode, 1)((AsyncNode *) g_malloc_n ((1), sizeof (AsyncNode))); |
2288 | async->dir = dir; |
2289 | async->cancellable = g_object_ref (dir->cancellable)((__typeof__ (dir->cancellable)) (g_object_ref) (dir->cancellable )); |
2290 | async->original_children = g_slist_copy (dir->children); |
2291 | |
2292 | /* Start loading async */ |
2293 | g_file_enumerate_children_async (node->file, |
2294 | STANDARD_ATTRIBUTE_TYPES"standard::type" "," "standard::is-hidden" "," "standard::is-backup" "," "standard::name" "," "standard::content-type" "," "standard::icon", |
2295 | G_FILE_QUERY_INFO_NONE, |
2296 | G_PRIORITY_DEFAULT0, |
2297 | async->cancellable, |
2298 | (GAsyncReadyCallback)model_iterate_children_cb, |
2299 | async); |
2300 | } |
2301 | |
2302 | static GList * |
2303 | get_parent_files (LapizFileBrowserStore * model, GFile * file) |
2304 | { |
2305 | GList * result = NULL((void*)0); |
2306 | |
2307 | result = g_list_prepend (result, g_object_ref (file)((__typeof__ (file)) (g_object_ref) (file))); |
2308 | |
2309 | while ((file = g_file_get_parent (file))) { |
2310 | if (g_file_equal (file, model->priv->root->file)) { |
2311 | g_object_unref (file); |
2312 | break; |
2313 | } |
2314 | |
2315 | result = g_list_prepend (result, file); |
2316 | } |
2317 | |
2318 | return result; |
2319 | } |
2320 | |
2321 | static void |
2322 | model_fill (LapizFileBrowserStore * model, FileBrowserNode * node, |
2323 | CtkTreePath ** path) |
2324 | { |
2325 | gboolean free_path = FALSE(0); |
2326 | CtkTreeIter iter = {0,}; |
2327 | GSList *item; |
2328 | FileBrowserNode *child; |
2329 | |
2330 | if (node == NULL((void*)0)) { |
2331 | node = model->priv->virtual_root; |
2332 | *path = ctk_tree_path_new (); |
2333 | free_path = TRUE(!(0)); |
2334 | } |
2335 | |
2336 | if (*path == NULL((void*)0)) { |
2337 | *path = |
2338 | lapiz_file_browser_store_get_path_real (model, node); |
2339 | free_path = TRUE(!(0)); |
2340 | } |
2341 | |
2342 | if (!model_node_visibility (model, node)) { |
2343 | if (free_path) |
2344 | ctk_tree_path_free (*path); |
2345 | |
2346 | return; |
2347 | } |
2348 | |
2349 | if (node != model->priv->virtual_root) { |
2350 | /* Insert node */ |
2351 | iter.user_data = node; |
2352 | |
2353 | row_inserted(model, path, &iter); |
2354 | } |
2355 | |
2356 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) { |
2357 | /* Go to the first child */ |
2358 | ctk_tree_path_down (*path); |
2359 | |
2360 | for (item = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children; item; |
2361 | item = item->next) { |
2362 | child = (FileBrowserNode *) (item->data); |
2363 | |
2364 | if (model_node_visibility (model, child)) { |
2365 | model_fill (model, child, path); |
2366 | |
2367 | /* Increase path for next child */ |
2368 | ctk_tree_path_next (*path); |
2369 | } |
2370 | } |
2371 | |
2372 | /* Move back up to node path */ |
2373 | ctk_tree_path_up (*path); |
2374 | } |
2375 | |
2376 | model_check_dummy (model, node); |
2377 | |
2378 | if (free_path) |
2379 | ctk_tree_path_free (*path); |
2380 | } |
2381 | |
2382 | static void |
2383 | set_virtual_root_from_node (LapizFileBrowserStore * model, |
2384 | FileBrowserNode * node) |
2385 | { |
2386 | FileBrowserNode *next; |
2387 | FileBrowserNode *prev; |
2388 | FileBrowserNode *check; |
2389 | FileBrowserNodeDir *dir; |
2390 | GSList *item; |
2391 | GSList *copy; |
2392 | CtkTreePath *empty = NULL((void*)0); |
2393 | |
2394 | g_assert (node != NULL)do { if (node != ((void*)0)) ; else g_assertion_message_expr ( ((gchar*) 0), "lapiz-file-browser-store.c", 2394, ((const char *) (__func__)), "node != NULL"); } while (0); |
2395 | |
2396 | prev = node; |
2397 | next = prev->parent; |
2398 | |
2399 | /* Free all the nodes below that we don't need in cache */ |
2400 | while (prev != model->priv->root) { |
2401 | dir = FILE_BROWSER_NODE_DIR (next)((FileBrowserNodeDir *)(next)); |
2402 | copy = g_slist_copy (dir->children); |
2403 | |
2404 | for (item = copy; item; item = item->next) { |
2405 | check = (FileBrowserNode *) (item->data); |
2406 | |
2407 | if (prev == node) { |
2408 | /* Only free the children, keeping this depth in cache */ |
2409 | if (check != node) { |
2410 | file_browser_node_free_children |
2411 | (model, check); |
2412 | file_browser_node_unload (model, |
2413 | check, |
2414 | FALSE(0)); |
2415 | } |
2416 | } else if (check != prev) { |
2417 | /* Only free when the node is not in the chain */ |
2418 | dir->children = |
2419 | g_slist_remove (dir->children, check); |
2420 | file_browser_node_free (model, check); |
2421 | } |
2422 | } |
2423 | |
2424 | if (prev != node) |
2425 | file_browser_node_unload (model, next, FALSE(0)); |
2426 | |
2427 | g_slist_free (copy); |
2428 | prev = next; |
2429 | next = prev->parent; |
2430 | } |
2431 | |
2432 | /* Free all the nodes up that we don't need in cache */ |
2433 | for (item = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children; item; |
2434 | item = item->next) { |
2435 | check = (FileBrowserNode *) (item->data); |
2436 | |
2437 | if (NODE_IS_DIR (check)(((check)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) { |
2438 | for (copy = |
2439 | FILE_BROWSER_NODE_DIR (check)((FileBrowserNodeDir *)(check))->children; copy; |
2440 | copy = copy->next) { |
2441 | file_browser_node_free_children (model, |
2442 | (FileBrowserNode |
2443 | *) |
2444 | (copy-> |
2445 | data)); |
2446 | file_browser_node_unload (model, |
2447 | (FileBrowserNode |
2448 | *) (copy->data), |
2449 | FALSE(0)); |
2450 | } |
2451 | } else if (NODE_IS_DUMMY (check)(((check)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY ))) { |
2452 | check->flags |= |
2453 | LAPIZ_FILE_BROWSER_STORE_FLAG_IS_HIDDEN; |
2454 | } |
2455 | } |
2456 | |
2457 | /* Now finally, set the virtual root, and load it up! */ |
2458 | model->priv->virtual_root = node; |
2459 | |
2460 | /* Notify that the virtual-root has changed before loading up new nodes so that the |
2461 | "root_changed" signal can be emitted before any "inserted" signals */ |
2462 | g_object_notify (G_OBJECT (model)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), (((GType) ((20) << (2)))))))), "virtual-root"); |
2463 | |
2464 | model_fill (model, NULL((void*)0), &empty); |
2465 | |
2466 | if (!NODE_LOADED (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED ))) |
2467 | model_load_directory (model, node); |
2468 | } |
2469 | |
2470 | static void |
2471 | set_virtual_root_from_file (LapizFileBrowserStore * model, |
2472 | GFile * file) |
2473 | { |
2474 | GList * files; |
2475 | GList * item; |
2476 | FileBrowserNode * parent; |
2477 | GFile * check; |
2478 | |
2479 | /* Always clear the model before altering the nodes */ |
2480 | model_clear (model, FALSE(0)); |
2481 | |
2482 | /* Create the node path, get all the uri's */ |
2483 | files = get_parent_files (model, file); |
2484 | parent = model->priv->root; |
2485 | |
2486 | for (item = files; item; item = item->next) { |
2487 | check = G_FILE (item->data)((((GFile*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((item->data)), ((g_file_get_type ())))))); |
2488 | |
2489 | parent = model_add_node_from_dir (model, parent, check); |
2490 | g_object_unref (check); |
2491 | } |
2492 | |
2493 | g_list_free (files); |
2494 | set_virtual_root_from_node (model, parent); |
2495 | } |
2496 | |
2497 | static FileBrowserNode * |
2498 | model_find_node_children (LapizFileBrowserStore * model, |
2499 | FileBrowserNode * parent, |
2500 | GFile * file) |
2501 | { |
2502 | FileBrowserNodeDir *dir; |
2503 | FileBrowserNode *child; |
2504 | FileBrowserNode *result; |
2505 | GSList *children; |
2506 | |
2507 | if (!NODE_IS_DIR (parent)(((parent)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) |
2508 | return NULL((void*)0); |
2509 | |
2510 | dir = FILE_BROWSER_NODE_DIR (parent)((FileBrowserNodeDir *)(parent)); |
2511 | |
2512 | for (children = dir->children; children; children = children->next) { |
2513 | child = (FileBrowserNode *)(children->data); |
2514 | |
2515 | result = model_find_node (model, child, file); |
2516 | |
2517 | if (result) |
2518 | return result; |
2519 | } |
2520 | |
2521 | return NULL((void*)0); |
2522 | } |
2523 | |
2524 | static FileBrowserNode * |
2525 | model_find_node (LapizFileBrowserStore * model, |
2526 | FileBrowserNode * node, |
2527 | GFile * file) |
2528 | { |
2529 | if (node == NULL((void*)0)) |
2530 | node = model->priv->root; |
2531 | |
2532 | if (node->file && g_file_equal (node->file, file)) |
2533 | return node; |
2534 | |
2535 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )) && g_file_has_prefix (file, node->file)) |
2536 | return model_find_node_children (model, node, file); |
2537 | |
2538 | return NULL((void*)0); |
2539 | } |
2540 | |
2541 | static GQuark |
2542 | lapiz_file_browser_store_error_quark (void) |
2543 | { |
2544 | static GQuark quark = 0; |
2545 | |
2546 | if (G_UNLIKELY (quark == 0)(quark == 0)) { |
2547 | quark = g_quark_from_string ("lapiz_file_browser_store_error"); |
2548 | } |
2549 | |
2550 | return quark; |
2551 | } |
2552 | |
2553 | static GFile * |
2554 | unique_new_name (GFile * directory, gchar const * name) |
2555 | { |
2556 | GFile * newuri = NULL((void*)0); |
2557 | guint num = 0; |
2558 | gchar * newname; |
2559 | |
2560 | while (newuri == NULL((void*)0) || g_file_query_exists (newuri, NULL((void*)0))) { |
2561 | if (newuri != NULL((void*)0)) |
2562 | g_object_unref (newuri); |
2563 | |
2564 | if (num == 0) |
2565 | newname = g_strdup (name)g_strdup_inline (name); |
2566 | else |
2567 | newname = g_strdup_printf ("%s(%d)", name, num); |
2568 | |
2569 | newuri = g_file_get_child (directory, newname); |
2570 | g_free (newname); |
2571 | |
2572 | ++num; |
2573 | } |
2574 | |
2575 | return newuri; |
2576 | } |
2577 | |
2578 | static LapizFileBrowserStoreResult |
2579 | model_root_mounted (LapizFileBrowserStore * model, gchar const * virtual_root) |
2580 | { |
2581 | model_check_dummy (model, model->priv->root); |
2582 | g_object_notify (G_OBJECT (model)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), (((GType) ((20) << (2)))))))), "root"); |
2583 | |
2584 | if (virtual_root != NULL((void*)0)) |
2585 | return |
2586 | lapiz_file_browser_store_set_virtual_root_from_string |
2587 | (model, virtual_root); |
2588 | else |
2589 | set_virtual_root_from_node (model, |
2590 | model->priv->root); |
2591 | |
2592 | return LAPIZ_FILE_BROWSER_STORE_RESULT_OK; |
2593 | } |
2594 | |
2595 | static void |
2596 | handle_root_error (LapizFileBrowserStore * model, GError *error) |
2597 | { |
2598 | FileBrowserNode * root; |
2599 | |
2600 | g_signal_emit (model, |
2601 | model_signals[ERROR], |
2602 | 0, |
2603 | LAPIZ_FILE_BROWSER_ERROR_SET_ROOT, |
2604 | error->message); |
2605 | |
2606 | /* Set the virtual root to the root */ |
2607 | root = model->priv->root; |
2608 | model->priv->virtual_root = root; |
2609 | |
2610 | /* Set the root to be loaded */ |
2611 | root->flags |= LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED; |
2612 | |
2613 | /* Check the dummy */ |
2614 | model_check_dummy (model, root); |
2615 | |
2616 | g_object_notify (G_OBJECT (model)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), (((GType) ((20) << (2)))))))), "root"); |
2617 | g_object_notify (G_OBJECT (model)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), (((GType) ((20) << (2)))))))), "virtual-root"); |
2618 | } |
2619 | |
2620 | static void |
2621 | mount_cb (GFile * file, |
2622 | GAsyncResult * res, |
2623 | MountInfo * mount_info) |
2624 | { |
2625 | gboolean mounted; |
2626 | GError * error = NULL((void*)0); |
2627 | LapizFileBrowserStore * model = mount_info->model; |
2628 | |
2629 | mounted = g_file_mount_enclosing_volume_finish (file, res, &error); |
2630 | |
2631 | if (mount_info->model) |
2632 | { |
2633 | model->priv->mount_info = NULL((void*)0); |
2634 | model_end_loading (model, model->priv->root); |
2635 | } |
2636 | |
2637 | if (!mount_info->model || g_cancellable_is_cancelled (mount_info->cancellable)) |
2638 | { |
2639 | // Reset because it might be reused? |
2640 | g_cancellable_reset (mount_info->cancellable); |
2641 | } |
2642 | else if (mounted) |
2643 | { |
2644 | model_root_mounted (model, mount_info->virtual_root); |
2645 | } |
2646 | else if (error->code != G_IO_ERROR_CANCELLED) |
2647 | { |
2648 | handle_root_error (model, error); |
2649 | } |
2650 | |
2651 | if (error) |
2652 | g_error_free (error); |
2653 | |
2654 | g_object_unref (mount_info->operation); |
2655 | g_object_unref (mount_info->cancellable); |
2656 | g_free (mount_info->virtual_root); |
2657 | |
2658 | g_free (mount_info); |
2659 | } |
2660 | |
2661 | static LapizFileBrowserStoreResult |
2662 | model_mount_root (LapizFileBrowserStore * model, gchar const * virtual_root) |
2663 | { |
2664 | GFileInfo * info; |
2665 | GError * error = NULL((void*)0); |
2666 | MountInfo * mount_info; |
2667 | |
2668 | info = g_file_query_info (model->priv->root->file, |
2669 | G_FILE_ATTRIBUTE_STANDARD_TYPE"standard::type", |
2670 | G_FILE_QUERY_INFO_NONE, |
2671 | NULL((void*)0), |
2672 | &error); |
2673 | |
2674 | if (!info) { |
2675 | if (error->code == G_IO_ERROR_NOT_MOUNTED) { |
2676 | /* Try to mount it */ |
2677 | FILE_BROWSER_NODE_DIR (model->priv->root)((FileBrowserNodeDir *)(model->priv->root))->cancellable = g_cancellable_new (); |
2678 | |
2679 | mount_info = g_new(MountInfo, 1)((MountInfo *) g_malloc_n ((1), sizeof (MountInfo))); |
2680 | mount_info->model = model; |
2681 | mount_info->virtual_root = g_strdup (virtual_root)g_strdup_inline (virtual_root); |
2682 | |
2683 | /* FIXME: we should be setting the correct window */ |
2684 | mount_info->operation = ctk_mount_operation_new (NULL((void*)0)); |
2685 | mount_info->cancellable = g_object_ref (FILE_BROWSER_NODE_DIR (model->priv->root)->cancellable)((__typeof__ (((FileBrowserNodeDir *)(model->priv->root ))->cancellable)) (g_object_ref) (((FileBrowserNodeDir *)( model->priv->root))->cancellable)); |
2686 | |
2687 | model_begin_loading (model, model->priv->root); |
2688 | g_file_mount_enclosing_volume (model->priv->root->file, |
2689 | G_MOUNT_MOUNT_NONE, |
2690 | mount_info->operation, |
2691 | mount_info->cancellable, |
2692 | (GAsyncReadyCallback)mount_cb, |
2693 | mount_info); |
2694 | |
2695 | model->priv->mount_info = mount_info; |
2696 | return LAPIZ_FILE_BROWSER_STORE_RESULT_MOUNTING; |
2697 | } |
2698 | else |
2699 | { |
2700 | handle_root_error (model, error); |
2701 | } |
2702 | |
2703 | g_error_free (error); |
2704 | } else { |
2705 | g_object_unref (info); |
2706 | |
2707 | return model_root_mounted (model, virtual_root); |
2708 | } |
2709 | |
2710 | return LAPIZ_FILE_BROWSER_STORE_RESULT_OK; |
2711 | } |
2712 | |
2713 | /* Public */ |
2714 | LapizFileBrowserStore * |
2715 | lapiz_file_browser_store_new (gchar const *root) |
2716 | { |
2717 | LapizFileBrowserStore *obj = |
2718 | LAPIZ_FILE_BROWSER_STORE (g_object_new((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((g_object_new ((lapiz_file_browser_store_get_type ()), ((void*)0)))), ((lapiz_file_browser_store_get_type ())) )))) |
2719 | (LAPIZ_TYPE_FILE_BROWSER_STORE,((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((g_object_new ((lapiz_file_browser_store_get_type ()), ((void*)0)))), ((lapiz_file_browser_store_get_type ())) )))) |
2720 | NULL))((((LapizFileBrowserStore*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((g_object_new ((lapiz_file_browser_store_get_type ()), ((void*)0)))), ((lapiz_file_browser_store_get_type ())) )))); |
2721 | |
2722 | lapiz_file_browser_store_set_root (obj, root); |
2723 | return obj; |
2724 | } |
2725 | |
2726 | void |
2727 | lapiz_file_browser_store_set_value (LapizFileBrowserStore * tree_model, |
2728 | CtkTreeIter * iter, gint column, |
2729 | GValue * value) |
2730 | { |
2731 | gpointer data; |
2732 | FileBrowserNode *node; |
2733 | CtkTreePath *path; |
2734 | |
2735 | g_return_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (tree_model))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((tree_model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (tree_model)" ); return; } } while (0); |
2736 | g_return_if_fail (column ==do { if ((column == LAPIZ_FILE_BROWSER_STORE_COLUMN_EMBLEM)) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char *) (__func__)), "column == LAPIZ_FILE_BROWSER_STORE_COLUMN_EMBLEM" ); return; } } while (0) |
2737 | LAPIZ_FILE_BROWSER_STORE_COLUMN_EMBLEM)do { if ((column == LAPIZ_FILE_BROWSER_STORE_COLUMN_EMBLEM)) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char *) (__func__)), "column == LAPIZ_FILE_BROWSER_STORE_COLUMN_EMBLEM" ); return; } } while (0); |
2738 | g_return_if_fail (G_VALUE_HOLDS_OBJECT (value))do { if (((((__extension__ ({ const GValue *__val = (const GValue *) ((value)); GType __t = (((GType) ((20) << (2)))); gboolean __r; if (!__val) __r = (0); else if (__val->g_type == __t ) __r = (!(0)); else __r = g_type_check_value_holds (__val, __t ); __r; })))))) { } else { g_return_if_fail_warning (((gchar* ) 0), ((const char*) (__func__)), "G_VALUE_HOLDS_OBJECT (value)" ); return; } } while (0); |
2739 | g_return_if_fail (iter != NULL)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ; } } while (0); |
2740 | g_return_if_fail (iter->user_data != NULL)do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return; } } while (0); |
2741 | |
2742 | data = g_value_get_object (value); |
2743 | |
2744 | if (data) |
2745 | g_return_if_fail (GDK_IS_PIXBUF (data))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((data)); GType __t = ((gdk_pixbuf_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char* ) (__func__)), "GDK_IS_PIXBUF (data)"); return; } } while (0); |
2746 | |
2747 | node = (FileBrowserNode *) (iter->user_data); |
2748 | |
2749 | if (node->emblem) |
2750 | g_object_unref (node->emblem); |
2751 | |
2752 | if (data) |
2753 | node->emblem = g_object_ref (GDK_PIXBUF (data))((__typeof__ (((((GdkPixbuf*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((data)), ((gdk_pixbuf_get_type ())))))))) (g_object_ref) (((((GdkPixbuf*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((data)), ((gdk_pixbuf_get_type ())))))))); |
2754 | else |
2755 | node->emblem = NULL((void*)0); |
2756 | |
2757 | model_recomposite_icon (tree_model, iter); |
2758 | |
2759 | if (model_node_visibility (tree_model, node)) { |
2760 | path = lapiz_file_browser_store_get_path (CTK_TREE_MODEL (tree_model)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((tree_model)), ((ctk_tree_model_get_type ())))))), |
2761 | iter); |
2762 | row_changed (tree_model, &path, iter); |
2763 | ctk_tree_path_free (path); |
2764 | } |
2765 | } |
2766 | |
2767 | LapizFileBrowserStoreResult |
2768 | lapiz_file_browser_store_set_virtual_root (LapizFileBrowserStore * model, |
2769 | CtkTreeIter * iter) |
2770 | { |
2771 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0) |
2772 | LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
2773 | g_return_val_if_fail (iter != NULL,do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0) |
2774 | LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
2775 | g_return_val_if_fail (iter->user_data != NULL,do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0) |
2776 | LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
2777 | |
2778 | model_clear (model, FALSE(0)); |
2779 | set_virtual_root_from_node (model, |
2780 | (FileBrowserNode *) (iter->user_data)); |
2781 | |
2782 | return TRUE(!(0)); |
2783 | } |
2784 | |
2785 | LapizFileBrowserStoreResult |
2786 | lapiz_file_browser_store_set_virtual_root_from_string |
2787 | (LapizFileBrowserStore * model, gchar const *root) { |
2788 | GFile *file; |
2789 | |
2790 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0) |
2791 | LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
2792 | |
2793 | file = g_file_new_for_uri (root); |
2794 | if (file == NULL((void*)0)) { |
2795 | g_warning ("Invalid uri (%s)", root); |
2796 | return LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE; |
2797 | } |
2798 | |
2799 | /* Check if uri is already the virtual root */ |
2800 | if (model->priv->virtual_root && |
2801 | g_file_equal (model->priv->virtual_root->file, file)) { |
2802 | g_object_unref (file); |
2803 | return LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE; |
2804 | } |
2805 | |
2806 | /* Check if uri is the root itself */ |
2807 | if (g_file_equal (model->priv->root->file, file)) { |
2808 | g_object_unref (file); |
2809 | |
2810 | /* Always clear the model before altering the nodes */ |
2811 | model_clear (model, FALSE(0)); |
2812 | set_virtual_root_from_node (model, model->priv->root); |
2813 | return LAPIZ_FILE_BROWSER_STORE_RESULT_OK; |
2814 | } |
2815 | |
2816 | if (!g_file_has_prefix (file, model->priv->root->file)) { |
2817 | gchar *str, *str1; |
2818 | |
2819 | str = g_file_get_parse_name (model->priv->root->file); |
2820 | str1 = g_file_get_parse_name (file); |
2821 | |
2822 | g_warning |
2823 | ("Virtual root (%s) is not below actual root (%s)", |
2824 | str1, str); |
2825 | |
2826 | g_free (str); |
2827 | g_free (str1); |
2828 | |
2829 | g_object_unref (file); |
2830 | return LAPIZ_FILE_BROWSER_STORE_RESULT_ERROR; |
2831 | } |
2832 | |
2833 | set_virtual_root_from_file (model, file); |
2834 | g_object_unref (file); |
2835 | |
2836 | return LAPIZ_FILE_BROWSER_STORE_RESULT_OK; |
2837 | } |
2838 | |
2839 | LapizFileBrowserStoreResult |
2840 | lapiz_file_browser_store_set_virtual_root_top (LapizFileBrowserStore * |
2841 | model) |
2842 | { |
2843 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0) |
2844 | LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
2845 | |
2846 | if (model->priv->virtual_root == model->priv->root) |
2847 | return LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE; |
2848 | |
2849 | model_clear (model, FALSE(0)); |
2850 | set_virtual_root_from_node (model, model->priv->root); |
2851 | |
2852 | return LAPIZ_FILE_BROWSER_STORE_RESULT_OK; |
2853 | } |
2854 | |
2855 | LapizFileBrowserStoreResult |
2856 | lapiz_file_browser_store_set_virtual_root_up (LapizFileBrowserStore * |
2857 | model) |
2858 | { |
2859 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0) |
2860 | LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
2861 | |
2862 | if (model->priv->virtual_root == model->priv->root) |
2863 | return LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE; |
2864 | |
2865 | model_clear (model, FALSE(0)); |
2866 | set_virtual_root_from_node (model, |
2867 | model->priv->virtual_root->parent); |
2868 | |
2869 | return LAPIZ_FILE_BROWSER_STORE_RESULT_OK; |
2870 | } |
2871 | |
2872 | gboolean |
2873 | lapiz_file_browser_store_get_iter_virtual_root (LapizFileBrowserStore * |
2874 | model, CtkTreeIter * iter) |
2875 | { |
2876 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return ((0)); } } while (0); |
2877 | g_return_val_if_fail (iter != NULL, FALSE)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ((0)); } } while (0); |
2878 | |
2879 | if (model->priv->virtual_root == NULL((void*)0)) |
2880 | return FALSE(0); |
2881 | |
2882 | iter->user_data = model->priv->virtual_root; |
2883 | return TRUE(!(0)); |
2884 | } |
2885 | |
2886 | gboolean |
2887 | lapiz_file_browser_store_get_iter_root (LapizFileBrowserStore * model, |
2888 | CtkTreeIter * iter) |
2889 | { |
2890 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return ((0)); } } while (0); |
2891 | g_return_val_if_fail (iter != NULL, FALSE)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ((0)); } } while (0); |
2892 | |
2893 | if (model->priv->root == NULL((void*)0)) |
2894 | return FALSE(0); |
2895 | |
2896 | iter->user_data = model->priv->root; |
2897 | return TRUE(!(0)); |
2898 | } |
2899 | |
2900 | gboolean |
2901 | lapiz_file_browser_store_iter_equal (LapizFileBrowserStore * model, |
2902 | CtkTreeIter * iter1, |
2903 | CtkTreeIter * iter2) |
2904 | { |
2905 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return ((0)); } } while (0); |
2906 | g_return_val_if_fail (iter1 != NULL, FALSE)do { if ((iter1 != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter1 != NULL"); return ((0)); } } while (0); |
2907 | g_return_val_if_fail (iter2 != NULL, FALSE)do { if ((iter2 != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter2 != NULL"); return ((0)); } } while (0); |
2908 | g_return_val_if_fail (iter1->user_data != NULL, FALSE)do { if ((iter1->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter1->user_data != NULL" ); return ((0)); } } while (0); |
2909 | g_return_val_if_fail (iter2->user_data != NULL, FALSE)do { if ((iter2->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter2->user_data != NULL" ); return ((0)); } } while (0); |
2910 | |
2911 | return (iter1->user_data == iter2->user_data); |
2912 | } |
2913 | |
2914 | void |
2915 | lapiz_file_browser_store_cancel_mount_operation (LapizFileBrowserStore *store) |
2916 | { |
2917 | g_return_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (store))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((store)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (store)" ); return; } } while (0); |
2918 | |
2919 | cancel_mount_operation (store); |
2920 | } |
2921 | |
2922 | LapizFileBrowserStoreResult |
2923 | lapiz_file_browser_store_set_root_and_virtual_root (LapizFileBrowserStore * |
2924 | model, |
2925 | gchar const *root, |
2926 | gchar const *virtual_root) |
2927 | { |
2928 | GFile * file = NULL((void*)0); |
2929 | GFile * vfile = NULL((void*)0); |
2930 | FileBrowserNode * node; |
2931 | gboolean equal = FALSE(0); |
2932 | |
2933 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0) |
2934 | LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
2935 | |
2936 | if (root == NULL((void*)0) && model->priv->root == NULL((void*)0)) |
2937 | return LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE; |
2938 | |
2939 | if (root != NULL((void*)0)) { |
2940 | file = g_file_new_for_uri (root); |
2941 | } |
2942 | |
2943 | if (root != NULL((void*)0) && model->priv->root != NULL((void*)0)) { |
2944 | equal = g_file_equal (file, model->priv->root->file); |
2945 | |
2946 | if (equal && virtual_root == NULL((void*)0)) { |
2947 | g_object_unref (file); |
2948 | return LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE; |
2949 | } |
2950 | } |
2951 | |
2952 | if (virtual_root) { |
2953 | vfile = g_file_new_for_uri (virtual_root); |
2954 | |
2955 | if (equal && g_file_equal (vfile, model->priv->virtual_root->file)) { |
2956 | if (file) |
2957 | g_object_unref (file); |
2958 | |
2959 | g_object_unref (vfile); |
2960 | return LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE; |
2961 | } |
2962 | |
2963 | g_object_unref (vfile); |
2964 | } |
2965 | |
2966 | /* make sure to cancel any previous mount operations */ |
2967 | cancel_mount_operation (model); |
2968 | |
2969 | /* Always clear the model before altering the nodes */ |
2970 | model_clear (model, TRUE(!(0))); |
2971 | file_browser_node_free (model, model->priv->root); |
2972 | |
2973 | model->priv->root = NULL((void*)0); |
2974 | model->priv->virtual_root = NULL((void*)0); |
2975 | |
2976 | if (file != NULL((void*)0)) { |
2977 | /* Create the root node */ |
2978 | node = file_browser_node_dir_new (model, file, NULL((void*)0)); |
2979 | |
2980 | g_object_unref (file); |
2981 | |
2982 | model->priv->root = node; |
2983 | return model_mount_root (model, virtual_root); |
2984 | } else { |
2985 | g_object_notify (G_OBJECT (model)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), (((GType) ((20) << (2)))))))), "root"); |
2986 | g_object_notify (G_OBJECT (model)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), (((GType) ((20) << (2)))))))), "virtual-root"); |
2987 | } |
2988 | |
2989 | return LAPIZ_FILE_BROWSER_STORE_RESULT_OK; |
2990 | } |
2991 | |
2992 | LapizFileBrowserStoreResult |
2993 | lapiz_file_browser_store_set_root (LapizFileBrowserStore * model, |
2994 | gchar const *root) |
2995 | { |
2996 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0) |
2997 | LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
2998 | return lapiz_file_browser_store_set_root_and_virtual_root (model, |
2999 | root, |
3000 | NULL((void*)0)); |
3001 | } |
3002 | |
3003 | gchar * |
3004 | lapiz_file_browser_store_get_root (LapizFileBrowserStore * model) |
3005 | { |
3006 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (((void*)0)); } } while (0); |
3007 | |
3008 | if (model->priv->root == NULL((void*)0) || model->priv->root->file == NULL((void*)0)) |
3009 | return NULL((void*)0); |
3010 | else |
3011 | return g_file_get_uri (model->priv->root->file); |
3012 | } |
3013 | |
3014 | gchar * |
3015 | lapiz_file_browser_store_get_virtual_root (LapizFileBrowserStore * model) |
3016 | { |
3017 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (((void*)0)); } } while (0); |
3018 | |
3019 | if (model->priv->virtual_root == NULL((void*)0) || model->priv->virtual_root->file == NULL((void*)0)) |
3020 | return NULL((void*)0); |
3021 | else |
3022 | return g_file_get_uri (model->priv->virtual_root->file); |
3023 | } |
3024 | |
3025 | void |
3026 | _lapiz_file_browser_store_iter_expanded (LapizFileBrowserStore * model, |
3027 | CtkTreeIter * iter) |
3028 | { |
3029 | FileBrowserNode *node; |
3030 | |
3031 | g_return_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return; } } while (0); |
3032 | g_return_if_fail (iter != NULL)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ; } } while (0); |
3033 | g_return_if_fail (iter->user_data != NULL)do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return; } } while (0); |
3034 | |
3035 | node = (FileBrowserNode *) (iter->user_data); |
3036 | |
3037 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )) && !NODE_LOADED (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED ))) { |
3038 | /* Load it now */ |
3039 | model_load_directory (model, node); |
3040 | } |
3041 | } |
3042 | |
3043 | void |
3044 | _lapiz_file_browser_store_iter_collapsed (LapizFileBrowserStore * model, |
3045 | CtkTreeIter * iter) |
3046 | { |
3047 | FileBrowserNode *node; |
3048 | GSList *item; |
3049 | |
3050 | g_return_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return; } } while (0); |
3051 | g_return_if_fail (iter != NULL)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ; } } while (0); |
3052 | g_return_if_fail (iter->user_data != NULL)do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return; } } while (0); |
3053 | |
3054 | node = (FileBrowserNode *) (iter->user_data); |
3055 | |
3056 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )) && NODE_LOADED (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED ))) { |
3057 | /* Unload children of the children, keeping 1 depth in cache */ |
3058 | |
3059 | for (item = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node))->children; item; |
3060 | item = item->next) { |
3061 | node = (FileBrowserNode *) (item->data); |
3062 | |
3063 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY )) && NODE_LOADED (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_LOADED ))) { |
3064 | file_browser_node_unload (model, node, |
3065 | TRUE(!(0))); |
3066 | model_check_dummy (model, node); |
3067 | } |
3068 | } |
3069 | } |
3070 | } |
3071 | |
3072 | LapizFileBrowserStoreFilterMode |
3073 | lapiz_file_browser_store_get_filter_mode (LapizFileBrowserStore * model) |
3074 | { |
3075 | return model->priv->filter_mode; |
3076 | } |
3077 | |
3078 | void |
3079 | lapiz_file_browser_store_set_filter_mode (LapizFileBrowserStore * model, |
3080 | LapizFileBrowserStoreFilterMode |
3081 | mode) |
3082 | { |
3083 | g_return_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return; } } while (0); |
3084 | |
3085 | if (model->priv->filter_mode == mode) |
3086 | return; |
3087 | |
3088 | model->priv->filter_mode = mode; |
3089 | model_refilter (model); |
3090 | |
3091 | g_object_notify (G_OBJECT (model)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), (((GType) ((20) << (2)))))))), "filter-mode"); |
3092 | } |
3093 | |
3094 | void |
3095 | lapiz_file_browser_store_set_filter_func (LapizFileBrowserStore * model, |
3096 | LapizFileBrowserStoreFilterFunc |
3097 | func, gpointer user_data) |
3098 | { |
3099 | g_return_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return; } } while (0); |
3100 | |
3101 | model->priv->filter_func = func; |
3102 | model->priv->filter_user_data = user_data; |
3103 | model_refilter (model); |
3104 | } |
3105 | |
3106 | void |
3107 | lapiz_file_browser_store_refilter (LapizFileBrowserStore * model) |
3108 | { |
3109 | model_refilter (model); |
3110 | } |
3111 | |
3112 | LapizFileBrowserStoreFilterMode |
3113 | lapiz_file_browser_store_filter_mode_get_default (void) |
3114 | { |
3115 | return LAPIZ_FILE_BROWSER_STORE_FILTER_MODE_HIDE_HIDDEN; |
3116 | } |
3117 | |
3118 | void |
3119 | lapiz_file_browser_store_refresh (LapizFileBrowserStore * model) |
3120 | { |
3121 | g_return_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return; } } while (0); |
3122 | |
3123 | if (model->priv->root == NULL((void*)0) || model->priv->virtual_root == NULL((void*)0)) |
3124 | return; |
3125 | |
3126 | /* Clear the model */ |
3127 | g_signal_emit (model, model_signals[BEGIN_REFRESH], 0); |
3128 | file_browser_node_unload (model, model->priv->virtual_root, TRUE(!(0))); |
3129 | model_load_directory (model, model->priv->virtual_root); |
3130 | g_signal_emit (model, model_signals[END_REFRESH], 0); |
3131 | } |
3132 | |
3133 | static void |
3134 | reparent_node (FileBrowserNode * node, gboolean reparent) |
3135 | { |
3136 | FileBrowserNodeDir * dir; |
3137 | GSList * child; |
3138 | GFile * parent; |
3139 | gchar * base; |
3140 | |
3141 | if (!node->file) { |
3142 | return; |
3143 | } |
3144 | |
3145 | if (reparent) { |
3146 | parent = node->parent->file; |
3147 | base = g_file_get_basename (node->file); |
3148 | g_object_unref (node->file); |
3149 | |
3150 | node->file = g_file_get_child (parent, base); |
3151 | g_free (base); |
3152 | } |
3153 | |
3154 | if (NODE_IS_DIR (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY ))) { |
3155 | dir = FILE_BROWSER_NODE_DIR (node)((FileBrowserNodeDir *)(node)); |
3156 | |
3157 | for (child = dir->children; child; child = child->next) { |
3158 | reparent_node ((FileBrowserNode *)child->data, TRUE(!(0))); |
3159 | } |
3160 | } |
3161 | } |
3162 | |
3163 | gboolean |
3164 | lapiz_file_browser_store_rename (LapizFileBrowserStore * model, |
3165 | CtkTreeIter * iter, |
3166 | const gchar * new_name, |
3167 | GError ** error) |
3168 | { |
3169 | FileBrowserNode *node; |
3170 | GFile * file; |
3171 | GFile * parent; |
3172 | GFile * previous; |
3173 | GError * err = NULL((void*)0); |
3174 | gchar * olduri; |
3175 | gchar * newuri; |
3176 | CtkTreePath *path; |
3177 | |
3178 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return ((0)); } } while (0); |
3179 | g_return_val_if_fail (iter != NULL, FALSE)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ((0)); } } while (0); |
3180 | g_return_val_if_fail (iter->user_data != NULL, FALSE)do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return ((0)); } } while (0); |
3181 | |
3182 | node = (FileBrowserNode *) (iter->user_data); |
3183 | |
3184 | parent = g_file_get_parent (node->file); |
3185 | g_return_val_if_fail (parent != NULL, FALSE)do { if ((parent != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "parent != NULL") ; return ((0)); } } while (0); |
3186 | |
3187 | file = g_file_get_child (parent, new_name); |
3188 | g_object_unref (parent); |
3189 | |
3190 | if (g_file_equal (node->file, file)) { |
3191 | g_object_unref (file); |
3192 | return TRUE(!(0)); |
3193 | } |
3194 | |
3195 | if (g_file_move (node->file, file, G_FILE_COPY_NONE, NULL((void*)0), NULL((void*)0), NULL((void*)0), &err)) { |
3196 | previous = node->file; |
3197 | node->file = file; |
3198 | |
3199 | /* This makes sure the actual info for the node is requeried */ |
3200 | file_browser_node_set_name (node); |
3201 | file_browser_node_set_from_info (model, node, NULL((void*)0), TRUE(!(0))); |
3202 | |
3203 | reparent_node (node, FALSE(0)); |
3204 | |
3205 | if (model_node_visibility (model, node)) { |
3206 | path = lapiz_file_browser_store_get_path_real (model, node); |
3207 | row_changed (model, &path, iter); |
3208 | ctk_tree_path_free (path); |
3209 | |
3210 | /* Reorder this item */ |
3211 | model_resort_node (model, node); |
3212 | } else { |
3213 | g_object_unref (previous); |
3214 | |
3215 | if (error != NULL((void*)0)) |
3216 | *error = g_error_new_literal (lapiz_file_browser_store_error_quark (), |
3217 | LAPIZ_FILE_BROWSER_ERROR_RENAME, |
3218 | _("The renamed file is currently filtered out. You need to adjust your filter settings to make the file visible")((char *) g_dgettext ("lapiz", "The renamed file is currently filtered out. You need to adjust your filter settings to make the file visible" ))); |
3219 | return FALSE(0); |
3220 | } |
3221 | |
3222 | olduri = g_file_get_uri (previous); |
3223 | newuri = g_file_get_uri (node->file); |
3224 | |
3225 | g_signal_emit (model, model_signals[RENAME], 0, olduri, newuri); |
3226 | |
3227 | g_object_unref (previous); |
3228 | g_free (olduri); |
3229 | g_free (newuri); |
3230 | |
3231 | return TRUE(!(0)); |
3232 | } else { |
3233 | g_object_unref (file); |
3234 | |
3235 | if (err) { |
3236 | if (error != NULL((void*)0)) { |
3237 | *error = |
3238 | g_error_new_literal |
3239 | (lapiz_file_browser_store_error_quark (), |
3240 | LAPIZ_FILE_BROWSER_ERROR_RENAME, |
3241 | err->message); |
3242 | } |
3243 | |
3244 | g_error_free (err); |
3245 | } |
3246 | |
3247 | return FALSE(0); |
3248 | } |
3249 | } |
3250 | |
3251 | static void |
3252 | async_data_free (AsyncData * data) |
3253 | { |
3254 | g_object_unref (data->cancellable); |
3255 | |
3256 | g_list_foreach (data->files, (GFunc)g_object_unref, NULL((void*)0)); |
3257 | g_list_free (data->files); |
3258 | |
3259 | if (!data->removed) |
3260 | data->model->priv->async_handles = g_slist_remove (data->model->priv->async_handles, data); |
3261 | |
3262 | g_free (data); |
3263 | } |
3264 | |
3265 | static gboolean |
3266 | emit_no_trash (AsyncData * data) |
3267 | { |
3268 | /* Emit the no trash error */ |
3269 | gboolean ret; |
3270 | |
3271 | g_signal_emit (data->model, model_signals[NO_TRASH], 0, data->files, &ret); |
3272 | return ret; |
3273 | } |
3274 | |
3275 | static void |
3276 | delete_file_finished (GFile *file, |
3277 | GAsyncResult *res, |
3278 | AsyncData *data) |
3279 | { |
3280 | GError * error = NULL((void*)0); |
3281 | gboolean ok; |
3282 | |
3283 | if (data->trash) |
3284 | { |
3285 | ok = g_file_trash_finish (file, res, &error); |
3286 | } |
3287 | else |
3288 | { |
3289 | ok = g_file_delete_finish (file, res, &error); |
3290 | } |
3291 | |
3292 | if (ok) |
3293 | { |
3294 | /* Remove the file from the model */ |
3295 | FileBrowserNode *node = model_find_node (data->model, NULL((void*)0), file); |
3296 | |
3297 | if (node != NULL((void*)0)) |
3298 | { |
3299 | model_remove_node (data->model, node, NULL((void*)0), TRUE(!(0))); |
3300 | } |
3301 | |
3302 | /* Process the next file */ |
3303 | data->iter = data->iter->next; |
3304 | } |
3305 | else if (!ok && error != NULL((void*)0)) |
3306 | { |
3307 | gint code = error->code; |
3308 | g_error_free (error); |
3309 | |
3310 | if (data->trash && code == G_IO_ERROR_NOT_SUPPORTED) { |
3311 | /* Trash is not supported on this system. Ask the user |
3312 | * if he wants to delete completely the files instead. |
3313 | */ |
3314 | if (emit_no_trash (data)) |
3315 | { |
3316 | /* Changes this into a delete job */ |
3317 | data->trash = FALSE(0); |
3318 | data->iter = data->files; |
3319 | } |
3320 | else |
3321 | { |
3322 | /* End the job */ |
3323 | async_data_free (data); |
3324 | return; |
3325 | } |
3326 | } |
3327 | else if (code == G_IO_ERROR_CANCELLED) |
3328 | { |
3329 | /* Job has been cancelled, end the job */ |
3330 | async_data_free (data); |
3331 | return; |
3332 | } |
3333 | } |
3334 | |
3335 | /* Continue the job */ |
3336 | delete_files (data); |
3337 | } |
3338 | |
3339 | static void |
3340 | delete_files (AsyncData *data) |
3341 | { |
3342 | GFile *file; |
3343 | |
3344 | /* Check if our job is done */ |
3345 | if (data->iter == NULL((void*)0)) |
3346 | { |
3347 | async_data_free (data); |
3348 | return; |
3349 | } |
3350 | |
3351 | file = G_FILE (data->iter->data)((((GFile*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((data->iter->data)), ((g_file_get_type ())))))); |
3352 | |
3353 | if (data->trash) |
3354 | { |
3355 | g_file_trash_async (file, |
3356 | G_PRIORITY_DEFAULT0, |
3357 | data->cancellable, |
3358 | (GAsyncReadyCallback)delete_file_finished, |
3359 | data); |
3360 | } |
3361 | else |
3362 | { |
3363 | g_file_delete_async (file, |
3364 | G_PRIORITY_DEFAULT0, |
3365 | data->cancellable, |
3366 | (GAsyncReadyCallback)delete_file_finished, |
3367 | data); |
3368 | } |
3369 | } |
3370 | |
3371 | LapizFileBrowserStoreResult |
3372 | lapiz_file_browser_store_delete_all (LapizFileBrowserStore *model, |
3373 | GList *rows, gboolean trash) |
3374 | { |
3375 | FileBrowserNode * node; |
3376 | AsyncData * data; |
3377 | GList * files = NULL((void*)0); |
3378 | GList * row; |
3379 | CtkTreeIter iter; |
3380 | CtkTreePath * prev = NULL((void*)0); |
3381 | CtkTreePath * path; |
3382 | |
3383 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model), LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
3384 | |
3385 | if (rows == NULL((void*)0)) |
3386 | return LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE; |
3387 | |
3388 | /* First we sort the paths so that we can later on remove any |
3389 | files/directories that are actually subfiles/directories of |
3390 | a directory that's also deleted */ |
3391 | rows = g_list_sort (g_list_copy (rows), (GCompareFunc)ctk_tree_path_compare); |
3392 | |
3393 | for (row = rows; row; row = row->next) { |
3394 | path = (CtkTreePath *)(row->data); |
3395 | |
3396 | if (!ctk_tree_model_get_iter (CTK_TREE_MODEL (model)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((model)), ((ctk_tree_model_get_type ())))))), &iter, path)) |
3397 | continue; |
3398 | |
3399 | /* Skip if the current path is actually a descendant of the |
3400 | previous path */ |
3401 | if (prev != NULL((void*)0) && ctk_tree_path_is_descendant (path, prev)) |
3402 | continue; |
3403 | |
3404 | prev = path; |
3405 | node = (FileBrowserNode *)(iter.user_data); |
3406 | files = g_list_prepend (files, g_object_ref (node->file)((__typeof__ (node->file)) (g_object_ref) (node->file))); |
3407 | } |
3408 | |
3409 | data = g_new (AsyncData, 1)((AsyncData *) g_malloc_n ((1), sizeof (AsyncData))); |
3410 | |
3411 | data->model = model; |
3412 | data->cancellable = g_cancellable_new (); |
3413 | data->files = files; |
3414 | data->trash = trash; |
3415 | data->iter = files; |
3416 | data->removed = FALSE(0); |
3417 | |
3418 | model->priv->async_handles = |
3419 | g_slist_prepend (model->priv->async_handles, data); |
3420 | |
3421 | delete_files (data); |
3422 | g_list_free (rows); |
3423 | |
3424 | return LAPIZ_FILE_BROWSER_STORE_RESULT_OK; |
3425 | } |
3426 | |
3427 | LapizFileBrowserStoreResult |
3428 | lapiz_file_browser_store_delete (LapizFileBrowserStore * model, |
3429 | CtkTreeIter * iter, gboolean trash) |
3430 | { |
3431 | FileBrowserNode *node; |
3432 | GList *rows = NULL((void*)0); |
3433 | LapizFileBrowserStoreResult result; |
3434 | |
3435 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model), LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
3436 | g_return_val_if_fail (iter != NULL, LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
3437 | g_return_val_if_fail (iter->user_data != NULL, LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE)do { if ((iter->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter->user_data != NULL" ); return (LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE); } } while (0); |
3438 | |
3439 | node = (FileBrowserNode *) (iter->user_data); |
3440 | |
3441 | if (NODE_IS_DUMMY (node)(((node)->flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DUMMY ))) |
3442 | return LAPIZ_FILE_BROWSER_STORE_RESULT_NO_CHANGE; |
3443 | |
3444 | rows = g_list_append(NULL((void*)0), lapiz_file_browser_store_get_path_real (model, node)); |
3445 | result = lapiz_file_browser_store_delete_all (model, rows, trash); |
3446 | |
3447 | g_list_foreach (rows, (GFunc)ctk_tree_path_free, NULL((void*)0)); |
3448 | g_list_free (rows); |
3449 | |
3450 | return result; |
3451 | } |
3452 | |
3453 | gboolean |
3454 | lapiz_file_browser_store_new_file (LapizFileBrowserStore * model, |
3455 | CtkTreeIter * parent, |
3456 | CtkTreeIter * iter) |
3457 | { |
3458 | GFile * file; |
3459 | GFileOutputStream * stream; |
3460 | FileBrowserNodeDir *parent_node; |
3461 | gboolean result = FALSE(0); |
3462 | FileBrowserNode *node; |
3463 | GError * error = NULL((void*)0); |
3464 | |
3465 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return ((0)); } } while (0); |
3466 | g_return_val_if_fail (parent != NULL, FALSE)do { if ((parent != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "parent != NULL") ; return ((0)); } } while (0); |
3467 | g_return_val_if_fail (parent->user_data != NULL, FALSE)do { if ((parent->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "parent->user_data != NULL" ); return ((0)); } } while (0); |
3468 | g_return_val_if_fail (NODE_IS_DIRdo { if ((((((FileBrowserNode *) (parent->user_data))-> flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY)))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char* ) (__func__)), "NODE_IS_DIR ((FileBrowserNode *) (parent->user_data))" ); return ((0)); } } while (0) |
3469 | ((FileBrowserNode *) (parent->user_data)),do { if ((((((FileBrowserNode *) (parent->user_data))-> flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY)))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char* ) (__func__)), "NODE_IS_DIR ((FileBrowserNode *) (parent->user_data))" ); return ((0)); } } while (0) |
3470 | FALSE)do { if ((((((FileBrowserNode *) (parent->user_data))-> flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY)))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char* ) (__func__)), "NODE_IS_DIR ((FileBrowserNode *) (parent->user_data))" ); return ((0)); } } while (0); |
3471 | g_return_val_if_fail (iter != NULL, FALSE)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ((0)); } } while (0); |
3472 | |
3473 | parent_node = FILE_BROWSER_NODE_DIR (parent->user_data)((FileBrowserNodeDir *)(parent->user_data)); |
3474 | /* Translators: This is the default name of new files created by the file browser pane. */ |
3475 | file = unique_new_name (((FileBrowserNode *) parent_node)->file, _("file")((char *) g_dgettext ("lapiz", "file"))); |
3476 | |
3477 | stream = g_file_create (file, G_FILE_CREATE_NONE, NULL((void*)0), &error); |
3478 | |
3479 | if (!stream) |
3480 | { |
3481 | g_signal_emit (model, model_signals[ERROR], 0, |
3482 | LAPIZ_FILE_BROWSER_ERROR_NEW_FILE, |
3483 | error->message); |
3484 | g_error_free (error); |
3485 | } else { |
3486 | g_object_unref (stream); |
3487 | node = model_add_node_from_file (model, |
3488 | (FileBrowserNode *)parent_node, |
3489 | file, |
3490 | NULL((void*)0)); |
3491 | |
3492 | if (model_node_visibility (model, node)) { |
3493 | iter->user_data = node; |
3494 | result = TRUE(!(0)); |
3495 | } else { |
3496 | g_signal_emit (model, model_signals[ERROR], 0, |
3497 | LAPIZ_FILE_BROWSER_ERROR_NEW_FILE, |
3498 | _((char *) g_dgettext ("lapiz", "The new file is currently filtered out. You need to adjust your filter settings to make the file visible" )) |
3499 | ("The new file is currently filtered out. You need to adjust your filter settings to make the file visible")((char *) g_dgettext ("lapiz", "The new file is currently filtered out. You need to adjust your filter settings to make the file visible" ))); |
3500 | } |
3501 | } |
3502 | |
3503 | g_object_unref (file); |
3504 | return result; |
3505 | } |
3506 | |
3507 | gboolean |
3508 | lapiz_file_browser_store_new_directory (LapizFileBrowserStore * model, |
3509 | CtkTreeIter * parent, |
3510 | CtkTreeIter * iter) |
3511 | { |
3512 | GFile * file; |
3513 | FileBrowserNodeDir *parent_node; |
3514 | GError * error = NULL((void*)0); |
3515 | FileBrowserNode *node; |
3516 | gboolean result = FALSE(0); |
3517 | |
3518 | g_return_val_if_fail (LAPIZ_IS_FILE_BROWSER_STORE (model), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((lapiz_file_browser_store_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0 ), ((const char*) (__func__)), "LAPIZ_IS_FILE_BROWSER_STORE (model)" ); return ((0)); } } while (0); |
3519 | g_return_val_if_fail (parent != NULL, FALSE)do { if ((parent != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "parent != NULL") ; return ((0)); } } while (0); |
3520 | g_return_val_if_fail (parent->user_data != NULL, FALSE)do { if ((parent->user_data != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "parent->user_data != NULL" ); return ((0)); } } while (0); |
3521 | g_return_val_if_fail (NODE_IS_DIRdo { if ((((((FileBrowserNode *) (parent->user_data))-> flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY)))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char* ) (__func__)), "NODE_IS_DIR ((FileBrowserNode *) (parent->user_data))" ); return ((0)); } } while (0) |
3522 | ((FileBrowserNode *) (parent->user_data)),do { if ((((((FileBrowserNode *) (parent->user_data))-> flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY)))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char* ) (__func__)), "NODE_IS_DIR ((FileBrowserNode *) (parent->user_data))" ); return ((0)); } } while (0) |
3523 | FALSE)do { if ((((((FileBrowserNode *) (parent->user_data))-> flags & LAPIZ_FILE_BROWSER_STORE_FLAG_IS_DIRECTORY)))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char* ) (__func__)), "NODE_IS_DIR ((FileBrowserNode *) (parent->user_data))" ); return ((0)); } } while (0); |
3524 | g_return_val_if_fail (iter != NULL, FALSE)do { if ((iter != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "iter != NULL"); return ((0)); } } while (0); |
3525 | |
3526 | parent_node = FILE_BROWSER_NODE_DIR (parent->user_data)((FileBrowserNodeDir *)(parent->user_data)); |
3527 | /* Translators: This is the default name of new directories created by the file browser pane. */ |
3528 | file = unique_new_name (((FileBrowserNode *) parent_node)->file, _("directory")((char *) g_dgettext ("lapiz", "directory"))); |
3529 | |
3530 | if (!g_file_make_directory (file, NULL((void*)0), &error)) { |
3531 | g_signal_emit (model, model_signals[ERROR], 0, |
3532 | LAPIZ_FILE_BROWSER_ERROR_NEW_DIRECTORY, |
3533 | error->message); |
3534 | g_error_free (error); |
3535 | } else { |
3536 | node = model_add_node_from_file (model, |
3537 | (FileBrowserNode *)parent_node, |
3538 | file, |
3539 | NULL((void*)0)); |
3540 | |
3541 | if (model_node_visibility (model, node)) { |
3542 | iter->user_data = node; |
3543 | result = TRUE(!(0)); |
3544 | } else { |
3545 | g_signal_emit (model, model_signals[ERROR], 0, |
3546 | LAPIZ_FILE_BROWSER_ERROR_NEW_FILE, |
3547 | _((char *) g_dgettext ("lapiz", "The new directory is currently filtered out. You need to adjust your filter settings to make the directory visible" )) |
3548 | ("The new directory is currently filtered out. You need to adjust your filter settings to make the directory visible")((char *) g_dgettext ("lapiz", "The new directory is currently filtered out. You need to adjust your filter settings to make the directory visible" ))); |
3549 | } |
3550 | } |
3551 | |
3552 | g_object_unref (file); |
3553 | return result; |
3554 | } |
3555 | |
3556 | void |
3557 | _lapiz_file_browser_store_register_type (GTypeModule *type_module) |
3558 | { |
3559 | lapiz_file_browser_store_register_type (type_module); |
3560 | } |
3561 | |
3562 | // ex:ts=8:noet: |