toolbars.py 10.0 KB

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