Exemple #1
0
    def update_editor(self):
        """ Updates the editor when the object trait changes externally to the
            editor.
        """
        # Disconnect the editor from any control about to be destroyed:
        self._dispose_items()

        # Get rid of any previous contents:
        list_pane = self.control
        list_pane.SetSizer(None)
        list_pane.DestroyChildren()

        # Create all of the list item trait editors:
        trait_handler = self._trait_handler
        resizable = ((trait_handler.minlen != trait_handler.maxlen)
                     and self.mutable)
        item_trait = trait_handler.item_trait
        factory = self.factory
        list_sizer = wx.FlexGridSizer(len(self.value),
                                      (1 + resizable) * factory.columns, 0, 0)
        j = resizable
        for i in range(factory.columns):
            list_sizer.AddGrowableCol(j)
            j += (1 + resizable)

        values = self.value
        index = 0
        width, height = 0, 0

        is_fake = (resizable and (values is None or len(values) == 0))
        if is_fake:
            values = [item_trait.default_value()[1]]

        panel_height = 0
        editor = self._editor
        for value in values:
            width1 = height = 0
            if resizable:
                control = ImageControl(list_pane, self.bitmap, -1,
                                       self.popup_menu)
                width1, height = control.GetSize()
                width1 += 4

            try:
                proxy = ListItemProxy(self.object, self.name, index,
                                      item_trait, value)
                if resizable:
                    control.proxy = proxy
                peditor = editor(self.ui, proxy, 'value', self.description,
                                 list_pane).set(object_name='')
                peditor.prepare(list_pane)
                pcontrol = peditor.control
                pcontrol.proxy = proxy
            except:
                if not is_fake:
                    raise

                pcontrol = wx.Button(list_pane, -1, 'sample')

            pcontrol.Fit()
            width2, height2 = size = pcontrol.GetSize()
            pcontrol.SetMinSize(size)
            width = max(width, width1 + width2)
            height = max(height, height2)
            panel_height += height

            if resizable:
                list_sizer.Add(control, 0, wx.LEFT | wx.RIGHT, 2)

            list_sizer.Add(pcontrol, 0, wx.EXPAND)
            index += 1

        list_pane.SetSizer(list_sizer)

        if not self.mutable:
            #list_sizer.SetDimension(0,0,width, panel_height)
            list_pane.SetInitialSize(list_sizer.GetSize())

        if is_fake:
            self._cur_control = control
            self.empty_list()
            control.Destroy()
            pcontrol.Destroy()

        rows = 1
        if not self.single_row:
            rows = self.factory.rows

        # Make sure we have valid values set for width and height (in case there
        # was no data to base them on):
        if width == 0:
            width = 100

        if panel_height == 0:
            panel_height = 20

        list_pane.SetMinSize(
            wx.Size(width + ((trait_handler.maxlen > rows) * scrollbar_dx),
                    panel_height))

        list_pane.SetupScrolling()
        list_pane.GetParent().Layout()
Exemple #2
0
    def update_editor(self):
        """ Updates the editor when the object trait changes external to the 
            editor.
        """
        list_pane = self.control
        editor = self._editor

        # Disconnext the editor from any control about to be destroyed:
        for control in list_pane.GetChildren():
            if hasattr(control, '_editor'):
                control._editor.control = None

        # Get rid of any previous contents:
        list_pane.SetSizer(None)
        list_pane.DestroyChildren()

        # Create all of the list item trait editors:
        trait_handler = self.factory.trait_handler
        resizable = ((trait_handler.minlen != trait_handler.maxlen)
                     and (self.kind != 'readonly_editor'))
        item_trait = trait_handler.item_trait
        list_sizer = wx.FlexGridSizer(0, 1 + resizable, 0, 0)
        list_sizer.AddGrowableCol(resizable)
        values = self.value
        index = 0
        width, height = 100, 18
        is_fake = (resizable and (len(values) == 0))
        if is_fake:
            values = [item_trait.default_value()[1]]

        for value in values:
            width = height = 0
            if resizable:
                control = ImageControl(list_pane,
                                       bitmap_cache('list_editor', False), -1,
                                       self.popup_menu)
                width, height = control.GetSize()
                width += 4
            try:
                proxy = ListItemProxy(self.object, self.name, index,
                                      item_trait, value)
                peditor = editor(self.ui, proxy, 'value', self.description,
                                 list_pane)
                pcontrol = peditor.control
                pcontrol.proxy = proxy
                if resizable:
                    control.proxy = proxy
            except:
                if not is_fake:
                    raise
                pcontrol = wx.Button(list_pane, -1, 'sample')
            width2, height2 = pcontrol.GetSize()
            width += width2
            height = max(height, height2)
            if resizable:
                list_sizer.Add(control, 0, wx.LEFT | wx.RIGHT, 2)
            list_sizer.Add(pcontrol, 1, wx.EXPAND)
            index += 1

        list_pane.SetSizer(list_sizer)

        if is_fake:
            self._cur_control = control
            self.empty_list()
            control.Destroy()
            pcontrol.Destroy()

        rows = [self.factory.rows, 1][self.kind == 'simple_editor']
        list_pane.SetSize(
            wx.Size(width + ((trait_handler.maxlen > rows) * scrollbar_dx),
                    height * rows))
        list_pane.SetScrollRate(16, height)
        list_pane.SetVirtualSize(list_sizer.GetMinSize())
        list_pane.GetParent().Layout()