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 __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)
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()
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
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)
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()
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()
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