##// END OF EJS Templates
Implement a context manager as a property locking mechanism in Widget.
Implement a context manager as a property locking mechanism in Widget.

File last commit:

r14541:1d180d4a
r14579:f0c9c00e
Show More
widget_button.py
93 lines | 3.2 KiB | text/x-python | PythonLexer
Jonathan Frederic
Cleaned up Python widget code.
r14283 """ButtonWidget class.
Represents a button in the frontend using a widget. Allows user to listen for
click events on the button and trigger backend code when the clicks are fired.
"""
#-----------------------------------------------------------------------------
# Copyright (c) 2013, the IPython Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
Jonathan Frederic
Fixed button widget click event handler/
r14272 import inspect
import types
Jonathan Frederic
s/Widget/DOMWidget s/BaseWidget/Widget
r14540 from .widget import DOMWidget
Jonathan Frederic
Add button widget
r14270 from IPython.utils.traitlets import Unicode, Bool, Int
Jonathan Frederic
Cleaned up Python widget code.
r14283 #-----------------------------------------------------------------------------
# Classes
#-----------------------------------------------------------------------------
Jonathan Frederic
s/Widget/DOMWidget s/BaseWidget/Widget
r14540 class ButtonWidget(DOMWidget):
Jonathan Frederic
Add button widget
r14270 target_name = Unicode('ButtonWidgetModel')
Jonathan Frederic
s/default_view_name/view_name
r14541 view_name = Unicode('ButtonView')
Jonathan Frederic
Cleaned up Python widget code.
r14283
# Keys
Jonathan Frederic
s/Widget/DOMWidget s/BaseWidget/Widget
r14540 keys = ['description', 'disabled'] + DOMWidget.keys
Jonathan Frederic
Cleaned up Python widget code.
r14283 description = Unicode('', help="Description of the button (label).")
disabled = Bool(False, help="Enable or disable user changes.")
Jonathan Frederic
Add button widget
r14270
Jonathan Frederic
Fixed button on_click handler so it's initiated on instanciation
r14315
def __init__(self, **kwargs):
super(ButtonWidget, self).__init__(**kwargs)
Jonathan Frederic
Changed button to use custom messages instead of state to communicate events.
r14400
self._click_handlers = []
self.on_msg(self._handle_button_msg)
Jonathan Frederic
Add button widget
r14270
Jonathan Frederic
Fixed button widget click event handler/
r14272
def on_click(self, callback, remove=False):
Jonathan Frederic
Updated ButtonWidget onclick description
r14320 """Register a callback to execute when the button is clicked. The
callback can either accept no parameters or one sender parameter:
- callback()
- callback(sender)
If the callback has a sender parameter, the ButtonWidget instance that
called the callback will be passed into the method as the sender.
Jonathan Frederic
Cleaned up Python widget code.
r14283
Parameters
----------
remove : bool (optional)
Jonathan Frederic
Updated ButtonWidget onclick description
r14320 Set to true to remove the callback from the list of callbacks."""
Jonathan Frederic
Add button widget
r14270 if remove:
self._click_handlers.remove(callback)
Jonathan Frederic
Fixed widget button onclick register so it only will ever register a callback once.
r14331 elif not callback in self._click_handlers:
Jonathan Frederic
Add button widget
r14270 self._click_handlers.append(callback)
Jonathan Frederic
Fixed button widget click event handler/
r14272
Jonathan Frederic
Changed button to use custom messages instead of state to communicate events.
r14400 def _handle_button_msg(self, content):
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 """Handle a msg from the front-end
Jonathan Frederic
Changed button to use custom messages instead of state to communicate events.
r14400
Parameters
----------
content: dict
Content of the msg."""
if 'event' in content and content['event'] == 'click':
self._handle_click()
def _handle_click(self):
"""Handles when the button has been clicked. Fires on_click
Jonathan Frederic
Cleaned up Python widget code.
r14283 callbacks when appropriate."""
Jonathan Frederic
Changed button to use custom messages instead of state to communicate events.
r14400
for handler in self._click_handlers:
if callable(handler):
argspec = inspect.getargspec(handler)
nargs = len(argspec[0])
# Bound methods have an additional 'self' argument
if isinstance(handler, types.MethodType):
nargs -= 1
# Call the callback
if nargs == 0:
handler()
elif nargs == 1:
handler(self)
else:
raise TypeError('ButtonWidget click callback must ' \
'accept 0 or 1 arguments.')