Added scrolling and double click events. Cleaned up some code.
This commit is contained in:
parent
fc8fc312a9
commit
3f6c0eb3fa
3 changed files with 84 additions and 35 deletions
13
gtktest.py
13
gtktest.py
|
|
@ -15,6 +15,7 @@ class JGUIWidget(gtk.DrawingArea):
|
|||
self.connect("button_press_event", self.mouse_down)
|
||||
self.connect("button_release_event", self.mouse_up)
|
||||
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)
|
||||
gobject.timeout_add(int((1.0/60.0)*1000), self.tick)
|
||||
self.width, self.height = width, height
|
||||
|
|
@ -24,7 +25,17 @@ class JGUIWidget(gtk.DrawingArea):
|
|||
self.surf.inject_mouse_up(self.buttons[event.button])
|
||||
|
||||
def mouse_down(self, widget, event):
|
||||
self.surf.inject_mouse_down(self.buttons[event.button])
|
||||
if event.type == gtk.gdk.BUTTON_PRESS:
|
||||
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):
|
||||
self.surf.notify_window_resize(event.width, event.height)
|
||||
|
|
|
|||
|
|
@ -31,10 +31,13 @@ class WindowEventSource(EventSource):
|
|||
mouse_events = ['mouse-enter', 'mouse-leave', 'drag', 'mouse-move', 'hover']
|
||||
mouse_wheel_events = ['scroll']
|
||||
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_up_events = ['mouse-right-up', 'mouse-left-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']
|
||||
key_events = ['key-down', 'key-up', 'key-repeat']
|
||||
types = mouse_events + mouse_wheel_events + mouse_button_events +\
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ class Surface(WindowEventSource):
|
|||
self.show_fps = show_fps
|
||||
self.size = Size.from_value(size)
|
||||
self.mouse_pos = Position()
|
||||
self.drawing = False
|
||||
if context is None:
|
||||
if data is not None:
|
||||
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)
|
||||
else:
|
||||
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
|
||||
if self.render_mouse:
|
||||
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.dtindex = 0
|
||||
self.max_samples = 60
|
||||
self.dtlist = range(self.max_samples)
|
||||
self.dtlist = [0]*self.max_samples
|
||||
|
||||
self.accept('mouse-move', self.process_mouse_move)
|
||||
|
||||
|
|
@ -52,6 +53,12 @@ class Surface(WindowEventSource):
|
|||
self.current_focused_window = self.current_hover_window
|
||||
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):
|
||||
self.root_window.inject_mouse_up(button)
|
||||
|
||||
|
|
@ -121,6 +128,7 @@ class Surface(WindowEventSource):
|
|||
return 1.0/(sum(self.dtlist)/float(self.max_samples))
|
||||
|
||||
def draw(self):
|
||||
self.drawing = True
|
||||
if self.show_fps:
|
||||
self.dt = (datetime.now() - self.old_time).total_seconds()
|
||||
self.old_time = datetime.now()
|
||||
|
|
@ -133,6 +141,7 @@ class Surface(WindowEventSource):
|
|||
self.context.set_operator(cairo.OPERATOR_OVER)
|
||||
for window in self.windows:
|
||||
window.draw()
|
||||
self.drawing = False
|
||||
|
||||
|
||||
class WindowSurface(object):
|
||||
|
|
@ -876,44 +885,70 @@ class Window(WindowEventSource, WindowSurface):
|
|||
return l[-1]
|
||||
|
||||
def inject_mouse_down(self, button):
|
||||
if self.mouse_inside():
|
||||
log(button, self.name)
|
||||
self.mouse_inputs[button] = True
|
||||
self.mouse_down = True
|
||||
self.grab_focus()
|
||||
self.dispatch(button, self, self.mouse_pos)
|
||||
else:
|
||||
self.release_focus()
|
||||
stack = [self]
|
||||
while stack:
|
||||
item = stack.pop()
|
||||
if item.mouse_inside():
|
||||
log(button, item.name)
|
||||
item.mouse_inputs[button] = True
|
||||
item.mouse_down = True
|
||||
item.grab_focus()
|
||||
item.dispatch(button, item, item.mouse_pos)
|
||||
else:
|
||||
item.release_focus()
|
||||
if item.children:
|
||||
stack.extend(item.children)
|
||||
|
||||
for child in self.children:
|
||||
child.inject_mouse_down(button)
|
||||
def inject_mouse_double(self, 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):
|
||||
if self.mouse_held() and self.mouse_inputs[button]:
|
||||
log(button+'-up', self.name)
|
||||
self.mouse_down = False
|
||||
self.mouse_inputs[button] = False
|
||||
self.dispatch('{}-up'.format(button), self, self.mouse_pos)
|
||||
for child in self.children:
|
||||
child.inject_mouse_up(button)
|
||||
stack = [self]
|
||||
while stack:
|
||||
item = stack.pop()
|
||||
if item.mouse_held() and item.mouse_inputs[button]:
|
||||
log(button+'-up', item.name)
|
||||
item.mouse_down = False
|
||||
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):
|
||||
mouse_pos = Position.from_value(pos)
|
||||
diff = mouse_pos - self.mouse_pos
|
||||
old_pos = self.mouse_pos
|
||||
self.mouse_pos = mouse_pos
|
||||
if diff != Position(0,0):
|
||||
self.dispatch('mouse-move', self, old_pos, self.mouse_pos)
|
||||
if self.focused and self.mouse_down:
|
||||
for button, down in self.mouse_inputs.items():
|
||||
if down:
|
||||
self.dispatch('{}-drag'.format(button), self, self.mouse_pos)
|
||||
self.dispatch('drag', self, self.mouse_pos)
|
||||
for child in self.children:
|
||||
child.inject_mouse_position(pos)
|
||||
stack = [self]
|
||||
while stack:
|
||||
item = stack.pop()
|
||||
diff = mouse_pos - item.mouse_pos
|
||||
old_pos = item.mouse_pos
|
||||
item.mouse_pos = mouse_pos
|
||||
if diff != Position(0,0):
|
||||
item.dispatch('mouse-move', item, old_pos, self.mouse_pos)
|
||||
if item.focused and item.mouse_down:
|
||||
for button, down in item.mouse_inputs.items():
|
||||
if down:
|
||||
item.dispatch('{}-drag'.format(button), item, self.mouse_pos)
|
||||
item.dispatch('drag', item, self.mouse_pos)
|
||||
if item.children:
|
||||
stack.extend(item.children)
|
||||
|
||||
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):
|
||||
self.focused = True
|
||||
|
|
@ -933,7 +968,7 @@ class Window(WindowEventSource, WindowSurface):
|
|||
|
||||
def release_focus(self):
|
||||
if self.focused:
|
||||
log('released', self.name)
|
||||
log('focus-lost', self.name)
|
||||
self.focused = False
|
||||
self.mouse_down = False
|
||||
#clear events that may have been triggered
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue