|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2007 - 2022 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the Plugin Info Dialog. |
|
8 """ |
|
9 |
|
10 from PyQt6.QtCore import pyqtSlot, Qt |
|
11 from PyQt6.QtGui import QBrush |
|
12 from PyQt6.QtWidgets import QDialog, QTreeWidgetItem, QHeaderView, QMenu |
|
13 |
|
14 from .Ui_PluginInfoDialog import Ui_PluginInfoDialog |
|
15 |
|
16 |
|
17 class PluginInfoDialog(QDialog, Ui_PluginInfoDialog): |
|
18 """ |
|
19 Class implementing the Plugin Info Dialog. |
|
20 """ |
|
21 def __init__(self, pluginManager, parent=None): |
|
22 """ |
|
23 Constructor |
|
24 |
|
25 @param pluginManager reference to the plugin manager object |
|
26 @param parent parent of this dialog (QWidget) |
|
27 """ |
|
28 super().__init__(parent) |
|
29 self.setupUi(self) |
|
30 self.setWindowFlags(Qt.WindowType.Window) |
|
31 |
|
32 self.pm = pluginManager |
|
33 |
|
34 self.__autoActivateColumn = 3 |
|
35 self.__activeColumn = 4 |
|
36 |
|
37 self.pluginList.headerItem().setText(self.pluginList.columnCount(), "") |
|
38 |
|
39 # populate the list |
|
40 self.__populateList() |
|
41 self.pluginList.sortByColumn(0, Qt.SortOrder.AscendingOrder) |
|
42 |
|
43 self.__menu = QMenu(self) |
|
44 self.__menu.addAction(self.tr('Show details'), self.__showDetails) |
|
45 self.__activateAct = self.__menu.addAction( |
|
46 self.tr('Activate'), self.__activatePlugin) |
|
47 self.__deactivateAct = self.__menu.addAction( |
|
48 self.tr('Deactivate'), self.__deactivatePlugin) |
|
49 self.pluginList.setContextMenuPolicy( |
|
50 Qt.ContextMenuPolicy.CustomContextMenu) |
|
51 self.pluginList.customContextMenuRequested.connect( |
|
52 self.__showContextMenu) |
|
53 |
|
54 def __populateList(self): |
|
55 """ |
|
56 Private method to (re)populate the list of plugins. |
|
57 """ |
|
58 self.pluginList.clear() |
|
59 for info in self.pm.getPluginInfos(): |
|
60 self.__createEntry(info) |
|
61 self.pluginList.sortItems( |
|
62 self.pluginList.sortColumn(), |
|
63 self.pluginList.header().sortIndicatorOrder()) |
|
64 |
|
65 def __createEntry(self, info): |
|
66 """ |
|
67 Private method to create a list entry based on the provided info. |
|
68 |
|
69 @param info dictionary giving the info for the entry (as returned by |
|
70 PluginManager.getPluginInfos()) |
|
71 @type dict |
|
72 """ |
|
73 infoList = [ |
|
74 info["module_name"], |
|
75 info["plugin_name"], |
|
76 info["version"], |
|
77 (info["auto_activate"] and self.tr("Yes") or self.tr("On-Demand")), |
|
78 (info["active"] and self.tr("Yes") or self.tr("No")), |
|
79 info["short_desc"] |
|
80 ] |
|
81 itm = QTreeWidgetItem(self.pluginList, infoList) |
|
82 if info["error"]: |
|
83 # plugin error |
|
84 for col in range(self.pluginList.columnCount()): |
|
85 itm.setForeground(col, QBrush(Qt.GlobalColor.red)) |
|
86 itm.setTextAlignment(self.__autoActivateColumn, |
|
87 Qt.AlignmentFlag.AlignHCenter) |
|
88 itm.setTextAlignment(self.__activeColumn, |
|
89 Qt.AlignmentFlag.AlignHCenter) |
|
90 |
|
91 self.pluginList.header().resizeSections( |
|
92 QHeaderView.ResizeMode.ResizeToContents) |
|
93 self.pluginList.header().setStretchLastSection(True) |
|
94 |
|
95 def __showContextMenu(self, coord): |
|
96 """ |
|
97 Private slot to show the context menu of the listview. |
|
98 |
|
99 @param coord the position of the mouse pointer (QPoint) |
|
100 """ |
|
101 itm = self.pluginList.itemAt(coord) |
|
102 if itm is not None: |
|
103 autoactivate = (itm.text(self.__autoActivateColumn) == |
|
104 self.tr("Yes")) |
|
105 if itm.text(self.__activeColumn) == self.tr("Yes"): |
|
106 self.__activateAct.setEnabled(False) |
|
107 self.__deactivateAct.setEnabled(autoactivate) |
|
108 else: |
|
109 self.__activateAct.setEnabled(autoactivate) |
|
110 self.__deactivateAct.setEnabled(False) |
|
111 self.__menu.popup(self.mapToGlobal(coord)) |
|
112 |
|
113 @pyqtSlot(QTreeWidgetItem, int) |
|
114 def on_pluginList_itemActivated(self, item, column): |
|
115 """ |
|
116 Private slot to show details about a plugin. |
|
117 |
|
118 @param item reference to the selected item (QTreeWidgetItem) |
|
119 @param column column number (integer) |
|
120 """ |
|
121 moduleName = item.text(0) |
|
122 details = self.pm.getPluginDetails(moduleName) |
|
123 if details is None: |
|
124 pass |
|
125 else: |
|
126 from .PluginDetailsDialog import PluginDetailsDialog |
|
127 dlg = PluginDetailsDialog(details, self) |
|
128 dlg.show() |
|
129 |
|
130 def __showDetails(self): |
|
131 """ |
|
132 Private slot to handle the "Show details" context menu action. |
|
133 """ |
|
134 itm = self.pluginList.currentItem() |
|
135 self.on_pluginList_itemActivated(itm, 0) |
|
136 |
|
137 def __activatePlugin(self): |
|
138 """ |
|
139 Private slot to handle the "Deactivate" context menu action. |
|
140 """ |
|
141 itm = self.pluginList.currentItem() |
|
142 moduleName = itm.text(0) |
|
143 self.pm.activatePlugin(moduleName) |
|
144 # repopulate the list |
|
145 self.__populateList() |
|
146 |
|
147 def __deactivatePlugin(self): |
|
148 """ |
|
149 Private slot to handle the "Activate" context menu action. |
|
150 """ |
|
151 itm = self.pluginList.currentItem() |
|
152 moduleName = itm.text(0) |
|
153 self.pm.deactivatePlugin(moduleName) |
|
154 # repopulate the list |
|
155 self.__populateList() |