GRASS Programmer's Manual  6.4.3(2013)-r
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Pages
overlays.py
Go to the documentation of this file.
1 """!
2 @package mapdisp.overlays
3 
4 @brief Map display overlays - barscale and legend
5 
6 Classes:
7  - overlays::OverlayController
8  - overlays::BarscaleController
9  - overlays::LegendController
10 
11 (C) 2006-2013 by the GRASS Development Team
12 
13 This program is free software under the GNU General Public License
14 (>=v2). Read the file COPYING that comes with GRASS for details.
15 
16 @author Anna Kratochvilova <kratochanna gmail.com>
17 """
18 
19 class OverlayController(object):
20  """!Base class for decorations (barscale, legend) controller."""
21  def __init__(self, renderer):
22  self._renderer = renderer
23  self._overlay = None
24  self._coords = [0, 0]
25  self._pdcType = 'image'
26  self._propwin = None
27  self._defaultAt = ''
28 
29  def SetCmd(self, cmd):
30  hasAt = False
31  for i in cmd:
32  if i.startswith("at="):
33  hasAt = True
34  break
35  if not hasAt:
36  cmd.append(self._defaultAt)
37  self._cmd = cmd
38 
39  def GetCmd(self):
40  return self._cmd
41 
42  cmd = property(fset = SetCmd, fget = GetCmd)
43 
44  def SetCoords(self, coords):
45  self._coords = list(coords)
46 
47  def GetCoords(self):
48  return self._coords
49 
50  coords = property(fset = SetCoords, fget = GetCoords)
51 
52  def GetPdcType(self):
53  return self._pdcType
54 
55  pdcType = property(fget = GetPdcType)
56 
57  def GetName(self):
58  return self._name
59 
60  name = property(fget = GetName)
61 
62  def GetId(self):
63  return self._id
64 
65  id = property(fget = GetId)
66 
67  def GetPropwin(self):
68  return self._propwin
69 
70  def SetPropwin(self, win):
71  self._propwin = win
72 
73  propwin = property(fget = GetPropwin, fset = SetPropwin)
74 
75  def GetLayer(self):
76  return self._overlay
77 
78  layer = property(fget = GetLayer)
79 
80  def IsShown(self):
81  if self._overlay and self._overlay.IsActive():
82  return True
83  return False
84 
85  def Show(self, show = True):
86  """!Activate or deactivate overlay."""
87  if show:
88  if not self._overlay:
89  self._add()
90  self._overlay.SetActive(True)
91  self._update()
92  else:
93  self.Hide()
94 
95 
96  def Hide(self):
97  if self._overlay:
98  self._overlay.SetActive(False)
99 
100  def _add(self):
101  self._overlay = self._renderer.AddOverlay(id = self._id, type = self._name,
102  command = self.cmd, l_active = False,
103  l_render = False, l_hidden = True)
104  # check if successfull
105 
106  def _update(self):
107  self._renderer.ChangeOverlay(id = self._id, command = self._cmd,
108  render = False)
109 
110 
112  def __init__(self, renderer):
113  OverlayController.__init__(self, renderer)
114  self._id = 0
115  self._name = 'barscale'
116  self._defaultAt = 'at=0,95'
117  self._cmd = ['d.barscale', self._defaultAt]
118 
119 
121  def __init__(self, renderer):
122  OverlayController.__init__(self, renderer)
123  self._id = 1
124  self._name = 'legend'
125  # TODO: synchronize with d.legend?
126  self._defaultAt = 'at=5,50,2,5'
127  self._cmd = ['d.legend', self._defaultAt]
128 
129  def ResizeLegend(self, begin, end, screenSize):
130  """!Resize legend according to given bbox coordinates."""
131  w = abs(begin[0] - end[0])
132  h = abs(begin[1] - end[1])
133  if begin[0] < end[0]:
134  x = begin[0]
135  else:
136  x = end[0]
137  if begin[1] < end[1]:
138  y = begin[1]
139  else:
140  y = end[1]
141 
142  at = [(screenSize[1] - (y + h)) / float(screenSize[1]) * 100,
143  (screenSize[1] - y) / float(screenSize[1]) * 100,
144  x / float(screenSize[0]) * 100,
145  (x + w) / float(screenSize[0]) * 100]
146  atStr = "at=%d,%d,%d,%d" % (at[0], at[1], at[2], at[3])
147 
148  for i, subcmd in enumerate(self._cmd):
149  if subcmd.startswith('at='):
150  self._cmd[i] = atStr
151  break
152 
153  self._coords = [0, 0]
154  self.Show()