Merge parts of view_dir_list/tree constructors/destructors to
[geeqie.git] / src / view_dir.c
1 /*
2  * Geeqie
3  * (C) 2008 Vladimir Nadvornik
4  *
5  * Author: Laurent Monin
6  *
7  * This software is released under the GNU General Public License (GNU GPL).
8  * Please read the included file COPYING for more information.
9  * This software comes with no warranty of any kind, use at your own risk!
10  */
11
12 #include "main.h"
13 #include "view_dir.h"
14
15 #include "filelist.h"
16 #include "layout_util.h"
17 #include "ui_menu.h"
18 #include "utilops.h"
19 #include "view_dir_list.h"
20 #include "view_dir_tree.h"
21
22 GtkRadioActionEntry menu_view_dir_radio_entries[] = {
23   { "FolderList",       NULL,           N_("List"),             "<meta>L",      NULL, DIRVIEW_LIST },
24   { "FolderTree",       NULL,           N_("Tr_ee"),            "<control>T",   NULL, DIRVIEW_TREE },
25 };
26
27 void vd_destroy_cb(GtkWidget *widget, gpointer data)
28 {
29         ViewDir *vd = data;
30
31         if (vd->popup)
32                 {
33                 g_signal_handlers_disconnect_matched(G_OBJECT(vd->popup), G_SIGNAL_MATCH_DATA,
34                                                      0, 0, 0, NULL, vd);
35                 gtk_widget_destroy(vd->popup);
36                 }
37
38         if (vd->widget_destroy_cb) vd->widget_destroy_cb(widget, data);
39
40         if (vd->pf) folder_icons_free(vd->pf);
41         if (vd->drop_list) filelist_free(vd->drop_list);
42
43         if (vd->path) g_free(vd->path);
44         if (vd->info) g_free(vd->info);
45
46         g_free(vd);
47 }
48
49 ViewDir *vd_new(DirViewType type, const gchar *path)
50 {
51         ViewDir *vd = g_new0(ViewDir, 1);
52
53         vd->path = NULL;
54         vd->click_fd = NULL;
55
56         vd->drop_fd = NULL;
57         vd->drop_list = NULL;
58         vd->drop_scroll_id = -1;
59         vd->drop_list = NULL;
60
61         vd->popup = NULL;
62         vd->pf = NULL;
63
64         vd->widget = gtk_scrolled_window_new(NULL, NULL);
65         gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vd->widget), GTK_SHADOW_IN);
66         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vd->widget),
67                                        GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
68
69         switch(type)
70         {
71         case DIRVIEW_LIST: vd = vdlist_new(vd, path); break;
72         case DIRVIEW_TREE: vd = vdtree_new(vd, path); break;
73         }
74
75         g_signal_connect(G_OBJECT(vd->widget), "destroy",
76                          G_CALLBACK(vd_destroy_cb), vd);
77
78         vd->pf = folder_icons_new();
79
80         return vd;
81 }
82         
83 void vd_set_select_func(ViewDir *vd,
84                         void (*func)(ViewDir *vd, const gchar *path, gpointer data), gpointer data)
85 {
86         vd->select_func = func;
87         vd->select_data = data;
88 }
89
90 void vd_set_layout(ViewDir *vd, LayoutWindow *layout)
91 {
92         vd->layout = layout;
93 }
94
95 gint vd_set_path(ViewDir *vd, const gchar *path)
96 {
97         gint ret = FALSE;
98
99         switch(vd->type)
100         {
101         case DIRVIEW_LIST: ret = vdlist_set_path(vd, path); break;
102         case DIRVIEW_TREE: ret = vdtree_set_path(vd, path); break;
103         }
104
105         return ret;
106 }
107
108 void vd_refresh(ViewDir *vd)
109 {
110         switch(vd->type)
111         {
112         case DIRVIEW_LIST: return vdlist_refresh(vd);
113         case DIRVIEW_TREE: return vdtree_refresh(vd);
114         }
115 }
116
117 const gchar *vd_row_get_path(ViewDir *vd, gint row)
118 {
119         const gchar *ret = NULL;
120
121         switch(vd->type)
122         {
123         case DIRVIEW_LIST: ret = vdlist_row_get_path(vd, row); break;
124         case DIRVIEW_TREE: ret = vdtree_row_get_path(vd, row); break;
125         }
126
127         return ret;
128 }
129
130 void vd_color_set(ViewDir *vd, FileData *fd, gint color_set)
131 {
132         GtkTreeModel *store;
133         GtkTreeIter iter;
134
135         switch(vd->type)
136         {
137         case DIRVIEW_LIST:
138                 {
139                 if (vdlist_find_row(vd, fd, &iter) < 0) return;
140                 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view));
141                 gtk_list_store_set(GTK_LIST_STORE(store), &iter, DIR_COLUMN_COLOR, color_set, -1);
142                 }
143                 break;
144         case DIRVIEW_TREE:
145                 {
146                 if (vdtree_find_row(vd, fd, &iter, NULL) < 0) return;
147                 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view));
148                 gtk_tree_store_set(GTK_TREE_STORE(store), &iter, DIR_COLUMN_COLOR, color_set, -1);
149                 }
150                 break;
151         }
152 }
153
154 void vd_popup_destroy_cb(GtkWidget *widget, gpointer data)
155 {
156         ViewDir *vd = data;
157
158         vd_color_set(vd, vd->click_fd, FALSE);
159         vd->click_fd = NULL;
160         vd->popup = NULL;
161
162         vd_color_set(vd, vd->drop_fd, FALSE);
163         filelist_free(vd->drop_list);
164         vd->drop_list = NULL;
165         vd->drop_fd = NULL;
166 }
167
168 /*
169  *-----------------------------------------------------------------------------
170  * drop menu (from dnd)
171  *-----------------------------------------------------------------------------
172  */
173
174 static void vd_drop_menu_copy_cb(GtkWidget *widget, gpointer data)
175 {
176         ViewDir *vd = data;
177         const gchar *path;
178         GList *list;
179
180         if (!vd->drop_fd) return;
181
182         path = vd->drop_fd->path;
183         list = vd->drop_list;
184         vd->drop_list = NULL;
185
186         file_util_copy_simple(list, path);
187 }
188
189 static void vd_drop_menu_move_cb(GtkWidget *widget, gpointer data)
190 {
191         ViewDir *vd = data;
192         const gchar *path;
193         GList *list;
194
195         if (!vd->drop_fd) return;
196
197         path = vd->drop_fd->path;
198         list = vd->drop_list;
199
200         vd->drop_list = NULL;
201
202         file_util_move_simple(list, path);
203 }
204
205 GtkWidget *vd_drop_menu(ViewDir *vd, gint active)
206 {
207         GtkWidget *menu;
208
209         menu = popup_menu_short_lived();
210         g_signal_connect(G_OBJECT(menu), "destroy",
211                          G_CALLBACK(vd_popup_destroy_cb), vd);
212
213         menu_item_add_stock_sensitive(menu, _("_Copy"), GTK_STOCK_COPY, active,
214                                       G_CALLBACK(vd_drop_menu_copy_cb), vd);
215         menu_item_add_sensitive(menu, _("_Move"), active, G_CALLBACK(vd_drop_menu_move_cb), vd);
216
217         menu_item_add_divider(menu);
218         menu_item_add_stock(menu, _("Cancel"), GTK_STOCK_CANCEL, NULL, vd);
219
220         return menu;
221 }
222