def _add_items(self, content, outer=None): """Adds a list of Item objects, creating a layout if needed. Return the outermost layout. """ # Get local references to various objects we need: ui = self.ui info = ui.info handler = ui.handler group = self.group show_left = group.show_left padding = group.padding columns = group.columns # See if a label is needed. show_labels = False for item in content: show_labels |= item.show_label # See if a grid layout is needed. if show_labels or columns > 1: inner = QtGui.QGridLayout() if outer is None: outer = inner else: outer.addLayout(inner) row = 0 if show_left: label_alignment = QtCore.Qt.AlignRight else: label_alignment = QtCore.Qt.AlignLeft else: # Use the existing layout if there is one. if outer is None: outer = QtGui.QBoxLayout(self.direction) inner = outer row = -1 label_alignment = 0 # Process each Item in the list: col = -1 for item in content: # Keep a track of the current logical row and column unless the # layout is not a grid. col += 1 if row >= 0 and col >= columns: col = 0 row += 1 # Get the name in order to determine its type: name = item.name # Check if is a label: if name == '': label = item.label if label != "": # Create the label widget. if item.style == 'simple': label = QtGui.QLabel(label) else: label = heading_text(None, text=label).control self._add_widget(inner, label, row, col, show_labels) if item.emphasized: self._add_emphasis(label) # Continue on to the next Item in the list: continue # Check if it is a separator: if name == '_': cols = columns # See if the layout is a grid. if row >= 0: # Move to the start of the next row if necessary. if col > 0: col = 0 row += 1 # Skip the row we are about to do. row += 1 # Allow for the columns. if show_labels: cols *= 2 for i in range(cols): line = QtGui.QFrame() if self.direction == QtGui.QBoxLayout.LeftToRight: # Add a vertical separator: line.setFrameShape(QtGui.QFrame.VLine) if row < 0: inner.addWidget(line) else: inner.addWidget(line, i, row) else: # Add a horizontal separator: line.setFrameShape(QtGui.QFrame.HLine) if row < 0: inner.addWidget(line) else: inner.addWidget(line, row, i) line.setFrameShadow(QtGui.QFrame.Sunken) # Continue on to the next Item in the list: continue # Convert a blank to a 5 pixel spacer: if name == ' ': name = '5' # Check if it is a spacer: if all_digits.match( name ): # If so, add the appropriate amount of space to the layout: n = int( name ) if self.direction == QtGui.QBoxLayout.LeftToRight: # Add a horizontal spacer: spacer = QtGui.QSpacerItem(n, 1) else: # Add a vertical spacer: spacer = QtGui.QSpacerItem(1, n) self._add_widget(inner, spacer, row, col, show_labels) # Continue on to the next Item in the list: continue # Otherwise, it must be a trait Item: object = eval( item.object_, globals(), ui.context ) trait = object.base_trait( name ) desc = trait.desc or '' fixed_width = False # Handle any label. if item.show_label: label = self._create_label(item, ui, desc) self._add_widget(inner, label, row, col, show_labels, label_alignment) else: label = None # Get the editor factory associated with the Item: editor_factory = item.editor if editor_factory is None: editor_factory = trait.get_editor() # If still no editor factory found, use a default text editor: if editor_factory is None: from text_editor import ToolkitEditorFactory editor_factory = ToolkitEditorFactory() # If the item has formatting traits set them in the editor # factory: if item.format_func is not None: editor_factory.format_func = item.format_func if item.format_str != '': editor_factory.format_str = item.format_str # If the item has an invalid state extended trait name, set it # in the editor factory: if item.invalid != '': editor_factory.invalid = item.invalid # Create the requested type of editor from the editor factory: factory_method = getattr( editor_factory, item.style + '_editor' ) editor = factory_method( ui, object, name, item.tooltip, None).set( item = item, object_name = item.object ) # Tell the editor to actually build the editing widget. Note that # "inner" is a layout. This shouldn't matter as individual editors # shouldn't be using it as a parent anyway. The important thing is # that it is not None (otherwise the main TraitsUI code can change # the "kind" of the created UI object). editor.prepare(inner) control = editor.control # Set the initial 'enabled' state of the editor from the factory: editor.enabled = editor_factory.enabled # Add emphasis to the editor control if requested: if item.emphasized: self._add_emphasis(control) # Give the editor focus if it requested it: if item.has_focus: control.setFocus() # Set the correct size on the control, as specified by the user: stretch = 0 scrollable = editor.scrollable item_width = item.width item_height = item.height if (item_width != -1) or (item_height != -1): is_horizontal = (self.direction == QtGui.QBoxLayout.LeftToRight) min_size = control.minimumSizeHint() width = min_size.width() height = min_size.height() if (0.0 < item_width <= 1.0) and is_horizontal: stretch = int(100 * item_width) item_width = int(item_width) if item_width < -1: item_width = -item_width else: item_width = max(item_width, width) if (0.0 < item_height <= 1.0) and (not is_horizontal): stretch = int(100 * item_height) item_height = int(item_height) if item_height < -1: item_height = -item_height else: item_height = max(item_height, height) control.setMinimumWidth(max(item_width, 0)) control.setMinimumHeight(max(item_height, 0)) # Bind the editor into the UIInfo object name space so it can be # referred to by a Handler while the user interface is active: id = item.id or name info.bind( id, editor, item.id ) # Also, add the editors to the list of editors used to construct # the user interface: ui._editors.append( editor ) # If the handler wants to be notified when the editor is created, # add it to the list of methods to be called when the UI is # complete: defined = getattr( handler, id + '_defined', None ) if defined is not None: ui.add_defined( defined ) # If the editor is conditionally visible, add the visibility # 'expression' and the editor to the UI object's list of monitored # objects: if item.visible_when != '': ui.add_visible( item.visible_when, editor ) # If the editor is conditionally enabled, add the enabling # 'expression' and the editor to the UI object's list of monitored # objects: if item.enabled_when != '': ui.add_enabled( item.enabled_when, editor ) # Add the created editor control to the layout with the appropriate # size and stretch policies: ui._scrollable |= scrollable item_resizable = ((item.resizable is True) or ((item.resizable is Undefined) and scrollable)) if item_resizable: stretch = stretch or 50 self.resizable = True elif item.springy: stretch = stretch or 50 policy = control.sizePolicy() if self.direction == QtGui.QBoxLayout.LeftToRight: policy.setHorizontalStretch(stretch) if item_resizable or item.springy: policy.setHorizontalPolicy(QtGui.QSizePolicy.Expanding) else: policy.setVerticalStretch(stretch) if item_resizable or item.springy: policy.setVerticalPolicy(QtGui.QSizePolicy.Expanding) control.setSizePolicy(policy) # FIXME: Need to decide what to do about border_size and padding self._add_widget(inner, control, row, col, show_labels) # Save the reference to the label control (if any) in the editor: editor.label_control = label return outer
def add_items(self, content, panel, sizer): """ Adds a list of Item objects to the panel. """ # Get local references to various objects we need: ui = self.ui info = ui.info handler = ui.handler group = self.group show_left = group.show_left padding = group.padding col = -1 col_incr = 1 self.label_flags = 0 show_labels = False for item in content: show_labels |= item.show_label if (not self.is_horizontal) and (show_labels or (group.columns > 1)): # For a vertical list of Items with labels or multiple columns, use # a 'FlexGridSizer': self.label_pad = 0 cols = group.columns if show_labels: cols *= 2 col_incr = 2 flags = wx.TOP | wx.BOTTOM border_size = 1 item_sizer = wx.FlexGridSizer(0, cols, 0, 5) if show_left: self.label_flags = wx.ALIGN_RIGHT if show_labels: for i in range(1, cols, 2): item_sizer.AddGrowableCol(i) else: # Otherwise, the current sizer will work as is: self.label_pad = 4 cols = 1 flags = wx.ALL border_size = 1 item_sizer = sizer # Process each Item in the list: for item in content: # Get the name in order to determine its type: name = item.name # Check if is a label: if name == '': label = item.label if label != '': # Update the column counter: col += col_incr # If we are building a multi-column layout with labels, # just add space in the next column: if (cols > 1) and show_labels: item_sizer.Add((1, 1)) if item.style == 'simple': # Add a simple text label: label = wx.StaticText(panel, -1, label, style=wx.ALIGN_LEFT) item_sizer.Add(label, 0, wx.EXPAND) else: # Add the label to the sizer: label = heading_text(panel, text=label).control item_sizer.Add(label, 0, wx.TOP | wx.BOTTOM | wx.EXPAND, 3) if item.emphasized: self._add_emphasis(label) # Continue on to the next Item in the list: continue # Update the column counter: col += col_incr # Check if it is a separator: if name == '_': for i in range(cols): if self.is_horizontal: # Add a vertical separator: line = wx.StaticLine(panel, -1, style=wx.LI_VERTICAL) item_sizer.Add(line, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, 2) else: # Add a horizontal separator: line = wx.StaticLine(panel, -1, style=wx.LI_HORIZONTAL) item_sizer.Add(line, 0, wx.TOP | wx.BOTTOM | wx.EXPAND, 2) self._set_owner(line, item) # Continue on to the next Item in the list: continue # Convert a blank to a 5 pixel spacer: if name == ' ': name = '5' # Check if it is a spacer: if all_digits.match(name): # If so, add the appropriate amount of space to the sizer: n = int(name) if self.is_horizontal: item_sizer.Add((n, 1)) else: spacer = (1, n) item_sizer.Add(spacer) if show_labels: item_sizer.Add(spacer) # Continue on to the next Item in the list: continue # Otherwise, it must be a trait Item: object = eval(item.object_, globals(), ui.context) trait = object.base_trait(name) desc = trait.desc or '' label = None # If we are displaying labels on the left, add the label to the # user interface: if show_left: if item.show_label: label = self.create_label(item, ui, desc, panel, item_sizer, border=group.show_border) elif (cols > 1) and show_labels: label = self.dummy_label(panel, item_sizer) # Get the editor factory associated with the Item: editor_factory = item.editor if editor_factory is None: editor_factory = trait.get_editor() # If still no editor factory found, use a default text editor: if editor_factory is None: from text_editor import ToolkitEditorFactory editor_factory = ToolkitEditorFactory() # If the item has formatting traits set them in the editor # factory: if item.format_func is not None: editor_factory.format_func = item.format_func if item.format_str != '': editor_factory.format_str = item.format_str # If the item has an invalid state extended trait name, set it # in the editor factory: if item.invalid != '': editor_factory.invalid = item.invalid # Set up the background image (if used): item_panel = panel # Create the requested type of editor from the editor factory: factory_method = getattr(editor_factory, item.style + '_editor') editor = factory_method(ui, object, name, item.tooltip, item_panel).trait_set( item=item, object_name=item.object) # Tell editor to actually build the editing widget: editor.prepare(item_panel) # Set the initial 'enabled' state of the editor from the factory: editor.enabled = editor_factory.enabled # Add emphasis to the editor control if requested: if item.emphasized: self._add_emphasis(editor.control) # Give the editor focus if it requested it: if item.has_focus: editor.control.SetFocus() # Adjust the maximum border size based on the editor's settings: border_size = min(border_size, editor.border_size) # Set up the reference to the correct 'control' to use in the # following section, depending upon whether we have wrapped an # ImagePanel around the editor control or not: control = editor.control width, height = control.GetSizeTuple() # Set the correct size on the control, as specified by the user: scrollable = editor.scrollable item_width = item.width item_height = item.height growable = 0 if (item_width != -1.0) or (item_height != -1.0): if (0.0 < item_width <= 1.0) and self.is_horizontal: growable = int(1000.0 * item_width) item_width = -1 item_width = int(item_width) if item_width < -1: item_width = -item_width elif item_width != -1: item_width = max(item_width, width) if (0.0 < item_height <= 1.0) and (not self.is_horizontal): growable = int(1000.0 * item_height) item_height = -1 item_height = int(item_height) if item_height < -1: item_height = -item_height elif item_height != -1: item_height = max(item_height, height) control.SetMinSize(wx.Size(item_width, item_height)) # Bind the item to the control and all of its children: self._set_owner(control, item) # Bind the editor into the UIInfo object name space so it can be # referred to by a Handler while the user interface is active: id = item.id or name info.bind(id, editor, item.id) # Also, add the editors to the list of editors used to construct # the user interface: ui._editors.append(editor) # If the handler wants to be notified when the editor is created, # add it to the list of methods to be called when the UI is # complete: defined = getattr(handler, id + '_defined', None) if defined is not None: ui.add_defined(defined) # If the editor is conditionally visible, add the visibility # 'expression' and the editor to the UI object's list of monitored # objects: if item.visible_when != '': ui.add_visible(item.visible_when, editor) # If the editor is conditionally enabled, add the enabling # 'expression' and the editor to the UI object's list of monitored # objects: if item.enabled_when != '': ui.add_enabled(item.enabled_when, editor) # Add the created editor control to the sizer with the appropriate # layout flags and values: ui._scrollable |= scrollable item_resizable = ((item.resizable is True) or ((item.resizable is Undefined) and scrollable)) if item_resizable: growable = growable or 500 self.resizable = True elif item.springy: growable = growable or 500 # The following is a hack to allow 'readonly' text fields to # work correctly (wx has a bug that setting wx.EXPAND on a # StaticText control seems to cause the text to be aligned higher # than it would be otherwise, causing it to misalign with its # label). layout_style = editor.layout_style if not show_labels: layout_style |= wx.EXPAND item_sizer.Add(control, growable, flags | layout_style | wx.ALIGN_CENTER_VERTICAL, max(0, border_size + padding + item.padding)) # If we are displaying labels on the right, add the label to the # user interface: if not show_left: if item.show_label: label = self.create_label(item, ui, desc, panel, item_sizer, '', wx.RIGHT) elif (cols > 1) and show_labels: label = self.dummy_label(panel, item_sizer) # If the Item is resizable, and we are using a multi-column grid: if item_resizable and (cols > 1): # Mark the entire row as growable: item_sizer.AddGrowableRow(col / cols) # Save the reference to the label control (if any) in the editor: editor.label_control = label # If we created a grid sizer, add it to the original sizer: if item_sizer is not sizer: growable = 0 if self.resizable: growable = 1 sizer.Add(item_sizer, growable, wx.EXPAND | wx.ALL, 2)
def _add_items(self, content, outer=None): """Adds a list of Item objects, creating a layout if needed. Return the outermost layout. """ # Get local references to various objects we need: ui = self.ui info = ui.info handler = ui.handler group = self.group show_left = group.show_left columns = group.columns # See if a label is needed. show_labels = False for item in content: show_labels |= item.show_label # See if a grid layout is needed. if show_labels or columns > 1: inner = QtGui.QGridLayout() if outer is None: outer = inner else: outer.addLayout(inner) row = 0 if show_left: label_alignment = QtCore.Qt.AlignRight else: label_alignment = QtCore.Qt.AlignLeft else: # Use the existing layout if there is one. if outer is None: outer = QtGui.QBoxLayout(self.direction) inner = outer row = -1 label_alignment = 0 # Process each Item in the list: col = -1 for item in content: # Keep a track of the current logical row and column unless the # layout is not a grid. col += 1 if row >= 0 and col >= columns: col = 0 row += 1 # Get the name in order to determine its type: name = item.name # Check if is a label: if name == '': label = item.label if label != "": # Create the label widget. if item.style == 'simple': label = QtGui.QLabel(label) else: label = heading_text(None, text=label).control self._add_widget(inner, label, row, col, show_labels) if item.emphasized: self._add_emphasis(label) # Continue on to the next Item in the list: continue # Check if it is a separator: if name == '_': cols = columns # See if the layout is a grid. if row >= 0: # Move to the start of the next row if necessary. if col > 0: col = 0 row += 1 # Skip the row we are about to do. row += 1 # Allow for the columns. if show_labels: cols *= 2 for i in range(cols): line = QtGui.QFrame() if self.direction == QtGui.QBoxLayout.LeftToRight: # Add a vertical separator: line.setFrameShape(QtGui.QFrame.VLine) if row < 0: inner.addWidget(line) else: inner.addWidget(line, i, row) else: # Add a horizontal separator: line.setFrameShape(QtGui.QFrame.HLine) if row < 0: inner.addWidget(line) else: inner.addWidget(line, row, i) line.setFrameShadow(QtGui.QFrame.Sunken) # Continue on to the next Item in the list: continue # Convert a blank to a 5 pixel spacer: if name == ' ': name = '5' # Check if it is a spacer: if all_digits.match(name): # If so, add the appropriate amount of space to the layout: n = int(name) if self.direction == QtGui.QBoxLayout.LeftToRight: # Add a horizontal spacer: spacer = QtGui.QSpacerItem(n, 1) else: # Add a vertical spacer: spacer = QtGui.QSpacerItem(1, n) self._add_widget(inner, spacer, row, col, show_labels) # Continue on to the next Item in the list: continue # Otherwise, it must be a trait Item: object = eval(item.object_, globals(), ui.context) trait = object.base_trait(name) desc = trait.desc or '' # Get the editor factory associated with the Item: editor_factory = item.editor if editor_factory is None: editor_factory = trait.get_editor().set(**item.editor_args) # If still no editor factory found, use a default text editor: if editor_factory is None: from text_editor import ToolkitEditorFactory editor_factory = ToolkitEditorFactory() # If the item has formatting traits set them in the editor # factory: if item.format_func is not None: editor_factory.format_func = item.format_func if item.format_str != '': editor_factory.format_str = item.format_str # If the item has an invalid state extended trait name, set it # in the editor factory: if item.invalid != '': editor_factory.invalid = item.invalid # Create the requested type of editor from the editor factory: factory_method = getattr(editor_factory, item.style + '_editor') editor = factory_method( ui, object, name, item.tooltip, None ).set(item=item, object_name=item.object) # Tell the editor to actually build the editing widget. Note that # "inner" is a layout. This shouldn't matter as individual editors # shouldn't be using it as a parent anyway. The important thing is # that it is not None (otherwise the main TraitsUI code can change # the "kind" of the created UI object). editor.prepare(inner) control = editor.control if item.style_sheet: control.setStyleSheet(item.style_sheet) # Set the initial 'enabled' state of the editor from the factory: editor.enabled = editor_factory.enabled # Handle any label. if item.show_label: label = self._create_label(item, ui, desc) self._add_widget(inner, label, row, col, show_labels, label_alignment) else: label = None editor.label_control = label # Add emphasis to the editor control if requested: if item.emphasized: self._add_emphasis(control) # Give the editor focus if it requested it: if item.has_focus: control.setFocus() # Set the correct size on the control, as specified by the user: stretch = 0 item_width = item.width item_height = item.height if (item_width != -1) or (item_height != -1): is_horizontal = ( self.direction == QtGui.QBoxLayout.LeftToRight) min_size = control.minimumSizeHint() width = min_size.width() height = min_size.height() force_width = False force_height = False if (0.0 < item_width <= 1.0) and is_horizontal: stretch = int(100 * item_width) item_width = int(item_width) if item_width < -1: item_width = -item_width force_width = True else: item_width = max(item_width, width) if (0.0 < item_height <= 1.0) and (not is_horizontal): stretch = int(100 * item_height) item_height = int(item_height) if item_height < -1: item_height = -item_height force_height = True else: item_height = max(item_height, height) control.setMinimumWidth(max(item_width, 0)) control.setMinimumHeight(max(item_height, 0)) if (stretch == 0 or not is_horizontal) and force_width: control.setMaximumWidth(item_width) if (stretch == 0 or is_horizontal) and force_height: control.setMaximumHeight(item_height) # Set size and stretch policies self._set_item_size_policy(editor, item, label, stretch) # Add the created editor control to the layout # FIXME: Need to decide what to do about border_size and padding self._add_widget(inner, control, row, col, show_labels) # ---- Update the UI object # Bind the editor into the UIInfo object name space so it can be # referred to by a Handler while the user interface is active: id = item.id or name info.bind(id, editor, item.id) self.ui._scrollable |= editor.scrollable # Also, add the editors to the list of editors used to construct # the user interface: ui._editors.append(editor) # If the handler wants to be notified when the editor is created, # add it to the list of methods to be called when the UI is # complete: defined = getattr(handler, id + '_defined', None) if defined is not None: ui.add_defined(defined) # If the editor is conditionally visible, add the visibility # 'expression' and the editor to the UI object's list of monitored # objects: if item.visible_when != '': ui.add_visible(item.visible_when, editor) # If the editor is conditionally enabled, add the enabling # 'expression' and the editor to the UI object's list of monitored # objects: if item.enabled_when != '': ui.add_enabled(item.enabled_when, editor) return outer
def add_items(self, content, panel, sizer): """ Adds a list of Item objects to the panel. """ # Get local references to various objects we need: ui = self.ui info = ui.info handler = ui.handler group = self.group show_left = group.show_left padding = group.padding col = -1 col_incr = 1 self.label_flags = 0 show_labels = False for item in content: show_labels |= item.show_label if (not self.is_horizontal) and (show_labels or (group.columns > 1)): # For a vertical list of Items with labels or multiple columns, use # a 'FlexGridSizer': self.label_pad = 0 cols = group.columns if show_labels: cols *= 2 col_incr = 2 flags = wx.TOP | wx.BOTTOM border_size = 1 item_sizer = wx.FlexGridSizer(0, cols, 0, 5) if show_left: self.label_flags = wx.ALIGN_RIGHT if show_labels: for i in range(1, cols, 2): item_sizer.AddGrowableCol(i) else: # Otherwise, the current sizer will work as is: self.label_pad = 4 cols = 1 flags = wx.ALL border_size = 1 item_sizer = sizer # Process each Item in the list: for item in content: # Get the item theme (if any): theme = item.item_theme # Get the name in order to determine its type: name = item.name # Check if is a label: if name == "": label = item.label if label != "": # Update the column counter: col += col_incr # If we are building a multi-column layout with labels, # just add space in the next column: if (cols > 1) and show_labels: item_sizer.Add((1, 1)) if theme is not None: from image_text import ImageText label = ImageText(panel, theme, label) item_sizer.Add(label, 0, wx.EXPAND) elif item.style == "simple": # Add a simple text label: label = wx.StaticText(panel, -1, label, style=wx.ALIGN_LEFT) item_sizer.Add(label, 0, wx.EXPAND) else: # Add the label to the sizer: label = heading_text(panel, text=label).control item_sizer.Add(label, 0, wx.TOP | wx.BOTTOM | wx.EXPAND, 3) if item.emphasized: self._add_emphasis(label) # Continue on to the next Item in the list: continue # Update the column counter: col += col_incr # Check if it is a separator: if name == "_": for i in range(cols): if self.is_horizontal: # Add a vertical separator: line = wx.StaticLine(panel, -1, style=wx.LI_VERTICAL) item_sizer.Add(line, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, 2) else: # Add a horizontal separator: line = wx.StaticLine(panel, -1, style=wx.LI_HORIZONTAL) item_sizer.Add(line, 0, wx.TOP | wx.BOTTOM | wx.EXPAND, 2) self._set_owner(line, item) # Continue on to the next Item in the list: continue # Convert a blank to a 5 pixel spacer: if name == " ": name = "5" # Check if it is a spacer: if all_digits.match(name): # If so, add the appropriate amount of space to the sizer: n = int(name) if self.is_horizontal: item_sizer.Add((n, 1)) else: spacer = (1, n) item_sizer.Add(spacer) if show_labels: item_sizer.Add(spacer) # Continue on to the next Item in the list: continue # Otherwise, it must be a trait Item: object = eval(item.object_, globals(), ui.context) trait = object.base_trait(name) desc = trait.desc or "" label = None # If we are displaying labels on the left, add the label to the # user interface: if show_left: if item.show_label: label = self.create_label(item, ui, desc, panel, item_sizer, border=group.show_border) elif (cols > 1) and show_labels: label = self.dummy_label(panel, item_sizer) # Get the editor factory associated with the Item: editor_factory = item.editor if editor_factory is None: editor_factory = trait.get_editor() # If still no editor factory found, use a default text editor: if editor_factory is None: from text_editor import ToolkitEditorFactory editor_factory = ToolkitEditorFactory() # If the item has formatting traits set them in the editor # factory: if item.format_func is not None: editor_factory.format_func = item.format_func if item.format_str != "": editor_factory.format_str = item.format_str # If the item has an invalid state extended trait name, set it # in the editor factory: if item.invalid != "": editor_factory.invalid = item.invalid # Set up the background image (if used): item_panel = panel if theme is not None: from image_panel import ImagePanel text = "" if item.show_label: text = item.get_label(ui) image_panel = ImagePanel(theme=theme, text=text) item_panel = image_panel.create_control(panel) # Create the requested type of editor from the editor factory: factory_method = getattr(editor_factory, item.style + "_editor") editor = factory_method(ui, object, name, item.tooltip, item_panel).set(item=item, object_name=item.object) # Tell editor to actually build the editing widget: editor.prepare(item_panel) # Set the initial 'enabled' state of the editor from the factory: editor.enabled = editor_factory.enabled # Add emphasis to the editor control if requested: if item.emphasized: self._add_emphasis(editor.control) # Give the editor focus if it requested it: if item.has_focus: editor.control.SetFocus() # Adjust the maximum border size based on the editor's settings: border_size = min(border_size, editor.border_size) # Set up the reference to the correct 'control' to use in the # following section, depending upon whether we have wrapped an # ImagePanel around the editor control or not: control = editor.control if theme is None: width, height = control.GetSizeTuple() else: item_panel.GetSizer().Add(control, 1, wx.EXPAND) control = item_panel width, height = image_panel.adjusted_size # Set the correct size on the control, as specified by the user: scrollable = editor.scrollable item_width = item.width item_height = item.height growable = 0 if (item_width != -1.0) or (item_height != -1.0): if (0.0 < item_width <= 1.0) and self.is_horizontal: growable = int(1000.0 * item_width) item_width = -1 item_width = int(item_width) if item_width < -1: item_width = -item_width elif item_width != -1: item_width = max(item_width, width) if (0.0 < item_height <= 1.0) and (not self.is_horizontal): growable = int(1000.0 * item_height) item_height = -1 item_height = int(item_height) if item_height < -1: item_height = -item_height elif item_height != -1: item_height = max(item_height, height) control.SetMinSize(wx.Size(item_width, item_height)) # Bind the item to the control and all of its children: self._set_owner(control, item) # Bind the editor into the UIInfo object name space so it can be # referred to by a Handler while the user interface is active: id = item.id or name info.bind(id, editor, item.id) # Also, add the editors to the list of editors used to construct # the user interface: ui._editors.append(editor) # If the handler wants to be notified when the editor is created, # add it to the list of methods to be called when the UI is # complete: defined = getattr(handler, id + "_defined", None) if defined is not None: ui.add_defined(defined) # If the editor is conditionally visible, add the visibility # 'expression' and the editor to the UI object's list of monitored # objects: if item.visible_when != "": ui.add_visible(item.visible_when, editor) # If the editor is conditionally enabled, add the enabling # 'expression' and the editor to the UI object's list of monitored # objects: if item.enabled_when != "": ui.add_enabled(item.enabled_when, editor) # Add the created editor control to the sizer with the appropriate # layout flags and values: ui._scrollable |= scrollable item_resizable = (item.resizable is True) or ((item.resizable is Undefined) and scrollable) if item_resizable: growable = growable or 500 self.resizable = True elif item.springy: growable = growable or 500 # The following is a hack to allow 'readonly' text fields to # work correctly (wx has a bug that setting wx.EXPAND on a # StaticText control seems to cause the text to be aligned higher # than it would be otherwise, causing it to misalign with its # label). layout_style = editor.layout_style if not show_labels: layout_style |= wx.EXPAND item_sizer.Add( control, growable, flags | layout_style | wx.ALIGN_CENTER_VERTICAL, max(0, border_size + padding + item.padding), ) # If we are displaying labels on the right, add the label to the # user interface: if not show_left: if item.show_label: label = self.create_label(item, ui, desc, panel, item_sizer, "", wx.RIGHT) elif (cols > 1) and show_labels: label = self.dummy_label(panel, item_sizer) # If the Item is resizable, and we are using a multi-column grid: if item_resizable and (cols > 1): # Mark the entire row as growable: item_sizer.AddGrowableRow(col / cols) # Save the reference to the label control (if any) in the editor: editor.label_control = label # If we created a grid sizer, add it to the original sizer: if item_sizer is not sizer: growable = 0 if self.resizable: growable = 1 sizer.Add(item_sizer, growable, wx.EXPAND | wx.ALL, 2)