Reduce memory usage a little by avoiding the cover-art array to be initialized in...
[gmpc.git] / src / browsers / playlist3-file-browser.c
blobc8ff6d6c83741d9b2800352f788fead7aa8cd57b
1 /*
2 *Copyright (C) 2004-2007 Qball Cow <qball@sarine.nl>
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public
15 * License along with this program; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
20 #include <gtk/gtk.h>
21 #include <gdk/gdkkeysyms.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <glade/glade.h>
26 #include "plugin.h"
28 #include "main.h"
29 #include "misc.h"
30 #include "playlist3.h"
31 #include "playlist3-file-browser.h"
32 #include "config1.h"
33 #include "TreeSearchWidget.h"
34 #include "gmpc-mpddata-model.h"
35 #include "gmpc-mpddata-treeview.h"
36 #include "playlist3-playlist-editor.h"
38 static void pl3_file_browser_edit_columns(void);
40 static void pl3_file_browser_destroy(void);
41 static void pl3_file_browser_add(GtkWidget *cat_tree);
42 static void pl3_file_browser_unselected(GtkWidget *container);
43 static void pl3_file_browser_selected(GtkWidget *container);
44 static void pl3_file_browser_fill_tree(GtkWidget *tree,GtkTreeIter *iter, GtkTreePath *tpath, gpointer user_data);
45 static void pl3_file_browser_collapse_row(GtkTreeView *tree, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data);
46 static int pl3_file_browser_cat_popup(GtkWidget *tree, GdkEventButton *event, gpointer user_data);
47 static gboolean pl3_file_browser_cat_key_press(GtkWidget *tree, GdkEventKey *event,gpointer data);
48 static void pl3_file_browser_delete_playlist_from_right(GtkMenuItem *bt);
49 /* testing */
50 static void pl3_file_browser_reupdate(void);
51 static void pl3_file_browser_save_myself(void);
52 static int pl3_file_browser_add_go_menu(GtkWidget *menu);
53 static void pl3_file_browser_activate(void);
54 static gboolean pl3_file_browser_button_release_event(GtkWidget *but, GdkEventButton *event);
55 static gboolean pl3_file_browser_button_press_event(GtkWidget *but, GdkEventButton *event);
56 static void pl3_file_browser_row_activated(GtkTreeView *tree, GtkTreePath *tp);
57 static void pl3_file_browser_add_selected(void);
58 static void pl3_file_browser_replace_selected(void);
59 static int pl3_file_browser_playlist_key_press(GtkWidget *tree,GdkEventKey *event);
60 static void pl3_file_browser_show_info(void);
61 static void pl3_file_browser_view_folder(GtkTreeSelection *selection, gpointer user_data);
62 static void pl3_file_browser_update_folder(void);
63 static void pl3_file_browser_add_folder(void);
64 static void pl3_file_browser_delete_playlist(GtkMenuItem *bt);
65 static void pl3_file_browser_connection_changed(MpdObj *mi, int connect, gpointer data);
66 static void pl3_file_browser_status_changed(MpdObj *mi,ChangedStatusType what, void *data);
67 static void pl3_file_browser_disconnect(void);
69 GtkTreeRowReference *pl3_fb_tree_ref = NULL;
71 enum {
72 PL3_FB_ICON = 0,
73 PL3_FB_NAME = 1,
74 PL3_FB_PATH = 2,
75 PL3_FB_OPEN = 3
77 /**
78 * Get/Set enabled
80 static int pl3_file_browser_get_enabled(void)
82 return cfg_get_single_value_as_int_with_default(config, "file-browser","enable", TRUE);
84 static void pl3_file_browser_set_enabled(int enabled)
86 cfg_set_single_value_as_int(config, "file-browser","enable", enabled);
87 if(enabled ) {
88 GtkTreeView *tree = playlist3_get_category_tree_view();
89 pl3_file_browser_add((GtkWidget *)tree);
90 } else if (!enabled ) {
91 pl3_file_browser_destroy();
95 /**
96 * Plugin structure
98 gmpcPlBrowserPlugin file_browser_gbp = {
99 .add = pl3_file_browser_add,
100 .selected = pl3_file_browser_selected,
101 .unselected = pl3_file_browser_unselected,
102 .add_go_menu = pl3_file_browser_add_go_menu,
105 gmpcPlugin file_browser_plug = {
106 .name = N_("File Browser"),
107 .version = {1,1,1},
108 .plugin_type = GMPC_PLUGIN_PL_BROWSER,
109 .destroy = pl3_file_browser_destroy,
110 .browser = &file_browser_gbp,
111 .mpd_status_changed = pl3_file_browser_status_changed,
112 .mpd_connection_changed = pl3_file_browser_connection_changed,
113 .get_enabled = pl3_file_browser_get_enabled,
114 .set_enabled = pl3_file_browser_set_enabled,
115 .save_yourself = pl3_file_browser_save_myself
119 extern GladeXML *pl3_xml;
122 /* internal */
123 GtkWidget *pl3_fb_tree = NULL;
124 GtkWidget *pl3_fb_vbox = NULL;
125 GtkWidget *pl3_fb_tree_search = NULL;
126 GmpcMpdDataModel *pl3_fb_store2 = NULL;
127 static GtkTreeStore *pl3_fb_dir_store = NULL;
128 static GtkWidget *pl3_fb_dir_tree = NULL;
130 static void pl3_file_browser_search_activate()
132 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_store2);
133 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pl3_fb_tree));
134 if (gtk_tree_selection_count_selected_rows (selection) == 1)
136 GList *list = gtk_tree_selection_get_selected_rows (selection, &model);
137 pl3_file_browser_row_activated(GTK_TREE_VIEW(pl3_fb_tree),(GtkTreePath *)list->data);
138 /* free list */
139 g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
140 g_list_free (list);
143 static void pl3_file_browser_dir_row_activated(GtkTreeView *tree, GtkTreePath *tp, GtkTreeViewColumn *col,gpointer user_data)
145 if(!mpd_check_connected(connection))
146 return;
147 if(gtk_tree_view_row_expanded(tree,tp))
148 gtk_tree_view_collapse_row(tree,tp);
149 else
150 gtk_tree_view_expand_row(tree,tp,FALSE);
152 static void playtime_changed(GmpcMpdDataModel *model, gulong playtime)
154 if(pl3_cat_get_selected_browser() == file_browser_plug.id)
156 playlist3_show_playtime(playtime);
160 static void pl3_file_browser_init()
162 GtkCellRenderer *renderer;
163 GtkTreeViewColumn *column;
164 GtkWidget *pl3_fb_sw = NULL;
165 GtkWidget *vbox,*sw,*tree;
166 int pos;
168 pl3_fb_store2 = gmpc_mpddata_model_new();
169 gmpc_mpddata_model_disable_image(GMPC_MPDDATA_MODEL(pl3_fb_store2));
170 g_signal_connect(G_OBJECT(pl3_fb_store2), "playtime_changed", G_CALLBACK(playtime_changed), NULL);
173 pos = cfg_get_single_value_as_int_with_default(config, "file-browser", "pane-pos", 150);
174 pl3_fb_vbox = gtk_hpaned_new();
175 gtk_paned_set_position(GTK_PANED(pl3_fb_vbox), pos);
176 vbox = gtk_vbox_new(FALSE, 6);
179 /* icon id, name, full path */
180 pl3_fb_dir_store = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,G_TYPE_BOOLEAN);
182 sw = gtk_scrolled_window_new(NULL, NULL);
183 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
184 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
185 pl3_fb_dir_tree = tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(pl3_fb_dir_store));
186 gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(tree), TRUE);
187 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE);
188 column = gtk_tree_view_column_new();
189 gtk_tree_view_column_set_title(column, _("Directories"));
190 renderer = gtk_cell_renderer_pixbuf_new();
191 gtk_tree_view_column_pack_start(column, renderer, FALSE);
192 gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(tree), TRUE);
193 gtk_tree_view_column_add_attribute(column, renderer, "icon-name",PL3_FB_ICON);
194 gtk_tree_view_column_set_sizing(column , GTK_TREE_VIEW_COLUMN_FIXED);
195 renderer = gtk_cell_renderer_text_new();
196 gtk_tree_view_column_pack_start(column, renderer, TRUE);
197 gtk_tree_view_column_add_attribute(column, renderer, "text", PL3_FB_NAME);
198 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree),column, -1);
199 /* set the search column */
200 gtk_tree_view_set_search_column(GTK_TREE_VIEW(tree), PL3_FB_NAME);
202 g_signal_connect(G_OBJECT(tree), "row-expanded", G_CALLBACK(pl3_file_browser_fill_tree), NULL);
203 g_signal_connect(G_OBJECT(tree), "row-collapsed", G_CALLBACK(pl3_file_browser_collapse_row), NULL);
204 g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree))), "changed", G_CALLBACK(pl3_file_browser_view_folder), NULL);
205 g_signal_connect(G_OBJECT(tree), "button-release-event", G_CALLBACK(pl3_file_browser_cat_popup), NULL);
206 g_signal_connect(G_OBJECT(tree), "key-press-event", G_CALLBACK(pl3_file_browser_cat_key_press), NULL);
207 g_signal_connect(G_OBJECT(tree), "row-activated", G_CALLBACK(pl3_file_browser_dir_row_activated), NULL);
209 gtk_container_add(GTK_CONTAINER(sw), tree);
210 gtk_widget_show_all(sw);
211 gtk_paned_add1(GTK_PANED(pl3_fb_vbox), sw);
213 /* set up the tree */
214 pl3_fb_tree= gmpc_mpddata_treeview_new("file-browser",TRUE, GTK_TREE_MODEL(pl3_fb_store2));
216 /* setup signals */
217 g_signal_connect(G_OBJECT(pl3_fb_tree), "row-activated",G_CALLBACK(pl3_file_browser_row_activated), NULL);
218 g_signal_connect(G_OBJECT(pl3_fb_tree), "button-release-event", G_CALLBACK(pl3_file_browser_button_release_event), NULL);
219 g_signal_connect(G_OBJECT(pl3_fb_tree), "button-press-event", G_CALLBACK(pl3_file_browser_button_press_event), NULL);
220 g_signal_connect(G_OBJECT(pl3_fb_tree), "key-press-event", G_CALLBACK(pl3_file_browser_playlist_key_press), NULL);
222 /* set up the scrolled window */
223 pl3_fb_sw = gtk_scrolled_window_new(NULL, NULL);
224 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pl3_fb_sw), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
225 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(pl3_fb_sw), GTK_SHADOW_ETCHED_IN);
226 gtk_container_add(GTK_CONTAINER(pl3_fb_sw), pl3_fb_tree);
230 gtk_box_pack_start(GTK_BOX(vbox), pl3_fb_sw, TRUE, TRUE,0);
231 gtk_widget_show_all(pl3_fb_sw);
232 pl3_fb_tree_search = treesearch_new(GTK_TREE_VIEW(pl3_fb_tree), MPDDATA_MODEL_COL_MARKUP);
233 gtk_box_pack_end(GTK_BOX(vbox), pl3_fb_tree_search, FALSE, TRUE,0);
234 g_signal_connect(G_OBJECT(pl3_fb_tree_search),"result-activate", G_CALLBACK(pl3_file_browser_search_activate), NULL);
236 gtk_paned_add2(GTK_PANED(pl3_fb_vbox), vbox);
237 /* set initial state */
238 debug_printf(DEBUG_INFO,"initialized current playlist treeview\n");
239 gtk_widget_show(vbox);
240 gtk_widget_show(pl3_fb_vbox);
241 g_object_ref(G_OBJECT(pl3_fb_vbox));
244 static void pl3_file_browser_add_folder()
246 GtkTreeSelection *selec = gtk_tree_view_get_selection(GTK_TREE_VIEW(pl3_fb_dir_tree));
247 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_dir_store);
248 GtkTreeIter iter;
250 if(!mpd_check_connected(connection))
252 return;
254 if(gtk_tree_selection_get_selected(selec,&model, &iter))
256 char *path, *icon;
257 char *message = NULL;
258 gtk_tree_model_get(model, &iter, PL3_FB_PATH, &path,PL3_FB_ICON, &icon, -1);
261 message = g_strdup_printf(_("Added folder '%s' recursively"), path);
262 pl3_push_statusbar_message(message);
263 q_free(message);
264 if(strcmp("media-playlist", icon)) {
265 mpd_playlist_queue_add(connection, path);
267 else {
268 mpd_playlist_queue_load(connection, path);
270 mpd_playlist_queue_commit(connection);
271 q_free(path);
272 q_free(icon);
277 static void pl3_file_browser_update_folder()
279 GtkTreeSelection *selec = gtk_tree_view_get_selection((GtkTreeView *)pl3_fb_dir_tree);
280 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_dir_store);
281 GtkTreeIter iter;
283 if(!mpd_check_connected(connection))
285 return;
287 if(gtk_tree_selection_get_selected(selec,&model, &iter))
289 char *path;
290 gtk_tree_model_get(model, &iter, PL3_FB_PATH, &path, -1);
291 if(path)
293 mpd_database_update_dir(connection, path);
294 q_free(path);
300 static void pl3_file_browser_update_folder_left_pane()
302 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_store2);
303 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pl3_fb_tree));
304 GtkTreeIter iter;
306 if(!mpd_check_connected(connection))
307 return;
309 if (gtk_tree_selection_count_selected_rows (selection) == 1)
311 GList *list = gtk_tree_selection_get_selected_rows (selection, &model);
312 /* free list */
313 if(gtk_tree_model_get_iter(model, &iter,list->data))
315 char *path;
316 gtk_tree_model_get(model, &iter, MPDDATA_MODEL_COL_PATH, &path, -1);
317 if(path)
319 mpd_database_update_dir(connection, path);
320 q_free(path);
323 g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
324 g_list_free (list);
330 static void pl3_file_browser_replace_folder()
332 mpd_playlist_clear(connection);
333 if(mpd_check_connected(connection))
335 pl3_file_browser_add_folder();
336 mpd_player_play(connection);
341 /* add's the toplevel entry for the file browser, it also add's a fantom child */
342 static void pl3_file_browser_add(GtkWidget *cat_tree)
344 GtkTreeIter iter,child;
345 GtkTreePath *path;
346 gint pos = cfg_get_single_value_as_int_with_default(config, "file-browser","position",2);
347 playlist3_insert_browser(&iter, pos);
348 gtk_list_store_set(GTK_LIST_STORE(pl3_tree), &iter,
349 PL3_CAT_TYPE, file_browser_plug.id,
350 PL3_CAT_TITLE, _("File Browser"),
351 PL3_CAT_INT_ID, "/",
352 PL3_CAT_ICON_ID, "gtk-open",
353 PL3_CAT_PROC, FALSE,
354 PL3_CAT_ICON_SIZE,GTK_ICON_SIZE_DND,-1);
355 /* add fantom child for lazy tree */
357 if(pl3_fb_tree_ref)
359 gtk_tree_row_reference_free(pl3_fb_tree_ref);
360 pl3_fb_tree_ref = NULL;
362 path = gtk_tree_model_get_path(GTK_TREE_MODEL(pl3_tree), &iter);
363 if(path)
365 pl3_fb_tree_ref = gtk_tree_row_reference_new(GTK_TREE_MODEL(pl3_tree),path);
366 gtk_tree_path_free(path);
370 if(pl3_fb_tree == NULL)
372 pl3_file_browser_init();
376 gtk_tree_store_append(pl3_fb_dir_store, &iter, NULL);
377 gtk_tree_store_set(pl3_fb_dir_store, &iter,
378 PL3_FB_ICON, "gtk-open",
379 PL3_FB_NAME, "/",
380 PL3_FB_PATH,"/",
381 PL3_FB_OPEN,FALSE,
382 -1);
383 gtk_tree_store_append(pl3_fb_dir_store, &child, &iter);
388 static void pl3_file_browser_reupdate_folder(GtkTreeIter *iter)
390 MpdData *data = NULL;
391 gchar *path = NULL;
392 gboolean temp = FALSE;
393 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_dir_store);
394 gtk_tree_model_get(GTK_TREE_MODEL(pl3_fb_dir_store), iter, 3, &temp,2, &path, -1);
395 if(path && temp)
397 GtkTreeIter child, child2,child3;
398 data = mpd_database_get_directory(connection,path);
399 g_free(path);
400 if(gtk_tree_model_iter_children(model, &child, iter))
402 gchar *test_path = NULL;
403 gboolean has_next = FALSE;
404 do {
405 gtk_tree_model_get(model, &child, 3, &temp, 2, &test_path, -1);
407 if(data == NULL)
409 /* if no more data, remove the subdir */
410 has_next = gtk_tree_store_remove(pl3_fb_dir_store, &child);
412 else
414 int compare =0;
415 /* get the next directory */
416 while(data->type != MPD_DATA_TYPE_DIRECTORY) data = mpd_data_get_next(data);
417 compare = strcmp(data->directory, test_path);
418 if(compare < 0)
420 gchar *basename = g_path_get_basename (data->directory);
421 gtk_tree_store_insert_before(pl3_fb_dir_store, &child2,iter,&child);
422 gtk_tree_store_set (pl3_fb_dir_store, &child2,
423 PL3_FB_ICON, "gtk-open",
424 PL3_FB_NAME, basename,
425 PL3_FB_PATH, data->directory,
426 PL3_FB_OPEN, FALSE,
427 -1);
429 gtk_tree_store_append(pl3_fb_dir_store, &child3, &child2);
430 q_free(basename);
432 /* if the new dir is smaller the temp, we add it. */
433 data = mpd_data_get_next(data);
434 has_next = TRUE;
436 else if(compare > 0)
438 /* if it's bigger, we delete the row */
439 has_next = gtk_tree_store_remove(pl3_fb_dir_store, &child);
441 }else{
442 /* if equal we process children if available */
443 if(temp)
445 pl3_file_browser_reupdate_folder(&child);
447 /* move to next entry in both */
448 has_next = gtk_tree_model_iter_next(model, &child);
449 data = mpd_data_get_next(data);
452 g_free(test_path);
453 }while(has_next);
454 if(data)
457 if(data->type == MPD_DATA_TYPE_DIRECTORY)
459 gchar *basename =
460 g_path_get_basename (data->directory);
461 gtk_tree_store_append(pl3_fb_dir_store, &child2, iter);
462 gtk_tree_store_set (pl3_fb_dir_store, &child2,
463 PL3_FB_ICON, "gtk-open",
464 PL3_FB_NAME, basename,
465 PL3_FB_PATH, data->directory,
466 PL3_FB_OPEN, FALSE,
467 -1);
468 gtk_tree_store_append(pl3_fb_dir_store, &child3, &child2);
469 q_free(basename);
471 }while((data = mpd_data_get_next(data)));
476 static void pl3_file_browser_reupdate()
479 if(pl3_fb_vbox)
481 GtkTreeIter iter;
483 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_dir_store);
485 if(gtk_tree_model_get_iter_first(model, &iter))
487 pl3_file_browser_reupdate_folder(&iter);
488 pl3_file_browser_view_folder(gtk_tree_view_get_selection(GTK_TREE_VIEW(pl3_fb_dir_tree)), NULL);
493 static void pl3_file_browser_view_folder(GtkTreeSelection *selection, gpointer user_data)
495 MpdData* data =NULL;
496 char *path = NULL, *icon = NULL;
497 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_dir_store);
498 GtkTreeIter iter_cat;
499 /* Clear the view */
500 gmpc_mpddata_model_set_mpd_data(pl3_fb_store2, NULL);
502 if(!gtk_tree_selection_get_selected(selection, &model, &iter_cat))
503 return;
505 /* check the connection state and when its valid proceed */
506 if (!mpd_check_connected(connection))
508 return;
510 gtk_tree_model_get(GTK_TREE_MODEL(pl3_fb_dir_store), &iter_cat, PL3_FB_PATH , &path,PL3_FB_ICON,&icon, -1);
511 if(strcmp("media-playlist",icon))
513 data = mpd_database_get_directory(connection, path);
515 else{
516 debug_printf(DEBUG_INFO,"View Playlist\n");
517 data = mpd_database_get_playlist_content(connection, path);
519 /* Check, and set the up arrow in the model */
520 if(!strcmp(path, "/"))
521 gmpc_mpddata_model_set_has_up(pl3_fb_store2, FALSE);
522 else
523 gmpc_mpddata_model_set_has_up(pl3_fb_store2, TRUE);
524 gmpc_mpddata_model_set_mpd_data(pl3_fb_store2, data);
525 q_free(path);
526 q_free(icon);
527 return ;
530 static void pl3_file_browser_collapse_row(GtkTreeView *tree, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
532 GtkTreeIter child;
533 int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(pl3_fb_dir_store), &child, iter);
534 if(!cfg_get_single_value_as_int_with_default(config, "file-browser", "extra-lazy",TRUE))
535 return;
537 while(valid){
538 valid = gtk_tree_store_remove(pl3_fb_dir_store,&child);
540 /* set unopened */
541 gtk_tree_store_set(pl3_fb_dir_store,iter,PL3_FB_OPEN,FALSE,-1);
542 /* add phantom child */
543 gtk_tree_store_append(pl3_fb_dir_store, &child, iter);
546 static void pl3_file_browser_fill_tree(GtkWidget *tree,GtkTreeIter *iter, GtkTreePath *tpath, gpointer user_data)
548 char *path;
549 MpdData *data = NULL;
550 GtkTreeIter child,child2;
551 gboolean open;
552 gtk_tree_model_get(GTK_TREE_MODEL(pl3_fb_dir_store),iter, PL3_FB_PATH, &path, PL3_FB_OPEN, &open,-1);
553 gtk_tree_store_set(pl3_fb_dir_store, iter, PL3_FB_OPEN, TRUE, -1);
554 if(open == FALSE)
556 data = mpd_database_get_directory(connection, path);
557 while (data != NULL)
559 if (data->type == MPD_DATA_TYPE_DIRECTORY)
561 gchar *basename =
562 g_path_get_basename (data->directory);
563 gtk_tree_store_append (pl3_fb_dir_store, &child, iter);
564 gtk_tree_store_set (pl3_fb_dir_store, &child,
565 PL3_FB_ICON, "gtk-open",
566 PL3_FB_NAME, basename,
567 PL3_FB_PATH, data->directory,
568 PL3_FB_OPEN, FALSE,
569 -1);
570 gtk_tree_store_append(pl3_fb_dir_store, &child2, &child);
572 q_free (basename);
574 data = mpd_data_get_next(data);
576 if(gtk_tree_model_iter_children(GTK_TREE_MODEL(pl3_fb_dir_store), &child, iter))
578 gtk_tree_store_remove(pl3_fb_dir_store, &child);
581 q_free(path);
586 static int pl3_file_browser_cat_popup(GtkWidget *wid, GdkEventButton *event, gpointer user_data)
588 GtkWidget *menu;
589 if(event->button == 3){
591 /* here we have: Add. Replace, (update?)*/
592 GtkWidget *item;
593 menu = gtk_menu_new();
594 /* add the add widget */
595 item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL);
596 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
597 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(pl3_file_browser_add_folder), NULL);
599 /* add the replace widget */
600 item = gtk_image_menu_item_new_with_label(_("Replace"));
601 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
602 gtk_image_new_from_stock(GTK_STOCK_REDO, GTK_ICON_SIZE_MENU));
603 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), NULL);
604 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
605 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(pl3_file_browser_replace_folder), NULL);
608 GtkTreeView *tree = GTK_TREE_VIEW(pl3_fb_dir_tree);
609 GtkTreeModel *model = (GtkTreeModel *)pl3_fb_dir_store;
610 GtkTreeSelection *selection = gtk_tree_view_get_selection(tree);
611 GtkTreeIter iter;
612 if(gtk_tree_selection_get_selected(selection, &model, &iter))
614 char *icon = NULL;
615 gtk_tree_model_get(model, &iter,PL3_FB_ICON, &icon, -1);
616 if(!strcmp("media-playlist", icon))
618 item = gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE, NULL);
619 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
620 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(pl3_file_browser_delete_playlist_from_right), NULL);
622 else
624 /* add the update widget */
625 item = gtk_image_menu_item_new_with_label(_("Update"));
626 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
627 gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU));
628 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
629 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(pl3_file_browser_update_folder), NULL);
631 q_free(icon);
634 gtk_widget_show_all(menu);
635 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,NULL, NULL, 0, event->time);
636 /* show everything and popup */
637 return TRUE;
639 return FALSE;
642 static gboolean pl3_file_browser_cat_key_press(GtkWidget *tree, GdkEventKey *event,gpointer data)
644 if(event->state&GDK_CONTROL_MASK && event->keyval == GDK_Insert) {
645 pl3_file_browser_replace_folder();
646 } else if(event->keyval == GDK_Insert) {
647 pl3_file_browser_add_folder();
649 return FALSE;
652 static int pl3_file_browser_playlist_key_press(GtkWidget *tree, GdkEventKey *event)
654 if(event->state&GDK_CONTROL_MASK && event->keyval == GDK_Insert)
656 pl3_file_browser_replace_selected();
657 } else if (event->state&GDK_CONTROL_MASK && event->keyval == GDK_f) {
658 treesearch_start(TREESEARCH(pl3_fb_tree_search));
659 } else if(event->keyval == GDK_Insert) {
660 pl3_file_browser_add_selected();
661 } else if(event->keyval == GDK_i && event->state&GDK_MOD1_MASK) {
662 pl3_file_browser_show_info();
663 } else if((event->state&(GDK_CONTROL_MASK|GDK_MOD1_MASK)) == 0 && ((event->keyval >= GDK_space && event->keyval <= GDK_z))) {
664 char data[2];
665 data[0] = (char)gdk_keyval_to_unicode(event->keyval);
666 data[1] = '\0';
667 treesearch_start(TREESEARCH(pl3_fb_tree_search));
668 gtk_entry_set_text(GTK_ENTRY(TREESEARCH(pl3_fb_tree_search)->entry),data);
669 gtk_editable_set_position(GTK_EDITABLE(TREESEARCH(pl3_fb_tree_search)->entry),1);
670 return TRUE;
672 return FALSE;
676 static void pl3_file_browser_selected(GtkWidget *container)
678 if(pl3_fb_tree == NULL)
680 pl3_file_browser_init();
683 gtk_container_add(GTK_CONTAINER(container), pl3_fb_vbox);
684 gtk_widget_grab_focus(pl3_fb_tree);
685 gtk_widget_show(pl3_fb_vbox);
687 playlist3_show_playtime(gmpc_mpddata_model_get_playtime(GMPC_MPDDATA_MODEL(pl3_fb_store2)));
689 static void pl3_file_browser_unselected(GtkWidget *container)
691 gtk_container_remove(GTK_CONTAINER(container), pl3_fb_vbox);
694 static void pl3_file_browser_show_info()
696 GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(pl3_fb_tree));
697 GtkTreeSelection *selection =gtk_tree_view_get_selection (GTK_TREE_VIEW(pl3_fb_tree));
698 if(!mpd_server_check_version(connection,0,12,0))
700 return;
702 if (gtk_tree_selection_count_selected_rows (selection) > 0)
704 GList *list = NULL;
705 list = gtk_tree_selection_get_selected_rows (selection, &model);
707 list = g_list_last (list);
709 GtkTreeIter iter;
710 char *path;
711 int type;
712 gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) list->data);
713 gtk_tree_model_get (GTK_TREE_MODEL(pl3_fb_store2), &iter,MPDDATA_MODEL_ROW_TYPE,&type, MPDDATA_MODEL_COL_PATH, &path, -1);
714 if(type == MPD_DATA_TYPE_SONG)
716 mpd_Song *song = mpd_database_get_fileinfo(connection, path);
717 if(song)
719 info2_activate();
720 info2_fill_song_view(song);
721 mpd_freeSong(song);
724 q_free(path);
726 g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
727 g_list_free (list);
732 static void pl3_file_browser_row_activated(GtkTreeView *tree, GtkTreePath *tp)
734 GtkTreeIter iter;
735 gchar *song_path;
736 gint r_type;
738 gtk_tree_model_get_iter(gtk_tree_view_get_model(tree), &iter, tp);
739 gtk_tree_model_get(gtk_tree_view_get_model(tree), &iter, MPDDATA_MODEL_COL_PATH,&song_path, MPDDATA_MODEL_ROW_TYPE, &r_type, -1);
740 if(song_path == NULL && r_type != -1)
742 return;
744 if(r_type == MPD_DATA_TYPE_PLAYLIST)
746 pl3_push_statusbar_message(_("Loaded playlist"));
747 mpd_playlist_queue_load(connection, song_path);
748 mpd_playlist_queue_commit(connection);
750 else if (r_type == MPD_DATA_TYPE_DIRECTORY)
752 GtkTreeSelection *selec = gtk_tree_view_get_selection(GTK_TREE_VIEW(pl3_fb_dir_tree));
753 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_dir_store);
755 if(gtk_tree_selection_get_selected(selec,&model, &iter))
757 GtkTreeIter citer;
758 GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
759 gtk_tree_view_expand_row(GTK_TREE_VIEW(pl3_fb_dir_tree), path, FALSE);
760 gtk_tree_path_free(path);
761 if(gtk_tree_model_iter_children(model, &citer, &iter))
764 char *name = NULL;
765 char *type= NULL;
766 gtk_tree_model_get(model, &citer, PL3_FB_PATH, &name, PL3_FB_ICON, &type,-1);
767 if(strcmp(name, song_path) == 0 && strcmp(type, "gtk-open") == 0)
769 gtk_tree_selection_select_iter(selec,&citer);
770 path = gtk_tree_model_get_path(model, &citer);
771 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(pl3_fb_dir_tree), path,NULL,TRUE,0.5,0);
772 gtk_tree_path_free(path);
774 q_free(name);
775 q_free(type);
776 }while(gtk_tree_model_iter_next(model, &citer));
781 else if (r_type == -1)
783 GtkTreeSelection *selec = gtk_tree_view_get_selection((GtkTreeView *)pl3_fb_dir_tree);
784 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_dir_store);
786 if(gtk_tree_selection_get_selected(selec,&model, &iter))
788 GtkTreeIter piter;
789 if(gtk_tree_model_iter_parent(model, &piter, &iter))
791 GtkTreePath *path = NULL;
792 gtk_tree_selection_select_iter(selec,&piter);
793 path = gtk_tree_model_get_path(model, &piter);
794 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(pl3_fb_dir_tree), path,NULL,TRUE,0.5,0);
795 gtk_tree_path_free(path);
799 else
801 play_path(song_path);
804 q_free(song_path);
806 static void pl3_file_browser_edit_columns(void)
808 gmpc_mpddata_treeview_edit_columns(GMPC_MPDDATA_TREEVIEW(pl3_fb_tree));
811 static void pl3_file_browser_add_to_playlist(GtkWidget *menu)
813 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_store2);
814 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pl3_fb_tree));
815 gchar *data = g_object_get_data(G_OBJECT(menu), "playlist");
816 GList *iter, *list = gtk_tree_selection_get_selected_rows (selection, &model);
817 if(list)
819 iter = g_list_first(list);
821 GtkTreeIter giter;
822 if(gtk_tree_model_get_iter(model, &giter, (GtkTreePath *)iter->data))
824 gchar *file = NULL;
825 int type = 0;
826 gtk_tree_model_get(model, &giter, MPDDATA_MODEL_COL_PATH, &file, MPDDATA_MODEL_ROW_TYPE, &type,-1);
827 if(type == MPD_DATA_TYPE_SONG)
829 mpd_database_playlist_list_add(connection, data,file);
831 else if(type == MPD_DATA_TYPE_DIRECTORY){
832 MpdData *data2 = mpd_database_get_directory_recursive(connection, file);
833 for(;data2;data2 = mpd_data_get_next(data2))
835 if(data2->type == MPD_DATA_TYPE_SONG)
837 mpd_database_playlist_list_add(connection, data,data2->song->file);
841 g_free(file);
843 }while((iter = g_list_next(iter)));
845 g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
846 g_list_free (list);
849 static gboolean pl3_file_browser_button_press_event(GtkWidget *but, GdkEventButton *event)
851 GtkTreePath *path = NULL;
852 if(event->button == 3 && gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(but), event->x, event->y,&path,NULL,NULL,NULL))
854 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(but));
855 if(gtk_tree_selection_path_is_selected(sel, path))
857 gtk_tree_path_free(path);
858 return TRUE;
861 if(path) {
862 gtk_tree_path_free(path);
864 return FALSE;
866 static gboolean pl3_file_browser_button_release_event(GtkWidget *but, GdkEventButton *event)
869 int has_item = 0;
870 GtkWidget *item;
871 GtkWidget *menu = NULL;
872 GtkTreeSelection *sel = NULL;
873 if(event->button != 3) return FALSE;
874 menu = gtk_menu_new();
875 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pl3_fb_tree));
876 /* don't show it when where listing custom streams...
877 * show always when version 12.. or when searching in playlist.
879 if(gtk_tree_selection_count_selected_rows(sel) == 1)
881 mpd_Song *song = NULL;
882 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_store2);
883 GList *list = gtk_tree_selection_get_selected_rows(sel, &model);
884 if(list != NULL)
886 GtkTreeIter iter;
887 int row_type;
888 char *path;
889 GtkTreePath *tree_path;
890 list = g_list_first(list);
891 gtk_tree_model_get_iter(model, &iter, list->data);
892 gtk_tree_model_get(model, &iter,MPDDATA_MODEL_COL_PATH,&path,MPDDATA_MODEL_ROW_TYPE, &row_type, -1);
893 if(row_type == MPD_DATA_TYPE_SONG)
895 if(mpd_server_check_version(connection,0,12,0))
897 item = gtk_image_menu_item_new_from_stock(GTK_STOCK_DIALOG_INFO,NULL);
898 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
899 g_signal_connect(G_OBJECT(item), "activate",
900 G_CALLBACK(pl3_file_browser_show_info), NULL);
901 has_item = 1;
904 else if(row_type == MPD_DATA_TYPE_PLAYLIST)
906 item = gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE,NULL);
907 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
908 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(pl3_file_browser_delete_playlist), NULL);
909 has_item = 1;
911 else if(row_type == MPD_DATA_TYPE_DIRECTORY)
913 item = gtk_image_menu_item_new_with_label(_("Update"));
914 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
915 gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU));
916 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
917 g_signal_connect(G_OBJECT(item), "activate",
918 G_CALLBACK(pl3_file_browser_update_folder_left_pane), NULL);
919 has_item = 1;
921 g_list_foreach (list,(GFunc) gtk_tree_path_free, NULL);
922 g_list_free (list);
923 q_free(path);
924 if(row_type != -1)
926 /* replace the replace widget */
927 item = gtk_image_menu_item_new_with_label(_("Replace"));
928 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
929 gtk_image_new_from_stock(GTK_STOCK_REDO, GTK_ICON_SIZE_MENU));
930 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
931 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(pl3_file_browser_replace_selected), NULL);
933 /* add the delete widget */
934 item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL);
935 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
936 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(pl3_file_browser_add_selected), NULL);
939 playlist_editor_right_mouse(menu,pl3_file_browser_add_to_playlist);
940 has_item = 1;
943 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pl3_fb_tree));
944 list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(pl3_fb_tree)),&model);
945 tree_path = list->data;
946 if(tree_path && gtk_tree_model_get_iter(model, &iter, tree_path)) {
947 gtk_tree_model_get(model, &iter, MPDDATA_MODEL_COL_MPDSONG, &song, -1);
948 if(song)
950 submenu_for_song(menu, song);
954 g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL);
955 g_list_free(list);
958 else
960 /* replace the replace widget */
961 item = gtk_image_menu_item_new_with_label(_("Replace"));
962 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
963 gtk_image_new_from_stock(GTK_STOCK_REDO, GTK_ICON_SIZE_MENU));
964 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
965 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(pl3_file_browser_replace_selected), NULL);
967 /* add the delete widget */
968 item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL);
969 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
970 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(pl3_file_browser_add_selected), NULL);
971 has_item = 1;
973 /* if(has_item)*/
975 item = gtk_image_menu_item_new_with_label(_("Edit Columns"));
976 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
977 gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU));
978 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
979 g_signal_connect(G_OBJECT(item), "activate",
980 G_CALLBACK(pl3_file_browser_edit_columns), NULL);
982 gtk_widget_show_all(menu);
983 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,NULL, NULL, 0, event->time);
984 return TRUE;
986 /* else{
987 gtk_widget_destroy(menu);
990 return FALSE;
992 static void pl3_file_browser_replace_selected()
994 mpd_playlist_clear(connection);
995 if(mpd_check_connected(connection))
997 pl3_file_browser_add_selected();
998 mpd_player_play(connection);
1001 static void pl3_file_browser_add_selected()
1003 GtkTreeIter iter;
1004 GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(pl3_fb_tree));
1005 GtkTreeModel *model = GTK_TREE_MODEL (pl3_fb_store2);
1006 GList *rows = gtk_tree_selection_get_selected_rows (selection, &model);
1007 int songs=0;
1008 int dirs = 0;
1009 int pl = 0;
1010 /*gchar *message;*/
1011 if(rows != NULL)
1013 gchar *name;
1014 gint type;
1015 GList *node = g_list_first(rows);
1018 GtkTreePath *path = node->data;
1019 gtk_tree_model_get_iter (model, &iter, path);
1020 gtk_tree_model_get (model, &iter, MPDDATA_MODEL_COL_PATH,&name,MPDDATA_MODEL_ROW_TYPE, &type, -1);
1021 /* does this bitmask thingy works ok? I think it hsould */
1022 if(type == MPD_DATA_TYPE_SONG || type == MPD_DATA_TYPE_DIRECTORY)
1024 /* add them to the add list */
1025 mpd_playlist_queue_add(connection, name);
1026 if(type==MPD_DATA_TYPE_DIRECTORY) dirs++;
1027 if(type==MPD_DATA_TYPE_SONG) songs++;
1029 else if (type == MPD_DATA_TYPE_PLAYLIST)
1031 mpd_playlist_queue_load(connection, name);
1032 pl++;
1034 q_free(name);
1035 }while((node = g_list_next(node)) != NULL);
1037 /* if there are items in the add list add them to the playlist */
1038 mpd_playlist_queue_commit(connection);
1039 if((songs+dirs+pl) != 0)
1041 GString *string= g_string_new(_("Added"));
1042 if(songs)
1043 g_string_append_printf(string, " %i %s%c", songs, ngettext("song", "songs", songs), (dirs+pl >0)?',':' ');
1044 if(dirs)
1045 g_string_append_printf(string, " %i %s%c", dirs, ngettext("directory", "directories", dirs), (pl>0)?',':' ');
1046 if(pl)
1047 g_string_append_printf(string, " %i %s", pl, ngettext("playlist", "playlists", pl));
1048 pl3_push_statusbar_message(string->str);
1049 g_string_free(string, TRUE);
1052 g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
1053 g_list_free (rows);
1056 static void pl3_file_browser_delete_playlist_from_right(GtkMenuItem *bt)
1058 GtkTreeView *tree = GTK_TREE_VIEW(pl3_fb_dir_tree);
1059 GtkTreeModel *model = (GtkTreeModel *) pl3_fb_dir_store;
1060 GtkTreeSelection *selection = gtk_tree_view_get_selection(tree);
1061 GtkTreeIter iter;
1062 char *path= NULL;
1063 /* create a warning message dialog */
1064 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW
1065 (glade_xml_get_widget
1066 (pl3_xml, "pl3_win")),
1067 GTK_DIALOG_MODAL,
1068 GTK_MESSAGE_WARNING,
1069 GTK_BUTTONS_NONE,
1070 _("Are you sure you want to clear the selected playlist?"));
1072 gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_NO,
1073 GTK_RESPONSE_CANCEL, GTK_STOCK_YES,
1074 GTK_RESPONSE_OK, NULL);
1075 gtk_dialog_set_default_response (GTK_DIALOG (dialog),
1076 GTK_RESPONSE_CANCEL);
1079 if(gtk_tree_selection_get_selected(selection, &model, &iter))
1081 char *icon = NULL;
1082 gtk_tree_model_get(model, &iter,3, &icon,2, &path, -1);
1083 if(path && strcmp("media-playlist", icon)) {
1084 if(path)
1085 q_free(path);
1086 path = NULL;
1088 q_free(icon);
1092 if(path == NULL){
1093 gtk_widget_destroy(dialog);
1094 return;
1097 switch (gtk_dialog_run (GTK_DIALOG (dialog)))
1099 case GTK_RESPONSE_OK:
1100 mpd_database_delete_playlist(connection, path);
1101 pl3_file_browser_reupdate();
1102 default:
1103 break;
1105 gtk_widget_destroy (GTK_WIDGET (dialog));
1106 q_free(path);
1109 static void pl3_file_browser_delete_playlist(GtkMenuItem *bt)
1111 char *path= NULL;
1112 GtkTreeSelection *sel = NULL;
1113 /* create a warning message dialog */
1114 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW
1115 (glade_xml_get_widget
1116 (pl3_xml, "pl3_win")),
1117 GTK_DIALOG_MODAL,
1118 GTK_MESSAGE_WARNING,
1119 GTK_BUTTONS_NONE,
1120 _("Are you sure you want to clear the selected playlist?"));
1122 gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_NO,
1123 GTK_RESPONSE_CANCEL, GTK_STOCK_YES,
1124 GTK_RESPONSE_OK, NULL);
1125 gtk_dialog_set_default_response (GTK_DIALOG (dialog),
1126 GTK_RESPONSE_CANCEL);
1128 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pl3_fb_tree));
1129 if(gtk_tree_selection_count_selected_rows(sel) == 1)
1131 GtkTreeModel *model = GTK_TREE_MODEL(pl3_fb_store2);
1132 GList *list = gtk_tree_selection_get_selected_rows(sel, &model);
1133 if(list != NULL)
1135 GtkTreeIter iter;
1137 list = g_list_first(list);
1138 gtk_tree_model_get_iter(model, &iter, list->data);
1139 gtk_tree_model_get(model, &iter,MPDDATA_MODEL_COL_PATH,&path,-1);
1140 g_list_foreach (list,(GFunc) gtk_tree_path_free, NULL);
1141 g_list_free (list);
1146 if(path == NULL){
1147 gtk_widget_destroy(dialog);
1148 return;
1151 switch (gtk_dialog_run (GTK_DIALOG (dialog)))
1153 case GTK_RESPONSE_OK:
1154 mpd_database_delete_playlist(connection, path);
1155 pl3_file_browser_reupdate();
1156 default:
1157 break;
1159 gtk_widget_destroy (GTK_WIDGET (dialog));
1160 q_free(path);
1163 static void pl3_file_browser_disconnect()
1166 if(pl3_fb_tree_ref) {
1167 GtkTreeIter iter;
1168 GtkTreeIter child;
1169 if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(pl3_fb_dir_store), &iter))
1171 int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(pl3_fb_dir_store), &child, &iter);
1173 while(valid){
1174 valid = gtk_tree_store_remove(pl3_fb_dir_store,&child);
1176 /* set unopened */
1177 gtk_tree_store_set(pl3_fb_dir_store,&iter,PL3_FB_OPEN,FALSE,-1);
1178 /* add phantom child */
1179 gtk_tree_store_append(pl3_fb_dir_store, &child, &iter);
1182 if(pl3_fb_store2)
1184 gmpc_mpddata_model_set_has_up(pl3_fb_store2, FALSE);
1185 gmpc_mpddata_model_set_mpd_data(pl3_fb_store2, NULL);
1190 static void pl3_file_browser_activate(void)
1192 GtkTreeSelection *selec = gtk_tree_view_get_selection((GtkTreeView *) playlist3_get_category_tree_view());
1194 GtkTreePath *path = gtk_tree_row_reference_get_path(pl3_fb_tree_ref);
1195 if(path)
1197 gtk_tree_selection_select_path(selec, path);
1198 gtk_tree_path_free(path);
1203 static int pl3_file_browser_add_go_menu(GtkWidget *menu)
1205 GtkWidget *item = NULL;
1206 if(!pl3_file_browser_get_enabled())
1207 return 0;
1209 item = gtk_image_menu_item_new_with_label(_("File Browser"));
1210 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item),
1211 gtk_image_new_from_stock("gtk-open", GTK_ICON_SIZE_MENU));
1212 gtk_widget_add_accelerator(GTK_WIDGET(item),
1213 "activate",
1214 gtk_menu_get_accel_group(GTK_MENU(menu)),
1215 GDK_F2, 0,
1216 GTK_ACCEL_VISIBLE);
1218 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1219 g_signal_connect(G_OBJECT(item), "activate",
1220 G_CALLBACK(pl3_file_browser_activate), NULL);
1221 return 1;
1224 static void pl3_file_browser_connection_changed(MpdObj *mi, int connect, gpointer data)
1226 if(!connect) {
1227 pl3_file_browser_disconnect();
1231 static void pl3_file_browser_status_changed(MpdObj *mi,ChangedStatusType what, void *data)
1233 if(what&MPD_CST_DATABASE)
1235 pl3_file_browser_reupdate();
1239 static void pl3_file_browser_destroy(void)
1241 if(pl3_fb_vbox)
1243 gtk_widget_destroy(pl3_fb_vbox);
1245 if(pl3_fb_store2)
1247 g_object_unref(pl3_fb_store2);
1249 if(pl3_fb_tree_ref)
1251 gtk_tree_row_reference_free(pl3_fb_tree_ref);
1254 static void pl3_file_browser_save_myself(void)
1256 if(pl3_fb_tree_ref)
1258 GtkTreePath *path = gtk_tree_row_reference_get_path(pl3_fb_tree_ref);
1259 if(path)
1261 gint *indices = gtk_tree_path_get_indices(path);
1262 debug_printf(DEBUG_INFO,"Saving myself to position: %i\n", indices[0]);
1263 cfg_set_single_value_as_int(config, "file-browser","position",indices[0]);
1264 gtk_tree_path_free(path);
1267 if(pl3_fb_vbox)
1269 int pos = gtk_paned_get_position(GTK_PANED(pl3_fb_vbox));
1270 cfg_set_single_value_as_int(config, "file-browser", "pane-pos", pos);