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
+
+
+
+
+ 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