Exemple #1
0
    def __init__(self, parent, title, segments, list_title=None, credits=False):
        wx.Dialog.__init__(self, parent, -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
        
        self.segment_map = {k:v for k,v in enumerate(segments)}
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)
        
        t = wx.StaticText(self, -1, self.instructions)
        sizer.Add(t, 0, wx.ALL|wx.EXPAND, self.border)
        
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        
        vbox1 = wx.BoxSizer(wx.VERTICAL)
        t = wx.StaticText(self, -1, "All Segments")
        vbox1.Add(t, 0, wx.ALL|wx.EXPAND, self.border)
        self.source = ReorderableList(self, self.segment_map.keys(), self.get_item_text, columns=["Origin", "Size", "Name"], resize_column=3, allow_drop=False, size=(400,300))
        vbox1.Add(self.source, 1, wx.ALL|wx.EXPAND, self.border)
        hbox.Add(vbox1, 1, wx.ALL|wx.EXPAND, 0)

        vbox2 = wx.BoxSizer(wx.VERTICAL)
        if list_title is None:
            list_title = self.dest_list_title
        t = wx.StaticText(self, -1, list_title)
        vbox2.Add(t, 0, wx.ALL|wx.EXPAND, self.border)
        self.dest = ReorderableList(self, [], self.get_item_text, columns=["Origin", "Size", "Name"], resize_column=3, size=(400,300))
        vbox2.Add(self.dest, 1, wx.ALL|wx.EXPAND, self.border)
        hbox.Add(vbox2, 1, wx.ALL|wx.EXPAND, 0)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        self.add_command_area(vbox, credits)
        
        vbox.AddStretchSpacer()
        
        btnsizer = wx.StdDialogButtonSizer()
        self.ok_btn = wx.Button(self, wx.ID_OK)
        self.ok_btn.SetDefault()
        btnsizer.AddButton(self.ok_btn)
        btn = wx.Button(self, wx.ID_CANCEL)
        btnsizer.AddButton(btn)
        btnsizer.Realize()
        vbox.Add(btnsizer, 0, wx.ALL|wx.EXPAND, self.border)
        hbox.Add(vbox, 0, wx.EXPAND, 0)
        sizer.Add(hbox, 1, wx.EXPAND, 0)
        
        self.Bind(wx.EVT_BUTTON, self.on_button)
        self.Bind(wx.EVT_TEXT, self.on_text_changed)
        
        # Don't call self.Fit() otherwise the dialog buttons are zero height
        sizer.Fit(self)
        self.check_enable()
Exemple #2
0
    def __init__(self, parent, items, get_item_text, dialog_helper=None, title="Reorder List", copy_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
        
        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)
Exemple #3
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):
        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
        
        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)
        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_delete(self, evt):
        self.list.delete_selected()
Exemple #4
0
class SegmentOrderDialog(wx.Dialog):
    border = 5
    instructions = "Drag segments to the right-hand list to create the output segment order"
    dest_list_title = "Segments in Executable"
    
    def __init__(self, parent, title, segments, list_title=None, credits=False):
        wx.Dialog.__init__(self, parent, -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
        
        self.segment_map = {k:v for k,v in enumerate(segments)}
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)
        
        t = wx.StaticText(self, -1, self.instructions)
        sizer.Add(t, 0, wx.ALL|wx.EXPAND, self.border)
        
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        
        vbox1 = wx.BoxSizer(wx.VERTICAL)
        t = wx.StaticText(self, -1, "All Segments")
        vbox1.Add(t, 0, wx.ALL|wx.EXPAND, self.border)
        self.source = ReorderableList(self, self.segment_map.keys(), self.get_item_text, columns=["Origin", "Size", "Name"], resize_column=3, allow_drop=False, size=(400,300))
        vbox1.Add(self.source, 1, wx.ALL|wx.EXPAND, self.border)
        hbox.Add(vbox1, 1, wx.ALL|wx.EXPAND, 0)

        vbox2 = wx.BoxSizer(wx.VERTICAL)
        if list_title is None:
            list_title = self.dest_list_title
        t = wx.StaticText(self, -1, list_title)
        vbox2.Add(t, 0, wx.ALL|wx.EXPAND, self.border)
        self.dest = ReorderableList(self, [], self.get_item_text, columns=["Origin", "Size", "Name"], resize_column=3, size=(400,300))
        vbox2.Add(self.dest, 1, wx.ALL|wx.EXPAND, self.border)
        hbox.Add(vbox2, 1, wx.ALL|wx.EXPAND, 0)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        self.add_command_area(vbox, credits)
        
        vbox.AddStretchSpacer()
        
        btnsizer = wx.StdDialogButtonSizer()
        self.ok_btn = wx.Button(self, wx.ID_OK)
        self.ok_btn.SetDefault()
        btnsizer.AddButton(self.ok_btn)
        btn = wx.Button(self, wx.ID_CANCEL)
        btnsizer.AddButton(btn)
        btnsizer.Realize()
        vbox.Add(btnsizer, 0, wx.ALL|wx.EXPAND, self.border)
        hbox.Add(vbox, 0, wx.EXPAND, 0)
        sizer.Add(hbox, 1, wx.EXPAND, 0)
        
        self.Bind(wx.EVT_BUTTON, self.on_button)
        self.Bind(wx.EVT_TEXT, self.on_text_changed)
        
        # Don't call self.Fit() otherwise the dialog buttons are zero height
        sizer.Fit(self)
        self.check_enable()
    
    def add_command_area(self, vbox, credits):
        t = wx.StaticText(self, -1, "Run Address")
        vbox.Add(t, 0, wx.LEFT|wx.RIGHT|wx.TOP|wx.EXPAND, self.border)
        self.run_addr = wx.TextCtrl(self, -1, size=(-1, -1))
        vbox.Add(self.run_addr, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.EXPAND, self.border)
        
        if credits:
            t = wx.StaticText(self, -1, "Title (20 chars)")
            vbox.Add(t, 0, wx.LEFT|wx.RIGHT|wx.TOP|wx.EXPAND, self.border)
            self.title_20 = wx.TextCtrl(self, -1, size=(-1, -1))
            self.title_20.SetMaxLength(20)
            vbox.Add(self.title_20, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.EXPAND, self.border)

            t = wx.StaticText(self, -1, "Author (20 chars)")
            vbox.Add(t, 0, wx.LEFT|wx.RIGHT|wx.TOP|wx.EXPAND, self.border)
            self.author_20 = wx.TextCtrl(self, -1, size=(-1, -1))
            self.author_20.SetMaxLength(20)
            vbox.Add(self.author_20, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.EXPAND, self.border)
        else:
            self.title_20 = self.author_20 = None

        vbox.AddSpacer(50)
        
        self.clear = b = wx.Button(self, wx.ID_DOWN, 'Clear List', size=(90, -1))
        b.Bind(wx.EVT_BUTTON, self.on_clear)
        vbox.Add(b, 0, wx.ALL|wx.EXPAND, self.border)
    
    def get_item_text(self, sid):
        s = self.segment_map[sid]
        return "%x" % s.start_addr, "%x" % len(s), s.name
        
    def on_button(self, evt):
        if evt.GetId() == wx.ID_OK:
            self.EndModal(wx.ID_OK)
        else:
            self.EndModal(wx.ID_CANCEL)
        evt.Skip()

    def on_text_changed(self, evt):
        self.ok_btn.Enable(self.can_submit())

    def on_clear(self, evt):
        self.dest.clear()

    def on_resize(self, event):
        print "resized"
        self.Fit()
    
    def get_run_addr(self):
        text = self.run_addr.GetValue()
        try:
            addr = text_to_int(text, "hex")
            if addr < 0 or addr > 0xffff:
                addr = None
        except (ValueError, TypeError), e:
            addr = None
        return addr
Exemple #5
0
    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)
Exemple #6
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()
Exemple #7
0
    def __init__(self,
                 parent,
                 title,
                 segments,
                 list_title=None,
                 credits=False):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           title,
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)

        self.segment_map = {k: v for k, v in enumerate(segments)}

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)

        t = wx.StaticText(self, -1, self.instructions)
        sizer.Add(t, 0, wx.ALL | wx.EXPAND, self.border)

        hbox = wx.BoxSizer(wx.HORIZONTAL)

        vbox1 = wx.BoxSizer(wx.VERTICAL)
        t = wx.StaticText(self, -1, "All Segments")
        vbox1.Add(t, 0, wx.ALL | wx.EXPAND, self.border)
        self.source = ReorderableList(self,
                                      self.segment_map.keys(),
                                      self.get_item_text,
                                      columns=["Origin", "Size", "Name"],
                                      resize_column=3,
                                      allow_drop=False,
                                      size=(400, 300))
        vbox1.Add(self.source, 1, wx.ALL | wx.EXPAND, self.border)
        hbox.Add(vbox1, 1, wx.ALL | wx.EXPAND, 0)

        vbox2 = wx.BoxSizer(wx.VERTICAL)
        if list_title is None:
            list_title = self.dest_list_title
        t = wx.StaticText(self, -1, list_title)
        vbox2.Add(t, 0, wx.ALL | wx.EXPAND, self.border)
        self.dest = ReorderableList(self, [],
                                    self.get_item_text,
                                    columns=["Origin", "Size", "Name"],
                                    resize_column=3,
                                    size=(400, 300))
        vbox2.Add(self.dest, 1, wx.ALL | wx.EXPAND, self.border)
        hbox.Add(vbox2, 1, wx.ALL | wx.EXPAND, 0)

        vbox = wx.BoxSizer(wx.VERTICAL)

        self.add_command_area(vbox, credits)

        vbox.AddStretchSpacer()

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

        self.Bind(wx.EVT_BUTTON, self.on_button)
        self.Bind(wx.EVT_TEXT, self.on_text_changed)

        # Don't call self.Fit() otherwise the dialog buttons are zero height
        sizer.Fit(self)
        self.check_enable()
Exemple #8
0
class SegmentOrderDialog(wx.Dialog):
    border = 5
    instructions = "Drag segments to the right-hand list to create the output segment order"
    dest_list_title = "Segments in Executable"

    def __init__(self,
                 parent,
                 title,
                 segments,
                 list_title=None,
                 credits=False):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           title,
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)

        self.segment_map = {k: v for k, v in enumerate(segments)}

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)

        t = wx.StaticText(self, -1, self.instructions)
        sizer.Add(t, 0, wx.ALL | wx.EXPAND, self.border)

        hbox = wx.BoxSizer(wx.HORIZONTAL)

        vbox1 = wx.BoxSizer(wx.VERTICAL)
        t = wx.StaticText(self, -1, "All Segments")
        vbox1.Add(t, 0, wx.ALL | wx.EXPAND, self.border)
        self.source = ReorderableList(self,
                                      self.segment_map.keys(),
                                      self.get_item_text,
                                      columns=["Origin", "Size", "Name"],
                                      resize_column=3,
                                      allow_drop=False,
                                      size=(400, 300))
        vbox1.Add(self.source, 1, wx.ALL | wx.EXPAND, self.border)
        hbox.Add(vbox1, 1, wx.ALL | wx.EXPAND, 0)

        vbox2 = wx.BoxSizer(wx.VERTICAL)
        if list_title is None:
            list_title = self.dest_list_title
        t = wx.StaticText(self, -1, list_title)
        vbox2.Add(t, 0, wx.ALL | wx.EXPAND, self.border)
        self.dest = ReorderableList(self, [],
                                    self.get_item_text,
                                    columns=["Origin", "Size", "Name"],
                                    resize_column=3,
                                    size=(400, 300))
        vbox2.Add(self.dest, 1, wx.ALL | wx.EXPAND, self.border)
        hbox.Add(vbox2, 1, wx.ALL | wx.EXPAND, 0)

        vbox = wx.BoxSizer(wx.VERTICAL)

        self.add_command_area(vbox, credits)

        vbox.AddStretchSpacer()

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

        self.Bind(wx.EVT_BUTTON, self.on_button)
        self.Bind(wx.EVT_TEXT, self.on_text_changed)

        # Don't call self.Fit() otherwise the dialog buttons are zero height
        sizer.Fit(self)
        self.check_enable()

    def add_command_area(self, vbox, credits):
        t = wx.StaticText(self, -1, "Run Address")
        vbox.Add(t, 0, wx.LEFT | wx.RIGHT | wx.TOP | wx.EXPAND, self.border)
        self.run_addr = wx.TextCtrl(self, -1, size=(-1, -1))
        vbox.Add(self.run_addr, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND,
                 self.border)

        if credits:
            t = wx.StaticText(self, -1, "Title (20 chars)")
            vbox.Add(t, 0, wx.LEFT | wx.RIGHT | wx.TOP | wx.EXPAND,
                     self.border)
            self.title_20 = wx.TextCtrl(self, -1, size=(-1, -1))
            self.title_20.SetMaxLength(20)
            vbox.Add(self.title_20, 0,
                     wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, self.border)

            t = wx.StaticText(self, -1, "Author (20 chars)")
            vbox.Add(t, 0, wx.LEFT | wx.RIGHT | wx.TOP | wx.EXPAND,
                     self.border)
            self.author_20 = wx.TextCtrl(self, -1, size=(-1, -1))
            self.author_20.SetMaxLength(20)
            vbox.Add(self.author_20, 0,
                     wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, self.border)
        else:
            self.title_20 = self.author_20 = None

        vbox.AddSpacer(50)

        self.clear = b = wx.Button(self,
                                   wx.ID_DOWN,
                                   'Clear List',
                                   size=(90, -1))
        b.Bind(wx.EVT_BUTTON, self.on_clear)
        vbox.Add(b, 0, wx.ALL | wx.EXPAND, self.border)

    def get_item_text(self, sid):
        s = self.segment_map[sid]
        return "%x" % s.start_addr, "%x" % len(s), s.name

    def on_button(self, evt):
        if evt.GetId() == wx.ID_OK:
            self.EndModal(wx.ID_OK)
        else:
            self.EndModal(wx.ID_CANCEL)
        evt.Skip()

    def on_text_changed(self, evt):
        self.ok_btn.Enable(self.can_submit())

    def on_clear(self, evt):
        self.dest.clear()

    def on_resize(self, event):
        self.Fit()

    def get_run_addr(self):
        text = self.run_addr.GetValue()
        try:
            addr = text_to_int(text, "hex")
            if addr < 0 or addr > 0xffff:
                addr = None
        except (ValueError, TypeError), e:
            addr = None
        return addr