+class WizardMenuPage(WizardPage):
+ """Represents a menu dialog in a wizard"""
+ def __init__(self, name, printable, message, choices, **kargs):
+ super(WizardMenuPage, self).__init__(**kargs)
+ self.name = name
+ self.printable = printable
+ self.message = message
+ self.info = "%s: <none>" % self.printable
+ self.choices = choices
+ self.title = kargs['title'] if 'title' in kargs else ''
+ self.default = kargs['default'] if 'default' in kargs else ""
+ self.extra = kargs['extra'] if 'extra' in kargs else None
+ self.extra_label = \
+ kargs['extra_label'] if 'extra_label' in kargs else 'Extra'
+ self.fallback = kargs['fallback'] if 'fallback' in kargs else None
+
+ def run(self, session, index, total):
+ d = session['dialog']
+ w = session['wizard']
+
+ extra_button = 1 if self.extra else 0
+
+ choices = self.choices()
+
+ if len(choices) == 0:
+ assert self.fallback, "Zero choices and no fallback"
+ if self.fallback():
+ raise WizardReloadPage
+ else:
+ return self.PREV
+
+ default_item = self.default if self.default else choices[0][0]
+
+ (code, choice) = d.menu(
+ self.message, width=PAGE_WIDTH, ok_label="Next", cancel="Back",
+ title="(%d/%d) %s" % (index + 1, total, self.title),
+ choices=choices, height=PAGE_HEIGHT, default_item=default_item,
+ extra_label=self.extra_label, extra_button=extra_button)
+
+ if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
+ return self.PREV
+ elif code == d.DIALOG_EXTRA:
+ self.extra()
+ raise WizardReloadPage
+
+ self.default = choice
+ w[self.name] = self.validate(choice)
+ self.info = "%s: %s" % (self.printable, self.display(w[self.name]))
+
+ return self.NEXT
+
+