Hi all, In this patch i made various changes: - changes for minimun memory usage; - remove g_thread calls; - created widget for podcast head information; - usage gnome_vfs async calls; - changes in the interface of podcast source; Please let me know what you think about it. Attached there are the diff against the CVS HEAD and a tarball with the new files. To test it just apply the patch and decompress the tarball inside your rhythmbox devel src dir. BR, Renato Araujo INdT - Instituto Nokia de Tecnologia reanato filho indt org br
Index: Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/Makefile.am,v
retrieving revision 1.41
diff -u -3 -p -r1.41 Makefile.am
--- Makefile.am 6 Sep 2005 07:15:31 -0000 1.41
+++ Makefile.am 7 Sep 2005 04:19:43 -0000
@@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = 1.7
DISTCHECK_CONFIGURE_FLAGS = --disable-schemas-install
-SUBDIRS = macros lib metadata player rhythmdb widgets sources iradio remote daapsharing shell data po help tests
+SUBDIRS = macros lib metadata player rhythmdb widgets sources iradio podcast remote shell data po help tests
EXTRA_DIST = \
autogen.sh \
Index: configure.ac
===================================================================
RCS file: /cvs/gnome/rhythmbox/configure.ac,v
retrieving revision 1.164
diff -u -3 -p -r1.164 configure.ac
--- configure.ac 6 Sep 2005 20:13:41 -0000 1.164
+++ configure.ac 7 Sep 2005 04:19:43 -0000
@@ -504,6 +504,7 @@ player/Makefile
rhythmdb/Makefile
widgets/Makefile
iradio/Makefile
+podcast/Makefile
remote/Makefile
remote/bonobo/Makefile
remote/dbus/Makefile
Index: data/rhythmbox.schemas
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/rhythmbox.schemas,v
retrieving revision 1.47
diff -u -3 -p -r1.47 rhythmbox.schemas
--- data/rhythmbox.schemas 6 Sep 2005 07:15:32 -0000 1.47
+++ data/rhythmbox.schemas 7 Sep 2005 04:19:44 -0000
@@ -199,7 +199,7 @@
<applyto>/apps/rhythmbox/ui/columns_setup</applyto>
<owner>rhythmbox</owner>
<type>string</type>
- <default>RB_TREE_MODEL_NODE_COL_TRACK_NUMBER_STR,RB_TREE_MODEL_NODE_COL_ARTIST,RB_TREE_MODEL_NODE_COL_ALBUM,RB_TREE_MODEL_NODE_COL_GENRE,RB_TREE_MODEL_NODE_COL_DURATION</default>
+ <default>RHYTHMDB_PROP_POST_TIME,RB_TREE_MODEL_NODE_COL_TRACK_NUMBER_STR,RB_TREE_MODEL_NODE_COL_ARTIST,RB_TREE_MODEL_NODE_COL_ALBUM,RB_TREE_MODEL_NODE_COL_GENRE,RB_TREE_MODEL_NODE_COL_DURATION</default>
<locale name="C">
<short>(obsolete) List of active columns.</short>
<long>The list of columns that will be shown for Rhythmbox versions < 0.6.0. If a source
@@ -211,7 +211,7 @@
<applyto>/apps/rhythmbox/ui/rhythmdb_columns_setup</applyto>
<owner>rhythmbox</owner>
<type>string</type>
- <default>RHYTHMDB_PROP_TRACK_NUMBER,RHYTHMDB_PROP_ARTIST,RHYTHMDB_PROP_ALBUM,RHYTHMDB_PROP_GENRE,RHYTHMDB_PROP_DURATION</default>
+ <default>RHYTHMDB_PROP_POST_TIME,RHYTHMDB_PROP_TRACK_NUMBER,RHYTHMDB_PROP_ARTIST,RHYTHMDB_PROP_ALBUM,RHYTHMDB_PROP_GENRE,RHYTHMDB_PROP_DURATION</default>
<locale name="C">
<short>List of active columns.</short>
<long>The list of columns that will be shown. If a source
@@ -244,6 +244,29 @@
<schema>
<key>/schemas/apps/rhythmbox/state/iradio/sorting</key>
<applyto>/apps/rhythmbox/state/iradio/sorting</applyto>
+ <owner>rhythmbox</owner>
+ <type>string</type>
+ <default>Title,ascending</default>
+ <locale name="C">
+ <short>The sorting order</short>
+ <long>A comma-separated list. The first is the title of the
+ column to sort on, the second is the sort type.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/apps/rhythmbox/state/podcast/show_browser</key>
+ <applyto>/apps/rhythmbox/state/podcast/show_browser</applyto>
+ <owner>rhythmbox</owner>
+ <type>bool</type>
+ <default>0</default>
+ <locale name="C">
+ <short>Show browser in podcast display</short>
+ <long>Show the album browser in the Podcast display.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/apps/rhythmbox/state/podcast/sorting</key>
+ <applyto>/apps/rhythmbox/state/podcast/sorting</applyto>
<owner>rhythmbox</owner>
<type>string</type>
<default>Title,ascending</default>
Index: data/art/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/art/Makefile.am,v
retrieving revision 1.20
diff -u -3 -p -r1.20 Makefile.am
--- data/art/Makefile.am 8 Feb 2005 19:04:38 -0000 1.20
+++ data/art/Makefile.am 7 Sep 2005 04:19:44 -0000
@@ -24,6 +24,7 @@ art_DATA = rhythmbox-shuffle.png \
rhythmbox-audiocd.png \
rhythmbox-dnd.png \
rhythmbox-ipod.png \
+ rhythmbox-podcast.png \
about-logo.png
artdir = $(pkgdatadir)/art
Index: data/glade/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/glade/Makefile.am,v
retrieving revision 1.16
diff -u -3 -p -r1.16 Makefile.am
--- data/glade/Makefile.am 16 Sep 2004 19:16:07 -0000 1.16
+++ data/glade/Makefile.am 7 Sep 2005 04:19:44 -0000
@@ -2,11 +2,15 @@
glade_DATA = general-prefs.glade \
library-prefs.glade \
+ podcast-prefs.glade \
song-info.glade \
song-info-multiple.glade \
load-failure.glade \
station-new.glade \
station-properties.glade \
+ podcast-site-properties.glade \
+ podcast-new.glade \
+ podcast-properties.glade \
create-playlist.glade \
druid.glade \
recorder.glade \
Index: data/glade/general-prefs.glade
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/glade/general-prefs.glade,v
retrieving revision 1.6
diff -u -3 -p -r1.6 general-prefs.glade
--- data/glade/general-prefs.glade 26 Jun 2005 21:49:57 -0000 1.6
+++ data/glade/general-prefs.glade 7 Sep 2005 04:19:44 -0000
@@ -2,7 +2,6 @@
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
<glade-interface>
-<requires lib="gnome"/>
<widget class="GtkWindow" id="preferences">
<property name="visible">True</property>
@@ -12,6 +11,12 @@
<property name="modal">False</property>
<property name="resizable">False</property>
<property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
<child>
<widget class="GtkVBox" id="general_vbox">
@@ -45,6 +50,10 @@
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
@@ -72,6 +81,10 @@
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
@@ -105,6 +118,10 @@
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
@@ -116,7 +133,7 @@
<child>
<widget class="GtkTable" id="table1">
<property name="visible">True</property>
- <property name="n_rows">5</property>
+ <property name="n_rows">6</property>
<property name="n_columns">2</property>
<property name="homogeneous">True</property>
<property name="row_spacing">6</property>
@@ -298,6 +315,29 @@
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="date_check">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Da_te</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="rb_shell_preferences_column_check_changed_cb" last_modification_time="Fri, 02 May 2003 04:26:32 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
Index: data/ui/rhythmbox-ui.xml
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/ui/rhythmbox-ui.xml,v
retrieving revision 1.22
diff -u -3 -p -r1.22 rhythmbox-ui.xml
--- data/ui/rhythmbox-ui.xml 6 Sep 2005 07:15:32 -0000 1.22
+++ data/ui/rhythmbox-ui.xml 7 Sep 2005 04:19:44 -0000
@@ -15,6 +15,7 @@
<menuitem name="MusicPlaylistDeletePlaylistMenu" action="MusicPlaylistDeletePlaylist"/>
</menu>
<menuitem name="MusicNewInternetRadioStationMenu" action="MusicNewInternetRadioStation"/>
+ <menuitem name="MusicNewPodcastMenu" action="MusicNewPodcast"/>
<separator/>
<menuitem name="MusicPropertiesMenu" action="MusicProperties"/>
<separator/>
@@ -119,6 +120,16 @@
<menuitem name="DeleteIRadioPopup" action="EditDelete"/>
<separator/>
<menuitem name="PropertiesIRadioPopup" action="MusicProperties"/>
+ </popup>
+ <popup name="PodcastSourcePopup">
+ <menuitem name="PodcastSrcPopupNew" action="MusicNewPodcast"/>
+ </popup>
+
+ <popup name="PodcastViewPopup">
+ <menuitem name="DeletePodcastPopup" action="EditDelete"/>
+ <menuitem name="DownloadPodcastPopup" action="PodcastSrcDownloadPost"/>
+ <separator/>
+ <menuitem name="PropertiesPodcastPopup" action="MusicProperties"/>
</popup>
<popup name="PlaylistSourcePopup">
Index: lib/rb-stock-icons.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/lib/rb-stock-icons.c,v
retrieving revision 1.17
diff -u -3 -p -r1.17 rb-stock-icons.c
--- lib/rb-stock-icons.c 8 Feb 2005 19:04:39 -0000 1.17
+++ lib/rb-stock-icons.c 7 Sep 2005 04:19:44 -0000
@@ -60,7 +60,8 @@ rb_stock_icons_init (void)
RB_STOCK_NO_STAR,
RB_STOCK_DND_ICON,
RB_STOCK_AUDIOCD,
- RB_STOCK_IPOD
+ RB_STOCK_IPOD,
+ RB_STOCK_PODCAST
};
g_return_if_fail (factory == NULL);
Index: lib/rb-stock-icons.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/lib/rb-stock-icons.h,v
retrieving revision 1.17
diff -u -3 -p -r1.17 rb-stock-icons.h
--- lib/rb-stock-icons.h 8 Feb 2005 19:04:39 -0000 1.17
+++ lib/rb-stock-icons.h 7 Sep 2005 04:19:44 -0000
@@ -50,6 +50,7 @@ G_BEGIN_DECLS
#define RB_STOCK_AUDIOCD "rhythmbox-audiocd"
#define RB_STOCK_DND_ICON "rhythmbox-dnd"
#define RB_STOCK_IPOD "rhythmbox-ipod"
+#define RB_STOCK_PODCAST "rhythmbox-podcast"
void rb_stock_icons_init (void);
Index: player/rb-player-gst.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/player/rb-player-gst.c,v
retrieving revision 1.44
diff -u -3 -p -r1.44 rb-player-gst.c
--- player/rb-player-gst.c 6 Sep 2005 19:32:49 -0000 1.44
+++ player/rb-player-gst.c 7 Sep 2005 04:19:44 -0000
@@ -784,20 +784,8 @@ rb_player_get_time (RBPlayer *mp)
gint64 gst_position;
GstFormat fmt = GST_FORMAT_TIME;
gst_element_query (mp->priv->playbin, GST_QUERY_POSITION, &fmt, &gst_position);
-<<<<<<< rb-player-gst.c
-
- ret = (glong) (gst_position / (1000*1000*1000));
-#ifdef WITH_DAAP_SUPPORT
- if (mp->priv->uri && g_strncasecmp (mp->priv->uri, "daap://", 7) == 0) {
- ret += rb_daap_src_get_time ();
- }
-#endif
-
- return ret;
-=======
return (long)(gst_position / (1000*1000*1000));
->>>>>>> 1.42
} else
return -1;
}
Index: rhythmdb/rhythmdb-tree.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb-tree.c,v
retrieving revision 1.70
diff -u -3 -p -r1.70 rhythmdb-tree.c
--- rhythmdb/rhythmdb-tree.c 3 Sep 2005 13:18:55 -0000 1.70
+++ rhythmdb/rhythmdb-tree.c 7 Sep 2005 04:19:45 -0000
@@ -249,6 +249,10 @@ rhythmdb_tree_parser_start_element (stru
type = RHYTHMDB_ENTRY_TYPE_SONG;
else if (!strcmp (typename, "iradio"))
type = RHYTHMDB_ENTRY_TYPE_IRADIO_STATION;
+ else if (!strcmp (typename, "podcast"))
+ type = RHYTHMDB_ENTRY_TYPE_PODCAST_POST;
+ else if (!strcmp (typename, "podcast-head"))
+ type = RHYTHMDB_ENTRY_TYPE_PODCAST_HEAD;
else
return;
type_set = TRUE;
@@ -393,6 +397,30 @@ rhythmdb_tree_parser_end_element (struct
case RHYTHMDB_PROP_MIMETYPE:
ctx->entry->mimetype = rb_refstring_new (ctx->buf->str);
break;
+ case RHYTHMDB_PROP_STATUS:
+ ctx->entry->podcast->status = parse_ulong (ctx->buf->str);
+ break;
+ case RHYTHMDB_PROP_DESCRIPTION:
+ ctx->entry->podcast->description = rb_refstring_new (ctx->buf->str);
+ break;
+ case RHYTHMDB_PROP_SUBTITLE:
+ ctx->entry->podcast->subtitle = rb_refstring_new (ctx->buf->str);
+ break;
+ case RHYTHMDB_PROP_SUMMARY:
+ ctx->entry->podcast->summary = rb_refstring_new (ctx->buf->str);
+ break;
+ case RHYTHMDB_PROP_LANG:
+ ctx->entry->podcast->lang = rb_refstring_new (ctx->buf->str);
+ break;
+ case RHYTHMDB_PROP_COPYRIGHT:
+ ctx->entry->podcast->copyright = rb_refstring_new (ctx->buf->str);
+ break;
+ case RHYTHMDB_PROP_IMAGE:
+ ctx->entry->podcast->image = rb_refstring_new (ctx->buf->str);
+ break;
+ case RHYTHMDB_PROP_POST_TIME:
+ ctx->entry->podcast->post_time = parse_ulong (ctx->buf->str);
+ break;
case RHYTHMDB_PROP_TITLE_SORT_KEY:
case RHYTHMDB_PROP_GENRE_SORT_KEY:
case RHYTHMDB_PROP_ARTIST_SORT_KEY:
@@ -615,6 +643,10 @@ save_entry (RhythmDBTree *db, RhythmDBEn
RHYTHMDB_FWRITE_STATICSTR ("song", ctx->handle, ctx->error);
} else if (entry->type == RHYTHMDB_ENTRY_TYPE_IRADIO_STATION) {
RHYTHMDB_FWRITE_STATICSTR ("iradio", ctx->handle, ctx->error);
+ } else if (entry->type == RHYTHMDB_ENTRY_TYPE_PODCAST_POST) {
+ RHYTHMDB_FWRITE_STATICSTR ("podcast", ctx->handle, ctx->error);
+ } else if (entry->type == RHYTHMDB_ENTRY_TYPE_PODCAST_HEAD) {
+ RHYTHMDB_FWRITE_STATICSTR ("podcast-head", ctx->handle, ctx->error);
} else
g_assert_not_reached ();
@@ -703,6 +735,38 @@ save_entry (RhythmDBTree *db, RhythmDBEn
case RHYTHMDB_PROP_LAST_PLAYED:
save_entry_ulong(ctx, elt_name, entry->last_played);
break;
+ case RHYTHMDB_PROP_STATUS:
+ if (entry->podcast)
+ save_entry_ulong (ctx, elt_name, entry->podcast->status);
+ break;
+ case RHYTHMDB_PROP_DESCRIPTION:
+ if (entry->podcast && entry->podcast->description)
+ save_entry_string(ctx, elt_name, rb_refstring_get (entry->podcast->description));
+ break;
+ case RHYTHMDB_PROP_SUBTITLE:
+ if (entry->podcast && entry->podcast->subtitle)
+ save_entry_string(ctx, elt_name, rb_refstring_get (entry->podcast->subtitle));
+ break;
+ case RHYTHMDB_PROP_SUMMARY:
+ if (entry->podcast && entry->podcast->summary)
+ save_entry_string(ctx, elt_name, rb_refstring_get (entry->podcast->summary));
+ break;
+ case RHYTHMDB_PROP_LANG:
+ if (entry->podcast && entry->podcast->lang)
+ save_entry_string(ctx, elt_name, rb_refstring_get (entry->podcast->lang));
+ break;
+ case RHYTHMDB_PROP_COPYRIGHT:
+ if (entry->podcast && entry->podcast->copyright)
+ save_entry_string(ctx, elt_name, rb_refstring_get (entry->podcast->copyright));
+ break;
+ case RHYTHMDB_PROP_IMAGE:
+ if (entry->podcast && entry->podcast->image)
+ save_entry_string(ctx, elt_name, rb_refstring_get (entry->podcast->image));
+ break;
+ case RHYTHMDB_PROP_POST_TIME:
+ if (entry->podcast)
+ save_entry_ulong (ctx, elt_name, entry->podcast->post_time);
+ break;
case RHYTHMDB_PROP_TITLE_SORT_KEY:
case RHYTHMDB_PROP_GENRE_SORT_KEY:
case RHYTHMDB_PROP_ARTIST_SORT_KEY:
@@ -754,6 +818,12 @@ rhythmdb_tree_save (RhythmDB *rdb)
(RBTreeEntryItFunc)save_entry,
NULL, NULL, NULL, &ctx);
rhythmdb_hash_tree_foreach (rdb, RHYTHMDB_ENTRY_TYPE_IRADIO_STATION,
+ (RBTreeEntryItFunc)save_entry,
+ NULL, NULL, NULL, &ctx);
+ rhythmdb_hash_tree_foreach (rdb, RHYTHMDB_ENTRY_TYPE_PODCAST_POST,
+ (RBTreeEntryItFunc)save_entry,
+ NULL, NULL, NULL, &ctx);
+ rhythmdb_hash_tree_foreach (rdb, RHYTHMDB_ENTRY_TYPE_PODCAST_HEAD,
(RBTreeEntryItFunc)save_entry,
NULL, NULL, NULL, &ctx);
Index: rhythmdb/rhythmdb.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb.c,v
retrieving revision 1.115
diff -u -3 -p -r1.115 rhythmdb.c
--- rhythmdb/rhythmdb.c 4 Sep 2005 23:17:15 -0000 1.115
+++ rhythmdb/rhythmdb.c 7 Sep 2005 04:19:46 -0000
@@ -866,9 +866,15 @@ rhythmdb_entry_allocate (RhythmDB *db, R
ret->artist = rb_refstring_ref (db->priv->empty_string);
ret->album = rb_refstring_ref (db->priv->empty_string);
ret->mimetype = rb_refstring_ref (db->priv->octet_stream_str);
+
+ if ((type == RHYTHMDB_ENTRY_TYPE_PODCAST_POST) ||
+ (type == RHYTHMDB_ENTRY_TYPE_PODCAST_HEAD))
+ ret->podcast = g_new0 (RhythmDBPodcastFields, 1);
+ else
+ ret->podcast = NULL;
rhythmdb_entry_sync_mirrored (db, ret, RHYTHMDB_PROP_LAST_PLAYED);
-
+
/* The refcount is initially 0, we want to set it to 1 */
g_atomic_int_inc (&ret->refcount);
return ret;
@@ -919,6 +925,17 @@ rhythmdb_entry_finalize (RhythmDBEntry *
rb_refstring_unref (entry->artist);
rb_refstring_unref (entry->album);
rb_refstring_unref (entry->mimetype);
+
+ if (entry->podcast) {
+ rb_refstring_unref (entry->podcast->description);
+ rb_refstring_unref (entry->podcast->subtitle);
+ rb_refstring_unref (entry->podcast->summary);
+ rb_refstring_unref (entry->podcast->lang);
+ rb_refstring_unref (entry->podcast->copyright);
+ rb_refstring_unref (entry->podcast->image);
+ g_free (entry->podcast);
+ entry->podcast = NULL;
+ }
}
void
@@ -2103,6 +2120,36 @@ rhythmdb_entry_set_internal (RhythmDB *d
case RHYTHMDB_PROP_HIDDEN:
entry->hidden = g_value_get_boolean (value);
break;
+ case RHYTHMDB_PROP_STATUS:
+ entry->podcast->status = g_value_get_ulong (value);
+ break;
+ case RHYTHMDB_PROP_DESCRIPTION:
+ rb_refstring_unref (entry->podcast->description);
+ entry->podcast->description = rb_refstring_new (g_value_get_string (value));
+ break;
+ case RHYTHMDB_PROP_SUBTITLE:
+ rb_refstring_unref (entry->podcast->subtitle);
+ entry->podcast->subtitle = rb_refstring_new (g_value_get_string (value));
+ break;
+ case RHYTHMDB_PROP_SUMMARY:
+ rb_refstring_unref (entry->podcast->summary);
+ entry->podcast->summary = rb_refstring_new (g_value_get_string (value));
+ break;
+ case RHYTHMDB_PROP_LANG:
+ rb_refstring_unref (entry->podcast->lang);
+ entry->podcast->lang = rb_refstring_new (g_value_get_string (value));
+ break;
+ case RHYTHMDB_PROP_COPYRIGHT:
+ rb_refstring_unref (entry->podcast->copyright);
+ entry->podcast->copyright = rb_refstring_new (g_value_get_string (value));
+ break;
+ case RHYTHMDB_PROP_IMAGE:
+ rb_refstring_unref (entry->podcast->image);
+ entry->podcast->image = rb_refstring_new (g_value_get_string (value));
+ break;
+ case RHYTHMDB_PROP_POST_TIME:
+ entry->podcast->post_time = g_value_get_ulong (value);
+ break;
case RHYTHMDB_NUM_PROPERTIES:
g_assert_not_reached ();
break;
@@ -2761,6 +2808,14 @@ rhythmdb_prop_get_type (void)
ENUM_ENTRY (RHYTHMDB_PROP_LAST_PLAYED_STR, "Last Played (gchararray) [last-played-str]"),
ENUM_ENTRY (RHYTHMDB_PROP_PLAYBACK_ERROR, "Playback error string (gchararray) [playback-error]"),
ENUM_ENTRY (RHYTHMDB_PROP_HIDDEN, "Visibility (gboolean) [visibility]"),
+ ENUM_ENTRY (RHYTHMDB_PROP_STATUS, "Status of file (gulong) [status]"),
+ ENUM_ENTRY (RHYTHMDB_PROP_DESCRIPTION, "Podcast description(gchararray) [description]"),
+ ENUM_ENTRY (RHYTHMDB_PROP_SUBTITLE, "Podcast subtitle (gchararray) [subtitle]"),
+ ENUM_ENTRY (RHYTHMDB_PROP_SUMMARY, "Podcast summary (gchararray) [summary]"),
+ ENUM_ENTRY (RHYTHMDB_PROP_LANG, "Podcast language (gchararray) [lang]"),
+ ENUM_ENTRY (RHYTHMDB_PROP_COPYRIGHT, "Podcast copyright (gchararray) [copyright]"),
+ ENUM_ENTRY (RHYTHMDB_PROP_IMAGE, "Podcast image(gchararray) [image]"),
+ ENUM_ENTRY (RHYTHMDB_PROP_POST_TIME, "Podcast time of post (gulong) [post-time]"),
{ 0, 0, 0 }
};
g_assert ((sizeof (values) / sizeof (values[0]) - 1) == RHYTHMDB_NUM_PROPERTIES);
@@ -2913,6 +2968,33 @@ RhythmDBEntryType rhythmdb_entry_iradio_
return iradio_type;
}
+
+RhythmDBEntryType rhythmdb_entry_podcast_post_get_type (void)
+{
+ static RhythmDBEntryType podcast_post_type = -1;
+
+ g_static_mutex_lock (&entry_type_mutex);
+ if (podcast_post_type == -1) {
+ podcast_post_type = rhythmdb_entry_register_type ();
+ }
+ g_static_mutex_unlock (&entry_type_mutex);
+
+ return podcast_post_type;
+}
+
+RhythmDBEntryType rhythmdb_entry_podcast_head_get_type (void)
+{
+ static RhythmDBEntryType podcast_head_type = -1;
+
+ g_static_mutex_lock (&entry_type_mutex);
+ if (podcast_head_type == -1) {
+ podcast_head_type = rhythmdb_entry_register_type ();
+ }
+ g_static_mutex_unlock (&entry_type_mutex);
+
+ return podcast_head_type;
+}
+
struct MountCtxt {
RhythmDB *db;
Index: rhythmdb/rhythmdb.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb.h,v
retrieving revision 1.47
diff -u -3 -p -r1.47 rhythmdb.h
--- rhythmdb/rhythmdb.h 29 Aug 2005 23:19:41 -0000 1.47
+++ rhythmdb/rhythmdb.h 7 Sep 2005 04:19:47 -0000
@@ -48,6 +48,8 @@ typedef gint32 RhythmDBEntryType;
#define RHYTHMDB_ENTRY_TYPE_SONG (rhythmdb_entry_song_get_type ())
#define RHYTHMDB_ENTRY_TYPE_IRADIO_STATION (rhythmdb_entry_iradio_get_type ())
+#define RHYTHMDB_ENTRY_TYPE_PODCAST_POST (rhythmdb_entry_podcast_post_get_type ())
+#define RHYTHMDB_ENTRY_TYPE_PODCAST_HEAD (rhythmdb_entry_podcast_head_get_type ())
typedef enum
{
@@ -100,7 +102,15 @@ typedef enum
RHYTHMDB_PROP_LAST_PLAYED_STR,
RHYTHMDB_PROP_HIDDEN,
RHYTHMDB_PROP_PLAYBACK_ERROR,
-
+//podcast propriets
+ RHYTHMDB_PROP_STATUS,
+ RHYTHMDB_PROP_DESCRIPTION,
+ RHYTHMDB_PROP_SUBTITLE,
+ RHYTHMDB_PROP_SUMMARY,
+ RHYTHMDB_PROP_LANG,
+ RHYTHMDB_PROP_COPYRIGHT,
+ RHYTHMDB_PROP_IMAGE,
+ RHYTHMDB_PROP_POST_TIME,
RHYTHMDB_NUM_PROPERTIES
} RhythmDBPropType;
@@ -119,6 +129,19 @@ typedef struct {
} RhythmDBQueryData;
typedef struct {
+ /* podcast */
+ RBRefString *description;
+ RBRefString *subtitle;
+ RBRefString *summary;
+ RBRefString *lang;
+ RBRefString *copyright;
+ RBRefString *image;
+ gulong status; //0-99: downloading; 100: Conplete; 101: Error; 102: ready; 103: pause;
+ gulong post_time;
+} RhythmDBPodcastFields;
+
+
+typedef struct {
/* internal bits */
#ifndef G_DISABLE_ASSERT
guint magic;
@@ -164,11 +187,17 @@ typedef struct {
/* cached data */
RBRefString *last_played_str;
+ /* cached data */
+ RBRefString *date_str;
+
/* playback error string */
char *playback_error;
/* visibility (to hide entries on unmounted volumes) */
gboolean hidden;
+
+ /*Podcast*/
+ RhythmDBPodcastFields *podcast;
} RhythmDBEntry;
typedef struct {
@@ -225,6 +254,19 @@ rhythmdb_entry_get_string (RhythmDBEntry
return rb_refstring_get (entry->last_played_str);
case RHYTHMDB_PROP_PLAYBACK_ERROR:
return entry->playback_error;
+//podcast propriets
+ case RHYTHMDB_PROP_DESCRIPTION:
+ return rb_refstring_get (entry->podcast->description);
+ case RHYTHMDB_PROP_SUBTITLE:
+ return rb_refstring_get (entry->podcast->subtitle);
+ case RHYTHMDB_PROP_SUMMARY:
+ return rb_refstring_get (entry->podcast->summary);
+ case RHYTHMDB_PROP_LANG:
+ return rb_refstring_get (entry->podcast->lang);
+ case RHYTHMDB_PROP_COPYRIGHT:
+ return rb_refstring_get (entry->podcast->copyright);
+ case RHYTHMDB_PROP_IMAGE:
+ return rb_refstring_get (entry->podcast->image);
default:
g_assert_not_reached ();
return NULL;
@@ -279,6 +321,10 @@ rhythmdb_entry_get_ulong (RhythmDBEntry
return entry->play_count;
case RHYTHMDB_PROP_BITRATE:
return entry->bitrate;
+ case RHYTHMDB_PROP_POST_TIME:
+ return entry->podcast->post_time;
+ case RHYTHMDB_PROP_STATUS:
+ return entry->podcast->status;
default:
g_assert_not_reached ();
return 0;
@@ -356,7 +402,7 @@ typedef struct
void (*impl_entry_delete_by_type) (RhythmDB *db, RhythmDBEntryType type);
RhythmDBEntry * (*impl_lookup_by_location)(RhythmDB *db, const char *uri);
-
+
gboolean (*impl_evaluate_query) (RhythmDB *db, GPtrArray *query, RhythmDBEntry *entry);
void (*impl_entry_foreach) (RhythmDB *db, GFunc func, gpointer data);
@@ -464,6 +510,8 @@ RhythmDBEntryType rhythmdb_entry_registe
RhythmDBEntryType rhythmdb_entry_song_get_type (void);
RhythmDBEntryType rhythmdb_entry_iradio_get_type (void);
+RhythmDBEntryType rhythmdb_entry_podcast_post_get_type (void);
+RhythmDBEntryType rhythmdb_entry_podcast_head_get_type (void);
RhythmDBEntryType rhythmdb_entry_icecast_get_type (void);
extern GType rhythmdb_property_type_map[RHYTHMDB_NUM_PROPERTIES];
Index: shell/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/Makefile.am,v
retrieving revision 1.56
diff -u -3 -p -r1.56 Makefile.am
--- shell/Makefile.am 6 Sep 2005 07:15:33 -0000 1.56
+++ shell/Makefile.am 7 Sep 2005 04:19:47 -0000
@@ -70,6 +70,7 @@ rhythmbox_LDADD = \
$(top_builddir)/sources/libsourcesimpl.la \
$(top_builddir)/rhythmdb/librhythmdb.la \
$(top_builddir)/iradio/librbiradio.la \
+ $(top_builddir)/podcast/librbpodcast.la \
$(top_builddir)/remote/librbremote.la \
$(top_builddir)/player/librbplayer.la \
$(top_builddir)/metadata/librbmetadata.la \
@@ -114,6 +115,7 @@ INCLUDES = \
-I$(top_srcdir)/widgets \
-I$(top_srcdir)/sources \
-I$(top_srcdir)/iradio \
+ -I$(top_srcdir)/podcast \
-I$(top_srcdir)/remote \
-I$(top_builddir)/remote \
-DPIXMAP_DIR=\""$(datadir)/pixmaps"\" \
Index: shell/rb-playlist-manager.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-playlist-manager.c,v
retrieving revision 1.57
diff -u -3 -p -r1.57 rb-playlist-manager.c
--- shell/rb-playlist-manager.c 6 Sep 2005 07:15:33 -0000 1.57
+++ shell/rb-playlist-manager.c 7 Sep 2005 04:19:47 -0000
@@ -98,6 +98,7 @@ struct RBPlaylistManagerPrivate
RBLibrarySource *libsource;
RBIRadioSource *iradio_source;
+ RBPodcastSource *podcast_source;
GtkWindow *window;
guint playlist_serial;
@@ -126,6 +127,7 @@ enum
PROP_SOURCELIST,
PROP_LIBRARY_SOURCE,
PROP_IRADIO_SOURCE,
+ PROP_PODCAST_SOURCE,
};
enum
@@ -245,6 +247,16 @@ rb_playlist_manager_class_init (RBPlayli
"IRadioSource",
RB_TYPE_IRADIO_SOURCE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+
+ g_object_class_install_property (object_class,
+ PROP_PODCAST_SOURCE,
+ g_param_spec_object ("podcast-source",
+ "PodcastSource",
+ "PodcastSource",
+ RB_TYPE_PODCAST_SOURCE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
g_object_class_install_property (object_class,
PROP_SOURCELIST,
g_param_spec_object ("sourcelist",
@@ -460,6 +472,9 @@ rb_playlist_manager_set_property (GObjec
case PROP_IRADIO_SOURCE:
mgr->priv->iradio_source = g_value_get_object (value);
break;
+ case PROP_PODCAST_SOURCE:
+ mgr->priv->podcast_source = g_value_get_object (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -491,6 +506,9 @@ rb_playlist_manager_get_property (GObjec
case PROP_IRADIO_SOURCE:
g_value_set_object (value, mgr->priv->iradio_source);
break;
+ case PROP_PODCAST_SOURCE:
+ g_value_set_object (value, mgr->priv->podcast_source);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -512,13 +530,15 @@ RBPlaylistManager *
rb_playlist_manager_new (RBShell *shell,
RBSourceList *sourcelist,
RBLibrarySource *libsource,
- RBIRadioSource *iradio_source)
+ RBIRadioSource *iradio_source,
+ RBPodcastSource *podcast_source)
{
return g_object_new (RB_TYPE_PLAYLIST_MANAGER,
"shell", shell,
"sourcelist", sourcelist,
"library_source", libsource,
"iradio_source", iradio_source,
+ "podcast_source", podcast_source,
NULL);
}
Index: shell/rb-playlist-manager.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-playlist-manager.h,v
retrieving revision 1.18
diff -u -3 -p -r1.18 rb-playlist-manager.h
--- shell/rb-playlist-manager.h 6 Sep 2005 07:15:33 -0000 1.18
+++ shell/rb-playlist-manager.h 7 Sep 2005 04:19:47 -0000
@@ -27,6 +27,7 @@
#include "rb-sourcelist.h"
#include "rb-library-source.h"
#include "rb-iradio-source.h"
+#include "rb-podcast-source.h"
G_BEGIN_DECLS
@@ -71,7 +72,8 @@ GType rb_playlist_manager_get_type (vo
RBPlaylistManager * rb_playlist_manager_new (RBShell *shell,
RBSourceList *sourcelist,
RBLibrarySource *libsource,
- RBIRadioSource *iradio_source);
+ RBIRadioSource *iradio_source,
+ RBPodcastSource *podcast_source);
gboolean rb_playlist_manager_parse_file (RBPlaylistManager *mgr,
const char *uri,
Index: shell/rb-shell-player.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell-player.c,v
retrieving revision 1.169
diff -u -3 -p -r1.169 rb-shell-player.c
--- shell/rb-shell-player.c 30 Aug 2005 20:22:37 -0000 1.169
+++ shell/rb-shell-player.c 7 Sep 2005 04:19:49 -0000
@@ -59,6 +59,7 @@
#include "rb-util.h"
#include "rb-play-order.h"
#include "rb-statusbar.h"
+#include "rhythmdb.h"
#ifdef HAVE_XIDLE_EXTENSION
#include <X11/extensions/xidle.h>
@@ -1055,7 +1056,10 @@ rb_shell_player_open_location (RBShellPl
static gboolean
rb_shell_player_open_entry (RBShellPlayer *player, RhythmDBEntry *entry, GError **error)
{
- return rb_shell_player_open_location (player, entry->location, error);
+ if (entry->type == RHYTHMDB_ENTRY_TYPE_PODCAST_POST)
+ return rb_shell_player_open_location (player, rb_refstring_get (entry->mountpoint), error);
+ else
+ return rb_shell_player_open_location (player, entry->location, error);
}
static gboolean
Index: shell/rb-shell-preferences.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell-preferences.c,v
retrieving revision 1.43
diff -u -3 -p -r1.43 rb-shell-preferences.c
--- shell/rb-shell-preferences.c 6 Sep 2005 07:15:33 -0000 1.43
+++ shell/rb-shell-preferences.c 7 Sep 2005 04:19:49 -0000
@@ -87,6 +87,8 @@ struct RBShellPreferencesPrivate
GtkWidget *play_count_check;
GtkWidget *last_played_check;
GtkWidget *quality_check;
+ GtkWidget *date_check;
+ GtkWidget *status_check;
gboolean loading;
};
@@ -224,6 +226,11 @@ rb_shell_preferences_init (RBShellPrefer
glade_xml_get_widget (xml, "last_played_check");
shell_preferences->priv->quality_check =
glade_xml_get_widget (xml, "quality_check");
+ shell_preferences->priv->date_check =
+ glade_xml_get_widget (xml, "date_check");
+ shell_preferences->priv->status_check =
+ glade_xml_get_widget (xml, "status_check");
+
gtk_notebook_append_page (GTK_NOTEBOOK (shell_preferences->priv->notebook),
glade_xml_get_widget (xml, "general_vbox"),
@@ -441,6 +448,8 @@ rb_shell_preferences_column_check_change
else if (shell_preferences->priv->quality_check
&& butt == GTK_CHECK_BUTTON (shell_preferences->priv->quality_check))
colname = "RHYTHMDB_PROP_BITRATE";
+ else if (butt == GTK_CHECK_BUTTON (shell_preferences->priv->date_check))
+ colname = "RHYTHMDB_PROP_POST_TIME";
else
g_assert_not_reached ();
@@ -505,6 +514,10 @@ rb_shell_preferences_sync (RBShellPrefer
gtk_toggle_button_set_active
(GTK_TOGGLE_BUTTON (shell_preferences->priv->quality_check),
strstr (columns, "RHYTHMDB_PROP_BITRATE") != NULL);
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (shell_preferences->priv->date_check),
+ strstr (columns, "RHYTHMDB_PROP_POST_TIME") != NULL);
+
}
g_free (columns);
Index: shell/rb-shell.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell.c,v
retrieving revision 1.333
diff -u -3 -p -r1.333 rb-shell.c
--- shell/rb-shell.c 6 Sep 2005 07:15:33 -0000 1.333
+++ shell/rb-shell.c 7 Sep 2005 04:19:50 -0000
@@ -66,9 +66,7 @@
#include "rb-statusbar.h"
#include "rb-shell-preferences.h"
#include "rb-library-source.h"
-#ifdef WITH_IPOD_SUPPORT
-#include "rb-ipod-source.h"
-#endif
+#include "rb-podcast-source.h"
#include "totem-pl-parser.h"
#ifdef WITH_IPOD_SUPPORT
#include "rb-ipod-source.h"
@@ -80,6 +78,9 @@
#include "rb-load-failure-dialog.h"
#include "rb-new-station-dialog.h"
#include "rb-iradio-source.h"
+
+#include "rb-new-podcast-dialog.h"
+
#ifdef HAVE_AUDIOCD
#include "rb-audiocd-source.h"
#endif
@@ -166,6 +167,9 @@ static void rb_shell_cmd_add_file_to_lib
RBShell *shell);
static void rb_shell_cmd_new_station (GtkAction *action,
RBShell *shell);
+static void rb_shell_cmd_new_podcast (GtkAction *action,
+ RBShell *shell);
+
static void rb_shell_cmd_extract_cd (GtkAction *action,
RBShell *shell);
static void rb_shell_cmd_current_song (GtkAction *action,
@@ -329,10 +333,15 @@ struct RBShellPrivate
RBLibrarySource *library_source;
RBIRadioSource *iradio_source;
-#ifdef WITH_IPOD_SUPPORT
+ RBPodcastSource *podcast_source;
+#ifdef WITH_IPOD_SUPPORT
RBiPodSource *ipod_source;
#endif
+#ifdef HAVE_AUDIOCD
+ MonkeyMediaAudioCD *cd;
+#endif
+
RBSource *selected_source;
GtkWidget *prefs;
@@ -359,6 +368,10 @@ static GtkActionEntry rb_shell_actions [
N_("Create a new Internet Radio station"),
G_CALLBACK (rb_shell_cmd_new_station) },
+ { "MusicNewPodcast", GTK_STOCK_NEW, N_("Subscribe _Podcast"), "<control>P",
+ N_("Create a new Podcast Feed"),
+ G_CALLBACK (rb_shell_cmd_new_podcast) },
+
{ "MusicImportFolder", GTK_STOCK_OPEN, N_("_Import Folder..."), "<control>O",
N_("Choose folder to be added to the Library"),
G_CALLBACK (rb_shell_cmd_add_folder_to_library) },
@@ -824,12 +837,19 @@ rb_shell_constructor (GType type, guint
shell = RB_SHELL (parent_class->constructor (type, n_construct_properties,
construct_properties));
- rb_debug ("Constructing shell");
+ rb_debug ("Constructing shell RENTO");
/* initialize UI */
win = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
+
+
+ rb_debug ("UI initialized");
+
gtk_window_set_title (win, _("Music Player"));
+
+ rb_debug ("UI initialized");
+
shell->priv->window = GTK_WIDGET (win);
shell->priv->iconified = FALSE;
g_signal_connect_object (G_OBJECT (win), "window-state-event",
@@ -843,6 +863,9 @@ rb_shell_constructor (GType type, guint
shell->priv->ui_manager = gtk_ui_manager_new ();
+
+ rb_debug ("UI Manager create");
+
shell->priv->actiongroup = gtk_action_group_new ("MainActions");
gtk_action_group_set_translation_domain (shell->priv->actiongroup,
GETTEXT_PACKAGE);
@@ -995,6 +1018,9 @@ rb_shell_constructor (GType type, guint
rb_shell_append_source (shell, RB_SOURCE (shell->priv->library_source), NULL);
shell->priv->iradio_source = RB_IRADIO_SOURCE (rb_iradio_source_new (shell));
rb_shell_append_source (shell, RB_SOURCE (shell->priv->iradio_source), NULL);
+ shell->priv->podcast_source = RB_PODCAST_SOURCE (rb_podcast_source_new (shell));
+ rb_shell_append_source (shell, RB_SOURCE (shell->priv->podcast_source), NULL);
+
#ifdef WITH_IPOD_SUPPORT
shell->priv->ipod_source = RB_IPOD_SOURCE (rb_ipod_source_new (shell));
rb_shell_append_source (shell, RB_SOURCE (shell->priv->ipod_source), NULL);
@@ -1005,7 +1031,8 @@ rb_shell_constructor (GType type, guint
shell->priv->playlist_manager = rb_playlist_manager_new (shell,
RB_SOURCELIST (shell->priv->sourcelist),
shell->priv->library_source,
- shell->priv->iradio_source);
+ shell->priv->iradio_source,
+ shell->priv->podcast_source);
g_signal_connect_object (G_OBJECT (shell->priv->playlist_manager), "playlist_added",
G_CALLBACK (rb_shell_playlist_added_cb), shell, 0);
@@ -1723,6 +1750,7 @@ add_to_library_response_cb (GtkDialog *d
int response_id,
RBShell *shell)
{
+
char *current_dir = NULL;
GSList *uri_list = NULL, *uris = NULL;
@@ -1805,6 +1833,18 @@ rb_shell_cmd_new_station (GtkAction *act
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
+
+static void
+rb_shell_cmd_new_podcast (GtkAction *action,
+ RBShell *shell)
+{
+ GtkWidget *dialog;
+ rb_debug ("Got new podcast command");
+ dialog = rb_new_podcast_dialog_new (shell->priv->db);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+}
+
static void
rb_shell_cmd_extract_cd (GtkAction *action,
Index: sources/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/Makefile.am,v
retrieving revision 1.22
diff -u -3 -p -r1.22 Makefile.am
--- sources/Makefile.am 6 Sep 2005 07:15:34 -0000 1.22
+++ sources/Makefile.am 7 Sep 2005 04:19:50 -0000
@@ -13,6 +13,8 @@ libsourcesimpl_la_SOURCES = \
rb-library-source.h \
rb-iradio-source.c \
rb-iradio-source.h \
+ rb-podcast-source.c \
+ rb-podcast-source.h \
rb-playlist-source.c \
rb-playlist-source.h
@@ -29,8 +31,10 @@ INCLUDES = \
-I$(top_srcdir)/library \
-I$(top_srcdir)/player \
-I$(top_srcdir)/iradio \
+ -I$(top_srcdir)/podcast \
-I$(top_srcdir)/shell \
-I$(top_srcdir)/daapsharing \
+ -I$(top_srcdir)/metadata \
-DPIXMAP_DIR=\""$(datadir)/pixmaps"\" \
-DSHARE_DIR=\"$(pkgdatadir)\" \
-DDATADIR=\""$(datadir)"\" \
Index: widgets/rb-entry-view.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/widgets/rb-entry-view.c,v
retrieving revision 1.95
diff -u -3 -p -r1.95 rb-entry-view.c
--- widgets/rb-entry-view.c 29 Aug 2005 22:00:32 -0000 1.95
+++ widgets/rb-entry-view.c 7 Sep 2005 04:19:52 -0000
@@ -24,6 +24,7 @@
#include <gtk/gtktreeselection.h>
#include <gtk/gtkcellrenderertext.h>
+#include <gtk/gtkcellrendererprogress.h>
#include <gtk/gtkiconfactory.h>
#include <gtk/gtkstock.h>
#include <gtk/gtktooltips.h>
@@ -34,6 +35,8 @@
#include <string.h>
#include <stdlib.h>
#include <math.h>
+#define __USE_XOPEN
+#include <time.h>
#include "rb-tree-dnd.h"
#include "rb-entry-view.h"
@@ -841,6 +844,7 @@ rb_entry_view_string_sort_func (RhythmDB
{
const char *a_val;
const char *b_val;
+
gint ret;
a_val = rhythmdb_entry_get_string (a, data->propid);
@@ -849,6 +853,7 @@ rb_entry_view_string_sort_func (RhythmDB
ret = strcmp (a_val, b_val);
return ret;
+
}
static void
@@ -957,6 +962,36 @@ rb_entry_view_duration_cell_data_func (G
g_free (str);
}
+static void
+rb_entry_view_post_time_cell_data_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
+ GtkTreeModel *tree_model, GtkTreeIter * iter,
+ struct RBEntryViewCellDataFuncData *data)
+{
+ RhythmDBEntry *entry;
+ gulong i;
+ char *str;
+
+ entry = entry_from_tree_iter (data->view, iter);
+
+ i = rhythmdb_entry_get_ulong (entry, data->propid);
+ if (i == 0)
+ str = _("Unknown");
+ else {
+ struct tm *time_tm;
+ gint ret;
+ time_t time = (time_t) i;
+
+ str = g_new0 (char, 30);
+ time_tm = localtime(&time);
+ ret = strftime (str, 30, "%d/%m/%Y %H:%M", time_tm);
+ }
+
+ g_object_set (G_OBJECT (renderer), "text", str, NULL);
+
+ if (i != 0)
+ g_free (str);
+}
+
#if 0
static void
rb_entry_view_quality_cell_data_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
@@ -1006,6 +1041,47 @@ rb_entry_view_string_cell_data_func (Gtk
}
static void
+rb_entry_view_status_cell_data_func (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
+ GtkTreeModel *tree_model, GtkTreeIter *iter,
+ RBEntryView *view)
+
+{
+ RhythmDBEntry *entry;
+ guint value;
+
+ entry = entry_from_tree_iter (view, iter);
+
+ g_assert (entry->podcast != NULL);
+
+ switch (entry->podcast->status)
+ {
+ case 100:
+ g_object_set (G_OBJECT (renderer), "text", _("Completed"), NULL);
+ value = 100;
+ break;
+ case 101:
+ g_object_set (G_OBJECT (renderer), "text", _("Failed"), NULL);
+ value = 0;
+ break;
+ case 102:
+ g_object_set (G_OBJECT (renderer), "text", _("Waiting"), NULL);
+ value = 0;
+ break;
+ case 103:
+ g_object_set (G_OBJECT (renderer), "text", _("Paused"), NULL);
+ value = 0;
+ break;
+ default:
+ g_object_set (G_OBJECT (renderer), "text", NULL, NULL);
+ value = entry->podcast->status;
+ }
+
+ g_object_set (G_OBJECT (renderer), "value", value, NULL);
+
+
+}
+
+static void
rb_entry_view_sync_sorting (RBEntryView *view)
{
GtkTreeViewColumn *column;
@@ -1194,6 +1270,43 @@ rb_entry_view_append_column (RBEntryView
goto append;
}
+ if (coltype == RB_ENTRY_VIEW_COL_STATUS) {
+ gint width;
+
+ propid = RHYTHMDB_PROP_STATUS;
+
+ sort_data = g_new0 (struct RBEntryViewCellDataFuncData, 1);
+ sort_data->view = view;
+ sort_data->propid = propid;
+ sort_func = (GCompareDataFunc) rb_entry_view_double_ceiling_sort_func;
+
+ renderer = gtk_cell_renderer_progress_new();
+
+ gtk_tree_view_column_pack_start (column, renderer, TRUE);
+ gtk_tree_view_column_set_cell_data_func (column, renderer,
+ (GtkTreeCellDataFunc)
+ rb_entry_view_status_cell_data_func,
+ view,
+ NULL);
+
+ gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+ gtk_tree_view_column_set_clickable (column, TRUE);
+ gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &width, NULL);
+ gtk_tree_view_column_set_fixed_width (column, width * 5 + 5);
+// g_signal_connect_object (renderer,
+// "rated",
+// G_CALLBACK (rb_entry_view_rated_cb),
+// G_OBJECT (view),
+// 0);
+ real_sort_data = sort_data;
+ title = _("_Status");
+ key = "Status";
+
+
+ goto append;
+
+ }
+
cell_data = g_new0 (struct RBEntryViewCellDataFuncData, 1);
cell_data->view = view;
sort_data = g_new0 (struct RBEntryViewCellDataFuncData, 1);
@@ -1292,6 +1405,28 @@ rb_entry_view_append_column (RBEntryView
title = _("L_ast Played");
key = "LastPlayed";
break;
+ case RB_ENTRY_VIEW_COL_POST_TIME:
+ propid = RHYTHMDB_PROP_POST_TIME;
+ cell_data->propid = propid;
+ cell_data_func = (GtkTreeCellDataFunc) rb_entry_view_post_time_cell_data_func;
+ sort_data->propid = cell_data->propid;
+ sort_func = (GCompareDataFunc) rb_entry_view_ulong_sort_func;
+ title = _("_Date");
+ key = "Date";
+ break;
+
+ case RB_ENTRY_VIEW_COL_STATUS:
+#if 0
+ propid = RHYTHMDB_PROP_STATUS;
+ cell_data->propid = RHYTHMDB_PROP_STATUS;
+ cell_data_func = (gtktreecelldatafunc) rb_entry_view_status_cell_data_func;
+ ng_sort_func
+ sort_data->propid = RHYTHMDB_PROP_STATUS;
+ sort_func = (GCompareDataFunc) rb_entry_view_ulong_sort_func;
+ title = _("_Status");
+ key = "Status";
+ break;
+#endif
case RB_ENTRY_VIEW_COL_RATING:
default:
g_assert_not_reached ();
@@ -1300,6 +1435,7 @@ rb_entry_view_append_column (RBEntryView
}
renderer = gtk_cell_renderer_text_new ();
+
if (ellipsize) {
g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE);
@@ -1312,9 +1448,11 @@ rb_entry_view_append_column (RBEntryView
gtk_tree_view_column_set_resizable (column, TRUE);
append:
+
g_hash_table_insert (view->priv->propid_column_map, GINT_TO_POINTER (propid), column);
rb_entry_view_append_column_custom (view, column, title, key, sort_func,
real_sort_data ? real_sort_data : sort_data);
+
}
void
@@ -2048,7 +2186,8 @@ static void
set_column_not_visible (guint propid, GtkTreeViewColumn *column, gpointer unused)
{
/* title is always visible */
- if (propid == RHYTHMDB_PROP_TITLE)
+ if ((propid == RHYTHMDB_PROP_TITLE) ||
+ (propid == RHYTHMDB_PROP_POST_TIME))
return;
gtk_tree_view_column_set_visible (column, FALSE);
Index: widgets/rb-entry-view.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/widgets/rb-entry-view.h,v
retrieving revision 1.22
diff -u -3 -p -r1.22 rb-entry-view.h
--- widgets/rb-entry-view.h 7 Jul 2005 12:57:44 -0000 1.22
+++ widgets/rb-entry-view.h 7 Sep 2005 04:19:52 -0000
@@ -51,6 +51,8 @@ typedef enum {
RB_ENTRY_VIEW_COL_RATING,
RB_ENTRY_VIEW_COL_PLAY_COUNT,
RB_ENTRY_VIEW_COL_LAST_PLAYED,
+ RB_ENTRY_VIEW_COL_POST_TIME,
+ RB_ENTRY_VIEW_COL_STATUS
} RBEntryViewColumn;
typedef struct RBEntryViewPrivate RBEntryViewPrivate;
@@ -77,8 +79,10 @@ typedef struct
void (*changed) (RBEntryView *view);
void (*have_selection_changed) (RBEntryView *view, gboolean have_selection);
void (*sort_order_changed) (RBEntryView *view);
+ void (*status_changed) (RBEntryView *view, guint status);
void (*show_popup) (RBEntryView *view);
+
} RBEntryViewClass;
GType rb_entry_view_get_type (void);
Attachment:
podcast.tar.gz
Description: GNU Zip compressed data