Added scrolling and double click events. Cleaned up some code.

This commit is contained in:
Joey Payne 2014-02-13 18:20:37 -07:00
commit 3f6c0eb3fa
3 changed files with 84 additions and 35 deletions

View file

@ -15,6 +15,7 @@ class JGUIWidget(gtk.DrawingArea):
self.connect("button_press_event", self.mouse_down) self.connect("button_press_event", self.mouse_down)
self.connect("button_release_event", self.mouse_up) self.connect("button_release_event", self.mouse_up)
self.connect("configure_event", self.resize_win) self.connect("configure_event", self.resize_win)
self.connect("scroll_event", self.mouse_scroll)
self.add_events(gdk.BUTTON_PRESS_MASK | gdk.BUTTON_RELEASE_MASK | gdk.POINTER_MOTION_MASK) self.add_events(gdk.BUTTON_PRESS_MASK | gdk.BUTTON_RELEASE_MASK | gdk.POINTER_MOTION_MASK)
gobject.timeout_add(int((1.0/60.0)*1000), self.tick) gobject.timeout_add(int((1.0/60.0)*1000), self.tick)
self.width, self.height = width, height self.width, self.height = width, height
@ -24,7 +25,17 @@ class JGUIWidget(gtk.DrawingArea):
self.surf.inject_mouse_up(self.buttons[event.button]) self.surf.inject_mouse_up(self.buttons[event.button])
def mouse_down(self, widget, event): def mouse_down(self, widget, event):
if event.type == gtk.gdk.BUTTON_PRESS:
self.surf.inject_mouse_down(self.buttons[event.button]) self.surf.inject_mouse_down(self.buttons[event.button])
elif event.type == gtk.gdk._2BUTTON_PRESS:
self.surf.inject_mouse_double(self.buttons[event.button])
def mouse_scroll(self, widget, event):
if event.direction == gtk.gdk.SCROLL_UP:
direction = 1
else:
direction = -1
self.surf.inject_mouse_wheel(direction)
def resize_win(self, widget, event): def resize_win(self, widget, event):
self.surf.notify_window_resize(event.width, event.height) self.surf.notify_window_resize(event.width, event.height)

View file

@ -31,10 +31,13 @@ class WindowEventSource(EventSource):
mouse_events = ['mouse-enter', 'mouse-leave', 'drag', 'mouse-move', 'hover'] mouse_events = ['mouse-enter', 'mouse-leave', 'drag', 'mouse-move', 'hover']
mouse_wheel_events = ['scroll'] mouse_wheel_events = ['scroll']
mouse_button_down_events = ['mouse-right', 'mouse-left', 'mouse-middle'] mouse_button_down_events = ['mouse-right', 'mouse-left', 'mouse-middle']
mouse_button_down_double_events = ['mouse-right-double', 'mouse-left-double', 'mouse-middle-double']
mouse_button_drag_events = ['mouse-right-drag', 'mouse-left-drag', 'mouse-middle-drag'] mouse_button_drag_events = ['mouse-right-drag', 'mouse-left-drag', 'mouse-middle-drag']
mouse_button_up_events = ['mouse-right-up', 'mouse-left-up', mouse_button_up_events = ['mouse-right-up', 'mouse-left-up',
'mouse-middle-up'] 'mouse-middle-up']
mouse_button_events = mouse_button_down_events + mouse_button_up_events + mouse_button_drag_events mouse_button_events = mouse_button_down_double_events + \
mouse_button_down_events + mouse_button_up_events + \
mouse_button_drag_events
window_events = ['resize', 'move', 'focus', 'focus-lost', 'resize-start', 'resize-end'] window_events = ['resize', 'move', 'focus', 'focus-lost', 'resize-start', 'resize-end']
key_events = ['key-down', 'key-up', 'key-repeat'] key_events = ['key-down', 'key-up', 'key-repeat']
types = mouse_events + mouse_wheel_events + mouse_button_events +\ types = mouse_events + mouse_wheel_events + mouse_button_events +\

View file

