123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- """!
- @package mapdisp.overlays
- @brief Map display overlays - barscale and legend
- Classes:
- - overlays::OverlayController
- - overlays::BarscaleController
- - overlays::LegendController
- (C) 2006-2013 by the GRASS Development Team
- This program is free software under the GNU General Public License
- (>=v2). Read the file COPYING that comes with GRASS for details.
- @author Anna Kratochvilova <kratochanna gmail.com>
- """
- class OverlayController(object):
- """!Base class for decorations (barscale, legend) controller."""
- def __init__(self, renderer):
- self._renderer = renderer
- self._overlay = None
- self._coords = [0, 0]
- self._pdcType = 'image'
- self._propwin = None
- self._defaultAt = ''
- self._cmd = None # to be set by user
- self._name = None # to be defined by subclass
- self._id = None # to be defined by subclass
- def SetCmd(self, cmd):
- hasAt = False
- for i in cmd:
- if i.startswith("at="):
- hasAt = True
- break
- if not hasAt:
- cmd.append(self._defaultAt)
- self._cmd = cmd
- def GetCmd(self):
- return self._cmd
- cmd = property(fset = SetCmd, fget = GetCmd)
- def SetCoords(self, coords):
- self._coords = list(coords)
- def GetCoords(self):
- return self._coords
- coords = property(fset = SetCoords, fget = GetCoords)
- def GetPdcType(self):
- return self._pdcType
- pdcType = property(fget = GetPdcType)
- def GetName(self):
- return self._name
- name = property(fget = GetName)
- def GetId(self):
- return self._id
- id = property(fget = GetId)
- def GetPropwin(self):
- return self._propwin
- def SetPropwin(self, win):
- self._propwin = win
- propwin = property(fget = GetPropwin, fset = SetPropwin)
- def GetLayer(self):
- return self._overlay
- layer = property(fget = GetLayer)
- def IsShown(self):
- if self._overlay and self._overlay.IsActive():
- return True
- return False
- def Show(self, show = True):
- """!Activate or deactivate overlay."""
- if show:
- if not self._overlay:
- self._add()
- self._overlay.SetActive(True)
- self._update()
- else:
- self.Hide()
- def Hide(self):
- if self._overlay:
- self._overlay.SetActive(False)
- def _add(self):
- self._overlay = self._renderer.AddOverlay(id = self._id, ltype = self._name,
- command = self.cmd, active = False,
- render = False, hidden = True)
- # check if successful
- def _update(self):
- self._renderer.ChangeOverlay(id = self._id, command = self._cmd,
- render = False)
- class BarscaleController(OverlayController):
- def __init__(self, renderer):
- OverlayController.__init__(self, renderer)
- self._id = 0
- self._name = 'barscale'
- self._defaultAt = 'at=0,95'
- self._cmd = ['d.barscale', self._defaultAt]
- class LegendController(OverlayController):
- def __init__(self, renderer):
- OverlayController.__init__(self, renderer)
- self._id = 1
- self._name = 'legend'
- # TODO: synchronize with d.legend?
- self._defaultAt = 'at=5,50,2,5'
- self._cmd = ['d.legend', self._defaultAt]
- def ResizeLegend(self, begin, end, screenSize):
- """!Resize legend according to given bbox coordinates."""
- w = abs(begin[0] - end[0])
- h = abs(begin[1] - end[1])
- if begin[0] < end[0]:
- x = begin[0]
- else:
- x = end[0]
- if begin[1] < end[1]:
- y = begin[1]
- else:
- y = end[1]
-
- at = [(screenSize[1] - (y + h)) / float(screenSize[1]) * 100,
- (screenSize[1] - y) / float(screenSize[1]) * 100,
- x / float(screenSize[0]) * 100,
- (x + w) / float(screenSize[0]) * 100]
- atStr = "at=%d,%d,%d,%d" % (at[0], at[1], at[2], at[3])
- for i, subcmd in enumerate(self._cmd):
- if subcmd.startswith('at='):
- self._cmd[i] = atStr
- break
- self._coords = [0, 0]
- self.Show()
|