toolbars.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. """
  2. @package rdigit.toolbars
  3. @brief rdigit toolbars and icons.
  4. Classes:
  5. - toolbars::RDigitToolbar
  6. (C) 2014 by the GRASS Development Team
  7. This program is free software under the GNU General Public
  8. License (>=v2). Read the file COPYING that comes with GRASS
  9. for details.
  10. @author Anna Petrasova <kratochanna gmail.com>
  11. """
  12. import wx
  13. from gui_core.toolbars import BaseToolbar
  14. from icons.icon import MetaIcon
  15. from gui_core.widgets import FloatValidator
  16. import wx.lib.colourselect as csel
  17. from gui_core.wrap import TextCtrl, StaticText, ColourSelect
  18. rdigitIcons = {
  19. "area": MetaIcon(img="polygon-create", label=_("Digitize area")),
  20. "line": MetaIcon(img="line-create", label=_("Digitize line")),
  21. "point": MetaIcon(img="point-create", label=_("Digitize point")),
  22. "save": MetaIcon(img="save", label=_("Save raster map")),
  23. "undo": MetaIcon(img="undo", label=_("Undo")),
  24. "help": MetaIcon(img="help", label=_("Raster Digitizer manual")),
  25. "quit": MetaIcon(img="quit", label=_("Quit raster digitizer")),
  26. }
  27. class RDigitToolbar(BaseToolbar):
  28. """RDigit toolbar"""
  29. def __init__(self, parent, giface, controller, toolSwitcher):
  30. """RDigit toolbar constructor"""
  31. BaseToolbar.__init__(self, parent, toolSwitcher)
  32. self._controller = controller
  33. self._giface = giface
  34. self.InitToolbar(self._toolbarData())
  35. self._mapSelectionCombo = wx.ComboBox(
  36. self, id=wx.ID_ANY, value=_("Select raster map"), choices=[], size=(120, -1)
  37. )
  38. self._mapSelectionCombo.Bind(wx.EVT_COMBOBOX, self.OnMapSelection)
  39. self._mapSelectionCombo.SetEditable(False)
  40. self.InsertControl(0, self._mapSelectionCombo)
  41. self._previousMap = self._mapSelectionCombo.GetValue()
  42. self._color = ColourSelect(parent=self, colour=wx.GREEN, size=(30, 30))
  43. self._color.Bind(csel.EVT_COLOURSELECT, lambda evt: self._changeDrawColor())
  44. self._color.SetToolTip(_("Set drawing color (not raster cell color)"))
  45. self.InsertControl(4, self._color)
  46. self._cellValues = set(["1"])
  47. # validator does not work with combobox, SetBackgroundColor is not
  48. # working
  49. self._valueCombo = wx.ComboBox(
  50. self,
  51. id=wx.ID_ANY,
  52. choices=list(self._cellValues),
  53. size=(80, -1),
  54. validator=FloatValidator(),
  55. )
  56. self._valueCombo.Bind(wx.EVT_COMBOBOX, lambda evt: self._cellValueChanged())
  57. self._valueCombo.Bind(wx.EVT_TEXT, lambda evt: self._cellValueChanged())
  58. self._valueCombo.SetSelection(0)
  59. self._cellValueChanged()
  60. labelValue = StaticText(self, label=" %s" % _("Cell value:"))
  61. self.InsertControl(6, labelValue)
  62. self.InsertControl(7, self._valueCombo)
  63. # validator does not work with combobox, SetBackgroundColor is not
  64. # working
  65. self._widthValue = TextCtrl(
  66. self, id=wx.ID_ANY, value="0", size=(80, -1), validator=FloatValidator()
  67. )
  68. self._widthValue.Bind(wx.EVT_TEXT, lambda evt: self._widthValueChanged())
  69. self._widthValueChanged()
  70. self._widthValue.SetToolTip(
  71. _(
  72. "Width of currently digitized line or diameter of a digitized point in map units."
  73. )
  74. )
  75. labelWidth = StaticText(self, label=" %s" % _("Width:"))
  76. self.InsertControl(8, labelWidth)
  77. self.InsertControl(9, self._widthValue)
  78. for tool in (self.area, self.line, self.point):
  79. self.toolSwitcher.AddToolToGroup(group="mouseUse", toolbar=self, tool=tool)
  80. self.toolSwitcher.toggleToolChanged.connect(self.CheckSelectedTool)
  81. self._default = self.area
  82. # realize the toolbar
  83. self.Realize()
  84. # workaround Mac bug
  85. for t in (
  86. self._mapSelectionCombo,
  87. self._color,
  88. self._valueCombo,
  89. self._widthValue,
  90. labelValue,
  91. labelWidth,
  92. ):
  93. t.Hide()
  94. t.Show()
  95. def _toolbarData(self):
  96. """Toolbar data"""
  97. return self._getToolbarData(
  98. (
  99. (
  100. "area",
  101. rdigitIcons["area"],
  102. lambda event: self._controller.SelectType("area"),
  103. wx.ITEM_CHECK,
  104. ),
  105. (
  106. "line",
  107. rdigitIcons["line"],
  108. lambda event: self._controller.SelectType("line"),
  109. wx.ITEM_CHECK,
  110. ),
  111. (
  112. "point",
  113. rdigitIcons["point"],
  114. lambda event: self._controller.SelectType("point"),
  115. wx.ITEM_CHECK,
  116. ),
  117. (None,),
  118. (None,),
  119. ("undo", rdigitIcons["undo"], lambda event: self._controller.Undo()),
  120. ("save", rdigitIcons["save"], lambda event: self._controller.Save()),
  121. (
  122. "help",
  123. rdigitIcons["help"],
  124. lambda event: self._giface.Help("wxGUI.rdigit"),
  125. ),
  126. ("quit", rdigitIcons["quit"], lambda event: self._controller.Stop()),
  127. )
  128. )
  129. def CheckSelectedTool(self, id):
  130. if self.toolSwitcher.IsToolInGroup(tool=id, group="mouseUse") and id not in (
  131. self.area,
  132. self.line,
  133. self.point,
  134. ):
  135. self._controller.SelectType(None)
  136. def UpdateRasterLayers(self, rasters):
  137. new = _("New raster map")
  138. items = [raster.name for raster in rasters if raster.name is not None]
  139. items.insert(0, new)
  140. self._mapSelectionCombo.SetItems(items)
  141. def OnMapSelection(self, event=None):
  142. """!Either map to edit or create new map selected."""
  143. idx = self._mapSelectionCombo.GetSelection()
  144. if idx == 0:
  145. ret = self._controller.SelectNewMap()
  146. else:
  147. ret = self._controller.SelectOldMap(self._mapSelectionCombo.GetString(idx))
  148. if not ret:
  149. # in wxpython 3 we can't set value which is not in the items
  150. # when not editable
  151. self._mapSelectionCombo.SetEditable(True)
  152. self._mapSelectionCombo.SetValue(self._previousMap)
  153. self._mapSelectionCombo.SetEditable(False)
  154. # we need to get back to previous
  155. self._previousMap = self._mapSelectionCombo.GetValue()
  156. def NewRasterAdded(self, name):
  157. idx = self._mapSelectionCombo.Append(name)
  158. self._mapSelectionCombo.SetSelection(idx)
  159. def UpdateCellValues(self, values=None):
  160. orig = self._valueCombo.GetValue()
  161. if not values:
  162. values = [orig]
  163. for value in values:
  164. self._cellValues.add(str(value))
  165. valList = sorted(list(self._cellValues), key=float)
  166. self._valueCombo.SetItems(valList)
  167. self._valueCombo.SetStringSelection(orig)
  168. def _cellValueChanged(self):
  169. value = self._valueCombo.GetValue()
  170. try:
  171. value = float(value)
  172. self._controller.SetCellValue(value)
  173. except ValueError:
  174. return
  175. def _widthValueChanged(self):
  176. value = self._widthValue.GetValue()
  177. try:
  178. value = float(value)
  179. self._controller.SetWidthValue(value)
  180. except ValueError:
  181. self._controller.SetWidthValue(0)
  182. return
  183. def _changeDrawColor(self):
  184. color = self._color.GetColour()
  185. self._controller.ChangeDrawColor(color=color)