toolbars.py 9.0 KB

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