FreeCAD
153 строки · 6.7 Кб
1# SPDX-License-Identifier: LGPL-2.1-or-later
2# ***************************************************************************
3# * *
4# * Copyright (c) 2022 FreeCAD Project Association *
5# * *
6# * This file is part of FreeCAD. *
7# * *
8# * FreeCAD is free software: you can redistribute it and/or modify it *
9# * under the terms of the GNU Lesser General Public License as *
10# * published by the Free Software Foundation, either version 2.1 of the *
11# * License, or (at your option) any later version. *
12# * *
13# * FreeCAD is distributed in the hope that it will be useful, but *
14# * WITHOUT ANY WARRANTY; without even the implied warranty of *
15# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16# * Lesser General Public License for more details. *
17# * *
18# * You should have received a copy of the GNU Lesser General Public *
19# * License along with FreeCAD. If not, see *
20# * <https://www.gnu.org/licenses/>. *
21# * *
22# ***************************************************************************
23
24""" Contains a wrapper class for a table listing authors and maintainers """
25
26import os27
28from PySide.QtWidgets import QTableWidgetItem29from PySide.QtGui import QIcon30from PySide.QtCore import Qt31
32import FreeCAD33import FreeCADGui34
35from addonmanager_devmode_person_editor import PersonEditor36
37translate = FreeCAD.Qt.translate38
39# pylint: disable=too-few-public-methods
40
41
42class PeopleTable:43"""A QTableWidget and associated buttons for managing the list of authors and maintainers."""44
45def __init__(self):46self.widget = FreeCADGui.PySideUic.loadUi(47os.path.join(os.path.dirname(__file__), "developer_mode_people_table.ui")48)49
50self.widget.addButton.setIcon(QIcon.fromTheme("add", QIcon(":/icons/list-add.svg")))51self.widget.removeButton.setIcon(52QIcon.fromTheme("remove", QIcon(":/icons/list-remove.svg"))53)54
55self.widget.addButton.clicked.connect(self._add_clicked)56self.widget.removeButton.clicked.connect(self._remove_clicked)57self.widget.tableWidget.itemSelectionChanged.connect(self._selection_changed)58self.widget.tableWidget.itemDoubleClicked.connect(self._edit)59self.metadata = None60
61def show(self, metadata):62"""Set up the widget based on incoming metadata"""63self.metadata = metadata64self._populate_from_metadata()65self.widget.removeButton.setDisabled(True)66self.widget.show()67
68def _populate_from_metadata(self):69"""Use the passed metadata object to populate the maintainers and authors"""70self.widget.tableWidget.setRowCount(0)71row = 072for maintainer in self.metadata.Maintainer:73name = maintainer["name"]74email = maintainer["email"]75self._add_row(row, "maintainer", name, email)76row += 177for author in self.metadata.Author:78name = author["name"]79email = author["email"]80self._add_row(row, "author", name, email)81row += 182
83def _add_row(self, row, person_type, name, email):84"""Add this person to the tableWidget at row given"""85person_type_translation = {86"maintainer": translate("AddonsInstaller", "Maintainer"),87"author": translate("AddonsInstaller", "Author"),88}89self.widget.tableWidget.insertRow(row)90item = QTableWidgetItem(person_type_translation[person_type])91item.setData(Qt.UserRole, person_type)92self.widget.tableWidget.setItem(row, 0, item)93self.widget.tableWidget.setItem(row, 1, QTableWidgetItem(name))94self.widget.tableWidget.setItem(row, 2, QTableWidgetItem(email))95
96def _add_clicked(self):97"""Callback: the Add Person button was clicked"""98dlg = PersonEditor()99person_type, name, email = dlg.exec()100if person_type and name:101self._add_row(self.widget.tableWidget.rowCount(), person_type, name, email)102if person_type == "maintainer":103self.metadata.addMaintainer(name, email)104else:105self.metadata.addAuthor(name, email)106
107def _remove_clicked(self):108"""Callback: the Remove Person button was clicked"""109items = self.widget.tableWidget.selectedIndexes()110if items:111# We only support single-selection, so can just pull the row # from112# the first entry113row = items[0].row()114person_type = self.widget.tableWidget.item(row, 0).data(Qt.UserRole)115name = self.widget.tableWidget.item(row, 1).text()116email = self.widget.tableWidget.item(row, 2).text()117self.widget.tableWidget.removeRow(row)118if person_type == "maintainer":119self.metadata.removeMaintainer(name, email)120else:121self.metadata.removeAuthor(name, email)122
123def _edit(self, item):124"""Callback: a row in the tableWidget was double-clicked"""125row = item.row()126person_type = self.widget.tableWidget.item(row, 0).data(Qt.UserRole)127name = self.widget.tableWidget.item(row, 1).text()128email = self.widget.tableWidget.item(row, 2).text()129
130dlg = PersonEditor()131dlg.setup(person_type, name, email)132new_person_type, new_name, new_email = dlg.exec()133
134if new_person_type and new_name:135self.widget.tableWidget.removeRow(row)136if person_type == "maintainer":137self.metadata.removeMaintainer(name, email)138else:139self.metadata.removeAuthor(name, email)140self._add_row(row, new_person_type, new_name, email)141if new_person_type == "maintainer":142self.metadata.addMaintainer(new_name, new_email)143else:144self.metadata.addAuthor(new_name, new_email)145self.widget.tableWidget.selectRow(row)146
147def _selection_changed(self):148"""Callback: the current selection in the tableWidget changed"""149items = self.widget.tableWidget.selectedItems()150if items:151self.widget.removeButton.setDisabled(False)152else:153self.widget.removeButton.setDisabled(True)154