From 213feffa73f09303914f0032ba9976ecb17629cd Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 13 May 2021 11:29:33 -0400 Subject: [PATCH 5/5] math-converter: Hide currency conversion UI if there isn't a loaded currency provider If the admin sets a currency refresh-interval of 0, then the currency conversion data will be missing or woefully out of date. This commit changes the code to hide the conversion UI in this case. --- lib/currency.vala | 15 ++- src/gnome-calculator.vala | 1 + src/math-converter.ui | 264 ++++++++++++++++++++++++-------------- src/math-converter.vala | 18 ++- 4 files changed, 197 insertions(+), 101 deletions(-) diff --git a/lib/currency.vala b/lib/currency.vala index 2adb11e4..4270b701 100644 --- a/lib/currency.vala +++ b/lib/currency.vala @@ -1,53 +1,62 @@ /* * Copyright (C) 2008-2012 Robert Ancell. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. See http://www.gnu.org/copyleft/gpl.html the full text of the * license. */ static bool downloading_imf_rates = false; static bool downloading_ecb_rates = false; -static bool loaded_rates = false; private static CurrencyManager? default_currency_manager = null; public class CurrencyManager : Object { private List currencies; public int refresh_interval { get; set; } public signal void updated (); + public bool loaded { get; private set; } + + public void refresh_sync () { + loaded = false; + load_rates (); + + if (!loaded) + updated (); + } + public static CurrencyManager get_default () { if (default_currency_manager != null) return default_currency_manager; default_currency_manager = new CurrencyManager (); default_currency_manager.currencies.append (new Currency ("AED", _("UAE Dirham"), "إ.د")); default_currency_manager.currencies.append (new Currency ("AUD", _("Australian Dollar"), "$")); default_currency_manager.currencies.append (new Currency ("BGN", _("Bulgarian Lev"), "лв")); default_currency_manager.currencies.append (new Currency ("BHD", _("Bahraini Dinar"), ".ب.د")); default_currency_manager.currencies.append (new Currency ("BND", _("Brunei Dollar"), "$")); default_currency_manager.currencies.append (new Currency ("BRL", _("Brazilian Real"), "R$")); default_currency_manager.currencies.append (new Currency ("BWP", _("Botswana Pula"), "P")); default_currency_manager.currencies.append (new Currency ("CAD", _("Canadian Dollar"), "$")); default_currency_manager.currencies.append (new Currency ("CFA", _("CFA Franc"), "Fr")); default_currency_manager.currencies.append (new Currency ("CHF", _("Swiss Franc"), "Fr")); default_currency_manager.currencies.append (new Currency ("CLP", _("Chilean Peso"), "$")); default_currency_manager.currencies.append (new Currency ("CNY", _("Chinese Yuan"), "¥")); default_currency_manager.currencies.append (new Currency ("COP", _("Colombian Peso"), "$")); default_currency_manager.currencies.append (new Currency ("CZK", _("Czech Koruna"), "Kč")); default_currency_manager.currencies.append (new Currency ("DKK", _("Danish Krone"), "kr")); default_currency_manager.currencies.append (new Currency ("DZD", _("Algerian Dinar"), "ج.د")); default_currency_manager.currencies.append (new Currency ("EEK", _("Estonian Kroon"), "KR")); default_currency_manager.currencies.append (new Currency ("EUR", _("Euro"), "€")); default_currency_manager.currencies.append (new Currency ("GBP", _("British Pound Sterling"), "£")); default_currency_manager.currencies.append (new Currency ("HKD", _("Hong Kong Dollar"), "$")); default_currency_manager.currencies.append (new Currency ("HRK", _("Croatian Kuna"), "kn")); default_currency_manager.currencies.append (new Currency ("HUF", _("Hungarian Forint"), "Ft")); default_currency_manager.currencies.append (new Currency ("IDR", _("Indonesian Rupiah"), "Rp")); @@ -377,81 +386,81 @@ public class CurrencyManager : Object } Xml.Parser.cleanup (); } private void download_rates () { if (refresh_interval == 0) return; /* Update rates if necessary */ var path = get_imf_rate_filepath (); if (!downloading_imf_rates && file_needs_update (path, refresh_interval)) { downloading_imf_rates = true; debug ("Downloading rates from the IMF..."); download_file.begin ("https://www.imf.org/external/np/fin/data/rms_five.aspx?tsvflag=Y", path, "IMF"); } path = get_ecb_rate_filepath (); if (!downloading_ecb_rates && file_needs_update (path, refresh_interval)) { downloading_ecb_rates = true; debug ("Downloading rates from the ECB..."); download_file.begin ("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml", path, "ECB"); } } private bool load_rates () { /* Already loaded */ - if (loaded_rates) + if (loaded) return true; if (refresh_interval == 0) return false; /* In process */ if (downloading_imf_rates || downloading_ecb_rates) return false; /* Use the IMF provided values and top up with currencies tracked by the ECB and not the IMF */ load_imf_rates (); load_ecb_rates (); /* Check if we couldn't find out a currency */ foreach (var c in currencies) if (c.get_value () == null || c.get_value ().is_zero ()) warning ("Currency %s is not provided by IMF or ECB", c.name); debug ("Rates loaded"); - loaded_rates = true; + loaded = true; updated (); return true; } public Number? get_value (string currency) { /* Make sure that the rates we're returning are up to date. (Just in case the application is running from a long long time) */ download_rates (); if (!load_rates ()) return null; var c = get_currency (currency); if (c != null) return c.get_value (); else return null; } private async void download_file (string uri, string filename, string source) { var directory = Path.get_dirname (filename); DirUtils.create_with_parents (directory, 0755); var dest = File.new_for_path (filename); var session = new Soup.Session (); var message = new Soup.Message ("GET", uri); diff --git a/src/gnome-calculator.vala b/src/gnome-calculator.vala index 89a83450..0aa0054e 100644 --- a/src/gnome-calculator.vala +++ b/src/gnome-calculator.vala @@ -104,60 +104,61 @@ public class Calculator : Gtk.Application } var menu = builder.get_object ("appmenu") as MenuModel; set_app_menu (menu); set_accels_for_action ("win.mode::basic", {"B"}); set_accels_for_action ("win.mode::advanced", {"A"}); set_accels_for_action ("win.mode::financial", {"F"}); set_accels_for_action ("win.mode::programming", {"P"}); set_accels_for_action ("win.mode::keyboard", {"K"}); set_accels_for_action ("win.copy", {"C"}); set_accels_for_action ("win.paste", {"V"}); set_accels_for_action ("win.undo", {"Z"}); set_accels_for_action ("win.close", {"W"}); set_accels_for_action ("win.redo", {"Z"}); return current_window; } protected override void startup () { base.startup (); settings = new Settings ("org.gnome.calculator"); last_opened_window = create_new_window (settings); // restore the first window position from the settings load_window_position (last_opened_window); CurrencyManager.get_default ().refresh_interval = settings.get_int ("refresh-interval"); settings.changed["refresh-interval"].connect(() => { CurrencyManager.get_default ().refresh_interval = settings.get_int ("refresh-interval"); + CurrencyManager.get_default ().refresh_sync (); }); } private MathWindow get_active_math_window () { return (MathWindow) get_active_window (); } protected override void activate () { base.activate (); last_opened_window.present (); if (equation_string != "" && equation_string != null) { var equations = (equation_string.compress ()).split ("\n",0); for (var i = 0; i < equations.length; i++) { if ((equations [i].strip ()).length > 0) last_opened_window.equation.set (equations [i]); else last_opened_window.equation.solve (); } } if (mode_string != "" && mode_string != null) { var mode = ButtonMode.BASIC; switch (mode_string) { diff --git a/src/math-converter.ui b/src/math-converter.ui index 9ec03820..fb633f10 100644 --- a/src/math-converter.ui +++ b/src/math-converter.ui @@ -1,137 +1,207 @@ diff --git a/src/math-converter.vala b/src/math-converter.vala index a83dea24..c470b91f 100644 --- a/src/math-converter.vala +++ b/src/math-converter.vala @@ -1,128 +1,144 @@ /* * Copyright (C) 2008-2012 Robert Ancell * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. See http://www.gnu.org/copyleft/gpl.html the full text of the * license. */ [GtkTemplate (ui = "/org/gnome/calculator/math-converter.ui")] public class MathConverter : Gtk.Grid { private MathEquation equation = null; private string category; [GtkChild] private Gtk.CellRendererText from_renderer; [GtkChild] private Gtk.ComboBox from_combo; [GtkChild] private Gtk.ComboBox to_combo; [GtkChild] private Gtk.Label from_label; [GtkChild] private Gtk.Label to_label; + public bool outer_box_visible { set; get; default = false; } public signal void changed (); construct { from_combo.set_cell_data_func (from_renderer, from_cell_data_func); - CurrencyManager.get_default ().updated.connect (() => { update_result_label (); }); + CurrencyManager.get_default ().updated.connect (() => { + update_visibility (); + update_result_label (); + }); + update_visibility (); update_from_model (); } public MathConverter (MathEquation equation) { set_equation (equation); } public void set_equation (MathEquation equation) { this.equation = equation; equation.notify["display"].connect ((pspec) => { update_result_label (); }); } public void set_category (string? category) { if (this.category == category) return; this.category = category; + update_visibility (); update_from_model (); } public string get_category () { return category; } public void set_conversion (/*string category,*/ string unit_a, string unit_b) { var ua = UnitManager.get_default ().get_unit_by_name (unit_a); var ub = UnitManager.get_default ().get_unit_by_name (unit_b); if (ua == null || ub == null) { /* Select the first unit */ var model = from_combo.get_model (); Gtk.TreeIter iter; if (model.get_iter_first (out iter)) { Gtk.TreeIter child_iter; while (model.iter_children (out child_iter, iter)) iter = child_iter; from_combo.set_active_iter (iter); } return; } set_active_unit (from_combo, null, ua); set_active_unit (to_combo, null, ub); } public void get_conversion (out Unit from_unit, out Unit to_unit) { Gtk.TreeIter from_iter, to_iter; from_combo.get_active_iter (out from_iter); to_combo.get_active_iter (out to_iter); from_combo.get_model ().get (from_iter, 2, out from_unit, -1); to_combo.get_model ().get (to_iter, 2, out to_unit, -1); } + private void update_visibility () + { + if (category != "currency") { + this.outer_box_visible = true; + return; + } + + this.outer_box_visible = CurrencyManager.get_default ().loaded; + } + private void update_result_label () { var x = equation.number; if (x == null) return; Unit source_unit, target_unit; var z = convert_equation (x, out source_unit, out target_unit); if (z != null) { var source_text = source_unit.format (x); var target_text = target_unit.format (z); from_label.set_text (source_text); to_label.set_text (target_text); } } private void update_from_model () { var from_model = new Gtk.TreeStore (3, typeof (string), typeof (UnitCategory), typeof (Unit)); if (category == null) { var categories = UnitManager.get_default ().get_categories (); foreach (var category in categories) { Gtk.TreeIter parent; from_model.append (out parent, null); from_model.set (parent, 0, category.display_name, 1, category, -1); -- 2.31.1