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&amp;scope=Files.ReadWrite%20Files.ReadWrite.all%20Sites.Read.All%20Sites.ReadWrite.All%20offline_access&amp;response_type=code&amp;prompt=login&amp;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&amp;scope=Files.ReadWrite%20Files.ReadWrite.all%20Sites.Read.All%20Sites.ReadWrite.All%20offline_access&amp;response_type=code&amp;prompt=login&amp;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))