From 6b845760d10d96c5cc82cf55851079fc292d73f0 Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Tue, 13 Mar 2018 14:39:02 +0300 Subject: [PATCH 01/10] Remove selection dialogs --- meson.build | 4 +++- src/TransporterWindow.vala | 46 ++++++++++++++------------------------ src/Utils.vala | 5 +++++ src/View/DropView.vala | 12 ++++++++++ src/View/WelcomeView.vala | 15 +++++-------- 5 files changed, 42 insertions(+), 40 deletions(-) create mode 100644 src/Utils.vala create mode 100644 src/View/DropView.vala diff --git a/meson.build b/meson.build index f32b998..09e4383 100644 --- a/meson.build +++ b/meson.build @@ -13,11 +13,13 @@ executable( 'src/Transporter.vala', 'src/TransporterWindow.vala', 'src/Settings.vala', + 'src/Utils.vala', 'src/WormholeInterface.vala', 'src/View/InstallView.vala', + 'src/View/WelcomeView.vala', 'src/View/ReceiveView.vala', 'src/View/SendView.vala', - 'src/View/WelcomeView.vala', + 'src/View/DropView.vala', 'src/View/SettingsView.vala', dependencies: [ dependency('gtk+-3.0'), diff --git a/src/TransporterWindow.vala b/src/TransporterWindow.vala index 2a882fe..a9e1569 100644 --- a/src/TransporterWindow.vala +++ b/src/TransporterWindow.vala @@ -7,7 +7,7 @@ public class TransporterWindow: Gtk.Dialog { Button settings_button; Spinner spinner; - Widget currScreen; + Widget current_screen; Widget[] screens; public WormholeInterface wormhole; @@ -67,22 +67,22 @@ public class TransporterWindow: Gtk.Dialog { headerbar.show (); } - private void updateWindow(){ - back_button.visible = !(currScreen is WelcomeView) && screens.length > 1; - settings_button.visible = currScreen is WelcomeView; + private void update_header(){ + back_button.visible = !(current_screen is WelcomeView) && screens.length > 1; + settings_button.visible = current_screen is WelcomeView; } public void addScreen(Widget screen){ var box = get_content_area () as Gtk.Box; - if(screens.length > 0 && currScreen != null) - box.remove (currScreen); + if(screens.length > 0 && current_screen != null) + box.remove (current_screen); screens += screen; - currScreen = screen; - box.add (currScreen); - currScreen.show (); - updateWindow (); + current_screen = screen; + box.add (current_screen); + current_screen.show (); + update_header (); } public void prevScreen(){ @@ -113,33 +113,21 @@ public class TransporterWindow: Gtk.Dialog { return; var box = get_content_area () as Gtk.Box; - box.remove (currScreen); + box.remove (current_screen); screens.resize (screens.length - 1); - currScreen = screens[screens.length - 1]; - box.add (currScreen); - currScreen.show (); - updateWindow (); + current_screen = screens[screens.length - 1]; + box.add (current_screen); + current_screen.show (); + update_header (); } public void replaceScreen(Widget screen){ var box = get_content_area () as Gtk.Box; - box.remove (currScreen); - currScreen = null; + box.remove (current_screen); + current_screen = null; screens = {}; addScreen (screen); } - public Gtk.FileChooserDialog getFileChooser(){ - return new Gtk.FileChooserDialog ( - _("Select files or a folder to send"), - this, - Gtk.FileChooserAction.OPEN, - _("_Cancel"), - Gtk.ResponseType.CANCEL, - _("_Open"), - Gtk.ResponseType.ACCEPT - ); - } - } \ No newline at end of file diff --git a/src/Utils.vala b/src/Utils.vala new file mode 100644 index 0000000..dcf5112 --- /dev/null +++ b/src/Utils.vala @@ -0,0 +1,5 @@ +public class Utils{ + + + +} \ No newline at end of file diff --git a/src/View/DropView.vala b/src/View/DropView.vala new file mode 100644 index 0000000..3cd73aa --- /dev/null +++ b/src/View/DropView.vala @@ -0,0 +1,12 @@ +public class DropView : Gtk.EventBox { + + protected WormholeInterface wormhole; + + construct { + } + + public DropView(WormholeInterface wormhole){ + this.wormhole = wormhole; + } + +} \ No newline at end of file diff --git a/src/View/WelcomeView.vala b/src/View/WelcomeView.vala index 562b6a2..71cef9b 100644 --- a/src/View/WelcomeView.vala +++ b/src/View/WelcomeView.vala @@ -10,16 +10,11 @@ public class WelcomeView : Gtk.Grid { welcome.activated.connect ((index) => { switch (index) { case 0: - var chooser = window.getFileChooser (); - if (chooser.run () == Gtk.ResponseType.ACCEPT) { - var file = chooser.get_filename (); - var display = window.get_display (); - var clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD); - - window.addScreen (new SendView (window.wormhole, clipboard)); - window.wormhole.send (file); - } - chooser.close (); + // var file = chooser.get_filename (); + // var display = window.get_display (); + // var clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD); + window.addScreen (new DropView (window.wormhole)); + //window.wormhole.send (file); break; case 1: window.addScreen (new ReceiveView (window.wormhole)); From c715550ccabfc8d610ce38f4454523c8c8b2cfe1 Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Tue, 13 Mar 2018 15:51:25 +0300 Subject: [PATCH 02/10] Add minimum window size --- src/TransporterWindow.vala | 11 +++++------ src/View/DropView.vala | 31 ++++++++++++++++++++++++++++++- src/View/SettingsView.vala | 9 ++++----- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/TransporterWindow.vala b/src/TransporterWindow.vala index a9e1569..fbee20a 100644 --- a/src/TransporterWindow.vala +++ b/src/TransporterWindow.vala @@ -16,11 +16,9 @@ public class TransporterWindow: Gtk.Dialog { Object (application: application, icon_name: "com.github.bleakgrey.transporter", title: "Transporter", - resizable: false, - width_request: 470, - height_request: 470 + resizable: false ); - this.wormhole = new WormholeInterface(); + this.wormhole = new WormholeInterface (); this.window_position = WindowPosition.CENTER; this.set_titlebar (headerbar); @@ -38,13 +36,14 @@ public class TransporterWindow: Gtk.Dialog { }); if(wormhole.bin_present ()) - addScreen(new WelcomeView (this)); + addScreen (new WelcomeView (this)); else - addScreen(new InstallView (this, wormhole)); + addScreen (new InstallView (this, wormhole)); } construct{ get_style_context ().add_class (Gtk.STYLE_CLASS_FLAT); + get_content_area ().set_size_request (400, 400); spinner = new Gtk.Spinner (); spinner.active = true; diff --git a/src/View/DropView.vala b/src/View/DropView.vala index 3cd73aa..5d4cbae 100644 --- a/src/View/DropView.vala +++ b/src/View/DropView.vala @@ -1,8 +1,37 @@ -public class DropView : Gtk.EventBox { +public class DropView : Gtk.Box { + + private string STYLE = """ + .drop{ + border: 2px dashed rgba(0,0,0,.25); + border-radius: 5px; + padding: 32px; + } + """; protected WormholeInterface wormhole; construct { + Granite.Widgets.Utils.set_theming_for_screen ( + this.get_screen(), + STYLE, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION + ); + + this.border_width = 10; + + var drop = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); + drop.hexpand = true; + drop.vexpand = true; + drop.get_style_context().add_class("drop"); + + var title = new Gtk.Label (_("Drag files and folders here")); + title.get_style_context ().add_class ("h2"); + title.hexpand = true; + title.vexpand = true; + drop.add (title); + + add (drop); + show_all (); } public DropView(WormholeInterface wormhole){ diff --git a/src/View/SettingsView.vala b/src/View/SettingsView.vala index 91ec6bb..dc9d758 100644 --- a/src/View/SettingsView.vala +++ b/src/View/SettingsView.vala @@ -5,20 +5,19 @@ public class SettingsView : Gtk.Grid { column_spacing = 12; row_spacing = 6; margin = 6; - width_request = 400; attach (new Granite.HeaderLabel (_("Servers")), 0, 0, 2, 1); - attach (new SettingsLabel (_("Relay Server:")), 0, 1, 1, 1); + attach (new SettingsLabel (_("Relay:")), 0, 1, 1, 1); attach (new SettingsEntry ("server-relay"), 1, 1, 1, 1); - attach (new SettingsLabel (_("Transit Server:")), 0, 3, 1, 1); + attach (new SettingsLabel (_("Transit:")), 0, 3, 1, 1); attach (new SettingsEntry ("server-transit"), 1, 3, 1, 1); attach (new Granite.HeaderLabel (_("Miscellaneous")), 0, 4, 2, 1); - attach (new SettingsLabel (_("ID Word Length:")), 0, 5, 1, 1); + attach (new SettingsLabel (_("ID Length:")), 0, 5, 1, 1); var words = new Gtk.SpinButton.with_range (2, 5, 1); settings.schema.bind ("words", words, "value", SettingsBindFlags.DEFAULT); attach (words, 1, 5, 1, 1); - attach (new SettingsLabel (_("Play Sounds:")), 0, 6, 1, 1); + attach (new SettingsLabel (_("Sounds:")), 0, 6, 1, 1); attach (new SettingsSwitch ("ding"), 1, 6, 1, 1); show_all (); From b4f9ec618f0114d266022e1c85bd794fc44ef584 Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Tue, 13 Mar 2018 16:33:28 +0300 Subject: [PATCH 03/10] Add drag and drop support --- src/Utils.vala | 7 +++++++ src/View/DropView.vala | 40 ++++++++++++++++++++++++++++++++++---- src/WormholeInterface.vala | 2 +- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/Utils.vala b/src/Utils.vala index dcf5112..66af0c7 100644 --- a/src/Utils.vala +++ b/src/Utils.vala @@ -1,5 +1,12 @@ public class Utils{ + public static string get_send_path(string[] uris){ + foreach (string uri in uris) { + uri = uri.replace ("%20", " ").replace ("file://", ""); + warning (uri); + } + return ""; + } } \ No newline at end of file diff --git a/src/View/DropView.vala b/src/View/DropView.vala index 5d4cbae..61fec81 100644 --- a/src/View/DropView.vala +++ b/src/View/DropView.vala @@ -1,30 +1,40 @@ +using Gtk; +using Gdk; + public class DropView : Gtk.Box { - private string STYLE = """ + private const string STYLE = """ .drop{ border: 2px dashed rgba(0,0,0,.25); border-radius: 5px; padding: 32px; } """; + private const Gtk.TargetEntry[] targets = { + {"text/uri-list",0,0} + }; + private const string DRAG_TEXT = _("Drag files and folders here"); + private const string DROP_TEXT = _("Drop to send"); + + private Gtk.Label title; protected WormholeInterface wormhole; construct { Granite.Widgets.Utils.set_theming_for_screen ( - this.get_screen(), + get_screen(), STYLE, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ); - this.border_width = 10; + border_width = 10; var drop = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); drop.hexpand = true; drop.vexpand = true; drop.get_style_context().add_class("drop"); - var title = new Gtk.Label (_("Drag files and folders here")); + title = new Gtk.Label (DRAG_TEXT); title.get_style_context ().add_class ("h2"); title.hexpand = true; title.vexpand = true; @@ -32,10 +42,32 @@ public class DropView : Gtk.Box { add (drop); show_all (); + + Gtk.drag_dest_set (this, Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY); + drag_motion.connect (this.on_drag_motion); + drag_leave.connect (this.on_drag_leave); + drag_data_received.connect (this.on_drag_data_received); } public DropView(WormholeInterface wormhole){ this.wormhole = wormhole; } + private bool on_drag_motion (DragContext context, int x, int y, uint time){ + title.label = DROP_TEXT; + return false; + } + + private void on_drag_leave (DragContext context, uint time) { + title.label = DRAG_TEXT; + } + + private void on_drag_data_received (Gdk.DragContext drag_context, int x, int y, Gtk.SelectionData data, uint info, uint time){ + title.label = _("One moment..."); + Gtk.drag_finish (drag_context, true, false, time); + + var path = Utils.get_send_path (data.get_uris ()); + warning(path); + } + } \ No newline at end of file diff --git a/src/WormholeInterface.vala b/src/WormholeInterface.vala index 2da4ec5..5994559 100644 --- a/src/WormholeInterface.vala +++ b/src/WormholeInterface.vala @@ -24,7 +24,7 @@ public class WormholeInterface : Object { public const string ERR_MISMATCHED_ID = "confirmation failed"; public const string ERR_RELAY_UNRESPONSIVE = "We had a problem connecting to the relay"; public const string ID_GENERATED = "wormhole receive"; - public const string FINISH_RECEIVE = "Received file written"; + public const string FINISH_RECEIVE = "written"; public const string PERCENT_RECEIVE = "%|"; construct{ From f54456a052c8284ee3ea481aaf70a1e51d172825 Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Tue, 13 Mar 2018 18:11:22 +0300 Subject: [PATCH 04/10] Handle selected file types --- src/TransporterWindow.vala | 2 +- src/Utils.vala | 50 +++++++++++++++++++++++++++++++++++--- src/View/DropView.vala | 6 +++-- src/View/InstallView.vala | 7 ++---- src/View/ReceiveView.vala | 7 ++++-- src/View/SendView.vala | 4 +-- src/View/WelcomeView.vala | 10 +++++--- 7 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/TransporterWindow.vala b/src/TransporterWindow.vala index fbee20a..28600b4 100644 --- a/src/TransporterWindow.vala +++ b/src/TransporterWindow.vala @@ -38,7 +38,7 @@ public class TransporterWindow: Gtk.Dialog { if(wormhole.bin_present ()) addScreen (new WelcomeView (this)); else - addScreen (new InstallView (this, wormhole)); + addScreen (new InstallView (this)); } construct{ diff --git a/src/Utils.vala b/src/Utils.vala index 66af0c7..fe5a98d 100644 --- a/src/Utils.vala +++ b/src/Utils.vala @@ -1,12 +1,56 @@ public class Utils{ + private static string dir = null; + public static string get_send_path(string[] uris){ + int files = 0; + int dirs = 0; + string[] paths = {}; + foreach (string uri in uris) { - uri = uri.replace ("%20", " ").replace ("file://", ""); - warning (uri); + var path = uri.replace ("%20", " ").replace ("file://", ""); + paths += path; + + if(is_path_directory (path)) + dirs++; + else + files++; } - return ""; + info("Sending %d files and %d directories".printf(files, dirs)); + + if(uris.length == 1 && files == 1) + return paths[0]; + else if(uris.length == 1 && dirs == 1) + return paths[0]; + else + return get_temp_path(paths); + } + + public static bool is_path_directory(string path){ + string stdout = ""; + Process.spawn_sync ( + "/", + {"file", "-b", "--mime-type", path}, + Environ.get (), + SpawnFlags.SEARCH_PATH, + null, + out stdout, + null, + null); + + return "directory" in stdout; + } + + private static string get_temp_path(string[] paths){ + if(dir == null){ + dir = "/tmp/TRANSPORT-0"; + Process.spawn_command_line_sync ("mkdir " + dir); + info("Creating symlinks at: "+dir); + } + + warning(dir); + return dir; } } \ No newline at end of file diff --git a/src/View/DropView.vala b/src/View/DropView.vala index 61fec81..b191481 100644 --- a/src/View/DropView.vala +++ b/src/View/DropView.vala @@ -18,6 +18,7 @@ public class DropView : Gtk.Box { private Gtk.Label title; + protected TransporterWindow window; protected WormholeInterface wormhole; construct { @@ -49,8 +50,9 @@ public class DropView : Gtk.Box { drag_data_received.connect (this.on_drag_data_received); } - public DropView(WormholeInterface wormhole){ - this.wormhole = wormhole; + public DropView(TransporterWindow window){ + this.window = window; + this.wormhole = window.wormhole; } private bool on_drag_motion (DragContext context, int x, int y, uint time){ diff --git a/src/View/InstallView.vala b/src/View/InstallView.vala index ef66ca2..364d2ba 100644 --- a/src/View/InstallView.vala +++ b/src/View/InstallView.vala @@ -1,10 +1,7 @@ public class InstallView : ReceiveView { - private TransporterWindow window; - - public InstallView(TransporterWindow window, WormholeInterface wormhole){ - base (wormhole); - this.window = window; + public InstallView(TransporterWindow window){ + base (window); } protected override void setup(){ diff --git a/src/View/ReceiveView.vala b/src/View/ReceiveView.vala index e28a70e..8d507d9 100644 --- a/src/View/ReceiveView.vala +++ b/src/View/ReceiveView.vala @@ -1,6 +1,8 @@ public class ReceiveView : Gtk.EventBox { protected bool is_finished = false; + + protected TransporterWindow window; protected WormholeInterface wormhole; protected Gtk.Label title_label; @@ -46,8 +48,9 @@ public class ReceiveView : Gtk.EventBox { show_all (); } - public ReceiveView(WormholeInterface wormhole){ - this.wormhole = wormhole; + public ReceiveView(TransporterWindow window){ + this.window = window; + this.wormhole = window.wormhole; this.setup (); } diff --git a/src/View/SendView.vala b/src/View/SendView.vala index f85d07c..0d989dc 100644 --- a/src/View/SendView.vala +++ b/src/View/SendView.vala @@ -2,8 +2,8 @@ public class SendView : ReceiveView { protected Gtk.Clipboard clipboard; - public SendView(WormholeInterface wormhole, Gtk.Clipboard clipboard){ - base (wormhole); + public SendView(TransporterWindow window, Gtk.Clipboard clipboard){ + base (window); this.clipboard = clipboard; } diff --git a/src/View/WelcomeView.vala b/src/View/WelcomeView.vala index 71cef9b..73aee59 100644 --- a/src/View/WelcomeView.vala +++ b/src/View/WelcomeView.vala @@ -1,6 +1,7 @@ public class WelcomeView : Gtk.Grid { - TransporterWindow window; + protected TransporterWindow window; + protected WormholeInterface wormhole; construct { var welcome = new Granite.Widgets.Welcome (_("Welcome to Transporter"), _("What would you like to do?")); @@ -13,15 +14,15 @@ public class WelcomeView : Gtk.Grid { // var file = chooser.get_filename (); // var display = window.get_display (); // var clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD); - window.addScreen (new DropView (window.wormhole)); + window.addScreen (new DropView (window)); //window.wormhole.send (file); break; case 1: - window.addScreen (new ReceiveView (window.wormhole)); + window.addScreen (new ReceiveView (window)); break; case 2: try{ - AppInfo.launch_default_for_uri ("file://" + window.wormhole.downloads_path, null); + AppInfo.launch_default_for_uri ("file://" + wormhole.downloads_path, null); } catch(GLib.Error e){ warning(e.message); @@ -38,6 +39,7 @@ public class WelcomeView : Gtk.Grid { public WelcomeView(TransporterWindow window){ this.window = window; + this.wormhole = window.wormhole; } } \ No newline at end of file From a973f43a8ed7db30064ad2408e3143fe5dee5e22 Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Tue, 13 Mar 2018 21:01:16 +0300 Subject: [PATCH 05/10] Implement #14 --- debian/control | 2 +- src/Utils.vala | 49 ++++++++++++++++++++++++++++++-------- src/View/DropView.vala | 9 +++++-- src/View/InstallView.vala | 2 +- src/View/SendView.vala | 1 + src/View/WelcomeView.vala | 4 ---- src/WormholeInterface.vala | 16 +++++++++++-- 7 files changed, 63 insertions(+), 20 deletions(-) diff --git a/debian/control b/debian/control index c8f28de..29163cd 100644 --- a/debian/control +++ b/debian/control @@ -12,6 +12,6 @@ Standards-Version: 3.9.3 Package: com.github.bleakgrey.transporter Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, python-pip, build-essential, python-dev, libffi-dev, libssl-dev +Depends: ${misc:Depends}, ${shlibs:Depends}, python-pip, build-essential, python-dev, libffi-dev, libssl-dev, zip Description: Simple file transfer A magic-wormhole client that makes file transfer between computers a breeze. diff --git a/src/Utils.vala b/src/Utils.vala index fe5a98d..ca50b3d 100644 --- a/src/Utils.vala +++ b/src/Utils.vala @@ -1,6 +1,7 @@ public class Utils{ - private static string dir = null; + private static const string dir = "/tmp/Transporter"; + private static string zip = null; public static string get_send_path(string[] uris){ int files = 0; @@ -8,10 +9,10 @@ public class Utils{ string[] paths = {}; foreach (string uri in uris) { - var path = uri.replace ("%20", " ").replace ("file://", ""); + var path = GLib.Filename.from_uri(uri); paths += path; - if(is_path_directory (path)) + if(is_directory (path)) dirs++; else files++; @@ -27,7 +28,7 @@ public class Utils{ return get_temp_path(paths); } - public static bool is_path_directory(string path){ + public static bool is_directory(string path){ string stdout = ""; Process.spawn_sync ( "/", @@ -43,14 +44,42 @@ public class Utils{ } private static string get_temp_path(string[] paths){ - if(dir == null){ - dir = "/tmp/TRANSPORT-0"; - Process.spawn_command_line_sync ("mkdir " + dir); - info("Creating symlinks at: "+dir); + info ("Preparing zip file at: "+dir); + clean_temp(); + + //Create temp folder + zip = "Transfer-" + new GLib.DateTime.now_local ().to_unix ().to_string (); + var zip_path = "%s/%s".printf(dir, zip); + Process.spawn_command_line_sync ("mkdir " + dir); + + //Create symlinks for each file + foreach (string path in paths) { + info ("Linking: " + path); + Process.spawn_sync ( + dir, {"ln", "-s", path}, + Environ.get (), + SpawnFlags.SEARCH_PATH, null, null, null, null); } - warning(dir); - return dir; + //Zip them up + Process.spawn_sync ( + dir, + {"zip", "-r", zip+".zip", "."}, + Environ.get (), + SpawnFlags.SEARCH_PATH, + null, + null, + null, + null); + + return zip_path+".zip"; + } + + public static void clean_temp(){ + if(dir != null && dir != "/"){ + info("Cleaning up temporary files"); + Process.spawn_command_line_async ("rm -rf /tmp/Transporter"); + } } } \ No newline at end of file diff --git a/src/View/DropView.vala b/src/View/DropView.vala index b191481..1c0d221 100644 --- a/src/View/DropView.vala +++ b/src/View/DropView.vala @@ -53,6 +53,8 @@ public class DropView : Gtk.Box { public DropView(TransporterWindow window){ this.window = window; this.wormhole = window.wormhole; + + wormhole.closed.connect(() => title.label = DRAG_TEXT); } private bool on_drag_motion (DragContext context, int x, int y, uint time){ @@ -65,11 +67,14 @@ public class DropView : Gtk.Box { } private void on_drag_data_received (Gdk.DragContext drag_context, int x, int y, Gtk.SelectionData data, uint info, uint time){ - title.label = _("One moment..."); Gtk.drag_finish (drag_context, true, false, time); + title.label = _("One moment..."); var path = Utils.get_send_path (data.get_uris ()); - warning(path); + var display = window.get_display (); + var clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD); + window.addScreen (new SendView (window, clipboard)); + window.wormhole.send (path); } } \ No newline at end of file diff --git a/src/View/InstallView.vala b/src/View/InstallView.vala index 364d2ba..a42730e 100644 --- a/src/View/InstallView.vala +++ b/src/View/InstallView.vala @@ -14,7 +14,7 @@ public class InstallView : ReceiveView { }); if(Thread.supported ()){ - var thread = new Thread.try ("InstallThread", () => { + new Thread.try ("InstallThread", () => { wormhole.install (); return false; }); diff --git a/src/View/SendView.vala b/src/View/SendView.vala index 0d989dc..76bad7c 100644 --- a/src/View/SendView.vala +++ b/src/View/SendView.vala @@ -33,6 +33,7 @@ public class SendView : ReceiveView { title_label.set_text (_("Transfer Complete")); subtitle_label.set_text (_("Connection has been closed")); wormhole.ding(); + Utils.clean_temp(); }); } diff --git a/src/View/WelcomeView.vala b/src/View/WelcomeView.vala index 73aee59..839d2ec 100644 --- a/src/View/WelcomeView.vala +++ b/src/View/WelcomeView.vala @@ -11,11 +11,7 @@ public class WelcomeView : Gtk.Grid { welcome.activated.connect ((index) => { switch (index) { case 0: - // var file = chooser.get_filename (); - // var display = window.get_display (); - // var clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD); window.addScreen (new DropView (window)); - //window.wormhole.send (file); break; case 1: window.addScreen (new ReceiveView (window)); diff --git a/src/WormholeInterface.vala b/src/WormholeInterface.vala index 5994559..c5c0c9e 100644 --- a/src/WormholeInterface.vala +++ b/src/WormholeInterface.vala @@ -20,9 +20,11 @@ public class WormholeInterface : Object { public const string ERR_INVALID_ID = "reenter the key"; public const string ERR_CROWDED = "crowded"; public const string ERR_REJECTED = "transfer rejected"; + public const string ERR_NOT_FOUND = "no file/directory"; public const string ERR_ALREADY_EXISTS = "overwrite existing"; public const string ERR_MISMATCHED_ID = "confirmation failed"; public const string ERR_RELAY_UNRESPONSIVE = "We had a problem connecting to the relay"; + public const string ERR_UNREADABLE = "file you wanted to send couldn't be read"; public const string ID_GENERATED = "wormhole receive"; public const string FINISH_RECEIVE = "written"; public const string PERCENT_RECEIVE = "%|"; @@ -200,12 +202,12 @@ public class WormholeInterface : Object { return false; } if(ERR_ALREADY_EXISTS in line){ - errored (_("Received file already exists in Downloads folder."), _("File Conflict")); + errored (_("Received file already exists in Downloads folder."), _("I/O Error")); close (); return false; } if(ERR_ALREADY_EXISTS in line){ - errored (_("Received file already exists in Downloads folder."), _("File Conflict")); + errored (_("Received file already exists in Downloads folder."), _("I/O Error")); close (); return false; } @@ -214,6 +216,16 @@ public class WormholeInterface : Object { close (); return false; } + if(ERR_UNREADABLE in line){ + errored (_("Please make sure selected files do not contain special characters in their paths and names."), _("I/O Error")); + close (); + return false; + } + if(ERR_NOT_FOUND in line){ + errored (_("Archive creation failed, perhaps your disk is running out of space."), _("I/O Error")); + close (); + return false; + } if(PERCENT_RECEIVE in line){ var percent = line.split ("%", 2) [0]; From a30e1240067ec59b981f50c7083508bacda3cc1e Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Tue, 13 Mar 2018 21:16:04 +0300 Subject: [PATCH 06/10] Update screenshots --- data/screenshot.png | Bin 36436 -> 36843 bytes data/screenshot2.png | Bin 0 -> 14489 bytes data/screenshot3.png | Bin 0 -> 18050 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/screenshot2.png create mode 100644 data/screenshot3.png diff --git a/data/screenshot.png b/data/screenshot.png index 95d07d4234deea3faf5f2043d67c83def7e85347..eecf8725b23253f416486a78fd6cde8ad6dce93f 100644 GIT binary patch literal 36843 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 literal 36436 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 IP0XqM2kv%hLI3~& diff --git a/data/screenshot2.png b/data/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..0000a6a11632dd076b02b4603a5f943ac281ab00 GIT binary patch literal 14489 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 literal 0 HcmV?d00001 diff --git a/data/screenshot3.png b/data/screenshot3.png new file mode 100644 index 0000000000000000000000000000000000000000..b2beda8cb92f5c597457afb6d8e1d29040683b2c GIT binary patch literal 18050 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ξ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 UEc;zm{|ck6uBTS6ViWe?0J}?d(f|Me literal 0 HcmV?d00001 From 9a6ad02f40faabb1c1a4c1e6ff88e0a7d5f0bb7c Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Wed, 14 Mar 2018 15:11:58 +0300 Subject: [PATCH 07/10] Destroy unnecessary views --- src/TransporterWindow.vala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/TransporterWindow.vala b/src/TransporterWindow.vala index 28600b4..ec0fcb9 100644 --- a/src/TransporterWindow.vala +++ b/src/TransporterWindow.vala @@ -114,6 +114,7 @@ public class TransporterWindow: Gtk.Dialog { box.remove (current_screen); screens.resize (screens.length - 1); + current_screen.destroy(); current_screen = screens[screens.length - 1]; box.add (current_screen); current_screen.show (); From c4c644157a65993f36043f8e0d0171bf96ca96bd Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Wed, 14 Mar 2018 15:15:19 +0300 Subject: [PATCH 08/10] Remove DropView when sending files --- src/View/DropView.vala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/View/DropView.vala b/src/View/DropView.vala index 1c0d221..df7e261 100644 --- a/src/View/DropView.vala +++ b/src/View/DropView.vala @@ -73,6 +73,7 @@ public class DropView : Gtk.Box { var path = Utils.get_send_path (data.get_uris ()); var display = window.get_display (); var clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD); + window.prevScreen(); window.addScreen (new SendView (window, clipboard)); window.wormhole.send (path); } From d7385c1383de422136e2610d3837884bd2cedeec Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Wed, 14 Mar 2018 16:13:11 +0300 Subject: [PATCH 09/10] Clean up and handle errors --- src/Utils.vala | 26 +++++++++++++++++++------- src/View/DropView.vala | 26 ++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/Utils.vala b/src/Utils.vala index ca50b3d..e96e775 100644 --- a/src/Utils.vala +++ b/src/Utils.vala @@ -1,6 +1,6 @@ public class Utils{ - private static const string dir = "/tmp/Transporter"; + private const string dir = "/tmp/Transporter"; private static string zip = null; public static string get_send_path(string[] uris){ @@ -25,7 +25,7 @@ public class Utils{ else if(uris.length == 1 && dirs == 1) return paths[0]; else - return get_temp_path(paths); + return get_archive_path(paths); } public static bool is_directory(string path){ @@ -43,14 +43,23 @@ public class Utils{ return "directory" in stdout; } - private static string get_temp_path(string[] paths){ + // magic-wormhole doesn't support multiple file sending or + // when directory contains symlinks to other directories. + // + // That's why we have to create an archive. + private static string get_archive_path(string[] paths){ info ("Preparing zip file at: "+dir); clean_temp(); //Create temp folder zip = "Transfer-" + new GLib.DateTime.now_local ().to_unix ().to_string (); var zip_path = "%s/%s".printf(dir, zip); - Process.spawn_command_line_sync ("mkdir " + dir); + try{ + Process.spawn_command_line_sync ("mkdir " + dir); + } + catch(GLib.SpawnError e){ + warning(e.message); + } //Create symlinks for each file foreach (string path in paths) { @@ -76,9 +85,12 @@ public class Utils{ } public static void clean_temp(){ - if(dir != null && dir != "/"){ - info("Cleaning up temporary files"); - Process.spawn_command_line_async ("rm -rf /tmp/Transporter"); + info("Cleaning up temporary files"); + try{ + Process.spawn_command_line_sync ("rm -rf "+dir); + } + catch(GLib.SpawnError e){ + warning(e.message); } } diff --git a/src/View/DropView.vala b/src/View/DropView.vala index df7e261..c187397 100644 --- a/src/View/DropView.vala +++ b/src/View/DropView.vala @@ -15,6 +15,7 @@ public class DropView : Gtk.Box { }; private const string DRAG_TEXT = _("Drag files and folders here"); private const string DROP_TEXT = _("Drop to send"); + private const string PREPARE_TEXT = _("Preparing files..."); private Gtk.Label title; @@ -68,14 +69,31 @@ public class DropView : Gtk.Box { private void on_drag_data_received (Gdk.DragContext drag_context, int x, int y, Gtk.SelectionData data, uint info, uint time){ Gtk.drag_finish (drag_context, true, false, time); - title.label = _("One moment..."); - var path = Utils.get_send_path (data.get_uris ()); - var display = window.get_display (); + var display = window.get_display (); var clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD); window.prevScreen(); window.addScreen (new SendView (window, clipboard)); - window.wormhole.send (path); + title.label = PREPARE_TEXT; + + var uris = data.get_uris (); + try{ + if(Thread.supported ()){ + new Thread.try ("PackThread", () => { + var path = Utils.get_send_path (uris); + wormhole.send (path); + return false; + }); + } + else{ + var path = Utils.get_send_path (uris); + wormhole.send (path); + } + } + catch(Error e){ + warning(e.message); + wormhole.errored(e.message, _("Internal Error"), true); + } } } \ No newline at end of file From 2964b5273a667f7b07e2ca23c3ac9af371578378 Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Wed, 14 Mar 2018 16:41:26 +0300 Subject: [PATCH 10/10] Bump version --- README.md | 5 +- ...ithub.bleakgrey.transporter.appdata.xml.in | 15 ++ debian/changelog | 4 +- debian/control | 2 +- debian/copyright | 2 +- po/POTFILES | 3 +- po/com.github.bleakgrey.transporter.pot | 117 ++++++++------- po/ru.po | 138 ++++++++++-------- src/Transporter.vala | 2 +- src/View/DropView.vala | 2 - 10 files changed, 167 insertions(+), 123 deletions(-) diff --git a/README.md b/README.md index 1c8bb82..fdade9a 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,11 @@ You'll need some dependencies to build: And you'll need these to actually run [magic-wormhole](https://github.com/warner/magic-wormhole): * build-essential -* python-pip -* python-dev * libffi-dev * libssl-dev +* python-pip +* python-dev +* zip Run these commands to configure the build environment: diff --git a/data/com.github.bleakgrey.transporter.appdata.xml.in b/data/com.github.bleakgrey.transporter.appdata.xml.in index 8cfb40e..7771c23 100644 --- a/data/com.github.bleakgrey.transporter.appdata.xml.in +++ b/data/com.github.bleakgrey.transporter.appdata.xml.in @@ -28,9 +28,24 @@ https://raw.githubusercontent.com/bleakgrey/transporter/master/data/screenshot.png + + https://raw.githubusercontent.com/bleakgrey/transporter/master/data/screenshot2.png + + + https://raw.githubusercontent.com/bleakgrey/transporter/master/data/screenshot3.png + + + ​ + ​

    +
  • Folders and multiple files support
  • +
  • Improved UI
  • +
  • Updated locales
  • +
+ ​ + ​
    diff --git a/debian/changelog b/debian/changelog index 8bf5704..e9e1c54 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,6 @@ -transporter (1.1.1) xenial; urgency=low +transporter (1.2.0) xenial; urgency=low * Minor UI tweaks * Corrected typos - -- Glushchenko Artyom Tue, 27 Feb 2018 10:00:00 -0500 \ No newline at end of file + -- bleak_grey Tue, 27 Feb 2018 10:00:00 -0500 \ No newline at end of file diff --git a/debian/control b/debian/control index 29163cd..6fb10d1 100644 --- a/debian/control +++ b/debian/control @@ -1,7 +1,7 @@ Source: com.github.bleakgrey.transporter Section: x11 Priority: extra -Maintainer: Glushchenko Artyom +Maintainer: bleak_grey Build-Depends: meson, libgranite-dev, debhelper (>= 9), diff --git a/debian/copyright b/debian/copyright index f667107..0f47082 100644 --- a/debian/copyright +++ b/debian/copyright @@ -3,7 +3,7 @@ Upstream-Name: transporter Source: https://github.com/bleakgrey/transporter Files: * -Copyright: 2013 elementary LLC. +Copyright: 2018 bleak_grey License: GPL-3.0+ License: GPL-3.0+ diff --git a/po/POTFILES b/po/POTFILES index a9d7eb3..4fa61a6 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -5,4 +5,5 @@ src/View/InstallView.vala src/View/ReceiveView.vala src/View/SendView.vala src/View/WelcomeView.vala -src/View/SettingsView.vala \ No newline at end of file +src/View/SettingsView.vala +src/View/DropView.vala \ No newline at end of file diff --git a/po/com.github.bleakgrey.transporter.pot b/po/com.github.bleakgrey.transporter.pot index acd7897..0c26a4c 100644 --- a/po/com.github.bleakgrey.transporter.pot +++ b/po/com.github.bleakgrey.transporter.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: com.github.bleakgrey.transporter\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-11 15:05+0300\n" +"POT-Creation-Date: 2018-03-14 16:26+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,103 +17,102 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: src/TransporterWindow.vala:52 +#: src/TransporterWindow.vala:51 msgid "Back" msgstr "" -#: src/TransporterWindow.vala:57 +#: src/TransporterWindow.vala:56 msgid "Settings" msgstr "" -#: src/TransporterWindow.vala:91 +#: src/TransporterWindow.vala:90 msgid "Are you sure you want to cancel transaction?" msgstr "" -#: src/TransporterWindow.vala:135 -msgid "Select files or a folder to send" -msgstr "" - -#: src/TransporterWindow.vala:138 -msgid "_Cancel" -msgstr "" - -#: src/TransporterWindow.vala:140 -msgid "_Open" -msgstr "" - #: src/WormholeInterface.vala:8 msgid "Error" msgstr "" -#: src/WormholeInterface.vala:64 src/WormholeInterface.vala:71 +#: src/WormholeInterface.vala:66 src/WormholeInterface.vala:73 msgid "Installation Error" msgstr "" -#: src/WormholeInterface.vala:71 +#: src/WormholeInterface.vala:73 msgid "Couldn't install magic-wormhole automatically." msgstr "" -#: src/WormholeInterface.vala:193 +#: src/WormholeInterface.vala:195 msgid "Please verify your ID and try again." msgstr "" -#: src/WormholeInterface.vala:193 +#: src/WormholeInterface.vala:195 msgid "Invalid ID" msgstr "" -#: src/WormholeInterface.vala:198 +#: src/WormholeInterface.vala:200 msgid "Server is crowded at the moment. " msgstr "" -#: src/WormholeInterface.vala:198 src/WormholeInterface.vala:213 +#: src/WormholeInterface.vala:200 src/WormholeInterface.vala:215 msgid "Server Error" msgstr "" -#: src/WormholeInterface.vala:203 src/WormholeInterface.vala:208 +#: src/WormholeInterface.vala:205 src/WormholeInterface.vala:210 msgid "Received file already exists in Downloads folder." msgstr "" -#: src/WormholeInterface.vala:203 src/WormholeInterface.vala:208 -msgid "File Conflict" +#: src/WormholeInterface.vala:205 src/WormholeInterface.vala:210 +#: src/WormholeInterface.vala:220 src/WormholeInterface.vala:225 +msgid "I/O Error" msgstr "" -#: src/WormholeInterface.vala:213 +#: src/WormholeInterface.vala:215 msgid "Relay server unresponsive." msgstr "" -#: src/View/InstallView.vala:11 +#: src/WormholeInterface.vala:220 +msgid "" +"Please make sure selected files do not contain special characters in their " +"paths and names." +msgstr "" + +#: src/WormholeInterface.vala:225 +msgid "Archive creation failed, perhaps your disk is running out of space." +msgstr "" + +#: src/View/InstallView.vala:8 msgid "Preparing Transporter" msgstr "" -#: src/View/InstallView.vala:12 +#: src/View/InstallView.vala:9 msgid "Installing magic-wormhole" msgstr "" -#: src/View/ReceiveView.vala:11 +#: src/View/ReceiveView.vala:13 msgid "Enter Transfer ID" msgstr "" -#: src/View/ReceiveView.vala:16 +#: src/View/ReceiveView.vala:18 msgid "Ask the sender to share it" msgstr "" -#: src/View/ReceiveView.vala:74 src/View/SendView.vala:33 +#: src/View/ReceiveView.vala:77 src/View/SendView.vala:33 msgid "Transfer Complete" msgstr "" -#: src/View/ReceiveView.vala:75 +#: src/View/ReceiveView.vala:78 msgid "Saved in your Downloads folder" msgstr "" -#: src/View/ReceiveView.vala:81 +#: src/View/ReceiveView.vala:84 msgid "Connection closed unexpectedly." msgstr "" -#: src/View/ReceiveView.vala:84 +#: src/View/ReceiveView.vala:87 msgid "Transferring: " msgstr "" -#: src/View/ReceiveView.vala:85 +#: src/View/ReceiveView.vala:88 msgid "Please wait a moment" msgstr "" @@ -137,58 +136,70 @@ msgstr "" msgid "Connection has been closed" msgstr "" -#: src/View/WelcomeView.vala:6 +#: src/View/WelcomeView.vala:7 msgid "Welcome to Transporter" msgstr "" -#: src/View/WelcomeView.vala:6 +#: src/View/WelcomeView.vala:7 msgid "What would you like to do?" msgstr "" -#: src/View/WelcomeView.vala:7 +#: src/View/WelcomeView.vala:8 msgid "Send Files" msgstr "" -#: src/View/WelcomeView.vala:7 +#: src/View/WelcomeView.vala:8 msgid "Upload data to another computer" msgstr "" -#: src/View/WelcomeView.vala:8 +#: src/View/WelcomeView.vala:9 msgid "Receive Files" msgstr "" -#: src/View/WelcomeView.vala:8 +#: src/View/WelcomeView.vala:9 msgid "Download data from another computer" msgstr "" -#: src/View/WelcomeView.vala:9 +#: src/View/WelcomeView.vala:10 msgid "Show Downloads" msgstr "" -#: src/View/WelcomeView.vala:9 +#: src/View/WelcomeView.vala:10 msgid "Open your Downloads folder" msgstr "" -#: src/View/SettingsView.vala:10 +#: src/View/SettingsView.vala:9 msgid "Servers" msgstr "" -#: src/View/SettingsView.vala:11 -msgid "Relay Server:" +#: src/View/SettingsView.vala:10 +msgid "Relay:" msgstr "" -#: src/View/SettingsView.vala:13 -msgid "Transit Server:" +#: src/View/SettingsView.vala:12 +msgid "Transit:" msgstr "" -#: src/View/SettingsView.vala:16 +#: src/View/SettingsView.vala:15 msgid "Miscellaneous" msgstr "" -#: src/View/SettingsView.vala:17 -msgid "ID Word Length:" +#: src/View/SettingsView.vala:16 +msgid "ID Length:" +msgstr "" + +#: src/View/SettingsView.vala:20 +msgid "Sounds:" +msgstr "" + +#: src/View/DropView.vala:16 +msgid "Drag files and folders here" +msgstr "" + +#: src/View/DropView.vala:17 +msgid "Drop to send" msgstr "" -#: src/View/SettingsView.vala:21 -msgid "Play Sounds:" +#: src/View/DropView.vala:93 +msgid "Internal Error" msgstr "" diff --git a/po/ru.po b/po/ru.po index a007757..d5fff1e 100644 --- a/po/ru.po +++ b/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: com.github.bleakgrey.transporter\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-11 15:05+0300\n" +"POT-Creation-Date: 2018-03-14 16:26+0300\n" "PO-Revision-Date: 2018-02-28 15:36+0300\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -18,106 +18,108 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: src/TransporterWindow.vala:52 +#: src/TransporterWindow.vala:51 msgid "Back" msgstr "Назад" -#: src/TransporterWindow.vala:57 +#: src/TransporterWindow.vala:56 msgid "Settings" msgstr "Настройки" -#: src/TransporterWindow.vala:91 +#: src/TransporterWindow.vala:90 msgid "Are you sure you want to cancel transaction?" msgstr "Вы уверены, что хотите отменить передачу?" -#: src/TransporterWindow.vala:135 -msgid "Select files or a folder to send" -msgstr "Выберите файлы или папку для отправки" - -#: src/TransporterWindow.vala:138 -msgid "_Cancel" -msgstr "_Отменить" - -#: src/TransporterWindow.vala:140 -msgid "_Open" -msgstr "_Выбрать" - #: src/WormholeInterface.vala:8 msgid "Error" msgstr "Ошибка" -#: src/WormholeInterface.vala:64 src/WormholeInterface.vala:71 +#: src/WormholeInterface.vala:66 src/WormholeInterface.vala:73 msgid "Installation Error" msgstr "Ошибка Установки" -#: src/WormholeInterface.vala:71 +#: src/WormholeInterface.vala:73 #, fuzzy msgid "Couldn't install magic-wormhole automatically." msgstr "Установить magic-wormhole автоматически не получилось." -#: src/WormholeInterface.vala:193 +#: src/WormholeInterface.vala:195 msgid "Please verify your ID and try again." msgstr "Пожалуйста, проверьте написание ID и попробуйте снова." -#: src/WormholeInterface.vala:193 +#: src/WormholeInterface.vala:195 msgid "Invalid ID" msgstr "Неправильный ID" -#: src/WormholeInterface.vala:198 +#: src/WormholeInterface.vala:200 msgid "Server is crowded at the moment. " msgstr "Сервер на данный момент перегружен." -#: src/WormholeInterface.vala:198 src/WormholeInterface.vala:213 +#: src/WormholeInterface.vala:200 src/WormholeInterface.vala:215 msgid "Server Error" msgstr "Ошибка Сервера" -#: src/WormholeInterface.vala:203 src/WormholeInterface.vala:208 +#: src/WormholeInterface.vala:205 src/WormholeInterface.vala:210 #, fuzzy msgid "Received file already exists in Downloads folder." msgstr "Сохранена в вашей папке Загрузок" -#: src/WormholeInterface.vala:203 src/WormholeInterface.vala:208 -msgid "File Conflict" -msgstr "Конфликт Файлов" +#: src/WormholeInterface.vala:205 src/WormholeInterface.vala:210 +#: src/WormholeInterface.vala:220 src/WormholeInterface.vala:225 +#, fuzzy +msgid "I/O Error" +msgstr "Файловая Ошибка" -#: src/WormholeInterface.vala:213 +#: src/WormholeInterface.vala:215 msgid "Relay server unresponsive." msgstr "Сервер-ретранслятор не отвечает." -#: src/View/InstallView.vala:11 +#: src/WormholeInterface.vala:220 +msgid "" +"Please make sure selected files do not contain special characters in their " +"paths and names." +msgstr "Пожалуйста, убедитесь, что имена файлов не содержат запрещённые знаки." + +#: src/WormholeInterface.vala:225 +msgid "Archive creation failed, perhaps your disk is running out of space." +msgstr "" +"Не получилось упаковать файлы. Возможно, у вас кончается свободное место на " +"диске." + +#: src/View/InstallView.vala:8 msgid "Preparing Transporter" msgstr "Подготовка Transporter" -#: src/View/InstallView.vala:12 +#: src/View/InstallView.vala:9 msgid "Installing magic-wormhole" msgstr "Установка magic-wormhole" -#: src/View/ReceiveView.vala:11 +#: src/View/ReceiveView.vala:13 msgid "Enter Transfer ID" msgstr "Введите ID Передачи" -#: src/View/ReceiveView.vala:16 +#: src/View/ReceiveView.vala:18 msgid "Ask the sender to share it" msgstr "Спросите его у отправителя" -#: src/View/ReceiveView.vala:74 src/View/SendView.vala:33 +#: src/View/ReceiveView.vala:77 src/View/SendView.vala:33 msgid "Transfer Complete" msgstr "Передача Завершена" -#: src/View/ReceiveView.vala:75 +#: src/View/ReceiveView.vala:78 msgid "Saved in your Downloads folder" msgstr "Сохранена в вашей папке Загрузок" -#: src/View/ReceiveView.vala:81 +#: src/View/ReceiveView.vala:84 #, fuzzy msgid "Connection closed unexpectedly." msgstr "Соединение неожиданно разорвано." -#: src/View/ReceiveView.vala:84 +#: src/View/ReceiveView.vala:87 msgid "Transferring: " msgstr "Передача: " -#: src/View/ReceiveView.vala:85 +#: src/View/ReceiveView.vala:88 msgid "Please wait a moment" msgstr "Пожалуйста, подождите" @@ -141,60 +143,76 @@ msgstr "Поделитесь им с получателем" msgid "Connection has been closed" msgstr "Соединение было закрыто" -#: src/View/WelcomeView.vala:6 +#: src/View/WelcomeView.vala:7 msgid "Welcome to Transporter" msgstr "Добро пожаловать в Transporter" -#: src/View/WelcomeView.vala:6 +#: src/View/WelcomeView.vala:7 msgid "What would you like to do?" msgstr "Что вы хотите сделать?" -#: src/View/WelcomeView.vala:7 +#: src/View/WelcomeView.vala:8 msgid "Send Files" -msgstr "Отправить файлы" +msgstr "Отправить Файлы" -#: src/View/WelcomeView.vala:7 +#: src/View/WelcomeView.vala:8 msgid "Upload data to another computer" msgstr "Загрузить данные на другой компьютер" -#: src/View/WelcomeView.vala:8 +#: src/View/WelcomeView.vala:9 msgid "Receive Files" -msgstr "Получить файлы" +msgstr "Получить Файлы" -#: src/View/WelcomeView.vala:8 +#: src/View/WelcomeView.vala:9 msgid "Download data from another computer" msgstr "Скачать данные с другого компьютера" -#: src/View/WelcomeView.vala:9 +#: src/View/WelcomeView.vala:10 msgid "Show Downloads" msgstr "Показать Загрузки" -#: src/View/WelcomeView.vala:9 +#: src/View/WelcomeView.vala:10 msgid "Open your Downloads folder" msgstr "Открыть вашу папку Загрузок" -#: src/View/SettingsView.vala:10 +#: src/View/SettingsView.vala:9 #, fuzzy msgid "Servers" msgstr "Серверы" -#: src/View/SettingsView.vala:11 -msgid "Relay Server:" -msgstr "Сервер-ретранслятор:" +#: src/View/SettingsView.vala:10 +#, fuzzy +msgid "Relay:" +msgstr "Ретранслятор:" -#: src/View/SettingsView.vala:13 +#: src/View/SettingsView.vala:12 #, fuzzy -msgid "Transit Server:" -msgstr "Сервер-передатчик:" +msgid "Transit:" +msgstr "Передатчик:" -#: src/View/SettingsView.vala:16 +#: src/View/SettingsView.vala:15 msgid "Miscellaneous" msgstr "Разное" -#: src/View/SettingsView.vala:17 -msgid "ID Word Length:" -msgstr "Кол-во слов в ID:" +#: src/View/SettingsView.vala:16 +#, fuzzy +msgid "ID Length:" +msgstr "Слов в ID:" + +#: src/View/SettingsView.vala:20 +#, fuzzy +msgid "Sounds:" +msgstr "Звуки:" -#: src/View/SettingsView.vala:21 -msgid "Play Sounds:" -msgstr "Проигрывать звуки:" +#: src/View/DropView.vala:16 +msgid "Drag files and folders here" +msgstr "Перетащите сюда файлы и папки" + +#: src/View/DropView.vala:17 +msgid "Drop to send" +msgstr "Отпустите для отправки" + +#: src/View/DropView.vala:93 +#, fuzzy +msgid "Internal Error" +msgstr "Ошибка" diff --git a/src/Transporter.vala b/src/Transporter.vala index 8237a85..7a67c65 100644 --- a/src/Transporter.vala +++ b/src/Transporter.vala @@ -10,7 +10,7 @@ public class Transporter : Granite.Application { application_id = "com.github.bleakgrey.transporter"; flags = ApplicationFlags.FLAGS_NONE; program_name = "Transporter"; - build_version = "1.1.1"; + build_version = "1.2.0"; } public static int main (string[] args) { diff --git a/src/View/DropView.vala b/src/View/DropView.vala index c187397..c576fbf 100644 --- a/src/View/DropView.vala +++ b/src/View/DropView.vala @@ -15,7 +15,6 @@ public class DropView : Gtk.Box { }; private const string DRAG_TEXT = _("Drag files and folders here"); private const string DROP_TEXT = _("Drop to send"); - private const string PREPARE_TEXT = _("Preparing files..."); private Gtk.Label title; @@ -74,7 +73,6 @@ public class DropView : Gtk.Box { var clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD); window.prevScreen(); window.addScreen (new SendView (window, clipboard)); - title.label = PREPARE_TEXT; var uris = data.get_uris (); try{