# HG changeset patch # User Radek Brich # Date 1300206429 -3600 # Node ID 684cdc3525624ba943a3498436b398d17723e794 # Parent 69318aba22bfcbcd3a53efdfcf413353b1249d4a Menu, Window and other improvements. diff -r 69318aba22bf -r 684cdc352562 docs/button.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/button.rst Tue Mar 15 17:27:09 2011 +0100 @@ -0,0 +1,2 @@ +Button +====== diff -r 69318aba22bf -r 684cdc352562 docs/container.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/container.rst Tue Mar 15 17:27:09 2011 +0100 @@ -0,0 +1,7 @@ +Container +========= + +.. toctree:: + :maxdepth: 2 + + window diff -r 69318aba22bf -r 684cdc352562 docs/index.rst --- a/docs/index.rst Thu Feb 17 23:35:05 2011 +0100 +++ b/docs/index.rst Tue Mar 15 17:27:09 2011 +0100 @@ -1,22 +1,13 @@ -.. Tuikit documentation master file, created by - sphinx-quickstart on Wed Feb 2 23:35:28 2011. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to Tuikit's documentation! -================================== +Tuikit documentation +==================== Contents: .. toctree:: - :maxdepth: 2 + :maxdepth: 3 + widget + focus redraw -Indices and tables -================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - diff -r 69318aba22bf -r 684cdc352562 docs/redraw.rst --- a/docs/redraw.rst Thu Feb 17 23:35:05 2011 +0100 +++ b/docs/redraw.rst Tue Mar 15 17:27:09 2011 +0100 @@ -0,0 +1,2 @@ +Redraw +====== diff -r 69318aba22bf -r 684cdc352562 docs/widget.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/widget.rst Tue Mar 15 17:27:09 2011 +0100 @@ -0,0 +1,57 @@ +Widget +====== + +.. toctree:: + :maxdepth: 2 + + container + button + +Class attributes +---------------- + +.. attribute:: Widget.parent + +.. attribute:: Widget.top + +.. attribute:: Widget.x + +.. attribute:: Widget.y + +.. attribute:: Widget.width + +.. attribute:: Widget.height + +.. attribute:: Widget.hidden + +.. attribute:: Widget.allowlayout + + +Event management +---------------- + +.. classmethod:: Widget.newevent(event) + + Create new event with empty handler list. + + +.. classmethod:: Widget.connect(event, handler) + + Add handler to handler list of the event. + + +.. classmethod:: Widget.disconnect(event, handler=None) + + Remove handler from event's handler list. If no handler is given, remove all handlers. + + +.. classmethod:: Widget.handle(event, ...) + + Call all handlers from event's handler list. + This is used when user defined handlers are to be called. + + +.. classmethod:: Widget.emit(event, ...) + + Emit event. + This is used by original event source when the event is detected. diff -r 69318aba22bf -r 684cdc352562 docs/window.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/window.rst Tue Mar 15 17:27:09 2011 +0100 @@ -0,0 +1,2 @@ +Window +====== diff -r 69318aba22bf -r 684cdc352562 editor.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/editor.py Tue Mar 15 17:27:09 2011 +0100 @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import locale +locale.setlocale(locale.LC_ALL, '') + +import os + +from tuikit.application import Application +from tuikit.editfield import EditField +from tuikit.window import Window +from tuikit.button import Button +from tuikit.scrollbar import VScrollbar +from tuikit.textedit import TextEdit + + +class MyApplication(Application): + def __init__(self): + Application.__init__(self) + self.top.connect('keypress', self.globalkeypress) + + #edit = EditField(50, 'DlouhyTest12') + #self.top.add(edit) + + + t = open('tuikit/widget.py').read() + textedit = TextEdit(100, 40, t) + self.top.add(textedit) + textedit.x = 2 + self.textedit = textedit + + #win = Window() + #self.top.add(win) + + #button = Button('click!') + #win.add(button) + #button.x = 10 + #button.y = 7 + + #button.connect('click', self.buttonclick) + #self.button = button + + #subwin = Window(8,8) + #win.add(subwin) + + + def buttonclick(self): + self.button.label = 'YES' + + + def globalkeypress(self, keyname, char): + if keyname == 'escape': + self.terminate() + if keyname == 'f1': + self.textedit.settext('%s' % self.top.focuschild) + self.textedit.redraw() + + + +if __name__ == '__main__': + os.environ['ESCDELAY'] = '25' # do not wait 1 second after pressing Escape key + app = MyApplication() + app.start() + diff -r 69318aba22bf -r 684cdc352562 example.py --- a/example.py Thu Feb 17 23:35:05 2011 +0100 +++ b/example.py Tue Mar 15 17:27:09 2011 +0100 @@ -15,11 +15,15 @@ menubar = MenuBar() self.top.add(menubar) - win = Window() - self.top.add(win) - win.x = 10 - win.y = 5 - win.allowlayout = False + helpwin = Window() + self.top.add(helpwin) + helpwin.x = 10 + helpwin.y = 5 + helpwin.allowlayout = False + helpwin.hidden = True + helpwin.title = 'About' + #helpwin.closebutton = False + #helpwin.resizable = False filemenu = Menu([ @@ -33,7 +37,7 @@ self.top.add(filemenu) editmenu = Menu([('Copy', None), ('Paste', None)]) - helpmenu = Menu([('About', None)]) + helpmenu = Menu([('About', helpwin)]) self.top.add(editmenu) self.top.add(helpmenu) diff -r 69318aba22bf -r 684cdc352562 tuikit/backend_curses.py --- a/tuikit/backend_curses.py Thu Feb 17 23:35:05 2011 +0100 +++ b/tuikit/backend_curses.py Tue Mar 15 17:27:09 2011 +0100 @@ -84,6 +84,8 @@ curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLACK) curses.init_pair(2, curses.COLOR_BLACK, curses.COLOR_CYAN) curses.init_pair(3, curses.COLOR_WHITE, curses.COLOR_CYAN) + curses.init_pair(4, curses.COLOR_WHITE, curses.COLOR_BLUE) + curses.init_pair(5, curses.COLOR_CYAN, curses.COLOR_BLUE) self.BOLD = curses.A_BOLD self.BLINK = curses.A_BLINK @@ -162,6 +164,10 @@ ## attributes ## def pushcolor(self, col, attr=0): + if type(col) is tuple: + col, attr = col + if attr == 'bold': + attr = self.BOLD self.screen.attrset(curses.color_pair(col) | attr) self.colorstack.append((col, attr)) diff -r 69318aba22bf -r 684cdc352562 tuikit/button.py --- a/tuikit/button.py Thu Feb 17 23:35:05 2011 +0100 +++ b/tuikit/button.py Tue Mar 15 17:27:09 2011 +0100 @@ -12,6 +12,11 @@ self.label = label self.bg = 1 + self.bghi = 2 + self.highlight = False + + self.lbracket = '<' + self.rbracket = '>' self.connect('draw', self.on_draw) self.connect('mousedown', self.on_mousedown) @@ -22,26 +27,32 @@ def on_draw(self, screen, x, y): l = (self.width - len(self.label)) // 2 - screen.pushcolor(self.bg) - screen.putch(x, y, '<') + screen.pushcolor(self.getcolor()) + screen.putch(x, y, self.lbracket) for i in range(x+1, x+l): screen.putch(i, y, ' ') screen.puts(x + l, y, self.label) for i in range(x+l+len(self.label), x+self.width-1): screen.putch(i, y, ' ') - screen.putch(x + self.width - 1, y, '>') + screen.putch(x + self.width - 1, y, self.rbracket) screen.popcolor() def on_mousedown(self, ev): - self.bg = 2 + self.highlight = True self.redraw() def on_mouseup(self, ev): - self.bg = 1 + self.highlight = False self.redraw() if self.enclose(ev.px, ev.py): self.handle('click') + + def getcolor(self): + if self.highlight: + return self.bghi + return self.bg + diff -r 69318aba22bf -r 684cdc352562 tuikit/container.py --- a/tuikit/container.py Thu Feb 17 23:35:05 2011 +0100 +++ b/tuikit/container.py Tue Mar 15 17:27:09 2011 +0100 @@ -34,6 +34,8 @@ def draw(self, screen, x=0, y=0): + if self.hidden: + return #if self._redraw: #self.fill(screen, self.y, self.x, self.height, self.width) self.handle('draw', screen, x, y) diff -r 69318aba22bf -r 684cdc352562 tuikit/menu.py --- a/tuikit/menu.py Thu Feb 17 23:35:05 2011 +0100 +++ b/tuikit/menu.py Tue Mar 15 17:27:09 2011 +0100 @@ -13,6 +13,7 @@ self.highlight = 3 self.items = items self.selected = items[0] + self.menubar = None self.connect('draw', self.on_draw) self.connect('keypress', self.on_keypress) @@ -51,7 +52,6 @@ def on_mousedown(self, ev): self.select_at_pos(ev.wy - 1) - self.run_selected() def on_mousemove(self, ev): @@ -92,5 +92,10 @@ def run_selected(self): if self.selected and self.selected[1] is not None: - self.selected[1]() + if isinstance(self.selected[1], Widget): + self.selected[1].show() + self.selected[1].setfocus() + else: + self.menubar.unfocus() + self.selected[1]() diff -r 69318aba22bf -r 684cdc352562 tuikit/menubar.py --- a/tuikit/menubar.py Thu Feb 17 23:35:05 2011 +0100 +++ b/tuikit/menubar.py Tue Mar 15 17:27:09 2011 +0100 @@ -32,6 +32,7 @@ item[1].allowlayout = False item[1].hidden = True item[1].connect('focus', self.on_submenu_focus) + item[1].menubar = self i += len(item[0]) + 4 diff -r 69318aba22bf -r 684cdc352562 tuikit/widget.py --- a/tuikit/widget.py Thu Feb 17 23:35:05 2011 +0100 +++ b/tuikit/widget.py Tue Mar 15 17:27:09 2011 +0100 @@ -35,6 +35,9 @@ self.top = top + ### event management + + def newevent(self, event): self.event[event] = [] @@ -62,6 +65,9 @@ getattr(self, event)(*args, **kwargs) + ### + + def resize(self): self.handle('resize') @@ -160,3 +166,13 @@ return self.y + y, self.x + x return self.y, self.x + + def hide(self): + self.hidden = True + self.redraw() + + + def show(self): + self.hidden = False + self.redraw() + diff -r 69318aba22bf -r 684cdc352562 tuikit/window.py --- a/tuikit/window.py Thu Feb 17 23:35:05 2011 +0100 +++ b/tuikit/window.py Tue Mar 15 17:27:09 2011 +0100 @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from .container import Container +from .button import Button class Window(Container): @@ -11,42 +12,80 @@ self.connect('mousedown', self.on_mousedown) self.connect('mouseup', self.on_mouseup) self.connect('mousemove', self.on_mousemove) + self.connect('resize', self.on_resize) - self.title = ' ' + self.title = '' + self._closebutton = True + self.resizable = True + self.movable = True + + self.resizing = False + self.moving = False + + self.closebtn = Button('x') + self.closebtn.x = self.width - 5 + self.closebtn.width = 3 + self.closebtn.connect('click', self.on_closebtn) + self.closebtn.bg = (4, 'bold') + self.closebtn.bghi = (5, 'bold') + self.add(self.closebtn) + + + @property + def closebutton(self): + return self._closebutton + + @closebutton.setter + def closebutton(self, value): + self._closebutton = value + self.closebtn.hidden = not value def on_draw(self, screen, x, y): + screen.pushcolor(4) screen.frame(x, y, self.width, self.height) + + if self.resizable: + if self.resizing: + screen.pushcolor(5, 'bold') + else: + screen.pushcolor(4, 'bold') + screen.puts(x + self.width - 2, y + self.height - 1, '─┘') # '━┛' + screen.popcolor() + + if self.title: + screen.puts(x + (self.width - len(self.title))//2, y, self.title) + screen.fill(x+1, y+1, self.width-2, self.height-2) - # screen.addstr(self.title) + screen.popcolor() def on_mousedown(self, ev): self.dragstart = (ev.wx, ev.wy) - if ev.wx >= self.width - 1 and ev.wy >= self.height - 1: + if self.resizable and ev.wx >= self.width - 1 and ev.wy >= self.height - 1: self.resizing = True - else: - self.resizing = False + elif self.movable: + self.moving = True self.origsize = (self.width, self.height) - #self.title += '%dP%d ' % (x,y) + self.redraw(True) def on_mouseup(self, ev): - #self.title += '%dR%d ' % (x,y) - if self.resizing: self.width = self.origsize[0] + ev.wx - self.dragstart[0] self.height = self.origsize[1] + ev.wy - self.dragstart[1] - else: + self.resizing = False + self.emit('resize') + elif self.moving: self.x = ev.px - self.dragstart[0] self.y = ev.py - self.dragstart[1] + self.moving = False self.redraw(True) def on_mousemove(self, ev): - # self.title += '%dM%d ' % (x,y) if ev.px == self.x + self.dragstart[0] \ and ev.py == self.y + self.dragstart[1]: return @@ -57,9 +96,19 @@ if self.resizing: self.width = self.origsize[0] + ev.wx - self.dragstart[0] self.height = self.origsize[1] + ev.wy - self.dragstart[1] - else: + self.emit('resize') + elif self.moving: self.x = ev.px - self.dragstart[0] self.y = ev.py - self.dragstart[1] self.redraw(True) + + def on_resize(self): + self.closebtn.x = self.width - 5 + + + def on_closebtn(self): + self.hide() + +