Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@sugarlabs.org>2011-02-15 20:51:04 (GMT)
committer Gonzalo Odiard <godiard@sugarlabs.org>2011-02-15 20:51:04 (GMT)
commit2a056dd0de00414f1a07040e2f31db4956e66f45 (patch)
treee9edc1bb4b4a78d0314b03d0e82741841c0b258a
parent3f51adc9a50b797d2fae4dc84381dbe581b9c92b (diff)
Initial plain text support
-rw-r--r--activity/activity.info2
-rw-r--r--readactivity.py3
-rw-r--r--textadapter.py212
3 files changed, 216 insertions, 1 deletions
diff --git a/activity/activity.info b/activity/activity.info
index 35bff87..345af14 100644
--- a/activity/activity.info
+++ b/activity/activity.info
@@ -5,5 +5,5 @@ icon = activity-read
exec = sugar-activity readactivity.ReadActivity
show_launcher = no
activity_version = 88
-mime_types = application/pdf;image/vnd.djvu;image/x.djvu;image/tiff;application/x-cbz;application/x-cbr;application/epub+zip
+mime_types = application/pdf;image/vnd.djvu;image/x.djvu;image/tiff;application/x-cbz;application/x-cbr;application/epub+zip;text/plain
license = GPLv2+
diff --git a/readactivity.py b/readactivity.py
index 253d9f7..c063027 100644
--- a/readactivity.py
+++ b/readactivity.py
@@ -51,6 +51,7 @@ from readtopbar import TopBar
import epubadapter
import evinceadapter
+import textadapter
_HARDWARE_MANAGER_INTERFACE = 'org.laptop.HardwareManager'
_HARDWARE_MANAGER_SERVICE = 'org.laptop.HardwareManager'
@@ -749,6 +750,8 @@ class ReadActivity(activity.Activity):
mimetype = mime.get_for_file(filepath)
if mimetype == 'application/epub+zip':
self._view = epubadapter.EpubViewer()
+ elif mimetype == 'text/plain':
+ self._view = textadapter.TextViewer()
else:
self._view = evinceadapter.EvinceViewer()
diff --git a/textadapter.py b/textadapter.py
new file mode 100644
index 0000000..aabaa3f
--- /dev/null
+++ b/textadapter.py
@@ -0,0 +1,212 @@
+import os
+import logging
+import gtk
+import pango
+import gobject
+
+from sugar.graphics import style
+
+PAGE_SIZE = 38
+
+
+class TextViewer(gobject.GObject):
+
+ __gsignals__ = {
+ 'zoom-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([int])),
+ 'page-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([int, int])),
+ 'selection-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([])),
+ }
+
+ def setup(self, activity):
+ activity._scrolled = gtk.ScrolledWindow()
+ activity._scrolled.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+ activity._scrolled.props.shadow_type = gtk.SHADOW_NONE
+
+ self._scrolled = activity._scrolled
+
+ self.textview = gtk.TextView()
+ self.textview.set_editable(False)
+ self.textview.set_cursor_visible(False)
+ self.textview.set_left_margin(50)
+ self.textview.set_right_margin(50)
+ self.textview.set_wrap_mode(gtk.WRAP_WORD)
+ activity._scrolled.add(self.textview)
+ self.textview.show()
+ activity._scrolled.show()
+ activity._hbox.pack_start(activity._scrolled, expand=True, fill=True)
+
+ self._font_size = style.zoom(10)
+ self.font_desc = pango.FontDescription("sans %d" % self._font_size)
+ self.textview.modify_font(self.font_desc)
+ self._zoom = 100
+ self.font_zoom_relation = self._zoom / self._font_size
+ self._current_page = 0
+
+ def load_document(self, file_path):
+ self._etext_file = open(file_path.replace('file://', ''), 'r')
+
+ self.page_index = [0]
+ pagecount = 0
+ linecount = 0
+ while self._etext_file:
+ line = self._etext_file.readline()
+ if not line:
+ break
+ line_increment = (len(line) / 80) + 1
+ linecount = linecount + line_increment
+ if linecount >= PAGE_SIZE:
+ position = self._etext_file.tell()
+ self.page_index.append(position)
+ linecount = 0
+ pagecount = pagecount + 1
+ self._pagecount = pagecount + 1
+ self.set_current_page(0)
+
+ def _show_page(self, page_number):
+ position = self.page_index[page_number]
+ self._etext_file.seek(position)
+ linecount = 0
+ label_text = '\n\n\n'
+ while linecount < PAGE_SIZE:
+ line = self._etext_file.readline()
+ if not line:
+ break
+ else:
+ label_text = label_text + unicode(line, "iso-8859-1")
+ line_increment = (len(line) / 80) + 1
+ linecount = linecount + line_increment
+ textbuffer = self.textview.get_buffer()
+ label_text = label_text + '\n\n\n'
+ textbuffer.set_text(label_text)
+
+ def connect_page_changed_handler(self, handler):
+ self.connect('page-changed', handler)
+
+ def load_metadata(self, activity):
+ pass
+
+ def set_current_page(self, page):
+ old_page = self._current_page
+ self._current_page = page
+ self._show_page(self._current_page)
+ self.emit('page-changed', old_page, self._current_page)
+
+ def scroll(self, direction, horizontal):
+ v_adjustment = self._scrolled.get_vadjustment()
+ if direction == gtk.SCROLL_PAGE_BACKWARD:
+ if v_adjustment.value == v_adjustment.lower:
+ self.previous_page()
+ return
+ if v_adjustment.value > v_adjustment.lower:
+ new_value = v_adjustment.value - v_adjustment.step_increment
+ if new_value < v_adjustment.lower:
+ new_value = v_adjustment.lower
+ v_adjustment.value = new_value
+ else:
+ if v_adjustment.value == \
+ v_adjustment.upper - v_adjustment.page_size:
+ self.next_page()
+ return
+ if v_adjustment.value < \
+ v_adjustment.upper - v_adjustment.page_size:
+ new_value = v_adjustment.value + v_adjustment.step_increment
+ if new_value > v_adjustment.upper - v_adjustment.page_size:
+ new_value = v_adjustment.upper - v_adjustment.page_size
+ v_adjustment.value = new_value
+
+ def previous_page(self):
+ v_adjustment = self._scrolled.get_vadjustment()
+ v_adjustment.value = v_adjustment.upper - v_adjustment.page_size
+ self.set_current_page(self.get_current_page() - 1)
+
+ def next_page(self):
+ v_adjustment = self._scrolled.get_vadjustment()
+ v_adjustment.value = v_adjustment.lower
+ self.set_current_page(self.get_current_page() + 1)
+
+ def get_current_page(self):
+ return self._current_page
+
+ def get_pagecount(self):
+ return self._pagecount
+
+ def update_toc(self, activity):
+ pass
+
+ def handle_link(self, link):
+ pass
+
+ def get_current_file(self):
+ pass
+
+ def update_metadata(self):
+ pass
+
+ def copy(self):
+ pass
+
+ def update_view_size(self, _scrolled):
+ pass
+
+ def find_set_highlight_search(self, True):
+ pass
+
+ def setup_find_job(self, text, _find_updated_cb):
+ pass
+
+ def find_next(self):
+ pass
+
+ def find_previous(self):
+ pass
+
+ def find_changed(self, job, page):
+ pass
+
+ def get_zoom(self):
+ return self.font_zoom_relation * self._font_size
+
+ def connect_zoom_handler(self, handler):
+ self._view_notify_zoom_handler = \
+ self.connect('zoom-changed', handler)
+ return self._view_notify_zoom_handler
+
+ def set_zoom(self, value):
+ self._zoom = value
+ self._font_size = int(self._zoom / self.font_zoom_relation)
+ self.font_desc.set_size(self._font_size * 1024)
+ self.textview.modify_font(self.font_desc)
+
+ def zoom_in(self):
+ self._set_font_size(self._font_size + 1)
+
+ def zoom_out(self):
+ self._set_font_size(self._font_size - 1)
+
+ def _set_font_size(self, size):
+ self._font_size = size
+ self.font_desc.set_size(self._font_size * 1024)
+ self.textview.modify_font(self.font_desc)
+ self._zoom = self.font_zoom_relation * self._font_size
+ self.emit('zoom-changed', self._zoom)
+
+ def zoom_to_width(self):
+ pass
+
+ def can_zoom_in(self):
+ return True
+
+ def can_zoom_out(self):
+ return self._font_size > 1
+
+ def can_zoom_to_width(self):
+ return False
+
+ def zoom_to_best_fit(self):
+ return False
+
+ def zoom_to_actual_size(self):
+ return False