Lightningbeam/GUI/Cocoa/ScrollableView.py

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)