Skip to content

Commit

Permalink
wxGUI/datacatalog: enable lazy loading of maps (#1434)
Browse files Browse the repository at this point in the history
* reload mapset when new item is added to not loaded mapset
* suggest turning on lazyloading in infobar if loading took more than 5 s
  • Loading branch information
petrasovaa committed Apr 19, 2021
1 parent 235c855 commit 46cb823
Show file tree
Hide file tree
Showing 5 changed files with 237 additions and 12 deletions.
1 change: 1 addition & 0 deletions gui/wxpython/core/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ def _defaultSettings(self):
"datacatalog": {
# grassdb string
"grassdbs": {"listAsString": ""},
"lazyLoading": {"enabled": False, "asked": False},
},
"manager": {
# show opacity level widget
Expand Down
54 changes: 51 additions & 3 deletions gui/wxpython/datacatalog/catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@
from datacatalog.infomanager import DataCatalogInfoManager
from gui_core.wrap import Menu
from gui_core.forms import GUI
from grass.script import gisenv
from core.settings import UserSettings

from grass.pydispatch.signal import Signal
from grass.script.utils import clock
from grass.script import gisenv

from grass.grassdb.manage import split_mapset_path
from grass.grassdb.checks import (
Expand All @@ -55,6 +57,7 @@ def __init__(
self.parent = parent
self.baseTitle = title
self.giface = giface
self._startLoadingTime = 0
wx.Panel.__init__(self, parent=parent, id=id, **kwargs)
self.SetName("DataCatalog")

Expand All @@ -77,6 +80,7 @@ def __init__(
infobar=self.infoBar, giface=self.giface
)
self.tree.showImportDataInfo.connect(self.showImportDataInfo)
self.tree.loadingDone.connect(self._loadingDone)

# some layout
self._layout()
Expand Down Expand Up @@ -126,15 +130,59 @@ def showImportDataInfo(self):
)

def LoadItems(self):
self.tree.ReloadTreeItems()
"""Reload tree - full or lazy - based on user settings"""
self._startLoadingTime = clock()
self.tree.ReloadTreeItems(full=False)

def _loadingDone(self):
"""If loading took more time, suggest lazy loading"""
if clock() - self._startLoadingTime > 5 and not self.tree._useLazyLoading():
asked = UserSettings.Get(
group="datacatalog", key="lazyLoading", subkey="asked"
)
if not asked:
wx.CallAfter(
self.infoManager.ShowLazyLoadingOn,
setLazyLoadingOnHandler=self._saveLazyLoadingOnSettings,
doNotAskHandler=self._saveDontAskLazyLoadingSettings,
)

def _saveLazyLoadingOnSettings(self, event):
"""Turn on lazy loading in settings"""
UserSettings.Set(
group="datacatalog", key="lazyLoading", subkey="enabled", value=True
)
UserSettings.Set(
group="datacatalog", key="lazyLoading", subkey="asked", value=True
)
self._saveLazyLoadingSettings()
event.Skip()

def _saveDontAskLazyLoadingSettings(self, event):
"""Save in settings that decision on lazy loading was done to not ask again"""
UserSettings.Set(
group="datacatalog", key="lazyLoading", subkey="asked", value=True
)
self._saveLazyLoadingSettings()
event.Skip()

def _saveLazyLoadingSettings(self):
dcSettings = {}
UserSettings.ReadSettingsFile(settings=dcSettings)
if "datacatalog" not in dcSettings:
dcSettings["datacatalog"] = UserSettings.Get(group="datacatalog")
dcSettings["datacatalog"]["lazyLoading"] = UserSettings.Get(
group="datacatalog", key="lazyLoading"
)
UserSettings.SaveToFile(dcSettings)

def dismissInfobar(self):
if self.infoBar.IsShown():
self.infoBar.Dismiss()

def OnReloadTree(self, event):
"""Reload whole tree"""
self.LoadItems()
self.tree.ReloadTreeItems(full=True)

def OnReloadCurrentMapset(self, event):
"""Reload current mapset tree only"""
Expand Down
13 changes: 13 additions & 0 deletions gui/wxpython/datacatalog/infomanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,19 @@ def ShowImportDataInfo(self, OnImportOgrLayersHandler, OnImportGdalLayersHandler
).format(loc=gisenv()["LOCATION_NAME"])
self.infoBar.ShowMessage(message, wx.ICON_INFORMATION, buttons)

def ShowLazyLoadingOn(self, setLazyLoadingOnHandler, doNotAskHandler):
"""Show info about lazy loading"""
message = _(
"Loading of Data catalog content took rather long. "
"To prevent delay, you can enable loading of current mapset only. "
"You can change that later in GUI Settings, General tab."
)
buttons = [
(_("Enable loading current mapset only"), setLazyLoadingOnHandler),
(_("No change, don't ask me again"), doNotAskHandler),
]
self.infoBar.ShowMessage(message, wx.ICON_INFORMATION, buttons)

def ShowFallbackSessionInfo(self, reason_id):
"""Show info when last used mapset is not usable"""
string = self._text_from_reason_id(reason_id)
Expand Down

0 comments on commit 46cb823

Please sign in to comment.