# HG changeset patch # User Goffi # Date 1281963963 -28800 # Node ID dfabea6f73b5f2ce2ed20b7084a1ca174e3b2016 # Parent 96a2c5904e35fb7302b3adecd0c50433bac944e0 Primitivus: AdvancedEdit and Notification bar improved - AdvancedEdit now support a completion callback - Notification bar now show progressions diff -r 96a2c5904e35 -r dfabea6f73b5 frontends/primitivus/custom_widgets.py --- a/frontends/primitivus/custom_widgets.py Thu Aug 12 23:09:31 2010 +0800 +++ b/frontends/primitivus/custom_widgets.py Mon Aug 16 21:06:03 2010 +0800 @@ -58,6 +58,19 @@ new behaviour: emit a 'click' signal when enter is pressed""" signals = urwid.Edit.signals + ['click'] + def setCompletionMethod(self, callback): + """Define method called when completion is asked + @callback: method with 2 arguments: + - the text to complete + - if there was already a completion, a dict with + - 'completed':last completion + - 'completion_pos': cursor position where the completion starts + - 'position': last completion cursor position + this dict must be used (and can be filled) to find next completion) + and which return the full text completed""" + self.completion_cb = callback + self.completion_data = {} + def keypress(self, size, key): #TODO: insert mode is not managed yet if key == 'ctrl a': @@ -74,6 +87,25 @@ self.set_edit_pos(pos) elif key == 'enter': self._emit('click') + elif key == 'shift tab': + try: + before = self.edit_text[:self.edit_pos] + if self.completion_data: + if (not self.completion_data['completed'] + or self.completion_data['position'] != self.edit_pos + or not before.endswith(self.completion_data['completed'])): + self.completion_data.clear() + else: + before = before[:-len(self.completion_data['completed'])] + complet = self.completion_cb(before, self.completion_data) + self.completion_data['completed'] = complet[len(before):] + self.set_edit_text(complet+self.edit_text[self.edit_pos:]) + self.set_edit_pos(len(complet)) + self.completion_data['position'] = self.edit_pos + return + except AttributeError: + #No completion method defined + pass return super(AdvancedEdit, self).keypress(size, key) @@ -372,9 +404,10 @@ def __init__(self): self.waitNotifs = urwid.Text('') - self.message = ClickableText('', default_attr='notifs', select_attr='notifs') + self.message = ClickableText('', default_attr='notifs') urwid.connect_signal(self.message, 'click', lambda wid: self.showNext()) - self.columns = urwid.Columns([('fixed',6,self.waitNotifs),self.message]) + self.progress = ClickableText('', default_attr='notifs') + self.columns = urwid.Columns([('fixed',6,self.waitNotifs),self.message,('fixed',4,self.progress)]) urwid.WidgetWrap.__init__(self, urwid.AttrMap(self.columns,'notifs')) self.notifs = [] @@ -383,6 +416,14 @@ self.waitNotifs.set_text("(%i)" % len(self.notifs) if self.notifs else '') self._emit('change') + def setProgress(self,percentage): + """Define the progression to show on the right side of the bar""" + if percentage == None: + self.progress.set_text('') + else: + self.progress.set_text('%02i%%' % percentage) + self._emit('change') + def addPopUp(self, pop_up_widget): """Add a popup to the waiting queue""" self.notifs.append(('popup',pop_up_widget)) @@ -431,7 +472,7 @@ def canHide(self): """Return True if there is now important information to show""" - return self.isQueueEmpty() and not self.message.get_text() + return self.isQueueEmpty() and not self.message.get_text() and not self.progress.get_text() class MenuBox(urwid.WidgetWrap):