97 lines
3.0 KiB
Python
97 lines
3.0 KiB
Python
#
|
|
# Python GUI - Scrollable Views - PyObjC
|
|
#
|
|
|
|
from Foundation import NSPoint, NSMakeRect
|
|
from AppKit import NSScrollView
|
|
from GUI import export
|
|
from GUI.GScrollableViews import ScrollableView as GScrollableView, \
|
|
default_extent, default_line_scroll_amount, default_scrolling
|
|
from GUI.Geometry import ns_rect_to_rect
|
|
|
|
class ScrollableView(GScrollableView):
|
|
|
|
_ns_scrollable = True
|
|
|
|
def __init__(self, extent = default_extent,
|
|
line_scroll_amount = default_line_scroll_amount,
|
|
scrolling = default_scrolling,
|
|
**kwds):
|
|
GScrollableView.__init__(self,
|
|
extent = extent, line_scroll_amount = line_scroll_amount,
|
|
scrolling = scrolling, **kwds)
|
|
|
|
def get_hscrolling(self):
|
|
return self._ns_view.hasHorizontalScroller()
|
|
|
|
def set_hscrolling(self, value):
|
|
self._ns_view.setHasHorizontalScroller_(value)
|
|
|
|
def get_vscrolling(self):
|
|
return self._ns_view.hasVerticalScroller()
|
|
|
|
def set_vscrolling(self, value):
|
|
self._ns_view.setHasVerticalScroller_(value)
|
|
|
|
# def get_extent(self):
|
|
# (l, t), (w, h) = self._ns_inner_view.bounds()
|
|
# return (l, t, l + w, t + h)
|
|
|
|
def get_extent(self):
|
|
return self._ns_inner_view.bounds().size
|
|
|
|
# def set_extent(self, (l, t, r, b)):
|
|
# w = r - l
|
|
# h = b - t
|
|
# ns_docview = self._ns_inner_view
|
|
# ns_docview.setFrame_(NSMakeRect(0, 0, w, h))
|
|
# ns_docview.setBounds_(NSMakeRect(l, t, w, h))
|
|
# self.invalidate()
|
|
|
|
def set_extent(self, (w, h)):
|
|
r = NSMakeRect(0, 0, w, h)
|
|
ns_docview = self._ns_inner_view
|
|
ns_docview.setFrame_(r)
|
|
ns_docview.setBounds_(r)
|
|
self.invalidate()
|
|
|
|
def get_content_size(self):
|
|
return self._ns_view.contentSize()
|
|
|
|
def set_content_size(self, size):
|
|
ns = self._ns_view
|
|
self.size = NSScrollView.\
|
|
frameSizeForContentSize_hasHorizontalScroller_hasVerticalScroller_borderType_(
|
|
size, ns.hasHorizontalScroller(), ns.hasVerticalScroller(), ns.borderType())
|
|
|
|
def get_scroll_offset(self):
|
|
ns_clip_view = self._ns_view.contentView()
|
|
x, y = ns_clip_view.bounds().origin
|
|
return x, y
|
|
|
|
def set_scroll_offset(self, (x, y)):
|
|
ns_view = self._ns_view
|
|
ns_clip_view = ns_view.contentView()
|
|
new_pt = ns_clip_view.constrainScrollPoint_(NSPoint(x, y))
|
|
ns_clip_view.scrollToPoint_(new_pt)
|
|
ns_view.reflectScrolledClipView_(ns_clip_view)
|
|
|
|
def get_line_scroll_amount(self):
|
|
ns_view = self._ns_view
|
|
x = ns_view.horizontalLineScroll()
|
|
y = ns_view.verticalLineScroll()
|
|
return x, y
|
|
|
|
def set_line_scroll_amount(self, (x, y)):
|
|
ns_view = self._ns_view
|
|
ns_view.setHorizontalLineScroll_(x)
|
|
ns_view.setVerticalLineScroll_(y)
|
|
ns_view.setHorizontalPageScroll_(x)
|
|
ns_view.setVerticalPageScroll_(y)
|
|
|
|
def viewed_rect(self):
|
|
ns_rect = self._ns_view.contentView().documentVisibleRect()
|
|
return ns_rect_to_rect(ns_rect)
|
|
|
|
export(ScrollableView)
|