[gnome-games] Make Runner.check_is_valid() return an error message



commit 49ab2c329a400329a768dc269322471d38b68959
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Thu Feb 16 22:01:48 2017 +0100

    Make Runner.check_is_valid() return an error message
    
    Also display the returned message on the error display page.
    
    This helps the users to better understand why their game doesn't run.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=778773

 src/command/command-runner.vala |   11 ++++++++---
 src/core/runner.vala            |    2 +-
 src/dummy/dummy-runner.vala     |    3 ++-
 src/retro/retro-runner.vala     |   25 ++++++++++++++++++++++---
 src/ui/application-window.vala  |    8 ++++++--
 5 files changed, 39 insertions(+), 10 deletions(-)
---
diff --git a/src/command/command-runner.vala b/src/command/command-runner.vala
index a96ff14..bfb14c1 100644
--- a/src/command/command-runner.vala
+++ b/src/command/command-runner.vala
@@ -25,9 +25,14 @@ public class Games.CommandRunner : Object, Runner {
                this.watch_child = watch_child;
        }
 
-       public void check_is_valid () throws Error {
-               if (args.length < 1)
-                       throw new CommandError.INVALID_COMMAND (_("Invalid command: it doesn't have any 
argument."));
+       public bool check_is_valid (out string error_message) throws Error {
+               if (args.length > 0)
+                       return true;
+
+               debug ("Invalid command: it doesn't have any argument.");
+               error_message = _("The game doesn't have a valid command.");
+
+               return false;
        }
 
        public Gtk.Widget get_display () {
diff --git a/src/core/runner.vala b/src/core/runner.vala
index c9684ca..4122930 100644
--- a/src/core/runner.vala
+++ b/src/core/runner.vala
@@ -8,7 +8,7 @@ public interface Games.Runner : Object {
        public abstract bool can_resume { get; }
        public abstract MediaSet? media_set { get; }
 
-       public abstract void check_is_valid () throws Error;
+       public abstract bool check_is_valid (out string error_message) throws Error;
        public abstract Gtk.Widget get_display ();
        public abstract void start () throws Error;
        public abstract void resume () throws Error;
diff --git a/src/dummy/dummy-runner.vala b/src/dummy/dummy-runner.vala
index 579e89d..819e876 100644
--- a/src/dummy/dummy-runner.vala
+++ b/src/dummy/dummy-runner.vala
@@ -17,7 +17,8 @@ private class Games.DummyRunner : Object, Runner {
                get { return null; }
        }
 
-       public void check_is_valid () throws Error {
+       public bool check_is_valid (out string error_message) throws Error {
+               return true;
        }
 
        public Gtk.Widget get_display () {
diff --git a/src/retro/retro-runner.vala b/src/retro/retro-runner.vala
index 9868e65..b3bf472 100644
--- a/src/retro/retro-runner.vala
+++ b/src/retro/retro-runner.vala
@@ -108,9 +108,19 @@ public class Games.RetroRunner : Object, Runner {
                }
        }
 
-       public void check_is_valid () throws Error {
-               load_media_data ();
-               init ();
+       public bool check_is_valid (out string error_message) throws Error {
+               try {
+                       load_media_data ();
+                       init ();
+               }
+               catch (RetroError.MODULE_NOT_FOUND e) {
+                       debug (e.message);
+                       error_message = get_unsupported_system_message ();
+
+                       return false;
+               }
+
+               return true;
        }
 
        public Gtk.Widget get_display () {
@@ -491,6 +501,15 @@ public class Games.RetroRunner : Object, Runner {
                }
        }
 
+       private string get_unsupported_system_message () {
+               var platform = core_source.get_platform ();
+               var platform_name = get_platform_name (platform);
+               if (platform_name == null)
+                       return _("The system isn't supported yet. Full support will come!");
+               else
+                       return _("The system ā€œ%sā€ isn't supported yet. Full support will come!").printf 
(platform_name);
+       }
+
        private static string? get_platform_name (string platform) {
                switch (platform) {
                case "Atari2600":
diff --git a/src/ui/application-window.vala b/src/ui/application-window.vala
index c4a64d6..4ce8fd7 100644
--- a/src/ui/application-window.vala
+++ b/src/ui/application-window.vala
@@ -241,9 +241,13 @@ private class Games.ApplicationWindow : Gtk.ApplicationWindow {
        private Runner? try_get_runner (Game game) {
                try {
                        var runner = game.get_runner ();
-                       runner.check_is_valid ();
+                       string error_message;
+                       if (runner.check_is_valid (out error_message))
+                               return runner;
 
-                       return runner;
+                       display_box.display_running_game_failed (game, error_message);
+
+                       return null;
                }
                catch (Error e) {
                        warning (e.message);


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