Skip to content

Commit

Permalink
wxGUI: new context menu for statusbar settings (#2251)
Browse files Browse the repository at this point in the history
  • Loading branch information
lindakarlovska committed Mar 21, 2022
1 parent 0e34c62 commit 0b5618d
Show file tree
Hide file tree
Showing 8 changed files with 100 additions and 47 deletions.
7 changes: 3 additions & 4 deletions gui/wxpython/gcp/mapdisplay.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ def __init__(
sbgcp.SbRMSError,
]
self.statusbar = self.CreateStatusbar(statusbarItems)
self.statusbarManager.SetMode(5) # goto GCP

#
# Init map display (buffered DC & set default cursor)
Expand Down Expand Up @@ -163,6 +162,9 @@ def __init__(
# windows
self.list = self.CreateGCPList()

# set Go To GCP item as active in statusbar
self.mapWindowProperties.sbItem = 5

# self.SrcMapWindow.SetSize((300, 300))
# self.TgtMapWindow.SetSize((300, 300))
self.list.SetSize((100, 150))
Expand Down Expand Up @@ -210,9 +212,6 @@ def __init__(

self.decorationDialog = None # decoration/overlays

# doing nice things in statusbar when other things are ready
self.statusbarManager.Update()

def _setUpMapWindow(self, mapWindow):
# TODO: almost the same implementation as for MapPanelBase (only names differ)
# enable or disable zoom history tool
Expand Down
1 change: 0 additions & 1 deletion gui/wxpython/gui_core/mapdisp.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,6 @@ def CreateStatusbar(self, statusbarItems):
self.statusbarManager.AddStatusbarItem(
sb.SbRender(self, statusbar=statusbar, position=2)
)
self.statusbarManager.Update()
return statusbar

def AddStatusbarPane(self):
Expand Down
8 changes: 3 additions & 5 deletions gui/wxpython/image2target/ii2t_mapdisplay.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,6 @@ def __init__(
# create statusbar and its manager
self.statusbar = self.CreateStatusbar(statusbarItems)

self.statusbarManager.SetMode(5) # goto GCP

#
# Init map display (buffered DC & set default cursor)
#
Expand Down Expand Up @@ -168,6 +166,9 @@ def __init__(
# windows
self.list = self.CreateGCPList()

# set Go To GCP item as active in statusbar
self.mapWindowProperties.sbItem = 5

# self.SrcMapWindow.SetSize((300, 300))
# self.TgtMapWindow.SetSize((300, 300))
self.list.SetSize((100, 150))
Expand Down Expand Up @@ -215,9 +216,6 @@ def __init__(

self.decorationDialog = None # decoration/overlays

# doing nice things in statusbar when other things are ready
self.statusbarManager.Update()

def _setUpMapWindow(self, mapWindow):
# TODO: almost the same implementation as for MapPanelBase (only names differ)
# enable or disable zoom history tool
Expand Down
10 changes: 4 additions & 6 deletions gui/wxpython/mapdisp/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ def AddNviz(self):
self.statusbarManager.DisableStatusbarItemsByClass(
self.statusbarItemsDisabledInNviz
)
self.statusbarManager.SetMode(0)
self.mapWindowProperties.sbItem = 0

# erase map window
self.MapWindow.EraseMap()
Expand Down Expand Up @@ -548,12 +548,11 @@ def RemoveNviz(self):
pass

# update status bar
self.SetStatusText(_("Please wait, unloading data..."), 0)
self.statusbarManager.disabledItems = {}
self.statusbarManager.SetMode(
UserSettings.Get(group="display", key="statusbarMode", subkey="selection")
self.mapWindowProperties.sbItem = UserSettings.Get(
group="display", key="statusbarMode", subkey="selection"
)
self.SetStatusText(_("Please wait, unloading data..."), 0)
self.statusbarManager.Update()

# unloading messages from library cause highlight anyway
self._giface.WriteCmdLog(
Expand Down Expand Up @@ -1563,7 +1562,6 @@ def SetProperties(
self.mapWindowProperties.autoRender = render
if self.statusbarManager:
self.statusbarManager.SetMode(mode)
self.StatusbarUpdate()
self.mapWindowProperties.useDefinedProjection = projection
self.mapWindowProperties.showRegion = showCompExtent
self.mapWindowProperties.alignExtent = alignExtent
Expand Down
54 changes: 29 additions & 25 deletions gui/wxpython/mapdisp/properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def _connect(self):
def _disconnect(self):
self.mapWindowPropertyChanged().disconnect(self._setValue)

def _onToggleCheckBox(self, event):
def _onToggle(self, event):
self._disconnect()
self.mapWindowProperty = self.GetValue()
self._connect()
Expand All @@ -83,7 +83,7 @@ def __init__(self, parent, mapWindowProperties):
self.widget.SetValue(self.mapWindowProperty)
self.widget.SetToolTip(wx.ToolTip(_("Enable/disable auto-rendering")))

self.widget.Bind(wx.EVT_CHECKBOX, self._onToggleCheckBox)
self.widget.Bind(wx.EVT_CHECKBOX, self._onToggle)
self._connect()

@property
Expand Down Expand Up @@ -124,7 +124,7 @@ def __init__(self, parent, mapWindowProperties):
)
)
)
self.widget.Bind(wx.EVT_CHECKBOX, self._onToggleCheckBox)
self.widget.Bind(wx.EVT_CHECKBOX, self._onToggle)
self._connect()

@property
Expand Down Expand Up @@ -162,7 +162,7 @@ def __init__(self, parent, mapframe, mapWindowProperties):
)
)
)
self.widget.Bind(wx.EVT_CHECKBOX, self._onToggleCheckBox)
self.widget.Bind(wx.EVT_CHECKBOX, self._onToggle)
self._connect()

@property
Expand All @@ -176,9 +176,9 @@ def mapWindowProperty(self, value):
def mapWindowPropertyChanged(self):
return self._properties.resolutionChanged

def _onToggleCheckBox(self, event):
def _onToggle(self, event):
"""Update display when toggle display mode"""
super()._onToggleCheckBox(event)
super()._onToggle(event)

# redraw map if auto-rendering is enabled
if self._properties.autoRender:
Expand Down Expand Up @@ -208,7 +208,7 @@ def __init__(self, parent, mapframe, mapWindowProperties):
)
)
)
self.widget.Bind(wx.EVT_CHECKBOX, self._onToggleCheckBox)
self.widget.Bind(wx.EVT_CHECKBOX, self._onToggle)
self._connect()

@property
Expand All @@ -222,12 +222,12 @@ def mapWindowProperty(self, value):
def mapWindowPropertyChanged(self):
return self._properties.showRegionChanged

def _onToggleCheckBox(self, event):
def _onToggle(self, event):
"""Shows/Hides extent (comp. region) in map canvas.
Shows or hides according to checkbox value.
"""
super()._onToggleCheckBox(event)
super()._onToggle(event)

# redraw map if auto-rendering is enabled
if self._properties.autoRender:
Expand All @@ -253,7 +253,7 @@ def __init__(self, parent, mapWindowProperties):
)
)
)
self.widget.Bind(wx.EVT_CHECKBOX, self._onToggleCheckBox)
self.widget.Bind(wx.EVT_CHECKBOX, self._onToggle)
self._connect()

@property
Expand All @@ -267,8 +267,8 @@ def mapWindowProperty(self, value):
def mapWindowPropertyChanged(self):
return self._properties.useDefinedProjectionChanged

def _onToggleCheckBox(self, event):
super()._onToggleCheckBox(event)
def _onToggle(self, event):
super()._onToggle(event)
epsg = self._properties.epsg
if epsg:
label = _("{label} (EPSG: {epsg})").format(
Expand All @@ -279,10 +279,11 @@ def _onToggleCheckBox(self, event):
self.widget.SetLabel(self.defaultLabel)


class RBShowInStatusbar:
class RBShowInStatusbar(PropertyItem):
"""Radiobox managing widgets in statusbar."""

def __init__(self, parent, sbmanager):
def __init__(self, parent, mapWindowProperties, sbmanager):
PropertyItem.__init__(self, mapWindowProperties)
self.name = "showInStatusbar"
self.statusbarManager = sbmanager

Expand All @@ -295,10 +296,11 @@ def __init__(self, parent, sbmanager):
majorDimension=1,
style=wx.RA_SPECIFY_COLS,
)
self._setValue(self.statusbarManager.GetMode())
self._setValue(self.mapWindowProperty)
self._disableItems()

self.widget.Bind(wx.EVT_RADIOBOX, self._onToggleRadioBox)
self.widget.Bind(wx.EVT_RADIOBOX, self._onToggle)
self._connect()

def _setValue(self, mode):
self.widget.SetSelection(mode)
Expand All @@ -311,16 +313,16 @@ def _disableItems(self):
for item in self.statusbarManager.disabledItems.keys():
self.widget.EnableItem(n=item, enable=False)

def GetWidget(self):
"""Returns underlying widget.
@property
def mapWindowProperty(self):
return self._properties.sbItem

:return: widget or None if doesn't exist
"""
return self.widget
@mapWindowProperty.setter
def mapWindowProperty(self, value):
self._properties.sbItem = value