@ -16,6 +16,7 @@ class Surface(WindowEventSource):
self.show_fps = show_fps self.show_fps = show_fps
self.size = Size.from_value(size) self.size = Size.from_value(size)
self.mouse_pos = Position() self.mouse_pos = Position()
self.drawing = False
if context is None: if context is None:
if data is not None: if data is not None:
self.csurface = cairo.ImageSurface.create_for_data(data, cairo.FORMAT_ARGB32, self.size.width, self.size.height) self.csurface = cairo.ImageSurface.create_for_data(data, cairo.FORMAT_ARGB32, self.size.width, self.size.height)
@ -24,7 +25,7 @@ class Surface(WindowEventSource):
self.context = cairo.Context(self.csurface) self.context = cairo.Context(self.csurface)
else: else:
self.context = context self.context = context
self.root_window = Window('root', position=Position(0,0), size=self.size, context=self.context, surface=self) self.root_window = Window('root', position=Position(0,0), size=self.size, context=self.context, surface=self, ignore_debug=True)
self.render_mouse = render_mouse self.render_mouse = render_mouse
if self.render_mouse: if self.render_mouse:
self.mouse_icon = Mouse('mouse', position=Position(0, 0), size=Size(12,20), context=self.context, surface=self) self.mouse_icon = Mouse('mouse', position=Position(0, 0), size=Size(12,20), context=self.context, surface=self)
@ -38,7 +39,7 @@ class Surface(WindowEventSource):
self.old_time = datetime.now() self.old_time = datetime.now()
self.dtindex = 0 self.dtindex = 0
self.max_samples = 60 self.max_samples = 60
self.dtlist = range(self.max_samples) self.dtlist = [0]*self.max_samples
self.accept('mouse-move', self.process_mouse_move) self.accept('mouse-move', self.process_mouse_move)
@ -52,6 +53,12 @@ class Surface(WindowEventSource):
self.current_focused_window = self.current_hover_window self.current_focused_window = self.current_hover_window
self.root_window.inject_mouse_down(button) self.root_window.inject_mouse_down(button)
def inject_mouse_double(self, button):
self.root_window.inject_mouse_double(button)
def inject_mouse_wheel(self, value):
self.root_window.inject_mouse_wheel(value)
def inject_mouse_up(self, button): def inject_mouse_up(self, button):
self.root_window.inject_mouse_up(button) self.root_window.inject_mouse_up(button)
@ -121,6 +128,7 @@ class Surface(WindowEventSource):
return 1.0/(sum(self.dtlist)/float(self.max_samples)) return 1.0/(sum(self.dtlist)/float(self.max_samples))
def draw(self): def draw(self):
self.drawing = True
if self.show_fps: if self.show_fps:
self.dt = (datetime.now() - self.old_time).total_seconds() self.dt = (datetime.now() - self.old_time).total_seconds()
self.old_time = datetime.now() self.old_time = datetime.now()
@ -133,6 +141,7 @@ class Surface(WindowEventSource):
self.context.set_operator(cairo.OPERATOR_OVER) self.context.set_operator(cairo.OPERATOR_OVER)
for window in self.windows: for window in self.windows:
window.draw() window.draw()
self.drawing = False
class WindowSurface(object): class WindowSurface(object):
@ -876,44 +885,70 @@ class Window(WindowEventSource, WindowSurface):
return l[-1] return l[-1]
def inject_mouse_down(self, button): def inject_mouse_down(self, button):
if self.mouse_inside(): stack = [self]
log(button, self.name) while stack:
self.mouse_inputs[button] = True item = stack.pop()
self.mouse_down = True if item.mouse_inside():
self.grab_focus() log(button, item.name)
self.dispatch(button, self, self.mouse_pos) item.mouse_inputs[button] = True
item.mouse_down = True
item.grab_focus()
item.dispatch(button, item, item.mouse_pos)
else: else:
self.release_focus() item.release_focus()
if item.children:
stack.extend(item.children)
for child in self.children: def inject_mouse_double(self, button):
child.inject_mouse_down(button) stack = [self]
while stack:
item = stack.pop()
if item.mouse_inside():
log(button+'-double', item.name)
item.dispatch(button+'-double', item, item.mouse_pos)
if item.children:
stack.extend(item.children)
def inject_mouse_up(self, button): def inject_mouse_up(self, button):
if self.mouse_held() and self.mouse_inputs[button]: stack = [self]
log(button+'-up', self.name) while stack:
self.mouse_down = False item = stack.pop()
self.mouse_inputs[button] = False if item.mouse_held() and item.mouse_inputs[button]:
self.dispatch('{}-up'.format(button), self, self.mouse_pos) log(button+'-up', item.name)
for child in self.children: item.mouse_down = False
child.inject_mouse_up(button) item.mouse_inputs[button] = False
item.dispatch('{}-up'.format(button), item, item.mouse_pos)
if item.children:
stack.extend(item.children)
def inject_mouse_position(self, pos): def inject_mouse_position(self, pos):
mouse_pos = Position.from_value(pos) mouse_pos = Position.from_value(pos)
diff = mouse_pos - self.mouse_pos stack = [self]
old_pos = self.mouse_pos while stack:
self.mouse_pos = mouse_pos item = stack.pop()
diff = mouse_pos - item.mouse_pos
old_pos = item.mouse_pos
item.mouse_pos = mouse_pos
if diff != Position(0,0): if diff != Position(0,0):
self.dispatch('mouse-move', self, old_pos, self.mouse_pos) item.dispatch('mouse-move', item, old_pos, self.mouse_pos)
if self.focused and self.mouse_down: if item.focused and item.mouse_down:
for button, down in self.mouse_inputs.items(): for button, down in item.mouse_inputs.items():
if down: if down:
self.dispatch('{}-drag'.format(button), self, self.mouse_pos) item.dispatch('{}-drag'.format(button), item, self.mouse_pos)
self.dispatch('drag', self, self.mouse_pos) item.dispatch('drag', item, self.mouse_pos)
for child in self.children: if item.children:
child.inject_mouse_position(pos) stack.extend(item.children)
def inject_mouse_wheel(self, value): def inject_mouse_wheel(self, value):
self.dispatch('scroll', self, value) stack = [self]
while stack:
item = stack.pop()
if item.mouse_inside():
log(item.name, 'scroll', value)
item.dispatch('scroll', item, value)
if item.children:
stack.extend(item.children)
def grab_focus(self): def grab_focus(self):
self.focused = True self.focused = True
@ -933,7 +968,7 @@ class Window(WindowEventSource, WindowSurface):
def release_focus(self): def release_focus(self):
if self.focused: if self.focused:
log('released', self.name) log('focus-lost', self.name)
self.focused = False self.focused = False
self.mouse_down = False self.mouse_down = False
#clear events that may have been triggered #clear events that may have been triggered