From b06240ee7b4940af52a0c01915214860d8a06bb2 Mon Sep 17 00:00:00 2001 From: mathieui Date: Fri, 11 Jan 2013 19:54:30 +0100 Subject: Improve the xml tab fix refresh bugs, display the scrolling status, add an info bar, add the global info win --- src/tabs.py | 34 ++++++++++++++++++++++++++++++++-- src/windows.py | 21 +++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/tabs.py b/src/tabs.py index d2573213..979db8e4 100644 --- a/src/tabs.py +++ b/src/tabs.py @@ -3348,6 +3348,7 @@ class XMLTab(Tab): self.state = 'normal' self.text_win = windows.TextWin() self.core.xml_buffer.add_window(self.text_win) + self.info_header = windows.XMLInfoWin() self.default_help_message = windows.HelpText("/ to enter a command") self.register_command('close', self.close, shortdesc=_("Close this tab.")) @@ -3375,8 +3376,14 @@ class XMLTab(Tab): self.key_func["^K"] = self.on_freeze self.key_func["/"] = self.on_slash self.resize() + # Used to display the infobar + self.filter_type = '' + self.filter = '' def on_freeze(self): + """ + Freeze the display. + """ self.text_win.toggle_lock() self.refresh() @@ -3387,6 +3394,9 @@ class XMLTab(Tab): self.core.incoming_stanza) self.core.xmpp.remove_handler('custom matcher') self.core.xmpp.register_handler(handler) + self.filter_type = "XML Mask Filter" + self.filter = arg + self.refresh() except: self.core.information('Invalid XML Mask', 'Error') self.command_reset('') @@ -3397,6 +3407,9 @@ class XMLTab(Tab): handler = Callback('custom matcher', matcher.MatcherId(arg), self.core.incoming_stanza) self.core.xmpp.register_handler(handler) + self.filter_type = "Id Filter" + self.filter = arg + self.refresh() def command_filter_xpath(self, arg): """/filter_xpath """ @@ -3406,6 +3419,9 @@ class XMLTab(Tab): self.core.incoming_stanza) self.core.xmpp.remove_handler('custom matcher') self.core.xmpp.register_handler(handler) + self.filter_type = "XPath Filter" + self.filter = arg + self.refresh() except: self.core.information('Invalid XML Path', 'Error') self.command_reset('') @@ -3414,6 +3430,9 @@ class XMLTab(Tab): """/reset""" self.core.xmpp.remove_handler('custom matcher') self.core.xmpp.register_handler(self.core.all_stanzas) + self.filter_type = '' + self.filter = '' + self.refresh() def on_slash(self): """ @@ -3468,11 +3487,13 @@ class XMLTab(Tab): self.core.close_tab() def resize(self): - if not self.visible: + if self.core.information_win_size >= self.height-3 or not self.visible: return self.need_resize = False min = 1 if self.left_tab_win else 2 - self.text_win.resize(self.height-min, self.width, 0, 0) + self.text_win.resize(self.height-self.core.information_win_size - Tab.tab_win_height() - 2, self.width, 0, 0) + self.text_win.rebuild_everything(self.core.xml_buffer) + self.info_header.resize(1, self.width, self.height-2-self.core.information_win_size - Tab.tab_win_height(), 0) self.input.resize(1, self.width, self.height-1, 0) def refresh(self): @@ -3480,7 +3501,9 @@ class XMLTab(Tab): self.resize() log.debug(' TAB Refresh: %s',self.__class__.__name__) self.text_win.refresh() + self.info_header.refresh(self.filter_type, self.filter, self.text_win) self.refresh_tab_win() + self.info_win.refresh() self.input.refresh() def on_lose_focus(self): @@ -3493,6 +3516,13 @@ class XMLTab(Tab): def on_close(self): self.core.xml_tab = False + def on_info_win_size_changed(self): + if self.core.information_win_size >= self.height-3: + return + self.text_win.resize(self.height-2-self.core.information_win_size - Tab.tab_win_height(), self.width, 0, 0) + self.info_header.resize(1, self.width, self.height-2-self.core.information_win_size - Tab.tab_win_height(), 0) + + class SimpleTextTab(Tab): """ A very simple tab, with just a text displaying some diff --git a/src/windows.py b/src/windows.py index f6d71fb2..22c5bec3 100644 --- a/src/windows.py +++ b/src/windows.py @@ -422,6 +422,26 @@ class InfoWin(Win): plus = ' -MORE(%s)-' % window.pos self.addstr(plus, to_curses_attr(get_theme().COLOR_SCROLLABLE_NUMBER)) +class XMLInfoWin(InfoWin): + """ + Info about the latest xml filter used and the state of the buffer. + """ + def __init__(self): + InfoWin.__init__(self) + + def refresh(self, filter_t='', filter='', window=None): + log.debug('Refresh: %s', self.__class__.__name__) + with g_lock: + self._win.erase() + if not filter_t: + self.addstr('[No filter]', to_curses_attr(get_theme().COLOR_INFORMATION_BAR)) + else: + info = '[%s] %s' % (filter_t, filter) + self.addstr(info, to_curses_attr(get_theme().COLOR_INFORMATION_BAR)) + self.print_scroll_position(window) + self.finish_line(get_theme().COLOR_INFORMATION_BAR) + self._refresh() + class PrivateInfoWin(InfoWin): """ The live above the information window, displaying informations @@ -650,6 +670,7 @@ class TextWin(Win): self.release_lock() else: self.acquire_lock() + return self.lock def acquire_lock(self): self.lock = True -- cgit v1.2.3