[sound-juicer] Show composer fields when needed



commit 05c42926a6318777a03c4587d70a4d8a745ba18c
Author: Phillip Wood <phillip wood dunelm org uk>
Date:   Sun Jun 3 17:58:31 2012 +0100

    Show composer fields when needed
    
    To avoid cluttering the UI with unecessary fields, only show composer
    fields when there is composer metadata or when the user sets the genre
    to one of 'classical', 'lieder', 'opera', 'chamber' or 'musical'.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=661646

 src/sj-main.c |  113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 111 insertions(+), 2 deletions(-)
---
diff --git a/src/sj-main.c b/src/sj-main.c
index 83b5c65..1ecd8e5 100644
--- a/src/sj-main.c
+++ b/src/sj-main.c
@@ -74,7 +74,9 @@ GConfClient *gconf_client;
 
 GtkWidget *main_window;
 static GtkWidget *message_area_eventbox;
-static GtkWidget *title_entry, *artist_entry, *duration_label, *genre_entry, *year_entry, *disc_number_entry;
+static GtkWidget *title_entry, *artist_entry, *composer_label, *composer_entry, *duration_label, *genre_entry, *year_entry, *disc_number_entry;
+static GtkWidget *entry_table; /* GtkTable containing composer_entry */
+static GtkTreeViewColumn *composer_column; /* Treeview column containing composers */
 static GtkWidget *track_listview, *extract_button, *play_button, *select_button;
 static GtkWidget *status_bar;
 GtkListStore *track_store;
@@ -107,6 +109,7 @@ static guint debug_flags = 0;
 #define INSTALLED_BUILDER DATADIR"/sound-juicer/sound-juicer.ui"
 #define SOURCE_MENU_BUILDER "../data/sound-juicer-menu.ui"
 #define INSTALLED_MENU_BUILDER DATADIR"/sound-juicer/sound-juicer-menu.ui"
+#define COMPOSER_ROW 2 /* Row of entry_table containing composer_entry */
 
 void
 sj_stock_init (void)
@@ -524,6 +527,92 @@ musicbrainz_submit_info_bar_response (GtkInfoBar *infobar,
   set_message_area (message_area_eventbox, NULL);
 }
 
+#define TABLE_ROW_SPACING 6 /* spacing of rows in entry_table */
+
+/*
+ * Show composer entry and composer column in track listview
+ */
+static void
+show_composer_fields (void)
+{
+  if (!gtk_widget_get_visible (GTK_WIDGET (composer_label))) {
+    gtk_table_set_row_spacing (GTK_TABLE (entry_table), COMPOSER_ROW,
+                               TABLE_ROW_SPACING);
+    gtk_widget_show (GTK_WIDGET (composer_entry));
+    gtk_widget_show (GTK_WIDGET (composer_label));
+    gtk_tree_view_column_set_visible (composer_column, TRUE);
+  }
+}
+
+#undef TABLE_ROW_SPACING
+
+/*
+ * Hide composer entry and composer column in track listview
+ */
+static void
+hide_composer_fields (void)
+{
+  if (gtk_widget_get_visible (GTK_WIDGET (composer_label))) {
+    gtk_table_set_row_spacing (GTK_TABLE (entry_table), COMPOSER_ROW, 0);
+    gtk_widget_hide (GTK_WIDGET (composer_entry));
+    gtk_widget_hide (GTK_WIDGET (composer_label));
+    gtk_tree_view_column_set_visible (composer_column, FALSE);
+  }
+}
+
+/*
+ * Determine if the composer fields should be shown based on genre,
+ * always show composer fields if they are non-empty.
+ */
+static void
+composer_show_hide (const char* genre)
+{
+  const static char *composer_genres[] = {
+    N_("Classical"), N_("Lieder"), N_("Opera"), N_("Chamber"), N_("Musical")
+  };  /* Genres for which the composer fields should be shown. */
+#define COUNT (G_N_ELEMENTS (composer_genres))
+  static char *genres[COUNT]; /* store localized genre names */
+  static gboolean init = FALSE; /* TRUE if localized genre names initalized*/
+  gboolean composer_show = FALSE;
+  int i;
+  GList* l;
+  char *folded_genre;
+
+  if (composer_column == NULL)
+    return;
+
+  if (!init) {
+    for (i = 0; i < COUNT; i++)
+      genres[i] = g_utf8_casefold (gettext (composer_genres[i]), -1);
+
+    init = TRUE;
+  }
+
+  composer_show = !sj_str_is_empty (current_album->composer);
+  for (l = current_album->tracks; l; l = g_list_next (l)) {
+    if (!sj_str_is_empty (((TrackDetails*) (l->data))->composer) == TRUE) {
+      composer_show = TRUE;
+      break;
+    }
+  }
+
+  folded_genre = g_utf8_casefold (genre, -1);
+  for (i = 0; i < COUNT; i++) {
+    if (g_str_equal (folded_genre, genres[i])) {
+      composer_show = TRUE;
+      break;
+    }
+  }
+  g_free (folded_genre);
+
+  if (composer_show)
+    show_composer_fields ();
+  else
+    hide_composer_fields ();
+  return;
+}
+#undef COUNT
+
 /**
  * Utility function to update the UI for a given Album
  */
