|
1 | 1 | # SPDX-License-Identifier: LGPL-2.1-or-later |
2 | 2 | # *************************************************************************** |
3 | 3 | # * * |
4 | | -# * Copyright (c) 2022 FreeCAD Project Association * |
| 4 | +# * Copyright (c) 2022-2025 FreeCAD project association AISBL * |
5 | 5 | # * * |
6 | 6 | # * This file is part of FreeCAD. * |
7 | 7 | # * * |
@@ -85,6 +85,8 @@ class UpdateAllGUI(QtCore.QObject): |
85 | 85 | finished = QtCore.Signal() |
86 | 86 | addon_updated = QtCore.Signal(object) |
87 | 87 |
|
| 88 | + index_role = QtCore.Qt.UserRole + 1 |
| 89 | + |
88 | 90 | def __init__(self, addons: List[Addon]): |
89 | 91 | super().__init__() |
90 | 92 | self.addons = addons |
@@ -114,28 +116,58 @@ def _setup_dialog(self): |
114 | 116 | self.dialog.tableWidget.clear() |
115 | 117 | self.in_process_row = None |
116 | 118 | self.row_map = {} |
| 119 | + self._setup_empty_table() |
| 120 | + counter = 0 |
117 | 121 | for addon in self.addons: |
118 | 122 | if addon.status() == Addon.Status.UPDATE_AVAILABLE: |
119 | | - self._add_addon_to_table(addon) |
| 123 | + self._add_addon_to_table(addon, counter) |
120 | 124 | self.addons_with_update.append(addon) |
| 125 | + counter += 1 |
121 | 126 |
|
122 | 127 | def _cancel_installation(self): |
123 | 128 | self.cancelled = True |
124 | 129 | if self.worker_thread and self.worker_thread.isRunning(): |
125 | 130 | self.worker_thread.requestInterruption() |
126 | 131 |
|
127 | | - def _add_addon_to_table(self, addon: Addon): |
128 | | - """Add the given addon to the list, with no icon in the first column""" |
| 132 | + def _setup_empty_table(self): |
| 133 | + self.dialog.tableWidget.setColumnCount(4) |
| 134 | + self.dialog.tableWidget.horizontalHeader().setSectionResizeMode( |
| 135 | + 0, QtWidgets.QHeaderView.ResizeMode.ResizeToContents |
| 136 | + ) |
| 137 | + self.dialog.tableWidget.horizontalHeader().setSectionResizeMode( |
| 138 | + 1, QtWidgets.QHeaderView.ResizeMode.ResizeToContents |
| 139 | + ) |
| 140 | + self.dialog.tableWidget.horizontalHeader().setSectionResizeMode( |
| 141 | + 2, QtWidgets.QHeaderView.ResizeMode.ResizeToContents |
| 142 | + ) |
| 143 | + self.dialog.tableWidget.horizontalHeader().setSectionResizeMode( |
| 144 | + 3, QtWidgets.QHeaderView.ResizeMode.Stretch |
| 145 | + ) |
| 146 | + |
| 147 | + def _add_addon_to_table(self, addon: Addon, index: int): |
| 148 | + """Add the given addon to the list, storing its index as user data in the first column""" |
129 | 149 | new_row = self.dialog.tableWidget.rowCount() |
130 | | - self.dialog.tableWidget.setColumnCount(2) |
131 | 150 | self.dialog.tableWidget.setRowCount(new_row + 1) |
132 | | - self.dialog.tableWidget.setItem(new_row, 0, QtWidgets.QTableWidgetItem(addon.display_name)) |
133 | | - self.dialog.tableWidget.setItem(new_row, 1, QtWidgets.QTableWidgetItem("")) |
| 151 | + new_item = QtWidgets.QTableWidgetItem(addon.display_name) |
| 152 | + new_item.setData(UpdateAllGUI.index_role, index) # Only first item in each row needs data() |
| 153 | + self.dialog.tableWidget.setItem(new_row, 0, new_item) |
| 154 | + if addon.installed_metadata and addon.installed_metadata.version: |
| 155 | + self.dialog.tableWidget.setItem( |
| 156 | + new_row, 1, QtWidgets.QTableWidgetItem(str(addon.installed_metadata.version)) |
| 157 | + ) |
| 158 | + self.dialog.tableWidget.setItem(new_row, 2, QtWidgets.QTableWidgetItem("")) |
| 159 | + self.dialog.tableWidget.setItem(new_row, 3, QtWidgets.QTableWidgetItem("")) |
134 | 160 | self.row_map[addon.name] = new_row |
135 | 161 |
|
136 | 162 | def _update_addon_status(self, row: int, status: AddonStatus): |
137 | 163 | """Update the GUI to reflect this addon's new status.""" |
138 | | - self.dialog.tableWidget.item(row, 1).setText(status.ui_string()) |
| 164 | + self.dialog.tableWidget.item(row, 2).setText(status.ui_string()) |
| 165 | + if status == AddonStatus.SUCCEEDED and self.addons[row].metadata: |
| 166 | + self.dialog.tableWidget.item(row, 2).setText(status.ui_string() + " →") |
| 167 | + index = self.dialog.tableWidget.item(row, 0).data(UpdateAllGUI.index_role) |
| 168 | + addon = self.addons[index] |
| 169 | + if addon.metadata and addon.metadata.version: |
| 170 | + self.dialog.tableWidget.item(row, 3).setText(str(addon.metadata.version)) |
139 | 171 |
|
140 | 172 | def _process_next_update(self): |
141 | 173 | """Grab the next addon in the list and start its updater.""" |
|
0 commit comments