Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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())