diff --git a/src/Core/Package.vala b/src/Core/Package.vala index 89bb6c0c6..4e4766ded 100644 --- a/src/Core/Package.vala +++ b/src/Core/Package.vala @@ -894,6 +894,67 @@ public class AppCenterCore.Package : Object { return null; } + public GenericArray get_screenshots () { + bool has_matching_environment = false; + bool has_matching_style = false; + var desktop_environment = Environment.get_variable ("XDG_SESSION_DESKTOP"); + var prefer_dark_style = Gtk.Settings.get_default ().gtk_application_prefer_dark_theme; + var desktop_style = prefer_dark_style? AppStream.ColorSchemeKind.DARK.to_string () : AppStream.ColorSchemeKind.LIGHT.to_string (); + + component.sort_screenshots (desktop_environment, desktop_style.to_string (), false); + var all_screenshots = component.get_screenshots_all (); + + // This first pass is to gather if we have matching style and matching + // desktop environments, this is useful if we need to fall back to any + // screnshot if none of the conditions are fullfiled + foreach (unowned var screenshot in all_screenshots) { + var environment_id = screenshot.get_environment (); + if (environment_id != null) { + var environment_split = environment_id.split (":", 2); + var screenshot_environment = environment_split[0]; + var screenshot_style = environment_split[1] ?? AppStream.ColorSchemeKind.LIGHT.to_string (); + + if (screenshot_environment == desktop_environment) { + has_matching_environment = true; + } + + if (screenshot_style == desktop_style) { + has_matching_style = true; + } + } + } + + var screenshots = new GenericArray (); + + foreach (unowned var screenshot in all_screenshots) { + var environment_id = screenshot.get_environment (); + if (environment_id == null) { + screenshots.add (screenshot); + continue; + } + + var environment_split = environment_id.split (":", 2); + var screenshot_environment = environment_split[0]; + var screenshot_style = environment_split[1] ?? AppStream.ColorSchemeKind.LIGHT.to_string (); + + var same_environment = screenshot_environment == desktop_environment; + var same_style = screenshot_style == desktop_style; + + if (same_environment && same_style) { + screenshots.add (screenshot); + } else if (same_environment && !same_style && !has_matching_style) { + screenshots.add (screenshot); + } else if (!same_environment && same_style && !has_matching_environment) { + screenshots.add (screenshot); + } else if (!has_matching_environment && !has_matching_style) { + screenshots.add (screenshot); + continue; + } + } + + return screenshots; + } + public async uint64 get_download_size_including_deps () { uint64 size = 0; try { diff --git a/src/Views/AppInfoView.vala b/src/Views/AppInfoView.vala index 73cbc9f60..612b3fea7 100644 --- a/src/Views/AppInfoView.vala +++ b/src/Views/AppInfoView.vala @@ -516,70 +516,7 @@ public class AppCenter.Views.AppInfoView : Adw.NavigationPage { )); } - bool has_matching_environment = false; - bool has_matching_style = false; - var desktop_environment = Environment.get_variable ("XDG_SESSION_DESKTOP"); - var prefer_dark_style = Gtk.Settings.get_default ().gtk_application_prefer_dark_theme; - var desktop_style = prefer_dark_style - ? AppStream.ColorSchemeKind.DARK.to_string () - : AppStream.ColorSchemeKind.LIGHT.to_string (); - - package_component.sort_screenshots (desktop_environment, - desktop_style.to_string (), - false); - - var all_screenshots = package_component.get_screenshots_all (); - - // This first pass is to gather if we have matching style and matching - // desktop environments, this is useful if we need to fall back to any - // screnshot if none of the conditions are fullfiled - all_screenshots.foreach ((screenshot) => { - var environment_id = screenshot.get_environment (); - if (environment_id != null) { - var environment_split = environment_id.split (":", 2); - var screenshot_environment = environment_split[0]; - var screenshot_style = environment_split[1] - ?? AppStream.ColorSchemeKind.LIGHT.to_string (); - - if (screenshot_environment == desktop_environment) { - has_matching_environment = true; - } - - if (screenshot_style == desktop_style) { - has_matching_style = true; - } - } - }); - - screenshots = new GenericArray (); - - all_screenshots.foreach ((screenshot) => { - var environment_id = screenshot.get_environment (); - if (environment_id == null) { - screenshots.add (screenshot); - return; - } - - var environment_split = environment_id.split (":", 2); - var screenshot_environment = environment_split[0]; - var screenshot_style = environment_split[1] - ?? AppStream.ColorSchemeKind.LIGHT.to_string (); - - var same_environment = screenshot_environment == desktop_environment; - var same_style = screenshot_style == desktop_style; - - if (same_environment && same_style) { - screenshots.add (screenshot); - } else if (same_environment && !same_style && !has_matching_style) { - screenshots.add (screenshot); - } else if (!same_environment && same_style && !has_matching_environment) { - screenshots.add (screenshot); - } else if (!has_matching_environment && !has_matching_style) { - screenshots.add (screenshot); - return; - } - }); - + screenshots = package.get_screenshots (); if (screenshots.length > 0) { screenshot_carousel = new Adw.Carousel () { allow_mouse_drag = true,