toolbars.py 11 KB

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