Changes
7 changed files (+164/-19)
-
-
@@ -68,5 +68,10 @@ SPDX-License-Identifier: Apache-2.0<summary>Hide window titlebar</summary> <description>Hide window control buttons and title. Menu button and sidebar button remain.</description> </key> <key name="startup-category" type="i"> <default>0</default> <summary>Default category</summary> <description>Category ID to be selected on startup.</description> </key> </schema> </schemalist>
-
-
-
@@ -55,6 +55,42 @@ namespace PlacGtkAdwaita {} private void on_preferences() { var startup_category_factory = new Gtk.SignalListItemFactory(); startup_category_factory.setup.connect(CategoryComboRowFactory.setup); startup_category_factory.bind.connect(CategoryComboRowFactory.bind); var startup_category_model = new Adw.EnumListModel(typeof (Roon.Browse.Hierarchy)); var startup_category = new Adw.ComboRow(); startup_category.model = startup_category_model; startup_category.factory = startup_category_factory; startup_category.title = "Default category"; startup_category.subtitle = "Category to be selected on startup."; settings.settings.bind_with_mapping(Settings.STARTUP_CATEGORY, startup_category, "selected", DEFAULT, (to, from, user_data) => { var model = (Adw.EnumListModel) user_data; var hierarchy = Roon.Browse.Hierarchy.from_int(from.get_int32()); to.set_uint(model.find_position(hierarchy)); return true; }, (from, variant_type, user_data) => { var model = (Adw.EnumListModel) user_data; var item = (Adw.EnumListItem) model.get_item(from.get_uint()); if (item == null) { // Vala's type definition wrongly defines return type signature of // "SettingsBindSetMappingShared" as non-null, despite it being nullable and // even documentation saying "return null in case of an error." // This cast suppress compiler warning. return (Variant) null; } var hierarchy = Roon.Browse.Hierarchy.from_int(item.value); return new Variant("i", hierarchy); }, startup_category_model, null); var general = new Adw.PreferencesGroup(); general.add(startup_category); general.title = "General"; var disable_csd = new Adw.SwitchRow(); settings.settings.bind(Settings.DISABLE_CSD, disable_csd, "active", DEFAULT); disable_csd.title = "Hide window titlebar";
-
@@ -131,6 +167,7 @@ namespace PlacGtkAdwaita {discovery.title = "Server Discovery"; var page = new Adw.PreferencesPage(); page.add(general); page.add(appearance); page.add(keyboard_navigation); page.add(discovery);
-
@@ -160,6 +197,22 @@ namespace PlacGtkAdwaita {} } class CategoryComboRowFactory { public static void setup(Gtk.ListItemFactory factory, Object object) { var list_item = (Gtk.ListItem) object; list_item.child = new Gtk.Label(""); } public static void bind(Gtk.ListItemFactory factory, Object object) { var list_item = (Gtk.ListItem) object; var item = (Adw.EnumListItem) list_item.item; var hierarchy = Roon.Browse.Hierarchy.from_int(item.value); var label = (Gtk.Label) list_item.child; label.label = hierarchy.to_display_string(); } } [GtkTemplate(ui = "/jp/pocka/plac/gtk-adwaita/ui/server-list-network-error-dialog.ui")] class ServerListNetworkErrorDialog : GenericErrorDialog { public ServerListNetworkErrorDialog(string details) {
-
-
-
@@ -18,13 +18,13 @@ namespace Roon {namespace Browse { public enum Hierarchy { BROWSE = 0, PLAYLISTS = 1, SETTINGS = 2, INTERNET_RADIO = 3, ALBUMS = 4, PLAYLISTS = 1, ARTISTS = 5, GENRES = 6, COMPOSERS = 7, INTERNET_RADIO = 3, SETTINGS = 2, SEARCH = 8; public string to_id_string() {
-
@@ -52,6 +52,81 @@ namespace Roon {} } public string to_mnemonic_string() { switch (this) { case BROWSE: return "_Explorer"; case PLAYLISTS: return "_Playlists"; case SETTINGS: return "Se_ttings"; case INTERNET_RADIO: return "_Internet Radio"; case ALBUMS: return "A_lbums"; case ARTISTS: return "_Artists"; case GENRES: return "_Genres"; case COMPOSERS: return "_Composers"; case SEARCH: return "_Search"; default: return ""; } } public string to_display_string() { switch (this) { case BROWSE: return "Explorer"; case PLAYLISTS: return "Playlists"; case SETTINGS: return "Settings"; case INTERNET_RADIO: return "Internet Radio"; case ALBUMS: return "Albums"; case ARTISTS: return "Artists"; case GENRES: return "Genres"; case COMPOSERS: return "Composers"; case SEARCH: return "Search"; default: return ""; } } public static Hierarchy from_int(int n) { switch (n) { case BROWSE: return BROWSE; case PLAYLISTS: return PLAYLISTS; case SETTINGS: return SETTINGS; case INTERNET_RADIO: return INTERNET_RADIO; case ALBUMS: return ALBUMS; case ARTISTS: return ARTISTS; case GENRES: return GENRES; case COMPOSERS: return COMPOSERS; case SEARCH: return SEARCH; default: return BROWSE; } } public void json_add(Json.Builder builder) { builder.add_string_value(this.to_id_string()); }
-
-
-
@@ -27,6 +27,7 @@ namespace PlacGtkAdwaita {public const string SHOW_BROWSE_ITEM_SEPARATORS = "show-browse-item-separators"; public const string FOCUS_BROWSE_ITEMS_ON_LOAD = "focus-browse-items-on-load"; public const string DISABLE_CSD = "disable-csd"; public const string STARTUP_CATEGORY = "startup-category"; public GLib.Settings settings;
-
@@ -80,5 +81,10 @@ namespace PlacGtkAdwaita {owned get { return settings.get_boolean(FOCUS_BROWSE_ITEMS_ON_LOAD); } set { settings.set_boolean(FOCUS_BROWSE_ITEMS_ON_LOAD, value); } } public Roon.Browse.Hierarchy startup_category { owned get { return Roon.Browse.Hierarchy.from_int(settings.get_int(STARTUP_CATEGORY)); } set { settings.set_int(STARTUP_CATEGORY, value); } } } }
-
-
-
@@ -76,6 +76,12 @@ namespace PlacGtkAdwaita {} construct { // This widget has to read the setting. If we rely on the setting of startup // category to widget consumer (parent, caller,) it interrupts the loading // with this widget's default value (BROWSE) then reload with the new // hierarchy. this.hierarchy = settings.startup_category; this.notify["hierarchy"].connect(() => { this.item = null; load_page();
-
-
-
@@ -17,14 +17,13 @@namespace PlacGtkAdwaita { class BrowseHierarchyRow : Gtk.ListBoxRow { public Roon.Browse.Hierarchy hierarchy { get; construct set; } public string label { get; construct set; } public BrowseHierarchyRow(Roon.Browse.Hierarchy hierarchy, string label) { Object(hierarchy: hierarchy, label: label); public BrowseHierarchyRow(Roon.Browse.Hierarchy hierarchy) { Object(hierarchy: hierarchy); } construct { var text = new Gtk.Label.with_mnemonic(label); var text = new Gtk.Label.with_mnemonic(hierarchy.to_mnemonic_string()); text.halign = START; this.child = text; }
-
-
-
@@ -97,18 +97,19 @@ namespace PlacGtkAdwaita {}); }); var explore_row = new BrowseHierarchyRow(BROWSE, "_Explore"); browse_hierarchy.append(explore_row); browse_hierarchy.select_row(explore_row); browse_hierarchy.append(new BrowseHierarchyRow(ALBUMS, "A_lbums")); browse_hierarchy.append(new BrowseHierarchyRow(PLAYLISTS, "_Playlists")); browse_hierarchy.append(new BrowseHierarchyRow(ARTISTS, "_Artists")); browse_hierarchy.append(new BrowseHierarchyRow(GENRES, "_Genres")); browse_hierarchy.append(new BrowseHierarchyRow(COMPOSERS, "_Composers")); browse_hierarchy.append(new BrowseHierarchyRow(INTERNET_RADIO, "_Internet Radio")); browse_hierarchy.append(new BrowseHierarchyRow(SETTINGS, "Se_ttings")); browse_hierarchy.append(new BrowseHierarchyRow(SEARCH, "_Search")); var browse_hierarchy_model = new Adw.EnumListModel(typeof (Roon.Browse.Hierarchy)); browse_hierarchy.bind_model(browse_hierarchy_model, (item) => { var hierarchy = Roon.Browse.Hierarchy.from_int(((Adw.EnumListItem) item).value); return new BrowseHierarchyRow(hierarchy); }); // Selecting initial category must be done before connecting handler. // Otherwise setting the value triggers callback, and that initiates // another loading if initial category differs. For this reason, // initial value computed here and inside "Browse" widget must be same. var start_position = browse_hierarchy_model.find_position(settings.startup_category); browse_hierarchy.select_row(browse_hierarchy.get_row_at_index((int) start_position)); browse_hierarchy.row_selected.connect((row) => { if (row == null) {
-