def on_mouse_release(self, x, y, button, modifiers):
<EOL>children_under_mouse = self.__find_children_under_mouse(x, y)<EOL>if self.propagate_mouse_events:<EOL><INDENT>for child in children_under_mouse.current:<EOL><INDENT>child.dispatch_event('<STR_LIT>', x, y, button, modifiers)<EOL><DEDENT><DEDENT>self.stop_event('<STR_LIT>')<EOL>if self.grab_mouse_on_click:<EOL><INDENT>self._ungrab_mouse()<EOL><DEDENT>if self.__is_enabled and self.__rollover_state == '<STR_LIT>':<EOL><INDENT>self.dispatch_event('<STR_LIT>', self)<EOL>if time.perf_counter() - self.__double_click_timer < <NUM_LIT:0.5>:<EOL><INDENT>self.dispatch_event('<STR_LIT>', self)<EOL>self.__double_click_timer = <NUM_LIT:0><EOL><DEDENT>else:<EOL><INDENT>self.__double_click_timer = time.perf_counter()<EOL><DEDENT><DEDENT>self.__update_rollover_state('<STR_LIT>', x, y)<EOL>
React when the mouse is released over this widget.

The ``on_mouse_release` event is propagated to any children under the 
mouse, any ``on_mouse_hold`` event is stopped, an ``on_click`` event is 
fired if the click started and stopped without leaving the widget, and 
``on_double_click`` event is triggered if the widget was clicked twice 
in the last 500 ms, and an ``on_rollover`` event is fired to indicate 
that the widget's rollover state is now "over".