Skip to content

Commit

Permalink
add settings section for bandwidth limits
Browse files Browse the repository at this point in the history
  • Loading branch information
samschott committed Jan 30, 2023
1 parent 2d0d757 commit 25e5761
Show file tree
Hide file tree
Showing 2 changed files with 166 additions and 5 deletions.
61 changes: 61 additions & 0 deletions src/maestral_cocoa/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ def __init__(self, mdbx: MaestralProxy, app: MaestralGui) -> None:
self.btn_unlink.on_press = self.on_unlink_pressed
self.btn_select_folders.on_press = self.on_folder_selection_pressed
self.combobox_dbx_location.on_select = self.on_dbx_location_selected

self.radio_button_unlimited_down.on_change = self.on_limit_downloads_toggled
self.radio_button_limited_down.on_change = self.on_limit_downloads_toggled
self.radio_button_unlimited_up.on_change = self.on_limit_uploads_toggled
self.radio_button_limited_up.on_change = self.on_limit_uploads_toggled
self.number_input_limit_down.on_change = self.on_download_limit_number_changed
self.number_input_limit_up.on_change = self.on_upload_limit_number_changed

self.combobox_update_interval.on_select = self.on_update_interval_selected
self.checkbox_autostart.on_change = self.on_autostart_clicked
self.checkbox_notifications.on_change = self.on_notifications_clicked
Expand Down Expand Up @@ -131,6 +139,42 @@ async def on_unlink_pressed(self, widget: Any) -> None:
)
await self.app.exit_and_stop_daemon()

async def on_limit_downloads_toggled(self, widget: toga.Selection) -> None:
if widget is self.radio_button_unlimited_down:
unlimited = widget.value is True
elif widget is self.radio_button_limited_down:
unlimited = widget.value is False
else:
raise RuntimeError(f"Unexpected widget {widget}")

if unlimited:
self.mdbx.bandwidth_limit_down = 0.0
self.number_input_limit_down.enabled = False
else:
self.mdbx.bandwidth_limit_down = float(self.number_input_limit_down.value)
self.number_input_limit_down.enabled = True

async def on_limit_uploads_toggled(self, widget: toga.Selection) -> None:
if widget is self.radio_button_unlimited_up:
unlimited = widget.value is True
elif widget is self.radio_button_limited_up:
unlimited = widget.value is False
else:
raise RuntimeError(f"Unexpected widget {widget}")

if unlimited:
self.mdbx.bandwidth_limit_up = 0.0
self.number_input_limit_up.enabled = False
else:
self.mdbx.bandwidth_limit_up = float(self.number_input_limit_up.value)
self.number_input_limit_up.enabled = True

async def on_download_limit_number_changed(self, widget: toga.NumberInput) -> None:
self.mdbx.bandwidth_limit_down = float(widget.value)

async def on_upload_limit_number_changed(self, widget: toga.NumberInput) -> None:
self.mdbx.bandwidth_limit_up = float(widget.value)

async def on_update_interval_selected(self, widget: toga.Selection) -> None:
interval = self._update_interval_mapping[str(widget.value)]
self.app.updater.update_check_interval = interval
Expand Down Expand Up @@ -221,6 +265,23 @@ def refresh_gui(self) -> None:
# populate sync section
self.combobox_dbx_location.current_selection = self.mdbx.dropbox_path

# populate bandwidth section
if self.mdbx.bandwidth_limit_down == 0:
self.radio_button_unlimited_down.value = True
self.number_input_limit_down.enabled = False
else:
self.radio_button_limited_down.value = True
self.number_input_limit_down.value = self.mdbx.bandwidth_limit_down
self.number_input_limit_down.enabled = True

if self.mdbx.bandwidth_limit_up == 0:
self.radio_button_unlimited_up.value = True
self.number_input_limit_up.enabled = False
else:
self.radio_button_limited_up.value = True
self.number_input_limit_up.value = self.mdbx.bandwidth_limit_up
self.number_input_limit_up.enabled = True

# populate app section
self.checkbox_autostart.state = ON if self.autostart.enabled else OFF
self.checkbox_notifications.state = (
Expand Down
110 changes: 105 additions & 5 deletions src/maestral_cocoa/settings_gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
Label,
LinkLabel,
Switch,
RadioButton,
FileSelectionButton,
Window,
apply_round_clipping,
Expand Down Expand Up @@ -117,7 +118,7 @@ def __init__(self, **kwargs) -> None:
style=Pack(direction=ROW),
)

