toolbars.py 11 KB

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