private void AddToTable(Banshee.Gui.TrackEditor.StatisticsPage table, string label, object val) { if (val != null) { if (val is long) { table.AddItem(label, ((long)val).ToString("N0")); } else if (val is DateTime) { var dt = (DateTime)val; if (dt != DateTime.MinValue) { var local_dt = dt.ToLocalTime(); var str = dt.TimeOfDay == TimeSpan.Zero ? local_dt.ToShortDateString() : local_dt.ToString("g"); table.AddItem(label, str); } } else { table.AddItem(label, val.ToString()); } } }
private void BuildInfoBox() { var frame = new Hyena.Widgets.RoundedFrame(); var vbox = new VBox(); vbox.Spacing = 6; vbox.BorderWidth = 2; // Description var desc = new Hyena.Widgets.WrapLabel() { Markup = String.Format("{0}", GLib.Markup.EscapeText(Hyena.StringUtil.RemoveHtml(details.Description))) }; var desc_expander = CreateSection(Catalog.GetString("Description"), desc); // Details var table = new Banshee.Gui.TrackEditor.StatisticsPage() { ShadowType = ShadowType.None, BorderWidth = 0 }; table.NameRenderer.Scale = Pango.Scale.Medium; table.ValueRenderer.Scale = Pango.Scale.Medium; // Keep the table from needing to vertically scroll /*table.Child.SizeRequested += (o, a) => { * table.SetSizeRequest (a.Requisition.Width, a.Requisition.Height); * };*/ AddToTable(table, Catalog.GetString("Creator:"), details.Creator); AddToTable(table, Catalog.GetString("Venue:"), details.Venue); AddToTable(table, Catalog.GetString("Location:"), details.Coverage); if (details.DateCreated != DateTime.MinValue) { AddToTable(table, Catalog.GetString("Date:"), details.DateCreated); } else { AddToTable(table, Catalog.GetString("Year:"), details.Year); } AddToTable(table, Catalog.GetString("Publisher:"), details.Publisher); AddToTable(table, Catalog.GetString("Keywords:"), details.Subject); AddToTable(table, Catalog.GetString("License URL:"), details.LicenseUrl); AddToTable(table, Catalog.GetString("Language:"), details.Language); table.AddSeparator(); AddToTable(table, Catalog.GetString("Downloads, overall:"), details.DownloadsAllTime); AddToTable(table, Catalog.GetString("Downloads, past month:"), details.DownloadsLastMonth); AddToTable(table, Catalog.GetString("Downloads, past week:"), details.DownloadsLastWeek); table.AddSeparator(); AddToTable(table, Catalog.GetString("Added:"), details.DateAdded); AddToTable(table, Catalog.GetString("Added by:"), details.AddedBy); AddToTable(table, Catalog.GetString("Collections:"), details.Collections); AddToTable(table, Catalog.GetString("Source:"), details.Source); AddToTable(table, Catalog.GetString("Contributor:"), details.Contributor); AddToTable(table, Catalog.GetString("Recorded by:"), details.Taper); AddToTable(table, Catalog.GetString("Lineage:"), details.Lineage); AddToTable(table, Catalog.GetString("Transferred by:"), details.Transferer); var details_expander = CreateSection(Catalog.GetString("Details"), table); // Reviews Section reviews = null; if (details.NumReviews > 0) { string [] stars = { "\u2606\u2606\u2606\u2606\u2606", "\u2605\u2606\u2606\u2606\u2606", "\u2605\u2605\u2606\u2606\u2606", "\u2605\u2605\u2605\u2606\u2606", "\u2605\u2605\u2605\u2605\u2606", "\u2605\u2605\u2605\u2605\u2605" }; var reviews_box = new VBox() { Spacing = 12, BorderWidth = 0 }; reviews = CreateSection(Catalog.GetString("Reviews"), reviews_box); var avg_label = new Label(String.Format(Catalog.GetPluralString( // Translators: {0} is the number of reviewers, {1} is the average rating (not really relevant if there's only 1) "{0} reviewer", "{0} reviewers, avg {1}", details.NumReviews), details.NumReviews, stars[Math.Max(0, Math.Min(5, (int)Math.Round(details.AvgRating)))] )); avg_label.TooltipText = String.Format("{0:N2}", details.AvgRating); avg_label.Xalign = 1.0f; reviews.Header.Box.PackEnd(avg_label, false, false, 0); var sb = new System.Text.StringBuilder(); foreach (var review in details.Reviews) { //sb.Append ("<small>"); var review_txt = new Hyena.Widgets.WrapLabel(); var title = review.Title; if (title != null) { sb.AppendFormat("<b>{0}</b>\n", GLib.Markup.EscapeText(title)); } // Translators: {0} is the unicode-stars-rating, {1} is the name of a person who reviewed this item, and {1} is a date/time string sb.AppendFormat(Catalog.GetString("{0} by {1} on {2}"), stars[Math.Max(0, Math.Min(5, review.Stars))], GLib.Markup.EscapeText(review.Reviewer), GLib.Markup.EscapeText(review.DateReviewed.ToLocalTime().ToShortDateString()) ); var body = review.Body; if (body != null) { body = body.Replace("\r\n", "\n"); body = body.Replace("\n\n", "\n"); sb.Append("\n"); sb.Append(GLib.Markup.EscapeText(body)); } //sb.Append ("</small>"); review_txt.Markup = sb.ToString(); sb.Length = 0; reviews_box.PackStart(review_txt, false, false, 0); } } // Packing vbox.PackStart(desc_expander, true, true, 0); vbox.PackStart(details_expander, true, true, 0); if (reviews != null) { vbox.PackStart(reviews, true, true, 0); } string write_review_url = String.Format("http://www.archive.org/write-review.php?identifier={0}", item.Id); var write_review_button = new LinkButton(write_review_url, Catalog.GetString("Write your own review")); write_review_button.Clicked += (o, a) => Banshee.Web.Browser.Open(write_review_url); write_review_button.Xalign = 0f; vbox.PackStart(write_review_button, false, false, 0); var vbox2 = new VBox(); vbox2.PackStart(vbox, false, false, 0); var sw = new Gtk.ScrolledWindow() { ShadowType = ShadowType.None }; sw.AddWithViewport(vbox2); (sw.Child as Viewport).ShadowType = ShadowType.None; frame.Child = sw; frame.ShowAll(); sw.Child.OverrideBackgroundColor(StateFlags.Normal, StyleContext.GetBackgroundColor(StateFlags.Normal)); sw.Child.OverrideColor(StateFlags.Normal, StyleContext.GetColor(StateFlags.Normal)); StyleUpdated += delegate { sw.Child.OverrideBackgroundColor(StateFlags.Normal, StyleContext.GetBackgroundColor(StateFlags.Normal)); sw.Child.OverrideColor(StateFlags.Normal, StyleContext.GetColor(StateFlags.Normal)); }; PackStart(frame, true, true, 0); }