void main_playlist_init (GtkWidget *widget) { // make listview widget and bind it to data DdbListview *listview = DDB_LISTVIEW(widget); main_binding.ref = (void (*) (DdbListviewIter))deadbeef->pl_item_ref; main_binding.unref = (void (*) (DdbListviewIter))deadbeef->pl_item_unref; ddb_listview_set_binding (listview, &main_binding); lock_column_config = 1; if (load_column_config (listview, "gtkui.columns.playlist") < 0) { // create default set of columns add_column_helper (listview, "♫", 50, DB_COLUMN_PLAYING, "%playstatus%", 0); add_column_helper (listview, _("Artist / Album"), 150, -1, "%artist% - %album%", 0); add_column_helper (listview, _("Track No"), 50, -1, "%track number%", 1); add_column_helper (listview, _("Title"), 150, -1, "%title%", 0); add_column_helper (listview, _("Duration"), 50, -1, "%length%", 0); } lock_column_config = 0; deadbeef->conf_lock (); listview->group_format = strdup (deadbeef->conf_get_str_fast ("gtkui.playlist.group_by", "")); deadbeef->conf_unlock (); listview->group_title_bytecode = deadbeef->tf_compile (listview->group_format); // FIXME: filepath should be in properties dialog, while tooltip should be // used to show text that doesn't fit in column width if (deadbeef->conf_get_int ("listview.showpathtooltip", 0)) { GValue value = {0, }; g_value_init (&value, G_TYPE_BOOLEAN); g_value_set_boolean (&value, TRUE); DdbListview *pl = DDB_LISTVIEW (widget); g_object_set_property (G_OBJECT (pl->list), "has-tooltip", &value); g_signal_connect (G_OBJECT (pl->list), "query-tooltip", G_CALLBACK (playlist_tooltip_handler), NULL); } }
void main_playlist_init (GtkWidget *widget) { // make listview widget and bind it to data DdbListview *listview = DDB_LISTVIEW(widget); pl_common_set_group_format (listview, "gtkui.playlist.group_by_tf"); main_binding.ref = (void (*) (DdbListviewIter))deadbeef->pl_item_ref; main_binding.unref = (void (*) (DdbListviewIter))deadbeef->pl_item_unref; main_binding.is_selected = (int (*) (DdbListviewIter))deadbeef->pl_is_selected; main_binding.select = (void (*) (DdbListviewIter, int))deadbeef->pl_set_selected; main_binding.get_for_idx = (DdbListviewIter)deadbeef->pl_get_for_idx; main_binding.get_idx = (int (*) (DdbListviewIter))deadbeef->pl_get_idx_of; ddb_listview_set_binding (listview, &main_binding); deadbeef->conf_lock (); if (!deadbeef->conf_get_str_fast ("gtkui.columns.playlist", NULL)) { import_column_config_0_6 ("playlist.column.", "gtkui.columns.playlist"); } deadbeef->conf_unlock (); // create default set of columns if (pl_common_load_column_config (listview, "gtkui.columns.playlist") < 0) { pl_common_add_column_helper (listview, "♫", 50, DB_COLUMN_PLAYING, "%playstatus%", 0); pl_common_add_column_helper (listview, _("Artist / Album"), 150, -1, COLUMN_FORMAT_ARTISTALBUM, 0); pl_common_add_column_helper (listview, _("Track No"), 50, -1, COLUMN_FORMAT_TRACKNUMBER, 1); pl_common_add_column_helper (listview, _("Title"), 150, -1, COLUMN_FORMAT_TITLE, 0); pl_common_add_column_helper (listview, _("Duration"), 50, -1, COLUMN_FORMAT_LENGTH, 0); } main_binding.columns_changed = main_columns_changed; }
void main_refresh (void) { if (mainwin && gtk_widget_get_visible (mainwin)) { DdbListview *pl = DDB_LISTVIEW (lookup_widget (mainwin, "playlist")); ddb_listview_refresh (pl, DDB_REFRESH_VSCROLL | DDB_REFRESH_LIST); } }
void search_playlist_init (GtkWidget *widget) { DdbListview *listview = DDB_LISTVIEW(widget); g_signal_connect ((gpointer)listview->list, "key_press_event", G_CALLBACK (on_searchwin_key_press_event), listview); search_binding.ref = (void (*) (DdbListviewIter))deadbeef->pl_item_ref; search_binding.unref = (void (*) (DdbListviewIter))deadbeef->pl_item_unref; search_binding.is_selected = (int (*) (DdbListviewIter))deadbeef->pl_is_selected; ddb_listview_set_binding (listview, &search_binding); lock_column_config = 1; // create default set of columns DB_conf_item_t *col = deadbeef->conf_find ("search.column.", NULL); if (!col) { add_column_helper (listview, _("Artist / Album"), 150, -1, "%a - %b", 0); add_column_helper (listview, _("Track No"), 50, -1, "%n", 1); add_column_helper (listview, _("Title"), 150, -1, "%t", 0); add_column_helper (listview, _("Duration"), 50, -1, "%l", 0); } else { while (col) { append_column_from_textdef (listview, col->value); col = deadbeef->conf_find ("search.column.", col); } } lock_column_config = 0; }
void search_redraw (void) { if (searchwin && gtk_widget_get_visible (searchwin)) { GtkWidget *pl = lookup_widget (searchwin, "searchlist"); ddb_listview_refresh (DDB_LISTVIEW (pl), DDB_REFRESH_VSCROLL | DDB_REFRESH_LIST | DDB_LIST_CHANGED); } }
void main_playlist_init (GtkWidget *widget) { play16_pixbuf = create_pixbuf ("play_16.png"); pause16_pixbuf = create_pixbuf ("pause_16.png"); buffering16_pixbuf = create_pixbuf ("buffering_16.png"); // make listview widget and bind it to data DdbListview *listview = DDB_LISTVIEW(widget); main_binding.ref = (void (*) (DdbListviewIter))deadbeef->pl_item_ref; main_binding.unref = (void (*) (DdbListviewIter))deadbeef->pl_item_unref; ddb_listview_set_binding (listview, &main_binding); lock_column_config = 1; DB_conf_item_t *col = deadbeef->conf_find ("playlist.column.", NULL); if (!col) { // create default set of columns add_column_helper (listview, "♫", 50, DB_COLUMN_PLAYING, NULL, 0); add_column_helper (listview, _("Artist / Album"), 150, -1, "%a - %b", 0); add_column_helper (listview, _("Track No"), 50, -1, "%n", 1); add_column_helper (listview, _("Title"), 150, -1, "%t", 0); add_column_helper (listview, _("Duration"), 50, -1, "%l", 1); } else { while (col) { append_column_from_textdef (listview, col->value); col = deadbeef->conf_find ("playlist.column.", col); } } lock_column_config = 0; // FIXME: filepath should be in properties dialog, while tooltip should be // used to show text that doesn't fit in column width if (deadbeef->conf_get_int ("listview.showpathtooltip", 0)) { GValue value = {0, }; g_value_init (&value, G_TYPE_BOOLEAN); g_value_set_boolean (&value, TRUE); DdbListview *pl = DDB_LISTVIEW (widget); g_object_set_property (G_OBJECT (pl->list), "has-tooltip", &value); g_signal_connect (G_OBJECT (pl->list), "query-tooltip", G_CALLBACK (playlist_tooltip_handler), NULL); } deadbeef->conf_lock (); strncpy (group_by_str, deadbeef->conf_get_str_fast ("playlist.group_by", ""), sizeof (group_by_str)); deadbeef->conf_unlock (); group_by_str[sizeof (group_by_str)-1] = 0; gtkui_groups_pinned = deadbeef->conf_get_int ("playlist.pin.groups", 0); }
void main_selection_changed (DdbListviewIter it, int idx) { DdbListview *search = DDB_LISTVIEW (lookup_widget (searchwin, "searchlist")); if (idx == -1) { ddb_listview_refresh (search, DDB_REFRESH_LIST); } else { ddb_listview_draw_row (search, search_get_idx ((DB_playItem_t *)it), it); } }
void search_refresh (void) { if (searchwin && gtk_widget_get_visible (searchwin)) { GtkEntry *entry = GTK_ENTRY (lookup_widget (searchwin, "searchentry")); const gchar *text = gtk_entry_get_text (entry); search_process (text); GtkWidget *pl = lookup_widget (searchwin, "searchlist"); ddb_listview_refresh (DDB_LISTVIEW (pl), DDB_REFRESH_VSCROLL | DDB_REFRESH_LIST | DDB_LIST_CHANGED); } }
void main_selection_changed (DdbListview *ps, DdbListviewIter it, int idx) { DdbListview *search = DDB_LISTVIEW (lookup_widget (searchwin, "searchlist")); if (idx == -1) { ddb_listview_refresh (search, DDB_REFRESH_LIST); } else { ddb_listview_draw_row (search, search_get_idx ((DB_playItem_t *)it), it); } deadbeef->sendmessage (DB_EV_SELCHANGED, (uintptr_t)ps, deadbeef->plt_get_curr_idx (), PL_MAIN); }
void search_refresh (void) { if (searchwin && gtk_widget_get_visible (searchwin)) { GtkEntry *entry = GTK_ENTRY (lookup_widget (searchwin, "searchentry")); const gchar *text = gtk_entry_get_text (entry); search_process (text); GtkWidget *pl = lookup_widget (searchwin, "searchlist"); ddb_listview_refresh (DDB_LISTVIEW (pl), DDB_REFRESH_VSCROLL | DDB_REFRESH_LIST | DDB_LIST_CHANGED); deadbeef->sendmessage (DB_EV_FOCUS_SELECTION, (uintptr_t)pl, PL_MAIN, 0); } }
static gboolean set_dnd_cursor_idle (gpointer data) { DdbListview *listview = DDB_LISTVIEW (lookup_widget (mainwin, "playlist")); if (!data) { ddb_listview_set_cursor (listview, -1); return FALSE; } int cursor = deadbeef->pl_get_idx_of (DB_PLAYITEM (data)); ddb_listview_set_cursor (listview, cursor); return FALSE; }
gboolean playlist_tooltip_handler (GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer unused) { GtkWidget *pl = lookup_widget (mainwin, "playlist"); DB_playItem_t *it = (DB_playItem_t *)ddb_listview_get_iter_from_coord (DDB_LISTVIEW (pl), 0, y); if (it) { gtk_tooltip_set_text (tooltip, deadbeef->pl_find_meta (it, ":URI")); return TRUE; } return FALSE; }
static DdbListview * playlist_visible () { if (searchwin) { GdkWindow *window = gtk_widget_get_window(searchwin); if (window) { if (!(gdk_window_get_state(window) & GDK_WINDOW_STATE_ICONIFIED) && gtk_widget_get_visible(searchwin)) { return DDB_LISTVIEW(lookup_widget(searchwin, "searchlist")); } } } return NULL; }
static gboolean paused_cb (gpointer p) { DB_playItem_t *it = deadbeef->streamer_get_playing_track(); if (it) { int idx = deadbeef->pl_get_idx_of_iter(it, PL_SEARCH); if (idx != -1) { ddb_listview_draw_row(DDB_LISTVIEW(p), idx, (DdbListviewIter)it); } deadbeef->pl_item_unref(it); } return FALSE; }
void search_start (void) { ddb_listview_lock_columns (DDB_LISTVIEW (lookup_widget (searchwin, "searchlist")), 1); wingeom_restore (searchwin, "searchwin", -1, -1, 450, 150, 0); gtk_entry_set_text (GTK_ENTRY (lookup_widget (searchwin, "searchentry")), ""); gtk_widget_grab_focus (lookup_widget (searchwin, "searchentry")); gtk_widget_show (searchwin); gtk_window_present (GTK_WINDOW (searchwin)); g_idle_add (unlock_search_columns_cb, NULL); search_refresh (); main_refresh (); }
void search_destroy (void) { if (searchwin) { ddb_listview_size_columns_without_scrollbar (DDB_LISTVIEW (lookup_widget (searchwin, "searchlist"))); gtk_widget_destroy (searchwin); searchwin = NULL; } if (window_title_bytecode) { deadbeef->tf_free (window_title_bytecode); window_title_bytecode = NULL; } }
static void open_files_worker (void *data) { GSList *lst = (GSList *)data; gtkpl_add_files (lst); deadbeef->pl_save_all (); deadbeef->conf_save (); gtkui_playlist_changed (); extern GtkWidget *mainwin; DdbListview *pl = DDB_LISTVIEW (lookup_widget (mainwin, "playlist")); ddb_listview_set_cursor (pl, 0); deadbeef->sendmessage (DB_EV_PLAY_CURRENT, 0, 1, 0); }
gboolean playlist_tooltip_handler (GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer unused) { DdbListview *pl = DDB_LISTVIEW (g_object_get_data (G_OBJECT (widget), "owner")); DB_playItem_t *it = (DB_playItem_t *)ddb_listview_get_iter_from_coord (pl, 0, y); if (it) { deadbeef->pl_lock (); gtk_tooltip_set_text (tooltip, deadbeef->pl_find_meta (it, ":URI")); deadbeef->pl_unlock (); deadbeef->pl_item_unref (it); return TRUE; } return FALSE; }
static void search_process (DdbListview *listview, ddb_playlist_t *plt) { GtkEntry *entry = GTK_ENTRY(lookup_widget(searchwin, "searchentry")); const gchar *text = gtk_entry_get_text(entry); deadbeef->plt_search_process2 (plt, text, 0); ddb_listview_col_sort_update (listview); deadbeef->sendmessage (DB_EV_PLAYLISTCHANGED, 0, DDB_PLAYLIST_CHANGE_SEARCHRESULT, 0); int row = deadbeef->pl_get_cursor (PL_SEARCH); if (row >= deadbeef->pl_getcount (PL_SEARCH)) { deadbeef->pl_set_cursor (PL_SEARCH, deadbeef->pl_getcount (PL_SEARCH) - 1); } ddb_listview_list_setup (listview, listview->scrollpos); ddb_listview_refresh (listview, DDB_REFRESH_LIST); char title[1024] = ""; ddb_tf_context_t ctx = { ._size = sizeof (ddb_tf_context_t), .plt = deadbeef->plt_get_curr (), .iter = PL_SEARCH }; deadbeef->tf_eval (&ctx, window_title_bytecode, title, sizeof (title)); gtk_window_set_title (GTK_WINDOW (searchwin), title); } static gboolean search_start_cb (gpointer p) { GtkWidget *entry = lookup_widget (searchwin, "searchentry"); if (!playlist_visible ()) { DdbListview *listview = DDB_LISTVIEW (lookup_widget (searchwin, "searchlist")); refresh_source_id = 0; ddb_listview_clear_sort (listview); ddb_playlist_t *plt = deadbeef->plt_get_curr (); if (plt) { deadbeef->plt_search_reset (plt); deadbeef->plt_deselect_all (plt); deadbeef->plt_unref (plt); } wingeom_restore (searchwin, "searchwin", -1, -1, 450, 150, 0); gtk_widget_show (searchwin); gtk_entry_set_text (GTK_ENTRY (entry), ""); ddb_listview_refresh (listview, DDB_REFRESH_CONFIG); } gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1); gtk_widget_grab_focus (entry); gtk_window_present (GTK_WINDOW (searchwin)); return FALSE; }
void search_playlist_init (GtkWidget *widget) { DdbListview *listview = DDB_LISTVIEW(widget); g_signal_connect ((gpointer)listview->list, "key_press_event", G_CALLBACK (on_searchwin_key_press_event), listview); search_binding.ref = (void (*) (DdbListviewIter))deadbeef->pl_item_ref; search_binding.unref = (void (*) (DdbListviewIter))deadbeef->pl_item_unref; search_binding.is_selected = (int (*) (DdbListviewIter))deadbeef->pl_is_selected; ddb_listview_set_binding (listview, &search_binding); lock_column_config = 1; // create default set of columns if (load_column_config (listview, "gtkui.columns.search") < 0) { add_column_helper (listview, _("Artist / Album"), 150, -1, "%artist% - %album%", 0); add_column_helper (listview, _("Track No"), 50, -1, "%track%", 1); add_column_helper (listview, _("Title"), 150, -1, "%title%", 0); add_column_helper (listview, _("Duration"), 50, -1, "%length%", 0); } lock_column_config = 0; deadbeef->conf_lock (); listview->group_format = strdup (deadbeef->conf_get_str_fast ("gtkui.search.group_by", "")); deadbeef->conf_unlock (); listview->group_title_bytecode = deadbeef->tf_compile (listview->group_format); }
void search_playlist_init (GtkWidget *mainwin) { searchwin = create_searchwin (); gtk_window_set_transient_for (GTK_WINDOW (searchwin), GTK_WINDOW (mainwin)); DdbListview *listview = DDB_LISTVIEW (lookup_widget (searchwin, "searchlist")); search_binding.ref = (void (*) (DdbListviewIter))deadbeef->pl_item_ref; search_binding.unref = (void (*) (DdbListviewIter))deadbeef->pl_item_unref; search_binding.is_selected = (int (*) (DdbListviewIter))deadbeef->pl_is_selected; search_binding.select = (void (*) (DdbListviewIter, int))deadbeef->pl_set_selected; ddb_listview_set_binding (listview, &search_binding); // create default set of columns if (pl_common_load_column_config (listview, "gtkui.columns.search") < 0) { pl_common_add_column_helper (listview, _("Artist / Album"), 150, -1, COLUMN_FORMAT_ARTISTALBUM, 0); pl_common_add_column_helper (listview, _("Track No"), 50, -1, COLUMN_FORMAT_TRACKNUMBER, 1); pl_common_add_column_helper (listview, _("Title"), 150, -1, COLUMN_FORMAT_TITLE, 0); pl_common_add_column_helper (listview, _("Duration"), 50, -1, COLUMN_FORMAT_LENGTH, 0); } search_binding.columns_changed = search_columns_changed; pl_common_set_group_format (listview, "gtkui.search.group_by_tf"); window_title_bytecode = deadbeef->tf_compile (_("Search [(%list_total% results)]")); }
static gboolean list_redraw_cb (gpointer p) { ddb_listview_refresh (DDB_LISTVIEW(p), DDB_REFRESH_LIST); return FALSE; }
static gboolean header_redraw_cb (gpointer p) { ddb_listview_refresh (DDB_LISTVIEW(p), DDB_REFRESH_COLUMNS); return FALSE; }
void gtkpl_add_fm_dropped_files (DB_playItem_t *drop_before, char *ptr, int length) { ddb_playlist_t *plt = deadbeef->plt_get_curr (); if (deadbeef->pl_add_files_begin (plt) < 0) { free (ptr); deadbeef->plt_unref (plt); return; } DdbListview *pl = DDB_LISTVIEW (lookup_widget (mainwin, "playlist")); DdbListviewIter first = NULL; DdbListviewIter after = NULL; if (drop_before) { after = deadbeef->pl_get_prev (drop_before, PL_MAIN); } else { after = deadbeef->pl_get_last (PL_MAIN); } const uint8_t *p = (const uint8_t*)ptr; while (*p) { const uint8_t *pe = p; while (*pe && *pe > ' ') { pe++; } if (pe - p < 4096 && pe - p > 7) { char fname[(int)(pe - p)]; strcopy_special (fname, p, pe-p); //strncpy (fname, p, pe - p); //fname[pe - p] = 0; int abort = 0; DdbListviewIter inserted = deadbeef->plt_insert_dir (plt, after, fname, &abort, gtkui_add_file_info_cb, NULL); if (!inserted && !abort) { inserted = deadbeef->plt_insert_file (plt, after, fname, &abort, gtkui_add_file_info_cb, NULL); } if (inserted) { if (!first) { first = inserted; } if (after) { deadbeef->pl_item_unref (after); } after = inserted; deadbeef->pl_item_ref (after); } } p = pe; // skip whitespace while (*p && *p <= ' ') { p++; } } if (after) { deadbeef->pl_item_unref (after); } free (ptr); deadbeef->pl_add_files_end (); deadbeef->plt_unref (plt); deadbeef->pl_save_all (); g_idle_add (set_dnd_cursor_idle, first); }
static gboolean configchanged_cb (gpointer p) { ddb_listview_refresh (DDB_LISTVIEW(p), DDB_REFRESH_COLUMNS | DDB_REFRESH_LIST | DDB_REFRESH_CONFIG); return FALSE; }
static gboolean redraw_playlist_cb (gpointer user_data) { DDB_LISTVIEW(user_data)->cover_size = DDB_LISTVIEW(user_data)->new_cover_size; gtk_widget_queue_draw (GTK_WIDGET(user_data)); return FALSE; }
static gboolean unlock_search_columns_cb (void *ctx) { ddb_listview_lock_columns (DDB_LISTVIEW (lookup_widget (searchwin, "searchlist")), 0); return FALSE; }