aboutsummaryrefslogtreecommitdiffstats
path: root/mvc/widgets/tablescroll.py
diff options
context:
space:
mode:
authorJesús Eduardo <heckyel@hyperbola.info>2017-09-11 17:47:17 -0500
committerJesús Eduardo <heckyel@hyperbola.info>2017-09-11 17:47:17 -0500
commit14738704ede6dfa6ac79f362a9c1f7f40f470cdc (patch)
tree31c83bdd188ae7b64d7169974d6f066ccfe95367 /mvc/widgets/tablescroll.py
parenteb1896583afbbb622cadcde1a24e17173f61904f (diff)
downloadlibrevideoconverter-14738704ede6dfa6ac79f362a9c1f7f40f470cdc.tar.lz
librevideoconverter-14738704ede6dfa6ac79f362a9c1f7f40f470cdc.tar.xz
librevideoconverter-14738704ede6dfa6ac79f362a9c1f7f40f470cdc.zip
rename mvc at lvc
Diffstat (limited to 'mvc/widgets/tablescroll.py')
-rw-r--r--mvc/widgets/tablescroll.py154
1 files changed, 0 insertions, 154 deletions
diff --git a/mvc/widgets/tablescroll.py b/mvc/widgets/tablescroll.py
deleted file mode 100644
index 841e62c..0000000
--- a/mvc/widgets/tablescroll.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# @Base: Miro - an RSS based video player application
-# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
-# Participatory Culture Foundation
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# In addition, as a special exception, the copyright holders give
-# permission to link the code of portions of this program with the OpenSSL
-# library.
-#
-# You must obey the GNU General Public License in all respects for all of
-# the code used other than OpenSSL. If you modify file(s) with this
-# exception, you may extend this exception to your version of the file(s),
-# but you are not obligated to do so. If you do not wish to do so, delete
-# this exception statement from your version. If you delete this exception
-# statement from all source files in the program, then also delete it here.
-
-"""tablescroll.py -- High-level scroll management. This ensures that behavior
-like scroll_to_item works the same way across platforms.
-"""
-
-from mvc.errors import WidgetActionError
-
-
-class ScrollbarOwnerMixin(object):
- """Scrollbar management for TableView.
-
- External methods have undecorated names; internal methods start with _.
-
- External methods:
- - handle failure themselves (e.g. return None or retry later)
- - return basic data types (e.g. (x, y) tuples)
- - use "tree" coordinates
-
- Internal methods (intended to be used by ScrollbarOwnerMixin and the
- platform implementations):
- - raise WidgetActionError subclasses on failure
- - use Rect/Point structs
- - also use "tree" coordinates
- """
- def __init__(self, _work_around_17153=False):
- self.__work_around_17153 = _work_around_17153
- self._scroll_to_iter_callback = None
- self.create_signal('scroll-range-changed')
-
- def scroll_to_iter(self, iter_, manual=True, recenter=False):
- """Scroll the given item into view.
-
- manual: scroll even if we were not following the playing item
- recenter: scroll even if item is in top half of view
- """
- try:
- item = self._get_item_area(iter_)
- visible = self._get_visible_area()
- manually_scrolled = self._manually_scrolled
- except WidgetActionError:
- if self._scroll_to_iter_callback:
- # We just retried and failed. Do nothing; we will retry again
- # next time scrollable range changes.
- return
- # We just tried and failed; schedule a retry when the scrollable
- # range changes.
- self._scroll_to_iter_callback = self.connect('scroll-range-changed',
- lambda *a: self.scroll_to_iter(iter_, manual, recenter))
- return
- # If the above succeeded, we know the iter's position; this means we can
- # set_scroll_position to that position. That may work now or be
- # postponed until later, but either way we're done with scroll_to_iter.
- if self._scroll_to_iter_callback:
- self.disconnect(self._scroll_to_iter_callback)
- self._scroll_to_iter_callback = None
- visible_bottom = visible.y + visible.height
- visible_middle = visible.y + visible.height // 2
- item_bottom = item.y + item.height
- item_middle = item.y + item.height // 2
- in_top = item_bottom >= visible.y and item.y <= visible_middle
- in_bottom = item_bottom >= visible_middle and item.y <= visible_bottom
- if self._should_scroll(
- manual, in_top, in_bottom, recenter, manually_scrolled):
- destination = item_middle - visible.height // 2
- self._set_vertical_scroll(destination)
- # set_scroll_position will take care of scroll to the position when
- # possible; this may or may not be now, but our work here is done.
-
- def set_scroll_position(self, position, restore_only=False,
- _hack_for_17153=False):
- """Scroll the top left corner to the given (x, y) offset from the origin
- of the view.
-
- restore_only: set the value only if no other value has been set yet
- """
- if _hack_for_17153 and not self.__work_around_17153:
- return
- if not restore_only or not self._position_set:
- self._set_scroll_position(position)
-
- @classmethod
- def _should_scroll(cls,
- manual, in_top, in_bottom, recenter, manually_scrolled):
- if not manual and manually_scrolled:
- # The user has moved the scrollbars since we last autoscrolled, and
- # we're deciding whether we should resume autoscrolling.
- # We want to do that when the currently-playing item catches up to
- # the center of the screen i.e. is part above the center, part below
- return in_top and in_bottom
- # This is a manual scroll, or we're already autoscrolling - so we no
- # longer need to worry about either manual or manually_scrolled
- if in_top:
- # The item is in the top half; let playback catch up with the
- # current scroll position, unless recentering has been requested
- return recenter
- if in_bottom:
- # We land here when:
- # - playback has begun with an item in the bottom half of the screen
- # - scroll is following sequential playback
- # Either way we want to jump down to the item.
- return True
- # We're scrolling to an item that's not in view because:
- # - playback has begun with an item that is out of sight
- # - we're autoscrolling on shuffle
- # Either way we want to show the item.
- return True
-
- def reset_scroll(self):
- """To scroll back to the origin; platform code might want to do
- something special to forget the current position when this happens.
- """
- self.set_scroll_position((0, 0))
-
- def get_scroll_position(self):
- """Returns the current scroll position, or None if not ready."""
- try:
- return tuple(self._get_scroll_position())
- except WidgetActionError:
- return None
-
- def _set_vertical_scroll(self, pos):
- """Helper to set our vertical position without affecting our horizontal
- position.
- """
- # FIXME: shouldn't reset horizontal position
- self.set_scroll_position((0, pos))