File: menu.py

package info (click to toggle)
matplotlib 0.98.1-1%2Blenny4
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 18,624 kB
  • ctags: 22,599
  • sloc: python: 76,915; cpp: 63,459; ansic: 5,353; makefile: 111; sh: 12
file content (140 lines) | stat: -rw-r--r-- 3,655 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import numpy as np
import matplotlib
import matplotlib.patches as patches
import matplotlib.mathtext as mathtext
import matplotlib.pyplot as plt
import matplotlib.artist as artist
import matplotlib.image as image

matplotlib.rc('image', origin='upper')

class MenuItem(artist.Artist):
    parser = mathtext.MathTextParser("Bitmap")
    padx = 5
    pady =5
    def __init__(self, fig, labelstr):
        artist.Artist.__init__(self)
        self.set_figure(fig)


        x, self.depth = self.parser.to_rgba(
            labelstr, color='black', fontsize=14, dpi=100)
        xHover, depth = self.parser.to_rgba(
            labelstr, color='white', fontsize=14, dpi=100)


        self.labelwidth = x.shape[1]
        self.labelheight = x.shape[0]
        print 'h', self.labelheight
        self.label = image.FigureImage(fig)
        self.label.set_array(x.astype(float)/255.)

        self.labelHover = image.FigureImage(fig)
        self.labelHover.set_array(xHover.astype(float)/255.)



        # we'll update these later
        self.rect = patches.Rectangle((0,0), 1,1, facecolor='yellow', alpha=0.2)
        self.rectHover = patches.Rectangle((0,0), 1,1, facecolor='blue', alpha=0.2)



    def set_extent(self, x, y, w, h):
        print x, y, w, h
        self.rect.set_x(x)
        self.rect.set_y(y)
        self.rect.set_width(w)
        self.rect.set_height(h)

        self.rectHover.set_x(x)
        self.rectHover.set_y(y)
        self.rectHover.set_width(w)
        self.rectHover.set_height(h)

        self.label.ox = x+self.padx
        self.label.oy = y-self.depth+self.pady/2.

        self.rect._update_patch_transform()
        self.rectHover._update_patch_transform()
        self.labelHover.ox = x+self.padx
        self.labelHover.oy = y-self.depth+self.pady/2.
        self.hover = False

        self.activeRect = self.rect
        self.activeLabel = self.label

    def draw(self, renderer):
        self.activeRect.draw(renderer)
        self.activeLabel.draw(renderer)

    def set_hover(self, event):
        'check the hover status of event and return true if status is changed'
        b,junk = self.rect.contains(event)
        if b:
            self.activeRect = self.rectHover
            self.activeLabel = self.labelHover
        else:
            self.activeRect = self.rect
            self.activeLabel = self.label

        h = self.hover
        self.hover = b
        return b!=h

class Menu:

    def __init__(self, fig, labels):
        self.figure = fig
        fig.suppressComposite = True
        menuitems = []
        self.numitems = len(labels)
        for label in labels:
            menuitems.append(MenuItem(fig, label))

        self.menuitems = menuitems


        maxw = max([item.labelwidth for item in menuitems])
        maxh = max([item.labelheight for item in menuitems])


        totalh = self.numitems*maxh + (self.numitems+1)*2*MenuItem.pady

        x0 = 100
        y0 = 400

        width = maxw + 2*MenuItem.padx
        height = maxh+MenuItem.pady
        for item in menuitems:
            left = x0
            bottom = y0-maxh-MenuItem.pady


            item.set_extent(left, bottom, width, height)

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


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

    def on_move(self, event):
        draw = False
        for item in self.menuitems:
            b = item.set_hover(event)
            draw = b

        if draw:
            print 'draw'
            self.figure.canvas.draw()


fig = plt.figure()
menu = Menu(fig, ('open', 'close', 'save', 'save as', 'quit'))

plt.show()