diff --git a/data/styles/AppInfoView.scss b/data/styles/AppInfoView.scss index 4704868e7..771a712f8 100644 --- a/data/styles/AppInfoView.scss +++ b/data/styles/AppInfoView.scss @@ -17,8 +17,12 @@ appinfoview { } } - combobox { + dropdown { margin-top: rem(12px); + + button { + background-color: #{'@bg_color'}; + } } button.text-button, diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 54be61b2b..25b7bfabb 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -366,7 +366,6 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { } if (pk_child != null) { - pk_child.view_entered (); leaflet.visible_child = pk_child; return; } diff --git a/src/Views/AppInfoView.vala b/src/Views/AppInfoView.vala index b8c2329ec..8a35985c9 100644 --- a/src/Views/AppInfoView.vala +++ b/src/Views/AppInfoView.vala @@ -28,12 +28,12 @@ public class AppCenter.Views.AppInfoView : AppCenter.AbstractAppContainer { GenericArray screenshots; + private GLib.ListStore origin_liststore; private Granite.HeaderLabel whats_new_label; private Gtk.CssProvider accent_provider; - private Gtk.ComboBox origin_combo; + private Gtk.DropDown origin_dropdown; private Gtk.Label app_subtitle; private Gtk.ListBox extension_box; - private Gtk.ListStore origin_liststore; private Gtk.Overlay screenshot_overlay; private Gtk.Revealer origin_combo_revealer; private Adw.Carousel release_carousel; @@ -144,21 +144,24 @@ public class AppCenter.Views.AppInfoView : AppCenter.AbstractAppContainer { app_subtitle.add_css_class (Granite.STYLE_CLASS_H3_LABEL); app_subtitle.add_css_class (Granite.STYLE_CLASS_DIM_LABEL); - origin_liststore = new Gtk.ListStore (2, typeof (AppCenterCore.Package), typeof (string)); - origin_combo = new Gtk.ComboBox.with_model (origin_liststore) { - halign = Gtk.Align.START, - valign = Gtk.Align.CENTER + origin_liststore = new GLib.ListStore (typeof (AppCenterCore.Package)); + + var list_factory = new Gtk.SignalListItemFactory (); + list_factory.setup.connect (origin_setup_factory); + list_factory.bind.connect (origin_bind_factory); + + origin_dropdown = new Gtk.DropDown (origin_liststore, null) { + halign = START, + valign = CENTER, + factory = list_factory }; origin_combo_revealer = new Gtk.Revealer () { - child = origin_combo, - transition_type = Gtk.RevealerTransitionType.SLIDE_DOWN + child = origin_dropdown, + overflow = VISIBLE, + transition_type = SLIDE_DOWN }; - var renderer = new Gtk.CellRendererText (); - origin_combo.pack_start (renderer, true); - origin_combo.add_attribute (renderer, "text", 1); - var uninstall_button = new Gtk.Button.from_icon_name ("edit-delete-symbolic") { tooltip_text = _("Uninstall"), margin_end = 12 @@ -753,18 +756,14 @@ public class AppCenter.Views.AppInfoView : AppCenter.AbstractAppContainer { links_flowbox.append (share_button); } #endif - view_entered (); set_up_package (); if (oars_flowbox.get_first_child () != null) { oars_flowbox_revealer.reveal_child = true; } - origin_combo.changed.connect (() => { - Gtk.TreeIter iter; - AppCenterCore.Package selected_origin_package; - origin_combo.get_active_iter (out iter); - origin_liststore.@get (iter, 0, out selected_origin_package); + origin_dropdown.notify["selected-item"].connect (() => { + var selected_origin_package = (AppCenterCore.Package) origin_dropdown.selected_item; if (selected_origin_package != null && selected_origin_package != package) { show_other_package (selected_origin_package, false, false); } @@ -932,29 +931,14 @@ public class AppCenter.Views.AppInfoView : AppCenter.AbstractAppContainer { } } - public void view_entered () { - Gtk.TreeIter iter; - AppCenterCore.Package origin_package; - if (origin_liststore.get_iter_first (out iter)) { - do { - origin_liststore.@get (iter, 0, out origin_package); - if (origin_package == package) { - origin_combo.set_active_iter (iter); - } - } while (origin_liststore.iter_next (ref iter)); - } - } - private void load_more_content () { var cache = AppCenterCore.Client.get_default ().screenshot_cache; - Gtk.TreeIter iter; uint count = 0; foreach (var origin_package in package.origin_packages) { - origin_liststore.append (out iter); - origin_liststore.set (iter, 0, origin_package, 1, origin_package.origin_description); + origin_liststore.append (origin_package); if (origin_package == package) { - origin_combo.set_active_iter (iter); + origin_dropdown.selected = count; } count++; @@ -1219,6 +1203,24 @@ public class AppCenter.Views.AppInfoView : AppCenter.AbstractAppContainer { }); } + private void origin_setup_factory (Object object) { + var title = new Gtk.Label ("") { + xalign = 0 + }; + + var list_item = (Gtk.ListItem) object; + list_item.child = title; + } + + private void origin_bind_factory (Object object) { + var list_item = object as Gtk.ListItem; + + var package = (AppCenterCore.Package) list_item.get_item (); + + var title = (Gtk.Label) list_item.child; + title.label = package.origin_description; + } + class UrlButton : Gtk.Box { public UrlButton (string label, string? uri, string icon_name) { add_css_class (Granite.STYLE_CLASS_DIM_LABEL);