diff options
author | Gonzalo Odiard <godiard@gmail.com> | 2012-09-12 20:13:45 (GMT) |
---|---|---|
committer | Gonzalo Odiard <godiard@gmail.com> | 2012-09-12 20:13:45 (GMT) |
commit | 76a25cf799938394b85fbdb97c346268e3fc92cb (patch) | |
tree | baeab31a96cd703a64f703754f06f28d5b0cba23 | |
parent | 3b1732b2253f456500acb03e039ce09de5ef67e2 (diff) |
Use a scrollbar to navigate the entire book in txt books.
Mimic the behaviour of epub and pdf files.
This patch also solves a error in search in txt files,
introduced in the port to gtk3
Signed-off-by: Gonzalo Odiard <gonzalo@laptop.org>
-rw-r--r-- | textadapter.py | 105 |
1 files changed, 86 insertions, 19 deletions
diff --git a/textadapter.py b/textadapter.py index 23ff755..fe6b75f 100644 --- a/textadapter.py +++ b/textadapter.py @@ -28,12 +28,9 @@ class TextViewer(GObject.GObject): def setup(self, activity): self._activity = activity - activity._scrolled = Gtk.ScrolledWindow() - activity._scrolled.set_policy(Gtk.PolicyType.NEVER, - Gtk.PolicyType.AUTOMATIC) - activity._scrolled.props.shadow_type = Gtk.ShadowType.NONE - self._scrolled = activity._scrolled + self.__going_fwd = False + self.__going_back = True self.textview = Gtk.TextView() self.textview.set_editable(False) @@ -50,10 +47,28 @@ class TextViewer(GObject.GObject): Gdk.EventMask.TOUCH_MASK) self.textview.connect('event', self.__touch_event_cb) - activity._scrolled.add(self.textview) - self.textview.show() - activity._scrolled.show() - activity._hbox.pack_start(activity._scrolled, True, True, 0) + self._sw = Gtk.ScrolledWindow() + self._sw.add(self.textview) + self._v_vscrollbar = self._sw.get_vscrollbar() + self._v_scrollbar_value_changed_cb_id = \ + self._v_vscrollbar.connect('value-changed', \ + self._v_scrollbar_value_changed_cb) + self._scrollbar = Gtk.VScrollbar() + self._scrollbar_change_value_cb_id = \ + self._scrollbar.connect('change-value', \ + self._scrollbar_change_value_cb) + + overlay = Gtk.Overlay() + hbox = Gtk.HBox() + overlay.add(hbox) + hbox.add(self._sw) + + self._scrollbar.props.halign = Gtk.Align.END + self._scrollbar.props.valign = Gtk.Align.FILL + overlay.add_overlay(self._scrollbar) + overlay.show_all() + + activity._hbox.pack_start(overlay, True, True, 0) self._font_size = style.zoom(10) self.font_desc = Pango.FontDescription("sans %d" % self._font_size) @@ -109,6 +124,8 @@ class TextViewer(GObject.GObject): pagecount = pagecount + 1 self._pagecount = pagecount + 1 self.set_current_page(0) + self._scrollbar.set_range(1.0, self._pagecount - 1.0) + self._scrollbar.set_increments(1.0, 1.0) speech.highlight_cb = self.highlight_next_word speech.reset_cb = self.reset_text_to_speech @@ -131,6 +148,51 @@ class TextViewer(GObject.GObject): textbuffer.set_text(label_text) self._prepare_text_to_speech(label_text) + def _v_scrollbar_value_changed_cb(self, scrollbar): + """ + This is the real scrollbar containing the text view + """ + if self._current_page < 1: + return + scrollval = scrollbar.get_value() + scroll_upper = self._v_vscrollbar.props.adjustment.props.upper + scroll_page_size = self._v_vscrollbar.props.adjustment.props.page_size + + if self.__going_fwd == True and \ + not self._current_page == self._pagecount: + + if scrollval == scroll_upper: + self.set_current_page(self._current_page + 1) + elif self.__going_back == True and self._current_page > 1: + if scrollval == 0.0: + self.set_current_page(self._current_page - 1) + + def _scrollbar_change_value_cb(self, range, scrolltype, value): + """ + This is the fake scrollbar visible, used to show the lenght of the book + """ + old_page = self._current_page + if scrolltype == Gtk.ScrollType.STEP_FORWARD: + self.__going_fwd = True + self.__going_back = False + elif scrolltype == Gtk.ScrollType.STEP_BACKWARD: + self.__going_fwd = False + self.__going_back = True + elif scrolltype == Gtk.ScrollType.JUMP or \ + scrolltype == Gtk.ScrollType.PAGE_FORWARD or \ + scrolltype == Gtk.ScrollType.PAGE_BACKWARD: + if value > self._scrollbar.props.adjustment.props.upper: + value = self._pagecount + self._show_page(int(value)) + self._current_page = int(value) + self.emit('page-changed', old_page, self._current_page) + else: + print 'Warning: unknown scrolltype %s with value %f' \ + % (str(scrolltype), value) + + #FIXME: This should not be needed here + self._scrollbar.set_value(self._current_page) + def __touch_event_cb(self, widget, event): if event.type == Gdk.EventType.TOUCH_BEGIN: x = event.touch.x @@ -218,7 +280,7 @@ class TextViewer(GObject.GObject): bounds = textbuffer.get_bounds() textbuffer.apply_tag(self.normal_tag, bounds[0], iterStart) textbuffer.apply_tag(self.spoken_word_tag, iterStart, iterEnd) - v_adjustment = self._scrolled.get_vadjustment() + v_adjustment = self._sw.get_vadjustment() max_pos = v_adjustment.get_upper() - v_adjustment.get_page_size() max_pos = max_pos * word_count max_pos = max_pos / len(self.word_tuples) @@ -244,10 +306,13 @@ class TextViewer(GObject.GObject): old_page = self._current_page self._current_page = page self._show_page(self._current_page) + self._scrollbar.handler_block(self._scrollbar_change_value_cb_id) + self._scrollbar.set_value(self._current_page) + self._scrollbar.handler_unblock(self._scrollbar_change_value_cb_id) self.emit('page-changed', old_page, self._current_page) def scroll(self, scrolltype, horizontal): - v_adjustment = self._scrolled.get_vadjustment() + v_adjustment = self._sw.get_vadjustment() v_value = v_adjustment.get_value() if scrolltype in (Gtk.ScrollType.PAGE_BACKWARD, Gtk.ScrollType.PAGE_FORWARD): @@ -257,6 +322,8 @@ class TextViewer(GObject.GObject): if scrolltype in (Gtk.ScrollType.PAGE_BACKWARD, Gtk.ScrollType.STEP_BACKWARD): + self.__going_fwd = False + self.__going_back = True if v_value <= v_adjustment.get_lower(): self.previous_page() v_adjustment.set_value(v_adjustment.get_upper() - \ @@ -269,6 +336,9 @@ class TextViewer(GObject.GObject): v_adjustment.set_value(new_value) elif scrolltype in (Gtk.ScrollType.PAGE_FORWARD, Gtk.ScrollType.STEP_FORWARD): + self.__going_fwd = True + self.__going_back = False + if v_value >= v_adjustment.get_upper() - \ v_adjustment.get_page_size(): self.next_page() @@ -287,13 +357,13 @@ class TextViewer(GObject.GObject): self.set_current_page(self._pagecount - 1) def previous_page(self): - v_adjustment = self._scrolled.get_vadjustment() + v_adjustment = self._sw.get_vadjustment() v_adjustment.set_value(v_adjustment.get_upper() - v_adjustment.get_page_size()) self.set_current_page(self.get_current_page() - 1) def next_page(self): - v_adjustment = self._scrolled.get_vadjustment() + v_adjustment = self._sw.get_vadjustment() v_adjustment.set_value(v_adjustment.get_lower()) self.set_current_page(self.get_current_page() + 1) @@ -315,9 +385,6 @@ class TextViewer(GObject.GObject): def copy(self): self.textview.get_buffer().copy_clipboard(Gtk.Clipboard()) - def update_view_size(self, _scrolled): - pass - def _view_buttonrelease_event_cb(self, view, event): self._has_selection = \ self.textview.get_buffer().get_selection_bounds() != () @@ -412,7 +479,7 @@ class _JobFind(GObject.GObject): def __init__(self, text_file, start_page, n_pages, text, \ case_sensitive=False): GObject.GObject.__init__(self) - Gtk.gdk.threads_init() + Gdk.threads_init() self._finished = False self._text_file = text_file @@ -502,10 +569,10 @@ class _SearchThread(threading.Thread): self._found_records[self._current_found_item] self._page = self.current_found_tuple[0] - Gtk.gdk.threads_enter() + Gdk.threads_enter() self.obj._finished = True self.obj.emit('updated') - Gtk.gdk.threads_leave() + Gdk.threads_leave() return False |