Mercurial > libervia-web
changeset 516:1af112b97e45
browser_side: PromptDialog can display several input fields
author | souliane <souliane@mailoo.org> |
---|---|
date | Tue, 02 Sep 2014 21:05:32 +0200 |
parents | da690ef8019e |
children | 85699d18921f |
files | src/browser/sat_browser/dialog.py |
diffstat | 1 files changed, 40 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/browser/sat_browser/dialog.py Tue Aug 26 21:25:01 2014 +0200 +++ b/src/browser/sat_browser/dialog.py Tue Sep 02 21:05:32 2014 +0200 @@ -248,20 +248,26 @@ def __init__(self, widgets, callback, title='Confirmation', prompt=None, **kwargs): """ Dialog to confirm an action - @param widgets: widgets to attach + @param widgets (list[Widget]): widgets to attach @param callback: method to call when a button is clicked @param title: title of the dialog - @param prompt: textbox from which to retrieve the string value to be passed to the callback when - OK button is pressed. If None, OK button will return "True". Cancel button always returns "False". + @param prompt (TextBox, list[TextBox]): input widgets from which to retrieve + the string value(s) to be passed to the callback when OK button is pressed. + If None, OK button will return "True". Cancel button always returns "False". """ self.callback = callback DialogBox.__init__(self, centered=True, **kwargs) + if prompt is None: + prompt = [] + elif isinstance(prompt, TextBox): + prompt = [prompt] + content = VerticalPanel() content.setWidth('100%') for wid in widgets: content.add(wid) - if wid == prompt: + if wid in prompt: wid.setWidth('100%') button_panel = HorizontalPanel() button_panel.addStyleName("marginAuto") @@ -276,7 +282,8 @@ def onConfirm(self, sender): self.hide() - self.callback(self.prompt.getText() if self.prompt else True) + result = [box.getText() for box in self.prompt] if self.prompt else [True] + self.callback(*result) def onCancel(self, sender): self.hide() @@ -285,7 +292,7 @@ def show(self): DialogBox.show(self) if self.prompt: - self.prompt.setFocus(True) + self.prompt[0].setFocus(True) class ConfirmDialog(GenericConfirmDialog): @@ -340,10 +347,33 @@ class PromptDialog(GenericConfirmDialog): - def __init__(self, callback, text='', title='User input', **kwargs): - prompt = TextBox() - prompt.setText(text) - GenericConfirmDialog.__init__(self, [prompt], callback, title, prompt, **kwargs) + def __init__(self, callback, textes=None, values=None, title='User input', **kwargs): + """Prompt the user for one or more input(s). + + @param callback (callable): method to call when clicking OK + @param textes (str, list[str]): HTML textes to display before the inputs + @param values (str, list[str]): default values for each input + @param title (str): dialog title + """ + if textes is None: + textes = [''] # display a single input without any description + elif not isinstance(textes, list): + textes = [textes] # allow to pass a single string instead of a list + if values is None: + values = [] + elif not isinstance(values, list): + values = [values] # allow to pass a single string instead of a list + all_widgets = [] + prompt_widgets = [] + for count in xrange(len(textes)): + all_widgets.append(HTML(textes[count])) + prompt = TextBox() + if len(values) > count: + prompt.setText(values[count]) + all_widgets.append(prompt) + prompt_widgets.append(prompt) + + GenericConfirmDialog.__init__(self, all_widgets, callback, title, prompt_widgets, **kwargs) class PopupPanelWrapper(PopupPanel):