1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import wx
from wx.lib.mixins.listctrl import TextEditMixin # type: ignore[import-untyped]
class EditableListCtrl(wx.ListCtrl, TextEditMixin):
def __init__(self, parent, ID=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, editable_column=2):
wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
TextEditMixin.__init__(self)
self.editable_column = editable_column
def OpenEditor(self, column, row):
self.original_data = self.GetItemText(row, column)
if column == self.editable_column:
TextEditMixin.OpenEditor(self, column, row)
if self.editable_column == 3 and column == 0:
self.CheckItem(row, not self.IsItemChecked(row))
self.editor.Bind(wx.EVT_KEY_DOWN, self.on_escape)
def on_escape(self, event=None):
keycode = event.GetKeyCode()
if keycode == wx.WXK_ESCAPE:
self.CloseEditor(event=None, swap=True)
event.Skip()
def CloseEditor(self, event=None, swap=False):
if swap:
self.editor.Hide()
TextEditMixin.CloseEditor(self, event)
return
text = self.editor.GetValue()
if text:
try:
float(text)
except ValueError:
swap = True
if swap:
self.editor.SetValue(self.original_data)
TextEditMixin.CloseEditor(self, event)
|