@@ -537,6 +626,8 @@ static void update_ui_for_album (AlbumDetails *album)
   /* Really really make sure we don't have a playing title */
   sj_main_set_title (NULL);
 
+  hide_composer_fields ();
+
   if (album == NULL) {
     gtk_list_store_clear (track_store);
     gtk_entry_set_text (GTK_ENTRY (title_entry), "");
@@ -569,6 +660,12 @@ static void update_ui_for_album (AlbumDetails *album)
     g_signal_handlers_block_by_func (disc_number_entry, on_disc_number_edit_changed, NULL);
     gtk_entry_set_text (GTK_ENTRY (title_entry), album->title);
     gtk_entry_set_text (GTK_ENTRY (artist_entry), album->artist);
+    if (!sj_str_is_empty (album->composer)) {
+      gtk_entry_set_text (GTK_ENTRY (composer_entry), album->composer);
+      show_composer_fields ();
+    } else {
+      gtk_entry_set_text (GTK_ENTRY (composer_entry), "");
+    }
     if (album->disc_number) {
       gchar *disc_number = g_strdup_printf ("%d", album->disc_number);
       gtk_entry_set_text (GTK_ENTRY (disc_number_entry), disc_number);
@@ -615,7 +712,9 @@ static void update_ui_for_album (AlbumDetails *album)
                           COLUMN_DURATION, track->duration,
                           COLUMN_DETAILS, track,
                           -1);
-     total_no_of_tracks++;
+      if (!sj_str_is_empty (track->composer))
+        show_composer_fields ();
+      total_no_of_tracks++;
     }
     no_of_tracks_selected=total_no_of_tracks;
 
@@ -1514,6 +1613,8 @@ G_MODULE_EXPORT void on_genre_edit_changed(GtkEditable *widget, gpointer user_da
     g_free (current_album->genre);
   }
   current_album->genre = gtk_editable_get_chars (widget, 0, -1); /* get all the characters */
+  /* Toggle visibility of composer fields based on genre */
+  composer_show_hide (current_album->genre);
 }
 
 G_MODULE_EXPORT void on_year_edit_changed(GtkEditable *widget, gpointer user_data) {
@@ -1718,6 +1819,8 @@ startup_cb (GApplication *app, gpointer user_data)
   message_area_eventbox = GET_WIDGET ("message_area_eventbox");
   title_entry           = GET_WIDGET ("title_entry");
   artist_entry          = GET_WIDGET ("artist_entry");
+  composer_label        = GET_WIDGET ("composer_label");
+  composer_entry        = GET_WIDGET ("composer_entry");
   duration_label        = GET_WIDGET ("duration_label");
   genre_entry           = GET_WIDGET ("genre_entry");
   year_entry            = GET_WIDGET ("year_entry");
@@ -1727,6 +1830,7 @@ startup_cb (GApplication *app, gpointer user_data)
   play_button           = GET_WIDGET ("play_button");
   select_button         = GET_WIDGET ("select_button");
   status_bar            = GET_WIDGET ("status_bar");
+  entry_table           = GET_WIDGET ("entry_table");
 
   g_action_map_add_action_entries (G_ACTION_MAP (main_window),
                                    win_entries, G_N_ELEMENTS (win_entries),
@@ -1793,6 +1897,9 @@ startup_cb (GApplication *app, gpointer user_data)
 
   setup_genre_entry (genre_entry);
 
+  /* Remove row spacing from hidden row containing composer_entry */
+  gtk_table_set_row_spacing (GTK_TABLE (entry_table), COMPOSER_ROW, 0);
+
   track_store = gtk_list_store_new (COLUMN_TOTAL, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_POINTER);
   gtk_tree_view_set_model (GTK_TREE_VIEW (track_listview), GTK_TREE_MODEL (track_store));
   {
@@ -1852,6 +1959,8 @@ startup_cb (GApplication *app, gpointer user_data)
     gtk_tree_view_column_set_expand (column, TRUE);
     g_signal_connect (composer_renderer, "edited", G_CALLBACK (on_cell_edited), GUINT_TO_POINTER (COLUMN_COMPOSER));
     g_object_set (G_OBJECT (composer_renderer), "editable", TRUE, NULL);
+    gtk_tree_view_column_set_visible (column, FALSE);
+    composer_column = column;
     gtk_tree_view_append_column (GTK_TREE_VIEW (track_listview), column);
 
     renderer = gtk_cell_renderer_text_new ();



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]