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 os
27
28from PySide.QtWidgets import QTableWidgetItem
29from PySide.QtGui import QIcon
30from PySide.QtCore import Qt
31
32import FreeCAD
33import FreeCADGui
34
35from addonmanager_devmode_person_editor import PersonEditor
36
37translate = FreeCAD.Qt.translate
38
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 = None
60
61def show(self, metadata):
62"""Set up the widget based on incoming metadata"""
63self.metadata = metadata
64self._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 = 0
72for maintainer in self.metadata.Maintainer:
73name = maintainer["name"]
74email = maintainer["email"]
75self._add_row(row, "maintainer", name, email)
76row += 1
77for author in self.metadata.Author:
78name = author["name"]
79email = author["email"]
80self._add_row(row, "author", name, email)
81row += 1
82
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 # from
112# the first entry
113row = 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