commit a41171cded59326a90d6b3b7d5cb092878781a2c
Author: phantomjinx <[email protected]>
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2