changeset 11c3d9a341d0 in tryton:6.2
details: https://hg.tryton.org/tryton?cmd=changeset&node=11c3d9a341d0
description:
Stop key-press-event and insert decimal point
On Windows editing the keyval of the event does not work anymore.
So we must insert ourself the decimal point in the entry buffer.
issue10956
review374311002
(grafted from 8fe7c0da72026de62ecd988e638cb2a410c5d5d3)
diffstat:
tryton/common/cellrendererfloat.py | 42 ++++++++++++++++++++++-------------
tryton/common/cellrendererinteger.py | 16 ++++++++-----
tryton/common/number_entry.py | 6 ++++-
3 files changed, 41 insertions(+), 23 deletions(-)
diffs (104 lines):
diff -r d3b10f67bd26 -r 11c3d9a341d0 tryton/common/cellrendererfloat.py
--- a/tryton/common/cellrendererfloat.py Fri Dec 03 21:44:25 2021 +0100
+++ b/tryton/common/cellrendererfloat.py Mon Dec 06 23:37:42 2021 +0100
@@ -17,29 +17,39 @@
super().on_editing_started(editable, path)
editable.connect('key-press-event', self.key_press_event)
+ @property
+ def __decimal_point(self):
+ return locale.localeconv()['decimal_point']
+
+ @property
+ def __thousands_sep(self):
+ return locale.localeconv()['thousands_sep']
+
def key_press_event(self, widget, event):
for name in ('KP_Decimal', 'KP_Separator'):
if event.keyval == Gdk.keyval_from_name(name):
- event.keyval = int(Gdk.unicode_to_keyval(
- ord(locale.localeconv()['decimal_point'])))
+ text = self.__decimal_point
+ position = widget.props.cursor_position
+ if self._can_insert_text(widget, text, position):
+ buffer_ = widget.get_buffer()
+ buffer_.insert_text(position, text, len(text))
+ widget.set_position(
+ widget.props.cursor_position + len(text))
+ return True
- def sig_insert_text(self, entry, new_text, new_text_length, position):
+ def _can_insert_text(self, entry, new_text, position):
value = entry.get_text()
position = entry.get_position()
new_value = value[:position] + new_text + value[position:]
- decimal_point = locale.localeconv()['decimal_point']
-
- if new_value in ('-', decimal_point):
- return
-
- try:
- value = locale.atof(new_value)
- except ValueError:
- entry.stop_emission_by_name('insert-text')
- return
-
- if self.digits and not (round(value, self.digits[1]) == float(value)):
- entry.stop_emission_by_name('insert-text')
+ if new_value not in {'-', self.__decimal_point, self.__thousands_sep}:
+ try:
+ value = locale.atof(new_value)
+ except ValueError:
+ return False
+ if (self.digits
+ and not (round(value, self.digits[1]) == float(value))):
+ return False
+ return True
GObject.type_register(CellRendererFloat)
diff -r d3b10f67bd26 -r 11c3d9a341d0 tryton/common/cellrendererinteger.py
--- a/tryton/common/cellrendererinteger.py Fri Dec 03 21:44:25 2021 +0100
+++ b/tryton/common/cellrendererinteger.py Mon Dec 06 23:37:42 2021 +0100
@@ -14,15 +14,19 @@
editable.set_alignment(1.0)
editable.connect('insert_text', self.sig_insert_text)
- def sig_insert_text(self, entry, new_text, new_text_length, position):
+ def _can_insert_text(self, entry, new_text, position):
value = entry.get_text()
position = entry.get_position()
new_value = value[:position] + new_text + value[position:]
- if new_value == '-':
- return
- try:
- locale.atoi(new_value)
- except ValueError:
+ if new_value != '-':
+ try:
+ locale.atoi(new_value)
+ except ValueError:
+ return False
+ return True
+
+ def sig_insert_text(self, entry, new_text, new_text_length, position):
+ if not self._can_insert_text(entry, new_text, position):
entry.stop_emission_by_name('insert-text')
diff -r d3b10f67bd26 -r 11c3d9a341d0 tryton/common/number_entry.py
--- a/tryton/common/number_entry.py Fri Dec 03 21:44:25 2021 +0100
+++ b/tryton/common/number_entry.py Mon Dec 06 23:37:42 2021 +0100
@@ -72,7 +72,11 @@
def __key_press_event(self, event):
for name in ['KP_Decimal', 'KP_Separator']:
if event.keyval == Gdk.keyval_from_name(name):
- event.keyval = Gdk.unicode_to_keyval(ord(self.__decimal_point))
+ text = self.__decimal_point
+ self.do_insert_text(
+ text, len(text), self.props.cursor_position)
+ self.set_position(self.props.cursor_position + len(text))
+ return True
GObject.type_register(NumberEntry)