def _onToggleRadioBox(self, event):
self.statusbarManager.SetMode(self.GetValue())
self.statusbarManager.Update()
def mapWindowPropertyChanged(self):
return self._properties.sbItemChanged


class MapDisplayPropertiesDialog(wx.Dialog):
Expand Down Expand Up @@ -433,7 +435,9 @@ def _createStatusBarPage(self, parent):
sizer = wx.BoxSizer(wx.VERTICAL)

self.shownInStatusbar = RBShowInStatusbar(
parent=panel, sbmanager=self.statusbarManager
parent=panel,
mapWindowProperties=self.mapWindowProperties,
sbmanager=self.statusbarManager,
)
sizer.Add(
self.shownInStatusbar.GetWidget(),
Expand Down
48 changes: 46 additions & 2 deletions gui/wxpython/mapdisp/statusbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
from core import utils
from core.gcmd import RunCommand
from core.settings import UserSettings
from gui_core.wrap import TextCtrl
from gui_core.wrap import TextCtrl, Menu, NewId

from grass.pydispatch.signal import Signal

Expand Down Expand Up @@ -85,6 +85,9 @@ def __init__(self, mapframe, statusbar):
self.progressbar.progressShown.connect(self._progressShown)
self.progressbar.progressHidden.connect(self._progressHidden)

self.statusbar.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)
self.mapFrame.mapWindowProperties.sbItemChanged.connect(self.SetMode)

self._oldStatus = ""

self.disabledItems = {}
Expand Down Expand Up @@ -150,6 +153,14 @@ def GetItemLabels(self):
if value.GetPosition() == 0
]

def GetDisabledItemLabels(self):
"""Get list of disabled item labels"""
return [
value.label
for value in self.disabledItems.values()
if value.GetPosition() == 0
]

def ShowItem(self, itemName):
"""Invokes showing of particular item
Expand Down Expand Up @@ -181,6 +192,9 @@ def _postInit(self):
group="display", key="statusbarMode", subkey="selection"
)
)
self.mapFrame.mapWindowProperties.sbItem = UserSettings.Get(
group="display", key="statusbarMode", subkey="selection"
)
self.Reposition()

self._postInitialized = True
Expand Down Expand Up @@ -252,12 +266,13 @@ def _progressHidden(self):
self.statusbar.SetStatusText(self._oldStatus, 0)

def SetMode(self, mode):
"""Sets current mode
"""Sets current mode and updates statusbar
Mode is usually driven by user through map display settings.
"""
self._mode = mode
self._modeIndexSet = True
self.Update()

def GetMode(self):
"""Returns current mode"""
Expand All @@ -270,6 +285,35 @@ def SetProgress(self, range, value, text):
if text:
self.statusbar.SetStatusText(text)

def OnContextMenu(self, event):
"""Popup context menu enabling to choose a widget that will be shown in statusbar."""

def setSbItemProperty(idx):
self.mapFrame.mapWindowProperties.sbItem = idx

def getSbItemProperty():
return self.mapFrame.mapWindowProperties.sbItem

menu = Menu()
for i, label in enumerate(self.GetItemLabels()):
wxid = NewId()
self.statusbar.Bind(
wx.EVT_MENU,
lambda evt, idx=i: setSbItemProperty(idx),
id=wxid,
)
menu.Append(wxid, label, kind=wx.ITEM_RADIO)
item = menu.FindItem(wxid)[0]
if i == getSbItemProperty():
item.Check(item.IsChecked() is False)
if label in (self.GetDisabledItemLabels()):
item.Enable(enable=False)

# show the popup menu
self.statusbar.PopupMenu(menu)
menu.Destroy()
event.Skip()


class SbItem:
"""Base class for statusbar items.
Expand Down
12 changes: 12 additions & 0 deletions gui/wxpython/mapwin/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ def __init__(self):
self.useDefinedProjectionChanged = Signal(
"MapWindowProperties.useDefinedProjectionChanged"
)
self._sbItem = None
self.sbItemChanged = Signal("MapWindowProperties.sbItemChanged")

def setValuesFromUserSettings(self):
"""Convenient function to get values from user settings into this object."""
Expand Down Expand Up @@ -112,6 +114,16 @@ def useDefinedProjection(self, value):
def epsg(self):
return UserSettings.Get(group="projection", key="statusbar", subkey="epsg")

@property
def sbItem(self):
return self._sbItem

@sbItem.setter
def sbItem(self, mode):
if mode != self._sbItem:
self._sbItem = mode
self.sbItemChanged.emit(mode=mode)


class MapWindowBase(object):
"""Abstract map display window class
Expand Down

0 comments on commit 0b5618d

Please sign in to comment.