def ExtEntryRadioWindow(screen, title, text, prompts, allowCancel=1, width=40, entryWidth=20, buttons=['Ok', 'Cancel'], help=None, radio_prompts=''): bb = ButtonBar(screen, buttons, compact=1) t = TextboxReflowed(width, text) radio_grid = Grid(3, len(radio_prompts)) sg = Grid(2, len(prompts)) max_name_length = 0 for n in prompts: if isinstance(n, types.TupleType): n = n[0] if len(n) > max_name_length: max_name_length = len(n) radioList = parse_radio_prompts(radio_prompts, radio_grid, entryWidth, max_name_length) entryList = [] entry_row = 0 for n in prompts: if isinstance(n, types.TupleType): (n, e) = n if (type(e) in types.StringTypes): e = Entry(entryWidth, e) else: e = Entry(entryWidth) sg.setField(Label(n), 0, entry_row, padding=(0, 0, 1, 0), anchorLeft=1) sg.setField(e, 1, entry_row, anchorLeft=1) entry_row += 1 entryList.append(e) g = GridFormHelp(screen, title, help, 1, 4) g.add(t, 0, 0, padding=(0, 0, 0, 1)) g.add(radio_grid, 0, 1, padding=(0, 0, 0, 1)) g.add(sg, 0, 2, padding=(0, 0, 0, 1)) g.add(bb, 0, 3, growx=1) result = g.runOnce() entryValues = [] for rowRadioList in radioList: for radio, radio_text in rowRadioList: if radio.selected(): entryValues.append(radio_text) break for entry in entryList: entryValues.append(entry.value()) return (result, bb.buttonPressed(result), tuple(entryValues))
def JoinWindow(self, title, text, allowCancel=0, width=50, entryWidth=37, buttons=["Join"], hlp=None): bb = ButtonBar(self.screen, buttons) t = TextboxReflowed(width, text) sg = Grid(2, 2) entryList = [] e = Entry(entryWidth) sg.setField(Label("User name"), 0, 0, padding=(0, 0, 1, 0), anchorLeft=1) sg.setField(e, 1, 0, anchorLeft=1) entryList.append(e) e = Entry(entryWidth, password=1) sg.setField(Label("Password"), 0, 1, padding=(0, 0, 1, 0), anchorLeft=1) sg.setField(e, 1, 1, anchorLeft=1) entryList.append(e) g = GridForm(self.screen, title, 1, 3) g.add(t, 0, 0, padding=(0, 0, 0, 1)) g.add(sg, 0, 1, padding=(0, 0, 0, 1)) g.add(bb, 0, 2, growx=1) result = g.runOnce() entryValues = [] for entry in entryList: entryValues.append(entry.value()) return (bb.buttonPressed(result), tuple(entryValues))
def __init__(self, screen, title, item_count=0): self.screen = screen self.title = title self.current_item = 0 self.item_count = item_count g = Grid(1, 2) self.fnm_label = Textbox(40, 2, 'Downloading...', 0, 0) self.scale = Scale(40, 100) self.scale.set(0) g.setField(self.fnm_label, 0, 1) g.setField(self.scale, 0, 0) self.screen.gridWrappedWindow(g, title) self.f = Form() self.f.add(self.scale) self.f.add(self.fnm_label)
def ExtEntryWindow(screen, title, text, prompts, allowCancel=1, width=40, entryWidth=20, buttons=['Ok', 'Cancel'], help=None): bb = ButtonBar(screen, buttons, compact=1) t = TextboxReflowed(width, text) count = 0 for n in prompts: count = count + 1 sg = Grid(2, count) count = 0 entryList = [] for n in prompts: if isinstance(n, types.TupleType): (n, e) = n if (type(e) in types.StringTypes): e = Entry(entryWidth, e) else: e = Entry(entryWidth) sg.setField(Label(n), 0, count, padding=(0, 0, 1, 0), anchorLeft=1) sg.setField(e, 1, count, anchorLeft=1) count = count + 1 entryList.append(e) g = GridFormHelp(screen, title, help, 1, 3) g.add(t, 0, 0, padding=(0, 0, 0, 1)) g.add(sg, 0, 1, padding=(0, 0, 0, 1)) g.add(bb, 0, 2, growx=1) result = g.runOnce() entryValues = [] count = 0 for n in prompts: entryValues.append(entryList[count].value()) count = count + 1 return (result, bb.buttonPressed(result), tuple(entryValues))
def ConfirmationWindow(screen, title, infolist, width=40, buttons=["Start", "Modify", "Save", "Exit"], help=None): from snack import ButtonBar, Label, GridFormHelp, Textbox bb = ButtonBar(screen, buttons) ig = Grid(2, len(infolist)) i = 0 for _info in infolist: ig.setField(Label("%s: " % _info.getName()), 0, i, padding=(0, 0, 1, 0), anchorLeft=1) ig.setField(Label("%s" % _info.getValue()), 1, i, padding=(0, 0, 1, 0), anchorLeft=1) i = i + 1 g = GridFormHelp(screen, title, help, 1, 3) g.add(Textbox(20, 1, "Current settings:"), 0, 0, padding=(0, 0, 0, 1), anchorLeft=1) g.add(ig, 0, 1, padding=(0, 0, 0, 1)) g.add(bb, 0, 2, growx=1) result = g.runOnce() return bb.buttonPressed(result)
def create_grid_from_fields(self, fields): ''' Takes a series of fields names and values and returns a Grid composed of Labels for that screen. If the value element is specified, it can be either a String or else one of the UI widgets. Keyword arguments: fields -- A two-dimensional array of label and value pairs. ''' grid = Grid(2, len(fields)) row = 0 for field in fields: if field[1] is not None: grid.setField(Label("%s : " % field[0]), 0, row, anchorRight=1) # if the value is a String, then wrap it in a Label # otherwise just add it value = field[1] if type(value) == StringType: value = Label(field[1]) grid.setField(value, 1, row, anchorLeft=1) else: # here the label itself might be a string or a widget value = field[0] if type(value) == StringType: value = Label(field[0]) grid.setField(value, 0, row) row += 1 return grid
def ConfirmationWindow(screen, title, infolist, width=40, buttons=['Start', 'Modify', 'Save', 'Exit'], help=None): from snack import ButtonBar, Label, GridFormHelp, Textbox bb = ButtonBar(screen, buttons) ig = Grid(2, len(infolist)) i = 0 for _info in infolist: ig.setField(Label("%s: " % _info.getName()), 0, i, padding=(0, 0, 1, 0), anchorLeft=1) ig.setField(Label("%s" % _info.getValue()), 1, i, padding=(0, 0, 1, 0), anchorLeft=1) i = i + 1 g = GridFormHelp(screen, title, help, 1, 3) g.add(Textbox(20, 1, "Current settings:"), 0, 0, padding=(0, 0, 0, 1), anchorLeft=1) g.add(ig, 0, 1, padding=(0, 0, 0, 1)) g.add(bb, 0, 2, growx=1) result = g.runOnce() return (bb.buttonPressed(result))
def form(self): elements = Grid(2, 8) is_network_up = network_up() if is_network_up: header_message = "RHEV-M Configuration" else: header_message = "Network Down, RHEV-M Configuration Disabled" heading = Label(header_message) self.ncs.screen.setColor(customColorset(1), "black", "magenta") heading.setColors(customColorset(1)) elements.setField(heading, 0, 0, anchorLeft=1) rhevm_grid = Grid(2, 2) rhevm_grid.setField(Label("Management Server:"), 0, 0, anchorLeft=1) self.rhevm_server = Entry(25, "") self.rhevm_server.setCallback(self.valid_rhevm_server_callback) rhevm_grid.setField(Label("Management Server Port:"), 0, 1, anchorLeft=1) self.rhevm_server_port = Entry(6, "", scroll=0) self.rhevm_server_port.setCallback( self.valid_rhevm_server_port_callback) rhevm_grid.setField(self.rhevm_server, 1, 0, anchorLeft=1, padding=(2, 0, 0, 1)) rhevm_grid.setField(self.rhevm_server_port, 1, 1, anchorLeft=1, padding=(2, 0, 0, 1)) elements.setField(rhevm_grid, 0, 1, anchorLeft=1, padding=(0, 0, 0, 0)) elements.setField(Label(""), 0, 2, anchorLeft=1) self.verify_rhevm_cert = Checkbox( "Connect to RHEV Manager and Validate Certificate", isOn=True) elements.setField(self.verify_rhevm_cert, 0, 3, anchorLeft=1, padding=(0, 0, 0, 0)) elements.setField(Label(""), 0, 4, anchorLeft=1) elements.setField(Label("Set RHEV-M Admin Password"), 0, 5, anchorLeft=1) pw_elements = Grid(3, 3) pw_elements.setField(Label("Password: "******"Confirm Password: "******"", wrap=1) elements.setField(pw_elements, 0, 6, anchorLeft=1) elements.setField(self.pw_msg, 0, 7, padding=(0, 0, 0, 0)) inputFields = [ self.rhevm_server, self.rhevm_server_port, self.verify_rhevm_cert, self.root_password_1, self.root_password_2 ] if not is_network_up: for field in inputFields: field.setFlags(FLAG_DISABLED, FLAGS_SET) try: rhevm_server = get_rhevm_config() rhevm_server, rhevm_port = rhevm_server.split(":") if rhevm_server.startswith("None"): self.rhevm_server.set("") else: self.rhevm_server.set(rhevm_server) self.rhevm_server_port.set(rhevm_port) except: pass return [Label(""), elements]
def form(self): elements = Grid(2, 8) is_network_up = network_up() if is_network_up: header_message = "oVirt Engine Configuration" else: header_message = "Network Down, oVirt Engine Configuration Disabled" heading = Label(header_message) self.ncs.screen.setColor(customColorset(1), "black", "magenta") heading.setColors(customColorset(1)) elements.setField(heading, 0, 0, anchorLeft = 1) rhevm_grid = Grid(2,2) rhevm_grid.setField(Label("Management Server:"), 0, 0, anchorLeft = 1) self.rhevm_server = Entry(25, "") self.rhevm_server.setCallback(self.valid_rhevm_server_callback) rhevm_grid.setField(Label("Management Server Port:"), 0, 1, anchorLeft = 1) self.rhevm_server_port = Entry(6, "", scroll = 0) self.rhevm_server_port.setCallback(self.valid_rhevm_server_port_callback) rhevm_grid.setField(self.rhevm_server, 1, 0, anchorLeft = 1, padding=(2, 0, 0, 1)) rhevm_grid.setField(self.rhevm_server_port, 1, 1, anchorLeft = 1, padding=(2, 0, 0, 1)) elements.setField(rhevm_grid, 0, 1, anchorLeft = 1, padding = (0,0,0,0)) elements.setField(Label(""), 0, 2, anchorLeft = 1) self.verify_rhevm_cert = Checkbox("Connect to oVirt Engine and Validate Certificate", isOn=True) elements.setField(self.verify_rhevm_cert, 0, 3, anchorLeft = 1, padding = (0,0,0,0)) elements.setField(Label(""), 0, 4, anchorLeft = 1) elements.setField(Label("Set oVirt Engine Admin Password"), 0, 5, anchorLeft = 1) pw_elements = Grid(3,3) pw_elements.setField(Label("Password: "******"Confirm Password: "******"", wrap=1) elements.setField(pw_elements, 0, 6, anchorLeft=1) elements.setField(self.pw_msg, 0, 7, padding = (0,0,0,0)) inputFields = [self.rhevm_server, self.rhevm_server_port, self.verify_rhevm_cert, self.root_password_1, self.root_password_2] if not is_network_up: for field in inputFields: field.setFlags(FLAG_DISABLED, FLAGS_SET) try: rhevm_server = get_rhevm_config() rhevm_server,rhevm_port = rhevm_server.split(":") if rhevm_server.startswith("None"): self.rhevm_server.set("") else: self.rhevm_server.set(rhevm_server) self.rhevm_server_port.set(rhevm_port) except: pass return [Label(""), elements]
def EntryWindow(screen, title, text, prompts, allowCancel=1, width=40, entryWidth=20, buttons=[ 'Ok', 'Cancel' ], help=None, timer_ms=None, anchorLeft=0, anchorRight=1, secondary_message=None, secondary_message_width=None, run_type=RT_EXECUTEANDPOP): # Dustin: Added timer_ms parameter. Added secondary_message arguments. # Added result boolean for whether ESC was pressed. Added # anchorLeft and anchorRight as arguments to this function. Added # secondary_message (test below primary text). Results are now # dictionaries. Added auto_pop parameter. bb = ButtonBar(screen, buttons); t = TextboxReflowed(width, text) count = 0 for n in prompts: count = count + 1 sg = Grid(2, count) count = 0 entryList = [] for n in prompts: if (type(n) == tuple): (n, e) = n if issubclass(e.__class__, str): e = Entry(entryWidth, e) else: e = Entry(entryWidth) sg.setField(Label(n), 0, count, padding=(0, 0, 1, 0), anchorLeft=anchorLeft, anchorRight=anchorRight) sg.setField(e, 1, count, anchorLeft = 1) count = count + 1 entryList.append(e) g = GridFormHelp(screen, title, help, 1, 3 + (1 if secondary_message else 0)) row = 0 g.add(t, 0, row, padding = (0, 0, 0, 1)) row += 1 if secondary_message: if not secondary_message_width: secondary_message_width = width t2 = TextboxReflowed(secondary_message_width, secondary_message) g.add(t2, 0, row, padding = (0, 0, 0, 1)) row += 1 g.add(sg, 0, row, padding = (0, 0, 0, 1)) row += 1 g.add(bb, 0, row, growx = 1) row += 1 if timer_ms: g.form.w.settimer(timer_ms) (button, is_esc) = ActivateWindow(g, run_type, bb) entryValues = [] count = 0 for n in prompts: entryValues.append(entryList[count].value()) count = count + 1 return {'button': button, 'is_esc': is_esc, 'values': tuple(entryValues), 'grid': g, }
class SnackInterface(): def __init__(self, margin, title, message=None, vendor_text=None, args=None): self.debug_mode = args is not None and args.debug self.screen = SnackScreen() # set usual colors for i in colorsets["ROOT"], colorsets["ROOTTEXT"], colorsets[ "HELPLINE"], colorsets["EMPTYSCALE"]: self.screen.setColor(i, "white", "blue") if not self.debug_mode else \ self.screen.setColor(i, "brightgreen", "black") # remove silly default help text self.screen.popHelpLine() # write static messages self.screen.drawRootText((self.screen.width - len(message)) // 2, 4, message) self.screen.drawRootText(-len(vendor_text) - 2, -2, vendor_text) if self.debug_mode: # write some static debug information self.screen.drawRootText(1, 1, _("DEBUG MODE")) self.screen.drawRootText( 2, 2, "screen {}×{}".format(self.screen.width, self.screen.height)) self.screen.drawRootText(2, 3, "file {}".format(args.input)) self.window_width = self.screen.width - margin * 2 # assemble our progress bar self.scale = Scale(self.window_width, 100) self.spacer = Label("") self.taskbox = Textbox(self.window_width - 2, 1, "") self.messagebox = Textbox(self.window_width - 8, 1, " . . . ") self.grid = Grid(1, 4) self.grid.setField(self.scale, 0, 0) self.grid.setField(self.spacer, 0, 1) self.grid.setField(self.taskbox, 0, 2) self.grid.setField(self.messagebox, 0, 3) self.grid.place(1, 1) self.screen.gridWrappedWindow(self.grid, title) self.form = Form() self.form.add(self.scale) self.form.add(self.taskbox) self.form.add(self.messagebox) self.form.draw() self.screen.refresh() def update_task(self, percent, task, description): self.taskbox.setText(description) self.update(percent, "") def update(self, percent, text=None): progress = int(percent) self.scale.set(progress) self.form.draw() self.screen.refresh() if text is not None: self.messagebox.setText(text) self.form.draw() self.screen.refresh() def debug(self, message): self.screen.popHelpLine() self.screen.pushHelpLine("[DEBUG] {}".format(message)) self.screen.refresh() def cleanup(self): self.screen.popWindow() self.screen.finish()