diff --git a/src/gui/ALWebDriverDownloadDialog.py b/src/gui/ALWebDriverDownloadDialog.py index 0891603..59571c5 100644 --- a/src/gui/ALWebDriverDownloadDialog.py +++ b/src/gui/ALWebDriverDownloadDialog.py @@ -24,7 +24,8 @@ from PySide6.QtGui import ( from managers.driver.WebDriverManager import ( instance as webdriver_manager_instance, - WebDriverManager, WebDriverInfo, WebDriverType + WebDriverManager, WebDriverInfo, WebDriverType, + WebDriverStatus ) from gui.ALStatusLabel import ALStatusLabel @@ -141,6 +142,7 @@ class ALWebDriverDownloadDialog(QDialog): self.initializeDriverManager() self.refreshDriverList() + def showEvent( self, event @@ -163,6 +165,7 @@ class ALWebDriverDownloadDialog(QDialog): self.move(target_pos) return result + def setupUi( self ): @@ -267,13 +270,16 @@ class ALWebDriverDownloadDialog(QDialog): self.__driver_manager.refresh() self.__driver_infos = self.__driver_manager.getDriverInfos() self.DriverComboBox.clear() - for driver_info in self.__driver_infos: + installed_idx = 0 + for i, driver_info in enumerate(self.__driver_infos): + if driver_info.driver_status == WebDriverStatus.INSTALLED: + installed_idx = i # get the installed driver index display_text = f"{driver_info.driver_type.value} - {driver_info.browser_version}" self.DriverComboBox.addItem(display_text) count = len(self.__driver_infos) self.BrowserCountLabel.setText(f"检测到 {count} 个可用浏览器:") if self.__driver_infos: - self.onDriverComboBoxChanged(0) + self.DriverComboBox.setCurrentIndex(installed_idx) def onDriverComboBoxChanged( @@ -285,6 +291,7 @@ class ALWebDriverDownloadDialog(QDialog): return driver_info = self.__driver_infos[index] self.updateDriverInfoDisplay(driver_info) + self.updateProgressBarStates(driver_info) self.updateButtonStates(driver_info) @@ -328,18 +335,21 @@ class ALWebDriverDownloadDialog(QDialog): self ): + self.DriverComboBox.setEnabled(False) index = self.DriverComboBox.currentIndex() if index < 0 or index >= len(self.__driver_infos): return driver_info = self.__driver_infos[index] - if driver_info.driver_status.name == "INSTALLED": + if driver_info.driver_status == WebDriverStatus.INSTALLED: return - self.StatusLabel.status = ALStatusLabel.Status.RUNNING - self.DownloadButton.setEnabled(False) - self.RefreshButton.setEnabled(False) - self.DriverComboBox.setEnabled(False) - self.ProgressBar.setValue(0) - self.ProgressText.setText("正在下载驱动...") + driver_info.driver_status = WebDriverStatus.DOWNLOADING # we set this only to update + # the display, and we will set to not installed in the download thread + self.updateDriverInfoDisplay(driver_info) + self.updateProgressBarStates(driver_info) + self.ProgressText.setText("准备开始下载...") + self.updateButtonStates(driver_info) + # set to not installed + driver_info.driver_status = WebDriverStatus.NOT_INSTALLED self.__download_thread = DownloadWorker(self.__driver_manager, driver_info) self.__download_thread.progress.connect(self.onDownloadProgress) self.__download_thread.downloadFinished.connect(self.onDownloadFinished) @@ -371,18 +381,14 @@ class ALWebDriverDownloadDialog(QDialog): self ): - self.ProgressBar.setValue(100) - self.ProgressText.setText("下载完成 !") - self.StatusLabel.status = ALStatusLabel.Status.SUCCESS + self.DriverComboBox.setEnabled(True) index = self.DriverComboBox.currentIndex() if 0 <= index < len(self.__driver_infos): driver_info = self.__driver_infos[index] + driver_info.driver_status = WebDriverStatus.INSTALLED self.updateDriverInfoDisplay(driver_info) - self.ConfirmButton.setEnabled(True) - self.DownloadButton.setEnabled(False) - self.RefreshButton.setEnabled(True) - self.DriverComboBox.setEnabled(True) - self.DeleteButton.setEnabled(True) + self.updateProgressBarStates(driver_info) + self.updateButtonStates(driver_info) @Slot() def onDownloadError( @@ -390,12 +396,15 @@ class ALWebDriverDownloadDialog(QDialog): error_message: str ): - self.StatusLabel.status = ALStatusLabel.Status.FAILURE - QMessageBox.critical(self, "下载失败 - AutoLibrary", error_message) - self.DownloadButton.setEnabled(True) - self.RefreshButton.setEnabled(True) self.DriverComboBox.setEnabled(True) - self.CancelButton.setEnabled(True) + index = self.DriverComboBox.currentIndex() + if 0 <= index < len(self.__driver_infos): + driver_info = self.__driver_infos[index] + driver_info.driver_status = WebDriverStatus.ERROR + self.updateDriverInfoDisplay(driver_info) + self.updateProgressBarStates(driver_info) + self.updateButtonStates(driver_info) + QMessageBox.critical(self, "下载失败 - AutoLibrary", error_message) @Slot() @@ -403,19 +412,16 @@ class ALWebDriverDownloadDialog(QDialog): self ): + self.DriverComboBox.setEnabled(True) index = self.DriverComboBox.currentIndex() if 0 <= index < len(self.__driver_infos): driver_info = self.__driver_infos[index] self.__driver_manager.cancelDriverDownload(driver_info) + driver_info.driver_status = WebDriverStatus.NOT_INSTALLED self.updateDriverInfoDisplay(driver_info) - self.ProgressText.setText("下载已取消") - self.ProgressBar.setValue(0) - self.StatusLabel.status = ALStatusLabel.Status.WAITING - self.DownloadButton.setEnabled(True) - self.RefreshButton.setEnabled(True) - self.DriverComboBox.setEnabled(True) - self.CancelButton.setEnabled(True) - self.DeleteButton.setEnabled(False) + self.updateProgressBarStates(driver_info) + self.updateButtonStates(driver_info) + self.ProgressText.setText("下载已取消") @Slot() @@ -427,7 +433,7 @@ class ALWebDriverDownloadDialog(QDialog): if index < 0 or index >= len(self.__driver_infos): return driver_info = self.__driver_infos[index] - if driver_info.driver_status.name != "INSTALLED": + if driver_info.driver_status != WebDriverStatus.INSTALLED: return self.__selected_driver_info = driver_info self.__confirmed = True @@ -510,27 +516,61 @@ class ALWebDriverDownloadDialog(QDialog): self.PathLabel.setText(str(driver_info.driver_path)) else: self.PathLabel.setText("未安装") - match driver_info.driver_status.name: - case "NOT_INSTALLED": + match driver_info.driver_status: + case WebDriverStatus.NOT_INSTALLED: self.StatusLabel.status = ALStatusLabel.Status.WAITING - case "INSTALLED": + case WebDriverStatus.INSTALLED: self.StatusLabel.status = ALStatusLabel.Status.SUCCESS - case "DOWNLOADING": + case WebDriverStatus.DOWNLOADING: self.StatusLabel.status = ALStatusLabel.Status.RUNNING - case "ERROR": + case WebDriverStatus.ERROR: self.StatusLabel.status = ALStatusLabel.Status.FAILURE + def updateProgressBarStates( + self, + driver_info: WebDriverInfo + ): + + if driver_info.driver_status == WebDriverStatus.NOT_INSTALLED: + self.ProgressBar.setValue(0) + self.ProgressText.setText("未安装") + elif driver_info.driver_status == WebDriverStatus.INSTALLED: + self.ProgressBar.setValue(100) + self.ProgressText.setText("已安装") + elif driver_info.driver_status == WebDriverStatus.DOWNLOADING: + pass # update by worker thread + elif driver_info.driver_status == WebDriverStatus.ERROR: + self.ProgressBar.setValue(0) + self.ProgressText.setText("下载失败") + + def updateButtonStates( self, driver_info: WebDriverInfo ): - if driver_info.driver_status.name == "INSTALLED": - self.DownloadButton.setEnabled(False) - self.DeleteButton.setEnabled(True) - self.ConfirmButton.setEnabled(True) - else: + if driver_info.driver_status == WebDriverStatus.NOT_INSTALLED: + self.RefreshButton.setEnabled(True) self.DeleteButton.setEnabled(False) self.DownloadButton.setEnabled(True) + self.CancelButton.setEnabled(True) + self.ConfirmButton.setEnabled(False) + elif driver_info.driver_status == WebDriverStatus.INSTALLED: + self.RefreshButton.setEnabled(True) + self.DownloadButton.setEnabled(False) + self.DeleteButton.setEnabled(True) + self.CancelButton.setEnabled(True) + self.ConfirmButton.setEnabled(True) + elif driver_info.driver_status == WebDriverStatus.DOWNLOADING: + self.RefreshButton.setEnabled(False) + self.DownloadButton.setEnabled(False) + self.DeleteButton.setEnabled(False) + self.CancelButton.setEnabled(True) + self.ConfirmButton.setEnabled(False) + elif driver_info.driver_status == WebDriverStatus.ERROR: + self.RefreshButton.setEnabled(True) + self.DownloadButton.setEnabled(True) + self.DeleteButton.setEnabled(False) + self.CancelButton.setEnabled(True) self.ConfirmButton.setEnabled(False) diff --git a/src/managers/driver/WebDriverManager.py b/src/managers/driver/WebDriverManager.py index 3e70bd8..7846560 100644 --- a/src/managers/driver/WebDriverManager.py +++ b/src/managers/driver/WebDriverManager.py @@ -24,7 +24,7 @@ from managers.driver.WebDriverDownloader import ( ) -class DriverStatus(Enum): +class WebDriverStatus(Enum): """ Web driver status. """ @@ -57,7 +57,7 @@ class WebDriverInfo: self.driver_version = "" self.browser_version = "" self.driver_path: Optional[Path] = None - self.driver_status = DriverStatus.NOT_INSTALLED + self.driver_status = WebDriverStatus.NOT_INSTALLED class WebDriverManager: @@ -115,7 +115,7 @@ class WebDriverManager: driver_path = self._getDriverPath(driver_info) if driver_path and driver_path.exists() and driver_path.is_file(): driver_info.driver_path = driver_path - driver_info.driver_status = DriverStatus.INSTALLED + driver_info.driver_status = WebDriverStatus.INSTALLED def _mapWebBrowserTypeToDriver( @@ -321,7 +321,7 @@ class WebDriverManager: driver_info: WebDriverInfo ) -> Optional[Path]: - if driver_info and driver_info.driver_status == DriverStatus.INSTALLED: + if driver_info and driver_info.driver_status == WebDriverStatus.INSTALLED: return driver_info.driver_path return None @@ -339,7 +339,7 @@ class WebDriverManager: progress_callback(0, 0, 0, "未找到浏览器信息") else: raise ValueError("未找到浏览器信息") - if driver_info and driver_info.driver_status == DriverStatus.DOWNLOADING: + if driver_info and driver_info.driver_status == WebDriverStatus.DOWNLOADING: if progress_callback: progress_callback(0, 0, 0, f"{driver_info.driver_type} 驱动正在下载中") else: @@ -375,19 +375,19 @@ class WebDriverManager: else: raise ValueError(f"不支持的 Web Driver 类型") with self.__lock: - driver_info.driver_status = DriverStatus.DOWNLOADING + driver_info.driver_status = WebDriverStatus.DOWNLOADING driver_path = downloader.download(progress_callback=progress_callback, cancel_event=cancel_event) with self.__lock: if driver_path: driver_info.driver_path = driver_path driver_info.driver_version = driver_version - driver_info.driver_status = DriverStatus.INSTALLED + driver_info.driver_status = WebDriverStatus.INSTALLED else: - driver_info.driver_status = DriverStatus.ERROR + driver_info.driver_status = WebDriverStatus.ERROR return driver_path except Exception as e: with self.__lock: - driver_info.driver_status = DriverStatus.ERROR + driver_info.driver_status = WebDriverStatus.ERROR raise e @@ -406,7 +406,7 @@ class WebDriverManager: shutil.rmtree(download_dir, ignore_errors=True) with self.__lock: driver_info.driver_path = None - driver_info.driver_status = DriverStatus.NOT_INSTALLED + driver_info.driver_status = WebDriverStatus.NOT_INSTALLED return True except Exception: return False @@ -424,7 +424,7 @@ class WebDriverManager: progress_callback(0, 0, 0, "未找到浏览器信息") else: raise ValueError("未找到浏览器信息") - if driver_info.driver_status != DriverStatus.INSTALLED: + if driver_info.driver_status != WebDriverStatus.INSTALLED: if progress_callback: progress_callback(0, 0, 0, f"{driver_info.driver_type} 驱动未安装") else: @@ -434,11 +434,11 @@ class WebDriverManager: driver_path.unlink() with self.__lock: driver_info.driver_path = None - driver_info.driver_status = DriverStatus.NOT_INSTALLED + driver_info.driver_status = WebDriverStatus.NOT_INSTALLED return True except Exception: with self.__lock: - driver_info.driver_status = DriverStatus.ERROR + driver_info.driver_status = WebDriverStatus.ERROR raise