overlays.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. def SetCmd(self, cmd):
  23. hasAt = False
  24. for i in cmd:
  25. if i.startswith("at="):
  26. hasAt = True
  27. break
  28. if not hasAt:
  29. cmd.append(self._defaultAt)
  30. self._cmd = cmd
  31. def GetCmd(self):
  32. return self._cmd
  33. cmd = property(fset = SetCmd, fget = GetCmd)
  34. def SetCoords(self, coords):
  35. self._coords = list(coords)
  36. def GetCoords(self):
  37. return self._coords
  38. coords = property(fset = SetCoords, fget = GetCoords)
  39. def GetPdcType(self):
  40. return self._pdcType
  41. pdcType = property(fget = GetPdcType)
  42. def GetName(self):
  43. return self._name
  44. name = property(fget = GetName)
  45. def GetId(self):
  46. return self._id
  47. id = property(fget = GetId)
  48. def GetPropwin(self):
  49. return self._propwin
  50. def SetPropwin(self, win):
  51. self._propwin = win
  52. propwin = property(fget = GetPropwin, fset = SetPropwin)
  53. def GetLayer(self):
  54. return self._overlay
  55. layer = property(fget = GetLayer)
  56. def IsShown(self):
  57. if self._overlay and self._overlay.IsActive():
  58. return True
  59. return False
  60. def Show(self, show = True):
  61. """!Activate or deactivate overlay."""
  62. if show:
  63. if not self._overlay:
  64. self._add()
  65. self._overlay.SetActive(True)
  66. self._update()
  67. else:
  68. self.Hide()
  69. def Hide(self):
  70. if self._overlay:
  71. self._overlay.SetActive(False)
  72. def _add(self):
  73. self._overlay = self._renderer.AddOverlay(id = self._id, ltype = self._name,
  74. command = self.cmd, active = False,
  75. render = False, hidden = True)
  76. # check if successfull
  77. def _update(self):
  78. self._renderer.ChangeOverlay(id = self._id, command = self._cmd,
  79. render = False)
  80. class BarscaleController(OverlayController):
  81. def __init__(self, renderer):
  82. OverlayController.__init__(self, renderer)
  83. self._id = 0
  84. self._name = 'barscale'
  85. self._defaultAt = 'at=0,95'
  86. self._cmd = ['d.barscale', self._defaultAt]
  87. class LegendController(OverlayController):
  88. def __init__(self, renderer):
  89. OverlayController.__init__(self, renderer)
  90. self._id = 1
  91. self._name = 'legend'
  92. # TODO: synchronize with d.legend?
  93. self._defaultAt = 'at=5,50,2,5'
  94. self._cmd = ['d.legend', self._defaultAt]
  95. def ResizeLegend(self, begin, end, screenSize):
  96. """!Resize legend according to given bbox coordinates."""
  97. w = abs(begin[0] - end[0])
  98. h = abs(begin[1] - end[1])
  99. if begin[0] < end[0]:
  100. x = begin[0]
  101. else:
  102. x = end[0]
  103. if begin[1] < end[1]:
  104. y = begin[1]
  105. else:
  106. y = end[1]
  107. at = [(screenSize[1] - (y + h)) / float(screenSize[1]) * 100,
  108. (screenSize[1] - y) / float(screenSize[1]) * 100,
  109. x / float(screenSize[0]) * 100,
  110. (x + w) / float(screenSize[0]) * 100]
  111. atStr = "at=%d,%d,%d,%d" % (at[0], at[1], at[2], at[3])
  112. for i, subcmd in enumerate(self._cmd):
  113. if subcmd.startswith('at='):
  114. self._cmd[i] = atStr
  115. break
  116. self._coords = [0, 0]
  117. self.Show()