From 1adc738fd8b5d8161bea5a055e897a64fdf1d403 Mon Sep 17 00:00:00 2001 From: kozec Date: Sat, 22 Sep 2018 14:42:41 +0200 Subject: [PATCH] Added Receive only folder support. Fixes #481 --- glade/folder-edit.glade | 47 +++++++++++++++++++++++++++++++++++ syncthing_gtk/app.py | 37 +++++++++++++++------------ syncthing_gtk/foldereditor.py | 15 +++++++++-- 3 files changed, 81 insertions(+), 18 deletions(-) diff --git a/glade/folder-edit.glade b/glade/folder-edit.glade index 37e33b2d..356edf8a 100644 --- a/glade/folder-edit.glade +++ b/glade/folder-edit.glade @@ -400,6 +400,7 @@ True 0 True + True @@ -436,6 +437,52 @@ 2 + + + True + True + False + True + 0 + True + + + + True + False + _Recieve Only Folder + True + vreadOnly + + + + + + + + 0 + 14 + 2 + + + + + 200 + True + False + 10 + Changes from other devices are applied to files on this device, but changes made on this device are not sent to the rest of the cluster. + + True + 0 + 0 + + + 0 + 15 + 2 + + diff --git a/syncthing_gtk/app.py b/syncthing_gtk/app.py index 17ff4900..2823d6ce 100644 --- a/syncthing_gtk/app.py +++ b/syncthing_gtk/app.py @@ -39,9 +39,9 @@ log = logging.getLogger("App") # Internal version used by updater (if enabled) -INTERNAL_VERSION = "v0.9.4.1" +INTERNAL_VERSION = "v0.9.4.2" # Minimal Syncthing version supported by App -MIN_ST_VERSION = "0.14.48" +MIN_ST_VERSION = "0.14.50" COLOR_DEVICE = "#707070" # Dark-gray COLOR_DEVICE_SYNCING = "#2A89C8" # Blue @@ -1375,7 +1375,7 @@ def move_back(): self["window"].move(x, y) GLib.idle_add(move_back) - def show_folder(self, id, label, path, is_master, ignore_perms, rescan_interval, fswatcher_enabled, shared): + def show_folder(self, id, label, path, folder_type, ignore_perms, rescan_interval, fswatcher_enabled, shared): """ Shared is expected to be list """ display_path = path if IS_WINDOWS: @@ -1394,17 +1394,17 @@ def show_folder(self, id, label, path, is_master, ignore_perms, rescan_interval, # Create new box box = InfoBox(self, title, Gtk.Image.new_from_icon_name("drive-harddisk", Gtk.IconSize.LARGE_TOOLBAR)) # Add visible lines - box.add_value("id", "version.svg", _("Folder ID"), id) - box.add_value("path", "folder.svg", _("Path")) - box.add_value("global", "global.svg", _("Global State"), "? items, ?B") - box.add_value("local", "home.svg", _("Local State"), "? items, ?B") - box.add_value("oos", "dl_rate.svg", _("Out Of Sync"), "? items, ?B") - box.add_value("master", "lock.svg", _("Folder Type")) - box.add_value("ignore", "ignore.svg", _("Ignore Permissions")) - box.add_value("rescan", "rescan.svg", _("Rescan Interval")) - box.add_value("shared", "shared.svg", _("Shared With")) + box.add_value("id", "version.svg", _("Folder ID"), id) + box.add_value("path", "folder.svg", _("Path")) + box.add_value("global", "global.svg", _("Global State"), "? items, ?B") + box.add_value("local", "home.svg", _("Local State"), "? items, ?B") + box.add_value("oos", "dl_rate.svg", _("Out Of Sync"), "? items, ?B") + box.add_value("folder_type", "lock.svg", _("Folder Type")) + box.add_value("ignore", "ignore.svg", _("Ignore Permissions")) + box.add_value("rescan", "rescan.svg", _("Rescan Interval")) + box.add_value("shared", "shared.svg", _("Shared With")) # Add hidden stuff - box.add_hidden_value("b_master", is_master) + box.add_hidden_value("b_master", folder_type) box.add_hidden_value("can_override", False) box.add_hidden_value("devices", shared) box.add_hidden_value("norm_path", os.path.abspath(os.path.expanduser(path))) @@ -1427,15 +1427,20 @@ def show_folder(self, id, label, path, is_master, ignore_perms, rescan_interval, # Set values box.set_value("id", id) box.set_value("path", display_path) - box.set_value("master", _("Send Only") if is_master else _("Send & Receive")) + box.add_hidden_value("b_master", False) + if folder_type == "receiveonly": + box.set_value("folder_type", _("Receive Only")) + elif folder_type == "sendonly": + box.set_value("b_master", True) + box.set_value("folder_type", _("Send Only")) + else: + box.set_value("folder_type", _("Send & Receive")) box.set_value("ignore", _("Yes") if ignore_perms else _("No")) box.set_value("rescan", "%s s%s" % ( rescan_interval, " " + _("(watch)") if fswatcher_enabled else "" )) box.set_value("shared", ", ".join([ n.get_title() for n in shared ])) - box.set_value("b_master", is_master) box.set_value("can_override", False) box.set_visible("id", self.config["folder_as_path"] or label not in (None, "")) - box.set_visible("master", is_master) box.set_visible("ignore", ignore_perms) return box diff --git a/syncthing_gtk/foldereditor.py b/syncthing_gtk/foldereditor.py index 30a87790..e27f7030 100644 --- a/syncthing_gtk/foldereditor.py +++ b/syncthing_gtk/foldereditor.py @@ -16,8 +16,8 @@ COLOR_NEW = "#A0A0A0" # Regexp to generate folder id from filename RE_GEN_ID = re.compile("([a-zA-Z0-9\-\._]{1,64}).*") -VALUES = [ "vlabel", "vid", "vpath", "vreadOnly", "vignorePerms", "vdevices", - "vversioning", "vkeepVersions", "vrescanIntervalS", "vmaxAge", +VALUES = [ "vlabel", "vid", "vpath", "vreadOnly", "vreceiveOnly", "vignorePerms", + "vdevices", "vversioning", "vkeepVersions", "vrescanIntervalS", "vmaxAge", "vversionsPath", "vfsWatcherEnabled", "vcleanoutDays", "vcommand", "vorder", "vminDiskFreePct" ] @@ -80,6 +80,8 @@ def get_value(self, key): return self.get_burried_value("versioning/params/versionsPath", self.values, "") elif key == "readOnly": return self.get_burried_value("type", self.values, "") in ("readonly", "sendonly") + elif key == "receiveOnly": + return self.get_burried_value("type", self.values, "") in ("receiveonly") elif key == "versioning": return self.get_burried_value("versioning/type", self.values, "") else: @@ -113,6 +115,8 @@ def set_value(self, key, value): self.values["versioning"]["params"]["versionsPath"] = value elif key == "readOnly": self.values["type"] = "sendonly" if value else "sendreceive" + elif key == "receiveOnly": + self.values["type"] = "receiveonly" else: EditorDialog.set_value(self, key, value) @@ -255,6 +259,13 @@ def fill_folder_id(self, rid, readonly=True): self.update_special_widgets() self["vid"].set_sensitive(not readonly) + def on_folder_type_toggled(self, cb, *a): + """ Ensures that only one folder type checkbox is checked """ + if cb.get_active(): + for x in ("vreadOnly", "vreceiveOnly"): + if self[x] != cb and self[x].get_active(): + self[x].set_active(False) + def on_vfsWatcherEnabled_toggled(self, cb, *a): # Called when checkbox value changes to automatically change rescan interval if self._loading: return