Skip to content

Commit b0fb6fb

Browse files
committed
Enhance type hinting and docstrings in ItemListWidget for improved clarity and type safety
1 parent f815ed2 commit b0fb6fb

File tree

1 file changed

+66
-33
lines changed

1 file changed

+66
-33
lines changed

plotpy/panels/itemlist.py

Lines changed: 66 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
.. autoclass:: PlotItemList
1111
"""
1212

13+
from typing import TYPE_CHECKING
14+
1315
from guidata.configtools import get_icon, get_image_layout
1416
from guidata.qthelpers import add_actions, create_action
1517
from guidata.utils.misc import assert_interfaces_valid
@@ -19,16 +21,23 @@
1921
from plotpy.config import _
2022
from plotpy.constants import ID_ITEMLIST
2123
from plotpy.interfaces import IPanel
24+
from plotpy.interfaces import items as itf
2225
from plotpy.panels.base import PanelWidget
2326

27+
if TYPE_CHECKING:
28+
from qtpy.QtGui import QContextMenuEvent, QIcon
29+
from qtpy.QtWidgets import QListWidgetItem, QWidget
30+
31+
from plotpy.plot import BasePlot, PlotManager
32+
2433

2534
class ItemListWidget(QW.QListWidget):
2635
"""
2736
PlotItemList
2837
List of items attached to plot
2938
"""
3039

31-
def __init__(self, parent):
40+
def __init__(self, parent: QWidget) -> None:
3241
super().__init__(parent)
3342

3443
self.manager = None
@@ -50,10 +59,11 @@ def __init__(self, parent):
5059
self.refresh_actions()
5160
add_actions(self.menu, self.menu_actions)
5261

53-
def register_panel(self, manager):
54-
"""
62+
def register_panel(self, manager: PlotManager) -> None:
63+
"""Register panel to plot manager
5564
56-
:param manager:
65+
Args:
66+
manager: plot manager to register to
5767
"""
5868
self.manager = manager
5969

@@ -62,16 +72,13 @@ def register_panel(self, manager):
6272
plot.SIG_ACTIVE_ITEM_CHANGED.connect(self.active_item_changed)
6373
self.plot = self.manager.get_plot()
6474

65-
def contextMenuEvent(self, event):
75+
def contextMenuEvent(self, event: QContextMenuEvent) -> None:
6676
"""Override Qt method"""
6777
self.refresh_actions()
6878
self.menu.popup(event.globalPos())
6979

70-
def setup_actions(self):
71-
"""
72-
73-
:return:
74-
"""
80+
def setup_actions(self) -> None:
81+
"""Setup actions"""
7582
self.movedown_ac = create_action(
7683
self,
7784
_("Move to back"),
@@ -95,15 +102,16 @@ def setup_actions(self):
95102
)
96103
return [self.moveup_ac, self.movedown_ac, None, settings_ac, self.remove_ac]
97104

98-
def edit_plot_parameters(self):
99-
""" """
105+
def edit_plot_parameters(self) -> None:
106+
"""Edit plot parameters"""
100107
self.plot.edit_plot_parameters("item")
101108

102-
def __is_selection_contiguous(self):
109+
def __is_selection_contiguous(self) -> bool:
110+
"""Check if selected items are contiguous"""
103111
indexes = sorted([self.row(lw_item) for lw_item in self.selectedItems()])
104112
return len(indexes) <= 1 or list(range(indexes[0], indexes[-1] + 1)) == indexes
105113

106-
def get_selected_items(self):
114+
def get_selected_items(self) -> list[itf.IBasePlotItem]:
107115
"""Return selected QwtPlot items
108116
109117
.. warning::
@@ -116,8 +124,8 @@ def get_selected_items(self):
116124
"""
117125
return [self.items[self.row(lw_item)] for lw_item in self.selectedItems()]
118126

119-
def refresh_actions(self):
120-
""" """
127+
def refresh_actions(self) -> None:
128+
"""Refresh actions"""
121129
is_selection = len(self.selectedItems()) > 0
122130
for action in self.menu_actions:
123131
if action is not None:
@@ -130,15 +138,20 @@ def refresh_actions(self):
130138
for action in [self.moveup_ac, self.movedown_ac]:
131139
action.setEnabled(self.__is_selection_contiguous())
132140

