Skip to content

Commit

Permalink
[DEBUG] Cache widget attributes after config query
Browse files Browse the repository at this point in the history
  • Loading branch information
ObaraEmmanuel committed Jan 25, 2025
1 parent 916db29 commit 79f1d70
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 6 deletions.
7 changes: 7 additions & 0 deletions studio/debugtools/debugger.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,13 @@ def handle_msg(self, msg):
widget, msg.payload["event_obj"]
)
suppress = True
if event == "<<WidgetModified>>":
widget.invalidate_conf()
if event == "<<MenuItemModified>>":
index = int(msg.payload["data"])
if widget._menu_items:
item = widget._menu_items[index]
item.invalidate_conf()

if not suppress:
self.active_widget = widget
Expand Down
29 changes: 23 additions & 6 deletions studio/debugtools/defs.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ def __init__(self, menu, index):
self._dbg_node = None
self._name = None
self._equiv_class = None
self._attr_cache = None
self._class = RemoteMenuItem
self.menu_items = []

Expand Down Expand Up @@ -134,20 +135,27 @@ def _call(self, meth, *args, **kwargs):
)

def configure(self, **kwargs):
x = self._call("entryconfigure", **kwargs)
return x
ret = self._call("entryconfigure", **kwargs)
if not kwargs and isinstance(ret, dict):
self._attr_cache = {k: v[-1] if isinstance(v, (tuple, list, set)) else v for k, v in ret.items()}
return ret

config = configure

def cget(self, key):
if self._attr_cache is not None:
if key in self._attr_cache:
return self._attr_cache[key]
return self._call("entrycget", key)

def __getitem__(self, item):
return self._call("entrycget", item)
__getitem__ = cget

def __setitem__(self, key, value):
return self._call("entryconfigure", key, value)

def invalidate_conf(self):
pass

def type(self):
return self._call("type")

Expand Down Expand Up @@ -184,6 +192,7 @@ def __init__(self, id_, debugger):
self.debugger = debugger
self._dbg_node = None
self._prop_map = {}
self._attr_cache = None
self._menu_items = None
self.deleted = False
self.equiv_class = get_studio_equiv(self)
Expand Down Expand Up @@ -233,16 +242,24 @@ def _set(self, prop, value):
def configure(self, **kwargs):
ret = self._call("configure", **kwargs)
if ret is None and not kwargs:
# fallback if configure behviour is not implemented correctly
return self._configure()
# fallback if configure behaviour is not implemented correctly
ret = self._configure()
if not kwargs and isinstance(ret, dict):
self._attr_cache = {k: v[-1] if isinstance(v, (tuple, list, set)) else v for k, v in ret.items()}
return ret

def invalidate_conf(self):
self._attr_cache = None

def _configure(self, cmd="configure", cnf=None, kw=None):
return self._call("_configure", cmd, cnf, kw)

config = configure

def __getitem__(self, item):
if self._attr_cache is not None:
if item in self._attr_cache:
return self._attr_cache[item]
return self._call("__getitem__", item)

def __setitem__(self, key, value):
Expand Down

0 comments on commit 79f1d70

Please sign in to comment.