GList * append_mobj_list_from_folder(GList *list, gchar *dir_name) { PraghaPreferences *preferences; PraghaMusicobject *mobj = NULL; PraghaMediaType file_type; GDir *dir; const gchar *next_file = NULL; gchar *ab_file; GError *error = NULL; dir = g_dir_open(dir_name, 0, &error); if (!dir) { g_critical("Unable to open library : %s", dir_name); return list; } next_file = g_dir_read_name(dir); while (next_file) { ab_file = g_strconcat(dir_name, G_DIR_SEPARATOR_S, next_file, NULL); if (is_dir_and_accessible(ab_file)) { preferences = pragha_preferences_get(); if(pragha_preferences_get_add_recursively(preferences)) list = append_mobj_list_from_folder(list, ab_file); g_object_unref(G_OBJECT(preferences)); } else { file_type = pragha_file_get_media_type (ab_file); switch (file_type) { case MEDIA_TYPE_AUDIO: mobj = new_musicobject_from_file (ab_file); if (G_LIKELY(mobj)) list = g_list_append(list, mobj); break; case MEDIA_TYPE_PLAYLIST: list = pragha_pl_parser_append_mobj_list_by_extension (list, ab_file); break; case MEDIA_TYPE_IMAGE: case MEDIA_TYPE_UNKNOWN: default: break; } } /* Have to give control to GTK periodically ... */ pragha_process_gtk_events (); g_free(ab_file); next_file = g_dir_read_name(dir); } g_dir_close(dir); return list; }
void pragha_scanner_scan_library(PraghaScanner *scanner) { PraghaPreferences *preferences; gchar *last_scan_time = NULL; if(scanner->update_timeout) return; preferences = pragha_preferences_get(); /* Get last time that update the library and folders to analyze */ last_scan_time = pragha_preferences_get_string(preferences, GROUP_LIBRARY, KEY_LIBRARY_LAST_SCANNED); if (last_scan_time) { if (!g_time_val_from_iso8601(last_scan_time, &scanner->last_update)) g_warning("Unable to convert last rescan time"); g_free(last_scan_time); } scanner->folder_list = pragha_preferences_get_filename_list(preferences, GROUP_LIBRARY, KEY_LIBRARY_DIR); scanner->folder_scanned = pragha_preferences_get_filename_list(preferences, GROUP_LIBRARY, KEY_LIBRARY_SCANNED); g_object_unref(G_OBJECT(preferences)); /* Update the gui */ scanner->update_timeout = g_timeout_add_seconds(1, (GSourceFunc)pragha_scanner_update_progress, scanner); pragha_preferences_set_show_status_bar (preferences, TRUE); gtk_widget_show_all(scanner->hbox); /* Launch threads */ scanner->no_files_thread = g_thread_new("Count no files", pragha_scanner_count_no_files_worker, scanner); scanner->worker_thread = pragha_async_launch_full(pragha_scanner_scan_worker, pragha_scanner_worker_finished, scanner); }
GList * append_mobj_list_from_folder(GList *list, gchar *dir_name) { PraghaPreferences *preferences; PraghaMusicobject *mobj = NULL; GDir *dir; const gchar *next_file = NULL; gchar *ab_file; GError *error = NULL; dir = g_dir_open(dir_name, 0, &error); if (!dir) { g_critical("Unable to open library : %s", dir_name); return list; } next_file = g_dir_read_name(dir); while (next_file) { ab_file = g_strconcat(dir_name, G_DIR_SEPARATOR_S, next_file, NULL); if (is_dir_and_accessible(ab_file)) { preferences = pragha_preferences_get(); if(pragha_preferences_get_add_recursively(preferences)) list = append_mobj_list_from_folder(list, ab_file); g_object_unref(G_OBJECT(preferences)); } else { if (is_playable_file(ab_file)) { mobj = new_musicobject_from_file(ab_file); if (G_LIKELY(mobj)) list = g_list_append(list, mobj); } } /* Have to give control to GTK periodically ... */ pragha_process_gtk_events (); g_free(ab_file); next_file = g_dir_read_name(dir); } g_dir_close(dir); return list; }
void pragha_tagger_apply_changes(PraghaTagger *tagger) { PraghaPreferences *preferences; PraghaTaggerPrivate *priv = tagger->priv; if(priv->file_arr->len) pragha_update_local_files_change_tag(priv->file_arr, priv->changed, priv->mobj); if(priv->loc_arr->len) { pragha_database_update_local_files_change_tag(priv->cdbase, priv->loc_arr, priv->changed, priv->mobj); preferences = pragha_preferences_get(); if(pragha_library_need_update_view(preferences, priv->changed)) pragha_database_change_tracks_done(priv->cdbase); g_object_unref(preferences); } }
static void pragha_toolbar_init (PraghaToolbar *toolbar) { PraghaPreferences *preferences; GtkToolItem *prev_button, *play_button, *stop_button, *next_button; GtkToolItem *unfull_button, *shuffle_button, *repeat_button; GtkWidget *vol_button; const GBindingFlags binding_flags = G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL; preferences = pragha_preferences_get(); /* Setup Left control buttons */ prev_button = gtk_tool_button_new (NULL, NULL); gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON(prev_button), "media-skip-backward"); gtk_widget_set_tooltip_text(GTK_WIDGET(prev_button), _("Previous Track")); toolbar->prev_button = prev_button; play_button = gtk_tool_button_new (NULL, NULL); gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON(play_button), "media-playback-start"); gtk_widget_set_tooltip_text(GTK_WIDGET(play_button), _("Play / Pause Track")); toolbar->play_button = play_button; stop_button = gtk_tool_button_new (NULL, NULL); gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON(stop_button), "media-playback-stop"); gtk_widget_set_tooltip_text(GTK_WIDGET(stop_button), _("Stop playback")); toolbar->stop_button = stop_button; next_button = gtk_tool_button_new (NULL, NULL); gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON(next_button), "media-skip-forward"); gtk_widget_set_tooltip_text(GTK_WIDGET(next_button), _("Next Track")); toolbar->next_button = next_button; #if GTK_CHECK_VERSION (3, 12, 0) gtk_header_bar_pack_start(GTK_HEADER_BAR(toolbar), GTK_WIDGET(prev_button)); gtk_header_bar_pack_start(GTK_HEADER_BAR(toolbar), GTK_WIDGET(play_button)); gtk_header_bar_pack_start(GTK_HEADER_BAR(toolbar), GTK_WIDGET(stop_button)); gtk_header_bar_pack_start(GTK_HEADER_BAR(toolbar), GTK_WIDGET(next_button)); #else gtk_tool_insert_generic_item(GTK_TOOLBAR(toolbar), GTK_WIDGET(prev_button)); gtk_tool_insert_generic_item(GTK_TOOLBAR(toolbar), GTK_WIDGET(play_button)); gtk_tool_insert_generic_item(GTK_TOOLBAR(toolbar), GTK_WIDGET(stop_button)); gtk_tool_insert_generic_item(GTK_TOOLBAR(toolbar), GTK_WIDGET(next_button)); #endif /* Song info Box */ #if !GTK_CHECK_VERSION (3, 12, 0) GtkToolItem *boxitem = gtk_tool_item_new (); gtk_tool_item_set_expand (GTK_TOOL_ITEM(boxitem), TRUE); gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(boxitem), -1); GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_container_add (GTK_CONTAINER(boxitem), box); GtkWidget *playing = pragha_toolbar_get_song_box (toolbar); gtk_box_pack_start (GTK_BOX(box), playing, TRUE, TRUE, 5); #endif /* Setup Right control buttons */ unfull_button = gtk_tool_button_new (NULL, NULL); gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON(unfull_button), "view-restore"); gtk_widget_set_tooltip_text(GTK_WIDGET(unfull_button), _("Leave Fullscreen")); toolbar->unfull_button = unfull_button; shuffle_button = gtk_toggle_tool_button_new(); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(shuffle_button), "media-playlist-shuffle"); gtk_widget_set_tooltip_text(GTK_WIDGET(shuffle_button), _("Play songs in a random order")); repeat_button = gtk_toggle_tool_button_new (); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(repeat_button), "media-playlist-repeat"); gtk_widget_set_tooltip_text(GTK_WIDGET(repeat_button), _("Repeat playback list at the end")); vol_button = gtk_volume_button_new(); g_object_set(vol_button, "use-symbolic", FALSE, NULL); gtk_button_set_relief(GTK_BUTTON(vol_button), GTK_RELIEF_NONE); g_object_set(G_OBJECT(vol_button), "size", GTK_ICON_SIZE_LARGE_TOOLBAR, NULL); toolbar->vol_button = vol_button; toolbar->extra_button_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); #if GTK_CHECK_VERSION (3, 12, 0) gtk_header_bar_pack_end(GTK_HEADER_BAR(toolbar), GTK_WIDGET(toolbar->extra_button_box)); gtk_header_bar_pack_end(GTK_HEADER_BAR(toolbar), GTK_WIDGET(vol_button)); gtk_header_bar_pack_end(GTK_HEADER_BAR(toolbar), GTK_WIDGET(repeat_button)); gtk_header_bar_pack_end(GTK_HEADER_BAR(toolbar), GTK_WIDGET(shuffle_button)); gtk_header_bar_pack_end(GTK_HEADER_BAR(toolbar), GTK_WIDGET(unfull_button)); #else gtk_tool_insert_generic_item(GTK_TOOLBAR(toolbar), GTK_WIDGET(unfull_button)); gtk_tool_insert_generic_item(GTK_TOOLBAR(toolbar), GTK_WIDGET(shuffle_button)); gtk_tool_insert_generic_item(GTK_TOOLBAR(toolbar), GTK_WIDGET(repeat_button)); gtk_tool_insert_generic_item(GTK_TOOLBAR(toolbar), GTK_WIDGET(vol_button)); gtk_tool_insert_generic_item(GTK_TOOLBAR(toolbar), GTK_WIDGET(toolbar->extra_button_box)); #endif /* Connect signals */ g_signal_connect(G_OBJECT(prev_button), "clicked", G_CALLBACK(prev_button_handler), toolbar); g_signal_connect(G_OBJECT(play_button), "clicked", G_CALLBACK(play_button_handler), toolbar); g_signal_connect(G_OBJECT(stop_button), "clicked", G_CALLBACK(stop_button_handler), toolbar); g_signal_connect(G_OBJECT(next_button), "clicked", G_CALLBACK(next_button_handler), toolbar); g_signal_connect(G_OBJECT(unfull_button), "clicked", G_CALLBACK(unfull_button_handler), toolbar); /*g_signal_connect(G_OBJECT (prev_button), "key-press-event", G_CALLBACK(panel_button_key_press), toolbar); g_signal_connect(G_OBJECT (play_button), "key-press-event", G_CALLBACK(panel_button_key_press), toolbar); g_signal_connect(G_OBJECT (stop_button), "key-press-event", G_CALLBACK(panel_button_key_press), toolbar); g_signal_connect(G_OBJECT (next_button), "key-press-event", G_CALLBACK(panel_button_key_press), toolbar); g_signal_connect(G_OBJECT (next_button), "key-press-event", G_CALLBACK(panel_button_key_press), toolbar); g_signal_connect(G_OBJECT (unfull_button), "key-press-event", G_CALLBACK(panel_button_key_press), toolbar); g_signal_connect(G_OBJECT (shuffle_button), "key-press-event", G_CALLBACK(panel_button_key_press), toolbar); g_signal_connect(G_OBJECT (repeat_button), "key-press-event", G_CALLBACK(panel_button_key_press), toolbar); g_signal_connect(G_OBJECT (vol_button), "key-press-event", G_CALLBACK(panel_button_key_press), toolbar);*/ g_signal_connect (G_OBJECT (vol_button), "value-changed", G_CALLBACK (vol_button_value_changed), toolbar); g_object_bind_property(preferences, "shuffle", shuffle_button, "active", binding_flags); g_object_bind_property(preferences, "repeat", repeat_button, "active", binding_flags); /* Fix styling */ #if GTK_CHECK_VERSION (3, 12, 0) pragha_toolbar_set_style(toolbar, pragha_preferences_get_gnome_style (preferences)); #endif gtk_widget_show(GTK_WIDGET(prev_button)); gtk_widget_show(GTK_WIDGET(play_button)); gtk_widget_show(GTK_WIDGET(stop_button)); gtk_widget_show(GTK_WIDGET(next_button)); gtk_widget_show(GTK_WIDGET(shuffle_button)); gtk_widget_show(GTK_WIDGET(repeat_button)); gtk_widget_show(GTK_WIDGET(vol_button)); gtk_widget_hide(GTK_WIDGET(toolbar->unfull_button)); gtk_widget_show(GTK_WIDGET(toolbar)); g_object_unref(preferences); }
GtkWidget * pragha_toolbar_get_song_box (PraghaToolbar *toolbar) { PraghaPreferences *preferences; PraghaAlbumArt *albumart; PraghaContainer *box; GtkWidget *hbox, *vbox_aling, *vbox, *top_hbox, *botton_hbox; GtkWidget *album_art_frame,*title, *title_event_box, *extention_box; GtkWidget *progress_bar, *progress_bar_event_box, *time_label, *time_align, *length_label, *length_align, *length_event_box; const GBindingFlags binding_flags = G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL; preferences = pragha_preferences_get(); /* * Main box that allow expand. */ box = pragha_container_new (); /* * Main box: [Album][Song info] */ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (GTK_BOX(box), hbox, TRUE, TRUE, 0); album_art_frame = gtk_event_box_new (); gtk_event_box_set_visible_window(GTK_EVENT_BOX(album_art_frame), FALSE); g_signal_connect(G_OBJECT (album_art_frame), "button_press_event", G_CALLBACK (pragha_toolbar_album_art_activated), toolbar); gtk_box_pack_start (GTK_BOX(hbox), album_art_frame, FALSE, FALSE, 2); albumart = pragha_album_art_new (); g_object_bind_property (preferences, "album-art-size", albumart, "size", binding_flags); g_object_bind_property (preferences, "show-album-art", albumart, "visible", binding_flags); gtk_container_add(GTK_CONTAINER(album_art_frame), GTK_WIDGET(albumart)); toolbar->albumart = albumart; /* * Song info vbox */ vbox_aling = gtk_alignment_new(0.5, 0.5, 1, 0); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 2); gtk_container_add(GTK_CONTAINER(vbox_aling), GTK_WIDGET(vbox)); /* * Top box: [Title][extentions] */ top_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(vbox), top_hbox, TRUE, TRUE, 0); /* The title widget. */ title_event_box = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(title_event_box), FALSE); g_signal_connect (G_OBJECT(title_event_box), "button-press-event", G_CALLBACK(pragha_toolbar_song_label_event_edit), toolbar); title = gtk_label_new(NULL); gtk_label_set_ellipsize (GTK_LABEL(title), PANGO_ELLIPSIZE_END); gtk_label_set_markup(GTK_LABEL(title),_("<b>Not playing</b>")); gtk_misc_set_alignment(GTK_MISC(title), 0, 0.5); gtk_container_add (GTK_CONTAINER(title_event_box), title); /* The extentions box. */ extention_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); /* Pack top widgets: */ gtk_box_pack_start (GTK_BOX(top_hbox), GTK_WIDGET(title_event_box), TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX(top_hbox), GTK_WIDGET(extention_box), FALSE, FALSE, 0); /* * Botton box: [Time][ProgressBar][Length] */ botton_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(vbox), botton_hbox, FALSE, FALSE, 0); /* Time progress widget. */ time_align = gtk_alignment_new(1, 0.5, 0, 0); time_label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(time_label),"<small>00:00</small>"); gtk_container_add(GTK_CONTAINER(time_align), time_label); /* Progress bar widget. */ progress_bar_event_box = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(progress_bar_event_box), FALSE); g_signal_connect (G_OBJECT(progress_bar_event_box), "button-press-event", G_CALLBACK(pragha_toolbar_progress_bar_event_seek), toolbar); #if GTK_CHECK_VERSION (3, 14, 0) progress_bar = gtk_progress_bar_new (); gtk_widget_set_valign (GTK_WIDGET(progress_bar), GTK_ALIGN_CENTER); #else progress_bar = GTK_WIDGET(pragha_track_progress_new ()); #endif gtk_container_add (GTK_CONTAINER(progress_bar_event_box), GTK_WIDGET(progress_bar)); /* Length and remaining time widget. */ length_event_box = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(length_event_box), FALSE); g_signal_connect (G_OBJECT(length_event_box), "button-press-event", G_CALLBACK(pragha_toolbar_timer_label_event_change_mode), toolbar); length_align = gtk_alignment_new(0, 0.5, 0, 0); gtk_container_add(GTK_CONTAINER(length_event_box), length_align); length_label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(length_label),"<small>--:--</small>"); gtk_container_add(GTK_CONTAINER(length_align), length_label); /* Pack widgets. */ gtk_box_pack_start (GTK_BOX(botton_hbox), GTK_WIDGET(time_align), FALSE, FALSE, 3); gtk_box_pack_start (GTK_BOX(botton_hbox), GTK_WIDGET(progress_bar_event_box), TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX(botton_hbox), GTK_WIDGET(length_event_box), FALSE, FALSE, 3); /* Save references. */ toolbar->track_progress_bar = progress_bar; toolbar->now_playing_label = title; toolbar->track_time_label = time_label; toolbar->track_length_label = length_label; toolbar->extention_box = extention_box; gtk_box_pack_start(GTK_BOX(hbox), vbox_aling, TRUE, TRUE, 2); gtk_widget_show_all(GTK_WIDGET(vbox_aling)); gtk_widget_show(GTK_WIDGET(album_art_frame)); gtk_widget_show(GTK_WIDGET(hbox)); gtk_widget_show(GTK_WIDGET(box)); g_object_unref(preferences); return GTK_WIDGET(box); }
static void pragha_application_startup (GApplication *application) { PraghaToolbar *toolbar; PraghaPlaylist *playlist; const gchar *version = NULL; const gchar *desktop = NULL; gint playlist_id = 0; const GBindingFlags binding_flags = G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL; PraghaApplication *pragha = PRAGHA_APPLICATION (application); G_APPLICATION_CLASS (pragha_application_parent_class)->startup (application); /* Allocate memory for simple structures */ pragha->preferences = pragha_preferences_get(); pragha->cdbase = pragha_database_get(); if (pragha_database_start_successfully(pragha->cdbase) == FALSE) { g_error("Unable to init music dbase"); } version = pragha_preferences_get_installed_version (pragha->preferences); if (string_is_not_empty (version) && (g_ascii_strcasecmp (version, "1.3.90") < 0)) { pragha_database_compatibilize_version (pragha->cdbase); } playlist_id = pragha_database_find_playlist (pragha->cdbase, _("Favorites")); if (playlist_id == 0) pragha_database_add_new_playlist (pragha->cdbase, _("Favorites")); pragha->provider = pragha_database_provider_get (); g_signal_connect (pragha->provider, "want-upgrade", G_CALLBACK(pragha_application_provider_want_upgrade), pragha); g_signal_connect (pragha->provider, "want-update", G_CALLBACK(pragha_application_provider_want_update), pragha); pragha->enum_map = pragha_music_enum_get (); g_signal_connect (pragha->enum_map, "enum-removed", G_CALLBACK(pragha_enum_map_removed_handler), pragha); #ifdef HAVE_LIBPEAS pragha->plugins_engine = pragha_plugins_engine_new (G_OBJECT(pragha)); #endif pragha->art_cache = pragha_art_cache_get (); g_signal_connect (pragha->art_cache, "cache-changed", G_CALLBACK(pragha_art_cache_changed_handler), pragha); pragha->backend = pragha_backend_new (); g_signal_connect (pragha->backend, "finished", G_CALLBACK(pragha_backend_finished_song), pragha); g_signal_connect (pragha->backend, "tags-changed", G_CALLBACK(pragha_backend_tags_changed), pragha); g_signal_connect (pragha->backend, "error", G_CALLBACK(gui_backend_error_show_dialog_cb), pragha); g_signal_connect (pragha->backend, "error", G_CALLBACK(gui_backend_error_update_current_playlist_cb), pragha); g_signal_connect (pragha->backend, "notify::state", G_CALLBACK (pragha_menubar_update_playback_state_cb), pragha); /* * Collect widgets and construct the window. */ pragha_application_construct_window (pragha); /* Connect Signals and Bindings. */ toolbar = pragha->toolbar; g_signal_connect_swapped (toolbar, "prev", G_CALLBACK(pragha_playback_prev_track), pragha); g_signal_connect_swapped (toolbar, "play", G_CALLBACK(pragha_playback_play_pause_resume), pragha); g_signal_connect_swapped (toolbar, "stop", G_CALLBACK(pragha_playback_stop), pragha); g_signal_connect_swapped (toolbar, "next", G_CALLBACK(pragha_playback_next_track), pragha); g_signal_connect (toolbar, "unfull-activated", G_CALLBACK(pragha_window_unfullscreen), pragha); g_signal_connect (toolbar, "album-art-activated", G_CALLBACK(pragha_playback_show_current_album_art), pragha); g_signal_connect_swapped (toolbar, "track-info-activated", G_CALLBACK(pragha_playback_edit_current_track), pragha); g_signal_connect (toolbar, "track-progress-activated", G_CALLBACK(pragha_playback_seek_fraction), pragha); g_signal_connect (toolbar, "favorite-toggle", G_CALLBACK(pragha_playback_toogle_favorite), pragha); playlist = pragha->playlist; g_signal_connect (playlist, "playlist-set-track", G_CALLBACK(pragha_playback_set_playlist_track), pragha); g_signal_connect (playlist, "playlist-change-tags", G_CALLBACK(pragha_playlist_update_change_tags), pragha); g_signal_connect (playlist, "playlist-changed", G_CALLBACK(pragha_playlist_update_statusbar_playtime), pragha); pragha_playlist_update_statusbar_playtime (playlist, pragha); g_signal_connect (pragha->library, "library-append-playlist", G_CALLBACK(pragha_library_pane_append_tracks), pragha); g_signal_connect (pragha->library, "library-replace-playlist", G_CALLBACK(pragha_library_pane_replace_tracks), pragha); g_signal_connect (pragha->library, "library-replace-playlist-and-play", G_CALLBACK(pragha_library_pane_replace_tracks_and_play), pragha); g_signal_connect (pragha->library, "library-addto-playlist-and-play", G_CALLBACK(pragha_library_pane_addto_playlist_and_play), pragha); g_signal_connect (G_OBJECT(pragha->mainwindow), "window-state-event", G_CALLBACK(pragha_toolbar_window_state_event), toolbar); g_signal_connect (G_OBJECT(toolbar), "notify::timer-remaining-mode", G_CALLBACK(pragha_toolbar_show_ramaning_time_cb), pragha->backend); g_signal_connect (pragha->backend, "notify::state", G_CALLBACK(pragha_toolbar_playback_state_cb), toolbar); g_signal_connect (pragha->backend, "tick", G_CALLBACK(pragha_toolbar_update_playback_progress), toolbar); g_signal_connect (pragha->backend, "buffering", G_CALLBACK(pragha_toolbar_update_buffering_cb), toolbar); g_signal_connect (pragha->backend, "notify::state", G_CALLBACK (update_current_playlist_view_playback_state_cb), pragha->playlist); g_object_bind_property (pragha->backend, "volume", toolbar, "volume", binding_flags); g_object_bind_property (pragha->preferences, "timer-remaining-mode", toolbar, "timer-remaining-mode", binding_flags); g_signal_connect (pragha->preferences, "LibraryChanged", G_CALLBACK (pragha_libary_list_changed_cb), pragha); g_signal_connect (pragha->preferences, "NeedRestart", G_CALLBACK (pragha_need_restart_cb), pragha); g_signal_connect (pragha->preferences, "notify::system-titlebar", G_CALLBACK (pragha_system_titlebar_changed_cb), pragha); pragha->sidebar2_binding = g_object_bind_property (pragha->preferences, "secondary-lateral-panel", pragha->sidebar2, "visible", binding_flags); pragha->setting_dialog = pragha_preferences_dialog_new (pragha->mainwindow); #ifdef HAVE_LIBPEAS gboolean sidebar2_visible = // FIXME: Hack to allow hide sidebar when init. pragha_preferences_get_secondary_lateral_panel(pragha->preferences); pragha_plugins_engine_startup (pragha->plugins_engine); pragha_preferences_set_secondary_lateral_panel(pragha->preferences, sidebar2_visible); #endif /* If first run and the desktop is gnome adapts style. */ if (pragha_application_is_first_run (pragha)) { desktop = g_getenv ("XDG_CURRENT_DESKTOP"); if (desktop && (g_strcmp0(desktop, "GNOME") == 0) && gdk_screen_is_composited (gdk_screen_get_default())) { pragha_preferences_set_system_titlebar (pragha->preferences, FALSE); pragha_preferences_set_toolbar_size (pragha->preferences, GTK_ICON_SIZE_SMALL_TOOLBAR); pragha_preferences_set_show_menubar (pragha->preferences, FALSE); } } /* Forse update menubar and toolbar playback actions */ pragha_menubar_update_playback_state_cb (pragha->backend, NULL, pragha); pragha_toolbar_playback_state_cb (pragha->backend, NULL, pragha->toolbar); /* Finally fill the library and the playlist */ pragha_init_gui_state (pragha); }
void pragha_filter_dialog (PraghaPlaylist *playlist) { PraghaPreferences *preferences; GtkWidget *dialog, *scrollwin, *vbox, *search_entry; GtkWidget *filter_view = NULL; GtkListStore *filter_store; GtkTreeModel *filter_model; GtkCellRenderer *renderer; GtkTreeViewColumn *column; PraghaFilterDialog *fdialog; fdialog = g_slice_new0(PraghaFilterDialog); preferences = pragha_preferences_get (); /* Crete the filter entry */ search_entry = pragha_search_entry_new(preferences); g_signal_connect (G_OBJECT(search_entry), "changed", G_CALLBACK(simple_filter_search_keyrelease_handler), fdialog); g_signal_connect (G_OBJECT(search_entry), "activate", G_CALLBACK(simple_filter_search_activate_handler), fdialog); /* Create the view */ filter_store = gtk_list_store_new (2, G_TYPE_UINT, G_TYPE_STRING); column = gtk_tree_view_column_new (); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (column, renderer, FALSE); gtk_tree_view_column_set_attributes (column, renderer, "text", 0, NULL); gtk_tree_view_column_set_spacing (column, 4); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (column, renderer, FALSE); gtk_tree_view_column_set_attributes (column, renderer, "markup", 1, NULL); gtk_tree_view_column_set_spacing (column, 4); /* Fill the filter tree view with current playlist */ pragha_filter_dialog_fill_model (filter_store, playlist); filter_model = gtk_tree_model_filter_new(GTK_TREE_MODEL(filter_store), NULL); g_object_unref(filter_store); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filter_model), (GtkTreeModelFilterVisibleFunc)filter_model_visible_func, fdialog, NULL); /* Create the tree view */ filter_view = gtk_tree_view_new_with_model(filter_model); gtk_tree_view_append_column (GTK_TREE_VIEW(filter_view), column); g_object_unref(G_OBJECT(filter_model)); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(filter_view), TRUE); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(filter_view), FALSE); gtk_tree_view_set_enable_search (GTK_TREE_VIEW(filter_view), FALSE); /* Store references */ fdialog->filter_view = filter_view; fdialog->filter_model = filter_model; fdialog->filter_string = NULL; fdialog->timeout_id = 0; fdialog->cplaylist = playlist; fdialog->preferences = preferences; /* The search dialog */ dialog = gtk_dialog_new_with_buttons (_("Search in playlist"), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(playlist))), GTK_DIALOG_MODAL, _("_Close"), GTK_RESPONSE_CANCEL, NULL); gtk_dialog_add_button (GTK_DIALOG (dialog), _("Add to playback queue"), GTK_RESPONSE_ACCEPT); gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Jump to"), GTK_RESPONSE_APPLY); gtk_window_set_default_size (GTK_WINDOW (dialog), 600, 500); /* Add to the dialog's main vbox */ vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); gtk_box_pack_start (GTK_BOX(vbox), search_entry, FALSE, FALSE, 3); scrollwin = gtk_scrolled_window_new (NULL, NULL); gtk_container_add (GTK_CONTAINER(scrollwin), filter_view); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrollwin), GTK_SHADOW_IN); gtk_box_pack_start (GTK_BOX(vbox), scrollwin, TRUE, TRUE, 0); /* Connect signals */ g_signal_connect (filter_view, "row-activated", G_CALLBACK(pragha_filter_dialog_activated_cb), dialog); g_signal_connect (filter_view, "key_press_event", G_CALLBACK (pragha_filter_dialog_key_press), fdialog); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(pragha_filter_dialog_response), fdialog); gtk_widget_show_all (dialog); }
static void pragha_application_startup (GApplication *application) { PraghaApplication *pragha = PRAGHA_APPLICATION (application); PraghaToolbar *toolbar; PraghaPlaylist *playlist; const GBindingFlags binding_flags = G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL; G_APPLICATION_CLASS (pragha_application_parent_class)->startup (application); /* Allocate memory for simple structures */ pragha->preferences = pragha_preferences_get(); pragha->cdbase = pragha_database_get(); if (pragha_database_start_successfully(pragha->cdbase) == FALSE) { g_error("Unable to init music dbase"); } pragha->enum_map = pragha_music_enum_get (); g_signal_connect (pragha->enum_map, "enum-removed", G_CALLBACK(pragha_enum_map_removed_handler), pragha); #ifdef HAVE_LIBPEAS pragha->peas_engine = peas_engine_get_default (); peas_engine_add_search_path (pragha->peas_engine, LIBPLUGINDIR, USRPLUGINDIR); pragha->peas_exten_set = peas_extension_set_new (pragha->peas_engine, PEAS_TYPE_ACTIVATABLE, "object", pragha, NULL); peas_extension_set_foreach (pragha->peas_exten_set, (PeasExtensionSetForeachFunc) on_extension_added, NULL); g_signal_connect (pragha->peas_exten_set, "extension-added", G_CALLBACK (on_extension_added), NULL); g_signal_connect (pragha->peas_exten_set, "extension-removed", G_CALLBACK (on_extension_removed), NULL); #endif pragha->art_cache = pragha_art_cache_get (); g_signal_connect (pragha->art_cache, "cache-changed", G_CALLBACK(pragha_art_cache_changed_handler), pragha); pragha->backend = pragha_backend_new (); g_signal_connect (pragha->backend, "finished", G_CALLBACK(pragha_backend_finished_song), pragha); g_signal_connect (pragha->backend, "tags-changed", G_CALLBACK(pragha_backend_tags_changed), pragha); g_signal_connect (pragha->backend, "error", G_CALLBACK(gui_backend_error_show_dialog_cb), pragha); g_signal_connect (pragha->backend, "error", G_CALLBACK(gui_backend_error_update_current_playlist_cb), pragha); g_signal_connect (pragha->backend, "notify::state", G_CALLBACK (pragha_menubar_update_playback_state_cb), pragha); /* * Collect widgets and construct the window. */ pragha_application_construct_window (pragha); /* Connect Signals and Bindings. */ toolbar = pragha->toolbar; g_signal_connect_swapped (toolbar, "prev", G_CALLBACK(pragha_playback_prev_track), pragha); g_signal_connect_swapped (toolbar, "play", G_CALLBACK(pragha_playback_play_pause_resume), pragha); g_signal_connect_swapped (toolbar, "stop", G_CALLBACK(pragha_playback_stop), pragha); g_signal_connect_swapped (toolbar, "next", G_CALLBACK(pragha_playback_next_track), pragha); g_signal_connect (toolbar, "unfull-activated", G_CALLBACK(pragha_window_unfullscreen), pragha); g_signal_connect (toolbar, "album-art-activated", G_CALLBACK(pragha_playback_show_current_album_art), pragha); g_signal_connect (toolbar, "track-info-activated", G_CALLBACK(pragha_playback_edit_current_track), pragha); g_signal_connect (toolbar, "track-progress-activated", G_CALLBACK(pragha_playback_seek_fraction), pragha); playlist = pragha->playlist; g_signal_connect (playlist, "playlist-set-track", G_CALLBACK(pragha_playback_set_playlist_track), pragha); g_signal_connect (playlist, "playlist-change-tags", G_CALLBACK(pragha_playlist_update_change_tags), pragha); g_signal_connect (playlist, "playlist-changed", G_CALLBACK(pragha_playlist_update_statusbar_playtime), pragha); pragha_playlist_update_statusbar_playtime (playlist, pragha); g_signal_connect (pragha->library, "library-append-playlist", G_CALLBACK(pragha_library_pane_append_tracks), pragha); g_signal_connect (pragha->library, "library-replace-playlist", G_CALLBACK(pragha_library_pane_replace_tracks), pragha); g_signal_connect (pragha->library, "library-replace-playlist-and-play", G_CALLBACK(pragha_library_pane_replace_tracks_and_play), pragha); g_signal_connect (G_OBJECT(pragha->mainwindow), "window-state-event", G_CALLBACK(pragha_toolbar_window_state_event), toolbar); g_signal_connect (G_OBJECT(toolbar), "notify::timer-remaining-mode", G_CALLBACK(pragha_toolbar_show_ramaning_time_cb), pragha->backend); g_signal_connect (pragha->backend, "notify::state", G_CALLBACK(pragha_toolbar_playback_state_cb), toolbar); g_signal_connect (pragha->backend, "tick", G_CALLBACK(pragha_toolbar_update_playback_progress), toolbar); g_signal_connect (pragha->backend, "buffering", G_CALLBACK(pragha_toolbar_update_buffering_cb), toolbar); g_signal_connect (pragha->backend, "notify::state", G_CALLBACK (update_current_playlist_view_playback_state_cb), pragha->playlist); g_object_bind_property (pragha->backend, "volume", toolbar, "volume", binding_flags); g_object_bind_property (pragha->preferences, "timer-remaining-mode", toolbar, "timer-remaining-mode", binding_flags); pragha->sidebar2_binding = g_object_bind_property (pragha->preferences, "secondary-lateral-panel", pragha->sidebar2, "visible", binding_flags); pragha->setting_dialog = pragha_preferences_dialog_new (pragha); #ifdef HAVE_LIBPEAS pragha_plugins_activate_saved (pragha); #endif /* Finally fill the library and the playlist */ pragha_init_gui_state (pragha); }
void pragha_scanner_update_library(PraghaScanner *scanner) { PraghaPreferences *preferences; PraghaDatabase *database; PraghaPreparedStatement *statement; PraghaMusicobject *mobj = NULL; gchar *mask = NULL, *last_scan_time = NULL; const gchar *sql = NULL; guint location_id; GSList *list; if(scanner->update_timeout) return; preferences = pragha_preferences_get(); /* Get last time that update the library and folders to analyze */ last_scan_time = pragha_preferences_get_string(preferences, GROUP_LIBRARY, KEY_LIBRARY_LAST_SCANNED); if (last_scan_time) { if (!g_time_val_from_iso8601(last_scan_time, &scanner->last_update)) g_warning("Unable to convert last rescan time"); g_free(last_scan_time); } scanner->folder_list = pragha_preferences_get_filename_list(preferences, GROUP_LIBRARY, KEY_LIBRARY_DIR); scanner->folder_scanned = pragha_preferences_get_filename_list(preferences, GROUP_LIBRARY, KEY_LIBRARY_SCANNED); g_object_unref(G_OBJECT(preferences)); /* Update the gui */ scanner->update_timeout = g_timeout_add_seconds(1, (GSourceFunc)pragha_scanner_update_progress, scanner); pragha_preferences_set_show_status_bar (preferences, TRUE); gtk_widget_show_all(scanner->hbox); /* Append the files from database that no changed. */ database = pragha_database_get(); for(list = scanner->folder_scanned ; list != NULL; list = list->next) { if(is_present_str_list(list->data, scanner->folder_list)) { sql = "SELECT id FROM LOCATION WHERE name LIKE ?"; statement = pragha_database_create_statement (database, sql); mask = g_strconcat (list->data, "%", NULL); pragha_prepared_statement_bind_string (statement, 1, mask); while (pragha_prepared_statement_step (statement)) { location_id = pragha_prepared_statement_get_int (statement, 0); mobj = new_musicobject_from_db(database, location_id); if (G_LIKELY(mobj)) { g_hash_table_insert(scanner->tracks_table, g_strdup(pragha_musicobject_get_file(mobj)), mobj); } pragha_process_gtk_events (); } pragha_prepared_statement_free (statement); g_free(mask); } } g_object_unref(database); /* Launch threads */ scanner->no_files_thread = g_thread_new("Count no files", pragha_scanner_count_no_files_worker, scanner); scanner->worker_thread = pragha_async_launch_full(pragha_scanner_update_worker, pragha_scanner_worker_finished, scanner); }
static gboolean pragha_scanner_worker_finished (gpointer data) { GtkWidget *msg_dialog; gchar *last_scan_time = NULL; PraghaPreferences *preferences; PraghaDatabase *database; GSList *list; PraghaScanner *scanner = data; /* Stop updates */ g_source_remove(scanner->update_timeout); /* Ensure that the other thread has finished */ g_thread_join (scanner->no_files_thread); /* If not cancelled, update database and show a dialog */ if(!g_cancellable_is_cancelled (scanner->cancellable)) { /* Hide the scanner and show the dialog */ gtk_widget_hide(scanner->hbox); msg_dialog = gtk_message_dialog_new(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(scanner->hbox))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "%s", _("Library scan complete")); g_signal_connect(G_OBJECT(msg_dialog), "response", G_CALLBACK(pragha_scanner_finished_dialog_response_cb), scanner); g_signal_connect(G_OBJECT(msg_dialog), "delete-event", G_CALLBACK(pragha_scanner_finished_dialog_delete), scanner); gtk_widget_show_all(msg_dialog); /* Save new database and update the library view */ set_watch_cursor(msg_dialog); set_watch_cursor(scanner->hbox); database = pragha_database_get(); pragha_database_begin_transaction (database); pragha_database_flush (database); g_hash_table_foreach (scanner->tracks_table, pragha_scanner_add_track_db, database); /* Import playlist detected. */ for (list = scanner->playlists ; list != NULL; list = list->next) pragha_scanner_import_playlist(database, list->data); pragha_database_commit_transaction (database); pragha_database_change_tracks_done (database); g_object_unref(database); remove_watch_cursor(scanner->hbox); remove_watch_cursor(msg_dialog); /* Save finished time and folders scanned. */ g_get_current_time(&scanner->last_update); last_scan_time = g_time_val_to_iso8601(&scanner->last_update); preferences = pragha_preferences_get(); pragha_preferences_set_string(preferences, GROUP_LIBRARY, KEY_LIBRARY_LAST_SCANNED, last_scan_time); g_free(last_scan_time); pragha_preferences_set_filename_list(preferences, GROUP_LIBRARY, KEY_LIBRARY_SCANNED, scanner->folder_list); g_object_unref(G_OBJECT(preferences)); } else { gtk_widget_hide(scanner->hbox); } gtk_progress_bar_set_text(GTK_PROGRESS_BAR(scanner->progress_bar), NULL); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(scanner->progress_bar), 0.0); /* Clean memory */ g_hash_table_remove_all(scanner->tracks_table); free_str_list(scanner->folder_list); scanner->folder_list = NULL; free_str_list(scanner->folder_scanned); scanner->folder_scanned = NULL; free_str_list(scanner->playlists); scanner->playlists = NULL; scanner->no_files = 0; scanner->files_scanned = 0; g_cancellable_reset (scanner->cancellable); scanner->update_timeout = 0; return FALSE; }