diff --git a/OneDriveGUI/OneDriveGUI.py b/OneDriveGUI/OneDriveGUI.py index b0173a4..eba5f84 100644 --- a/OneDriveGUI/OneDriveGUI.py +++ b/OneDriveGUI/OneDriveGUI.py @@ -5,7 +5,7 @@ import subprocess import sys from configparser import ConfigParser -from PySide6.QtCore import QThread, QTimer, QUrl, Signal, QFileInfo +from PySide6.QtCore import QThread, QTimer, QUrl, Signal, QFileInfo, Qt from PySide6.QtGui import QIcon from PySide6.QtWidgets import ( QWidget, QApplication, QMainWindow, QMenu, QSystemTrayIcon, QListWidget, QListWidgetItem, QFileIconProvider, QStackedLayout, @@ -92,18 +92,31 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings): self.setupUi(self) temp_global_config = global_config - self.temp_profile_config = temp_global_config[self.profile] + self.temp_profile_config = temp_global_config[self.profile]['onedrive'] + self.label_profile_name.setText(self.profile) - self.lineEdit_sync_dir.setText(self.temp_profile_config['onedrive']['sync_dir'].strip('"')) + # + # Monitored files tab + # + self.lineEdit_sync_dir.setText(self.temp_profile_config['sync_dir'].strip('"')) self.lineEdit_sync_dir.textChanged.connect(self.set_sync_dir) + self.checkBox_sync_root_files.setChecked(self.get_toggle_state('sync_root_files')) + self.checkBox_sync_root_files.stateChanged.connect(self.set_check_state) + + + # self.ui.lineEdit.setText(settings['onedrive']['log_dir'].strip('"')) # self.ui.lineEdit.textChanged.connect( # lambda: settings.set('onedrive', 'log_dir', f'"{self.ui.lineEdit.text()}"')) + # + # Excluded files tab + # + # Skip_file section - self.skip_files = self.temp_profile_config['onedrive']['skip_file'].strip('"').split('|') + self.skip_files = self.temp_profile_config['skip_file'].strip('"').split('|') self.listWidget_skip_file.addItems(self.skip_files) self.listWidget_skip_file.setSelectionMode(QAbstractItemView.ExtendedSelection) self.pushButton_add_skip_file.clicked.connect(self.add_skip_file) @@ -112,48 +125,157 @@ class ProfileSettingsPage(QWidget, Ui_profile_settings): # Skip_dir section - self.skip_dirs = self.temp_profile_config['onedrive']['skip_dir'].strip('"').split('|') + self.skip_dirs = self.temp_profile_config['skip_dir'].strip('"').split('|') self.listWidget_skip_dir.addItems(self.skip_dirs) self.listWidget_skip_dir.setSelectionMode(QAbstractItemView.ExtendedSelection) self.pushButton_add_skip_dir.clicked.connect(self.add_skip_dir) self.pushButton_add_skip_dir.clicked.connect(self.lineEdit_skip_dir.clear) self.pushButton_rm_skip_dir.clicked.connect(self.remove_skip_dir) + self.checkBox_skip_dir_strict_match.setChecked(self.get_toggle_state('skip_dir_strict_match')) + self.checkBox_skip_dir_strict_match.stateChanged.connect(self.set_check_state) - # Rate limit - self.lineEdit_rate_limit.setText(self.temp_profile_config['onedrive']['rate_limit'].strip('"')) + self.checkBox_check_nosync.setChecked(self.get_toggle_state('check_nosync')) + self.checkBox_check_nosync.stateChanged.connect(self.set_check_state) + + self.checkBox_skip_symlinks.setChecked(self.get_toggle_state('skip_symlinks')) + self.checkBox_skip_symlinks.stateChanged.connect(self.set_check_state) + + self.checkBox_skip_dotfiles.setChecked(self.get_toggle_state('skip_dotfiles')) + self.checkBox_skip_dotfiles.stateChanged.connect(self.set_check_state) + + # + # Sync Options tab + # + self.checkBox_download_only.setChecked(self.get_toggle_state('download_only')) + self.checkBox_download_only.stateChanged.connect(self.set_check_state) + + self.checkBox_upload_only.setChecked(self.get_toggle_state('upload_only')) + self.checkBox_upload_only.stateChanged.connect(self.set_check_state) + + self.checkBox_force_http_2.setChecked(self.get_toggle_state('force_http_2')) + self.checkBox_force_http_2.stateChanged.connect(self.set_check_state) + + self.checkBox_disable_upload_validation.setChecked(self.get_toggle_state('disable_upload_validation')) + self.checkBox_disable_upload_validation.stateChanged.connect(self.set_check_state) + + self.checkBox_check_nomount.setChecked(self.get_toggle_state('check_nomount')) + self.checkBox_check_nomount.stateChanged.connect(self.set_check_state) + + self.checkBox_local_first.setChecked(self.get_toggle_state('local_first')) + self.checkBox_local_first.stateChanged.connect(self.set_check_state) + + self.checkBox_no_remote_delete.setChecked(self.get_toggle_state('no_remote_delete')) + self.checkBox_no_remote_delete.stateChanged.connect(self.set_check_state) + + self.checkBox_sync_business_shared_folders.setChecked(self.get_toggle_state('sync_business_shared_folders')) + self.checkBox_sync_business_shared_folders.stateChanged.connect(self.set_check_state) + + self.checkBox_dry_run.setChecked(self.get_toggle_state('dry_run')) + self.checkBox_dry_run.stateChanged.connect(self.set_check_state) + + self.checkBox_remove_source_files.setChecked(self.get_toggle_state('remove_source_files')) + self.checkBox_remove_source_files.stateChanged.connect(self.set_check_state) + + self.checkBox_resync.setChecked(self.get_toggle_state('resync')) + self.checkBox_resync.stateChanged.connect(self.set_check_state) + + self.checkBox_bypass_data_preservation.setChecked(self.get_toggle_state('bypass_data_preservation')) + self.checkBox_bypass_data_preservation.stateChanged.connect(self.set_check_state) + + self.checkBox_webhook_enabled.setChecked(self.get_toggle_state('webhook_enabled')) + self.checkBox_webhook_enabled.stateChanged.connect(self.set_check_state) + + # + # Logging tab + # + + self.checkBox_enable_logging.setChecked(self.get_toggle_state('enable_logging')) + self.checkBox_enable_logging.stateChanged.connect(self.set_check_state) + + self.checkBox_debug_https.setChecked(self.get_toggle_state('debug_https')) + self.checkBox_debug_https.stateChanged.connect(self.set_check_state) + + self.checkBox_disable_notifications.setChecked(self.get_toggle_state('disable_notifications')) + self.checkBox_disable_notifications.stateChanged.connect(self.set_check_state) + + + # + # Rate limit tab + # + self.lineEdit_rate_limit.setText(self.temp_profile_config['rate_limit'].strip('"')) self.label_rate_limit_mbps.setText(str(round(int(self.lineEdit_rate_limit.text()) * 8 / 1000 / 1000, 2)) + " Mbit/s") self.lineEdit_rate_limit.textChanged.connect(self.set_rate_limit) - # buttons + # Buttons self.pushButton_discart.hide() - # TODO: how to discart unsaved changes and refresh the widgets or close window? + # TODO: How to discart unsaved changes and refresh the widgets or close window? # self.pushButton_discart.clicked.connect(self.discart_changes) self.pushButton_save.clicked.connect(self.save_profile_settings) + + + + # if self.temp_profile_config['sync_root_files'].strip('"') == 'true': + # self.checkBox_sync_root_files.setCheckState(Qt.Checked) + # else: + # self.checkBox_sync_root_files.setCheckState(Qt.Unchecked) + + # self.checkBox_sync_root_files.stateChanged.connect(lambda: ) + + + # self.checkBox_sync_root_files.toggled.connect(lambda: self.set_check_state(self.checkBox_sync_root_files)) + + + # self.checkBox_sync_root_files.setChecked(lambda: self.get_toggle_state()) + + # self.checkBox_sync_root_files.setChecked(self.str2bool(self.temp_profile_config['sync_root_files'].strip('"'))) + + + + + + def str2bool(self, value): + return value.lower() in "true" + + def set_check_state(self, state): + _property = self.sender().objectName() + property = re.search(r"checkBox_(.+)", _property).group(1) + print(property) + if state == Qt.Checked: + print("is checked") + self.temp_profile_config[f'{property}'] = '"true"' + else: + print("is unchecked") + self.temp_profile_config[f'{property}'] = '"false"' + + def get_toggle_state(self, property): + return self.temp_profile_config[f'{property}'].strip('"') in 'true' + + def add_skip_file(self): self.add_item_to_qlist(self.lineEdit_skip_file, self.listWidget_skip_file, self.skip_files) - self.temp_profile_config['onedrive']['skip_file'] = '"' + '|'.join(self.skip_files) + '"' + self.temp_profile_config['skip_file'] = '"' + '|'.join(self.skip_files) + '"' def remove_skip_file(self): self.remove_item_from_qlist(self.listWidget_skip_file, self.skip_files) - self.temp_profile_config['onedrive']['skip_file'] = '"' + '|'.join(self.skip_files) + '"' + self.temp_profile_config['skip_file'] = '"' + '|'.join(self.skip_files) + '"' def add_skip_dir(self): self.add_item_to_qlist(self.lineEdit_skip_dir, self.listWidget_skip_dir, self.skip_dirs) - self.temp_profile_config['onedrive']['skip_dir'] = '"' + '|'.join(self.skip_dirs) + '"' + self.temp_profile_config['skip_dir'] = '"' + '|'.join(self.skip_dirs) + '"' def remove_skip_dir(self): self.remove_item_from_qlist(self.listWidget_skip_dir, self.skip_dirs) - self.temp_profile_config['onedrive']['skip_dir'] = '"' + '|'.join(self.skip_dirs) + '"' + self.temp_profile_config['skip_dir'] = '"' + '|'.join(self.skip_dirs) + '"' def set_rate_limit(self): - self.temp_profile_config['onedrive']['rate_limit'] = f'"{self.lineEdit_rate_limit.text()}"' + self.temp_profile_config['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") def set_sync_dir(self): - self.temp_profile_config['onedrive']['sync_dir'] = f'"{self.lineEdit_sync_dir.text()}"' + self.temp_profile_config['sync_dir'] = f'"{self.lineEdit_sync_dir.text()}"' def add_item_to_qlist(self, source_widget, destination_widget, list): if source_widget.text() == "": diff --git a/OneDriveGUI/ui/profile_settings_page.ui b/OneDriveGUI/ui/profile_settings_page.ui index 6d4780a..96fcf23 100644 --- a/OneDriveGUI/ui/profile_settings_page.ui +++ b/OneDriveGUI/ui/profile_settings_page.ui @@ -6,8 +6,8 @@ 0 0 - 614 - 785 + 751 + 718 @@ -49,34 +49,34 @@ Monitored Files - - - - - - Browse - - - - - - - Sync Folder: - - - - - - - - - Options + Monitored directory - + + + + + + Browse + + + + + + + Sync Folder: + + + + + + + + + Sync root files @@ -238,7 +238,7 @@ - Sync options + Sync Options @@ -350,7 +350,7 @@ - + Check for .nomount @@ -679,27 +679,27 @@ - Page + GUI Behaviour - - - - Discard changes - - - - - - - Save - - - + + + + Save + + + + + + + Discard changes + + + diff --git a/OneDriveGUI/ui/ui_profile_settings_page.py b/OneDriveGUI/ui/ui_profile_settings_page.py index 3fa032b..74d7f01 100644 --- a/OneDriveGUI/ui/ui_profile_settings_page.py +++ b/OneDriveGUI/ui/ui_profile_settings_page.py @@ -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(614, 785) + profile_settings.resize(751, 718) self.verticalLayout_2 = QVBoxLayout(profile_settings) self.verticalLayout_2.setObjectName(u"verticalLayout_2") self.label_profile_name = QLabel(profile_settings) @@ -47,34 +47,34 @@ class Ui_profile_settings(object): self.exemptions_tab_2.setObjectName(u"exemptions_tab_2") self.verticalLayout_5 = QVBoxLayout(self.exemptions_tab_2) self.verticalLayout_5.setObjectName(u"verticalLayout_5") + self.groupBox_8 = QGroupBox(self.exemptions_tab_2) + self.groupBox_8.setObjectName(u"groupBox_8") + self.gridLayout_9 = QGridLayout(self.groupBox_8) + self.gridLayout_9.setObjectName(u"gridLayout_9") self.gridLayout_5 = QGridLayout() self.gridLayout_5.setObjectName(u"gridLayout_5") - self.pushButton_3 = QPushButton(self.exemptions_tab_2) + self.pushButton_3 = QPushButton(self.groupBox_8) self.pushButton_3.setObjectName(u"pushButton_3") self.gridLayout_5.addWidget(self.pushButton_3, 0, 2, 1, 1) - self.label_sync_dir = QLabel(self.exemptions_tab_2) + self.label_sync_dir = QLabel(self.groupBox_8) self.label_sync_dir.setObjectName(u"label_sync_dir") self.gridLayout_5.addWidget(self.label_sync_dir, 0, 0, 1, 1) - self.lineEdit_sync_dir = QLineEdit(self.exemptions_tab_2) + self.lineEdit_sync_dir = QLineEdit(self.groupBox_8) self.lineEdit_sync_dir.setObjectName(u"lineEdit_sync_dir") self.gridLayout_5.addWidget(self.lineEdit_sync_dir, 0, 1, 1, 1) - self.verticalLayout_5.addLayout(self.gridLayout_5) + self.gridLayout_9.addLayout(self.gridLayout_5, 1, 0, 1, 1) - self.groupBox_8 = QGroupBox(self.exemptions_tab_2) - self.groupBox_8.setObjectName(u"groupBox_8") - self.gridLayout_9 = QGridLayout(self.groupBox_8) - self.gridLayout_9.setObjectName(u"gridLayout_9") self.checkBox_sync_root_files = QCheckBox(self.groupBox_8) self.checkBox_sync_root_files.setObjectName(u"checkBox_sync_root_files") - self.gridLayout_9.addWidget(self.checkBox_sync_root_files, 0, 0, 1, 1) + self.gridLayout_9.addWidget(self.checkBox_sync_root_files, 2, 0, 1, 1) self.verticalLayout_5.addWidget(self.groupBox_8) @@ -294,10 +294,10 @@ class Ui_profile_settings(object): self.gridLayout_4.addWidget(self.checkBox_force_http_2, 2, 1, 1, 1) - self.checkBox_no_mount = QCheckBox(self.groupBox_5) - self.checkBox_no_mount.setObjectName(u"checkBox_no_mount") + self.checkBox_check_nomount = QCheckBox(self.groupBox_5) + self.checkBox_check_nomount.setObjectName(u"checkBox_check_nomount") - self.gridLayout_4.addWidget(self.checkBox_no_mount, 4, 1, 1, 1) + self.gridLayout_4.addWidget(self.checkBox_check_nomount, 4, 1, 1, 1) self.checkBox_resync = QCheckBox(self.groupBox_5) self.checkBox_resync.setObjectName(u"checkBox_resync") @@ -549,18 +549,18 @@ class Ui_profile_settings(object): self.horizontalLayout.addWidget(self.tabWidget) - self.pushButton_discart = QPushButton(profile_settings) - self.pushButton_discart.setObjectName(u"pushButton_discart") - self.horizontalLayout.addWidget(self.pushButton_discart) + self.verticalLayout_2.addLayout(self.horizontalLayout) self.pushButton_save = QPushButton(profile_settings) self.pushButton_save.setObjectName(u"pushButton_save") - self.horizontalLayout.addWidget(self.pushButton_save) + self.verticalLayout_2.addWidget(self.pushButton_save) + self.pushButton_discart = QPushButton(profile_settings) + self.pushButton_discart.setObjectName(u"pushButton_discart") - self.verticalLayout_2.addLayout(self.horizontalLayout) + self.verticalLayout_2.addWidget(self.pushButton_discart) self.retranslateUi(profile_settings) @@ -574,9 +574,9 @@ class Ui_profile_settings(object): def retranslateUi(self, profile_settings): profile_settings.setWindowTitle(QCoreApplication.translate("profile_settings", u"Form", None)) self.label_profile_name.setText(QCoreApplication.translate("profile_settings", u"Profile name", None)) + self.groupBox_8.setTitle(QCoreApplication.translate("profile_settings", u"Monitored directory", None)) self.pushButton_3.setText(QCoreApplication.translate("profile_settings", u"Browse", None)) self.label_sync_dir.setText(QCoreApplication.translate("profile_settings", u"Sync Folder:", None)) - self.groupBox_8.setTitle(QCoreApplication.translate("profile_settings", u"Options", None)) self.checkBox_sync_root_files.setText(QCoreApplication.translate("profile_settings", u"Sync root files", None)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.exemptions_tab_2), QCoreApplication.translate("profile_settings", u"Monitored Files", None)) self.groupBox.setTitle(QCoreApplication.translate("profile_settings", u"Excluded files", None)) @@ -601,7 +601,7 @@ class Ui_profile_settings(object): self.label_sync_file_permissions.setText(QCoreApplication.translate("profile_settings", u"Sync file permissions", None)) self.groupBox_5.setTitle(QCoreApplication.translate("profile_settings", u"Advanced options", None)) self.checkBox_force_http_2.setText(QCoreApplication.translate("profile_settings", u"Force HTTP2", None)) - self.checkBox_no_mount.setText(QCoreApplication.translate("profile_settings", u"Check for .nomount", None)) + self.checkBox_check_nomount.setText(QCoreApplication.translate("profile_settings", u"Check for .nomount", None)) self.checkBox_resync.setText(QCoreApplication.translate("profile_settings", u"Full re-sync", None)) self.checkBox_download_only.setText(QCoreApplication.translate("profile_settings", u"Download only", None)) self.checkBox_local_first.setText(QCoreApplication.translate("profile_settings", u"Local first", None)) @@ -620,7 +620,7 @@ class Ui_profile_settings(object): self.label_webhook_listening_host.setText(QCoreApplication.translate("profile_settings", u"Listening host", None)) self.label_webhook_renewal_interval.setText(QCoreApplication.translate("profile_settings", u"Renewal interval", None)) self.label_operation_timeout.setText(QCoreApplication.translate("profile_settings", u"Operation timeout", None)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("profile_settings", u"Sync options", None)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("profile_settings", u"Sync Options", None)) self.groupBox_7.setTitle(QCoreApplication.translate("profile_settings", u"Logging", None)) self.checkBox_enable_logging.setText(QCoreApplication.translate("profile_settings", u"Enable Logging", None)) self.pushButton_log_dir.setText(QCoreApplication.translate("profile_settings", u"Browse", None)) @@ -635,8 +635,8 @@ class Ui_profile_settings(object): self.label_rate_limit.setText(QCoreApplication.translate("profile_settings", u"Rate Limit [B/s]", None)) self.label_rate_limit_mbps.setText(QCoreApplication.translate("profile_settings", u"(Mbit/s)", None)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_5), QCoreApplication.translate("profile_settings", u"Rate Limit", None)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_6), QCoreApplication.translate("profile_settings", u"Page", None)) - self.pushButton_discart.setText(QCoreApplication.translate("profile_settings", u"Discard changes", None)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_6), QCoreApplication.translate("profile_settings", u"GUI Behaviour", None)) self.pushButton_save.setText(QCoreApplication.translate("profile_settings", u"Save", None)) + self.pushButton_discart.setText(QCoreApplication.translate("profile_settings", u"Discard changes", None)) # retranslateUi