toolbars.py 9.9 KB

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