On Thu, 2005-07-28 at 22:18 +0100, Ed Mack wrote: > Getting the crasher bug removed is important though - I'm not fully > aware of what to edit for that. Attached is a slightly updated patch, which contains some fixes, so that attempting to edit (some) uneditable playlists displays an error rather than crashing. It doesn't handle unexpected properties/criteria yet - but that doesn't matter for the purposes of creating playlists frm the library selection. It could with a better error message though. Also changed: * the menu item uses RB_STOCK_AUTOMATIC_PLAYLIST, rather than GTK_STOCK_NEW. The latter gives it a Ctrl-N shortcut, which is already in use (by new playlist). * the menu item is only enabled when you are viewing the library > > Why not go the GtkFileChooser route - i.e. have a simple dialog with > > perhaps a UI for a single filter, with an 'advanced' option to expand > > the dialog into a more complex UI. > > Here-here :) Well, we still need to design a decent "advanced" UI. Cheers, James "Doc" Livingston -- If you treat the people around you with respect, they will never guess that you're trying to stab them in the back
Index: data/ui/rhythmbox-ui.xml
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/ui/rhythmbox-ui.xml,v
retrieving revision 1.20
diff -u -r1.20 rhythmbox-ui.xml
--- data/ui/rhythmbox-ui.xml 26 Jul 2005 14:07:28 -0000 1.20
+++ data/ui/rhythmbox-ui.xml 2 Aug 2005 16:37:53 -0000
@@ -7,6 +7,7 @@
<separator/>
<menu name="PlaylistMenu" action="Playlist">
<menuitem name="MusicPlaylistNewPlaylistMenu" action="MusicPlaylistNewPlaylist"/>
+ <menuitem name="MusicPlaylistNewReflectionPlaylistMenu" action="MusicPlaylistNewReflectionPlaylist"/>
<menuitem name="MusicPlaylistNewAutomaticPlaylistMenu" action="MusicPlaylistNewAutomaticPlaylist"/>
<menuitem name="MusicPlaylistLoadPlaylistMenu" action="MusicPlaylistLoadPlaylist"/>
<menuitem name="MusicPlaylistSavePlaylistMenu" action="MusicPlaylistSavePlaylist"/>
Index: shell/rb-playlist-manager.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-playlist-manager.c,v
retrieving revision 1.48
diff -u -r1.48 rb-playlist-manager.c
--- shell/rb-playlist-manager.c 19 Jun 2005 16:38:12 -0000 1.48
+++ shell/rb-playlist-manager.c 2 Aug 2005 16:38:00 -0000
@@ -70,6 +70,8 @@
RBPlaylistManager *mgr);
static void rb_playlist_manager_cmd_new_automatic_playlist (GtkAction *action,
RBPlaylistManager *mgr);
+static void rb_playlist_manager_cmd_new_reflection_playlist (GtkAction *action,
+ RBPlaylistManager *mgr);
static void rb_playlist_manager_cmd_rename_playlist (GtkAction *action,
RBPlaylistManager *mgr);
static void rb_playlist_manager_cmd_delete_playlist (GtkAction *action,
@@ -143,6 +145,9 @@
{ "MusicPlaylistNewPlaylist", GTK_STOCK_NEW, N_("_New Playlist..."), "<control>N",
N_("Create a new playlist"),
G_CALLBACK (rb_playlist_manager_cmd_new_playlist) },
+ { "MusicPlaylistNewReflectionPlaylist", RB_STOCK_AUTOMATIC_PLAYLIST, N_("New Automatic Playlist from _Selected Categories"), NULL,
+ N_("Create a new automatic playlist from the selected categories"),
+ G_CALLBACK (rb_playlist_manager_cmd_new_reflection_playlist) },
{ "MusicPlaylistNewAutomaticPlaylist", RB_STOCK_AUTOMATIC_PLAYLIST, N_("New _Automatic Playlist..."), NULL,
N_("Create a new automatically updating playlist"),
G_CALLBACK (rb_playlist_manager_cmd_new_automatic_playlist) },
@@ -475,6 +480,9 @@
void
rb_playlist_manager_set_source (RBPlaylistManager *mgr, RBSource *source)
{
+ GtkAction *reflection_action = gtk_action_group_get_action (mgr->priv->actiongroup, "MusicPlaylistNewReflectionPlaylist");
+ gtk_action_set_sensitive (reflection_action, (source == RB_SOURCE (mgr->priv->libsource)));
+
g_return_if_fail (RB_IS_PLAYLIST_MANAGER (mgr));
g_return_if_fail (RB_IS_SOURCE (source));
@@ -735,6 +743,22 @@
}
static void
+rb_playlist_manager_cmd_new_reflection_playlist (GtkAction *action,
+ RBPlaylistManager *mgr)
+{
+ RBLibrarySource *source;
+ RBSource *playlist;
+
+ playlist = rb_playlist_manager_new_playlist (mgr, NULL, TRUE);
+
+ rb_playlist_source_set_query (RB_PLAYLIST_SOURCE (playlist),
+ rb_library_get_query (mgr->priv->libsource),
+ 0, 0);
+
+ rb_playlist_manager_set_dirty (mgr);
+}
+
+static void
rb_playlist_manager_cmd_new_automatic_playlist (GtkAction *action,
RBPlaylistManager *mgr)
{
@@ -775,11 +799,19 @@
query,
limit_count,
limit_size));
+ if (creator != NULL) {
+ gtk_dialog_run (GTK_DIALOG (creator));
- gtk_dialog_run (GTK_DIALOG (creator));
-
- rb_playlist_manager_set_automatic_playlist (mgr, playlist, creator);
- gtk_widget_destroy (GTK_WIDGET (creator));
+ rb_playlist_manager_set_automatic_playlist (mgr, playlist, creator);
+ gtk_widget_destroy (GTK_WIDGET (creator));
+ } else {
+ /*
+ * the query creator could not be started. this means that the
+ * RB cannot edit this playlist
+ */
+ rb_error_dialog (NULL, _("Cannot edit playlist"),
+ _("This playlist cannot be edited in this version of Rhythmbox"));
+ }
}
static void
Index: sources/rb-library-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-library-source.c,v
retrieving revision 1.108
diff -u -r1.108 rb-library-source.c
--- sources/rb-library-source.c 23 Jul 2005 12:41:07 -0000 1.108
+++ sources/rb-library-source.c 2 Aug 2005 16:38:27 -0000
@@ -1458,6 +1458,11 @@
return query;
}
+GPtrArray * rb_library_get_query (RBLibrarySource *source)
+{
+ return construct_query_from_selection (source);
+}
+
static void
rb_library_source_do_query (RBLibrarySource *source, RBLibraryQueryType qtype)
{
Index: sources/rb-library-source.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-library-source.h,v
retrieving revision 1.12
diff -u -r1.12 rb-library-source.h
--- sources/rb-library-source.h 10 Sep 2004 05:12:59 -0000 1.12
+++ sources/rb-library-source.h 2 Aug 2005 16:38:27 -0000
@@ -64,6 +64,8 @@
void rb_library_source_class_add_actions (RBShell *shell,
GtkActionGroup *uimgr);
+GPtrArray * rb_library_get_query (RBLibrarySource *source);
+
G_END_DECLS
#endif /* __RB_LIBRARY_SOURCE_H */
Index: widgets/rb-query-creator.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/widgets/rb-query-creator.c,v
retrieving revision 1.29
diff -u -r1.29 rb-query-creator.c
--- widgets/rb-query-creator.c 25 Jul 2005 16:30:58 -0000 1.29
+++ widgets/rb-query-creator.c 2 Aug 2005 16:38:35 -0000
@@ -266,7 +266,6 @@
mainbox = glade_xml_get_widget (xml, "main_vbox");
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), mainbox, FALSE, FALSE, 0);
- gtk_widget_show_all (GTK_WIDGET (dlg));
return G_OBJECT (dlg);
}
@@ -352,7 +351,7 @@
return g_object_new (RB_TYPE_QUERY_CREATOR, "db", db, NULL);
}
-static void
+static gboolean
rb_query_creator_load_query (RBQueryCreator *creator, GPtrArray *query,
int limit_count, int limit_size)
{
@@ -362,20 +361,15 @@
RhythmDBQueryData *qdata;
GPtrArray *subquery;
- g_assert (query->len == 2);
+ /* the query creator can only edit querys of the form {type=SONG, subquery{...}} */
+ if (query->len != 2)
+ return FALSE;
qdata = g_ptr_array_index (query, 1);
- g_assert (qdata->type == RHYTHMDB_QUERY_SUBQUERY);
+ if (qdata->type != RHYTHMDB_QUERY_SUBQUERY)
+ return FALSE;
subquery = qdata->subquery;
-
- if (subquery->len > 0)
- for (i = 0; i < subquery->len - 1; i++) {
- RhythmDBQueryData *data = g_ptr_array_index (subquery, i);
- if (data->type != RHYTHMDB_QUERY_DISJUNCTION)
- append_row (creator);
- }
-
rows = creator->priv->rows;
for (i = 0; i < subquery->len; i++) {
@@ -387,15 +381,14 @@
disjunction = TRUE;
continue;
}
+ append_row (creator);
propmenu = GTK_OPTION_MENU (get_box_widget_at_pos (GTK_BOX (rows->data), 0));
-
select_property_from_value (GTK_WIDGET (propmenu), property_options,
G_N_ELEMENTS (property_options), data->propid);
criteria_menu = GTK_OPTION_MENU (get_box_widget_at_pos (GTK_BOX (rows->data),
1));
-
select_criteria_from_value (creator,
GTK_WIDGET (criteria_menu), data->propid,
data->type);
@@ -427,6 +420,8 @@
gtk_option_menu_set_history (GTK_OPTION_MENU (creator->priv->limit_option), 2);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (creator->priv->limit_entry), limit_size / 1000);
}
+
+ return TRUE;
}
GtkWidget *
@@ -438,8 +433,13 @@
if (!creator)
return NULL;
- rb_query_creator_load_query (creator, query, limit_count, limit_size);
- return GTK_WIDGET (creator);
+ if (rb_query_creator_load_query (creator, query, limit_count, limit_size)) {
+ gtk_widget_show (GTK_WIDGET (creator));
+ return GTK_WIDGET (creator);
+ } else {
+ gtk_widget_destroy (GTK_WIDGET (creator));
+ return NULL;
+ }
}
static GtkWidget *
Attachment:
signature.asc
Description: This is a digitally signed message part