Mercurial > libervia-backend
comparison frontends/src/primitivus/primitivus @ 1947:be4b143cf123
primitivus: fixed paste detection/handling:
- mouse and window events are discarded
- input_ is used to get text
- cursor position is used to paste buffer in the good place, and updated once finished
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 22 Apr 2016 22:30:13 +0200 |
parents | 827bb478d8af |
children | 373550000092 |
comparison
equal
deleted
inserted
replaced
1946:827bb478d8af | 1947:be4b143cf123 |
---|---|
23 from sat.core import log_config | 23 from sat.core import log_config |
24 log_config.satConfigure(C.LOG_BACKEND_STANDARD, C) | 24 log_config.satConfigure(C.LOG_BACKEND_STANDARD, C) |
25 from sat.core import log as logging | 25 from sat.core import log as logging |
26 log = logging.getLogger(__name__) | 26 log = logging.getLogger(__name__) |
27 import urwid | 27 import urwid |
28 from urwid.util import is_wide_char | |
28 from urwid_satext import sat_widgets | 29 from urwid_satext import sat_widgets |
29 from urwid_satext.files_management import FileDialog | 30 from urwid_satext.files_management import FileDialog |
30 from sat_frontends.bridge.DBus import DBusBridgeFrontend | 31 from sat_frontends.bridge.DBus import DBusBridgeFrontend |
31 from sat_frontends.quick_frontend.quick_app import QuickApp | 32 from sat_frontends.quick_frontend.quick_app import QuickApp |
32 from sat_frontends.quick_frontend import quick_utils | 33 from sat_frontends.quick_frontend import quick_utils |
356 self._early_popup = popup | 357 self._early_popup = popup |
357 else: | 358 else: |
358 self.showPopUp(popup) | 359 self.showPopUp(popup) |
359 super(PrimitivusApp, self).postInit(self.main_widget) | 360 super(PrimitivusApp, self).postInit(self.main_widget) |
360 | 361 |
362 def keysToText(self, keys): | |
363 """Generator return normal text from urwid keys""" | |
364 for k in keys: | |
365 if k == 'tab': | |
366 yield u'\t' | |
367 elif k == 'enter': | |
368 yield u'\n' | |
369 elif is_wide_char(k,0) or (len(k)==1 and ord(k) >= 32): | |
370 yield k | |
371 | |
361 def inputFilter(self, input_, raw): | 372 def inputFilter(self, input_, raw): |
362 if self.__saved_overlay and input_ != a_key['OVERLAY_HIDE']: | 373 if self.__saved_overlay and input_ != a_key['OVERLAY_HIDE']: |
363 return | 374 return |
364 | 375 |
365 if len(input_) > 1: # XXX: it may be needed to increase this value if buffer | 376 if (len(input_) > 1 and # XXX: it may be needed to increase this value if buffer |
366 # or other things result in several chars at once | 377 not isinstance(input_[0], tuple) and # or other things result in several chars at once |
367 # (e.g. using Primitivus through ssh). Need some testing | 378 not 'window' in input_[0]): # (e.g. using Primitivus through ssh). Need some testing |
368 # and experience to adjust value. | 379 # and experience to adjust value. |
369 log.debug(u"Paste detected") | 380 log.debug(u"Paste detected (len {})".format(len(input_))) |
370 try: | 381 try: |
371 edit_bar = self.editBar | 382 edit_bar = self.editBar |
372 except AttributeError: | 383 except AttributeError: |
373 log.warning(u"Paste discarded: there is no edit bar yet") | 384 log.warning(u"Paste discarded: there is no edit bar yet") |
374 else: | 385 else: |
375 # XXX: if a paste is detected, we append it directly to the edit bar text | 386 # XXX: if a paste is detected, we append it directly to the edit bar text |
376 # so the use can check it and press [enter] if it's OK | 387 # so the use can check it and press [enter] if it's OK |
377 buf_paste = u''.join((unichr(k) for k in raw)) | 388 buf_paste = u''.join(self.keysToText(input_)) |
378 edit_bar.set_edit_text(u'{}{}'.format(edit_bar.edit_text, buf_paste)) | 389 pos = edit_bar.edit_pos |
390 edit_bar.set_edit_text(u'{}{}{}'.format(edit_bar.edit_text[:pos], buf_paste, edit_bar.edit_text[pos:])) | |
391 edit_bar.edit_pos+=len(buf_paste) | |
379 return | 392 return |
380 | 393 |
381 for i in input_: | 394 for i in input_: |
382 if isinstance(i,tuple): | 395 if isinstance(i,tuple): |
383 if i[0] == 'mouse press': | 396 if i[0] == 'mouse press': |