133-
def __get_item_icon(self, item):
141+
def __get_item_icon(self, item: itf.IBasePlotItem) -> QIcon:
142+
"""Get item icon"""
134143
icon = item.icon()
135144
if icon is None:
136145
return get_icon("not_found.png")
137146
else:
138147
return icon
139148

140-
def items_changed(self, plot):
141-
"""Plot items have changed"""
149+
def items_changed(self, plot: BasePlot) -> None:
150+
"""Plot items have changed
151+
152+
Args:
153+
plot: plot
154+
"""
142155
active_plot = self.manager.get_active_plot()
143156
if active_plot is not plot:
144157
return
@@ -164,8 +177,12 @@ def items_changed(self, plot):
164177
self.refresh_actions()
165178
self.blockSignals(_block)
166179

167-
def active_item_changed(self, plot):
168-
"""Plot items have changed"""
180+
def active_item_changed(self, plot: BasePlot) -> None:
181+
"""Plot items have changed
182+
183+
Args:
184+
plot: plot
185+
"""
169186
active_plot = self.manager.get_active_plot()
170187
if active_plot is not plot:
171188
return
@@ -186,8 +203,12 @@ def active_item_changed(self, plot):
186203
self.refresh_actions()
187204
self.blockSignals(_block)
188205

189-
def current_row_changed(self, index):
190-
"""QListWidget current row has changed"""
206+
def current_row_changed(self, index: int) -> None:
207+
"""QListWidget current row has changed
208+
209+
Args:
210+
index: index
211+
"""
191212
if index == -1:
192213
return
193214
item = self.items[index]
@@ -196,23 +217,31 @@ def current_row_changed(self, index):
196217
if item is None:
197218
self.plot.replot()
198219

199-
def selection_changed(self):
200-
""" """
220+
def selection_changed(self) -> None:
221+
"""Selection has changed"""
201222
items = [item for item in self.get_selected_items() if item.can_select()]
202223
self.plot.select_some_items(items)
203224
self.plot.replot()
204225

205-
def item_changed(self, listwidgetitem):
206-
"""QListWidget item has changed"""
226+
def item_changed(self, listwidgetitem: QListWidgetItem) -> None:
227+
"""QListWidget item has changed
228+
229+
Args:
230+
listwidgetitem: list widget item
231+
"""
207232
item = self.items[self.row(listwidgetitem)]
208233
visible = listwidgetitem.checkState() == QC.Qt.Checked
209234
if visible != item.isVisible():
210235
self.plot.set_item_visible(item, visible)
211236

212-
def move_item(self, direction):
237+
def move_item(self, direction: str) -> None:
213238
"""Move item to the background/foreground
214239
Works only for contiguous selection
215-
-> 'refresh_actions' method should guarantee that"""
240+
-> 'refresh_actions' method should guarantee that
241+
242+
Args:
243+
direction: direction
244+
"""
216245
items = self.get_selected_items()
217246
if direction == "up":
218247
self.plot.move_up(items)
@@ -226,8 +255,8 @@ def move_item(self, direction):
226255
lw_item.setSelected(True)
227256
self.plot.replot()
228257

229-
def remove_item(self):
230-
""" """
258+
def remove_item(self) -> None:
259+
"""Remove item"""
231260
if len(self.selectedItems()) == 1:
232261
message = _("Do you really want to remove this item?")
233262
else:
@@ -268,8 +297,12 @@ def __init__(self, parent):
268297
vlayout.addWidget(toolbar)
269298
add_actions(toolbar, self.listwidget.menu_actions)
270299

271-
def register_panel(self, manager):
272-
"""Register panel to plot manager"""
300+
def register_panel(self, manager: PlotManager) -> None:
301+
"""Register panel to plot manager
302+
303+
Args:
304+
manager: plot manager
305+
"""
273306
self.manager = manager
274307
self.listwidget.register_panel(manager)
275308

0 commit comments

Comments
 (0)