| 24 | |
| 25 | |
| 26 | class MenuItem(artist.Artist): |
| 27 | padx = 0.05 # inches |
| 28 | pady = 0.05 |
| 29 | |
| 30 | def __init__(self, fig, labelstr, props=None, hoverprops=None, |
| 31 | on_select=None): |
| 32 | super().__init__() |
| 33 | |
| 34 | self.set_figure(fig) |
| 35 | self.labelstr = labelstr |
| 36 | |
| 37 | self.props = props if props is not None else ItemProperties() |
| 38 | self.hoverprops = ( |
| 39 | hoverprops if hoverprops is not None else ItemProperties()) |
| 40 | if self.props.fontsize != self.hoverprops.fontsize: |
| 41 | raise NotImplementedError( |
| 42 | 'support for different font sizes not implemented') |
| 43 | |
| 44 | self.on_select = on_select |
| 45 | |
| 46 | # specify coordinates in inches. |
| 47 | self.label = fig.text(0, 0, labelstr, transform=fig.dpi_scale_trans, |
| 48 | size=props.fontsize) |
| 49 | self.text_bbox = self.label.get_window_extent( |
| 50 | fig.canvas.get_renderer()) |
| 51 | self.text_bbox = fig.dpi_scale_trans.inverted().transform_bbox(self.text_bbox) |
| 52 | |
| 53 | self.rect = patches.Rectangle( |
| 54 | (0, 0), 1, 1, transform=fig.dpi_scale_trans |
| 55 | ) # Will be updated later. |
| 56 | |
| 57 | self.set_hover_props(False) |
| 58 | |
| 59 | fig.canvas.mpl_connect('button_release_event', self.check_select) |
| 60 | |
| 61 | def check_select(self, event): |
| 62 | over, _ = self.rect.contains(event) |
| 63 | if not over: |
| 64 | return |
| 65 | if self.on_select is not None: |
| 66 | self.on_select(self) |
| 67 | |
| 68 | def set_extent(self, x, y, w, h, depth): |
| 69 | self.rect.set(x=x, y=y, width=w, height=h) |
| 70 | self.label.set(position=(x + self.padx, y + depth + self.pady / 2)) |
| 71 | self.hover = False |
| 72 | |
| 73 | def draw(self, renderer): |
| 74 | self.rect.draw(renderer) |
| 75 | self.label.draw(renderer) |
| 76 | |
| 77 | def set_hover_props(self, b): |
| 78 | props = self.hoverprops if b else self.props |
| 79 | self.label.set(color=props.labelcolor) |
| 80 | self.rect.set(facecolor=props.bgcolor, alpha=props.alpha) |
| 81 | |
| 82 | def set_hover(self, event): |
| 83 | """ |
no outgoing calls
no test coverage detected
searching dependent graphs…