From acb2f62bdd0d9c0cc3f355dc7725eb0c502eae6a Mon Sep 17 00:00:00 2001 From: Grabli66 Date: Wed, 14 Mar 2018 19:31:25 +0300 Subject: [PATCH] Fix #24 Fix #13 --- CMakeLists.txt | 1 + src/AsyncTaskExecuter.vala | 32 +++++++++++++++++++++++--- src/TranslatorService.vala | 9 ++++++-- src/TranslatorWindow.vala | 41 +++++++++++++++++++++++++++------- src/WebJsonClient.vala | 15 ++++++++++--- src/utils/TranslatorError.vala | 5 +++++ 6 files changed, 87 insertions(+), 16 deletions(-) create mode 100644 src/utils/TranslatorError.vala diff --git a/CMakeLists.txt b/CMakeLists.txt index b4cbcf2..3ea9003 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,7 @@ link_directories(${DEPS_LIBRARY_DIRS}) vala_precompile(VALA_C ${EXEC_NAME} src/Main.vala + src/utils/TranslatorError.vala src/LangInfo.vala src/widgets/PopoverCombo.vala src/TranslatorApplication.vala diff --git a/src/AsyncTaskExecuter.vala b/src/AsyncTaskExecuter.vala index 744e4a8..d1c2a2f 100644 --- a/src/AsyncTaskExecuter.vala +++ b/src/AsyncTaskExecuter.vala @@ -1,13 +1,16 @@ +/// For executing task on thread private class AsyncTask : GLib.Object { private bool _isActive; private int _timeout; private AsyncTaskExecuter _parent; + /// Constructor public AsyncTask(AsyncTaskExecuter parent, int timeout) { _parent = parent; _timeout = timeout; } + /// Execute on thread public void Run() { try { Thread.usleep(_timeout); @@ -23,8 +26,12 @@ private class AsyncTask : GLib.Object { }); _isActive = false; - } catch (Error e) { - stderr.printf(e.message); + } + catch(TranslatorError e) { + _parent.OnError(e); + } + catch (Error e) { + stderr.printf(e.message); } } @@ -38,20 +45,39 @@ private class AsyncTask : GLib.Object { } } +/// Executer of AsyncTask public class AsyncTaskExecuter : GLib.Object { + /// Thread pool private ThreadPool _pool; + + /// Async task to execute private AsyncTask _task; + + /// Timeout of execution protected int ExecuteTimeout = 300000; // Timeout before executing - public virtual void OnExecute() {} + /// On error signal + public signal void error(TranslatorError error); + + /// Main working method + public virtual void OnExecute() throws TranslatorError {} + + /// On work result public virtual void OnResult() {} + /// On error + public void OnError(TranslatorError err) { + error(err); + } + + /// Constructor public AsyncTaskExecuter() { _pool = new ThreadPool.with_owned_data ((worker) => { worker.Start (); }, 7, false); } + /// Run task protected void Run() { if (_task != null) { _task.Stop(); diff --git a/src/TranslatorService.vala b/src/TranslatorService.vala index 9fe5eb7..65ac8f7 100644 --- a/src/TranslatorService.vala +++ b/src/TranslatorService.vala @@ -6,14 +6,17 @@ public class TranslateService : AsyncTaskExecuter { private string _to; private string _text; + /// On result public signal void result(string[] text); + /// Constructor public TranslateService() { base(); } - public override void OnExecute() { - var ntext = Soup.URI.encode(_text, null); + /// Task main working method + public override void OnExecute() throws TranslatorError { + var ntext = Soup.URI.encode(_text, null); var request = @"https://translate.yandex.net/api/v1.5/tr.json/translate?key=$(API_KEY)&lang=$(_from)-$(_to)&text=$(ntext)"; var root = WebJsonClient.Get(request); var data = new Gee.ArrayList(); @@ -31,10 +34,12 @@ public class TranslateService : AsyncTaskExecuter { } } + /// On result public override void OnResult() { result(_result); } + /// Start to translate public void Translate(string from, string to, string text) { _from = from; _to = to; diff --git a/src/TranslatorWindow.vala b/src/TranslatorWindow.vala index 3f98f6d..56967f2 100644 --- a/src/TranslatorWindow.vala +++ b/src/TranslatorWindow.vala @@ -1,7 +1,9 @@ // Main translator window public class TranslateWindow : Gtk.ApplicationWindow { - private TranslateService service; + /// Service for translating + private TranslateService _translateService; + /// Dictionary service private DictionaryService _dictService; private GlobalSettings global = GlobalSettings.instance(); @@ -41,6 +43,9 @@ public class TranslateWindow : Gtk.ApplicationWindow { private Gtk.TextTag _normalTag; private Gtk.Label _dictLangLabel; + /// Toast for messages + private Granite.Widgets.Toast _toast; + private static int DEFAULT_WIDTH = 0; private static int DEFAULT_HEIGHT = 640; @@ -84,16 +89,27 @@ public class TranslateWindow : Gtk.ApplicationWindow { Granite.Widgets.Utils.set_theming_for_screen (this.get_screen (), style, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); } + /// On service error + private void onServiceError(TranslatorError error) { + _isTranslating = false; + _progressSpinner.active = false; + + _toast.title = _(error.message); + _toast.send_notification(); + } + // Constructor // TODO: separate to methods public TranslateWindow() { langs = global.getLangs(); - service = new TranslateService(); - service.result.connect(onTranslate); + _translateService = new TranslateService(); + _translateService.result.connect(onTranslate); + _translateService.error.connect(onServiceError); _dictService = new DictionaryService(); _dictService.result.connect(onDictResult); + _dictService.error.connect(onServiceError); this.window_position = Gtk.WindowPosition.CENTER; this.set_gravity(Gdk.Gravity.CENTER); @@ -183,6 +199,8 @@ public class TranslateWindow : Gtk.ApplicationWindow { var paned = new Gtk.Paned(Gtk.Orientation.VERTICAL); _leftBox.pack_start(paned); + var topOverlay = new Gtk.Overlay(); + topText = new Gtk.TextView(); topText.set_margin_left(7); topText.set_margin_top(7); @@ -194,6 +212,10 @@ public class TranslateWindow : Gtk.ApplicationWindow { topScroll.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); topScroll.add (topText); + _toast = new Granite.Widgets.Toast(""); + topOverlay.add(topScroll); + topOverlay.add_overlay(_toast); + /// Translate destination var bottomOverlay = new Gtk.Overlay(); @@ -213,9 +235,10 @@ public class TranslateWindow : Gtk.ApplicationWindow { _progressSpinner = new Gtk.Spinner (); _progressSpinner.active = false; _progressSpinner.margin = 70; - + + bottomOverlay.add(bottomScroll); - bottomOverlay.add_overlay(_progressSpinner); + bottomOverlay.add_overlay(_progressSpinner); var topBox = new Gtk.Box(Gtk.Orientation.VERTICAL, 0); var topLabelBox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0); @@ -229,7 +252,7 @@ public class TranslateWindow : Gtk.ApplicationWindow { topLabelBox.pack_start(topLabelLang, false, true, 5); topLabelBox.pack_end(topLabelLen, false, true, 5); - topBox.pack_start(topScroll); + topBox.pack_start(topOverlay); topBox.pack_start(topLabelBox, false, true, 0); var bottomBox = new Gtk.Box(Gtk.Orientation.VERTICAL, 0); @@ -378,12 +401,14 @@ public class TranslateWindow : Gtk.ApplicationWindow { } } + /// On change value in left combobox private void onLeftComboChange() { onLangChange(false); } + /// On change value in right combobox private void onRightComboChange(LangInfo info) { - onLangChange(true); + onLangChange(true); } // Swap languages @@ -413,7 +438,7 @@ public class TranslateWindow : Gtk.ApplicationWindow { _isTranslating = true; _progressSpinner.active = true; - service.Translate(leftLang.id, rightLang.id, topText.buffer.text); + _translateService.Translate(leftLang.id, rightLang.id, topText.buffer.text); } /// On translate complete diff --git a/src/WebJsonClient.vala b/src/WebJsonClient.vala index 91d2809..3bab5cf 100644 --- a/src/WebJsonClient.vala +++ b/src/WebJsonClient.vala @@ -1,6 +1,10 @@ +/// For fetch json from url public class WebJsonClient : GLib.Object { - private static Json.Parser _parser; + /// No connection to server code + private const int NO_CONNECTION = 2; + /// Json parser + private static Json.Parser _parser; private static Json.Parser parser { get { if (_parser == null) _parser = new Json.Parser(); @@ -8,7 +12,8 @@ public class WebJsonClient : GLib.Object { } } - public static Json.Object Get(string request) { + /// Get json from url + public static Json.Object Get(string request) throws TranslatorError { var session = new Soup.SessionSync (); session.timeout = GlobalSettings.SERVER_RESPOND_TIMEOUT; session.proxy_uri = GlobalSettings.getProxyUri(); @@ -16,7 +21,11 @@ public class WebJsonClient : GLib.Object { var url = new Soup.URI(request); var message = new Soup.Message.from_uri ("GET", url); - var status = session.send_message (message); + var status = session.send_message(message); + if (status == NO_CONNECTION) { + throw new TranslatorError.NoConnection(_("No connection to server")); + } + var mess = (string)message.response_body.data; parser.load_from_data (mess); return parser.get_root ().get_object (); diff --git a/src/utils/TranslatorError.vala b/src/utils/TranslatorError.vala new file mode 100644 index 0000000..1e66cc5 --- /dev/null +++ b/src/utils/TranslatorError.vala @@ -0,0 +1,5 @@ +/// Exceptions +public errordomain TranslatorError { + /// No connection error + NoConnection; +} \ No newline at end of file