37 |
def write_stream(self, s): |
def write_stream(self, s): |
38 |
self.write(s) |
self.write(s) |
39 |
|
|
|
url_re = re.compile('^\w+://') |
|
40 |
def is_url(text): |
def is_url(text): |
41 |
|
url_re = re.compile('^\w+://') |
42 |
return url_re.match(text) |
return url_re.match(text) |
43 |
|
|
44 |
class ItemView: |
class ItemView: |
88 |
image = straw.ImageCache.retrieve( |
image = straw.ImageCache.retrieve( |
89 |
straw.main.get_visible_feed().complete_url(url)) |
straw.main.get_visible_feed().complete_url(url)) |
90 |
stream.write(image.get_data()) |
stream.write(image.get_data()) |
|
stream.close() |
|
91 |
except Exception, ex: |
except Exception, ex: |
|
stream.close() |
|
92 |
raise |
raise |
93 |
|
|
94 |
|
stream.close() |
95 |
|
return |
96 |
|
|
97 |
def on_source_subscribe_button_clicked(self, button, *data): |
def on_source_subscribe_button_clicked(self, button, *data): |
98 |
f = straw.Feed(self._item.source['text'], |
f = straw.Feed(self._item.source['text'], |
99 |
location = self._item.source['url']) |
location = self._item.source['url']) |
337 |
count = 0 |
count = 0 |
338 |
for item in feed.items: |
for item in feed.items: |
339 |
title = "" |
title = "" |
|
# None is not == to an empty string, so we'll check for an empty |
|
|
# string as well. |
|
340 |
if item.title is not None and item.title != "": |
if item.title is not None and item.title != "": |
341 |
title = convert_entities(item.title) |
title = convert_entities(item.title) |
342 |
elif item.description is not None and item.description != "": |
elif item.description is not None and item.description != "": |
344 |
title = convert_entities(desc) |
title = convert_entities(desc) |
345 |
title += " ..." |
title += " ..." |
346 |
else: |
else: |
347 |
|
# empty title, empty description, let's not show it |
348 |
continue |
continue |
349 |
count += 1 |
count += 1 |
350 |
if item.seen: |
if item.seen: |
473 |
def mode_changed(self, signal): |
def mode_changed(self, signal): |
474 |
self.show() |
self.show() |
475 |
|
|
476 |
|
class Toolbar: |
477 |
|
def __init__(self,widget): |
478 |
|
# set toolbar tooltips |
479 |
|
widget_tree = glade.get_widget_tree(widget) |
480 |
|
self._widget = widget |
481 |
|
self._back = widget_tree.get_widget('toolbar_back_button') |
482 |
|
self._forward = widget_tree.get_widget('toolbar_forward_button') |
483 |
|
self._poll = widget_tree.get_widget('toolbar_poll_button') |
484 |
|
self._new = widget_tree.get_widget('toolbar_new_feed_button') |
485 |
|
self._prefs = widget_tree.get_widget('toolbar_preferences_show_button') |
486 |
|
self._find = widget_tree.get_widget('toolbar_find_button') |
487 |
|
self._tooltips = gtk.Tooltips() |
488 |
|
|
489 |
|
def show_tips(self): |
490 |
|
prefs = _("Change settings") |
491 |
|
poll = _("Get news items") |
492 |
|
next = _("Go to next unread feed or item") |
493 |
|
new = _("Subscribe to a new feed") |
494 |
|
back = _("Go back to the next feed or item") |
495 |
|
find = _("Find a word or a phrase on feeds") |
496 |
|
|
497 |
|
self._tooltips.set_tip(self._back, back, back) |
498 |
|
self._tooltips.set_tip(self._forward, next, next) |
499 |
|
self._tooltips.set_tip(self._poll, poll, poll) |
500 |
|
self._tooltips.set_tip(self._new, new, new) |
501 |
|
self._tooltips.set_tip(self._prefs, prefs, prefs) |
502 |
|
self._tooltips.set_tip(self._find, find, find) |
503 |
|
self._tooltips.enable() |
504 |
|
|
505 |
class FeedInfoDisplay: |
class FeedInfoDisplay: |
506 |
def __init__(self, widget): |
def __init__(self, widget): |
507 |
widget_tree = glade.get_widget_tree(widget) |
widget_tree = glade.get_widget_tree(widget) |
659 |
xml.get_widget('find_results_treeview')) |
xml.get_widget('find_results_treeview')) |
660 |
self._offline_toggle = OfflineToggle( |
self._offline_toggle = OfflineToggle( |
661 |
xml.get_widget('offline_toggle')) |
xml.get_widget('offline_toggle')) |
662 |
|
self._toolbar = Toolbar( |
663 |
|
xml.get_widget('toolbar_default')) |
664 |
self._offline_toggle.show() |
self._offline_toggle.show() |
665 |
|
self._toolbar.show_tips() |
666 |
self.create_ui(xml) |
self.create_ui(xml) |
667 |
# status messages are queued and displayed with a half a second |
# status messages are queued and displayed with a half a second |
668 |
# timeout, so the user can see what's happening. the timeout is only |
# timeout, so the user can see what's happening. the timeout is only |
677 |
return straw.main.quit() |
return straw.main.quit() |
678 |
|
|
679 |
def on_straw_main_delete_event(self, *args): |
def on_straw_main_delete_event(self, *args): |
680 |
# FALSE emits destroy_event |
return straw.main.quit() |
|
return gtk.FALSE |
|
681 |
|
|
682 |
def on_straw_main_configure_event(self, widget, event, *args): |
def on_straw_main_configure_event(self, widget, event, *args): |
683 |
def check_size((width, height, widget)): |
def check_size((width, height, widget)): |
686 |
if event.width != widget.allocation.width or event.height != widget.allocation.height: |
if event.width != widget.allocation.width or event.height != widget.allocation.height: |
687 |
gtk.timeout_add(1000, check_size, ( |
gtk.timeout_add(1000, check_size, ( |
688 |
(event.width, event.height, widget))) |
(event.width, event.height, widget))) |
689 |
|
return gtk.FALSE |
690 |
|
|
691 |
def on_main_main_pane_size_allocate(self, widget, *args): |
def on_main_main_pane_size_allocate(self, widget, *args): |
692 |
def check_position((position, widget)): |
def check_position((position, widget)): |
715 |
def on_toolbar_find_button_clicked(self, button, *args): |
def on_toolbar_find_button_clicked(self, button, *args): |
716 |
self.show_find_mode() |
self.show_find_mode() |
717 |
|
|
718 |
def on_subscribe_new_feed_button_clicked(self, button, *args): |
def on_toolbar_new_feed_button_clicked(self, button, *args): |
719 |
straw.main.show_subscribe_dialog() |
straw.main.show_subscribe_dialog() |
720 |
|
|
721 |
|
def on_toolbar_forward_button_clicked(self, button, *args): |
722 |
|
if not self._item_view.scroll_down(): |
723 |
|
straw.main.display_next_unread_item() |
724 |
|
|
725 |
|
def on_toolbar_back_button_clicked(self, button, *args): |
726 |
|
# FIXME: item or feed? |
727 |
|
straw.main.display_previous_item() |
728 |
|
|
729 |
def on_menu_about_activate(self, menuitem, *args): |
def on_menu_about_activate(self, menuitem, *args): |
730 |
gnome.ui.About( |
gnome.ui.About( |
731 |
straw.APPNAME, straw.VERSION, "Copyright (c) 2002 Juri Pakaste", "", |
straw.APPNAME, straw.VERSION, "Copyright (c) 2002 Juri Pakaste", "", |
1038 |
# self.update_total_unread_indicator() |
# self.update_total_unread_indicator() |
1039 |
|
|
1040 |
def create_feed_selection_columns(self, feed_list_view): |
def create_feed_selection_columns(self, feed_list_view): |
1041 |
|
renderer = gtk.CellRendererPixbuf() |
1042 |
|
column = gtk.TreeViewColumn('Status', renderer, |
1043 |
|
stock_id=self.COLUMN_STATUS_PIXBUF, |
1044 |
|
visible=self.COLUMN_STATUS_FLAG) |
1045 |
|
feed_list_view.append_column(column) |
1046 |
renderer = gtk.CellRendererText() |
renderer = gtk.CellRendererText() |
1047 |
column = gtk.TreeViewColumn('Title', renderer, text=self.COLUMN_NAME, |
column = gtk.TreeViewColumn('Title', renderer, text=self.COLUMN_NAME, |
1048 |
weight=self.COLUMN_BOLD) |
weight=self.COLUMN_BOLD) |
1051 |
column = gtk.TreeViewColumn('New', renderer, text=self.COLUMN_UNREAD, |
column = gtk.TreeViewColumn('New', renderer, text=self.COLUMN_UNREAD, |
1052 |
weight=self.COLUMN_BOLD) |
weight=self.COLUMN_BOLD) |
1053 |
feed_list_view.append_column(column) |
feed_list_view.append_column(column) |
|
renderer = gtk.CellRendererPixbuf() |
|
|
column = gtk.TreeViewColumn('Status', renderer, |
|
|
stock_id=self.COLUMN_STATUS_PIXBUF, |
|
|
visible=self.COLUMN_STATUS_FLAG) |
|
|
feed_list_view.append_column(column) |
|
1054 |
return |
return |
1055 |
|
|
1056 |
def create_ui(self, xml): |
def create_ui(self, xml): |