diff --git a/wallpapers-bing/wallpapers_bing.vala b/wallpapers-bing/wallpapers_bing.vala index dc75e00..1e005f5 100644 --- a/wallpapers-bing/wallpapers_bing.vala +++ b/wallpapers-bing/wallpapers_bing.vala @@ -2,6 +2,7 @@ using GLib; using Gtk; using Gee; using Singularity; +using Singularity.Widgets; using Peas; [ModuleInit] @@ -33,6 +34,15 @@ namespace WallpapersBing { public bool requires_credentials { get { return false; } } public bool supports_search { get { return false; } } public Provider() { base("/usr/local/bin/ncz-wallpaper-bing"); } + public async string market_list(Cancellable? cancel) throws Error { + return yield command({helper, "markets"}, cancel, 30); + } + public async string preferred_market(Cancellable? cancel) throws Error { + return (yield command({helper, "market"}, cancel, 30)).strip(); + } + public async void set_preferred_market(string market, Cancellable? cancel) throws Error { + yield command({helper, "market", market}, cancel, 30); + } public async ArrayList choices(string index, Cancellable? cancel) throws Error { var loaded = WallpaperBing.markets(yield command({helper, "markets"}, cancel, 30)); // The helper is expected to always advertise the combined view @@ -64,6 +74,7 @@ namespace WallpapersBing { public class WallpapersBingPlugin : Object, Singularity.Plugin { private PluginContext context; private WallpapersBing.Provider? provider; + private const string BING_MARKETS_ID_ALL = "all"; public void activate(PluginContext ctx) { this.context = ctx; @@ -84,6 +95,47 @@ public class WallpapersBingPlugin : Object, Singularity.Plugin { lbl.wrap = true; lbl.xalign = 0; box.append(lbl); + load_bing_markets.begin(box); return box; } + + private async void load_bing_markets(Box box) { + if (provider == null) return; + var bing_markets_options = new Gee.ArrayList(); + bing_markets_options.add(new Singularity.Core.AppSettingOption() { id = BING_MARKETS_ID_ALL, label = _("All Markets, No Preference") }); + string bing_markets_current = BING_MARKETS_ID_ALL; + try { + foreach (string line in (yield provider.market_list(null)).split("\n")) { + string[] columns = line.split("\t"); + if (columns.length < 2 || columns[0].strip() == "") continue; + bing_markets_options.add(new Singularity.Core.AppSettingOption() { + id = columns[0].strip(), label = columns[1].strip() }); + } + string configured = yield provider.preferred_market(null); + if (configured.ascii_down() != BING_MARKETS_ID_ALL) { + foreach (var option in bing_markets_options) { + if (option.id == configured) bing_markets_current = configured; + } + } + } catch (Error e) { + warning("wallpapers-bing: could not load market settings: %s", e.message); + return; + } + var bing_markets_row = new SelectionRow.with_options(_("Bing Preferred Region"), bing_markets_options, + bing_markets_current); + bing_markets_row.subtitle = _("Bing always combines every region's photo of the day; this only picks whose caption and credit win when the same photo is shared"); + bing_markets_row.selected.connect((id) => { + persist_bing_market.begin(id); + }); + box.append(bing_markets_row); + } + + private async void persist_bing_market(string market) { + if (provider == null) return; + try { + yield provider.set_preferred_market(market, null); + } catch (Error e) { + warning("wallpapers-bing: could not save preferred market: %s", e.message); + } + } }