# HG changeset patch # User Radek Brich # Date 1357514625 -3600 # Node ID 1ab0edd5d7846437111f31f5c0e0dad634f24fe0 # Parent 86b84535726e44777b6f6781bb250bb5aaf89197 DriverSDL: mousewheel, key repeation. diff -r 86b84535726e -r 1ab0edd5d784 demo_input.py --- a/demo_input.py Sun Jan 06 23:03:24 2013 +0100 +++ b/demo_input.py Mon Jan 07 00:23:45 2013 +0100 @@ -4,24 +4,29 @@ import locale locale.setlocale(locale.LC_ALL, '') -from tuikit import * +from tuikit import Application, TextEdit class MyApplication(Application): def __init__(self): Application.__init__(self) - self.top.add_handler('keypress', self.on_top_keypress) self.text = '' - textedit = TextEdit(100, 40, self.text) - self.top.add(textedit) - textedit.x = 2 - self.textedit = textedit + self.textedit = TextEdit(100, 40, self.text) + self.top.add(self.textedit) + self.textedit.x = 2 - def on_top_keypress(self, ev): - if ev.char == 'q': + editbox = self.textedit.editbox + editbox.add_handler('keypress', self.on_any_input) + editbox.add_handler('mousedown', self.on_any_input) + editbox.add_handler('mouseup', self.on_any_input) + editbox.add_handler('mousewheel', self.on_any_input) + editbox.add_handler('mousemove', self.on_any_input) + + def on_any_input(self, ev): + if ev.event_name == 'keypress' and ev.char == 'q': self.terminate() - self.text += 'keyname: %(keyname)s char: %(char)s\n' % ev + self.text += ''.join((ev.event_name.ljust(10), ' : ', repr(ev), '\n')) self.textedit.settext(self.text) self.textedit.scrolltoend() return True diff -r 86b84535726e -r 1ab0edd5d784 docs/driver.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/driver.rst Mon Jan 07 00:23:45 2013 +0100 @@ -0,0 +1,46 @@ +Driver +====== + +Tuikit driver is the lowest part of the kit - it actually draws characters on screen, +receives user events and forwards them to widgets. + +Any dirty details of actual graphical toolkit should be hidden by this driver. +Though it's not hardware driver, nowhere near that. Tuikit driver is expected to use +pretty high-level libraries, it's low-level only in Tuikit perpective. + +Currently there are three drivers: Dummy, Curses, SDL + + +Dummy driver +------------ + +This driver shows and documents complete interface required from any driver. + +It does not draw anything and immediately emits keypress event for 'q' char and 'escape' key, +which should exit application. + +All methods of dummy driver just report they where being called - into log file. + + +Curses driver +------------- + +Default driver for Text User Interface in any terminal supporting required features. +Uses curses module from Python. + + +SDL driver +---------- + +Creates graphical window and draws characters here. This has less limits than curses, +we can use any colors, fonts and possibly even draw images. + +Though by default, it just emulates terminal with curses. + +SDL application is more portable than curses one, which means that Tuikit application +using SDL driver may work in non-unix OS like Windows (does not currently, +due to unconditional use of fontconfig). + +SDL driver requires sdlterm module for Python, which must be compiled from C++. +See sdlterm directory in Tuikit distribution. + diff -r 86b84535726e -r 1ab0edd5d784 docs/index.rst --- a/docs/index.rst Sun Jan 06 23:03:24 2013 +0100 +++ b/docs/index.rst Mon Jan 07 00:23:45 2013 +0100 @@ -16,6 +16,7 @@ events redraw colors + driver .. inheritance-diagram:: tuikit.application tuikit.events diff -r 86b84535726e -r 1ab0edd5d784 sdlterm/cython/sdlterm.pyx --- a/sdlterm/cython/sdlterm.pyx Sun Jan 06 23:03:24 2013 +0100 +++ b/sdlterm/cython/sdlterm.pyx Mon Jan 07 00:23:45 2013 +0100 @@ -94,6 +94,8 @@ return ('mousedown', event.mouse.x, event.mouse.y, event.mouse.button) if event.type == event.MOUSEUP: return ('mouseup', event.mouse.x, event.mouse.y, event.mouse.button) + if event.type == event.MOUSEWHEEL: + return ('mousewheel', event.mouse.x, event.mouse.y, event.mouse.button) if event.type == event.KEYPRESS: keyname = event.key.keyname if keyname: diff -r 86b84535726e -r 1ab0edd5d784 sdlterm/src/sdlterm.cc --- a/sdlterm/src/sdlterm.cc Sun Jan 06 23:03:24 2013 +0100 +++ b/sdlterm/src/sdlterm.cc Mon Jan 07 00:23:45 2013 +0100 @@ -307,7 +307,8 @@ Terminal::Terminal() - : _screen(), _attr(7), _cursor_visible(false), _mousemove_last_x(-1) + : _screen(), _attr(7), _cursor_x(0), _cursor_y(0), _cursor_visible(false), + _mousemove_last_x(-1), _mousemove_last_y(-1) { if (SDL_Init(SDL_INIT_VIDEO) == -1) { @@ -315,6 +316,7 @@ throw std::exception(); } SDL_EnableUNICODE(1); + SDL_EnableKeyRepeat(250, SDL_DEFAULT_REPEAT_INTERVAL); SDL_WM_SetCaption("terminal", NULL); } @@ -387,6 +389,12 @@ event.mouse.x = sdl_event.button.x / _screen.get_cell_width(); event.mouse.y = sdl_event.button.y / _screen.get_cell_height(); event.mouse.button = sdl_event.button.button; + if (sdl_event.button.button == SDL_BUTTON_WHEELUP || sdl_event.button.button == SDL_BUTTON_WHEELDOWN) + { + if (sdl_event.type == SDL_MOUSEBUTTONUP) + break; // do not report button-up events for mouse wheel + event.type = Event::MOUSEWHEEL; + } _mousemove_last_x = -1; return; diff -r 86b84535726e -r 1ab0edd5d784 tuikit/events.py --- a/tuikit/events.py Sun Jan 06 23:03:24 2013 +0100 +++ b/tuikit/events.py Mon Jan 07 00:23:45 2013 +0100 @@ -14,6 +14,7 @@ class Event: def __init__(self): + self.event_name = None self.originator = None def __getitem__(self, key): @@ -62,6 +63,7 @@ self.wy = y self.px = 0 # parent coordinates self.py = 0 + #: Mouse button: left=1, middle=2, right=3, wheelup=4 wheeldown=5 self.button = button def childevent(self, child): @@ -194,6 +196,7 @@ event = self._event_class[event_name](*args, **kwargs) # set originator to instance on which emit() was called event.originator = self + event.event_name = event_name # call handlers from first to last, stop if satisfied for handler in self._event_handlers[event_name]: handled = handler(event)