diff options
author | James Simmons <jim@olpc.simmons> | 2009-06-26 00:49:59 (GMT) |
---|---|---|
committer | James Simmons <jim@olpc.simmons> | 2009-06-26 00:49:59 (GMT) |
commit | 52ae72b4dff950d721b749bc60afe1f2d17ab2f9 (patch) | |
tree | c321bd828193f2d00a0bbac84f4ff2155f0db004 /GetIABooksActivity.py | |
parent | 707b128c5787fb4f4db9fc8133b491565f9333d7 (diff) |
modified: GetIABooksActivity.py
modified: MANIFEST
modified: activity/activity.info
modified: activity/get-ia-books.svg
Set up skeleton user interface.
Diffstat (limited to 'GetIABooksActivity.py')
-rwxr-xr-x | GetIABooksActivity.py | 195 |
1 files changed, 189 insertions, 6 deletions
diff --git a/GetIABooksActivity.py b/GetIABooksActivity.py index cfcbf6a..2ec8386 100755 --- a/GetIABooksActivity.py +++ b/GetIABooksActivity.py @@ -21,9 +21,13 @@ import tempfile import time import zipfile import pygtk -pygtk.require('2.0') import gtk import string +from sugar.graphics.toolbutton import ToolButton +from sugar.graphics.menuitem import MenuItem +from sugar.graphics.toolcombobox import ToolComboBox +from sugar.graphics.combobox import ComboBox +from sugar.graphics.toggletoolbutton import ToggleToolButton from sugar.graphics import style from sugar import profile from sugar.activity import activity @@ -43,6 +47,54 @@ COLUMN_PATH = 2 _logger = logging.getLogger('get-ia-books-activity') +class BooksToolbar(gtk.Toolbar): + __gtype_name__ = 'BooksToolbar' + + def __init__(self): + gtk.Toolbar.__init__(self) + book_search_item = gtk.ToolItem() + + self._search_entry = gtk.Entry() + self._search_entry.connect('activate', self._search_entry_activate_cb) + self._search_entry.connect("key_press_event", self.keypress_cb) + + width = int(gtk.gdk.screen_width() / 2) + self._search_entry.set_size_request(width, -1) + + book_search_item.add(self._search_entry) + self._search_entry.show() + self._search_entry.grab_focus() + + self.insert(book_search_item, -1) + book_search_item.show() + + self._download = ToolButton('go-down') + self._download.set_tooltip(_('Get Book')) + self._download.props.sensitive = False + self._download.connect('clicked', self._get_book_cb) + self.insert(self._download, -1) + self._download.show() + + def set_activity(self, activity): + self.activity = activity + + def _search_entry_activate_cb(self, entry): + self.activity.find_books(entry.props.text) + self._hide_results.props.sensitive = True + + def _get_book_cb(self, button): + self.activity.get_book() + + def _enable_button(self, state): + self._download.props.sensitive = state + + def keypress_cb(self, widget, event): + keyname = gtk.gdk.keyval_name(event.keyval) + if keyname == 'Escape': + self.activity.list_scroller.hide() + self._hide_results.props.sensitive = False + return True + class ReadHTTPRequestHandler(network.ChunkedGlibHTTPRequestHandler): """HTTP Request Handler for transferring document while collaborating. @@ -84,12 +136,143 @@ class ReadURLDownloader(network.GlibURLDownloader): READ_STREAM_SERVICE = 'read-activity-http' -class GetIABooksiActivity(activity.Activity): +class GetIABooksActivity(activity.Activity): def __init__(self, handle): "The entry point to the Activity" - gtk.gdk.threads_init() - self.current_word = 0 - self.word_tuples = [] - activity.Activity.__init__(self, handle) + toolbox = activity.ActivityToolbox(self) + activity_toolbar = toolbox.get_activity_toolbar() + activity_toolbar.remove(activity_toolbar.keep) + activity_toolbar.keep = None + self.set_toolbox(toolbox) + + self._books_toolbar = BooksToolbar() + toolbox.add_toolbar(_('Books'), self._books_toolbar) + self._books_toolbar.set_activity(self) + self._books_toolbar.show() + + toolbox.show() + self.scrolled = gtk.ScrolledWindow() + self.scrolled.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) + self.scrolled.props.shadow_type = gtk.SHADOW_NONE + self.textview = gtk.TextView() + self.textview.set_editable(False) + self.textview.set_cursor_visible(False) + self.textview.set_left_margin(50) + self.scrolled.add(self.textview) + self.textview.show() + self.scrolled.show() + v_adjustment = self.scrolled.get_vadjustment() + self.clipboard = gtk.Clipboard(display=gtk.gdk.display_get_default(), selection="CLIPBOARD") + self.page = 0 + self.textview.grab_focus() + + self.ls = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING) + tv = gtk.TreeView(self.ls) + tv.set_rules_hint(True) + tv.set_search_column(COLUMN_TITLE) + selection = tv.get_selection() + selection.set_mode(gtk.SELECTION_SINGLE) + selection.connect("changed", self.selection_cb) + renderer = gtk.CellRendererText() + col = gtk.TreeViewColumn('Title', renderer, text=COLUMN_TITLE) + col.set_sort_column_id(COLUMN_TITLE) + tv.append_column(col) + + renderer = gtk.CellRendererText() + col = gtk.TreeViewColumn('Author', renderer, text=COLUMN_AUTHOR) + col.set_sort_column_id(COLUMN_AUTHOR) + tv.append_column(col) + + self.list_scroller = gtk.ScrolledWindow(hadjustment=None, vadjustment=None) + self.list_scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + self.list_scroller.add(tv) + + vbox = gtk.VBox() + vbox.add(self.scrolled) + vbox.add(self.list_scroller) + self.set_canvas(vbox) + tv.show() + vbox.show() + self.list_scroller.show() + + textbuffer = self.textview.get_buffer() + self.tag = textbuffer.create_tag() + self.tag.set_property('weight', pango.WEIGHT_BOLD) + self.tag.set_property( 'foreground', "white") + self.tag.set_property( 'background', "black") + + # Status of temp file used for write_file: + self._tempfile = None + self.toolbox.set_current_toolbar(_TOOLBAR_BOOKS) + + def selection_cb(self, selection): + tv = selection.get_tree_view() + model = tv.get_model() + sel = selection.get_selected() + if sel: + model, iter = sel + self.selected_title = model.get_value(iter,COLUMN_TITLE) + self.selected_author = model.get_value(iter,COLUMN_AUTHOR) + self.selected_path = model.get_value(iter,COLUMN_PATH) + self._books_toolbar._enable_button(True) + + def find_books(self, search_text): + self._books_toolbar._enable_button(False) + self.list_scroller.hide() + self.list_scroller_visible = False + self.book_selected = False + self.ls.clear() + search_tuple = search_text.lower().split() + if len(search_tuple) == 0: + self._alert(_('Error'), _('You must enter at least one search word.')) + self._books_toolbar._search_entry.grab_focus() + return + f = open('bookcatalog.txt', 'r') + while f: + line = unicode(f.readline(), "iso-8859-1") + if not line: + break + line_lower = line.lower() + i = 0 + words_found = 0 + while i < len(search_tuple): + text_index = line_lower.find(search_tuple[i]) + if text_index > -1: + words_found = words_found + 1 + i = i + 1 + if words_found == len(search_tuple): + iter = self.ls.append() + book_tuple = line.split('|') + self.ls.set(iter, COLUMN_TITLE, book_tuple[0], COLUMN_AUTHOR, book_tuple[1], COLUMN_PATH, book_tuple[2].rstrip()) + f.close() + self.list_scroller.show() + self.list_scroller_visible = True + + def get_book(self): + self._books_toolbar._enable_button(False) + if self.selected_path.startswith('PGA'): + gobject.idle_add(self.download_book, self.selected_path.replace('PGA', 'http://gutenberg.net.au'), self._get_book_result_cb) + elif self.selected_path.startswith('/etext'): + gobject.idle_add(self.download_book, "http://www.gutenberg.org/dirs" + self.selected_path + "108.zip", self._get_old_book_result_cb) + else: + gobject.idle_add(self.download_book, "http://www.gutenberg.org/dirs" + self.selected_path + "-8.zip", self._get_iso_book_result_cb) + + def download_book(self, url, result_cb): + print "get book from", url + path = os.path.join(self.get_activity_root(), 'instance', + 'tmp%i' % time.time()) + getter = ReadURLDownloader(url) + getter.connect("finished", result_cb) + getter.connect("progress", self._get_book_progress_cb) + getter.connect("error", self._get_book_error_cb) + _logger.debug("Starting download to %s...", path) + try: + getter.start(path) + except: + self._alert(_('Error'), _('Connection timed out for ') + self.selected_title) + + self._download_content_length = getter.get_content_length() + self._download_content_type = getter.get_content_type() + self.textview.grab_focus() |