# HG changeset patch # User souliane # Date 1383839900 -3600 # Node ID 4e691a231763cfaf219199d0ac8f4edfb9b129d9 # Parent 0fd123340fb9138e1dfa6206d5a9d8635183183f frontend, primitivus: added input history (mode-wise) diff -r 0fd123340fb9 -r 4e691a231763 frontends/src/primitivus/primitivus --- a/frontends/src/primitivus/primitivus Thu Nov 07 16:14:56 2013 +0100 +++ b/frontends/src/primitivus/primitivus Thu Nov 07 16:58:20 2013 +0100 @@ -31,6 +31,7 @@ from sat_frontends.primitivus.xmlui import XMLUI from sat_frontends.primitivus.progress import Progress from sat_frontends.primitivus.notify import Notify +from sat.tools.frontend.misc import InputHistory import sat_frontends.primitivus.constants import logging from logging import debug, info, error @@ -120,15 +121,30 @@ raise urwid.ExitMainLoop() def keypress(self, size, key): - """Callback when a key is pressed. Send "composing" states.""" - if key != "enter": + """Callback when a key is pressed. Send "composing" states + and move the index of the temporary history stack.""" + def history_cb(text): + self.set_edit_text(text) + self.set_edit_pos(len(text)) + + if key == "esc": + self.app._updateInputHistory(mode='NORMAL') + if self._mode == 'NORMAL' and key in self._modes: + self.app._updateInputHistory(mode=self._modes[key][0]) + if key == "up": + self.app._updateInputHistory(self.get_edit_text(), -1, history_cb, self.mode) + elif key == "down": + self.app._updateInputHistory(self.get_edit_text(), +1, history_cb, self.mode) + elif key == "enter": + self.app._updateInputHistory(self.get_edit_text(), mode=self.mode) + else: contact = self.app.contact_list.getContact() if contact: self.app.bridge.chatStateComposing(unescapePrivate(contact), self.app.profile) - return super(EditBar, self).keypress(size, key) + return super(EditBar, self).keypress(size, key) -class PrimitivusApp(QuickApp): +class PrimitivusApp(QuickApp, InputHistory): def __init__(self): QuickApp.__init__(self) diff -r 0fd123340fb9 -r 4e691a231763 src/tools/frontend/__init__.py diff -r 0fd123340fb9 -r 4e691a231763 src/tools/frontend/misc.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tools/frontend/misc.py Thu Nov 07 16:58:20 2013 +0100 @@ -0,0 +1,62 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# SAT helpers methods for plugins +# Copyright (C) 2013 Adrien Cossa (souliane@mailoo.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +class InputHistory(object): + + def _updateInputHistory(self, text=None, step=None, callback=None, mode=""): + """Update the lists of previously sent messages. Several lists can be + handled as they are stored in a dictionary, the argument "mode" being + used as the entry key. There's also a temporary list to allow you play + with previous entries before sending a new message. Parameters values + can be combined: text is None and step is None to initialize a main + list and the temporary one, step is None to update a list and + reinitialize the temporary one, step is not None to update + the temporary list between two messages. + @param text: text to be saved. + @param step: step to move the temporary index. + @param callback: method to display temporary entries. + @param mode: the dictionary key for main lists. + """ + if not hasattr(self, "input_histories"): + self.input_histories = {} + history = self.input_histories.setdefault(mode, []) + if step is None and text is not None: + # update the main list + if text in history: + history.remove(text) + history.append(text) + length = len(history) + if step is None or length == 0: + # prepare the temporary list and index + self.input_history_tmp = history[:] + self.input_history_tmp.append("") + self.input_history_index = length + if step is None: + return + # update the temporary list + if text is not None: + # save the current entry + self.input_history_tmp[self.input_history_index] = text + # move to another entry if possible + index_tmp = self.input_history_index + step + if index_tmp >= 0 and index_tmp < len(self.input_history_tmp): + if callback is not None: + callback(self.input_history_tmp[index_tmp]) + self.input_history_index = index_tmp