From 9f658ff49098e537f38aa2158acb3716d7a6edee Mon Sep 17 00:00:00 2001
From: Boris Pozdena
Date: Mon, 9 Jun 2025 15:04:16 +0200
Subject: [PATCH] Add GUI for recycle bin #233
---
src/profile_settings_window.py | 103 ++++++++++-----------
src/resources/default_config | 2 +
src/ui/external_login.ui | 144 ++++++++++++++++-------------
src/ui/profile_settings_page.ui | 50 +++++++++-
src/ui/ui_external_login.py | 71 +++++++++-----
src/ui/ui_profile_settings_page.py | 126 ++++++++++++++++---------
6 files changed, 309 insertions(+), 187 deletions(-)
diff --git a/src/profile_settings_window.py b/src/profile_settings_window.py
index a44a468..9a3edb9 100644
--- a/src/profile_settings_window.py
+++ b/src/profile_settings_window.py
@@ -92,8 +92,7 @@ class ProfileSettingsWindow(QWidget, Ui_profile_settings_window):
close_question = QMessageBox.question(
self,
"Discard changes?",
- f"You have unsaved changes in profile(s) {', '.join(self.unsaved_profiles)}."
- "
Discard changes and close Profiles window?",
+ f"You have unsaved changes in profile(s) {', '.join(self.unsaved_profiles)}.
Discard changes and close Profiles window?",
buttons=QMessageBox.Yes | QMessageBox.No,
defaultButton=QMessageBox.No,
)
@@ -181,9 +180,7 @@ class ProfileSettingsWindow(QWidget, Ui_profile_settings_window):
old_name = selected_item.text()
- new_name, ok = QInputDialog.getText(
- self, "Rename Profile", f"Enter new name for profile '{old_name}':", text=old_name
- )
+ new_name, ok = QInputDialog.getText(self, "Rename Profile", f"Enter new name for profile '{old_name}':", text=old_name)
if ok and new_name:
new_name = new_name.strip()
@@ -407,11 +404,7 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
# Rate limit
self.spinBox_rate_limit.valueChanged.connect(self.set_spin_box_value)
self.spinBox_rate_limit.valueChanged.connect(self.horizontalSlider_rate_limit.setValue)
- self.spinBox_rate_limit.valueChanged.connect(
- lambda: self.label_rate_limit_mbps.setText(
- str(round(self.spinBox_rate_limit.value() * 8 / 1000 / 1000, 2)) + " Mbit/s"
- )
- )
+ self.spinBox_rate_limit.valueChanged.connect(lambda: self.label_rate_limit_mbps.setText(str(round(self.spinBox_rate_limit.value() * 8 / 1000 / 1000, 2)) + " Mbit/s"))
self.horizontalSlider_rate_limit.valueChanged.connect(self.spinBox_rate_limit.setValue)
# Webhooks tab
@@ -438,6 +431,12 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
self.pushButton_logout.clicked.connect(self.logout)
self.checkBox_auto_sync.stateChanged.connect(self.set_check_box_state_profile)
+ ## Recycle Bin group box
+ self.checkBox_use_recycle_bin.stateChanged.connect(self.set_check_box_state)
+ self.checkBox_use_recycle_bin.stateChanged.connect(self.validate_checkbox_input)
+ self.lineEdit_recycle_bin_path.textChanged.connect(self.set_recycle_bin_path)
+ self.pushButton_recycle_bin_path_browse.clicked.connect(self.get_recycle_bin_path)
+
def configure_profile_settings_page(self):
"""Sets all widgets values with values from profile config files"""
@@ -467,26 +466,14 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
# Sync Options tab
self.checkBox_force_http_11.setChecked(self.get_check_box_state("force_http_11"))
self.spinBox_monitor_interval.setValue(int(self.temp_profile_config["onedrive"]["monitor_interval"].strip('"')))
- self.spinBox_monitor_fullscan_frequency.setValue(
- int(self.temp_profile_config["onedrive"]["monitor_fullscan_frequency"].strip('"'))
- )
- self.spinBox_classify_as_big_delete.setValue(
- int(self.temp_profile_config["onedrive"]["classify_as_big_delete"].strip('"'))
- )
- self.spinBox_sync_dir_permissions.setValue(
- int(self.temp_profile_config["onedrive"]["sync_dir_permissions"].strip('"'))
- )
- self.spinBox_sync_file_permissions.setValue(
- int(self.temp_profile_config["onedrive"]["sync_file_permissions"].strip('"'))
- )
- self.spinBox_operation_timeout.setValue(
- int(self.temp_profile_config["onedrive"]["operation_timeout"].strip('"'))
- )
+ self.spinBox_monitor_fullscan_frequency.setValue(int(self.temp_profile_config["onedrive"]["monitor_fullscan_frequency"].strip('"')))
+ self.spinBox_classify_as_big_delete.setValue(int(self.temp_profile_config["onedrive"]["classify_as_big_delete"].strip('"')))
+ self.spinBox_sync_dir_permissions.setValue(int(self.temp_profile_config["onedrive"]["sync_dir_permissions"].strip('"')))
+ self.spinBox_sync_file_permissions.setValue(int(self.temp_profile_config["onedrive"]["sync_file_permissions"].strip('"')))
+ self.spinBox_operation_timeout.setValue(int(self.temp_profile_config["onedrive"]["operation_timeout"].strip('"')))
self.spinBox_connect_timeout.setValue(int(self.temp_profile_config["onedrive"]["connect_timeout"].strip('"')))
self.spinBox_data_timeout.setValue(int(self.temp_profile_config["onedrive"]["data_timeout"].strip('"')))
- self.spinBox_ip_protocol_version.setValue(
- int(self.temp_profile_config["onedrive"]["ip_protocol_version"].strip('"'))
- )
+ self.spinBox_ip_protocol_version.setValue(int(self.temp_profile_config["onedrive"]["ip_protocol_version"].strip('"')))
self.spinBox_threads.setValue(int(self.temp_profile_config["onedrive"]["threads"].strip('"')))
self.checkBox_download_only.setChecked(self.get_check_box_state("download_only"))
self.checkBox_download_only.setDisabled(self.get_check_box_state("upload_only"))
@@ -515,23 +502,15 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
# Webhooks tab
self.checkBox_webhook_enabled.setChecked(self.get_check_box_state("webhook_enabled"))
- self.spinBox_webhook_expiration_interval.setValue(
- int(self.temp_profile_config["onedrive"]["webhook_expiration_interval"].strip('"'))
- )
+ self.spinBox_webhook_expiration_interval.setValue(int(self.temp_profile_config["onedrive"]["webhook_expiration_interval"].strip('"')))
self.spinBox_webhook_expiration_interval.setEnabled(self.checkBox_webhook_enabled.isChecked())
- self.spinBox_webhook_renewal_interval.setValue(
- int(self.temp_profile_config["onedrive"]["webhook_renewal_interval"].strip('"'))
- )
+ self.spinBox_webhook_renewal_interval.setValue(int(self.temp_profile_config["onedrive"]["webhook_renewal_interval"].strip('"')))
self.spinBox_webhook_renewal_interval.setEnabled(self.checkBox_webhook_enabled.isChecked())
- self.spinBox_webhook_listening_port.setValue(
- int(self.temp_profile_config["onedrive"]["webhook_listening_port"].strip('"'))
- )
+ self.spinBox_webhook_listening_port.setValue(int(self.temp_profile_config["onedrive"]["webhook_listening_port"].strip('"')))
self.spinBox_webhook_listening_port.setEnabled(self.checkBox_webhook_enabled.isChecked())
self.lineEdit_webhook_public_url.setText(self.temp_profile_config["onedrive"]["webhook_public_url"].strip('"'))
self.lineEdit_webhook_public_url.setEnabled(self.checkBox_webhook_enabled.isChecked())
- self.lineEdit_webhook_listening_host.setText(
- self.temp_profile_config["onedrive"]["webhook_listening_host"].strip('"')
- )
+ self.lineEdit_webhook_listening_host.setText(self.temp_profile_config["onedrive"]["webhook_listening_host"].strip('"'))
self.lineEdit_webhook_listening_host.setEnabled(self.checkBox_webhook_enabled.isChecked())
# Logging tab
@@ -540,9 +519,7 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
self.lineEdit_log_dir.setEnabled(self.checkBox_enable_logging.isChecked())
self.pushButton_log_dir_browse.setEnabled(self.checkBox_enable_logging.isChecked())
self.checkBox_debug_https.setChecked(self.get_check_box_state("debug_https"))
- self.spinBox_monitor_log_frequency.setValue(
- int(self.temp_profile_config["onedrive"]["monitor_log_frequency"].strip('"'))
- )
+ self.spinBox_monitor_log_frequency.setValue(int(self.temp_profile_config["onedrive"]["monitor_log_frequency"].strip('"')))
self.spinBox_monitor_log_frequency.setEnabled(self.checkBox_enable_logging.isChecked())
self.checkBox_disable_notifications.setChecked(self.get_check_box_state("disable_notifications"))
@@ -555,6 +532,13 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
# Sync List tab
self.textEdit_sync_list.setText(self.read_sync_list())
+ ## Recycle Bin group box
+ self.checkBox_use_recycle_bin.setChecked(self.get_check_box_state("use_recycle_bin"))
+ self.lineEdit_recycle_bin_path.setText(self.temp_profile_config["onedrive"]["recycle_bin_path"].strip('"'))
+ self.lineEdit_recycle_bin_path.setEnabled(self.checkBox_use_recycle_bin.isChecked())
+ self.label_recycle_bin_path.setEnabled(self.checkBox_use_recycle_bin.isChecked())
+ self.pushButton_recycle_bin_path_browse.setEnabled(self.checkBox_use_recycle_bin.isChecked())
+
def read_sync_list(self):
self.sync_list_file = re.search(r"(.+)/.+$", self.config_file).group(1) + "/sync_list"
@@ -615,6 +599,16 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
self.lineEdit_webhook_public_url.setEnabled(False)
self.lineEdit_webhook_listening_host.setEnabled(False)
+ if self.sender().objectName() == "checkBox_use_recycle_bin":
+ if self.checkBox_use_recycle_bin.isChecked():
+ self.lineEdit_recycle_bin_path.setEnabled(True)
+ self.label_recycle_bin_path.setEnabled(True)
+ self.pushButton_recycle_bin_path_browse.setEnabled(True)
+ else:
+ self.lineEdit_recycle_bin_path.setEnabled(False)
+ self.label_recycle_bin_path.setEnabled(False)
+ self.pushButton_recycle_bin_path_browse.setEnabled(False)
+
def str2bool(self, value):
return value.lower() in "true"
@@ -625,16 +619,12 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
main_window.main_window_instance.profile_status_pages[self.profile].stop_monitor()
if self.profile in workers:
workers[self.profile].stop_worker()
- main_window.main_window_instance.profile_status_pages[self.profile].label_onedrive_status.setText(
- "OneDrive sync has been stopped"
- )
+ main_window.main_window_instance.profile_status_pages[self.profile].label_onedrive_status.setText("OneDrive sync has been stopped")
logging.info(f"OneDrive sync for profile {self.profile} has been stopped.")
else:
logging.info(f"OneDrive for profile {self.profile} is not running.")
- main_window.main_window_instance.profile_status_pages[self.profile].label_onedrive_status.setText(
- "You have been logged out"
- )
+ main_window.main_window_instance.profile_status_pages[self.profile].label_onedrive_status.setText("You have been logged out")
def get_sync_dir_name(self):
self.file_dialog = QFileDialog.getExistingDirectory(dir=os.path.expanduser("~/"))
@@ -650,6 +640,13 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
logging.info(log_dir)
self.lineEdit_log_dir.setText(log_dir)
+ def get_recycle_bin_path(self):
+ self.file_dialog = QFileDialog.getExistingDirectory(dir=os.path.expanduser("~/"))
+
+ recycle_bin_path = self.file_dialog
+ logging.info(recycle_bin_path)
+ self.lineEdit_recycle_bin_path.setText(recycle_bin_path)
+
def set_line_edit_value(self, value):
_property = self.sender().objectName()
property = re.search(r"lineEdit_(.+)", _property).group(1)
@@ -711,9 +708,7 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
def set_rate_limit(self):
self.temp_profile_config["onedrive"]["rate_limit"] = f'"{self.lineEdit_rate_limit.text()}"'
- self.label_rate_limit_mbps.setText(
- str(round(int(self.lineEdit_rate_limit.text()) * 8 / 1000 / 1000, 2)) + " Mbit/s"
- )
+ self.label_rate_limit_mbps.setText(str(round(int(self.lineEdit_rate_limit.text()) * 8 / 1000 / 1000, 2)) + " Mbit/s")
def set_sync_dir(self):
self.temp_profile_config["onedrive"]["sync_dir"] = f'"{self.lineEdit_sync_dir.text()}"'
@@ -721,6 +716,10 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings):
def set_log_dir(self):
self.temp_profile_config["onedrive"]["log_dir"] = f'"{self.lineEdit_log_dir.text()}"'
+ def set_recycle_bin_path(self):
+ self.temp_profile_config["onedrive"]["recycle_bin_path"] = f'"{self.lineEdit_recycle_bin_path.text()}"'
+ logging.info(f"[GUI] [{self.profile}] Recycle bin path set to: {self.temp_profile_config['onedrive']['recycle_bin_path']}")
+
def add_item_to_qlist(self, source_widget, destination_widget, list):
if source_widget.text() == "":
logging.info("Ignoring empty value.")
diff --git a/src/resources/default_config b/src/resources/default_config
index 7fbe884..e1c45bd 100644
--- a/src/resources/default_config
+++ b/src/resources/default_config
@@ -48,4 +48,6 @@ data_timeout = "240"
display_running_config = "false"
ip_protocol_version = "1"
threads = "8"
+use_recycle_bin = "false"
+recycle_bin_path = ""
diff --git a/src/ui/external_login.ui b/src/ui/external_login.ui
index 32cf893..e0b740a 100644
--- a/src/ui/external_login.ui
+++ b/src/ui/external_login.ui
@@ -1,65 +1,83 @@
- ExternalLoginWindow
-
-
-
- 0
- 0
- 783
- 321
-
-
-
- Form
-
-
- -
-
-
-
-
-
- <html><head/><body><p align="center"><span style=" font-weight:700; text-decoration: underline;">OneDrive login has been requested</span></p><p>You will be asked to open a specific URL by using your web browser where you will have to login into your Microsoft Account and give <br/>OneDrive client the permission to access your files. </p><p>After giving permission to OneDrive client, you will be redirected to a blank page. Copy the URI of the blank page into the bellow field.</p></body></html>
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
-
-
-
- <html><head/><body><p>1)Login to OneDrive in your browser by <a href="https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=d50ca740-c83f-4d1b-b616-12c519384f0c&scope=Files.ReadWrite%20Files.ReadWrite.all%20Sites.Read.All%20Sites.ReadWrite.All%20offline_access&response_type=code&prompt=login&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient"><span style=" text-decoration: underline; color:#5e81ac;">clicking this link.</span></a></p><p>2)Copy the response URI from your browser's address bar to the bellow field. </p><p>3)Press Save.</p></body></html>
-
-
-
- -
-
-
- -
-
-
- Login
-
-
-
-
-
-
-
-
-
-
+ ExternalLoginWindow
+
+
+
+ 0
+ 0
+ 783
+ 321
+
+
+
+ Form
+
+
+ -
+
+
-
+
+
+ <html><head/><body><p
+ align="center"><span style="
+ font-weight:700; text-decoration: underline;">OneDrive
+ login has been requested</span></p><p>You will
+ be asked to open a specific URL by using your web browser where
+ you will have to login into your Microsoft Account and give
+ <br/>OneDrive client the permission to access your files.
+ </p><p>After giving permission to OneDrive client,
+ you will be redirected to a blank page. Copy the URI of the
+ blank page into the below
+ field.</p></body></html>
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+
+
+
+ <html><head/><body><p>1)Login to
+ OneDrive in your browser by <a
+ href="https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=d50ca740-c83f-4d1b-b616-12c519384f0c&scope=Files.ReadWrite%20Files.ReadWrite.all%20Sites.Read.All%20Sites.ReadWrite.All%20offline_access&response_type=code&prompt=login&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient"><span
+ style=" text-decoration: underline;
+ color:#5e81ac;">clicking this
+ link.</span></a></p><p>2)Copy the
+ response URI from your browser's address bar to the below field.
+ </p><p>3)Press
+ Save.</p></body></html>
+
+
+
+ -
+
+
+ -
+
+
+ Login
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/ui/profile_settings_page.ui b/src/ui/profile_settings_page.ui
index d095b98..1a44201 100644
--- a/src/ui/profile_settings_page.ui
+++ b/src/ui/profile_settings_page.ui
@@ -6,8 +6,8 @@
0
0
- 1019
- 800
+ 1344
+ 994
@@ -100,6 +100,48 @@
+ -
+
+
+ Recycle Bin
+
+
+ false
+
+
+
-
+
+
+ <html><head/><body><p>By default, OneDrive client will process online deletions and directly delete the corresponding file or folder directly from your configured 'sync_dir'.</p><p>Enable this option to move deleted files to your Linux user default 'Recycle Bin', so that you can manually delete the files at your own discretion.</p></body></html>
+
+
+ Use Recycle Bin
+
+
+
+ -
+
+
+ -
+
+
+ <html><head/><body><p>Specify an explicit 'Recycle Bin' directory or keep empty to use the system default recycle bin path.</p></body></html>
+
+
+ Recycle Bin Path
+
+
+
+ -
+
+
+ Browse
+
+
+
+
+
+
-
@@ -171,8 +213,8 @@
0
0
- 975
- 657
+ 1312
+ 812
diff --git a/src/ui/ui_external_login.py b/src/ui/ui_external_login.py
index fdc5521..a07e88a 100644
--- a/src/ui/ui_external_login.py
+++ b/src/ui/ui_external_login.py
@@ -8,27 +8,39 @@
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
-from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
- QMetaObject, QObject, QPoint, QRect,
- QSize, QTime, QUrl, Qt)
-from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
- QFont, QFontDatabase, QGradient, QIcon,
- QImage, QKeySequence, QLinearGradient, QPainter,
- QPalette, QPixmap, QRadialGradient, QTransform)
-from PySide6.QtWidgets import (QApplication, QLabel, QLineEdit, QPushButton,
- QSizePolicy, QSpacerItem, QVBoxLayout, QWidget)
+from PySide6.QtCore import QCoreApplication, QDate, QDateTime, QLocale, QMetaObject, QObject, QPoint, QRect, QSize, QTime, QUrl, Qt
+from PySide6.QtGui import (
+ QBrush,
+ QColor,
+ QConicalGradient,
+ QCursor,
+ QFont,
+ QFontDatabase,
+ QGradient,
+ QIcon,
+ QImage,
+ QKeySequence,
+ QLinearGradient,
+ QPainter,
+ QPalette,
+ QPixmap,
+ QRadialGradient,
+ QTransform,
+)
+from PySide6.QtWidgets import QApplication, QLabel, QLineEdit, QPushButton, QSizePolicy, QSpacerItem, QVBoxLayout, QWidget
+
class Ui_ExternalLoginWindow(object):
def setupUi(self, ExternalLoginWindow):
if not ExternalLoginWindow.objectName():
- ExternalLoginWindow.setObjectName(u"ExternalLoginWindow")
+ ExternalLoginWindow.setObjectName("ExternalLoginWindow")
ExternalLoginWindow.resize(783, 321)
self.verticalLayout = QVBoxLayout(ExternalLoginWindow)
- self.verticalLayout.setObjectName(u"verticalLayout")
+ self.verticalLayout.setObjectName("verticalLayout")
self.layout_external_login = QVBoxLayout()
- self.layout_external_login.setObjectName(u"layout_external_login")
+ self.layout_external_login.setObjectName("layout_external_login")
self.label_1 = QLabel(ExternalLoginWindow)
- self.label_1.setObjectName(u"label_1")
+ self.label_1.setObjectName("label_1")
self.layout_external_login.addWidget(self.label_1)
@@ -37,34 +49,45 @@ class Ui_ExternalLoginWindow(object):
self.layout_external_login.addItem(self.verticalSpacer_2)
self.label_2 = QLabel(ExternalLoginWindow)
- self.label_2.setObjectName(u"label_2")
- self.label_2.setStyleSheet(u"")
+ self.label_2.setObjectName("label_2")
+ self.label_2.setStyleSheet("")
self.layout_external_login.addWidget(self.label_2)
self.lineEdit_response_url = QLineEdit(ExternalLoginWindow)
- self.lineEdit_response_url.setObjectName(u"lineEdit_response_url")
+ self.lineEdit_response_url.setObjectName("lineEdit_response_url")
self.layout_external_login.addWidget(self.lineEdit_response_url)
self.pushButton_login = QPushButton(ExternalLoginWindow)
- self.pushButton_login.setObjectName(u"pushButton_login")
+ self.pushButton_login.setObjectName("pushButton_login")
self.layout_external_login.addWidget(self.pushButton_login)
-
self.verticalLayout.addLayout(self.layout_external_login)
-
self.retranslateUi(ExternalLoginWindow)
QMetaObject.connectSlotsByName(ExternalLoginWindow)
+
# setupUi
def retranslateUi(self, ExternalLoginWindow):
- ExternalLoginWindow.setWindowTitle(QCoreApplication.translate("ExternalLoginWindow", u"Form", None))
- self.label_1.setText(QCoreApplication.translate("ExternalLoginWindow", u"
OneDrive login has been requested
You will be asked to open a specific URL by using your web browser where you will have to login into your Microsoft Account and give
OneDrive client the permission to access your files.
After giving permission to OneDrive client, you will be redirected to a blank page. Copy the URI of the blank page into the bellow field.
", None))
- self.label_2.setText(QCoreApplication.translate("ExternalLoginWindow", u"1)Login to OneDrive in your browser by clicking this link.
2)Copy the response URI from your browser's address bar to the bellow field.
3)Press Save.
", None))
- self.pushButton_login.setText(QCoreApplication.translate("ExternalLoginWindow", u"Login", None))
- # retranslateUi
+ ExternalLoginWindow.setWindowTitle(QCoreApplication.translate("ExternalLoginWindow", "Form", None))
+ self.label_1.setText(
+ QCoreApplication.translate(
+ "ExternalLoginWindow",
+ ' OneDrive login has been requested
You will be asked to open a specific URL by using your web browser where you will have to login into your Microsoft Account and give
OneDrive client the permission to access your files.
After giving permission to OneDrive client, you will be redirected to a blank page. Copy the URI of the blank page into the below field.
',
+ None,
+ )
+ )
+ self.label_2.setText(
+ QCoreApplication.translate(
+ "ExternalLoginWindow",
+ '1)Login to OneDrive in your browser by clicking this link.
2)Copy the response URI from your browser\'s address bar to the below field.
3)Press Save.
',
+ None,
+ )
+ )
+ self.pushButton_login.setText(QCoreApplication.translate("ExternalLoginWindow", "Login", None))
+ # retranslateUi
diff --git a/src/ui/ui_profile_settings_page.py b/src/ui/ui_profile_settings_page.py
index 58fec7e..b4c8549 100644
--- a/src/ui/ui_profile_settings_page.py
+++ b/src/ui/ui_profile_settings_page.py
@@ -1,9 +1,9 @@
# -*- coding: utf-8 -*-
################################################################################
-## Form generated from reading UI file 'profile_settings_pageYvRguo.ui'
+## Form generated from reading UI file 'profile_settings_pageNqWFgH.ui'
##
-## Created by: Qt User Interface Compiler version 6.7.2
+## Created by: Qt User Interface Compiler version 6.9.1
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
@@ -25,7 +25,7 @@ class Ui_profile_settings(object):
def setupUi(self, profile_settings):
if not profile_settings.objectName():
profile_settings.setObjectName(u"profile_settings")
- profile_settings.resize(1019, 800)
+ profile_settings.resize(1344, 994)
self.verticalLayout_2 = QVBoxLayout(profile_settings)
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.verticalLayout_2.setContentsMargins(-1, 0, -1, 0)
@@ -80,6 +80,34 @@ class Ui_profile_settings(object):
self.verticalLayout_5.addWidget(self.groupBox_8)
+ self.groupBox_recycle_bin = QGroupBox(self.monitored_tab_2)
+ self.groupBox_recycle_bin.setObjectName(u"groupBox_recycle_bin")
+ self.groupBox_recycle_bin.setCheckable(False)
+ self.gridLayout_12 = QGridLayout(self.groupBox_recycle_bin)
+ self.gridLayout_12.setObjectName(u"gridLayout_12")
+ self.checkBox_use_recycle_bin = QCheckBox(self.groupBox_recycle_bin)
+ self.checkBox_use_recycle_bin.setObjectName(u"checkBox_use_recycle_bin")
+
+ self.gridLayout_12.addWidget(self.checkBox_use_recycle_bin, 0, 0, 1, 1)
+
+ self.lineEdit_recycle_bin_path = QLineEdit(self.groupBox_recycle_bin)
+ self.lineEdit_recycle_bin_path.setObjectName(u"lineEdit_recycle_bin_path")
+
+ self.gridLayout_12.addWidget(self.lineEdit_recycle_bin_path, 2, 1, 1, 1)
+
+ self.label_recycle_bin_path = QLabel(self.groupBox_recycle_bin)
+ self.label_recycle_bin_path.setObjectName(u"label_recycle_bin_path")
+
+ self.gridLayout_12.addWidget(self.label_recycle_bin_path, 2, 0, 1, 1)
+
+ self.pushButton_recycle_bin_path_browse = QPushButton(self.groupBox_recycle_bin)
+ self.pushButton_recycle_bin_path_browse.setObjectName(u"pushButton_recycle_bin_path_browse")
+
+ self.gridLayout_12.addWidget(self.pushButton_recycle_bin_path_browse, 2, 2, 1, 1)
+
+
+ self.verticalLayout_5.addWidget(self.groupBox_recycle_bin)
+
self.groupBox_12 = QGroupBox(self.monitored_tab_2)
self.groupBox_12.setObjectName(u"groupBox_12")
self.gridLayout_3 = QGridLayout(self.groupBox_12)
@@ -119,7 +147,7 @@ class Ui_profile_settings(object):
self.scrollArea.setWidgetResizable(True)
self.scrollAreaWidgetContents_5 = QWidget()
self.scrollAreaWidgetContents_5.setObjectName(u"scrollAreaWidgetContents_5")
- self.scrollAreaWidgetContents_5.setGeometry(QRect(0, 0, 975, 657))
+ self.scrollAreaWidgetContents_5.setGeometry(QRect(0, 0, 1312, 812))
self.verticalLayout_15 = QVBoxLayout(self.scrollAreaWidgetContents_5)
self.verticalLayout_15.setObjectName(u"verticalLayout_15")
self.groupBox_10 = QGroupBox(self.scrollAreaWidgetContents_5)
@@ -170,77 +198,77 @@ class Ui_profile_settings(object):
self.label_monitor_interval = QLabel(self.groupBox_4)
self.label_monitor_interval.setObjectName(u"label_monitor_interval")
- self.formLayout_4.setWidget(0, QFormLayout.LabelRole, self.label_monitor_interval)
+ self.formLayout_4.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label_monitor_interval)
self.spinBox_monitor_interval = QSpinBox(self.groupBox_4)
self.spinBox_monitor_interval.setObjectName(u"spinBox_monitor_interval")
self.spinBox_monitor_interval.setMaximum(1000000)
- self.formLayout_4.setWidget(0, QFormLayout.FieldRole, self.spinBox_monitor_interval)
+ self.formLayout_4.setWidget(0, QFormLayout.ItemRole.FieldRole, self.spinBox_monitor_interval)
self.label_monitor_fullscan_frequency = QLabel(self.groupBox_4)
self.label_monitor_fullscan_frequency.setObjectName(u"label_monitor_fullscan_frequency")
- self.formLayout_4.setWidget(1, QFormLayout.LabelRole, self.label_monitor_fullscan_frequency)
+ self.formLayout_4.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_monitor_fullscan_frequency)
self.spinBox_monitor_fullscan_frequency = QSpinBox(self.groupBox_4)
self.spinBox_monitor_fullscan_frequency.setObjectName(u"spinBox_monitor_fullscan_frequency")
self.spinBox_monitor_fullscan_frequency.setMaximum(1000000)
- self.formLayout_4.setWidget(1, QFormLayout.FieldRole, self.spinBox_monitor_fullscan_frequency)
+ self.formLayout_4.setWidget(1, QFormLayout.ItemRole.FieldRole, self.spinBox_monitor_fullscan_frequency)
self.label_classify_as_big_delete = QLabel(self.groupBox_4)
self.label_classify_as_big_delete.setObjectName(u"label_classify_as_big_delete")
- self.formLayout_4.setWidget(2, QFormLayout.LabelRole, self.label_classify_as_big_delete)
+ self.formLayout_4.setWidget(2, QFormLayout.ItemRole.LabelRole, self.label_classify_as_big_delete)
self.spinBox_classify_as_big_delete = QSpinBox(self.groupBox_4)
self.spinBox_classify_as_big_delete.setObjectName(u"spinBox_classify_as_big_delete")
self.spinBox_classify_as_big_delete.setMaximum(1000000)
- self.formLayout_4.setWidget(2, QFormLayout.FieldRole, self.spinBox_classify_as_big_delete)
+ self.formLayout_4.setWidget(2, QFormLayout.ItemRole.FieldRole, self.spinBox_classify_as_big_delete)
self.label_operation_timeout = QLabel(self.groupBox_4)
self.label_operation_timeout.setObjectName(u"label_operation_timeout")
- self.formLayout_4.setWidget(3, QFormLayout.LabelRole, self.label_operation_timeout)
+ self.formLayout_4.setWidget(3, QFormLayout.ItemRole.LabelRole, self.label_operation_timeout)
self.spinBox_operation_timeout = QSpinBox(self.groupBox_4)
self.spinBox_operation_timeout.setObjectName(u"spinBox_operation_timeout")
self.spinBox_operation_timeout.setMaximum(1000000)
- self.formLayout_4.setWidget(3, QFormLayout.FieldRole, self.spinBox_operation_timeout)
+ self.formLayout_4.setWidget(3, QFormLayout.ItemRole.FieldRole, self.spinBox_operation_timeout)
self.label_connect_timeout = QLabel(self.groupBox_4)
self.label_connect_timeout.setObjectName(u"label_connect_timeout")
- self.formLayout_4.setWidget(4, QFormLayout.LabelRole, self.label_connect_timeout)
+ self.formLayout_4.setWidget(4, QFormLayout.ItemRole.LabelRole, self.label_connect_timeout)
self.spinBox_connect_timeout = QSpinBox(self.groupBox_4)
self.spinBox_connect_timeout.setObjectName(u"spinBox_connect_timeout")
- self.formLayout_4.setWidget(4, QFormLayout.FieldRole, self.spinBox_connect_timeout)
+ self.formLayout_4.setWidget(4, QFormLayout.ItemRole.FieldRole, self.spinBox_connect_timeout)
self.label_data_timeout = QLabel(self.groupBox_4)
self.label_data_timeout.setObjectName(u"label_data_timeout")
- self.formLayout_4.setWidget(5, QFormLayout.LabelRole, self.label_data_timeout)
+ self.formLayout_4.setWidget(5, QFormLayout.ItemRole.LabelRole, self.label_data_timeout)
self.spinBox_data_timeout = QSpinBox(self.groupBox_4)
self.spinBox_data_timeout.setObjectName(u"spinBox_data_timeout")
- self.formLayout_4.setWidget(5, QFormLayout.FieldRole, self.spinBox_data_timeout)
+ self.formLayout_4.setWidget(5, QFormLayout.ItemRole.FieldRole, self.spinBox_data_timeout)
self.label_ip_protocol_version = QLabel(self.groupBox_4)
self.label_ip_protocol_version.setObjectName(u"label_ip_protocol_version")
- self.formLayout_4.setWidget(6, QFormLayout.LabelRole, self.label_ip_protocol_version)
+ self.formLayout_4.setWidget(6, QFormLayout.ItemRole.LabelRole, self.label_ip_protocol_version)
self.spinBox_ip_protocol_version = QSpinBox(self.groupBox_4)
self.spinBox_ip_protocol_version.setObjectName(u"spinBox_ip_protocol_version")
self.spinBox_ip_protocol_version.setMaximum(2)
- self.formLayout_4.setWidget(6, QFormLayout.FieldRole, self.spinBox_ip_protocol_version)
+ self.formLayout_4.setWidget(6, QFormLayout.ItemRole.FieldRole, self.spinBox_ip_protocol_version)
self.horizontalLayout.addLayout(self.formLayout_4)
@@ -259,80 +287,80 @@ class Ui_profile_settings(object):
self.label_sync_file_permissions = QLabel(self.groupBox_4)
self.label_sync_file_permissions.setObjectName(u"label_sync_file_permissions")
- self.formLayout_5.setWidget(1, QFormLayout.LabelRole, self.label_sync_file_permissions)
+ self.formLayout_5.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_sync_file_permissions)
self.spinBox_sync_file_permissions = QSpinBox(self.groupBox_4)
self.spinBox_sync_file_permissions.setObjectName(u"spinBox_sync_file_permissions")
self.spinBox_sync_file_permissions.setMaximum(777)
- self.formLayout_5.setWidget(1, QFormLayout.FieldRole, self.spinBox_sync_file_permissions)
+ self.formLayout_5.setWidget(1, QFormLayout.ItemRole.FieldRole, self.spinBox_sync_file_permissions)
self.label_sync_dir_permissions = QLabel(self.groupBox_4)
self.label_sync_dir_permissions.setObjectName(u"label_sync_dir_permissions")
- self.formLayout_5.setWidget(2, QFormLayout.LabelRole, self.label_sync_dir_permissions)
+ self.formLayout_5.setWidget(2, QFormLayout.ItemRole.LabelRole, self.label_sync_dir_permissions)
self.spinBox_sync_dir_permissions = QSpinBox(self.groupBox_4)
self.spinBox_sync_dir_permissions.setObjectName(u"spinBox_sync_dir_permissions")
self.spinBox_sync_dir_permissions.setMaximum(777)
- self.formLayout_5.setWidget(2, QFormLayout.FieldRole, self.spinBox_sync_dir_permissions)
+ self.formLayout_5.setWidget(2, QFormLayout.ItemRole.FieldRole, self.spinBox_sync_dir_permissions)
self.label_user_agent = QLabel(self.groupBox_4)
self.label_user_agent.setObjectName(u"label_user_agent")
- self.formLayout_5.setWidget(3, QFormLayout.LabelRole, self.label_user_agent)
+ self.formLayout_5.setWidget(3, QFormLayout.ItemRole.LabelRole, self.label_user_agent)
self.lineEdit_user_agent = QLineEdit(self.groupBox_4)
self.lineEdit_user_agent.setObjectName(u"lineEdit_user_agent")
self.lineEdit_user_agent.setMaximumSize(QSize(16777215, 16777215))
self.lineEdit_user_agent.setMaxLength(32767)
- self.formLayout_5.setWidget(3, QFormLayout.FieldRole, self.lineEdit_user_agent)
+ self.formLayout_5.setWidget(3, QFormLayout.ItemRole.FieldRole, self.lineEdit_user_agent)
self.label_azure_ad_endpoint = QLabel(self.groupBox_4)
self.label_azure_ad_endpoint.setObjectName(u"label_azure_ad_endpoint")
- self.formLayout_5.setWidget(4, QFormLayout.LabelRole, self.label_azure_ad_endpoint)
+ self.formLayout_5.setWidget(4, QFormLayout.ItemRole.LabelRole, self.label_azure_ad_endpoint)
self.lineEdit_azure_ad_endpoint = QLineEdit(self.groupBox_4)
self.lineEdit_azure_ad_endpoint.setObjectName(u"lineEdit_azure_ad_endpoint")
self.lineEdit_azure_ad_endpoint.setMaximumSize(QSize(16777215, 16777215))
- self.formLayout_5.setWidget(4, QFormLayout.FieldRole, self.lineEdit_azure_ad_endpoint)
+ self.formLayout_5.setWidget(4, QFormLayout.ItemRole.FieldRole, self.lineEdit_azure_ad_endpoint)
self.label_azure_tenant_id = QLabel(self.groupBox_4)
self.label_azure_tenant_id.setObjectName(u"label_azure_tenant_id")
- self.formLayout_5.setWidget(5, QFormLayout.LabelRole, self.label_azure_tenant_id)
+ self.formLayout_5.setWidget(5, QFormLayout.ItemRole.LabelRole, self.label_azure_tenant_id)
self.lineEdit_azure_tenant_id = QLineEdit(self.groupBox_4)
self.lineEdit_azure_tenant_id.setObjectName(u"lineEdit_azure_tenant_id")
self.lineEdit_azure_tenant_id.setMaximumSize(QSize(16777215, 16777215))
- self.formLayout_5.setWidget(5, QFormLayout.FieldRole, self.lineEdit_azure_tenant_id)
+ self.formLayout_5.setWidget(5, QFormLayout.ItemRole.FieldRole, self.lineEdit_azure_tenant_id)
self.label_drive_id = QLabel(self.groupBox_4)
self.label_drive_id.setObjectName(u"label_drive_id")
- self.formLayout_5.setWidget(6, QFormLayout.LabelRole, self.label_drive_id)
+ self.formLayout_5.setWidget(6, QFormLayout.ItemRole.LabelRole, self.label_drive_id)
self.lineEdit_drive_id = QLineEdit(self.groupBox_4)
self.lineEdit_drive_id.setObjectName(u"lineEdit_drive_id")
- self.formLayout_5.setWidget(6, QFormLayout.FieldRole, self.lineEdit_drive_id)
+ self.formLayout_5.setWidget(6, QFormLayout.ItemRole.FieldRole, self.lineEdit_drive_id)
self.label_threads = QLabel(self.groupBox_4)
self.label_threads.setObjectName(u"label_threads")
- self.formLayout_5.setWidget(0, QFormLayout.LabelRole, self.label_threads)
+ self.formLayout_5.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label_threads)
self.spinBox_threads = QSpinBox(self.groupBox_4)
self.spinBox_threads.setObjectName(u"spinBox_threads")
self.spinBox_threads.setMinimum(1)
self.spinBox_threads.setMaximum(16)
- self.formLayout_5.setWidget(0, QFormLayout.FieldRole, self.spinBox_threads)
+ self.formLayout_5.setWidget(0, QFormLayout.ItemRole.FieldRole, self.spinBox_threads)
self.horizontalLayout.addLayout(self.formLayout_5)
@@ -575,61 +603,61 @@ class Ui_profile_settings(object):
self.label_webhook_public_url = QLabel(self.groupBox_9)
self.label_webhook_public_url.setObjectName(u"label_webhook_public_url")
- self.formLayout_2.setWidget(1, QFormLayout.LabelRole, self.label_webhook_public_url)
+ self.formLayout_2.setWidget(1, QFormLayout.ItemRole.LabelRole, self.label_webhook_public_url)
self.lineEdit_webhook_public_url = QLineEdit(self.groupBox_9)
self.lineEdit_webhook_public_url.setObjectName(u"lineEdit_webhook_public_url")
- self.formLayout_2.setWidget(1, QFormLayout.FieldRole, self.lineEdit_webhook_public_url)
+ self.formLayout_2.setWidget(1, QFormLayout.ItemRole.FieldRole, self.lineEdit_webhook_public_url)
self.label_webhook_listening_host = QLabel(self.groupBox_9)
self.label_webhook_listening_host.setObjectName(u"label_webhook_listening_host")
- self.formLayout_2.setWidget(2, QFormLayout.LabelRole, self.label_webhook_listening_host)
+ self.formLayout_2.setWidget(2, QFormLayout.ItemRole.LabelRole, self.label_webhook_listening_host)
self.lineEdit_webhook_listening_host = QLineEdit(self.groupBox_9)
self.lineEdit_webhook_listening_host.setObjectName(u"lineEdit_webhook_listening_host")
- self.formLayout_2.setWidget(2, QFormLayout.FieldRole, self.lineEdit_webhook_listening_host)
+ self.formLayout_2.setWidget(2, QFormLayout.ItemRole.FieldRole, self.lineEdit_webhook_listening_host)
self.label_webhook_listening_port = QLabel(self.groupBox_9)
self.label_webhook_listening_port.setObjectName(u"label_webhook_listening_port")
- self.formLayout_2.setWidget(3, QFormLayout.LabelRole, self.label_webhook_listening_port)
+ self.formLayout_2.setWidget(3, QFormLayout.ItemRole.LabelRole, self.label_webhook_listening_port)
self.spinBox_webhook_listening_port = QSpinBox(self.groupBox_9)
self.spinBox_webhook_listening_port.setObjectName(u"spinBox_webhook_listening_port")
self.spinBox_webhook_listening_port.setMinimum(1)
self.spinBox_webhook_listening_port.setMaximum(65353)
- self.formLayout_2.setWidget(3, QFormLayout.FieldRole, self.spinBox_webhook_listening_port)
+ self.formLayout_2.setWidget(3, QFormLayout.ItemRole.FieldRole, self.spinBox_webhook_listening_port)
self.label_webhook_expiration_interval = QLabel(self.groupBox_9)
self.label_webhook_expiration_interval.setObjectName(u"label_webhook_expiration_interval")
- self.formLayout_2.setWidget(4, QFormLayout.LabelRole, self.label_webhook_expiration_interval)
+ self.formLayout_2.setWidget(4, QFormLayout.ItemRole.LabelRole, self.label_webhook_expiration_interval)
self.spinBox_webhook_expiration_interval = QSpinBox(self.groupBox_9)
self.spinBox_webhook_expiration_interval.setObjectName(u"spinBox_webhook_expiration_interval")
self.spinBox_webhook_expiration_interval.setMaximum(1000000)
- self.formLayout_2.setWidget(4, QFormLayout.FieldRole, self.spinBox_webhook_expiration_interval)
+ self.formLayout_2.setWidget(4, QFormLayout.ItemRole.FieldRole, self.spinBox_webhook_expiration_interval)
self.label_webhook_renewal_interval = QLabel(self.groupBox_9)
self.label_webhook_renewal_interval.setObjectName(u"label_webhook_renewal_interval")
- self.formLayout_2.setWidget(5, QFormLayout.LabelRole, self.label_webhook_renewal_interval)
+ self.formLayout_2.setWidget(5, QFormLayout.ItemRole.LabelRole, self.label_webhook_renewal_interval)
self.spinBox_webhook_renewal_interval = QSpinBox(self.groupBox_9)
self.spinBox_webhook_renewal_interval.setObjectName(u"spinBox_webhook_renewal_interval")
self.spinBox_webhook_renewal_interval.setMaximum(1000000)
- self.formLayout_2.setWidget(5, QFormLayout.FieldRole, self.spinBox_webhook_renewal_interval)
+ self.formLayout_2.setWidget(5, QFormLayout.ItemRole.FieldRole, self.spinBox_webhook_renewal_interval)
self.checkBox_webhook_enabled = QCheckBox(self.groupBox_9)
self.checkBox_webhook_enabled.setObjectName(u"checkBox_webhook_enabled")
- self.formLayout_2.setWidget(0, QFormLayout.LabelRole, self.checkBox_webhook_enabled)
+ self.formLayout_2.setWidget(0, QFormLayout.ItemRole.LabelRole, self.checkBox_webhook_enabled)
self.gridLayout.addWidget(self.groupBox_9, 0, 0, 1, 1)
@@ -697,7 +725,7 @@ class Ui_profile_settings(object):
self.checkBox_disable_notifications = QCheckBox(self.groupBox_6)
self.checkBox_disable_notifications.setObjectName(u"checkBox_disable_notifications")
- self.formLayout_3.setWidget(0, QFormLayout.LabelRole, self.checkBox_disable_notifications)
+ self.formLayout_3.setWidget(0, QFormLayout.ItemRole.LabelRole, self.checkBox_disable_notifications)
self.verticalLayout_6.addWidget(self.groupBox_6)
@@ -748,6 +776,16 @@ class Ui_profile_settings(object):
self.checkBox_sync_business_shared_items.setToolTip(QCoreApplication.translate("profile_settings", u"
Refer to Business Shared Folders for configuration assistance.
", None))
#endif // QT_CONFIG(tooltip)
self.checkBox_sync_business_shared_items.setText(QCoreApplication.translate("profile_settings", u"Sync business shared items", None))
+ self.groupBox_recycle_bin.setTitle(QCoreApplication.translate("profile_settings", u"Recycle Bin", None))
+#if QT_CONFIG(tooltip)
+ self.checkBox_use_recycle_bin.setToolTip(QCoreApplication.translate("profile_settings", u"By default, OneDrive client will process online deletions and directly delete the corresponding file or folder directly from your configured 'sync_dir'.
Enable this option to move deleted files to your Linux user default 'Recycle Bin', so that you can manually delete the files at your own discretion.
", None))
+#endif // QT_CONFIG(tooltip)
+ self.checkBox_use_recycle_bin.setText(QCoreApplication.translate("profile_settings", u"Use Recycle Bin", None))
+#if QT_CONFIG(tooltip)
+ self.label_recycle_bin_path.setToolTip(QCoreApplication.translate("profile_settings", u"Specify an explicit 'Recycle Bin' directory or keep empty to use the system default recycle bin path.
", None))
+#endif // QT_CONFIG(tooltip)
+ self.label_recycle_bin_path.setText(QCoreApplication.translate("profile_settings", u"Recycle Bin Path", None))
+ self.pushButton_recycle_bin_path_browse.setText(QCoreApplication.translate("profile_settings", u"Browse", None))
self.groupBox_12.setTitle(QCoreApplication.translate("profile_settings", u"Account actions", None))
#if QT_CONFIG(tooltip)
self.checkBox_auto_sync.setToolTip(QCoreApplication.translate("profile_settings", u"Automatically start sync for this profile when OneDriveGUI starts.", None))