# ==== sync settings section ===================================================
# ==== folder settings section =================================================

self._label_select_folders = Label(
"Selective sync:",
Expand All @@ -143,7 +144,7 @@ def __init__(self, **kwargs) -> None:
),
)

dropbox_settings_box = toga.Box(
folder_settings_box = toga.Box(
children=[
toga.Box(
children=[self._label_select_folders, self.btn_select_folders],
Expand All @@ -159,6 +160,103 @@ def __init__(self, **kwargs) -> None:
style=Pack(direction=COLUMN),
)

# ==== bandwidth settings section ==============================================

self._label_download_rate = Label(
"Download rate:",
style=Pack(text_align=RIGHT, width=SettingsGui.COLUMN_WIDTH_LEFT),
)

self.radio_button_unlimited_down = RadioButton(
"Don't limit", group=RadioButton.Group.A
)
self.radio_button_limited_down = RadioButton(
"Limit to:", group=RadioButton.Group.A
)
self.number_input_limit_down = toga.NumberInput(
value=1,
min_value=0.005,
style=Pack(padding_left=SettingsGui.COLUMN_PADDING, width=50),
)
self._unit_label_down = toga.Label(
"MB/s",
style=Pack(padding_left=SettingsGui.COLUMN_PADDING, width=50),
)

self._label_upload_rate = Label(
"Upload rate:",
style=Pack(text_align=RIGHT, width=SettingsGui.COLUMN_WIDTH_LEFT),
)

self.radio_button_unlimited_up = RadioButton(
"Don't limit", group=RadioButton.Group.B
)
self.radio_button_limited_up = RadioButton(
"Limit to:", group=RadioButton.Group.B
)
self.number_input_limit_up = toga.NumberInput(
value=1,
min_value=0.005,
style=Pack(padding_left=SettingsGui.COLUMN_PADDING, width=50),
)
self._unit_label_up = toga.Label(
"MB/s",
style=Pack(padding_left=SettingsGui.COLUMN_PADDING, width=50),
)

children = [
toga.Box(
children=[
self._label_download_rate,
toga.Box(
children=[
self.radio_button_unlimited_down,
toga.Box(
children=[
self.radio_button_limited_down,
self.number_input_limit_down,
self._unit_label_down,
],
),
],
style=Pack(
alignment=TOP,
direction=COLUMN,
padding_left=SettingsGui.COLUMN_PADDING,
),
),
],
),
toga.Box(
children=[
self._label_upload_rate,
toga.Box(
children=[
self.radio_button_unlimited_up,
toga.Box(
children=[
self.radio_button_limited_up,
self.number_input_limit_up,
self._unit_label_up,
],
),
],
style=Pack(
alignment=TOP,
direction=COLUMN,
padding_left=SettingsGui.COLUMN_PADDING,
),
),
],
style=Pack(padding_top=SettingsGui.ELEMENT_PADDING),
),
]

bandwidth_settings_box = toga.Box(
children=children,
style=Pack(direction=COLUMN),
)

# ==== system settings section =================================================

self._label_update_interval = Label(
Expand Down Expand Up @@ -270,7 +368,7 @@ def __init__(self, **kwargs) -> None:
)
)

maestral_settings_box = toga.Box(
system_settings_box = toga.Box(
children=children,
style=Pack(direction=COLUMN),
)
Expand Down Expand Up @@ -319,9 +417,11 @@ def __init__(self, **kwargs) -> None:
children=[
account_info_box,
toga.Divider(style=Pack(padding=SettingsGui.SECTION_PADDING)),
dropbox_settings_box,
folder_settings_box,
toga.Divider(style=Pack(padding=SettingsGui.SECTION_PADDING)),
bandwidth_settings_box,
toga.Divider(style=Pack(padding=SettingsGui.SECTION_PADDING)),
maestral_settings_box,
system_settings_box,
toga.Divider(style=Pack(padding=SettingsGui.SECTION_PADDING)),
about_box,
],
Expand Down

0 comments on commit 25e5761

Please sign in to comment.