Fix MultiSelectDialog for two issues;

1) it would rerun an 'ok' after a 'no' on same object if the
     user selected 'Use answer for rest'.
  2) Dialogs called within an operation would have wrong parent.
This commit is contained in:
prculley 2020-08-08 11:37:00 -05:00 committed by Nick Hall
parent 80908fc6f7
commit 11d5a64643

View File

@ -437,11 +437,29 @@ class MissingMediaDialog:
parent=self.top) parent=self.top)
return True return True
class MultiSelectDialog: class MultiSelectDialog:
"""
Allows a Yes, No, Cancel dialog that includes a checkbox
with "Use this answer for the rest of the items" that works with 'Yes'
"""
def __init__(self, msg1_func, msg2_func, items, lookup, def __init__(self, msg1_func, msg2_func, items, lookup,
cancel_func=None, no_func=None, yes_func=None, cancel_func=None, no_func=None, yes_func=None,
multi_yes_func=None, parent=None): multi_yes_func=None, parent=None):
""" """
msg1_func a function to display big bold text at top
msg2_func a function to display normal text at center of dialog
items a list of objects (often handles) passed to lookup
Must be a list, not a generator
lookup A function that looks up an object to pass to yes/no/multi_func
cancel_func A function or None called on cancel.
yes_func A function or None called on Yes.
no_func A function or None called on No.
multi_yes_func A function or None called on Yes with
"use this answer for rest" checked.
The above xxx_func calls will have parameters:
object from lookup function
"parent=" set to this dialog for transient parent purposes.
""" """
self.xml = Glade(toplevel='multiselectdialog') self.xml = Glade(toplevel='multiselectdialog')
@ -468,7 +486,7 @@ class MultiSelectDialog:
self.top.connect('delete_event', self.warn) self.top.connect('delete_event', self.warn)
default_action = 0 default_action = 0
for selected in items: for indx, selected in enumerate(items):
item = self.lookup(selected) item = self.lookup(selected)
if default_action == 0: if default_action == 0:
msg1 = self.msg1_func(item) msg1 = self.msg1_func(item)
@ -491,22 +509,22 @@ class MultiSelectDialog:
if check_button.get_active(): if check_button.get_active():
# run the multiple yes if 'do remainder' is checked # run the multiple yes if 'do remainder' is checked
if multi_yes_func and response == 3: if multi_yes_func and response == 3:
multi_yes_func(items) multi_yes_func(items[indx:], parent=self.top)
break break
default_action = response default_action = response
else: else:
response = default_action response = default_action
### Now do it # Now do it
if response == 1: # Cancel if response == 1: # Cancel
if self.cancel_func: if self.cancel_func:
self.cancel_func(item) self.cancel_func(item, parent=self.top)
break break
elif response == 2: # No elif response == 2: # No
if self.no_func: if self.no_func:
self.no_func(item) self.no_func(item, parent=self.top)
elif response == 3: # Yes elif response == 3: # Yes
if self.yes_func: if self.yes_func:
self.yes_func(item) self.yes_func(item, parent=self.top)
self.top.destroy() self.top.destroy()
if parent and parent_modal: if parent and parent_modal:
parent.set_modal(True) parent.set_modal(True)