summaryrefslogtreecommitdiff
path: root/lib/gui/edit_json/editable_list.py
blob: 7a51f0b6a2cc0a2c9079958aaed84d273635610b (plain)
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)