Skip to content

Commit

Permalink
Added Receive only folder support. Fixes #481
Browse files Browse the repository at this point in the history
  • Loading branch information
kozec committed Sep 22, 2018
1 parent a472a6b commit 1adc738
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 18 deletions.
47 changes: 47 additions & 0 deletions glade/folder-edit.glade
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,7 @@
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_folder_type_toggled" swapped="no"/>
<child>
<object class="GtkLabel" id="label18">
<property name="visible">True</property>
Expand Down Expand Up @@ -436,6 +437,52 @@
<property name="width">2</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="vreceiveOnly">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_folder_type_toggled" swapped="no"/>
<child>
<object class="GtkLabel" id="label31">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">_Recieve Only Folder</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">vreadOnly</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">14</property>
<property name="width">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label32">
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_bottom">10</property>
<property name="label" translatable="yes">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.
</property>
<property name="wrap">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">15</property>
<property name="width">2</property>
</packing>
</child>
</object>
</child>
<child type="tab">
Expand Down
37 changes: 21 additions & 16 deletions syncthing_gtk/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -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)))
Expand All @@ -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

Expand Down
15 changes: 13 additions & 2 deletions syncthing_gtk/foldereditor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
]
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 1adc738

Please sign in to comment.