|
1 | 1 | from qgis.PyQt.QtCore import Qt, QUrl, pyqtSignal |
2 | 2 | from qgis.PyQt.QtGui import QDesktopServices |
3 | | -from qgis.PyQt.QtWidgets import QFileDialog, QMessageBox, QWidget |
| 3 | +from qgis.PyQt.QtWidgets import QApplication, QFileDialog, QMessageBox, QWidget |
4 | 4 |
|
5 | 5 | from ..core.module import Module |
6 | 6 | from ..core.module_package import ModulePackage |
| 7 | +from ..core.module_version_loader import ( |
| 8 | + ModuleVersionLoader, |
| 9 | + ModuleVersionLoaderCanceled, |
| 10 | +) |
7 | 11 | from ..core.package_prepare_task import PackagePrepareTask, PackagePrepareTaskCanceled |
8 | 12 | from ..utils.plugin_utils import PluginUtils, logger |
9 | 13 | from ..utils.qt_utils import CriticalMessageBox, OverrideCursor, QtUtils |
@@ -49,13 +53,19 @@ def __init__(self, modules_config, parent=None): |
49 | 53 | self.module_seeChangeLog_pushButton.clicked.connect(self.__seeChangeLogClicked) |
50 | 54 | self.module_browseZip_toolButton.clicked.connect(self.__moduleBrowseZipClicked) |
51 | 55 |
|
| 56 | + self.__version_loader = ModuleVersionLoader(self) |
| 57 | + self.__version_loader.finished.connect(self.__loadVersionsFinished) |
| 58 | + |
52 | 59 | self.__packagePrepareTask = PackagePrepareTask(self) |
53 | 60 | self.__packagePrepareTask.finished.connect(self.__packagePrepareTaskFinished) |
54 | 61 | self.__packagePrepareTask.signalPackagingProgress.connect( |
55 | 62 | self.__packagePrepareTaskProgress |
56 | 63 | ) |
57 | 64 |
|
58 | 65 | def close(self): |
| 66 | + if self.__version_loader.isRunning(): |
| 67 | + self.__version_loader.wait() |
| 68 | + |
59 | 69 | if self.__packagePrepareTask.isRunning(): |
60 | 70 | self.__packagePrepareTask.cancel() |
61 | 71 | self.__packagePrepareTask.wait() |
@@ -83,64 +93,13 @@ def __moduleChanged(self, index): |
83 | 93 | if self.__current_module is None: |
84 | 94 | return |
85 | 95 |
|
86 | | - try: |
87 | | - with OverrideCursor(Qt.CursorShape.WaitCursor): |
88 | | - if self.__current_module.versions == list(): |
89 | | - self.__current_module.load_versions() |
90 | | - |
91 | | - for module_package in self.__current_module.versions: |
92 | | - self.module_package_comboBox.addItem( |
93 | | - module_package.display_name(), module_package |
94 | | - ) |
95 | | - |
96 | | - if self.__current_module.latest_version is not None: |
97 | | - self.module_latestVersion_label.setText( |
98 | | - f"Latest: {self.__current_module.latest_version.name}" |
99 | | - ) |
100 | | - |
101 | | - except Exception as exception: |
102 | | - error_message = str(exception) |
103 | | - if "rate limit exceeded for url" in error_message.lower(): |
104 | | - CriticalMessageBox( |
105 | | - self.tr("GitHub API Rate Limit Exceeded"), |
106 | | - self.tr( |
107 | | - "Oqtopus needs to download release data from GitHub to work properly.<br><br>" |
108 | | - "GitHub limits the number of requests that can be made without authentication. " |
109 | | - "You have reached the maximum number of requests allowed for unauthenticated users.<br><br>" |
110 | | - "To continue using this feature, please create a free GitHub personal access token and enter it in the Settings dialog.<br><br>" |
111 | | - "This will increase your request limit.<br><br>" |
112 | | - "<b>How to get a token:</b><br>" |
113 | | - "1. Go to <a href='https://github.com/settings/tokens'>GitHub Personal Access Tokens</a>.<br>" |
114 | | - "2. Click <b>Generate new token</b> and select the <code>repo</code> scope.<br>" |
115 | | - "3. Copy the generated token and paste it in the Settings dialog of this application." |
116 | | - ), |
117 | | - exception, |
118 | | - self, |
119 | | - ).exec() |
120 | | - else: |
121 | | - CriticalMessageBox( |
122 | | - self.tr("Error"), self.tr("Can't load module versions:"), exception, self |
123 | | - ).exec() |
124 | | - return |
125 | | - |
126 | | - self.module_package_comboBox.insertSeparator(self.module_package_comboBox.count()) |
127 | | - self.module_package_comboBox.addItem( |
128 | | - self.tr("Load from ZIP file"), |
129 | | - ModulePackage( |
130 | | - module=self.__current_module, |
131 | | - organisation=self.__current_module.organisation, |
132 | | - repository=self.__current_module.repository, |
133 | | - json_payload=None, |
134 | | - type=ModulePackage.Type.FROM_ZIP, |
135 | | - ), |
136 | | - ) |
137 | | - |
138 | | - self.module_package_comboBox.insertSeparator(self.module_package_comboBox.count()) |
139 | | - self.module_package_comboBox.addItem( |
140 | | - self.tr("Load development branches"), self.module_package_SPECIAL_LOAD_DEVELOPMENT |
141 | | - ) |
| 96 | + self.module_progressBar.setVisible(True) |
| 97 | + QApplication.processEvents() |
142 | 98 |
|
143 | | - logger.info(f"Versions loaded for module '{self.__current_module.name}'.") |
| 99 | + if self.__current_module.versions == list(): |
| 100 | + self.__version_loader.start_load_versions( |
| 101 | + module=self.__current_module, mode=ModuleVersionLoader.Mode.NORMAL |
| 102 | + ) |
144 | 103 |
|
145 | 104 | def __moduleVersionChanged(self, index): |
146 | 105 |
|
@@ -311,3 +270,87 @@ def __seeChangeLogClicked(self): |
311 | 270 | changelog_url = self.__current_module_package.html_url |
312 | 271 | logger.info(f"Opening changelog URL: {changelog_url}") |
313 | 272 | QDesktopServices.openUrl(QUrl(changelog_url)) |
| 273 | + |
| 274 | + def __loadVersionsFinished(self): |
| 275 | + logger.info("Loading versions finished") |
| 276 | + |
| 277 | + self.signal_loadingFinished.emit() |
| 278 | + self.module_progressBar.setVisible(False) |
| 279 | + |
| 280 | + if isinstance(self.__version_loader.lastError, ModuleVersionLoaderCanceled): |
| 281 | + logger.info("Load versions task was canceled by user.") |
| 282 | + self.module_information_label.setText(self.tr("Versions loading canceled.")) |
| 283 | + QtUtils.setForegroundColor(self.module_information_label, PluginUtils.COLOR_WARNING) |
| 284 | + return |
| 285 | + |
| 286 | + if self.__version_loader.lastError is not None: |
| 287 | + error_text = self.tr("Can't load module versions:") |
| 288 | + CriticalMessageBox( |
| 289 | + self.tr("Error"), error_text, self.__version_loader.lastError, self |
| 290 | + ).exec() |
| 291 | + self.module_information_label.setText(error_text) |
| 292 | + QtUtils.setForegroundColor(self.module_information_label, PluginUtils.COLOR_WARNING) |
| 293 | + return |
| 294 | + |
| 295 | + try: |
| 296 | + with OverrideCursor(Qt.CursorShape.WaitCursor): |
| 297 | + QApplication.processEvents() |
| 298 | + |
| 299 | + if self.__current_module.versions == list(): |
| 300 | + self.__version_loader.start_load_versions() |
| 301 | + |
| 302 | + for module_package in self.__current_module.versions: |
| 303 | + self.module_package_comboBox.addItem( |
| 304 | + module_package.display_name(), module_package |
| 305 | + ) |
| 306 | + |
| 307 | + if self.__current_module.latest_version is not None: |
| 308 | + self.module_latestVersion_label.setText( |
| 309 | + f"Latest: {self.__current_module.latest_version.name}" |
| 310 | + ) |
| 311 | + |
| 312 | + except Exception as exception: |
| 313 | + self.module_progressBar.setVisible(False) |
| 314 | + error_message = str(exception) |
| 315 | + if "rate limit exceeded for url" in error_message.lower(): |
| 316 | + CriticalMessageBox( |
| 317 | + self.tr("GitHub API Rate Limit Exceeded"), |
| 318 | + self.tr( |
| 319 | + "Oqtopus needs to download release data from GitHub to work properly.<br><br>" |
| 320 | + "GitHub limits the number of requests that can be made without authentication. " |
| 321 | + "You have reached the maximum number of requests allowed for unauthenticated users.<br><br>" |
| 322 | + "To continue using this feature, please create a free GitHub personal access token and enter it in the Settings dialog.<br><br>" |
| 323 | + "This will increase your request limit.<br><br>" |
| 324 | + "<b>How to get a token:</b><br>" |
| 325 | + "1. Go to <a href='https://github.com/settings/tokens'>GitHub Personal Access Tokens</a>.<br>" |
| 326 | + "2. Click <b>Generate new token</b> and select the <code>repo</code> scope.<br>" |
| 327 | + "3. Copy the generated token and paste it in the Settings dialog of this application." |
| 328 | + ), |
| 329 | + exception, |
| 330 | + self, |
| 331 | + ).exec() |
| 332 | + else: |
| 333 | + CriticalMessageBox( |
| 334 | + self.tr("Error"), self.tr("Can't load module versions:"), exception, self |
| 335 | + ).exec() |
| 336 | + return |
| 337 | + |
| 338 | + self.module_package_comboBox.insertSeparator(self.module_package_comboBox.count()) |
| 339 | + self.module_package_comboBox.addItem( |
| 340 | + self.tr("Load from ZIP file"), |
| 341 | + ModulePackage( |
| 342 | + module=self.__current_module, |
| 343 | + organisation=self.__current_module.organisation, |
| 344 | + repository=self.__current_module.repository, |
| 345 | + json_payload=None, |
| 346 | + type=ModulePackage.Type.FROM_ZIP, |
| 347 | + ), |
| 348 | + ) |
| 349 | + |
| 350 | + self.module_package_comboBox.insertSeparator(self.module_package_comboBox.count()) |
| 351 | + self.module_package_comboBox.addItem( |
| 352 | + self.tr("Load development branches"), self.module_package_SPECIAL_LOAD_DEVELOPMENT |
| 353 | + ) |
| 354 | + |
| 355 | + self.module_progressBar.setVisible(False) |
| 356 | + logger.info(f"Versions loaded for module '{self.__current_module.name}'.") |
0 commit comments