toolbars.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. """!
  2. @package gui_core.toolbars
  3. @brief Base classes toolbar widgets
  4. Classes:
  5. - toolbars::BaseToolbar
  6. (C) 2007-2011 by the GRASS Development Team
  7. This program is free software under the GNU General Public License
  8. (>=v2). Read the file COPYING that comes with GRASS for details.
  9. @author Michael Barton
  10. @author Jachym Cepicky
  11. @author Martin Landa <landa.martin gmail.com>
  12. """
  13. import os
  14. import sys
  15. import platform
  16. import wx
  17. from core import globalvar
  18. from core.debug import Debug
  19. from icons.icon import MetaIcon
  20. BaseIcons = {
  21. 'display' : MetaIcon(img = 'show',
  22. label = _('Display map'),
  23. desc = _('Re-render modified map layers only')),
  24. 'render' : MetaIcon(img = 'layer-redraw',
  25. label = _('Render map'),
  26. desc = _('Force re-rendering all map layers')),
  27. 'erase' : MetaIcon(img = 'erase',
  28. label = _('Erase display'),
  29. desc = _('Erase display canvas with given background color')),
  30. 'pointer' : MetaIcon(img = 'pointer',
  31. label = _('Pointer')),
  32. 'zoomIn' : MetaIcon(img = 'zoom-in',
  33. label = _('Zoom in'),
  34. desc = _('Drag or click mouse to zoom')),
  35. 'zoomOut' : MetaIcon(img = 'zoom-out',
  36. label = _('Zoom out'),
  37. desc = _('Drag or click mouse to unzoom')),
  38. 'zoomBack' : MetaIcon(img = 'zoom-last',
  39. label = _('Return to previous zoom')),
  40. 'zoomMenu' : MetaIcon(img = 'zoom-more',
  41. label = _('Various zoom options'),
  42. desc = _('Zoom to computational, default, saved region, ...')),
  43. 'zoomExtent' : MetaIcon(img = 'zoom-extent',
  44. label = _('Zoom to selected map layer(s)')),
  45. 'pan' : MetaIcon(img = 'pan',
  46. label = _('Pan'),
  47. desc = _('Drag with mouse to pan')),
  48. 'saveFile' : MetaIcon(img = 'map-export',
  49. label = _('Save display to graphic file')),
  50. 'print' : MetaIcon(img = 'print',
  51. label = _('Print display')),
  52. 'font' : MetaIcon(img = 'font',
  53. label = _('Select font')),
  54. 'help' : MetaIcon(img = 'help',
  55. label = _('Show manual')),
  56. 'quit' : MetaIcon(img = 'quit',
  57. label = _('Quit')),
  58. 'addRast' : MetaIcon(img = 'layer-raster-add',
  59. label = _('Add raster map layer')),
  60. 'addVect' : MetaIcon(img = 'layer-vector-add',
  61. label = _('Add vector map layer')),
  62. 'overlay' : MetaIcon(img = 'overlay-add',
  63. label = _('Add map elements'),
  64. desc = _('Overlay elements like scale and legend onto map')),
  65. 'histogramD' : MetaIcon(img = 'layer-raster-histogram',
  66. label = _('Create histogram with d.histogram')),
  67. 'settings' : MetaIcon(img = 'settings',
  68. label = _("Settings")),
  69. }
  70. class BaseToolbar(wx.ToolBar):
  71. """!Abstract toolbar class"""
  72. def __init__(self, parent):
  73. self.parent = parent
  74. wx.ToolBar.__init__(self, parent = self.parent, id = wx.ID_ANY)
  75. self.action = dict()
  76. self.Bind(wx.EVT_TOOL, self.OnTool)
  77. self.SetToolBitmapSize(globalvar.toolbarSize)
  78. def InitToolbar(self, toolData):
  79. """!Initialize toolbar, add tools to the toolbar
  80. """
  81. for tool in toolData:
  82. self.CreateTool(*tool)
  83. self._data = toolData
  84. def _toolbarData(self):
  85. """!Toolbar data (virtual)"""
  86. return None
  87. def CreateTool(self, label, bitmap, kind,
  88. shortHelp, longHelp, handler, pos = -1):
  89. """!Add tool to the toolbar
  90. @param pos if -1 add tool, if > 0 insert at given pos
  91. @return id of tool
  92. """
  93. bmpDisabled = wx.NullBitmap
  94. tool = -1
  95. if label:
  96. tool = vars(self)[label] = wx.NewId()
  97. Debug.msg(3, "CreateTool(): tool=%d, label=%s bitmap=%s" % \
  98. (tool, label, bitmap))
  99. if pos < 0:
  100. toolWin = self.AddLabelTool(tool, label, bitmap,
  101. bmpDisabled, kind,
  102. shortHelp, longHelp)
  103. else:
  104. toolWin = self.InsertLabelTool(pos, tool, label, bitmap,
  105. bmpDisabled, kind,
  106. shortHelp, longHelp)
  107. self.Bind(wx.EVT_TOOL, handler, toolWin)
  108. else: # separator
  109. self.AddSeparator()
  110. return tool
  111. def EnableLongHelp(self, enable = True):
  112. """!Enable/disable long help
  113. @param enable True for enable otherwise disable
  114. """
  115. for tool in self._data:
  116. if tool[0] == '': # separator
  117. continue
  118. if enable:
  119. self.SetToolLongHelp(vars(self)[tool[0]], tool[4])
  120. else:
  121. self.SetToolLongHelp(vars(self)[tool[0]], "")
  122. def OnTool(self, event):
  123. """!Tool selected
  124. """
  125. if self.parent.GetName() == "GCPFrame":
  126. return
  127. if hasattr(self.parent, 'toolbars'):
  128. if self.parent.GetToolbar('vdigit'):
  129. # update vdigit toolbar (unselect currently selected tool)
  130. id = self.parent.toolbars['vdigit'].GetAction(type = 'id')
  131. self.parent.toolbars['vdigit'].ToggleTool(id, False)
  132. if event:
  133. # deselect previously selected tool
  134. id = self.action.get('id', -1)
  135. if id != event.GetId():
  136. self.ToggleTool(self.action['id'], False)
  137. else:
  138. self.ToggleTool(self.action['id'], True)
  139. self.action['id'] = event.GetId()
  140. event.Skip()
  141. else:
  142. # initialize toolbar
  143. self.ToggleTool(self.action['id'], True)
  144. def GetAction(self, type = 'desc'):
  145. """!Get current action info"""
  146. return self.action.get(type, '')
  147. def SelectDefault(self, event):
  148. """!Select default tool"""
  149. self.ToggleTool(self.defaultAction['id'], True)
  150. self.defaultAction['bind'](event)
  151. self.action = { 'id' : self.defaultAction['id'],
  152. 'desc' : self.defaultAction.get('desc', '') }
  153. def FixSize(self, width):
  154. """!Fix toolbar width on Windows
  155. @todo Determine why combobox causes problems here
  156. """
  157. if platform.system() == 'Windows':
  158. size = self.GetBestSize()
  159. self.SetSize((size[0] + width, size[1]))
  160. def Enable(self, tool, enable = True):
  161. """!Enable/Disable defined tool
  162. @param tool name
  163. @param enable True to enable otherwise disable tool
  164. """
  165. try:
  166. id = getattr(self, tool)
  167. except AttributeError:
  168. return
  169. self.EnableTool(id, enable)
  170. def EnableAll(self, enable = True):
  171. """!Enable/Disable all tools
  172. @param enable True to enable otherwise disable tool
  173. """
  174. for item in self._toolbarData():
  175. if not item[0]:
  176. continue
  177. self.Enable(item[0], enable)
  178. def _getToolbarData(self, data):
  179. """!Define tool
  180. """
  181. retData = list()
  182. for args in data:
  183. retData.append(self._defineTool(*args))
  184. return retData
  185. def _defineTool(self, name = None, icon = None, handler = None, item = wx.ITEM_NORMAL, pos = -1):
  186. """!Define tool
  187. """
  188. if name:
  189. return (name, icon.GetBitmap(),
  190. item, icon.GetLabel(), icon.GetDesc(),
  191. handler, pos)
  192. return ("", "", "", "", "", "") # separator
  193. def _onMenu(self, data):
  194. """!Toolbar pop-up menu"""
  195. menu = wx.Menu()
  196. for icon, handler in data:
  197. item = wx.MenuItem(menu, wx.ID_ANY, icon.GetLabel())
  198. item.SetBitmap(icon.GetBitmap(self.parent.iconsize))
  199. menu.AppendItem(item)
  200. self.Bind(wx.EVT_MENU, handler, item)
  201. self.PopupMenu(menu)
  202. menu.Destroy()