📄 codegen.py
字号:
else: if item.children: name = self.get_name(item) if name: write(' '*tabs + '<object class="wxMenu" ' \ 'name=%s>\n' % quoteattr(name)) else: write(' '*tabs + '<object class="wxMenu">\n') else: name = self.get_name(item) if name: write(' '*tabs + '<object class="wxMenuItem" ' \ 'name=%s>\n' % quoteattr(name)) else: write(' '*tabs + '<object class="wxMenuItem">\n') if item.label: # translate & into _ as accelerator marker val = item.label.replace('&', '_') write(' '*(tabs+1) + '<label>%s</label>\n' % \ escape(val)) if item.help_str: write(' '*(tabs+1) + '<help>%s</help>\n' % \ escape(item.help_str)) if item.children: for c in item.children: self.append_item(c, outfile, tabs+1) elif item.checkable == '1': write(' '*(tabs+1) + '<checkable>1</checkable>\n') elif item.radio == '1': write(' '*(tabs+1) + '<radio>1</radio>\n') write(' '*tabs + '</object>\n') def get_name(self, item): if item.name: return item.name.strip() tokens = item.id.split('=') if tokens: return tokens[0].strip() def write(self, outfile, tabs): menus = self.code_obj.properties['menubar'] write = outfile.write write(' '*tabs + '<object class="wxMenuBar" name=%s>\n' % \ quoteattr(self.name)) for m in menus: self.append_item(m.root, outfile, tabs+1) write(' '*tabs + '</object>\n') # end of class MenuBarXrcObject return MenuBarXrcObject(obj)class CppCodeGenerator: constructor = [] def get_code(self, obj): """\ generates C++ code for the menubar of a wxFrame. """ cppgen = common.code_writers['C++'] menus = obj.properties['menubar'] init = [ '%s = new %s();\n' % (obj.name, obj.klass) ] init.extend(self.get_properties_code(obj)) init.append('SetMenuBar(%s);\n' % obj.name) ids = self.get_ids_code(obj) return init, ids, [], [] def get_properties_code(self, obj): cppgen = common.code_writers['C++'] menus = obj.properties['menubar'] out = [] append = out.append def append_items(menu, items): for item in items: if item.name == '---': # item is a separator append('%s->AppendSeparator();\n' % menu) continue name, val = cppgen.generate_code_id(None, item.id) if not name and val == '-1': id = 'wxNewId()' else: #if name: ids.append(name) id = val if item.children: if item.name: name = item.name else: name = '%s_sub' % menu append('wxMenu* %s = new wxMenu();\n' % name)## if item.id: # generating id## tokens = item.id.split('=')## if len(tokens) > 1:## id = tokens[0]## else:## id = item.id## else: id = 'wxNewId()' append_items(name, item.children) append('%s->Append(%s, %s, %s, %s);\n' % (menu, id, cppgen.quote_str(item.label), name, cppgen.quote_str(item.help_str))) else:## if item.id:## tokens = item.id.split('=')## if len(tokens) > 1:## id = tokens[0]## else:## id = item.id## else:## id = 'wxNewId()' item_type = 'wxITEM_NORMAL' if item.checkable == '1': item_type = 'wxITEM_CHECK' elif item.radio == '1': item_type = 'wxITEM_RADIO' if item_type: append('%s->Append(%s, %s, %s, %s);\n' % (menu, id, cppgen.quote_str(item.label), cppgen.quote_str(item.help_str), item_type)) else: append('%s->Append(%s, %s, %s);\n' % (menu, id, cppgen.quote_str(item.label), cppgen.quote_str(item.help_str))) #print 'menus = %s' % menus if obj.is_toplevel: obj_name = '' else: obj_name = obj.name + '->' i = 1 for m in menus: menu = m.root if menu.name: name = menu.name else: name = 'wxglade_tmp_menu_%s' % i i += 1 append('wxMenu* %s = new wxMenu();\n' % name) if menu.children: append_items(name, menu.children) append('%sAppend(%s, %s);\n' % (obj_name, name, cppgen.quote_str(menu.label))) return out def get_ids_code(self, obj): cppgen = common.code_writers['C++'] ids = [] menus = obj.properties['menubar'] def collect_ids(items): for item in items: if item.name == '---': # item is a separator continue # do nothing name, val = cppgen.generate_code_id(None, item.id) if name.find('=') != -1: ids.append(name) if item.children:## if item.id: # generating id## tokens = item.id.split('=')## if len(tokens) > 1:## id = tokens[0]## ids.append(' = '.join(tokens)) collect_ids(item.children)## else:## if item.id:## tokens = item.id.split('=')## if len(tokens) > 1:## id = tokens[0]## ids.append(' = '.join(tokens)) for m in menus: if m.root.children: collect_ids(m.root.children) return ids def get_events(self, obj): cppgen = common.code_writers['C++'] out = [] def do_get(item): ret = [] name, val = cppgen.generate_code_id(None, item.id) if not val: val = '-1' # but this is wrong anyway... if item.handler: ret.append((val, 'EVT_MENU', item.handler, 'wxCommandEvent')) if item.children: for c in item.children: ret.extend(do_get(c)) return ret for menu in obj.properties['menubar']: out.extend(do_get(menu.root)) return out# end of class CppCodeGeneratordef initialize(): common.class_names['EditMenuBar'] = 'wxMenuBar' common.toplevels['EditMenuBar'] = 1 pygen = common.code_writers.get('python') if pygen: pygen.add_widget_handler('wxMenuBar', PythonCodeGenerator()) pygen.add_property_handler('menus', MenuHandler) xrcgen = common.code_writers.get('XRC') if xrcgen: xrcgen.add_widget_handler('wxMenuBar', xrc_code_generator) xrcgen.add_property_handler('menus', MenuHandler) cppgen = common.code_writers.get('C++') if cppgen: cppgen.add_widget_handler('wxMenuBar', CppCodeGenerator()) cppgen.add_property_handler('menus', MenuHandler)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -