Lightningbeam/PyGUI-2.5.3/GUI/Cocoa/DrawableContainer.py

87 lines
2.7 KiB
Python

#
# Python GUI - DrawableContainers - PyObjC
#
from Foundation import NSMakeRect
from AppKit import NSView, NSScrollView, NSColor
from GUI import export
from GUI.Utils import PyGUI_Flipped_NSView
from GUI import Canvas
from GUI.Geometry import rect_to_ns_rect
from GUI.Utils import NSMultiClass, PyGUI_NS_ViewBase
from GUI.GDrawableContainers import default_size, \
DrawableContainer as GDrawableContainer
ns_gray = NSColor.grayColor()
class DrawableContainer(GDrawableContainer):
def __init__(self, **kwds):
width, height = default_size
ns_frame = NSMakeRect(0, 0, width, height)
ns_inner_view = PyGUI_User_NSView.alloc().initWithFrame_(ns_frame)
if self._ns_scrollable:
ns_view = NSScrollView.alloc().initWithFrame_(ns_frame)
ns_view.setDocumentView_(ns_inner_view)
ns_view.setBackgroundColor_(ns_gray)
else:
ns_view = ns_inner_view
ns_inner_view.pygui_component = self
GDrawableContainer.__init__(self, _ns_view = ns_view, _ns_inner_view = ns_inner_view)
self.set(**kwds)
def destroy(self):
#print "View.destroy:", self ###
ns_inner_view = self._ns_inner_view
GDrawableContainer.destroy(self)
if ns_inner_view:
#print "View.destroy: breaking back link from", ns_inner_view ###
ns_inner_view.pygui_component = None
def get_background_color(self):
ns_view = self._ns_inner_view
if ns_view.drawsBackground():
return Color._from_ns_color(ns_view.backgroundColor())
def set_background_color(self, x):
ns_view = self._ns_inner_view
if x:
ns_view.setBackgroundColor_(x._ns_color)
ns_view.setDrawsBackground_(True)
else:
ns_view.setDrawsBackground_(False)
def invalidate(self):
self._ns_inner_view.setNeedsDisplay_(True)
def invalidate_rect(self, r):
self._ns_inner_view.setNeedsDisplayInRect_(rect_to_ns_rect(r))
def with_canvas(self, proc):
ns_view = self._ns_view
ns_view.lockFocus()
proc(Canvas())
ns_view.unlockFocus()
def update(self):
self._ns_view.displayIfNeeded()
def track_mouse(self):
return self._ns_track_mouse(self._ns_inner_view)
#------------------------------------------------------------------------------
class PyGUI_User_NSView(PyGUI_Flipped_NSView, PyGUI_NS_ViewBase):
#
# pygui_component View
__metaclass__ = NSMultiClass
__slots__ = ['pygui_component']
def drawRect_(self, ns_rect):
(l, t), (w, h) = ns_rect
rect = (l, t, l + w, t + h)
self.pygui_component.draw(Canvas(), rect)
export(DrawableContainer)