mirror of
https://github.com/onionshare/onionshare.git
synced 2025-08-01 19:06:20 -04:00

This includes the 'Automatically start this (persistent) onion when OnionShare starts' and 'stop sharing after files have been downloaded'. Make the 'Custom title' be the first field in all modes, and make sure mode-specific settings are shown after others but before the Scheduling toggle, for a more consistent view of settings for each mode.
306 lines
12 KiB
Python
306 lines
12 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
OnionShare | https://onionshare.org/
|
|
|
|
Copyright (C) 2014-2022 Micah Lee, et al. <micah@micahflee.com>
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
"""
|
|
|
|
from PySide6 import QtCore, QtWidgets
|
|
|
|
from ... import strings
|
|
|
|
|
|
class ModeSettingsWidget(QtWidgets.QScrollArea):
|
|
"""
|
|
All of the common settings for each mode are in this widget
|
|
"""
|
|
|
|
change_persistent = QtCore.Signal(int, bool)
|
|
|
|
def __init__(self, common, tab, mode_settings):
|
|
super(ModeSettingsWidget, self).__init__()
|
|
self.common = common
|
|
self.tab = tab
|
|
self.settings = mode_settings
|
|
|
|
# Downstream Mode need to fill in this layout with its settings
|
|
self.mode_specific_layout = QtWidgets.QVBoxLayout()
|
|
|
|
self.persistent_autostart_on_launch_checkbox = QtWidgets.QCheckBox()
|
|
self.persistent_autostart_on_launch_checkbox.clicked.connect(self.persistent_autostart_on_launch_checkbox_clicked)
|
|
self.persistent_autostart_on_launch_checkbox.setText(strings._("mode_settings_persistent_autostart_on_launch_checkbox"))
|
|
if self.settings.get("persistent", "autostart_on_launch"):
|
|
self.persistent_autostart_on_launch_checkbox.setCheckState(QtCore.Qt.Checked)
|
|
else:
|
|
self.persistent_autostart_on_launch_checkbox.setCheckState(QtCore.Qt.Unchecked)
|
|
|
|
# Persistent
|
|
self.persistent_checkbox = QtWidgets.QCheckBox()
|
|
self.persistent_checkbox.clicked.connect(self.persistent_checkbox_clicked)
|
|
self.persistent_checkbox.setText(strings._("mode_settings_persistent_checkbox"))
|
|
if self.settings.get("persistent", "enabled"):
|
|
self.persistent_checkbox.setCheckState(QtCore.Qt.Checked)
|
|
self.persistent_autostart_on_launch_checkbox.show()
|
|
else:
|
|
self.persistent_checkbox.setCheckState(QtCore.Qt.Unchecked)
|
|
self.persistent_autostart_on_launch_checkbox.hide()
|
|
|
|
# Public
|
|
self.public_checkbox = QtWidgets.QCheckBox()
|
|
self.public_checkbox.clicked.connect(self.public_checkbox_clicked)
|
|
self.public_checkbox.setText(strings._("mode_settings_public_checkbox"))
|
|
if self.settings.get("general", "public"):
|
|
self.public_checkbox.setCheckState(QtCore.Qt.Checked)
|
|
else:
|
|
self.public_checkbox.setCheckState(QtCore.Qt.Unchecked)
|
|
|
|
# Title
|
|
title_label = QtWidgets.QLabel(strings._("mode_settings_title_label"))
|
|
self.title_lineedit = QtWidgets.QLineEdit()
|
|
self.title_lineedit.editingFinished.connect(self.title_editing_finished)
|
|
if self.settings.get("general", "title"):
|
|
self.title_lineedit.setText(self.settings.get("general", "title"))
|
|
title_layout = QtWidgets.QHBoxLayout()
|
|
title_layout.addWidget(title_label)
|
|
title_layout.addWidget(self.title_lineedit)
|
|
|
|
# Whether or not to use an auto-start timer
|
|
self.autostart_timer_checkbox = QtWidgets.QCheckBox()
|
|
self.autostart_timer_checkbox.clicked.connect(
|
|
self.autostart_timer_checkbox_clicked
|
|
)
|
|
self.autostart_timer_checkbox.setText(
|
|
strings._("mode_settings_autostart_timer_checkbox")
|
|
)
|
|
if self.settings.get("general", "autostart_timer"):
|
|
self.autostart_timer_checkbox.setCheckState(QtCore.Qt.Checked)
|
|
else:
|
|
self.autostart_timer_checkbox.setCheckState(QtCore.Qt.Unchecked)
|
|
|
|
# The autostart timer widget
|
|
self.autostart_timer_widget = QtWidgets.QDateTimeEdit()
|
|
self.autostart_timer_widget.setDisplayFormat("hh:mm A MMM d, yy")
|
|
self.autostart_timer_reset()
|
|
self.autostart_timer_widget.setCurrentSection(
|
|
QtWidgets.QDateTimeEdit.MinuteSection
|
|
)
|
|
if self.settings.get("general", "autostart_timer"):
|
|
self.autostart_timer_widget.show()
|
|
else:
|
|
self.autostart_timer_widget.hide()
|
|
|
|
# Autostart timer layout
|
|
autostart_timer_layout = QtWidgets.QHBoxLayout()
|
|
autostart_timer_layout.setContentsMargins(0, 0, 0, 0)
|
|
autostart_timer_layout.addWidget(self.autostart_timer_checkbox)
|
|
autostart_timer_layout.addWidget(self.autostart_timer_widget)
|
|
|
|
# Whether or not to use an auto-stop timer
|
|
self.autostop_timer_checkbox = QtWidgets.QCheckBox()
|
|
self.autostop_timer_checkbox.clicked.connect(
|
|
self.autostop_timer_checkbox_clicked
|
|
)
|
|
self.autostop_timer_checkbox.setText(
|
|
strings._("mode_settings_autostop_timer_checkbox")
|
|
)
|
|
if self.settings.get("general", "autostop_timer"):
|
|
self.autostop_timer_checkbox.setCheckState(QtCore.Qt.Checked)
|
|
else:
|
|
self.autostop_timer_checkbox.setCheckState(QtCore.Qt.Unchecked)
|
|
|
|
# The autostop timer widget
|
|
self.autostop_timer_widget = QtWidgets.QDateTimeEdit()
|
|
self.autostop_timer_widget.setDisplayFormat("hh:mm A MMM d, yy")
|
|
self.autostop_timer_reset()
|
|
self.autostop_timer_widget.setCurrentSection(
|
|
QtWidgets.QDateTimeEdit.MinuteSection
|
|
)
|
|
if self.settings.get("general", "autostop_timer"):
|
|
self.autostop_timer_widget.show()
|
|
else:
|
|
self.autostop_timer_widget.hide()
|
|
|
|
# Autostop timer layout
|
|
autostop_timer_layout = QtWidgets.QHBoxLayout()
|
|
autostop_timer_layout.setContentsMargins(0, 0, 0, 0)
|
|
autostop_timer_layout.addWidget(self.autostop_timer_checkbox)
|
|
autostop_timer_layout.addWidget(self.autostop_timer_widget)
|
|
|
|
# Toggle scheduling settings
|
|
self.toggle_scheduling_button = QtWidgets.QPushButton()
|
|
self.toggle_scheduling_button.clicked.connect(self.toggle_scheduling_clicked)
|
|
self.toggle_scheduling_button.setFlat(True)
|
|
self.toggle_scheduling_button.setStyleSheet(
|
|
self.common.gui.css["mode_settings_toggle_scheduling"]
|
|
)
|
|
|
|
# Scheduling group itself
|
|
self.scheduling_layout = QtWidgets.QVBoxLayout()
|
|
self.scheduling_layout.setContentsMargins(0, 0, 0, 0)
|
|
self.scheduling_layout.addLayout(autostart_timer_layout)
|
|
self.scheduling_layout.addLayout(autostop_timer_layout)
|
|
self.scheduling_layout.addWidget(self.persistent_autostart_on_launch_checkbox)
|
|
self.scheduling_widget = QtWidgets.QWidget()
|
|
self.scheduling_widget.setLayout(self.scheduling_layout)
|
|
self.scheduling_widget.hide()
|
|
|
|
layout = QtWidgets.QVBoxLayout()
|
|
layout.addLayout(title_layout)
|
|
layout.addWidget(self.persistent_checkbox)
|
|
layout.addWidget(self.public_checkbox)
|
|
layout.addLayout(self.mode_specific_layout)
|
|
layout.addWidget(self.scheduling_widget)
|
|
layout.addWidget(self.toggle_scheduling_button)
|
|
layout.addStretch()
|
|
main_widget = QtWidgets.QWidget()
|
|
main_widget.setLayout(layout)
|
|
|
|
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
|
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
|
|
self.setWidgetResizable(True)
|
|
self.setFrameShape(QtWidgets.QFrame.NoFrame)
|
|
self.setWidget(main_widget)
|
|
|
|
self.update_ui()
|
|
|
|
def update_ui(self):
|
|
# Update text on scheduling group toggle button
|
|
if self.scheduling_widget.isVisible():
|
|
self.toggle_scheduling_button.setText(
|
|
strings._("mode_settings_scheduling_toggle_hide")
|
|
)
|
|
else:
|
|
self.toggle_scheduling_button.setText(
|
|
strings._("mode_settings_scheduling_toggle_show")
|
|
)
|
|
|
|
def title_editing_finished(self):
|
|
if self.title_lineedit.text().strip() == "":
|
|
self.title_lineedit.setText("")
|
|
self.settings.set("general", "title", None)
|
|
if self.tab.mode == self.common.gui.MODE_SHARE:
|
|
self.tab.change_title.emit(
|
|
self.tab.tab_id, strings._("gui_tab_name_share")
|
|
)
|
|
elif self.tab.mode == self.common.gui.MODE_RECEIVE:
|
|
self.tab.change_title.emit(
|
|
self.tab.tab_id, strings._("gui_tab_name_receive")
|
|
)
|
|
elif self.tab.mode == self.common.gui.MODE_WEBSITE:
|
|
self.tab.change_title.emit(
|
|
self.tab.tab_id, strings._("gui_tab_name_website")
|
|
)
|
|
elif self.tab.mode == self.common.gui.MODE_CHAT:
|
|
self.tab.change_title.emit(
|
|
self.tab.tab_id, strings._("gui_tab_name_chat")
|
|
)
|
|
elif self.tab_mode is None:
|
|
pass
|
|
else:
|
|
title = self.title_lineedit.text()
|
|
self.settings.set("general", "title", title)
|
|
self.tab.change_title.emit(self.tab.tab_id, title)
|
|
|
|
def persistent_checkbox_clicked(self):
|
|
self.settings.set("persistent", "enabled", self.persistent_checkbox.isChecked())
|
|
self.settings.set("persistent", "mode", self.tab.mode)
|
|
self.settings.set("persistent", "autostart_on_launch", self.persistent_autostart_on_launch_checkbox.isChecked())
|
|
self.change_persistent.emit(
|
|
self.tab.tab_id, self.persistent_checkbox.isChecked()
|
|
)
|
|
|
|
# If disabling persistence, delete the file from disk
|
|
if not self.persistent_checkbox.isChecked():
|
|
self.settings.delete()
|
|
self.persistent_autostart_on_launch_checkbox.hide()
|
|
else:
|
|
self.persistent_autostart_on_launch_checkbox.show()
|
|
|
|
def persistent_autostart_on_launch_checkbox_clicked(self):
|
|
self.settings.set("persistent", "autostart_on_launch", self.persistent_autostart_on_launch_checkbox.isChecked())
|
|
|
|
def public_checkbox_clicked(self):
|
|
self.settings.set("general", "public", self.public_checkbox.isChecked())
|
|
|
|
def autostart_timer_checkbox_clicked(self):
|
|
self.settings.set(
|
|
"general", "autostart_timer", self.autostart_timer_checkbox.isChecked()
|
|
)
|
|
|
|
if self.autostart_timer_checkbox.isChecked():
|
|
self.autostart_timer_widget.show()
|
|
else:
|
|
self.autostart_timer_widget.hide()
|
|
|
|
def autostop_timer_checkbox_clicked(self):
|
|
self.settings.set(
|
|
"general", "autostop_timer", self.autostop_timer_checkbox.isChecked()
|
|
)
|
|
|
|
if self.autostop_timer_checkbox.isChecked():
|
|
self.autostop_timer_widget.show()
|
|
else:
|
|
self.autostop_timer_widget.hide()
|
|
|
|
def toggle_scheduling_clicked(self):
|
|
if self.scheduling_widget.isVisible():
|
|
self.scheduling_widget.hide()
|
|
else:
|
|
self.scheduling_widget.show()
|
|
|
|
self.update_ui()
|
|
|
|
def autostart_timer_reset(self):
|
|
"""
|
|
Reset the auto-start timer in the UI after stopping a share
|
|
"""
|
|
if self.common.gui.local_only:
|
|
# For testing
|
|
self.autostart_timer_widget.setDateTime(
|
|
QtCore.QDateTime.currentDateTime().addSecs(15)
|
|
)
|
|
self.autostart_timer_widget.setMinimumDateTime(
|
|
QtCore.QDateTime.currentDateTime()
|
|
)
|
|
else:
|
|
self.autostart_timer_widget.setDateTime(
|
|
QtCore.QDateTime.currentDateTime().addSecs(
|
|
300
|
|
) # 5 minutes in the future
|
|
)
|
|
self.autostart_timer_widget.setMinimumDateTime(
|
|
QtCore.QDateTime.currentDateTime().addSecs(60)
|
|
)
|
|
|
|
def autostop_timer_reset(self):
|
|
"""
|
|
Reset the auto-stop timer in the UI after stopping a share
|
|
"""
|
|
if self.common.gui.local_only:
|
|
# For testing
|
|
self.autostop_timer_widget.setDateTime(
|
|
QtCore.QDateTime.currentDateTime().addSecs(15)
|
|
)
|
|
self.autostop_timer_widget.setMinimumDateTime(
|
|
QtCore.QDateTime.currentDateTime()
|
|
)
|
|
else:
|
|
self.autostop_timer_widget.setDateTime(
|
|
QtCore.QDateTime.currentDateTime().addSecs(300)
|
|
)
|
|
self.autostop_timer_widget.setMinimumDateTime(
|
|
QtCore.QDateTime.currentDateTime().addSecs(60)
|
|
)
|