overlays.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. """!
  2. @package mapdisp.overlays
  3. @brief Map display overlays - barscale and legend
  4. Classes:
  5. - overlays::OverlayController
  6. - overlays::BarscaleController
  7. - overlays::LegendController
  8. (C) 2006-2013 by the GRASS Development Team
  9. This program is free software under the GNU General Public License
  10. (>=v2). Read the file COPYING that comes with GRASS for details.
  11. @author Anna Kratochvilova <kratochanna gmail.com>
  12. """
  13. class OverlayController(object):
  14. """!Base class for decorations (barscale, legend) controller."""
  15. def __init__(self, renderer):
  16. self._renderer = renderer
  17. self._overlay = None
  18. self._coords = [0, 0]
  19. self._pdcType = 'image'
  20. self._propwin = None
  21. self._defaultAt = ''
  22. self._cmd = None # to be set by user
  23. self._name = None # to be defined by subclass
  24. self._id = None # to be defined by subclass
  25. def SetCmd(self, cmd):
  26. hasAt = False
  27. for i in cmd:
  28. if i.startswith("at="):
  29. hasAt = True
  30. break
  31. if not hasAt:
  32. cmd.append(self._defaultAt)
  33. self._cmd = cmd
  34. def GetCmd(self):
  35. return self._cmd
  36. cmd = property(fset = SetCmd, fget = GetCmd)
  37. def SetCoords(self, coords):
  38. self._coords = list(coords)
  39. def GetCoords(self):
  40. return self._coords
  41. coords = property(fset = SetCoords, fget = GetCoords)
  42. def GetPdcType(self):
  43. return self._pdcType
  44. pdcType = property(fget = GetPdcType)
  45. def GetName(self):
  46. return self._name
  47. name = property(fget = GetName)
  48. def GetId(self):
  49. return self._id
  50. id = property(fget = GetId)
  51. def GetPropwin(self):
  52. return self._propwin
  53. def SetPropwin(self, win):
  54. self._propwin = win
  55. propwin = property(fget = GetPropwin, fset = SetPropwin)
  56. def GetLayer(self):
  57. return self._overlay
  58. layer = property(fget = GetLayer)
  59. def IsShown(self):
  60. if self._overlay and self._overlay.IsActive():
  61. return True
  62. return False
  63. def Show(self, show = True):
  64. """!Activate or deactivate overlay."""
  65. if show:
  66. if not self._overlay:
  67. self._add()
  68. self._overlay.SetActive(True)
  69. self._update()
  70. else:
  71. self.Hide()
  72. def Hide(self):
  73. if self._overlay:
  74. self._overlay.SetActive(False)
  75. def _add(self):
  76. self._overlay = self._renderer.AddOverlay(id = self._id, ltype = self._name,
  77. command = self.cmd, active = False,
  78. render = False, hidden = True)
  79. # check if successful
  80. def _update(self):
  81. self._renderer.ChangeOverlay(id = self._id, command = self._cmd,
  82. render = False)
  83. class BarscaleController(OverlayController):
  84. def __init__(self, renderer):
  85. OverlayController.__init__(self, renderer)
  86. self._id = 0
  87. self._name = 'barscale'
  88. self._defaultAt = 'at=0,95'
  89. self._cmd = ['d.barscale', self._defaultAt]
  90. class LegendController(OverlayController):
  91. def __init__(self, renderer):
  92. OverlayController.__init__(self, renderer)
  93. self._id = 1
  94. self._name = 'legend'
  95. # TODO: synchronize with d.legend?
  96. self._defaultAt = 'at=5,50,2,5'
  97. self._cmd = ['d.legend', self._defaultAt]
  98. def ResizeLegend(self, begin, end, screenSize):
  99. """!Resize legend according to given bbox coordinates."""
  100. w = abs(begin[0] - end[0])
  101. h = abs(begin[1] - end[1])
  102. if begin[0] < end[0]:
  103. x = begin[0]
  104. else:
  105. x = end[0]
  106. if begin[1] < end[1]:
  107. y = begin[1]
  108. else:
  109. y = end[1]
  110. at = [(screenSize[1] - (y + h)) / float(screenSize[1]) * 100,
  111. (screenSize[1] - y) / float(screenSize[1]) * 100,
  112. x / float(screenSize[0]) * 100,
  113. (x + w) / float(screenSize[0]) * 100]
  114. atStr = "at=%d,%d,%d,%d" % (at[0], at[1], at[2], at[3])
  115. for i, subcmd in enumerate(self._cmd):
  116. if subcmd.startswith('at='):
  117. self._cmd[i] = atStr
  118. break
  119. self._coords = [0, 0]
  120. self.Show()