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

129 lines
4.3 KiB
Python

#
# Python GUI - Components - PyObjC
#
from Foundation import NSRect, NSPoint, NSSize, NSObject
from GUI import export
from GUI import Globals, application
from GUI import Event
from GUI.GComponents import Component as GComponent
#------------------------------------------------------------------------------
Globals._ns_view_to_component = {} # Mapping from NSView to corresponding Component
#------------------------------------------------------------------------------
class Component(GComponent):
_has_local_coords = True
_generic_tabbing = False
_ns_pass_mouse_events_to_platform = False
_ns_handle_mouse = False
_ns_accept_first_responder = False
def __init__(self, _ns_view, _ns_inner_view = None, _ns_responder = None,
_ns_set_autoresizing_mask = True, **kwds):
self._ns_view = _ns_view
if not _ns_inner_view:
_ns_inner_view = _ns_view
self._ns_inner_view = _ns_inner_view
self._ns_responder = _ns_responder or _ns_inner_view
Globals._ns_view_to_component[_ns_view] = self
GComponent.__init__(self, **kwds)
def destroy(self):
#print "Component.destroy:", self ###
GComponent.destroy(self)
_ns_view = self._ns_view
if _ns_view in Globals._ns_view_to_component:
#print "Component.destroy: removing", _ns_view, "from mapping" ###
del Globals._ns_view_to_component[_ns_view]
#print "Component.destroy: breaking link to", self._ns_view ###
self._ns_view = None
#if self._ns_inner_view: print "Component.destroy: breaking inner link to", self._ns_inner_view ###
self._ns_inner_view = None
self._ns_responder = None
def get_bounds(self):
(l, t), (w, h) = self._ns_view.frame()
return (l, t, l + w, t + h)
def set_bounds(self, (l, t, r, b)):
ns = self._ns_view
w0, h0 = ns.frame().size
w1 = r - l
h1 = b - t
ns_frame = ((l, t), (w1, h1))
old_ns_frame = ns.frame()
ns.setFrame_(ns_frame)
sv = ns.superview()
if sv:
sv.setNeedsDisplayInRect_(old_ns_frame)
sv.setNeedsDisplayInRect_(ns_frame)
if w0 != w1 or h0 != h1:
self._resized((w1 - w0, h1 - h0))
def become_target(self):
ns_view = self._ns_view
ns_window = ns_view.window()
if ns_window:
self._ns_accept_first_responder = True
ns_window.makeFirstResponder_(ns_view)
self._ns_accept_first_responder = False
def _ns_pass_to_platform(self, event, method_name):
#print "Component._ns_pass_to_platform:", self ###
h = self._ns_responder
b = h.__class__.__bases__[0]
m = getattr(b, method_name)
#print "...ns responder =", object.__repr__(h) ###
#print "...ns base class =", b ###
#print "...ns method =", m ###
m(h, event._ns_event)
def mouse_down(self, event):
if self._ns_handle_mouse:
self._ns_pass_to_platform(event, ns_mouse_down_methods[event.button])
def mouse_drag(self, event):
if self._ns_handle_mouse:
self._ns_pass_to_platform(event, 'mouseDragged_')
def mouse_up(self, event):
if self._ns_handle_mouse:
self._ns_pass_to_platform(event, ns_mouse_up_methods[event.button])
def mouse_move(self, event):
#self._ns_pass_to_platform(event, 'mouseMoved_')
pass
def mouse_enter(self, event):
#self._ns_pass_to_platform(event, 'mouseEntered_')
pass
def mouse_leave(self, event):
#self._ns_pass_to_platform(event, 'mouseExited_')
pass
def key_down(self, event):
#print "Component.key_down:", repr(event.char), "for", self ###
self._ns_pass_to_platform(event, 'keyDown_')
def key_up(self, event):
self._ns_pass_to_platform(event, 'keyUp_')
#------------------------------------------------------------------------------
ns_mouse_down_methods = {
'left': 'mouseDown_', 'middle': 'otherMouseDown_', 'right': 'rightMouseDown_'
}
ns_mouse_up_methods = {
'left': 'mouseUp_', 'middle': 'otherMouseUp_', 'right': 'rightMouseUp_'
}
#------------------------------------------------------------------------------
export(Component)