class TimelinesBuffer(WidgetWrap): """A widget that displays one or more `Timeline` objects.""" def __init__(self, timelines=None, **kwargs): if timelines: timeline_widgets = [ TimelineWidget(timeline, **kwargs) for timeline in timelines ] else: timeline_widgets = [] WidgetWrap.__init__(self, Columns(timeline_widgets)) def scroll_up(self): active_widget = self._w.get_focus() active_widget.focus_previous() def scroll_down(self): active_widget = self._w.get_focus() active_widget.focus_next() def scroll_top(self): active_widget = self._w.get_focus() active_widget.focus_first() def scroll_bottom(self): active_widget = self._w.get_focus() active_widget.focus_last() def clear(self): """Clears the buffer.""" # FIXME pass def render_timelines(self, timelines): """Renders the given statuses.""" timeline_widgets = [TimelineWidget(timeline) for timeline in timelines] self._w = Columns(timeline_widgets) def set_focus(self, index): active_widget = self._w.get_focus() active_widget.set_focus(index) def focus_timeline(self, index): self._w.set_focus_column(index)
class TimelinesBuffer(WidgetWrap): """A widget that displays one or more `Timeline` objects.""" def __init__(self, timelines=None, **kwargs): if timelines: timeline_widgets = [TimelineWidget(timeline, **kwargs) for timeline in timelines] else: timeline_widgets = [] WidgetWrap.__init__(self, Columns(timeline_widgets)) def scroll_up(self): active_widget = self._w.get_focus() active_widget.focus_previous() def scroll_down(self): active_widget = self._w.get_focus() active_widget.focus_next() def scroll_top(self): active_widget = self._w.get_focus() active_widget.focus_first() def scroll_bottom(self): active_widget = self._w.get_focus() active_widget.focus_last() def clear(self): """Clears the buffer.""" # FIXME pass def render_timelines(self, timelines): """Renders the given statuses.""" timeline_widgets = [TimelineWidget(timeline) for timeline in timelines] self._w = Columns(timeline_widgets) def set_focus(self, index): active_widget = self._w.get_focus() active_widget.set_focus(index) def focus_timeline(self, index): self._w.set_focus_column(index)
class App(object): def __init__(self, parser, encoding): self.loop = None self.parser = parser self.panel_focus = 1 self.show_ladder = False self.search = { 'phone': '', 'chan': '', 'call_id': '', } self.sidebar = Sidebar(sorted(self.parser.get_phone_set())) connect_signal(self.sidebar, 'select', self.on_result_selected) connect_signal(self.sidebar, 'search', self.on_search) self.log_display = LogDisplay(parser, encoding) self.cols = Columns([ ('fixed', 20, self.sidebar), ('fixed', 1, Filler(Divider(), 'top')), ('weight', 1, self.log_display), ]) self.footer = Text('') self.set_footer_text() self.frame = Frame(self.cols, footer=AttrWrap(self.footer, 'bar')) def set_footer_text(self, markup=None): if markup: self.footer.set_text(markup) else: self.footer.set_text([ 'Press ', ('key', 'ESC'), '/', ('key', 'F10'), '/', ('key', 'q'), ' to exit, ', ('key', 'TAB'), '/', ('key', 'Fx'), ' to switch window, ', ('key', 'H'), ' for help', ]) # noinspection PyUnusedLocal def on_result_selected(self, sidebar, ref): self.log_display.load_result(ref) def reload_file(self): start = time.time() old_pos = [None] def progress(module, line_no, data_pos, data_len): if data_pos == -1: self.sidebar.set_results(sorted(self.parser.get_phone_set())) self.set_footer_text() elif line_no % 10000 == 0: elapsed = time.time() - start rate = '' if old_pos[0] is None: old_pos[0] = data_pos elif elapsed and module == 'log': rate = (data_pos - old_pos[0]) / (time.time() - start) rate = '%4.1fMB/s' % round(rate / 1024.0 / 1024.0, 2) self.set_footer_text('%s %s %5.1f%% %3.0fsec %s' % (module, line_no, 100.0 * data_pos / data_len, elapsed, rate)) self.loop.draw_screen() try: self.parser.load_file(progress) except LogParserError as e: self.set_footer_text(unicode(e)) # noinspection PyUnusedLocal def on_search(self, sidebar, field_name, value): if field_name in ('phone', 'chan', 'call_id'): self.search[field_name] = value phones = self.parser.search( self.search['phone'], self.search['chan'], self.search['call_id'], ) self.sidebar.set_results(phones) elif field_name == 'text': self.log_display.find['text'] = value self.log_display.refresh_log(focus_line=True) def unhandled_keypress(self, key): # noinspection PyProtectedMember def focus_sidebar_header(): self.sidebar.frame.focus_part = 'header' self.cols.set_focus_column(0) self.sidebar.head._invalidate() self.panel_focus = 0 # noinspection PyProtectedMember def focus_sidebar_list(): self.sidebar.frame.focus_part = 'body' self.sidebar.listbox._invalidate() self.cols.set_focus_column(0) self.panel_focus = 1 def focus_log(): self.cols.set_focus_column(2) self.panel_focus = 2 if key in ('q', 'Q', 'esc', 'f10'): raise urwid.ExitMainLoop() elif key == 'tab': self.panel_focus = (self.panel_focus + 1) % 3 if self.panel_focus == 0: focus_sidebar_header() elif self.panel_focus == 1: focus_sidebar_list() if self.panel_focus == 2: focus_log() elif key == 'f4': focus_sidebar_list() elif key == 'f3': focus_sidebar_header() elif key == 'f6': focus_log() elif key == 'c': self.log_display.show_channel = not self.log_display.show_channel self.log_display.refresh_log() elif key == 'l': self.log_display.show_verbose = not self.log_display.show_verbose self.log_display.refresh_log() elif key == 'S': self.log_display.show_ladder = not self.log_display.show_ladder self.log_display.refresh_log() elif key == 's': self.log_display.toggle_sip() self.log_display.refresh_log() elif key == 'f': self.log_display.toggle_filter() elif key == 'I': self.log_display.isolate(None) elif key in ('h', 'H'): self.log_display.help() def run(self): self.loop = urwid.MainLoop(self.frame, palette, handle_mouse=False, unhandled_input=self.unhandled_keypress) self.loop.set_alarm_in(0, lambda loop, data: self.reload_file()) try: self.loop.run() except Exception: self.loop.stop() print(traceback.format_exc())