toolbars.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. """
  2. @package iscatt.toolbars
  3. @brief Scatter plot - toolbars
  4. Classes:
  5. - toolbars::MainToolbar
  6. (C) 2013 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 Stepan Turek <stepan.turek seznam.cz> (mentor: Martin Landa)
  10. """
  11. import wx
  12. from icons.icon import MetaIcon
  13. from gui_core.toolbars import BaseToolbar, BaseIcons
  14. from core.gcmd import RunCommand
  15. from iscatt.dialogs import SettingsDialog
  16. class MainToolbar(BaseToolbar):
  17. """Main toolbar
  18. """
  19. def __init__(self, parent, scatt_mgr, opt_tools=None):
  20. BaseToolbar.__init__(self, parent)
  21. self.scatt_mgr = scatt_mgr
  22. self.opt_tools = opt_tools
  23. self.InitToolbar(self._toolbarData())
  24. # realize the toolbar
  25. self.Realize()
  26. self.scatt_mgr.modeSet.connect(self.ModeSet)
  27. def _toolbarData(self):
  28. icons = {
  29. 'selectGroup': MetaIcon(
  30. img='layer-group-add',
  31. label=_('Select imagery group')),
  32. 'settings': BaseIcons['settings'].SetLabel(
  33. _('Settings')),
  34. 'help': MetaIcon(
  35. img='help',
  36. label=_('Show manual')),
  37. 'add_scatt_pl': MetaIcon(
  38. img='layer-raster-analyze',
  39. label=_('Add scatter plot')),
  40. 'selCatPol': MetaIcon(
  41. img='polygon',
  42. label=_('Select area with polygon')),
  43. 'pan': MetaIcon(
  44. img='pan',
  45. label=_('Pan mode for scatter plots')),
  46. 'zoomIn': MetaIcon(
  47. img='zoom-in',
  48. label=_('Zoom mode for scatter plots (left mouse button, wheel)')),
  49. 'zoomExtent': MetaIcon(
  50. img='zoom-extent',
  51. label=_('Zoom to scatter plot data extend mode (click on scatter plot for zooming to extend)')),
  52. 'cats_mgr': MetaIcon(
  53. img='table-manager',
  54. label=_('Show/hide class manager'))}
  55. tools = [
  56. ('add_scatt', icons["add_scatt_pl"],
  57. lambda event: self.scatt_mgr.AddScattPlot()),
  58. (None,),
  59. ("cats_mgr", icons['cats_mgr'],
  60. lambda event: self.parent.ShowCategoryPanel(event.IsChecked()),
  61. wx.ITEM_CHECK),
  62. (None,),
  63. ("pan", icons["pan"],
  64. lambda event: self.SetPloltsMode(event, 'pan'),
  65. wx.ITEM_CHECK),
  66. ("zoom", icons["zoomIn"],
  67. lambda event: self.SetPloltsMode(event, 'zoom'),
  68. wx.ITEM_CHECK),
  69. ("zoom_extend", icons["zoomExtent"],
  70. lambda event: self.SetPloltsMode(event, 'zoom_extend'),
  71. wx.ITEM_CHECK),
  72. (None,),
  73. ('sel_pol_mode', icons['selCatPol'],
  74. self.ActivateSelectionPolygonMode, wx.ITEM_CHECK),
  75. (None,),
  76. ('settings', icons["settings"],
  77. self.OnSettings),
  78. ('help', icons["help"],
  79. self.OnHelp)]
  80. if self.opt_tools and "add_group" in self.opt_tools:
  81. tools.insert(0, ("selectGroup", icons['selectGroup'],
  82. lambda event: self.scatt_mgr.SetData()))
  83. return self._getToolbarData(tools)
  84. def GetToolId(self, toolName): # TODO can be useful in base
  85. return vars(self)[toolName]
  86. def SetPloltsMode(self, event, tool_name):
  87. self.scatt_mgr.modeSet.disconnect(self.ModeSet)
  88. if event.IsChecked():
  89. for i_tool_data in self._data:
  90. i_tool_name = i_tool_data[0]
  91. if not i_tool_name or i_tool_name in [
  92. "cats_mgr", "sel_pol_mode"]:
  93. continue
  94. if i_tool_name == tool_name:
  95. continue
  96. i_tool_id = vars(self)[i_tool_name]
  97. self.ToggleTool(i_tool_id, False)
  98. self.scatt_mgr.SetPlotsMode(mode=tool_name)
  99. else:
  100. self.scatt_mgr.SetPlotsMode(mode=None)
  101. self.scatt_mgr.modeSet.connect(self.ModeSet)
  102. def ActivateSelectionPolygonMode(self, event):
  103. activated = self.scatt_mgr.ActivateSelectionPolygonMode(
  104. event.IsChecked())
  105. self.parent.ShowPlotEditingToolbar(activated)
  106. i_tool_id = vars(self)['sel_pol_mode']
  107. self.ToggleTool(i_tool_id, activated)
  108. def ModeSet(self, mode):
  109. self.UnsetMode()
  110. def UnsetMode(self):
  111. for i_tool_data in self._data:
  112. i_tool_name = i_tool_data[0]
  113. if not i_tool_name or i_tool_name in ["cats_mgr", "sel_pol_mode"]:
  114. continue
  115. i_tool_id = vars(self)[i_tool_name]
  116. self.ToggleTool(i_tool_id, False)
  117. def OnSettings(self, event):
  118. dlg = SettingsDialog(parent=self, id=wx.ID_ANY,
  119. title=_('Settings'), scatt_mgr=self.scatt_mgr)
  120. dlg.ShowModal()
  121. dlg.Destroy()
  122. def OnHelp(self, event):
  123. RunCommand('g.manual',
  124. entry='wxGUI.iscatt')
  125. class EditingToolbar(BaseToolbar):
  126. """Main toolbar
  127. """
  128. def __init__(self, parent, scatt_mgr):
  129. BaseToolbar.__init__(self, parent)
  130. self.scatt_mgr = scatt_mgr
  131. self.InitToolbar(self._toolbarData())
  132. # realize the toolbar
  133. self.Realize()
  134. self.scatt_mgr.modeSet.connect(self.ModeSet)
  135. def _toolbarData(self):
  136. """Toolbar data
  137. """
  138. self.icons = {
  139. 'sel_add': MetaIcon(img='layer-add',
  140. label=_('Include selected area to class'),
  141. desc=_('Include selected area to class')),
  142. 'sel_remove': MetaIcon(img='layer-remove',
  143. label=_('Exclude selected area from class'),
  144. desc=_('Exclude selected area from class')),
  145. 'addVertex': MetaIcon(img='vertex-create',
  146. label=_('Add new vertex'),
  147. desc=_('Add new vertex to polygon boundary scatter plot')),
  148. 'editLine': MetaIcon(img='polygon-create',
  149. label=_('Create selection polygon'),
  150. desc=_('Add new vertex between last and first points of the boundary')),
  151. 'moveVertex': MetaIcon(img='vertex-move',
  152. label=_('Move vertex'),
  153. desc=_('Move boundary vertex')),
  154. 'removeVertex': MetaIcon(img='vertex-delete',
  155. label=_('Remove vertex'),
  156. desc=_('Remove boundary vertex')),
  157. 'delete': MetaIcon(img='polygon-delete',
  158. label=_("Remove polygon (click on scatter plot for removing it's polygon)")),
  159. }
  160. return self._getToolbarData(
  161. (("sel_add", self.icons["sel_add"],
  162. lambda event: self.scatt_mgr.ProcessSelectionPolygons('add')),
  163. ("sel_remove", self.icons['sel_remove'],
  164. lambda event: self.scatt_mgr.ProcessSelectionPolygons('remove')),
  165. (None,),
  166. ("add_vertex", self.icons["editLine"],
  167. lambda event: self.SetMode(event, 'add_vertex'),
  168. wx.ITEM_CHECK),
  169. ("add_boundary_vertex", self.icons['addVertex'],
  170. lambda event: self.SetMode(event, 'add_boundary_vertex'),
  171. wx.ITEM_CHECK),
  172. ("move_vertex", self.icons["moveVertex"],
  173. lambda event: self.SetMode(event, 'move_vertex'),
  174. wx.ITEM_CHECK),
  175. ('delete_vertex', self.icons['removeVertex'],
  176. lambda event: self.SetMode(event, 'delete_vertex'),
  177. wx.ITEM_CHECK),
  178. ('remove_polygon', self.icons['delete'],
  179. lambda event: self.SetMode(event, 'remove_polygon'),
  180. wx.ITEM_CHECK)))
  181. def SetMode(self, event, tool_name):
  182. self.scatt_mgr.modeSet.disconnect(self.ModeSet)
  183. if event.IsChecked():
  184. for i_tool_data in self._data:
  185. i_tool_name = i_tool_data[0]
  186. if not i_tool_name:
  187. continue
  188. if i_tool_name == tool_name:
  189. continue
  190. i_tool_id = vars(self)[i_tool_name]
  191. self.ToggleTool(i_tool_id, False)
  192. self.scatt_mgr.SetPlotsMode(tool_name)
  193. else:
  194. self.scatt_mgr.SetPlotsMode(None)
  195. self.scatt_mgr.modeSet.connect(self.ModeSet)
  196. def ModeSet(self, mode):
  197. if mode in ['zoom', 'pan', 'zoom_extend', None]:
  198. self.UnsetMode()
  199. def UnsetMode(self):
  200. for i_tool_data in self._data:
  201. i_tool_name = i_tool_data[0]
  202. if not i_tool_name:
  203. continue
  204. i_tool_id = vars(self)[i_tool_name]
  205. self.ToggleTool(i_tool_id, False)
  206. def GetToolId(self, toolName):
  207. return vars(self)[toolName]
  208. class CategoryToolbar(BaseToolbar):
  209. """Main toolbar
  210. """
  211. def __init__(self, parent, scatt_mgr, cats_list):
  212. BaseToolbar.__init__(self, parent)
  213. self.scatt_mgr = scatt_mgr
  214. self.cats_mgr = self.scatt_mgr.GetCategoriesManager()
  215. self.cats_list = cats_list
  216. self.InitToolbar(self._toolbarData())
  217. # realize the toolbar
  218. self.Realize()
  219. def _toolbarData(self):
  220. """Toolbar data
  221. """
  222. self.icons = {
  223. 'add_class': MetaIcon(img='layer-add',
  224. label=_('Add class')),
  225. 'remove_class': MetaIcon(img='layer-remove',
  226. label=_('Remove selected class'))
  227. }
  228. return self._getToolbarData(
  229. (("add_class", self.icons["add_class"],
  230. lambda event: self.cats_mgr.AddCategory()),
  231. ("remove_class", self.icons['remove_class'],
  232. lambda event: self.cats_list.DeleteCategory()),))