-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
MEP22: Navigation by events #3652
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
8cceed4
3118a5a
b4d5fcf
1e8af47
622cb95
d1a9de4
3f89d52
4f3c10b
6065daa
f6a2f19
05db3b6
c08fe56
b207a72
9266447
a53419a
704c717
5056729
e6a4e1e
8942c47
022de6f
2c9a195
cafe668
224f745
94c711e
67257e7
ffa65d6
6739ee0
d18206f
34a52c8
c2da483
44a9b0e
a2ed47f
0665890
411e6e2
d484ebd
75bf97b
6cc040b
0ff5997
af6734f
78513d2
377ff54
7dbbf58
dd66b57
67a414f
e415d8d
1213086
ba61dec
9f2ee2b
9da2b13
110253f
e2804ea
9a64b7e
64f947f
e8cd5d5
4bbcf4e
73a2661
1b83628
e4edd23
d4ac2fb
a7640ef
48a6971
8dafe09
a0695d0
328b169
aac4744
f09b9ef
def3a52
9ee7e25
5eae4e1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3227,32 +3227,24 @@ def set_history_buttons(self): | |
|
||
class ToolEvent(object): | ||
"""Event for tool manipulation (add/remove)""" | ||
def __init__(self, name, sender, tool): | ||
def __init__(self, name, sender, tool, data=None): | ||
self.name = name | ||
self.sender = sender | ||
self.tool = tool | ||
self.data = data | ||
|
||
|
||
class ToolTriggerEvent(ToolEvent): | ||
"""Event to inform that a tool has been triggered""" | ||
def __init__(self, name, sender, tool, canvasevent=None, data=None): | ||
ToolEvent.__init__(self, name, sender, tool) | ||
ToolEvent.__init__(self, name, sender, tool, data) | ||
self.canvasevent = canvasevent | ||
self.data = data | ||
|
||
|
||
class ToolAddedEvent(ToolEvent): | ||
"""Event triggered when a tool is added""" | ||
def __init__(self, name, sender, tool, group, position): | ||
ToolEvent.__init__(self, name, sender, tool) | ||
self.group = group | ||
self.position = position | ||
|
||
|
||
class NavigationMessageEvent(object): | ||
"""Event carring messages from navigation | ||
"""Event carrying messages from navigation | ||
|
||
Messages are generaly displayed to the user by the toolbar | ||
Messages usually get displayed to the user by the toolbar | ||
""" | ||
def __init__(self, name, sender, message): | ||
self.name = name | ||
|
@@ -3339,7 +3331,7 @@ def active_toggle(self): | |
return self._toggled | ||
|
||
def get_tool_keymap(self, name): | ||
"""Get the keymap associated with a tool | ||
"""Get the keymap associated with the specified tool | ||
|
||
Parameters | ||
---------- | ||
|
@@ -3360,13 +3352,13 @@ def _remove_keys(self, name): | |
del self._keys[k] | ||
|
||
def set_tool_keymap(self, name, *keys): | ||
"""Set the keymap associated with a tool | ||
"""Set the keymap to associate with the specified tool | ||
|
||
Parameters | ||
---------- | ||
name : string | ||
Name of the Tool | ||
keys : keys to associated with the Tool | ||
keys : keys to associate with the Tool | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Okay, a bit confused here. Why keys as *args? You expect someone to do both
Just doing another PR here, so I wanted to check, the docstring not too clear here. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here, I just followed the convention for default keymaps. |
||
""" | ||
|
||
if name not in self._tools: | ||
|
@@ -3440,7 +3432,7 @@ def add_tool(self, name, tool, group=None, position=None): | |
group: String | ||
Group to position the tool in | ||
position : int or None (default) | ||
Position within its group in the toolbar, if None, is positioned at the end | ||
Position within its group in the toolbar, if None, it goes at the end | ||
""" | ||
|
||
tool_cls = self._get_cls_to_instantiate(tool) | ||
|
@@ -3457,7 +3449,7 @@ def add_tool(self, name, tool, group=None, position=None): | |
if tool_cls.keymap is not None: | ||
self.set_tool_keymap(name, tool_cls.keymap) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. shouldn't this be There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The one who makes the sorting (by keymap) of the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Huh? per-instance key binding happens, this just sets the default keymap. @fariza I think you should rename There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't quite follow this yet.. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @OceanWolf agreed and done There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @tacaswell |
||
|
||
# For toggle tools init the radio_grop in self._toggled | ||
# For toggle tools init the radio_group in self._toggled | ||
if getattr(tool_cls, 'toggled', False) is not False: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why not There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Changed to a proper |
||
# None group is not mutually exclusive, a set is used to keep track | ||
# of all toggled tools in this group | ||
|
@@ -3470,15 +3462,15 @@ def add_tool(self, name, tool, group=None, position=None): | |
|
||
def _tool_added_event(self, tool, group, position): | ||
s = 'tool_added_event' | ||
event = ToolAddedEvent(s, self, | ||
tool, | ||
group, | ||
position) | ||
event = ToolEvent(s, | ||
self, | ||
tool, | ||
data={'group': group, 'position': position}) | ||
self._callbacks.process(s, event) | ||
|
||
def _handle_toggle(self, tool, sender, canvasevent, data): | ||
# Toggle tools, need to be untoggled before other Toggle tool is used | ||
# This is called from tool_trigger_event | ||
# Toggle tools, need to untoggle prior to using other Toggle tool | ||
# Called from tool_trigger_event | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Turn this into a docstring |
||
|
||
radio_group = tool.radio_group | ||
# radio_group None is not mutually exclusive | ||
|
@@ -3490,8 +3482,7 @@ def _handle_toggle(self, tool, sender, canvasevent, data): | |
self._toggled[None].add(tool.name) | ||
return | ||
|
||
# If it is the same tool that is toggled in the radio_group | ||
# untoggle it | ||
# If the tool already has a toggled state, untoggle it | ||
if self._toggled[radio_group] == tool.name: | ||
toggled = None | ||
# If no tool was toggled in the radio_group | ||
|
@@ -3536,7 +3527,7 @@ def tool_trigger_event(self, name, sender=None, canvasevent=None, | |
name : string | ||
Name of the tool | ||
sender: object | ||
Object that wish to trigger the tool | ||
Object that wishes to trigger the tool | ||
canvasevent : Event | ||
Original Canvas event or None | ||
data : Object | ||
|
@@ -3567,7 +3558,7 @@ def _trigger_tool(self, name, sender=None, canvasevent=None, data=None): | |
self._handle_toggle(tool, sender, canvasevent, data) | ||
|
||
# Important!!! | ||
# This is where the Tool object is triggered | ||
# This is where the Tool object gets triggered | ||
tool.trigger(sender, canvasevent, data) | ||
|
||
def _key_press(self, event): | ||
|
@@ -3616,26 +3607,26 @@ def __init__(self, manager): | |
self._remove_tool_cbk) | ||
|
||
def _message_cbk(self, event): | ||
"""Captures the 'tool_message_event' to set message on the toolbar""" | ||
"""Captures the 'tool_message_event' to set the message on the toolbar""" | ||
self.set_message(event.message) | ||
|
||
def _tool_triggered_cbk(self, event): | ||
"""Captures the 'tool-trigger-toolname | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should be "tool_trigger_[name]" to be consistent with documentation elsewhere. |
||
|
||
This is only used for toggled tools | ||
This only gets used for toggled tools | ||
""" | ||
if event.sender is self: | ||
return | ||
|
||
self.toggle_toolitem(event.tool.name) | ||
|
||
def _add_tool_cbk(self, event): | ||
"""Captures 'tool_added_event' and add the tool to the toolbar""" | ||
"""Captures 'tool_added_event' and adds the tool to the toolbar""" | ||
image = self._get_image_filename(event.tool.image) | ||
toggle = getattr(event.tool, 'toggled', None) is not None | ||
self.add_toolitem(event.tool.name, | ||
event.group, | ||
event.position, | ||
event.data['group'], | ||
event.data['position'], | ||
image, | ||
event.tool.description, | ||
toggle) | ||
|
@@ -3644,11 +3635,11 @@ def _add_tool_cbk(self, event): | |
self._tool_triggered_cbk) | ||
|
||
def _remove_tool_cbk(self, event): | ||
"""Captures the 'tool_removed_event' signal and remove the tool""" | ||
"""Captures the 'tool_removed_event' signal and removes the tool""" | ||
self.remove_toolitem(event.tool.name) | ||
|
||
def _get_image_filename(self, image): | ||
""""Base on the image name find the corresponding image""" | ||
"""Find the image based on its name""" | ||
# TODO: better search for images, they are not always in the | ||
# datapath | ||
basedir = os.path.join(rcParams['datapath'], 'images') | ||
|
@@ -3664,28 +3655,28 @@ def trigger_tool(self, name): | |
Parameters | ||
---------- | ||
name : String | ||
Name(id) of the tool that was triggered in the toolbar | ||
Name(id) of the tool triggered from within the toolbar | ||
|
||
""" | ||
self.navigation.tool_trigger_event(name, sender=self) | ||
|
||
def add_toolitem(self, name, group, position, image, description, toggle): | ||
"""Add a toolitem to the toolbar | ||
|
||
This method has to be implemented per backend | ||
This method must get implemented per backend | ||
|
||
The callback associated with the button click event, | ||
must be **EXACTLY** `self.trigger_tool(name)` | ||
|
||
Parameters | ||
---------- | ||
name : string | ||
Name of the tool to add, this is used as ID and as default label | ||
of the buttons | ||
Name of the tool to add, this gets used as the tool's ID and as the | ||
default label of the buttons | ||
group : String | ||
Name of the group that the tool belongs to | ||
Name of the group that this tool belongs to | ||
position : Int | ||
Position of the tool whthin its group if -1 at the End | ||
Position of the tool within its group, if -1 it goes at the End | ||
image_file : String | ||
Filename of the image for the button or `None` | ||
description : String | ||
|
@@ -3723,9 +3714,9 @@ def toggle_toolitem(self, name): | |
def remove_toolitem(self, name): | ||
"""Remove a toolitem from the `Toolbar` | ||
|
||
This method has to be implemented per backend | ||
This method must get implemented per backend | ||
|
||
Called when `tool_removed_event` is emited by `NavigationBase` | ||
Called when `NavigationBase` emits a `tool_removed_event` | ||
|
||
Parameters | ||
---------- | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -143,15 +143,15 @@ def trigger(self, sender, event, data=None): | |
def enable(self, event=None): | ||
"""Enable the toggle tool | ||
|
||
This method is called dby `trigger` when the `toggled` is False | ||
`trigger` calls this method when `toggled` is False | ||
""" | ||
|
||
pass | ||
|
||
def disable(self, event=None): | ||
"""Disable the toggle tool | ||
|
||
This method is called by `trigger` when the `toggled` is True. | ||
`trigger` call this methond when `toggled` is True. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "methond" --> "method" |
||
|
||
This can happen in different circumstances | ||
|
||
|
@@ -174,7 +174,7 @@ class SetCursorBase(ToolBase): | |
"""Change to the current cursor while inaxes | ||
|
||
This tool, keeps track of all `ToolToggleBase` derived tools, and calls | ||
set_cursor when one of these tools is triggered | ||
set_cursor when a tool gets triggered | ||
""" | ||
def __init__(self, *args, **kwargs): | ||
ToolBase.__init__(self, *args, **kwargs) | ||
|
@@ -251,7 +251,6 @@ def send_message(self, event): | |
message = ' ' | ||
|
||
if event.inaxes and event.inaxes.get_navigate(): | ||
|
||
try: | ||
s = event.inaxes.format_coord(event.xdata, event.ydata) | ||
except (ValueError, OverflowError): | ||
|
@@ -275,14 +274,14 @@ def trigger(self, sender, event, data): | |
def draw_rubberband(self, *data): | ||
"""Draw rubberband | ||
|
||
This method has to be implemented per backend | ||
This method must get implemented per backend | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If it must, then it should raise NotImplementedError. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps we should take advantage of ABC's? I haven't worked with them personally, but my understanding is that it can let you know if a dev failed to implement all the required methods. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wanted to limit new dependencies that weren't used somewhere else |
||
""" | ||
pass | ||
|
||
def remove_rubberband(self): | ||
"""Remove rubberband | ||
|
||
This method has to be implemented per backend | ||
This method must get implemented per backend | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. again, with the must. |
||
""" | ||
pass | ||
|
||
|
@@ -383,7 +382,7 @@ def disable(self, event): | |
|
||
|
||
class ToolYScale(AxisScaleBase): | ||
"""Tool to toggle between linear and logarithmic the Y axis""" | ||
"""Tool to toggle between linear and logarithmic scales on the Y axis""" | ||
|
||
description = 'Toogle Scale Y axis' | ||
keymap = rcParams['keymap.yscale'] | ||
|
@@ -393,7 +392,7 @@ def set_scale(self, ax, scale): | |
|
||
|
||
class ToolXScale(AxisScaleBase): | ||
"""Tool to toggle between linear and logarithmic the X axis""" | ||
"""Tool to toggle between linear and logarithmic scales on the X axis""" | ||
|
||
description = 'Toogle Scale X axis' | ||
keymap = rcParams['keymap.xscale'] | ||
|
@@ -405,8 +404,8 @@ def set_scale(self, ax, scale): | |
class ToolViewsPositions(ToolBase): | ||
"""Auxiliary Tool to handle changes in views and positions | ||
|
||
Runs in the background and is used by all the tools that | ||
need to access the record of views and positions of the figure | ||
Runs in the background and should get used by all the tools that | ||
need to access the figure's history of views and positions, e.g. | ||
|
||
* `ToolZoom` | ||
* `ToolPan` | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Multi-line docstrings should have the triple-quote by themselves