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">&lt;b&gt;Ascending&lt;/b&gt;</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">&lt;b&gt;Descending&lt;/b&gt;</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">&lt;b&gt;None&lt;/b&gt;</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">&lt;b&gt;Album 
Cover Sort Order&lt;/b&gt;</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

Reply via email to