statusbar.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. """
  2. @package frame.statusbar
  3. @brief Classes for main window statusbar management
  4. Classes:
  5. - statusbar::SbMain
  6. - statusbar::SbMask
  7. (C) 2022 by the GRASS Development Team
  8. This program is free software under the GNU General Public License
  9. (>=v2). Read the file COPYING that comes with GRASS for details.
  10. @author Linda Kladivova <lindakladivova gmail.com>
  11. @author Anna Petrasova <kratochanna gmail.com>
  12. @author Vaclav Petras <wenzeslaus gmail.com>
  13. """
  14. import wx
  15. import grass.script as gs
  16. from core.gcmd import RunCommand
  17. from gui_core.wrap import Button
  18. class SbMain:
  19. """Statusbar for main window."""
  20. def __init__(self, parent, giface):
  21. self.parent = parent
  22. self.giface = giface
  23. self.widget = wx.StatusBar(self.parent, id=wx.ID_ANY)
  24. self.widget.SetMinHeight(24)
  25. self.widget.SetFieldsCount(2)
  26. self.widget.SetStatusWidths([-1, 100])
  27. self.mask = SbMask(self.widget, self.giface)
  28. self.widget.Bind(wx.EVT_SIZE, self.OnSize)
  29. self._repositionStatusbar()
  30. def GetWidget(self):
  31. """Returns underlying widget.
  32. :return: widget or None if doesn't exist
  33. """
  34. return self.widget
  35. def _repositionStatusbar(self):
  36. """Reposition widgets in main window statusbar"""
  37. rect1 = self.GetWidget().GetFieldRect(1)
  38. rect1.x += 1
  39. rect1.y += 1
  40. self.mask.GetWidget().SetRect(rect1)
  41. def Refresh(self):
  42. """Refresh statusbar. So far it refreshes just a mask."""
  43. self.mask.Refresh()
  44. def OnSize(self, event):
  45. """Adjust main window statusbar on changing size"""
  46. self._repositionStatusbar()
  47. def SetStatusText(self, *args):
  48. """Overide wx.StatusBar method"""
  49. self.GetWidget().SetStatusText(*args)
  50. class SbMask:
  51. """Button to show whether mask is activated and remove mask with
  52. left mouse click
  53. """
  54. def __init__(self, parent, giface):
  55. self.name = "mask"
  56. self.mask_layer = "MASK"
  57. self.parent = parent
  58. self.giface = giface
  59. self.widget = Button(
  60. parent=parent, id=wx.ID_ANY, label=_(self.mask_layer), style=wx.NO_BORDER
  61. )
  62. self.widget.Bind(wx.EVT_BUTTON, self.OnRemoveMask)
  63. self.widget.SetForegroundColour(wx.Colour(255, 0, 0))
  64. self.widget.SetToolTip(tip=_("Left mouse click to remove the MASK"))
  65. self.giface.currentMapsetChanged.connect(self.Refresh)
  66. self.giface.grassdbChanged.connect(self._dbChanged)
  67. self.Refresh()
  68. def _dbChanged(self, map=None, newname=None):
  69. if map == self.mask_layer or newname == self.mask_layer:
  70. self.Refresh()
  71. self.giface.updateMap.emit()
  72. def Show(self):
  73. """Invokes showing of underlying widget.
  74. In derived classes it can do what is appropriate for it,
  75. e.g. showing text on statusbar (only).
  76. """
  77. self.widget.Show()
  78. def Hide(self):
  79. self.widget.Hide()
  80. def SetValue(self, value):
  81. self.widget.SetValue(value)
  82. def GetValue(self):
  83. return self.widget.GetValue()
  84. def GetWidget(self):
  85. """Returns underlying widget.
  86. :return: widget or None if doesn't exist
  87. """
  88. return self.widget
  89. def Refresh(self):
  90. """Show mask in the statusbar if mask file found"""
  91. if gs.find_file(
  92. name=self.mask_layer, element="cell", mapset=gs.gisenv()["MAPSET"]
  93. )["name"]:
  94. self.Show()
  95. else:
  96. self.Hide()
  97. def OnRemoveMask(self, event):
  98. dlg = wx.MessageDialog(
  99. self.parent,
  100. message=_("Are you sure that you want to remove the MASK?"),
  101. caption=_("Remove MASK"),
  102. style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION,
  103. )
  104. if dlg.ShowModal() != wx.ID_YES:
  105. dlg.Destroy()
  106. return
  107. RunCommand("r.mask", flags="r")
  108. gisenv = gs.gisenv()
  109. self.giface.grassdbChanged.emit(
  110. grassdb=gisenv["GISDBASE"],
  111. location=gisenv["LOCATION_NAME"],
  112. mapset=gisenv["MAPSET"],
  113. map=self.mask_layer,
  114. action="delete",
  115. element="raster",
  116. )