source: qesdi/geoplot/trunk/lib/geoplot/metadata_box.py @ 5403

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/qesdi/geoplot/trunk/lib/geoplot/metadata_box.py@5403
Revision 5403, 4.4 KB checked in by pnorton, 12 years ago (diff)

Moved QESDI tree from DCIP repository
 http://proj.badc.rl.ac.uk/svn/dcip/qesdi@3900.

Line 
1import logging
2
3from matplotlib.patches import Rectangle
4
5import geoplot.config as geoplot_config
6config = geoplot_config.getConfig()
7
8log = logging.getLogger(__name__)
9log.setLevel(logging.DEBUG)
10
11FONTS_SECTION = 'Fonts'
12PLOT_SECTION = 'PlotProperties'
13FRAME_HEADING_HEIGHT = 0.2
14
15class MetadataBox(object):
16
17    def __init__(self, dataList):
18        self._dataList = None
19
20        self.dataList = dataList
21
22        self.dataFont  = config[FONTS_SECTION]['Metadata']
23        self.titleFont = config[FONTS_SECTION]['MetadataTitle']
24       
25        self.title       = config[PLOT_SECTION]['metadataBoxTitle']
26        self.frameColour = config[PLOT_SECTION]['metadataFrameColour']
27
28    def __get_dataList(self): return self._dataList
29    def __set_dataList(self, value):
30        if value == None:
31            self._dataList = None
32        else:
33            #check type
34            if type(value) != list:
35                raise ValueError("Metadata list must be a list of tuples rather than a "  \
36                                 + str(type(value)))
37
38            for item in value:
39                if type(item) != tuple:
40                    raise ValueError("Metadata list contained an item that isn't a tuple :" \
41                                     + str(type(item)))
42                if len(item) != 2:
43                    raise ValueError("Metadata list contained tuple of length " + str(len(item)) + \
44                                     " , length 2 expected (label, value)")
45
46            self._dataList = value
47
48    def draw(self, axes, fontSize, height):
49        """
50        Draw the metadata box with given text.
51        """
52
53        self._drawFrame(axes)
54        self._drawMetadata(axes, fontSize, height)
55
56    def _drawFrame(self, axes):
57
58        # Draw a rectangle around the box
59        axes.add_patch(Rectangle((0, 0), 1, 1,
60                                edgecolor=self.frameColour,
61                                fill=False,
62                                linewidth=2
63                                ))
64        # Draw heading box
65        axes.add_patch(Rectangle((0, 1.0 - FRAME_HEADING_HEIGHT), 1, FRAME_HEADING_HEIGHT,
66                                facecolor=self.frameColour,
67                                fill = True,
68                                linewidth=0))
69
70
71    def _drawMetadata(self, axes, fontSize, height):
72        # Draw the heading
73
74        titleDictionary = self.titleFont.getDict(fontSize)
75
76        axes.text(0.02, 0.95, self.title,
77                titleDictionary,
78                horizontalalignment='left',
79                verticalalignment='top',
80                #bbox=dict(facecolor='red', alpha=0.5),
81                weight='bold')
82
83        # 0.2 0.13
84        lines = self.dataList
85
86        # Compile the lines
87        lines = ["%s: %s" % i for i in lines]
88
89        metadataDict = self.dataFont.getDict(fontSize)
90
91        block_border = 0.025
92        block_height = 1 - block_border*2  - 0.2
93        block_width = (1- block_border*3)/2.0
94        offset = 0.5 + block_border/2.0
95        aproxFontSize = (metadataDict["size"]*1.25)/(height * 0.13)
96        shift = aproxFontSize*5.0
97
98        #ax.add_patch(Rectangle((block_border, block_border), block_width, block_height,
99                        #edgecolor='g',
100                        #fill=False,
101                        #linewidth=1))
102
103        #ax.add_patch(Rectangle((offset, block_border), block_width, block_height,
104                        #edgecolor='g',
105                        #fill=False,
106                        #linewidth=1))
107
108        # Draw the metadata contents
109        for x, someLines in ((block_border, lines[:5]),(offset, lines[5:])):
110            axes.text(x, block_height, '\n'.join(someLines),
111                    metadataDict,
112                    verticalalignment='top',
113                    #bbox=dict(facecolor='red', alpha=0.5),
114                    )
115
116        # (dist from left, dist above base), width, height
117        #ax.add_patch(Rectangle((block_border, block_height - shift), block_width, shift,
118                        #edgecolor='b',
119                        #fill=False,
120                        #linewidth=1))
121
122        #ax.add_patch(Rectangle((offset, 0.8 - 2*block_border - shift), block_width, shift,
123                        #edgecolor='b',
124                        #fill=False,
125                        #linewidth=1))
126
127
128    dataList = property(__get_dataList, __set_dataList, None,
129                        "The list of items ('label, 'value') to appear in the metadata box.")
Note: See TracBrowser for help on using the repository browser.