quick frontend (widgets): improved deletion of widget:
QuickWidget deletion has been improved a bit. A new "all_instances" kwarg can be used to completely delete all instances of a widget.
This commit is contained in:
parent
7cf0180731
commit
da54c69eaa
1 changed files with 43 additions and 14 deletions
|
|
@ -266,31 +266,61 @@ class QuickWidgetsManager(object):
|
|||
return widget
|
||||
|
||||
def deleteWidget(self, widget_to_delete, *args, **kwargs):
|
||||
"""Delete a widget
|
||||
"""Delete a widget instance
|
||||
|
||||
this method must be called by frontends when a widget is deleted
|
||||
widget's onDelete method will be called before deletion
|
||||
widget's onDelete method will be called before deletion, and deletion will be
|
||||
stopped if it returns False.
|
||||
@param widget_to_delete(QuickWidget): widget which need to deleted
|
||||
@param *args: extra arguments to pass to onDelete
|
||||
@param *kwargs: extra keywords arguments to pass to onDelete
|
||||
the extra arguments are not use by QuickFrontend, it's is up to
|
||||
the frontend to use them or not
|
||||
"all_instances" can be used as kwarg, if it evaluate to True, all
|
||||
instances of the widget will be deleted (if onDelete is not returning False
|
||||
for any of the instance). This arguments is not sent to onDelete methods.
|
||||
"""
|
||||
if widget_to_delete.onDelete(*args, **kwargs) == False:
|
||||
return
|
||||
# TODO: all_instances must be independante kwargs, this is not possible with Python 2
|
||||
# but will be with Python 3
|
||||
all_instances = kwargs.get('all_instances', False)
|
||||
|
||||
if all_instances:
|
||||
for w in self.getWidgetInstances(widget_to_delete):
|
||||
if w.onDelete(*args, **kwargs) == False:
|
||||
return
|
||||
else:
|
||||
if widget_to_delete.onDelete(*args, **kwargs) == False:
|
||||
return
|
||||
|
||||
if self.host.selected_widget == widget_to_delete:
|
||||
self.host.selected_widget = None
|
||||
|
||||
for widget_map in self._widgets.itervalues():
|
||||
to_delete = set()
|
||||
for hash_, widget_instances in widget_map.iteritems():
|
||||
if widget_to_delete in widget_instances:
|
||||
widget_instances.remove(widget_to_delete)
|
||||
if not widget_instances:
|
||||
to_delete.add(hash_)
|
||||
for hash_ in to_delete:
|
||||
del widget_map[hash_]
|
||||
class_ = self.getRealClass(widget_to_delete.__class__)
|
||||
try:
|
||||
widgets_map = self._widgets[class_.__name__]
|
||||
except KeyError:
|
||||
log.error(u"no widgets_map found for class {cls}".format(cls=class_))
|
||||
return
|
||||
widget_hash = unicode(class_.getWidgetHash(widget_to_delete.target,
|
||||
widget_to_delete.profiles))
|
||||
widget_instances = widgets_map[widget_hash]
|
||||
if all_instances:
|
||||
widget_instances.clear()
|
||||
else:
|
||||
try:
|
||||
widget_instances.remove(widget_to_delete)
|
||||
except ValueError:
|
||||
log.error(u"widget_to_delete not found in widget instances")
|
||||
return
|
||||
|
||||
log.debug(u"widget {} deleted".format(widget_to_delete))
|
||||
|
||||
if not widget_instances:
|
||||
# all instances with this hash have been deleted
|
||||
# we remove the hash itself
|
||||
del widgets_map[widget_hash]
|
||||
log.debug(u"All instances of {cls} with hash {widget_hash} have been deleted"
|
||||
.format(cls=class_, widget_hash=widget_hash))
|
||||
|
||||
|
||||
class QuickWidget(object):
|
||||
|
|
@ -402,5 +432,4 @@ class QuickWidget(object):
|
|||
@return (boot, None): False to cancel deletion
|
||||
all other value continue deletion
|
||||
"""
|
||||
log.debug(u"widget {} deleted".format(self))
|
||||
return True
|
||||
|
|
|
|||
Loading…
Reference in a new issue