summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorAndy Hertzfeld <andy@src.gnome.org>2000-05-17 01:27:40 +0000
committerAndy Hertzfeld <andy@src.gnome.org>2000-05-17 01:27:40 +0000
commit228495323536de8688e71d0fe231bb0c8f298927 (patch)
treec197b2f256aef9bb9a11d67e61b97c4aa5553739 /components
parent9995e383ba53bae24ef2e8d864301a74e38cec77 (diff)
downloadnautilus-228495323536de8688e71d0fe231bb0c8f298927.tar.gz
fixed bug #891, clicking on columns in the music view doesn't sort, by
fixed bug #891, clicking on columns in the music view doesn't sort, by adding the appropriate sorting stuff.
Diffstat (limited to 'components')
-rw-r--r--components/music/nautilus-music-view.c137
1 files changed, 116 insertions, 21 deletions
diff --git a/components/music/nautilus-music-view.c b/components/music/nautilus-music-view.c
index fb8ba7db5..63a134b91 100644
--- a/components/music/nautilus-music-view.c
+++ b/components/music/nautilus-music-view.c
@@ -54,7 +54,8 @@ struct _NautilusMusicViewDetails {
NautilusContentViewFrame *view_frame;
int background_connection;
-
+ int sort_mode;
+
GtkVBox *album_container;
GtkWidget *album_title;
GtkWidget *song_list;
@@ -62,10 +63,12 @@ struct _NautilusMusicViewDetails {
GtkWidget *control_box;
};
+
/* structure for holding song info */
typedef struct {
int track_number;
+ int track_time;
char *title;
char *artist;
char *album;
@@ -81,6 +84,15 @@ enum {
TARGET_GNOME_URI_LIST
};
+/* sort modes */
+
+enum {
+ SORT_BY_NUMBER,
+ SORT_BY_TITLE,
+ SORT_BY_ARTIST,
+ SORT_BY_TIME
+};
+
static GtkTargetEntry music_dnd_target_table[] = {
{ "text/uri-list", 0, TARGET_URI_LIST },
{ "application/x-color", 0, TARGET_COLOR },
@@ -100,6 +112,8 @@ static void nautilus_music_view_drag_data_received (GtkWidget
static void nautilus_music_view_initialize_class (NautilusMusicViewClass *klass);
static void nautilus_music_view_initialize (NautilusMusicView *view);
static void nautilus_music_view_destroy (GtkObject *object);
+static void nautilus_music_view_update_from_uri (NautilusMusicView *music_view,
+ const char *uri);
static void music_view_notify_location_change_callback (NautilusContentViewFrame *view,
Nautilus_NavigationInfo *navinfo,
NautilusMusicView *music_view);
@@ -108,6 +122,8 @@ static void selection_callback (GtkCList
int column,
GdkEventButton *event);
+static void click_column_callback(GtkCList * clist, gint column, NautilusMusicView *music_view);
+
NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusMusicView, nautilus_music_view, GTK_TYPE_EVENT_BOX)
static void
@@ -134,7 +150,8 @@ nautilus_music_view_initialize (NautilusMusicView *music_view)
music_view->details = g_new0 (NautilusMusicViewDetails, 1);
music_view->details->view_frame = nautilus_content_view_frame_new (GTK_WIDGET (music_view));
-
+ music_view->details->sort_mode = SORT_BY_NUMBER;
+
gtk_signal_connect (GTK_OBJECT (music_view->details->view_frame),
"notify_location_change",
GTK_SIGNAL_FUNC (music_view_notify_location_change_callback),
@@ -178,6 +195,10 @@ nautilus_music_view_initialize (NautilusMusicView *music_view)
gtk_widget_show (music_view->details->song_list);
gtk_widget_show (scrollwindow);
+ /* connect a signal to let us know when the column titles are clicked */
+ gtk_signal_connect(GTK_OBJECT(music_view->details->song_list), "click_column",
+ GTK_SIGNAL_FUNC(click_column_callback), music_view);
+
/* make an hbox to hold the optional cover and other controls */
music_view->details->control_box = gtk_hbox_new (FALSE, 4);
@@ -231,6 +252,15 @@ selection_callback(GtkCList * clist, int row, int column, GdkEventButton * event
}
}
+/* handle clicks in the songlist columns */
+
+static void click_column_callback (GtkCList * clist, gint column, NautilusMusicView *music_view)
+{
+ if (music_view->details->sort_mode == column)
+ return;
+ music_view->details->sort_mode = column;
+ nautilus_music_view_update_from_uri (music_view, music_view->details->uri);
+}
/* Component embedding support */
NautilusContentViewFrame *
@@ -325,6 +355,28 @@ read_id_tag (const char *song_path, SongInfo *song_info)
return TRUE;
}
+/* fetch_play_time takes the pathname to a file and returns the play time in seconds */
+/* FIXME bugzilla.eazel.com 723: assumes 128k bits/second. Must read header and factor in bitrate */
+static int
+fetch_play_time (const char *song_path_name)
+{
+ NautilusFile *file = nautilus_file_get (song_path_name);
+ GnomeVFSFileSize file_size = nautilus_file_get_size (file);
+ nautilus_file_unref(file);
+ return (file_size - 512) / 16384;
+}
+
+/* format_play_time takes the pathname to a file and returns the play time formated as mm:ss */
+static char *
+format_play_time (const char *song_path_name)
+{
+ int seconds = fetch_play_time(song_path_name);
+ int minutes = seconds / 60;
+ int remain_seconds = seconds - (60 * minutes);
+ char *result = g_strdup_printf ("%d:%02d", minutes, remain_seconds);
+ return result;
+}
+
/* allocate a return a song info record, from an mp3 tag if present, or from intrinsic info */
static SongInfo *
@@ -350,36 +402,54 @@ fetch_song_info (const char *song_path, int file_order)
info->track_number = file_order;
}
+ info->track_time = fetch_play_time(song_path);
return info;
}
-/* format_play_time takes the pathname to a file and returns the play time formated as mm:ss */
-/* FIXME bugzilla.eazel.com 723: assumes 128k bits/second. Must read header and factor in bitrate */
+/* sort comparison routines */
-static char *
-format_play_time (const char *song_path_name)
+static int
+sort_by_track_number (gconstpointer ap, gconstpointer bp)
{
- NautilusFile *file = nautilus_file_get (song_path_name);
- GnomeVFSFileSize file_size = nautilus_file_get_size (file);
- int seconds = (file_size - 512) / 16384;
- int minutes = seconds / 60;
- int remain_seconds = seconds - (60 * minutes);
- char *result = g_strdup_printf ("%d:%02d", minutes, remain_seconds);
- nautilus_file_unref (file);
- return result;
+ SongInfo *a, *b;
+
+ a = (SongInfo *) ap;
+ b = (SongInfo *) bp;
+
+ return (int) a->track_number - b->track_number;
+}
+
+static int
+sort_by_title (gconstpointer ap, gconstpointer bp)
+{
+ SongInfo *a, *b;
+
+ a = (SongInfo *) ap;
+ b = (SongInfo *) bp;
+
+ return strcmp(a->title, b->title);
}
-/* sort comparison routine - for now, just sort by track number */
+static int
+sort_by_artist (gconstpointer ap, gconstpointer bp)
+{
+ SongInfo *a, *b;
+
+ a = (SongInfo *) ap;
+ b = (SongInfo *) bp;
+
+ return strcmp(a->artist, b->artist);
+}
static int
-sort_by_track_number (gconstpointer ap, gconstpointer bp)
+sort_by_time (gconstpointer ap, gconstpointer bp)
{
SongInfo *a, *b;
a = (SongInfo *) ap;
b = (SongInfo *) bp;
- return (int) a->track_number - b->track_number;
+ return a->track_time - b->track_time;
}
/* utility routine to determine most common attribute in song list. The passed in boolean selects
@@ -470,6 +540,32 @@ nautilus_music_view_set_up_background (NautilusMusicView *music_view, const char
g_free (background_image);
}
+/* utility routine to sort the song list */
+static GList *
+sort_song_list(NautilusMusicView *music_view, GList* song_list)
+{
+ /* sort by the specified criteria */
+ switch (music_view->details->sort_mode) {
+ case SORT_BY_NUMBER:
+ song_list = g_list_sort (song_list, sort_by_track_number);
+ break;
+ case SORT_BY_TITLE:
+ song_list = g_list_sort (song_list, sort_by_title);
+ break;
+ case SORT_BY_ARTIST:
+ song_list = g_list_sort (song_list, sort_by_artist);
+ break;
+ case SORT_BY_TIME:
+ song_list = g_list_sort (song_list, sort_by_time);
+ break;
+ default:
+ g_warning("unknown sort mode");
+ break;
+ }
+
+ return song_list;
+}
+
/* here's where we do most of the real work of populating the view with info from the new uri */
/* FIXME bugzilla.eazel.com 722: need to use gnome-vfs for iterating the directory */
@@ -540,9 +636,8 @@ nautilus_music_view_update_from_uri (NautilusMusicView *music_view, const char *
closedir(dir);
}
- /* sort by track number */
- song_list = g_list_sort (song_list, sort_by_track_number);
-
+ song_list = sort_song_list(music_view, song_list);
+
/* populate the clist */
gtk_clist_clear (GTK_CLIST (music_view->details->song_list));
@@ -626,7 +721,7 @@ nautilus_music_view_update_from_uri (NautilusMusicView *music_view, const char *
info = (SongInfo *) p->data;
release_song_info(info);
}
-
+ g_list_free (song_list);
}