📄 edit_sizers.py
字号:
def change_sizer(old, new, which_page=0, _hidden=[None]): """\ changes 'old' sizer to 'new' Params: - old: SizerBase instance to replace - new: string selection that identifies the new instance - which_page: index of the notebook page of the property window to display: this is used only by set_growable_(rows|cols) """ constructors = { 'wxBoxSizer (wxVERTICAL)': lambda : EditBoxSizer(old.name, old.window, wx.VERTICAL, 0, old.toplevel), 'wxBoxSizer (wxHORIZONTAL)': lambda : EditBoxSizer(old.name, old.window, wx.HORIZONTAL, 0, old.toplevel), 'wxStaticBoxSizer (wxVERTICAL)': lambda : EditStaticBoxSizer(old.name, old.window, wx.VERTICAL, getattr(old, 'label', old.name), 0, old.toplevel), 'wxStaticBoxSizer (wxHORIZONTAL)': lambda : EditStaticBoxSizer(old.name, old.window, wx.HORIZONTAL, getattr(old, 'label', old.name), 0, old.toplevel), 'wxGridSizer': lambda : EditGridSizer(old.name, old.window, rows=0, cols=0, toplevel=old.toplevel), 'wxFlexGridSizer': lambda : EditFlexGridSizer(old.name, old.window, rows=0, cols=0, toplevel=old.toplevel) } szr = constructors[new]() szr.children.extend(old.children[1:]) szr.node = old.node if isinstance(szr, GridSizerBase): szr.set_rows(getattr(old, 'rows', 1)) szr.set_cols(getattr(old, 'cols', len(szr.children)-1)) szr.set_hgap(getattr(old, 'hgap', 0)) szr.set_vgap(getattr(old, 'vgap', 0)) if isinstance(szr, EditFlexGridSizer): try: grow_r = old.grow_rows grow_c = old.grow_cols if grow_r: szr.grow_rows = grow_r szr.properties['growable_rows'].toggle_active(True) szr.properties['growable_rows'].set_value( szr.get_growable_rows()) if grow_c: szr.grow_cols = grow_c szr.properties['growable_cols'].toggle_active(True) szr.properties['growable_cols'].set_value( szr.get_growable_cols()) except (AttributeError, KeyError): pass szr.show_widget(True, dont_set=True) if _hidden[0] is None: _hidden[0] = wx.Frame(None, -1, _("HIDDEN FRAME FOR CHANGE SIZER")) for c in szr.children[1:]: widget = c.item widget.sizer = szr if not isinstance(widget, SizerSlot): # ALB 2007-09-04. This is necessary as a workaround to a # wx.StaticBoxSizer issue: it seems that the wx.StaticBox needs to # come before any other widget managed by the wx.StaticBoxSizer in # the GetChildren() list. Explicitly reparenting the widgets seems # to solve the problem p = widget.widget.GetParent() widget.widget.Reparent(_hidden[0]) widget.widget.Reparent(p) szr.widget.Insert(widget.pos, widget.widget, int(widget.get_option()), widget.get_int_flag(), int(widget.get_border())) if not szr.toplevel: szr.sizer = old.sizer szr.option = old.option szr.flag = old.flag szr.border = old.border szr.pos = old.pos szr.sizer.children[szr.pos].item = szr if szr.sizer.widget: elem = szr.sizer.widget.GetChildren()[szr.pos] elem.SetSizer(szr.widget) import common common.app_tree.change_node(szr.node, szr) old.toplevel = False szr.show_properties() szr.notebook.SetSelection(which_page) for c in old.widget.GetChildren(): if c and c.IsSizer(): c.SetSizer(None) old.widget.Clear() old.children = old.children[:1] old.delete() if szr.toplevel: szr.window.set_sizer(szr) szr.layout(True)#------------------------------------------------------------------------------class InsertDialog(wx.Dialog): def __init__(self, max_val): wx.Dialog.__init__(self, None, -1, _("Select a position")) self.pos = 0 pos_prop = SpinProperty(self, 'position', self, r=(0, max_val), label=_("position")) szr = wx.BoxSizer(wx.VERTICAL) szr.Add(pos_prop.panel, 0, wx.ALL|wx.EXPAND, 5) szr2 = wx.BoxSizer(wx.HORIZONTAL) szr2.Add(wx.Button(self, wx.ID_OK, _("OK")), 0, wx.ALL, 5) szr2.Add(wx.Button(self, wx.ID_CANCEL, _("Cancel")), 0, wx.ALL, 5) szr.Add(szr2, 0, wx.ALIGN_CENTER) self.SetAutoLayout(True) self.SetSizer(szr) szr.Fit(self) self.CenterOnScreen() def __getitem__(self, name): def set_pos(v): self.pos = int(v) return (lambda : self.pos, set_pos)# end of class InsertDialogclass Sizer: """\ Base class for every Sizer handled by wxGlade """ def __init__(self, window): self.window = window # window this sizer is responsible # for the layout of def set_item(self, pos, option=None, flag=None, border=None, size=None, force_layout=True): """\ Updates the layout of the item at the given pos. """ raise NotImplementedError def add_item(self, item, pos=None, option=0, flag=0, border=0, size=None, force_layout=True): """\ Adds an item to self. """ raise NotImplementedError def remove_item(self, elem, force_layout=True): """\ Removes elem from self. """ pass def free_slot(self, pos, force_layout=True): """\ Replaces the element at pos with an empty slot """ raise NotImplementedError def _fix_notebook(self, pos, notebook_sizer, force_layout=True): """\ Internal method used to replace a notebook widget with its notebook sizer. """ pass def is_virtual(self): """\ Return true if sizer is virtual (f.e. SplitterWindowSizer) """ return False def get_itempos(self, attrs): """\ For virtual sizers only, returns the position of the item in the parent: this is used when loading a wxg file, to build the tree of widgets correctly """ raise NotImplementedError# end of class Sizerclass SizerBase(Sizer): """\ Base class for every non-virtual Sizer handled by wxGlade """ def __init__(self, name, klass, window, toplevel=True, show=True, menu=None): Sizer.__init__(self, window) self.id = wx.NewId() self.name = name self.klass = klass self.base = klass self.pos = 0 # for sub-sizers, the position inside the parent self.properties = {} self.property_window = window.property_window self.widget = None # this is the actual wxSizer instance # toplevel: if True, self is not inside another sizer, but it is the # responsible of the layout of self.window self.toplevel = toplevel if not self.toplevel: self.option = 1 self.flag = wx.EXPAND self.border = 0 self.sizer = None self.menu = menu if self.menu is None: self.menu = [(_('Add slot'), self.add_slot), (_('Insert slot...'), self.insert_slot)] #if not self.toplevel: self.menu.extend([(_('Copy\tCtrl+C'), self.clipboard_copy, wx.ART_COPY), (_('Cut\tCtrl+X'), self.clipboard_cut, wx.ART_CUT), ]) self._btn = None # SizerHandleButton self.notebook = None self._property_setup() self.children = [] # list of widgets added to the sizer def create_widget(self): """\ Creates the wxSizer self.widget """ raise NotImplementedError def show_widget(self, yes, dont_set=False): if not yes or self.widget: return # nothing to do if the sizer has already been created self._btn = SizerHandleButton(self.window, self.id, self, self.menu) # ScreenToClient used by WidgetTree for the popup menu wx.EVT_BUTTON(self._btn, self.id, self.show_properties) self.create_widget() self.widget.Refresh = self.refresh self.widget.GetBestSize = self.widget.GetMinSize self.widget.ScreenToClient = self._btn.ScreenToClient if self.toplevel and not dont_set: self.window.set_sizer(self) # ALB 2004-08-11 if not config.preferences.show_sizer_handle: self.widget.Show(self._btn, False) if misc.focused_widget is self: self.update_view(True) def _property_setup(self): """\ Setup of the Properties of self. """ self.flags_pos = [ wx.ALL, wx.LEFT, wx.RIGHT, wx.TOP, wx.BOTTOM, wx.EXPAND, wx.ALIGN_RIGHT, wx.ALIGN_BOTTOM, wx.ALIGN_CENTER_HORIZONTAL, wx.ALIGN_CENTER_VERTICAL, wx.SHAPED, wx.ADJUST_MINSIZE ] self.access_functions = { 'name' : (lambda : self.name, self.set_name), 'class' : (lambda : self.klass, self.change) #lambda v: None) } if not self.toplevel: self.access_functions['option'] = (self.get_option,self.set_option) self.access_functions['flag'] = (self.get_flag, self.set_flag) self.access_functions['border'] = (self.get_border,self.set_border) self.access_functions['pos'] = (self.get_pos, self.set_pos) self.name_prop = TextProperty(self, 'name', None, label=_('name')) #self.klass_prop = TextProperty(self, 'class', None, readonly=True) dialog = SizerClassDialog(self, None) self.klass_prop = DialogProperty(self, 'class', None, dialog, label=_('class')) if not self.toplevel: prop = self.sizer_properties = {} #prop['option'] = SpinProperty(self, 'option', None, 0, (0, 1000)) from layout_option_property import LayoutOptionProperty, \ LayoutPosProperty prop['option'] = LayoutOptionProperty(self, self.sizer) flag_labels = ['#section#' + _('Border'), 'wxALL', 'wxLEFT', 'wxRIGHT', 'wxTOP', 'wxBOTTOM', '#section#' + _('Alignment'), 'wxEXPAND', 'wxALIGN_RIGHT', 'wxALIGN_BOTTOM', 'wxALIGN_CENTER_HORIZONTAL', 'wxALIGN_CENTER_VERTICAL', 'wxSHAPED', 'wxADJUST_MINSIZE' ] prop['flag'] = CheckListProperty(self, 'flag', None, flag_labels) prop['border'] = SpinProperty(self, 'border', None, 0, (0, 1000), label=_('border')) prop['pos'] = LayoutPosProperty(self, self.sizer) def set_containing_sizer(self, sizer): self.sizer = sizer self.sizer_properties['option'].set_sizer(sizer) self.sizer_properties['pos'].set_sizer(sizer) def get_pos(self): return self.pos - 1 def set_pos(self, value): misc.wxCallAfter(self.sizer.change_item_pos, self, min(value + 1, len(self.sizer.children) - 1)) def update_pos(self, value): #print 'update pos', self.name, value self.sizer_properties['pos'].set_value(value-1) self.pos = value def change(self, *args): # if wxPython < 2.3.3, wxCallAfter is defined in misc.py misc.wxCallAfter(change_sizer, self, self.klass_prop.get_value()) def create_properties(self): """\ Displays the Properties of self """ self.notebook = wx.Notebook(common.property_panel, -1) if not misc.check_wx_version(2, 5, 2): nb_sizer = wx.NotebookSizer(self.notebook) self.notebook.sizer = nb_sizer else: self.notebook.sizer = None self.notebook.SetAutoLayout(True) panel = wx.ScrolledWindow(self.notebook, -1, style=wx.TAB_TRAVERSAL) sizer_tmp = wx.BoxSizer(wx.VERTICAL) self.name_prop.display(panel) self.klass_prop.display(panel) self.klass_prop.text.SetEditable(False) sizer_tmp.Add(self.name_prop.panel, 0, wx.EXPAND) sizer_tmp.Add(self.klass_prop.panel, 0, wx.EXPAND) if not self.toplevel: prop = self.sizer_properties prop['pos'].display(panel) prop['option'].display(panel) prop['border'].display(panel) prop['flag'].display(panel) sizer_tmp.Add(prop['pos'].panel, 0, wx.EXPAND) sizer_tmp.Add(prop['option'].panel, 0, wx.EXPAND)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -