Beispiel #1
0
class ListReorderDialog(wx.Dialog):
    """Simple dialog to return a list of items that can be reordered by the user.
    """
    border = 5

    def __init__(self,
                 parent,
                 items,
                 get_item_text,
                 dialog_helper=None,
                 title="Reorder List",
                 copy_helper=None,
                 default_helper=None):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           title,
                           size=(700, 500),
                           pos=wx.DefaultPosition,
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)

        sizer = wx.BoxSizer(wx.HORIZONTAL)

        self.list = ReorderableList(self, items, get_item_text, size=(-1, 500))
        self.list.Bind(wx.EVT_LIST_ITEM_SELECTED, self.on_list_selection)
        self.list.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.on_list_selection)
        sizer.Add(self.list, 1, wx.EXPAND)

        vbox = wx.BoxSizer(wx.VERTICAL)

        self.up = b = wx.Button(self, wx.ID_UP, 'Up', size=(90, -1))
        b.Bind(wx.EVT_BUTTON, self.on_up)
        vbox.Add(b, 0, wx.ALL | wx.EXPAND, self.border)

        self.down = b = wx.Button(self, wx.ID_DOWN, 'Down', size=(90, -1))
        b.Bind(wx.EVT_BUTTON, self.on_down)
        vbox.Add(b, 0, wx.ALL | wx.EXPAND, self.border)

        vbox.AddSpacer(50)

        b = wx.Button(self, wx.ID_NEW, 'New', size=(90, -1))
        b.Bind(wx.EVT_BUTTON, self.on_new)
        vbox.Add(b, 0, wx.ALL | wx.EXPAND, self.border)

        self.edit = b = wx.Button(self, wx.ID_EDIT, 'Edit', size=(90, -1))
        b.Bind(wx.EVT_BUTTON, self.on_edit)
        vbox.Add(b, 0, wx.ALL | wx.EXPAND, self.border)

        if copy_helper is not None:
            self.copy = b = wx.Button(self, wx.ID_COPY, 'Copy', size=(90, -1))
            b.Bind(wx.EVT_BUTTON, self.on_copy)
            vbox.Add(b, 0, wx.ALL | wx.EXPAND, self.border)
        else:
            self.copy = None

        if default_helper is not None:
            self.default = b = wx.Button(self,
                                         wx.ID_COPY,
                                         'Set as Default',
                                         size=(90, -1))
            b.Bind(wx.EVT_BUTTON, self.on_set_default)
            vbox.Add(b, 0, wx.ALL | wx.EXPAND, self.border)
        else:
            self.default = None
        self.default_helper = default_helper

        vbox.AddSpacer(50)

        self.delete = b = wx.Button(self,
                                    wx.ID_DELETE,
                                    'Delete',
                                    size=(90, -1))
        b.Bind(wx.EVT_BUTTON, self.on_delete)
        vbox.Add(b, 0, wx.ALL | wx.EXPAND, self.border)

        vbox.AddStretchSpacer()

        btnsizer = wx.StdDialogButtonSizer()
        btn = wx.Button(self, wx.ID_OK)
        btn.SetDefault()
        btnsizer.AddButton(btn)
        btn = wx.Button(self, wx.ID_CANCEL)
        btnsizer.AddButton(btn)
        btnsizer.Realize()
        vbox.Add(btnsizer, 0, wx.ALL | wx.EXPAND, self.border)
        sizer.Add(vbox, 0, wx.EXPAND, 0)

        self.SetSizer(sizer)
        sizer.Fit(self)

        self.Layout()

        self.list.Bind(wx.EVT_CONTEXT_MENU, self.on_context_menu)
        self.delete_id = wx.NewId()
        self.Bind(wx.EVT_MENU, self.on_delete, id=self.delete_id)

        self.get_item_text = get_item_text
        self.dialog_helper = dialog_helper
        self.copy_helper = copy_helper
        self.on_list_selection(None)

    def on_list_selection(self, evt):
        one_selected = self.list.GetSelectedItemCount() == 1
        any_selected = self.list.GetSelectedItemCount() > 0
        self.up.Enable(self.list.can_move_up)
        self.down.Enable(self.list.can_move_down)
        self.edit.Enable(one_selected)
        if self.copy is not None:
            self.copy.Enable(one_selected)
        if self.default is not None:
            self.default.Enable(one_selected)
        self.delete.Enable(any_selected)

    def on_context_menu(self, evt):
        one_selected = self.list.GetSelectedItemCount() == 1
        any_selected = self.list.GetSelectedItemCount() > 0
        menu = wx.Menu()
        menu.Append(wx.ID_NEW, "New Item")
        menu.Append(wx.ID_EDIT, "Edit Item")
        menu.Enable(wx.ID_EDIT, one_selected)
        if self.copy is not None:
            menu.Append(wx.ID_COPY, "Copy Item")
            menu.Enable(wx.ID_COPY, one_selected)
        menu.AppendSeparator()
        menu.Append(wx.ID_SELECTALL, "Select All")
        menu.Append(wx.ID_CLEAR, "Deselect All")
        menu.Append(wx.ID_DELETE, "Delete Selected Items")
        menu.Enable(wx.ID_DELETE, any_selected)
        id = self.GetPopupMenuSelectionFromUser(menu)
        menu.Destroy()
        if id == wx.ID_NEW:
            self.on_new(evt)
        elif id == wx.ID_DELETE:
            self.on_delete(evt)
        elif id == wx.ID_EDIT:
            self.on_edit(evt)
        elif id == wx.ID_COPY:
            self.on_copy(evt)
        if id == wx.ID_SELECTALL:
            self.list.select_all()
        elif id == wx.ID_CLEAR:
            self.list.deselect_all()

    def get_items(self):
        return self.list.items

    def on_up(self, evt):
        if self.list.can_move_up:
            self.list.move_selected(-1)

    def on_down(self, evt):
        if self.list.can_move_down:
            self.list.move_selected(1)

    def on_new(self, evt):
        new_item = self.dialog_helper(self, "Add Item")
        if new_item is not None:
            self.insert_new_item(new_item)

    def insert_new_item(self, new_item):
        index = self.list.GetFirstSelected()
        if index == -1:
            index = len(self.list.items)
        else:
            index += 1
        self.list.items[index:index] = [new_item]
        self.list.refresh()
        self.list.deselect_all()
        self.list.SetItemState(index, wx.LIST_STATE_SELECTED,
                               wx.LIST_STATE_SELECTED)

    def on_edit(self, evt):
        index = self.list.GetFirstSelected()
        if index >= 0:
            item = self.list.items[index]
            new_item = self.dialog_helper(self,
                                          "Edit %s" % self.get_item_text(item),
                                          item)
            if new_item is not None:
                self.list.items[index] = new_item
                self.list.refresh()

    def on_copy(self, evt):
        index = self.list.GetFirstSelected()
        if index >= 0:
            item = self.list.items[index]
            new_item = self.copy_helper(item)
            if new_item is not None:
                self.insert_new_item(new_item)

    def on_set_default(self, evt):
        index = self.list.GetFirstSelected()
        if index >= 0:
            for i, item in enumerate(self.list.items):
                self.default_helper(item, i == index)
            self.list.refresh()

    def on_delete(self, evt):
        self.list.delete_selected()