commit a41171cded59326a90d6b3b7d5cb092878781a2c Author: phantomjinx <p.g.richard...@phantomjinx.co.uk> Date: Sun Dec 19 22:36:55 2010 +0000
Fix preservation of sorting preferences * misc.* * Include case sensitivity as a parameter in compare string functions * case sensitivity preference no longer assumed in guts of compare functions * case sensitivity no longer a general preference but different preferences allocated on plugin-by-plugin basis * cover_display * Add sorting radio buttons to preference window * Include callbacks for sorting and case sensitivity * sorting no longer based on st_sort preference but on unique coverart preference cad_sort * Try to reduce the number of redraws by blocking the signal hander on the slider bar * Move most of the redraw function calls to the external callbacks so that redrawing only occurs at the conclusion of the model changes. Not perfect but better than it was * playlist display * Add individual sort preference support using pm_sort and case sensitivity using pm_case_sensitive * sorttab display * Add individual sort preference support using st_sort and case sensitivity using st_case_sensitive * track display * support for case sensitivity using tm_case_sensitive libgtkpod/misc.c | 14 +- libgtkpod/misc.h | 6 +- plugins/cover_display/cover_display.glade | 176 ++++++++++++++++++++ plugins/cover_display/cover_display_preferences.c | 43 +++++ plugins/cover_display/display_coverart.c | 60 +++---- plugins/cover_display/display_coverart.h | 7 + plugins/cover_display/plugin.c | 3 + plugins/playlist_display/display_playlists.c | 7 +- plugins/playlist_display/playlist_display.glade | 6 +- .../playlist_display_preferences.c | 8 +- plugins/playlist_display/plugin.c | 13 +- plugins/sorttab_display/display_sorttabs.c | 23 +-- plugins/sorttab_display/display_sorttabs.h | 4 +- plugins/sorttab_display/plugin.c | 7 +- plugins/sorttab_display/sorttab_display.glade | 3 +- .../sorttab_display/sorttab_display_preferences.c | 8 +- plugins/track_display/display_tracks.c | 49 +++--- plugins/track_display/track_display.glade | 18 ++ plugins/track_display/track_display_preferences.c | 13 ++- 19 files changed, 360 insertions(+), 108 deletions(-) --- diff --git a/libgtkpod/misc.c b/libgtkpod/misc.c index 7638e32..3bdccee 100644 --- a/libgtkpod/misc.c +++ b/libgtkpod/misc.c @@ -373,10 +373,10 @@ gchar **build_argv_from_strings(const gchar *first_arg, ...) { /* compare @str1 and @str2 case-sensitively or case-insensitively * depending on prefs settings */ -gint compare_string(const gchar *str1, const gchar *str2) { +gint compare_string(const gchar *str1, const gchar *str2, const gint case_sensitive) { gint result; - gchar *sortkey1 = make_sortkey(str1); - gchar *sortkey2 = make_sortkey(str2); + gchar *sortkey1 = make_sortkey(str1, case_sensitive); + gchar *sortkey2 = make_sortkey(str2, case_sensitive); result = strcmp(sortkey1, sortkey2); @@ -401,8 +401,8 @@ static GList *csfk_list = NULL; * The caller is responsible of freeing the returned key with g_free. */ gchar * -make_sortkey(const gchar *name) { - if (prefs_get_int("case_sensitive")) { +make_sortkey(const gchar *name, const gint case_sensitive) { + if (case_sensitive) { return g_utf8_collate_key(name, -1); } else { @@ -493,8 +493,8 @@ fuzzy_skip_prefix(const gchar *name) { /* compare @str1 and @str2 case-sensitively or case-insensitively * depending on prefs settings, and ignoring certain initial articles * ("the", "le"/"la", etc) */ -gint compare_string_fuzzy(const gchar *str1, const gchar *str2) { - return compare_string(fuzzy_skip_prefix(str1), fuzzy_skip_prefix(str2)); +gint compare_string_fuzzy(const gchar *str1, const gchar *str2, const gint case_sensitive) { + return compare_string(fuzzy_skip_prefix(str1), fuzzy_skip_prefix(str2), case_sensitive); } /* compare @str1 and @str2 case-insensitively */ diff --git a/libgtkpod/misc.h b/libgtkpod/misc.h index a53a189..d671fe5 100644 --- a/libgtkpod/misc.h +++ b/libgtkpod/misc.h @@ -113,10 +113,10 @@ time_t time_string_to_totime (const gchar *str); gchar *get_filesize_as_string (double size); -gchar *make_sortkey (const gchar *name); -gint compare_string (const gchar *str1, const gchar *str2); +gchar *make_sortkey (const gchar *name, const gint case_sensitive); +gint compare_string (const gchar *str1, const gchar *str2, const gint case_sensitive); void compare_string_fuzzy_generate_keys (void); -gint compare_string_fuzzy (const gchar *str1, const gchar *str2); +gint compare_string_fuzzy (const gchar *str1, const gchar *str2, const gint case_sensitive); const gchar *fuzzy_skip_prefix (const gchar *sortkey); gint compare_string_case_insensitive (const gchar *str1, const gchar *str2); diff --git a/plugins/cover_display/cover_display.glade b/plugins/cover_display/cover_display.glade index 96d6672..c6a632e 100644 --- a/plugins/cover_display/cover_display.glade +++ b/plugins/cover_display/cover_display.glade @@ -247,6 +247,182 @@ <property name="position">0</property> </packing> </child> + <child> + <widget class="GtkFrame" id="frame4"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <widget class="GtkAlignment" id="alignment14"> + <property name="visible">True</property> + <property name="top_padding">6</property> + <property name="left_padding">12</property> + <child> + <widget class="GtkVBox" id="vbox2"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <property name="spacing">10</property> + <child> + <widget class="GtkHBox" id="hbox30"> + <property name="visible">True</property> + <child> + <widget class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="border_width">5</property> + <property name="n_rows">2</property> + <property name="n_columns">3</property> + <child> + <widget class="GtkLabel" id="label82"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes"><b>Ascending</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label85"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes"><b>Descending</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="cad_ascend"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="group">cad_none</property> + <signal name="toggled" handler="on_cad_ascend_toggled"/> + <child> + <widget class="GtkImage" id="image1928"> + <property name="visible">True</property> + <property name="stock">gtk-sort-ascending</property> + </widget> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options"></property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="cad_descend"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="group">cad_none</property> + <signal name="toggled" handler="on_cad_descend_toggled"/> + <child> + <widget class="GtkImage" id="image1929"> + <property name="visible">True</property> + <property name="stock">gtk-sort-descending</property> + </widget> + </child> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label86"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes"><b>None</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="cad_none"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_cad_none_toggled"/> + <child> + <widget class="GtkImage" id="image1930"> + <property name="visible">True</property> + <property name="stock">gtk-undo</property> + </widget> + </child> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options"></property> + </packing> + </child> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkCheckButton" id="cad_cfg_case_sensitive"> + <property name="label" translatable="yes">Case sensitive sorting</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="has_tooltip">True</property> + <property name="tooltip" translatable="yes">If checked, sorting will be case sensitive. Please note that case sensitive sorting will not work well with most charsets.</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_cad_sort_case_sensitive_toggled"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Album Cover Sort Order</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> </widget> </child> <child> diff --git a/plugins/cover_display/cover_display_preferences.c b/plugins/cover_display/cover_display_preferences.c index 637028a..8b8c302 100644 --- a/plugins/cover_display/cover_display_preferences.c +++ b/plugins/cover_display/cover_display_preferences.c @@ -30,8 +30,10 @@ #include <glade/glade.h> #include "libgtkpod/misc.h" #include "libgtkpod/prefs.h" +#include "libgtkpod/gp_private.h" #include "plugin.h" #include "display_coverart.h" +#include "cover_display_preferences.h" /* glade callback @@ -67,11 +69,33 @@ G_MODULE_EXPORT void on_coverart_dialog_fg_color_set (GtkColorButton *widget, gp coverart_display_update (FALSE); } +G_MODULE_EXPORT void on_cad_ascend_toggled(GtkToggleButton *togglebutton, gpointer user_data) { + if (gtk_toggle_button_get_active(togglebutton)) + coverart_display_sort(SORT_ASCENDING); +} + +G_MODULE_EXPORT void on_cad_descend_toggled(GtkToggleButton *togglebutton, gpointer user_data) { + if (gtk_toggle_button_get_active(togglebutton)) + coverart_display_sort(SORT_DESCENDING); +} + +G_MODULE_EXPORT void on_cad_none_toggled(GtkToggleButton *togglebutton, gpointer user_data) { + if (gtk_toggle_button_get_active(togglebutton)) + coverart_display_sort(SORT_NONE); +} + +G_MODULE_EXPORT void on_cad_sort_case_sensitive_toggled(GtkToggleButton *togglebutton, gpointer user_data) { + gboolean val = gtk_toggle_button_get_active(togglebutton); + prefs_set_int("cad_case_sensitive", val); + gtkpod_broadcast_preference_change("cad_case_sensitive", val); +} + GtkWidget *init_cover_preferences(gchar *glade_path) { GtkWidget *notebook; GladeXML *pref_xml; GtkWidget *coverart_bgcolorselect_button; GtkWidget *coverart_fgcolorselect_button; + GtkWidget *w; GdkColor *color; pref_xml = gtkpod_xml_new(glade_path, "cover_settings_notebook"); @@ -89,6 +113,25 @@ GtkWidget *init_cover_preferences(gchar *glade_path) { gtk_color_button_set_color (GTK_COLOR_BUTTON(coverart_fgcolorselect_button), color); g_free (color); + switch (prefs_get_int("cad_sort")) { + case SORT_ASCENDING: + w = gtkpod_xml_get_widget(pref_xml, "cad_ascend"); + break; + case SORT_DESCENDING: + w = gtkpod_xml_get_widget(pref_xml, "cad_descend"); + break; + default: + w = gtkpod_xml_get_widget(pref_xml, "cad_none"); + break; + } + + if (w) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE); + + if ((w = gtkpod_xml_get_widget(pref_xml, "cad_cfg_case_sensitive"))) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), prefs_get_int("cad_case_sensitive")); + } + glade_xml_signal_autoconnect(pref_xml); return notebook; } diff --git a/plugins/cover_display/display_coverart.c b/plugins/cover_display/display_coverart.c index 25ee945..97707e1 100644 --- a/plugins/cover_display/display_coverart.c +++ b/plugins/cover_display/display_coverart.c @@ -506,7 +506,7 @@ static void draw(cairo_t *cairo_context) { * */ void coverart_display_update(gboolean clear_track_list) { - gint i, sort; + gint i; GList *tracks; Track *track; Album_Item *album; @@ -529,13 +529,11 @@ void coverart_display_update(gboolean clear_track_list) { /* Find the selected playlist */ Playlist *pl = gtkpod_get_current_playlist(); if (!pl) { - redraw(FALSE); return; } tracks = pl->members; if (!tracks) { - redraw(FALSE); return; } @@ -581,14 +579,7 @@ void coverart_display_update(gboolean clear_track_list) { album_key_list = g_list_remove_all(album_key_list, NULL); /* Sort the tracks to the order set in the preference */ - sort = prefs_get_int("st_sort"); - if (sort != SORT_NONE) { - coverart_sort_images(sort); - } - else { - /* restore original order) */ - album_key_list = g_list_reverse(album_key_list); - } + coverart_sort_images(prefs_get_int("cad_sort")); /* Add 4 null tracks to the end of the track list for padding */ for (i = 0; i < IMG_MAIN; ++i) @@ -598,15 +589,21 @@ void coverart_display_update(gboolean clear_track_list) { for (i = 0; i < IMG_MAIN; ++i) album_key_list = g_list_prepend(album_key_list, NULL); - redraw(FALSE); - - set_slider_range(cdwidget->first_imgindex); + if (clear_track_list) + set_slider_range(0); + else + set_slider_range(cdwidget->first_imgindex); +} - /* - printf("######### ORIGINAL LINE UP ########\n"); - debug_albums (); - printf("######### END OF ORIGINAL LINE UP #######\n"); - */ +/** + * Sort the coverart display according to the given + * sort order. + * + */ +void coverart_display_sort(gint order) { + prefs_set_int("cad_sort", order); + coverart_display_update(TRUE); + gtkpod_broadcast_preference_change("cad_sort", order); } /** @@ -849,12 +846,6 @@ void coverart_track_changed(Track *track, gint signal) { /* Remove the track from the album item */ remove_track_from_album(album, track, trk_key, index, keypos); - /* Check if album is being displayed by checking the index */ - if (index >= cdwidget->first_imgindex && index <= (cdwidget->first_imgindex + IMG_TOTAL)) { - /* reset the covers and should reset to original position but without the index */ - redraw(FALSE); - } - /* Size of key list may have changed so reset the slider * to appropriate range and index. */ @@ -883,10 +874,10 @@ void coverart_track_changed(Track *track, gint signal) { /* Remove all null tracks before any sorting should take place */ album_key_list = g_list_remove_all(album_key_list, NULL); - if (prefs_get_int("st_sort") == SORT_ASCENDING) { + if (prefs_get_int("cad_sort") == SORT_ASCENDING) { album_key_list = g_list_insert_sorted(album_key_list, trk_key, (GCompareFunc) compare_album_keys); } - else if (prefs_get_int("st_sort") == SORT_DESCENDING) { + else if (prefs_get_int("cad_sort") == SORT_DESCENDING) { /* Already in descending order so reverse into ascending order */ album_key_list = g_list_reverse(album_key_list); /* Insert the track */ @@ -992,7 +983,6 @@ void coverart_track_changed(Track *track, gint signal) { * under the new album key */ remove_track_from_album(album, track, key, index, klist); - redraw(FALSE); /* Found the album and removed so no need to continue the loop */ break; } @@ -1388,6 +1378,8 @@ static GdkPixbuf *coverart_get_default_track_thumb(gint default_img_size) { * */ static void set_slider_range(gint index) { + g_signal_handler_block(G_OBJECT(cdwidget->cdslider), slide_signal_id); + gint slider_ubound = g_list_length(album_key_list) - IMG_TOTAL; if (slider_ubound < 1) { /* If only one album cover is displayed then slider_ubbound returns @@ -1410,6 +1402,8 @@ static void set_slider_range(gint index) { gtk_range_set_value(GTK_RANGE (cdwidget->cdslider), index); else gtk_range_set_value(GTK_RANGE (cdwidget->cdslider), 0); + + g_signal_handler_unblock(G_OBJECT(cdwidget->cdslider), slide_signal_id); } /** @@ -1452,8 +1446,6 @@ void coverart_select_cover(Track *track) { else if ((cdwidget->first_imgindex + IMG_TOTAL) >= displaytotal) cdwidget->first_imgindex = displaytotal - IMG_TOTAL; - redraw(FALSE); - /* Set the index value of the slider but avoid causing an infinite * cover selection by blocking the event */ @@ -1628,8 +1620,7 @@ static gint compare_album_keys(gchar *a, gchar *b) { if (b == NULL) return -1; - return g_ascii_strcasecmp(a, b); - + return compare_string(a, b, prefs_get_int("cad_case_sensitive")); } /** @@ -2125,6 +2116,7 @@ void coverart_display_track_removed_cb(GtkPodApp *app, gpointer tk, gpointer dat return; coverart_track_changed(old_track, COVERART_REMOVE_SIGNAL); + redraw(FALSE); } void coverart_display_set_tracks_cb(GtkPodApp *app, gpointer tks, gpointer data) { @@ -2134,6 +2126,8 @@ void coverart_display_set_tracks_cb(GtkPodApp *app, gpointer tks, gpointer data) if (tracks) coverart_select_cover(tracks->data); + + redraw(FALSE); } void coverart_display_track_updated_cb(GtkPodApp *app, gpointer tk, gpointer data) { @@ -2142,6 +2136,7 @@ void coverart_display_track_updated_cb(GtkPodApp *app, gpointer tk, gpointer dat return; coverart_track_changed(track, COVERART_CHANGE_SIGNAL); + redraw(FALSE); } void coverart_display_track_added_cb(GtkPodApp *app, gpointer tk, gpointer data) { @@ -2150,5 +2145,6 @@ void coverart_display_track_added_cb(GtkPodApp *app, gpointer tk, gpointer data) return; coverart_track_changed(track, COVERART_CREATE_SIGNAL); + redraw(FALSE); } diff --git a/plugins/cover_display/display_coverart.h b/plugins/cover_display/display_coverart.h index 80acfd0..fe2b750 100644 --- a/plugins/cover_display/display_coverart.h +++ b/plugins/cover_display/display_coverart.h @@ -202,6 +202,13 @@ GdkColor *coverart_get_foreground_display_color (); */ void destroy_coverart_display(); +/** + * Sort the coverart display according to the given + * sort order. + * + */ +void coverart_display_sort(gint order); + void coverart_display_update_cb(GtkPodApp *app, gpointer pl, gpointer data); void coverart_display_track_removed_cb(GtkPodApp *app, gpointer tk, gpointer data); void coverart_display_set_tracks_cb(GtkPodApp *app, gpointer tks, gpointer data); diff --git a/plugins/cover_display/plugin.c b/plugins/cover_display/plugin.c index e9fe3c5..c87548e 100644 --- a/plugins/cover_display/plugin.c +++ b/plugins/cover_display/plugin.c @@ -55,6 +55,9 @@ static void set_default_preferences() { if (!prefs_get_string_value("coverart_display_fg_color", NULL)) prefs_set_string("coverart_display_fg_color", "#FFFFFF"); + + if (! prefs_get_int_value("cad_case_sensitive", NULL)) + prefs_set_int("cad_case_sensitive", FALSE); } static gboolean activate_plugin(AnjutaPlugin *plugin) { diff --git a/plugins/playlist_display/display_playlists.c b/plugins/playlist_display/display_playlists.c index db026cd..a46dabd 100644 --- a/plugins/playlist_display/display_playlists.c +++ b/plugins/playlist_display/display_playlists.c @@ -1512,7 +1512,7 @@ gint pm_data_compare_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, g return (corr); /* compare the two entries */ - return compare_string(playlist1->name, playlist2->name); + return compare_string(playlist1->name, playlist2->name, prefs_get_int("pm_case_sensitive")); } /* Called when editable cell is being edited. Stores new data to @@ -2135,8 +2135,11 @@ void playlist_display_playlist_removed_cb(GtkPodApp *app, gpointer pl, gpointer void playlist_display_preference_changed_cb(GtkPodApp *app, gpointer pfname, gint32 value, gpointer data) { gchar *pref_name = pfname; - if (g_str_equal(pref_name, "pm_sort") || g_str_equal(pref_name, "case_sensitive")) { + if (g_str_equal(pref_name, "pm_sort")) pm_sort(value); + else if (g_str_equal(pref_name, "pm_case_sensitive")) { + gint val = prefs_get_int("pm_sort"); + pm_sort((GtkSortType) val); } } diff --git a/plugins/playlist_display/playlist_display.glade b/plugins/playlist_display/playlist_display.glade index 45936a5..f916840 100644 --- a/plugins/playlist_display/playlist_display.glade +++ b/plugins/playlist_display/playlist_display.glade @@ -153,7 +153,7 @@ </child> <child> <widget class="GtkCheckButton" id="pm_cfg_case_sensitive"> - <property name="label" translatable="yes">Case sensitive sorting (setting affects all sorting)</property> + <property name="label" translatable="yes">Case sensitive sorting</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -161,6 +161,7 @@ <property name="tooltip" translatable="yes">If checked, sorting will be case sensitive. Please note that case sensitive sorting will not work well with most charsets.</property> <property name="use_underline">True</property> <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_pm_sort_case_sensitive_toggled"/> </widget> <packing> <property name="expand">False</property> @@ -189,9 +190,6 @@ <property name="position">0</property> </packing> </child> - <child> - <placeholder/> - </child> </widget> </child> <child> diff --git a/plugins/playlist_display/playlist_display_preferences.c b/plugins/playlist_display/playlist_display_preferences.c index efe482a..3b1d03e 100644 --- a/plugins/playlist_display/playlist_display_preferences.c +++ b/plugins/playlist_display/playlist_display_preferences.c @@ -57,10 +57,10 @@ G_MODULE_EXPORT void on_pm_none_toggled(GtkToggleButton *togglebutton, gpointer set_pm_sort(SORT_NONE); } -G_MODULE_EXPORT void on_sort_case_sensitive_toggled(GtkToggleButton *togglebutton, gpointer user_data) { +G_MODULE_EXPORT void on_pm_sort_case_sensitive_toggled(GtkToggleButton *togglebutton, gpointer user_data) { gboolean val = gtk_toggle_button_get_active(togglebutton); - prefs_set_int("case_sensitive", val); - gtkpod_broadcast_preference_change("case_sensitive", val); + prefs_set_int("pm_case_sensitive", val); + gtkpod_broadcast_preference_change("pm_case_sensitive", val); } GtkWidget *init_playlist_display_preferences() { @@ -89,7 +89,7 @@ GtkWidget *init_playlist_display_preferences() { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE); if ((w = gtkpod_xml_get_widget(pref_xml, "pm_cfg_case_sensitive"))) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), prefs_get_int("case_sensitive")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), prefs_get_int("pm_case_sensitive")); } glade_xml_signal_autoconnect(pref_xml); diff --git a/plugins/playlist_display/plugin.c b/plugins/playlist_display/plugin.c index be5c3f3..79c7b8e 100644 --- a/plugins/playlist_display/plugin.c +++ b/plugins/playlist_display/plugin.c @@ -280,15 +280,22 @@ static GtkActionEntry playlist_actions[] = } }; +static void set_default_preferences() { + if (! prefs_get_int_value("pm_sort", NULL)) + prefs_set_int("pm_sort", SORT_NONE); + + if (! prefs_get_int_value("pm_case_sensitive", NULL)) + prefs_set_int("pm_case_sensitive", FALSE); +} + static gboolean activate_plugin(AnjutaPlugin *plugin) { AnjutaUI *ui; PlaylistDisplayPlugin *playlist_display_plugin; GtkActionGroup* action_group; GtkAction *new_playlist_action; - /* preferences */ - if (! prefs_get_int_value("pm_sort", NULL)) - prefs_set_int("pm_sort", SORT_NONE); + /* Set preferences */ + set_default_preferences(); /* Prepare the icons for the playlist */ register_icon_path(get_plugin_dir(), "playlist_display"); diff --git a/plugins/sorttab_display/display_sorttabs.c b/plugins/sorttab_display/display_sorttabs.c index 18c6a86..78fe47b 100644 --- a/plugins/sorttab_display/display_sorttabs.c +++ b/plugins/sorttab_display/display_sorttabs.c @@ -228,9 +228,10 @@ static gboolean on_st_treeview_key_release_event(GtkWidget *widget, GdkEventKey static void st_build_sortkeys(TabEntry *entry) { C_FREE (entry->name_sortkey); C_FREE (entry->name_fuzzy_sortkey); - entry->name_sortkey = make_sortkey(entry->name); + gint case_sensitive = prefs_get_int("st_case_sensitive"); + entry->name_sortkey = make_sortkey(entry->name, case_sensitive); if (entry->name != fuzzy_skip_prefix(entry->name)) { - entry->name_fuzzy_sortkey = make_sortkey(fuzzy_skip_prefix(entry->name)); + entry->name_fuzzy_sortkey = make_sortkey(fuzzy_skip_prefix(entry->name), case_sensitive); } } @@ -1782,12 +1783,13 @@ static void st_sort_inst(guint32 inst, GtkSortType order) { } } -void st_sort(GtkSortType order) { +void st_sort(gint order) { gint i; for (i = 0; i < prefs_get_int("sort_tab_num"); ++i) st_sort_inst(i, order); -// gtkpod_tracks_reordered(); + prefs_set_int("st_sort", order); + gtkpod_broadcast_preference_change("st_sort", order); } gint st_get_sorttab_page_number(int inst) { @@ -3375,16 +3377,3 @@ void sorttab_display_track_updated_cb(GtkPodApp *app, gpointer tk, gpointer data st_track_changed(track, FALSE, 0); } -void sorttab_display_preference_changed_cb(GtkPodApp *app, gpointer pfname, gint32 value, gpointer data) { - gchar *pref_name = pfname; - if (g_str_equal(pref_name, "st_sort")) { - st_sort(value); - } else if (g_str_equal(pref_name, "case_sensitive")) { - st_rebuild_sortkeys(); - } -} - -void sorttab_display_tracks_reordered_cb(GtkPodApp *app, gpointer data) { - st_adopt_order_in_playlist(); -} - diff --git a/plugins/sorttab_display/display_sorttabs.h b/plugins/sorttab_display/display_sorttabs.h index 8b2444e..bd74b61 100644 --- a/plugins/sorttab_display/display_sorttabs.h +++ b/plugins/sorttab_display/display_sorttabs.h @@ -135,7 +135,7 @@ TabEntry *st_get_selected_entry(gint inst); gint st_get_sort_tab_number(gchar *text); void st_delete_entry_head(gint inst, DeleteAction deleteaction); void st_stop_editing(gint inst, gboolean cancel); -void st_sort(GtkSortType order); +void st_sort(gint order); void st_remove_entry(TabEntry *entry, guint32 inst); void st_cleanup(void); @@ -144,7 +144,5 @@ void cal_open_calendar(gint inst, T_item item); void sorttab_display_select_playlist_cb(GtkPodApp *app, gpointer pl, gpointer data); void sorttab_display_track_removed_cb(GtkPodApp *app, gpointer tk, gint32 pos, gpointer data); void sorttab_display_track_updated_cb(GtkPodApp *app, gpointer tk, gpointer data); -void sorttab_display_preference_changed_cb(GtkPodApp *app, gpointer pfname, gint32 value, gpointer data); -void sorttab_display_tracks_reordered_cb(GtkPodApp *app, gpointer data); #endif /* __DISPLAY_SORTTAB_H__ */ diff --git a/plugins/sorttab_display/plugin.c b/plugins/sorttab_display/plugin.c index 6286868..d602bf6 100644 --- a/plugins/sorttab_display/plugin.c +++ b/plugins/sorttab_display/plugin.c @@ -130,12 +130,14 @@ static void set_default_preferences() { prefs_set_int_index("sp_autodisplay", i, FALSE); } - if (prefs_get_int_value("sort_tab_num", NULL)) + if (! prefs_get_int_value("sort_tab_num", NULL)) prefs_set_int("sort_tab_num", 2); - if (prefs_get_int_value("st_sort", NULL)) + if (! prefs_get_int_value("st_sort", NULL)) prefs_set_int("st_sort", SORT_NONE); + if (! prefs_get_int_value("st_case_sensitive", NULL)) + prefs_set_int("st_case_sensitive", FALSE); } static gboolean activate_sorttab_display_plugin(AnjutaPlugin *plugin) { @@ -182,7 +184,6 @@ static gboolean activate_sorttab_display_plugin(AnjutaPlugin *plugin) { g_signal_connect (gtkpod_app, SIGNAL_PLAYLIST_SELECTED, G_CALLBACK (sorttab_display_select_playlist_cb), NULL); g_signal_connect (gtkpod_app, SIGNAL_TRACK_REMOVED, G_CALLBACK (sorttab_display_track_removed_cb), NULL); g_signal_connect (gtkpod_app, SIGNAL_TRACK_UPDATED, G_CALLBACK (sorttab_display_track_updated_cb), NULL); - g_signal_connect (gtkpod_app, SIGNAL_PREFERENCE_CHANGE, G_CALLBACK (sorttab_display_preference_changed_cb), NULL); anjuta_shell_add_widget(plugin->shell, sorttab_display_plugin->st_paned, "SorttabDisplayPlugin", _(" Track Filter"), NULL, ANJUTA_SHELL_PLACEMENT_CENTER, NULL); return TRUE; /* FALSE if activation failed */ diff --git a/plugins/sorttab_display/sorttab_display.glade b/plugins/sorttab_display/sorttab_display.glade index 2fdb882..54fea42 100644 --- a/plugins/sorttab_display/sorttab_display.glade +++ b/plugins/sorttab_display/sorttab_display.glade @@ -2398,7 +2398,7 @@ Added </child> <child> <widget class="GtkCheckButton" id="st_cfg_case_sensitive"> - <property name="label" translatable="yes">Case sensitive sorting (setting affects all sorting)</property> + <property name="label" translatable="yes">Case sensitive sorting</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -2406,6 +2406,7 @@ Added <property name="tooltip" translatable="yes">If checked, sorting will be case sensitive. Please note that case sensitive sorting will not work well with most charsets.</property> <property name="use_underline">True</property> <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_st_sort_case_sensitive_toggled"/> </widget> <packing> <property name="expand">False</property> diff --git a/plugins/sorttab_display/sorttab_display_preferences.c b/plugins/sorttab_display/sorttab_display_preferences.c index 23013ac..c30a5b8 100644 --- a/plugins/sorttab_display/sorttab_display_preferences.c +++ b/plugins/sorttab_display/sorttab_display_preferences.c @@ -72,8 +72,8 @@ G_MODULE_EXPORT void on_st_none_toggled(GtkToggleButton *togglebutton, gpointer G_MODULE_EXPORT void on_st_sort_case_sensitive_toggled(GtkToggleButton *togglebutton, gpointer user_data) { gboolean val = gtk_toggle_button_get_active(togglebutton); - prefs_set_int("case_sensitive", val); - gtkpod_broadcast_preference_change("case_sensitive", val); + prefs_set_int("st_case_sensitive", val); + gtkpod_broadcast_preference_change("st_case_sensitive", val); } GtkWidget *init_sorttab_preferences() { @@ -87,7 +87,7 @@ GtkWidget *init_sorttab_preferences() { g_object_ref(notebook); g_free(glade_path); - switch (prefs_get_int("pm_sort")) { + switch (prefs_get_int("st_sort")) { case SORT_ASCENDING: w = gtkpod_xml_get_widget(pref_xml, "st_ascend"); break; @@ -103,7 +103,7 @@ GtkWidget *init_sorttab_preferences() { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE); if ((w = gtkpod_xml_get_widget(pref_xml, "st_cfg_case_sensitive"))) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), prefs_get_int("case_sensitive")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), prefs_get_int("st_case_sensitive")); } glade_xml_signal_autoconnect(pref_xml); diff --git a/plugins/track_display/display_tracks.c b/plugins/track_display/display_tracks.c index 452ff6e..625527a 100644 --- a/plugins/track_display/display_tracks.c +++ b/plugins/track_display/display_tracks.c @@ -76,7 +76,7 @@ static GtkTreeViewColumn *tm_columns[TM_NUM_COLUMNS]; static const gint READOUT_COL = 0; /* compare function to be used for string comparisons */ -static gint (*string_compare_func)(const gchar *str1, const gchar *str2) = compare_string; +static gint (*string_compare_func)(const gchar *str1, const gchar *str2, const gint case_sensitive) = compare_string; static GtkTreeViewColumn *tm_add_column(TM_item tm_item, gint position); static TM_item tm_lookup_col_id(GtkTreeViewColumn *column); @@ -1295,75 +1295,76 @@ static gint tm_data_compare(Track *track1, Track *track2, TM_item tm_item) { /* string_compare_func is set to either compare_string_fuzzy or compare_string in tm_sort_column_changed() which is called once before the comparing begins. */ + gint case_sensitive = prefs_get_int("tm_case_sensitive"); switch (tm_item) { case TM_COLUMN_TITLE: - cmp = string_compare_func(track1->title, track2->title); + cmp = string_compare_func(track1->title, track2->title, case_sensitive); break; case TM_COLUMN_ALBUM: - cmp = string_compare_func(track1->album, track2->album); + cmp = string_compare_func(track1->album, track2->album, case_sensitive); break; case TM_COLUMN_ALBUMARTIST: - cmp = string_compare_func(track1->albumartist, track2->albumartist); + cmp = string_compare_func(track1->albumartist, track2->albumartist, case_sensitive); break; case TM_COLUMN_GENRE: - cmp = string_compare_func(track1->genre, track2->genre); + cmp = string_compare_func(track1->genre, track2->genre, case_sensitive); break; case TM_COLUMN_COMPOSER: - cmp = string_compare_func(track1->composer, track2->composer); + cmp = string_compare_func(track1->composer, track2->composer, case_sensitive); break; case TM_COLUMN_COMMENT: - cmp = string_compare_func(track1->comment, track2->comment); + cmp = string_compare_func(track1->comment, track2->comment, case_sensitive); break; case TM_COLUMN_FILETYPE: - cmp = string_compare_func(track1->filetype, track2->filetype); + cmp = string_compare_func(track1->filetype, track2->filetype, case_sensitive); break; case TM_COLUMN_GROUPING: - cmp = string_compare_func(track1->grouping, track2->grouping); + cmp = string_compare_func(track1->grouping, track2->grouping, case_sensitive); break; case TM_COLUMN_ARTIST: - cmp = string_compare_func(track1->artist, track2->artist); + cmp = string_compare_func(track1->artist, track2->artist, case_sensitive); break; case TM_COLUMN_CATEGORY: - cmp = string_compare_func(track1->category, track2->category); + cmp = string_compare_func(track1->category, track2->category, case_sensitive); break; case TM_COLUMN_DESCRIPTION: - cmp = string_compare_func(track1->description, track2->description); + cmp = string_compare_func(track1->description, track2->description, case_sensitive); break; case TM_COLUMN_PODCASTURL: - cmp = string_compare_func(track1->podcasturl, track2->podcasturl); + cmp = string_compare_func(track1->podcasturl, track2->podcasturl, case_sensitive); break; case TM_COLUMN_PODCASTRSS: - cmp = string_compare_func(track1->podcastrss, track2->podcastrss); + cmp = string_compare_func(track1->podcastrss, track2->podcastrss, case_sensitive); break; case TM_COLUMN_SUBTITLE: - cmp = string_compare_func(track1->subtitle, track2->subtitle); + cmp = string_compare_func(track1->subtitle, track2->subtitle, case_sensitive); break; case TM_COLUMN_TV_SHOW: - cmp = string_compare_func(track1->tvshow, track2->tvshow); + cmp = string_compare_func(track1->tvshow, track2->tvshow, case_sensitive); break; case TM_COLUMN_TV_EPISODE: - cmp = string_compare_func(track1->tvepisode, track2->tvepisode); + cmp = string_compare_func(track1->tvepisode, track2->tvepisode, case_sensitive); break; case TM_COLUMN_TV_NETWORK: - cmp = string_compare_func(track1->tvnetwork, track2->tvnetwork); + cmp = string_compare_func(track1->tvnetwork, track2->tvnetwork, case_sensitive); break; case TM_COLUMN_SORT_TITLE: - cmp = string_compare_func(track1->sort_title, track2->sort_title); + cmp = string_compare_func(track1->sort_title, track2->sort_title, case_sensitive); break; case TM_COLUMN_SORT_ALBUM: - cmp = string_compare_func(track1->sort_album, track2->sort_album); + cmp = string_compare_func(track1->sort_album, track2->sort_album, case_sensitive); break; case TM_COLUMN_SORT_ARTIST: - cmp = string_compare_func(track1->sort_artist, track2->sort_artist); + cmp = string_compare_func(track1->sort_artist, track2->sort_artist, case_sensitive); break; case TM_COLUMN_SORT_ALBUMARTIST: - cmp = string_compare_func(track1->sort_albumartist, track2->sort_albumartist); + cmp = string_compare_func(track1->sort_albumartist, track2->sort_albumartist, case_sensitive); break; case TM_COLUMN_SORT_COMPOSER: - cmp = string_compare_func(track1->sort_composer, track2->sort_composer); + cmp = string_compare_func(track1->sort_composer, track2->sort_composer, case_sensitive); break; case TM_COLUMN_SORT_TVSHOW: - cmp = string_compare_func(track1->sort_tvshow, track2->sort_tvshow); + cmp = string_compare_func(track1->sort_tvshow, track2->sort_tvshow, case_sensitive); break; case TM_COLUMN_TRACK_NR: cmp = track1->tracks - track2->tracks; diff --git a/plugins/track_display/track_display.glade b/plugins/track_display/track_display.glade index ea7edf8..7312d58 100644 --- a/plugins/track_display/track_display.glade +++ b/plugins/track_display/track_display.glade @@ -290,6 +290,24 @@ <property name="position">1</property> </packing> </child> + <child> + <widget class="GtkCheckButton" id="tm_cfg_case_sensitive"> + <property name="label" translatable="yes">Case sensitive sorting</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="has_tooltip">True</property> + <property name="tooltip" translatable="yes">If checked, sorting will be case sensitive. Please note that case sensitive sorting will not work well with most charsets.</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_tm_sort_case_sensitive_toggled"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> </widget> </child> </widget> diff --git a/plugins/track_display/track_display_preferences.c b/plugins/track_display/track_display_preferences.c index 4dee200..19cc9b7 100644 --- a/plugins/track_display/track_display_preferences.c +++ b/plugins/track_display/track_display_preferences.c @@ -387,9 +387,16 @@ static void populate_track_cmd_combo(GtkComboBox *combo) { NULL); } +G_MODULE_EXPORT void on_tm_sort_case_sensitive_toggled(GtkToggleButton *togglebutton, gpointer user_data) { + gboolean val = gtk_toggle_button_get_active(togglebutton); + prefs_set_int("tm_case_sensitive", val); + gtkpod_broadcast_preference_change("tm_case_sensitive", val); +} + GtkWidget *init_track_display_preferences() { GtkComboBox *cmd_combo; gint i = 0; + GtkWidget *w; gchar *glade_path = g_build_filename(get_glade_dir(), "track_display.glade", NULL); preference_xml = gtkpod_xml_new(glade_path, "track_settings_notebook"); @@ -406,7 +413,7 @@ GtkWidget *init_track_display_preferences() { /* label the ignore-field checkbox-labels */ for (i = 0; sort_ign_fields[i] != -1; ++i) { gchar *buf = g_strdup_printf("sort_ign_field_%d", sort_ign_fields[i]); - GtkWidget *w = gtkpod_xml_get_widget(preference_xml, buf); + w = gtkpod_xml_get_widget(preference_xml, buf); g_return_val_if_fail (w, NULL); gtk_button_set_label(GTK_BUTTON (w), gettext (get_t_string (sort_ign_fields[i]))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (w), prefs_get_int(buf)); @@ -416,6 +423,10 @@ GtkWidget *init_track_display_preferences() { populate_track_cmd_combo(cmd_combo); + if ((w = gtkpod_xml_get_widget(preference_xml, "tm_cfg_case_sensitive"))) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), prefs_get_int("tm_case_sensitive")); + } + glade_xml_signal_autoconnect(preference_xml); return notebook; ------------------------------------------------------------------------------ Lotusphere 2011 Register now for Lotusphere 2011 and learn how to connect the dots, take your collaborative environment to the next level, and enter the era of Social Business. http://p.sf.net/sfu/lotusphere-d2d _______________________________________________ gtkpod-cvs2 mailing list gtkpod-cvs2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2