diff --git a/papersurfer/papersurfer.py b/papersurfer/papersurfer.py index 9de8f93ef6aab49173e470df02049f0d9f382da7..4db8226bf77d3983c9aafb2891a8ebce9cc6ec41 100644 --- a/papersurfer/papersurfer.py +++ b/papersurfer/papersurfer.py @@ -15,6 +15,7 @@ import re from functools import partial import json import time +import os import requests import mattermostdriver import urwid @@ -194,35 +195,58 @@ class Mattermost: or needle.lower() in m.reporter.lower()] -class PrettyButton(urwid.Button): - button_left = urwid.Text('[') - button_right = urwid.Text(']') +class PrettyButton(urwid.WidgetWrap): + def __init__(self, label, on_press=None, user_data=None): + self.text = urwid.Text("") + self.set_label(label) + self.widget = urwid.AttrMap(self.text, '', 'highlight') - def __init__(self, *args, onclick=lambda *x: x, **kwargs): - super(self.__class__, self).__init__(*args, **kwargs) - urwid.connect_signal(self, 'click', onclick) + # use a hidden button for evt handling + self._hidden_btn = urwid.Button(f"hidden {self.label}", + on_press, user_data) + + super(self.__class__, self).__init__(self.widget) + + def selectable(self): + return True + + def keypress(self, *args, **kw): + return self._hidden_btn.keypress(*args, **kw) + + def mouse_event(self, *args, **kw): + return self._hidden_btn.mouse_event(*args, **kw) + + def get_label(self): + return self.label + + def set_label(self, label): + self.label = label + self.text.set_text(f"[ {label} ]") class Papersurfer: """Provide UI and interface with mattermost class.""" + + _palette = [ + ('button', 'default,bold', 'default'), + ('I say', 'default,bold', 'default', 'bold'), + ('needle', 'default, bold, underline', 'default', 'bold'), + ('highlight', 'black', 'dark blue'), + ('banner', 'black', 'light gray'), + ('selectable', 'white', 'black'), + ('focus', 'black', 'light gray'), + ('papertitle', 'default,bold', 'default', 'bold') + ] + def __init__(self, url, channel, username, password): self._screen = urwid.raw_display.Screen() self.size = self._screen.get_cols_rows() self.filter = "" - palette = [ - ('I say', 'default,bold', 'default', 'bold'), - ('needle', 'default, bold, underline', 'default', 'bold'), - ('highlight', 'black', 'dark blue'), - ('banner', 'black', 'light gray'), - ('selectable', 'white', 'black'), - ('focus', 'black', 'light gray'), - ('papertitle', 'default,bold', 'default', 'bold') - ] ask = urwid.Edit(('I say', u"Filter?\n")) - exitbutton = PrettyButton(u'Exit', onclick=self.on_exit_clicked) + exitbutton = PrettyButton(u'Exit', on_press=self.on_exit_clicked) self.exportbutton = PrettyButton(u'Export filtered list as bibtex', - onclick=self.on_export_clicked) + on_press=self.on_export_clicked) div = urwid.Divider(u'-') self.mtm = Mattermost(url, channel, username, password) @@ -251,7 +275,7 @@ class Papersurfer: urwid.connect_signal(ask, 'change', self.onchange) self.main = pile - self.mainloop = urwid.MainLoop(self._over, palette) + self.mainloop = urwid.MainLoop(self._over, self._palette) self.mainloop.set_alarm_in(.1, self.load_list) self.mainloop.run() @@ -294,8 +318,7 @@ class Papersurfer: body = urwid.LineBox(body_padding) # Footer - footer = urwid.Button('Okay', self.close_details) - footer = urwid.AttrWrap(footer, 'selectable', 'focus') + footer = PrettyButton('Okay', self.close_details) footer = urwid.GridFlow([footer], 8, 1, 1, 'center') # Layout @@ -322,13 +345,13 @@ class Papersurfer: title = urwid.Text(text_items) discuss_button = PrettyButton("Open Discussion", - onclick=partial(self.h_open_discussion, - paper)) + on_press=partial(self.h_open_discussion, + paper)) doi_button = PrettyButton("Open DOI", - onclick=partial(self.h_open_doi, paper)) + on_press=partial(self.h_open_doi, paper)) details_button = PrettyButton("Show details", - onclick=partial(self.h_show_details, - paper)) + on_press=partial(self.h_show_details, + paper)) button_bar = urwid.Columns([ discuss_button, doi_button, details_button]) @@ -419,7 +442,6 @@ def get_config_file_paths(): <class 'list'> """ - import os env = os.environ xdg_home = None if 'XDG_CONFIG_HOME' in env: