Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ec5b30a

Browse files
authored
Merge pull request #18418 from anntzer/menu
Cleanup menu example
2 parents 2c265ed + b49529b commit ec5b30a

File tree

1 file changed

+28
-70
lines changed

1 file changed

+28
-70
lines changed

examples/widgets/menu.py

Lines changed: 28 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44
====
55
66
"""
7-
import numpy as np
8-
import matplotlib.colors as colors
7+
8+
import matplotlib.artist as artist
99
import matplotlib.patches as patches
10-
import matplotlib.mathtext as mathtext
1110
import matplotlib.pyplot as plt
12-
import matplotlib.artist as artist
13-
import matplotlib.image as image
11+
from matplotlib.transforms import IdentityTransform
1412

1513

1614
class ItemProperties:
@@ -21,12 +19,8 @@ def __init__(self, fontsize=14, labelcolor='black', bgcolor='yellow',
2119
self.bgcolor = bgcolor
2220
self.alpha = alpha
2321

24-
self.labelcolor_rgb = colors.to_rgba(labelcolor)[:3]
25-
self.bgcolor_rgb = colors.to_rgba(bgcolor)[:3]
26-
2722

2823
class MenuItem(artist.Artist):
29-
parser = mathtext.MathTextParser("Bitmap")
3024
padx = 5
3125
pady = 5
3226

@@ -37,102 +31,70 @@ def __init__(self, fig, labelstr, props=None, hoverprops=None,
3731
self.set_figure(fig)
3832
self.labelstr = labelstr
3933

40-
if props is None:
41-
props = ItemProperties()
42-
43-
if hoverprops is None:
44-
hoverprops = ItemProperties()
45-
46-
self.props = props
47-
self.hoverprops = hoverprops
48-
49-
self.on_select = on_select
50-
51-
x, self.depth = self.parser.to_mask(
52-
labelstr, fontsize=props.fontsize, dpi=fig.dpi)
53-
54-
if props.fontsize != hoverprops.fontsize:
34+
self.props = props if props is not None else ItemProperties()
35+
self.hoverprops = (
36+
hoverprops if hoverprops is not None else ItemProperties())
37+
if self.props.fontsize != self.hoverprops.fontsize:
5538
raise NotImplementedError(
5639
'support for different font sizes not implemented')
5740

58-
self.labelwidth = x.shape[1]
59-
self.labelheight = x.shape[0]
60-
61-
self.labelArray = np.zeros((x.shape[0], x.shape[1], 4))
62-
self.labelArray[:, :, -1] = x/255.
41+
self.on_select = on_select
6342

64-
self.label = image.FigureImage(fig, origin='upper')
65-
self.label.set_array(self.labelArray)
43+
# Setting the transform to IdentityTransform() lets us specify
44+
# coordinates directly in pixels.
45+
self.label = fig.text(0, 0, labelstr, transform=IdentityTransform(),
46+
size=props.fontsize)
47+
self.text_bbox = self.label.get_window_extent(
48+
fig.canvas.get_renderer())
6649

67-
# we'll update these later
68-
self.rect = patches.Rectangle((0, 0), 1, 1)
50+
self.rect = patches.Rectangle((0, 0), 1, 1) # Will be updated later.
6951

7052
self.set_hover_props(False)
7153

7254
fig.canvas.mpl_connect('button_release_event', self.check_select)
7355

7456
def check_select(self, event):
75-
over, junk = self.rect.contains(event)
57+
over, _ = self.rect.contains(event)
7658
if not over:
7759
return
78-
7960
if self.on_select is not None:
8061
self.on_select(self)
8162

82-
def set_extent(self, x, y, w, h):
83-
print(x, y, w, h)
84-
self.rect.set_x(x)
85-
self.rect.set_y(y)
86-
self.rect.set_width(w)
87-
self.rect.set_height(h)
88-
89-
self.label.ox = x + self.padx
90-
self.label.oy = y - self.depth + self.pady/2.
91-
63+
def set_extent(self, x, y, w, h, depth):
64+
self.rect.set(x=x, y=y, width=w, height=h)
65+
self.label.set(position=(x + self.padx, y + depth + self.pady/2))
9266
self.hover = False
9367

9468
def draw(self, renderer):
9569
self.rect.draw(renderer)
9670
self.label.draw(renderer)
9771

9872
def set_hover_props(self, b):
99-
if b:
100-
props = self.hoverprops
101-
else:
102-
props = self.props
103-
104-
r, g, b = props.labelcolor_rgb
105-
self.labelArray[:, :, 0] = r
106-
self.labelArray[:, :, 1] = g
107-
self.labelArray[:, :, 2] = b
108-
self.label.set_array(self.labelArray)
73+
props = self.hoverprops if b else self.props
74+
self.label.set(color=props.labelcolor)
10975
self.rect.set(facecolor=props.bgcolor, alpha=props.alpha)
11076

11177
def set_hover(self, event):
11278
"""
11379
Update the hover status of event and return whether it was changed.
11480
"""
115-
b, junk = self.rect.contains(event)
116-
81+
b, _ = self.rect.contains(event)
11782
changed = (b != self.hover)
118-
11983
if changed:
12084
self.set_hover_props(b)
121-
12285
self.hover = b
12386
return changed
12487

12588

12689
class Menu:
12790
def __init__(self, fig, menuitems):
12891
self.figure = fig
129-
fig.suppressComposite = True
13092

13193
self.menuitems = menuitems
132-
self.numitems = len(menuitems)
13394

134-
maxw = max(item.labelwidth for item in menuitems)
135-
maxh = max(item.labelheight for item in menuitems)
95+
maxw = max(item.text_bbox.width for item in menuitems)
96+
maxh = max(item.text_bbox.height for item in menuitems)
97+
depth = max(-item.text_bbox.y0 for item in menuitems)
13698

13799
x0 = 100
138100
y0 = 400
@@ -144,20 +106,16 @@ def __init__(self, fig, menuitems):
144106
left = x0
145107
bottom = y0 - maxh - MenuItem.pady
146108

147-
item.set_extent(left, bottom, width, height)
109+
item.set_extent(left, bottom, width, height, depth)
148110

149111
fig.artists.append(item)
150112
y0 -= maxh + MenuItem.pady
151113

152114
fig.canvas.mpl_connect('motion_notify_event', self.on_move)
153115

154116
def on_move(self, event):
155-
draw = False
156-
for item in self.menuitems:
157-
draw = item.set_hover(event)
158-
if draw:
159-
self.figure.canvas.draw()
160-
break
117+
if any(item.set_hover(event) for item in self.menuitems):
118+
self.figure.canvas.draw()
161119

162120

163121
fig = plt.figure()

0 commit comments

Comments
 (0)