Movie window: display cast information
[cinaest] / src / movie-window.vala
index ecc4e9e..42409dd 100644 (file)
@@ -29,6 +29,7 @@ public class MovieWindow : StackableWindow {
        private PannableArea pannable;
        private Label title_label;
        private Label rating_label;
+       private Label cast_label;
        private Label plot;
        private bool portrait_mode;
 
@@ -43,29 +44,6 @@ public class MovieWindow : StackableWindow {
                // Poster
                image = new Image ();
 
-               if (movie.poster != null && movie.poster.large != null) {
-                       image.pixbuf = movie.poster.large;
-               } else {
-                       if (movie.poster != null && movie.poster.icon != null) {
-                               // FIXME
-                               image.pixbuf = movie.poster.icon.scale_simple (268, 424, Gdk.InterpType.BILINEAR);
-                       } else {
-                               // FIXME
-                               if (no_poster == null) try {
-                                       no_poster = new Gdk.Pixbuf.from_file ("/usr/share/icons/hicolor/64x64/hildon/imageviewer_no_pic.png");
-                               } catch (Error e) {
-                                       critical ("Missing general_video icon: %s\n", e.message);
-                               }
-                               image.pixbuf = no_poster;
-                       }
-                       try {
-                               poster_factory = MoviePoster.Factory.get_instance ();
-                               poster_factory.queue (movie, receive_poster);
-                       } catch (Error e) {
-                               warning ("Failed to queue poster request: %s\n", e.message);
-                       }
-               }
-
                title_label = new Label (title_label_markup (movie));
                title_label.wrap = true;
                title_label.use_markup = true;
@@ -79,12 +57,18 @@ public class MovieWindow : StackableWindow {
                rating_label.set_alignment (0.5f, 0.0f);
                header.pack_start (rating_label, false, false, MARGIN_DOUBLE);
 
+               cast_label = new Label (cast_label_markup (movie));
+               cast_label.wrap = true;
+               cast_label.use_markup = true;
+               cast_label.set_alignment (0.0f, 0.0f);
+
                plot = new Label (movie.get_plot ());
                plot.wrap = true;
                plot.set_alignment (0.0f, 0.0f);
 
                details = new VBox (false, MARGIN_DOUBLE);
                details.pack_start (header, false, false, 0);
+               details.pack_start (cast_label, false, false, 0);
                details.pack_start (plot, false, false, 0);
 
                var pannable = new PannableArea ();
@@ -104,7 +88,7 @@ public class MovieWindow : StackableWindow {
                } else {
                        hbox.pack_start (image, false, false, MARGIN_DOUBLE);
                        hbox.reorder_child (image, 0);
-                       plot.set_size_request (800 - 268 /* image */ - 3 * MARGIN_DOUBLE, -1);
+                       plot.set_size_request (800 - 288 /* image */ - 3 * MARGIN_DOUBLE, -1);
                        pannable.set_size_request (-1, 424);
                }
 
@@ -115,6 +99,29 @@ public class MovieWindow : StackableWindow {
                menu.movie_deleted.connect (() => { destroy (); });
                Gdk.Screen.get_default ().size_changed.connect (on_orientation_changed);
                movie.notify.connect (this.on_movie_changed);
+
+               if (movie.poster != null && movie.poster.large != null) {
+                       image.pixbuf = movie.poster.large;
+               } else {
+                       if (movie.poster != null && movie.poster.small != null) {
+                               // FIXME
+                               image.pixbuf = movie.poster.small.scale_simple (288, 400, Gdk.InterpType.HYPER);
+                       } else {
+                               // FIXME
+                               if (no_poster == null) try {
+                                       no_poster = new Gdk.Pixbuf.from_file ("/usr/share/icons/hicolor/64x64/hildon/general_no_thumbnail.png");
+                               } catch (Error e) {
+                                       critical ("Missing general_no_thumbnail icon: %s\n", e.message);
+                               }
+                               image.pixbuf = no_poster;
+                       }
+                       try {
+                               poster_factory = MoviePoster.Factory.get_instance ();
+                               poster_factory.queue (movie, 288, 400, false, receive_poster);
+                       } catch (Error e) {
+                               warning ("Failed to queue poster request: %s\n", e.message);
+                       }
+               }
        }
 
        private void update_title (Movie movie) {
@@ -148,6 +155,42 @@ public class MovieWindow : StackableWindow {
                        return "";
        }
 
+       private string cast_label_markup (Movie movie) {
+               List<Role> cast = movie.get_cast ();
+               var markup = new StringBuilder ();
+               Gdk.Color color;
+               this.ensure_style ();
+
+               if (this.style.lookup_color ("SecondaryTextColor", out color)) {
+                       foreach (Role role in cast) {
+                               if (markup.len > 0)
+                                       markup.append (",\n");
+                               markup.append_printf ("%s <span size=\"small\" fgcolor=\"%s\">(%s)</span>", display_name (role.actor_name), color.to_string (), role.character);
+                       }
+               } else {
+                       foreach (Role role in cast) {
+                               if (markup.len > 0)
+                                       markup.append (",\n");
+                               markup.append_printf ("%s <small>(%s)</small>", display_name (role.actor_name), role.character);
+                       }
+               }
+
+               return markup.str;
+       }
+
+       private string display_name (string name) {
+               string[] parts;
+               if (name.has_suffix (")"))
+                       parts = name.ndup (name.length - 4).split (", ");
+               else
+                       parts = name.split (", ");
+               if (parts.length == 2) {
+                       return parts[1] + " " + parts[0];
+               } else {
+                       return name;
+               }
+       }
+
        private void receive_poster (Gdk.Pixbuf pixbuf, Movie movie) {
                var poster = new Poster();
 
@@ -190,7 +233,7 @@ public class MovieWindow : StackableWindow {
                        hbox.pack_start (image, false, false, MARGIN_DOUBLE);
                        hbox.reorder_child (image, 0);
                        pannable.set_size_request (-1, 424);
-                       plot.set_size_request (800 - 268 /* image */ - 3 * MARGIN_DOUBLE, -1);
+                       plot.set_size_request (800 - 288 /* image */ - 3 * MARGIN_DOUBLE, -1);
                }
        }
 }