[gnome-calculator/wip/currency-conversion-plugins] Make command-line conversions work (fixes #33)



commit 5beed7c1009007b27c745145fd148baf7575c2c3
Author: Robert Roth <robert roth off gmail com>
Date:   Thu Jan 14 16:26:25 2021 +0200

    Make command-line conversions work (fixes #33)

 lib/currency-provider.vala |  8 ++++----
 lib/currency.vala          | 20 ++++++++++++++------
 lib/equation.vala          | 13 +++++++++++++
 lib/math-equation.vala     |  1 -
 src/gcalccmd.vala          |  6 +++++-
 src/gnome-calculator.vala  | 23 +++++++++--------------
 6 files changed, 45 insertions(+), 26 deletions(-)
---
diff --git a/lib/currency-provider.vala b/lib/currency-provider.vala
index 5625a9ee..53c7c4ce 100644
--- a/lib/currency-provider.vala
+++ b/lib/currency-provider.vala
@@ -4,7 +4,7 @@ public interface CurrencyProvider : Object {
 
     public abstract void update_rates (bool asyncLoad = true);
 
-    public abstract void set_refresh_interval (int interval);
+    public abstract void set_refresh_interval (int interval, bool asyncLoad = true);
 }
 
 abstract class AbstractCurrencyProvider : Object, CurrencyProvider {
@@ -15,12 +15,12 @@ abstract class AbstractCurrencyProvider : Object, CurrencyProvider {
 
     public abstract string source_name {get;}
 
-    public int refresh_interval { get; set; }
+    public int refresh_interval { get; private set; }
 
-    public void set_refresh_interval (int interval) {
+    public void set_refresh_interval (int interval, bool asyncLoad = true) {
         loaded = false;
         this.refresh_interval = interval;
-        update_rates ();
+        update_rates (asyncLoad);
     }
 
     private bool loading;
diff --git a/lib/currency.vala b/lib/currency.vala
index 03b031d0..351bd38e 100644
--- a/lib/currency.vala
+++ b/lib/currency.vala
@@ -17,19 +17,27 @@ public class CurrencyManager : Object
     private List<CurrencyProvider> providers;
 
     private int _refresh_interval;
-    public int refresh_interval { get { return _refresh_interval;}
+    public int refresh_interval { get { return _refresh_interval; }
         set
         {
             _refresh_interval = value;
-            foreach (var p in default_currency_manager.providers) {
-                p.set_refresh_interval(_refresh_interval);
-            }
         }
     }
 
     public signal void updated ();
 
-    public static CurrencyManager get_default ()
+    public void refresh_sync () {
+        foreach (var p in default_currency_manager.providers) {
+            p.set_refresh_interval(_refresh_interval, false);
+        }
+    }
+    public void refresh_async () {
+        foreach (var p in default_currency_manager.providers) {
+            p.set_refresh_interval(_refresh_interval, true);
+        }
+    }
+
+    public static CurrencyManager get_default (bool asyncLoad = true)
     {
         if (default_currency_manager != null)
             return default_currency_manager;
@@ -101,7 +109,7 @@ public class CurrencyManager : Object
         /* Start downloading the rates if they are outdated. */
         foreach (var p in default_currency_manager.providers) {
             p.updated.connect ( () => { default_currency_manager.updated (); });
-            p.update_rates ();
+            p.update_rates (asyncLoad);
         }
 
         return default_currency_manager;
diff --git a/lib/equation.vala b/lib/equation.vala
index e6e3a31b..9aa71716 100644
--- a/lib/equation.vala
+++ b/lib/equation.vala
@@ -153,6 +153,19 @@ public class Equation : Object
     }
 }
 
+public class ConvertEquation : Equation
+{
+    public ConvertEquation (string text)
+    {
+        base (text);
+    }
+
+    public override Number? convert (Number x, string x_units, string z_units)
+    {
+        return UnitManager.get_default ().convert_by_symbol (x, x_units, z_units);
+    }
+}
+
 private class EquationParser : Parser
 {
     private Equation equation;
diff --git a/lib/math-equation.vala b/lib/math-equation.vala
index 73cff961..4e30307d 100644
--- a/lib/math-equation.vala
+++ b/lib/math-equation.vala
@@ -1486,7 +1486,6 @@ private class MEquation : Equation
     public override Number? get_variable (string name)
     {
         var lower_name = name.down ();
-
         if (lower_name == "rand")
             return new Number.random ();
         else if (lower_name == "_")
diff --git a/src/gcalccmd.vala b/src/gcalccmd.vala
index 3bf6c45e..cb3568a8 100644
--- a/src/gcalccmd.vala
+++ b/src/gcalccmd.vala
@@ -24,7 +24,7 @@ static void solve (string equation)
         decimal = "";
 
     string? error_token = null;
-    var e = new Equation (equation.replace (tsep_string, "").replace (decimal, "."));
+    var e = new ConvertEquation (equation.replace (tsep_string, "").replace (decimal, "."));
     e.base = 10;
     e.wordlen = 32;
     e.angle_units = AngleUnit.DEGREES;
@@ -63,6 +63,10 @@ public static int main (string[] args)
 
     result_serializer = new Serializer (DisplayFormat.AUTOMATIC, 10, 9);
 
+    var settings = new Settings ("org.gnome.calculator");
+    CurrencyManager.get_default (false).refresh_interval = settings.get_int ("refresh-interval");
+    CurrencyManager.get_default (false).refresh_sync ();
+
     if (args.length == 2) {
         solve (args[1]);
         return Posix.EXIT_SUCCESS;
diff --git a/src/gnome-calculator.vala b/src/gnome-calculator.vala
index 6490af2d..1090fa25 100644
--- a/src/gnome-calculator.vala
+++ b/src/gnome-calculator.vala
@@ -124,6 +124,7 @@ public class Calculator : Gtk.Application
         // restore the first window position from the settings
         load_window_position (last_opened_window);
         CurrencyManager.get_default ().refresh_interval = settings.get_int ("refresh-interval");
+        CurrencyManager.get_default ().refresh_async ();
     }
 
     private MathWindow get_active_math_window ()
@@ -218,7 +219,7 @@ public class Calculator : Gtk.Application
 
             settings = new Settings ("org.gnome.calculator");
             var angle_units = (AngleUnit) settings.get_enum ("angle-units");
-            var e = new SolveEquation (solve_equation.replace (tsep_string, "").replace (decimal, "."));
+            var e = new ConvertEquation (solve_equation.replace (tsep_string, "").replace (decimal, "."));
             e.base = 10;
             e.wordlen = 32;
             e.angle_units = angle_units;
@@ -227,6 +228,13 @@ public class Calculator : Gtk.Application
             string? error_token = null;
             uint representation_base;
             var result = e.parse (out representation_base, out error, out error_token);
+
+            // if unknown conversion, try force reloading conversion rates and retry conversion
+            if (error == ErrorCode.UNKNOWN_CONVERSION) {
+                CurrencyManager.get_default ().refresh_interval = settings.get_int ("refresh-interval");
+                CurrencyManager.get_default ().refresh_sync ();
+                result = e.parse (out representation_base, out error, out error_token);
+            }
             if (result != null)
             {
                 var serializer = new Serializer (DisplayFormat.AUTOMATIC, 10, 9);
@@ -419,16 +427,3 @@ public class Calculator : Gtk.Application
         return app.run (args);
     }
 }
-
-private class SolveEquation : Equation
-{
-    public SolveEquation (string text)
-    {
-        base (text);
-    }
-
-    public override Number? convert (Number x, string x_units, string z_units)
-    {
-        return UnitManager.get_default ().convert_by_symbol (x, x_units, z_units);
-    }
-}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]