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.
21 #include <gdk/gdkkeysyms.h>
24 #include <glade/glade.h>
30 #include "playlist3.h"
31 #include "playlist3-file-browser.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
);
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
;
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
);
88 GtkTreeView
*tree
= playlist3_get_category_tree_view();
89 pl3_file_browser_add((GtkWidget
*)tree
);
90 } else if (!enabled
) {
91 pl3_file_browser_destroy();
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"),
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
;
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
);
139 g_list_foreach (list
, (GFunc
) gtk_tree_path_free
, NULL
);
143 static void pl3_file_browser_dir_row_activated(GtkTreeView
*tree
, GtkTreePath
*tp
, GtkTreeViewColumn
*col
,gpointer user_data
)
145 if(!mpd_check_connected(connection
))
147 if(gtk_tree_view_row_expanded(tree
,tp
))
148 gtk_tree_view_collapse_row(tree
,tp
);
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
;
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
));
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
);
250 if(!mpd_check_connected(connection
))
254 if(gtk_tree_selection_get_selected(selec
,&model
, &iter
))
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
);
264 if(strcmp("media-playlist", icon
)) {
265 mpd_playlist_queue_add(connection
, path
);
268 mpd_playlist_queue_load(connection
, path
);
270 mpd_playlist_queue_commit(connection
);
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
);
283 if(!mpd_check_connected(connection
))
287 if(gtk_tree_selection_get_selected(selec
,&model
, &iter
))
290 gtk_tree_model_get(model
, &iter
, PL3_FB_PATH
, &path
, -1);
293 mpd_database_update_dir(connection
, 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
));
306 if(!mpd_check_connected(connection
))
309 if (gtk_tree_selection_count_selected_rows (selection
) == 1)
311 GList
*list
= gtk_tree_selection_get_selected_rows (selection
, &model
);
313 if(gtk_tree_model_get_iter(model
, &iter
,list
->data
))
316 gtk_tree_model_get(model
, &iter
, MPDDATA_MODEL_COL_PATH
, &path
, -1);
319 mpd_database_update_dir(connection
, path
);
323 g_list_foreach (list
, (GFunc
) gtk_tree_path_free
, NULL
);
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
;
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"),
352 PL3_CAT_ICON_ID
, "gtk-open",
354 PL3_CAT_ICON_SIZE
,GTK_ICON_SIZE_DND
,-1);
355 /* add fantom child for lazy tree */
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
);
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",
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
;
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);
397 GtkTreeIter child
, child2
,child3
;
398 data
= mpd_database_get_directory(connection
,path
);
400 if(gtk_tree_model_iter_children(model
, &child
, iter
))
402 gchar
*test_path
= NULL
;
403 gboolean has_next
= FALSE
;
405 gtk_tree_model_get(model
, &child
, 3, &temp
, 2, &test_path
, -1);
409 /* if no more data, remove the subdir */
410 has_next
= gtk_tree_store_remove(pl3_fb_dir_store
, &child
);
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
);
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
,
429 gtk_tree_store_append(pl3_fb_dir_store
, &child3
, &child2
);
432 /* if the new dir is smaller the temp, we add it. */
433 data
= mpd_data_get_next(data
);
438 /* if it's bigger, we delete the row */
439 has_next
= gtk_tree_store_remove(pl3_fb_dir_store
, &child
);
442 /* if equal we process children if available */
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
);
457 if(data
->type
== MPD_DATA_TYPE_DIRECTORY
)
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
,
468 gtk_tree_store_append(pl3_fb_dir_store
, &child3
, &child2
);
471 }while((data
= mpd_data_get_next(data
)));
476 static void pl3_file_browser_reupdate()
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
)
496 char *path
= NULL
, *icon
= NULL
;
497 GtkTreeModel
*model
= GTK_TREE_MODEL(pl3_fb_dir_store
);
498 GtkTreeIter iter_cat
;
500 gmpc_mpddata_model_set_mpd_data(pl3_fb_store2
, NULL
);
502 if(!gtk_tree_selection_get_selected(selection
, &model
, &iter_cat
))
505 /* check the connection state and when its valid proceed */
506 if (!mpd_check_connected(connection
))
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
);
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
);
523 gmpc_mpddata_model_set_has_up(pl3_fb_store2
, TRUE
);
524 gmpc_mpddata_model_set_mpd_data(pl3_fb_store2
, data
);
530 static void pl3_file_browser_collapse_row(GtkTreeView
*tree
, GtkTreeIter
*iter
, GtkTreePath
*path
, gpointer user_data
)
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
))
538 valid
= gtk_tree_store_remove(pl3_fb_dir_store
,&child
);
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
)
549 MpdData
*data
= NULL
;
550 GtkTreeIter child
,child2
;
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);
556 data
= mpd_database_get_directory(connection
, path
);
559 if (data
->type
== MPD_DATA_TYPE_DIRECTORY
)
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
,
570 gtk_tree_store_append(pl3_fb_dir_store
, &child2
, &child
);
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
);
586 static int pl3_file_browser_cat_popup(GtkWidget
*wid
, GdkEventButton
*event
, gpointer user_data
)
589 if(event
->button
== 3){
591 /* here we have: Add. Replace, (update?)*/
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
);
612 if(gtk_tree_selection_get_selected(selection
, &model
, &iter
))
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
);
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
);
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 */
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();
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
))) {
665 data
[0] = (char)gdk_keyval_to_unicode(event
->keyval
);
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);
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))
702 if (gtk_tree_selection_count_selected_rows (selection
) > 0)
705 list
= gtk_tree_selection_get_selected_rows (selection
, &model
);
707 list
= g_list_last (list
);
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
);
720 info2_fill_song_view(song
);
726 g_list_foreach (list
, (GFunc
) gtk_tree_path_free
, NULL
);
732 static void pl3_file_browser_row_activated(GtkTreeView
*tree
, GtkTreePath
*tp
)
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)
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
))
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
))
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
);
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
))
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
);
801 play_path(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
);
819 iter
= g_list_first(list
);
822 if(gtk_tree_model_get_iter(model
, &giter
, (GtkTreePath
*)iter
->data
))
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
);
843 }while((iter
= g_list_next(iter
)));
845 g_list_foreach (list
, (GFunc
) gtk_tree_path_free
, NULL
);
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
);
862 gtk_tree_path_free(path
);
866 static gboolean
pl3_file_browser_button_release_event(GtkWidget
*but
, GdkEventButton
*event
)
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
);
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
);
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
);
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
);
921 g_list_foreach (list
,(GFunc
) gtk_tree_path_free
, NULL
);
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
);
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);
950 submenu_for_song(menu
, song
);
954 g_list_foreach (list
, (GFunc
)gtk_tree_path_free
, NULL
);
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
);
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
);
987 gtk_widget_destroy(menu);
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()
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
);
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
);
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"));
1043 g_string_append_printf(string
, " %i %s%c", songs
, ngettext("song", "songs", songs
), (dirs
+pl
>0)?',':' ');
1045 g_string_append_printf(string
, " %i %s%c", dirs
, ngettext("directory", "directories", dirs
), (pl
>0)?',':' ');
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
);
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
);
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")),
1068 GTK_MESSAGE_WARNING
,
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
))
1082 gtk_tree_model_get(model
, &iter
,3, &icon
,2, &path
, -1);
1083 if(path
&& strcmp("media-playlist", icon
)) {
1093 gtk_widget_destroy(dialog
);
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();
1105 gtk_widget_destroy (GTK_WIDGET (dialog
));
1109 static void pl3_file_browser_delete_playlist(GtkMenuItem
*bt
)
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")),
1118 GTK_MESSAGE_WARNING
,
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
);
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
);
1147 gtk_widget_destroy(dialog
);
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();
1159 gtk_widget_destroy (GTK_WIDGET (dialog
));
1163 static void pl3_file_browser_disconnect()
1166 if(pl3_fb_tree_ref
) {
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
);
1174 valid
= gtk_tree_store_remove(pl3_fb_dir_store
,&child
);
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
);
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
);
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())
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
),
1214 gtk_menu_get_accel_group(GTK_MENU(menu
)),
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
);
1224 static void pl3_file_browser_connection_changed(MpdObj
*mi
, int connect
, gpointer data
)
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)
1243 gtk_widget_destroy(pl3_fb_vbox
);
1247 g_object_unref(pl3_fb_store2
);
1251 gtk_tree_row_reference_free(pl3_fb_tree_ref
);
1254 static void pl3_file_browser_save_myself(void)
1258 GtkTreePath
*path
= gtk_tree_row_reference_get_path(pl3_fb_tree_ref
);
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
);
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
);