def __init__(self, debug=False): QMainWindow.__init__(self) # initialise filename self.filename = None # make the data store from xmlstore import Store self.store = Store(debug=debug) # view the current table self.tableView = TableView(self) #self.tableView.setDragEnabled(True); #self.tableView.setDragDropMode(QAbstractItemView.InternalMove) #self.tableView.setAcceptDrops(True); #self.tableView.setDropIndicatorShown(True); self.tableView.verticalHeader().sectionMoved.connect(self.sectionMoved) self.tableView.verticalHeader().setMovable(True) self.setCentralWidget(self.tableView) # add a custom delegate to it self.delegate = ComboBoxDelegate() self.tableView.setItemDelegate(self.delegate) # dock the table selection on the left self.dock1 = QDockWidget(self) self.listView = ListView(self) self.listView.setDragEnabled(True) self.listView.setDragDropMode(QAbstractItemView.InternalMove) self.listView.setDropIndicatorShown(True) self.dock1.setWidget(self.listView) self.dock1.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.addDockWidget(Qt.LeftDockWidgetArea, self.dock1) # connect it to the populate method self.connect(self.listView, SIGNAL('activated ( const QModelIndex & )'), self.populate) self.connect(self.listView, SIGNAL('clicked ( const QModelIndex & )'), self.populate) # dock the undoView on the left self.dock2 = QDockWidget(self) self.undoView = QUndoView(self.store.stack) self.dock2.setWidget(self.undoView) self.dock2.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.dock2.setWindowTitle('Undo Stack') self.addDockWidget(Qt.LeftDockWidgetArea, self.dock2) # create a menubar self.menu = self.menuBar() # create file menu headings self.menuFile = self.menu.addMenu('File') self.menuFile.addAction('New', self.New).setShortcut('CTRL+N') self.menuFile.addAction('Open...', self.Open).setShortcut('CTRL+O') self.menuFile.addAction('Reload', self.Reload) self.menuFile.addAction('Save', self.Save).setShortcut('CTRL+S') self.menuFile.addAction('Save As...', self.SaveAs) self.menuFile.addSeparator() self.menuFile.addAction('Set Architecture...', self.setArch) self.menuFile.addSeparator() self.menuFile.addAction('Quit', self.closeEvent).setShortcuts( ['CTRL+Q', 'ALT+F4']) # create edit menu headings self.menuEdit = self.menu.addMenu('Edit') self.menuEdit.addAction('Insert Row', self.tableView.insertRow).setShortcut('CTRL+I') self.menuEdit.addAction( 'Insert Row Under', self.tableView.insertRowUnder).setShortcut('CTRL+U') self.menuEdit.addAction('Remove Row', self.tableView.removeRow) self.menuEdit.addSeparator() self.menuEdit.addAction('Cut', self.tableView.cut).setShortcut('CTRL+X') self.menuEdit.addAction('Copy', self.tableView.copy).setShortcuts( ['CTRL+C', 'CTRL+INS']) self.menuEdit.addAction('Paste', self.tableView.paste).setShortcuts( ['CTRL+V', 'SHIFT+INS']) self.menuEdit.addAction('Clear', self.tableView.menuClear).setShortcut('CTRL+D') self.menuEdit.addSeparator() self.menuEdit.addAction('Fill Cells', self.tableView.fillCells).setShortcut('CTRL+L') self.menuEdit.addAction( 'Fill Cells and Increment', self.tableView.fillCellsInc).setShortcut('CTRL+R') self.menuEdit.addAction( 'Python Code...', self.tableView.pythonCode).setShortcut('CTRL+P') self.tableView.codeBox = pythonCode() self.menuEdit.addSeparator() self.menuEdit.addAction('Undo', self.store.stack, SLOT('undo()')).setShortcut('CTRL+Z') self.menuEdit.addAction('Redo', self.store.stack, SLOT('redo()')).setShortcut('CTRL+SHIFT+Z') # create component menu self.menuComponents = self.menu.addMenu('Components') self.resize(QSize(1000, 500))
class GUI(QMainWindow): def __init__(self, debug=False): QMainWindow.__init__(self) # initialise filename self.filename = None # make the data store from xmlstore import Store self.store = Store(debug=debug) # view the current table self.tableView = TableView(self) #self.tableView.setDragEnabled(True); #self.tableView.setDragDropMode(QAbstractItemView.InternalMove) #self.tableView.setAcceptDrops(True); #self.tableView.setDropIndicatorShown(True); self.tableView.verticalHeader().sectionMoved.connect(self.sectionMoved) self.tableView.verticalHeader().setMovable(True) self.setCentralWidget(self.tableView) # add a custom delegate to it self.delegate = ComboBoxDelegate() self.tableView.setItemDelegate(self.delegate) # dock the table selection on the left self.dock1 = QDockWidget(self) self.listView = ListView(self) self.listView.setDragEnabled(True) self.listView.setDragDropMode(QAbstractItemView.InternalMove) self.listView.setDropIndicatorShown(True) self.dock1.setWidget(self.listView) self.dock1.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.addDockWidget(Qt.LeftDockWidgetArea, self.dock1) # connect it to the populate method self.connect(self.listView, SIGNAL('activated ( const QModelIndex & )'), self.populate) self.connect(self.listView, SIGNAL('clicked ( const QModelIndex & )'), self.populate) # dock the undoView on the left self.dock2 = QDockWidget(self) self.undoView = QUndoView(self.store.stack) self.dock2.setWidget(self.undoView) self.dock2.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.dock2.setWindowTitle('Undo Stack') self.addDockWidget(Qt.LeftDockWidgetArea, self.dock2) # create a menubar self.menu = self.menuBar() # create file menu headings self.menuFile = self.menu.addMenu('File') self.menuFile.addAction('New', self.New).setShortcut('CTRL+N') self.menuFile.addAction('Open...', self.Open).setShortcut('CTRL+O') self.menuFile.addAction('Reload', self.Reload) self.menuFile.addAction('Save', self.Save).setShortcut('CTRL+S') self.menuFile.addAction('Save As...', self.SaveAs) self.menuFile.addSeparator() self.menuFile.addAction('Set Architecture...', self.setArch) self.menuFile.addSeparator() self.menuFile.addAction('Quit', self.closeEvent).setShortcuts( ['CTRL+Q', 'ALT+F4']) # create edit menu headings self.menuEdit = self.menu.addMenu('Edit') self.menuEdit.addAction('Insert Row', self.tableView.insertRow).setShortcut('CTRL+I') self.menuEdit.addAction( 'Insert Row Under', self.tableView.insertRowUnder).setShortcut('CTRL+U') self.menuEdit.addAction('Remove Row', self.tableView.removeRow) self.menuEdit.addSeparator() self.menuEdit.addAction('Cut', self.tableView.cut).setShortcut('CTRL+X') self.menuEdit.addAction('Copy', self.tableView.copy).setShortcuts( ['CTRL+C', 'CTRL+INS']) self.menuEdit.addAction('Paste', self.tableView.paste).setShortcuts( ['CTRL+V', 'SHIFT+INS']) self.menuEdit.addAction('Clear', self.tableView.menuClear).setShortcut('CTRL+D') self.menuEdit.addSeparator() self.menuEdit.addAction('Fill Cells', self.tableView.fillCells).setShortcut('CTRL+L') self.menuEdit.addAction( 'Fill Cells and Increment', self.tableView.fillCellsInc).setShortcut('CTRL+R') self.menuEdit.addAction( 'Python Code...', self.tableView.pythonCode).setShortcut('CTRL+P') self.tableView.codeBox = pythonCode() self.menuEdit.addSeparator() self.menuEdit.addAction('Undo', self.store.stack, SLOT('undo()')).setShortcut('CTRL+Z') self.menuEdit.addAction('Redo', self.store.stack, SLOT('redo()')).setShortcut('CTRL+SHIFT+Z') # create component menu self.menuComponents = self.menu.addMenu('Components') self.resize(QSize(1000, 500)) def Save(self): # save menu command self.SaveAs(self.filename) def setArch(self): arch = self.store.getArch() arch, ok = QInputDialog.getText(self, 'Architecture Dialog', 'Enter Architecture', QLineEdit.Normal, arch) arch = str(arch) if ok: self.store.setArch(arch) def SaveAs(self, filename=''): # save as menu command if filename == '': filename = str(QFileDialog.getSaveFileName()) if filename != '': self.filename = filename self.store.Save(filename) self._setClean() def Reload(self): if self.filename is not None: self.Open(self.filename, name=self.tablename) def Open(self, filename='', name=None): # make sure the user is sure if there are unsaved changes if self.__prompt_unsaved() == QMessageBox.Cancel: return # ask for a filename if filename == '': filename = str( QFileDialog.getOpenFileName( filter="Xml Files (*.xml);;All files (*.*)")) if filename == '': return # store the filename self.filename = filename # tell the store to open a new set of tables try: problems, warnings = self.store.Open(filename) if problems: errorstr = 'Can\'t load all object types: ' + ', '.join( problems) QMessageBox.warning(self, 'Open Error', errorstr) if warnings: errorstr = \ 'The following warnings were generated:\n' + \ '\n'.join(warnings) QMessageBox.warning(self, 'Open Warnings', errorstr) except Exception, e: x = formLog( 'An error ocurred. Make sure all the modules listed ' 'in RELEASE files are built. Check the text below for ' 'details:\n\n' + traceback.format_exc(), self) x.show() return # populate self.setWindowTitle('XEB - %s[*]' % filename) self.listView.clear() for t in self.store.getTableNames(): self.__insertListViewItem(t) self.__populateMenu() self.populate(name=name) self._setClean()
def __init__(self, debug=False): QMainWindow.__init__(self) # initialise filename self.filename = None # make the data store from xmlstore import Store self.store = Store(debug = debug) # view the current table self.tableView = TableView(self) self.tableView.setDragEnabled(True); self.tableView.setAcceptDrops(True); self.tableView.setDropIndicatorShown(True); self.setCentralWidget(self.tableView) # add a custom delegate to it self.delegate = ComboBoxDelegate() self.tableView.setItemDelegate(self.delegate) # dock the table selection on the left self.dock1 = QDockWidget(self) self.listView = ListView(self) self.listView.setDragEnabled(True); self.listView.setDragDropMode(QAbstractItemView.InternalMove) self.listView.setDropIndicatorShown(True); self.dock1.setWidget(self.listView) self.dock1.setFeatures( QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.addDockWidget(Qt.LeftDockWidgetArea, self.dock1) # connect it to the populate method self.connect(self.listView, SIGNAL('activated ( const QModelIndex & )'), self.populate) self.connect(self.listView, SIGNAL('clicked ( const QModelIndex & )'), self.populate) # dock the undoView on the left self.dock2 = QDockWidget(self) self.undoView = QUndoView(self.store.stack) self.dock2.setWidget(self.undoView) self.dock2.setFeatures( QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.dock2.setWindowTitle('Undo Stack') self.addDockWidget(Qt.LeftDockWidgetArea, self.dock2) # create a menubar self.menu = self.menuBar() # create file menu headings self.menuFile = self.menu.addMenu('File') self.menuFile.addAction('New', self.New).setShortcut('CTRL+N') self.menuFile.addAction('Open...', self.Open).setShortcut('CTRL+O') self.menuFile.addAction('Reload', self.Reload) self.menuFile.addAction('Save', self.Save).setShortcut('CTRL+S') self.menuFile.addAction('Save As...', self.SaveAs) self.menuFile.addSeparator() self.menuFile.addAction('Set Architecture...', self.setArch) self.menuFile.addSeparator() self.menuFile.addAction('Quit', self.closeEvent).setShortcuts(['CTRL+Q', 'ALT+F4']) # create edit menu headings self.menuEdit = self.menu.addMenu('Edit') self.menuEdit.addAction('Insert Row', self.tableView.insertRow).setShortcut('CTRL+I') self.menuEdit.addAction('Insert Row Under', self.tableView.insertRowUnder).setShortcut('CTRL+U') self.menuEdit.addAction('Remove Row', self.tableView.removeRow) self.menuEdit.addSeparator() self.menuEdit.addAction('Cut', self.tableView.cut).setShortcut('CTRL+X') self.menuEdit.addAction('Copy', self.tableView.copy).setShortcuts(['CTRL+C', 'CTRL+INS']) self.menuEdit.addAction('Paste', self.tableView.paste).setShortcuts(['CTRL+V', 'SHIFT+INS']) self.menuEdit.addAction('Clear', self.tableView.menuClear).setShortcut('CTRL+D') self.menuEdit.addSeparator() self.menuEdit.addAction('Fill Cells', self.tableView.fillCells).setShortcut('CTRL+L') self.menuEdit.addAction('Fill Cells and Increment', self.tableView.fillCellsInc).setShortcut('CTRL+R') self.menuEdit.addAction('Python Code...', self.tableView.pythonCode).setShortcut('CTRL+P') self.tableView.codeBox = pythonCode() self.menuEdit.addSeparator() self.menuEdit.addAction('Undo', self.store.stack, SLOT('undo()')).setShortcut('CTRL+Z') self.menuEdit.addAction('Redo', self.store.stack, SLOT('redo()')).setShortcut('CTRL+SHIFT+Z') # create component menu self.menuComponents = self.menu.addMenu('Components') self.resize(QSize(1000,500))
class GUI(QMainWindow): def __init__(self, debug=False): QMainWindow.__init__(self) # initialise filename self.filename = None # make the data store from xmlstore import Store self.store = Store(debug = debug) # view the current table self.tableView = TableView(self) self.tableView.setDragEnabled(True); self.tableView.setAcceptDrops(True); self.tableView.setDropIndicatorShown(True); self.setCentralWidget(self.tableView) # add a custom delegate to it self.delegate = ComboBoxDelegate() self.tableView.setItemDelegate(self.delegate) # dock the table selection on the left self.dock1 = QDockWidget(self) self.listView = ListView(self) self.listView.setDragEnabled(True); self.listView.setDragDropMode(QAbstractItemView.InternalMove) self.listView.setDropIndicatorShown(True); self.dock1.setWidget(self.listView) self.dock1.setFeatures( QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.addDockWidget(Qt.LeftDockWidgetArea, self.dock1) # connect it to the populate method self.connect(self.listView, SIGNAL('activated ( const QModelIndex & )'), self.populate) self.connect(self.listView, SIGNAL('clicked ( const QModelIndex & )'), self.populate) # dock the undoView on the left self.dock2 = QDockWidget(self) self.undoView = QUndoView(self.store.stack) self.dock2.setWidget(self.undoView) self.dock2.setFeatures( QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.dock2.setWindowTitle('Undo Stack') self.addDockWidget(Qt.LeftDockWidgetArea, self.dock2) # create a menubar self.menu = self.menuBar() # create file menu headings self.menuFile = self.menu.addMenu('File') self.menuFile.addAction('New', self.New).setShortcut('CTRL+N') self.menuFile.addAction('Open...', self.Open).setShortcut('CTRL+O') self.menuFile.addAction('Reload', self.Reload) self.menuFile.addAction('Save', self.Save).setShortcut('CTRL+S') self.menuFile.addAction('Save As...', self.SaveAs) self.menuFile.addSeparator() self.menuFile.addAction('Set Architecture...', self.setArch) self.menuFile.addSeparator() self.menuFile.addAction('Quit', self.closeEvent).setShortcuts(['CTRL+Q', 'ALT+F4']) # create edit menu headings self.menuEdit = self.menu.addMenu('Edit') self.menuEdit.addAction('Insert Row', self.tableView.insertRow).setShortcut('CTRL+I') self.menuEdit.addAction('Insert Row Under', self.tableView.insertRowUnder).setShortcut('CTRL+U') self.menuEdit.addAction('Remove Row', self.tableView.removeRow) self.menuEdit.addSeparator() self.menuEdit.addAction('Cut', self.tableView.cut).setShortcut('CTRL+X') self.menuEdit.addAction('Copy', self.tableView.copy).setShortcuts(['CTRL+C', 'CTRL+INS']) self.menuEdit.addAction('Paste', self.tableView.paste).setShortcuts(['CTRL+V', 'SHIFT+INS']) self.menuEdit.addAction('Clear', self.tableView.menuClear).setShortcut('CTRL+D') self.menuEdit.addSeparator() self.menuEdit.addAction('Fill Cells', self.tableView.fillCells).setShortcut('CTRL+L') self.menuEdit.addAction('Fill Cells and Increment', self.tableView.fillCellsInc).setShortcut('CTRL+R') self.menuEdit.addAction('Python Code...', self.tableView.pythonCode).setShortcut('CTRL+P') self.tableView.codeBox = pythonCode() self.menuEdit.addSeparator() self.menuEdit.addAction('Undo', self.store.stack, SLOT('undo()')).setShortcut('CTRL+Z') self.menuEdit.addAction('Redo', self.store.stack, SLOT('redo()')).setShortcut('CTRL+SHIFT+Z') # create component menu self.menuComponents = self.menu.addMenu('Components') self.resize(QSize(1000,500)) def Save(self): # save menu command self.SaveAs(self.filename) def setArch(self): arch = self.store.getArch() arch, ok = QInputDialog.getText(self, 'Architecture Dialog', 'Enter Architecture', QLineEdit.Normal, arch) arch = str(arch) if ok: self.store.setArch(arch) def SaveAs(self, filename = ''): # save as menu command if filename == '': filename = str(QFileDialog.getSaveFileName()) if filename != '': self.filename = filename self.store.Save(filename) self._setClean() def Reload(self): if self.filename is not None: self.Open(self.filename, name = self.tablename) def Open(self, filename = '', name = None): # make sure the user is sure if there are unsaved changes if self.__prompt_unsaved() != QMessageBox.Yes: return # ask for a filename if filename == '': filename = str(QFileDialog.getOpenFileName()) if filename == '': return # store the filename self.filename = filename # tell the store to open a new set of tables try: problems, warnings = self.store.Open(filename) if problems: errorstr = 'Can\'t load all object types: '+', '.join(problems) QMessageBox.warning(self,'Open Error',errorstr) if warnings: errorstr = \ 'The following warnings were generated:\n' + \ '\n'.join(warnings) QMessageBox.warning(self,'Open Warnings',errorstr) except Exception, e: x = formLog('An error ocurred. Make sure all the modules listed ' 'in RELEASE files are built. Check the text below for ' 'details:\n\n' + traceback.format_exc(), self) x.show() return # populate self.setWindowTitle('XEB - %s[*]'%filename) self.listView.clear() for t in self.store.getTableNames(): self.__insertListViewItem(t) self.__populateMenu() self.populate(name = name) self._setClean()
def main(): parser = OptionParser('usage: %prog [options] <xml-file>') parser.add_option('-d', action='store_true', dest='debug', help='Print lots of debug information') parser.add_option('-D', action='store_true', dest='DbOnly', help='Only output files destined for the Db dir') parser.add_option('-o', dest='out', default=os.path.join('..', '..', 'iocs'), help='Output directory for ioc') parser.add_option( '--doc', dest='doc', help='Write out information in format for doxygen build instructions') parser.add_option( '--sim', dest='simarch', help='Create an ioc with arch=SIMARCH in simulation mode') parser.add_option( '-e', action='store_true', dest='edm_screen', help='Try to create a set of edm screens for this module') parser.add_option('-c', action='store_true', dest='no_check_release', help='Set CHECK_RELEASE to FALSE') parser.add_option( '-b', action='store_true', dest='no_substitute_boot', help='Don\'t substitute .src file to make a .boot file, copy it and '\ ' create an envPaths file to load') # parse arguments (options, args) = parser.parse_args() if len(args) != 1: parser.error('*** Error: Incorrect number of arguments - ' 'you must supply one input file (.xml)') # define parameters if options.debug: debug = True else: debug = False if options.DbOnly: DbOnly = True else: DbOnly = False # setup the store xml_file = args[0] store = Store(debug=debug, DbOnly=DbOnly, doc=options.doc) if options.debug: print '--- Parsing %s ---' % xml_file # read the xml text for the architecture xml_text = open(xml_file).read() xml_root = xml.dom.minidom.parseString(xml_text) components = [ n for n in xml_root.childNodes if n.nodeType == n.ELEMENT_NODE ][0] if options.simarch is not None: store.architecture = patch_arch(options.simarch) store.simarch = store.architecture else: store.architecture = patch_arch( str(components.attributes['arch'].value)) store.simarch = None # Now create a new store, loading the release file from this xml file store.New(xml_file) store.iocbuilder.SetSource(os.path.realpath(xml_file)) # create iocbuilder objects from the xml text store.iocbuilder.includeXml.instantiateXml(xml_text) if options.doc: iocpath = options.doc elif DbOnly: iocpath = os.path.abspath(".") if options.simarch: store.iocname += '_sim' else: # write the iocs root = os.path.abspath(options.out) iocpath = os.path.join(root, store.iocname) if options.simarch: iocpath += '_sim' # store.iocbuilder.SetEpicsPort(6064) substitute_boot = not options.no_substitute_boot if store.architecture == "win32-x86": substitute_boot = False if debug: print "Writing ioc to %s" % iocpath store.iocbuilder.WriteNamedIoc(iocpath, store.iocname, check_release=not options.no_check_release, substitute_boot=substitute_boot, edm_screen=options.edm_screen) if debug: print "Done"
def main(): parser = OptionParser('usage: %prog [options] <xml-file>') parser.add_option( '-d', action='store_true', dest='debug', help='Print lots of debug information') parser.add_option( '-D', action='store_true', dest='DbOnly', help='Only output files destined for the Db dir') parser.add_option('-o', dest='out', default = os.path.join('..', '..', 'iocs'), help='Output directory for ioc') parser.add_option( '--doc', dest='doc', help='Write out information in format for doxygen build instructions') parser.add_option( '--sim', dest='simarch', help='Create an ioc with arch=SIMARCH in simulation mode') parser.add_option( '-e', action='store_true', dest='edm_screen', help='Try to create a set of edm screens for this module') parser.add_option( '-c', action='store_true', dest='no_check_release', help='Set CHECK_RELEASE to FALSE') parser.add_option( '-b', action='store_true', dest='no_substitute_boot', help='Don\'t substitute .src file to make a .boot file, copy it and '\ ' create an envPaths file to load') # parse arguments (options, args) = parser.parse_args() if len(args) != 1: parser.error( '*** Error: Incorrect number of arguments - ' 'you must supply one input file (.xml)') # define parameters if options.debug: debug = True else: debug = False if options.DbOnly: DbOnly = True else: DbOnly = False # setup the store xml_file = args[0] store = Store(debug = debug, DbOnly = DbOnly, doc = options.doc) if options.debug: print '--- Parsing %s ---' % xml_file # read the xml text for the architecture xml_text = open(xml_file).read() xml_root = xml.dom.minidom.parseString(xml_text) components = [n for n in xml_root.childNodes if n.nodeType == n.ELEMENT_NODE][0] if options.simarch is not None: store.architecture = patch_arch(options.simarch) store.simarch = store.architecture else: store.architecture = patch_arch(str(components.attributes['arch'].value)) store.simarch = None # Now create a new store, loading the release file from this xml file store.New(xml_file) store.iocbuilder.SetSource(os.path.realpath(xml_file)) # create iocbuilder objects from the xml text store.iocbuilder.includeXml.instantiateXml(xml_text) if options.doc: iocpath = options.doc elif DbOnly: iocpath = os.path.abspath(".") if options.simarch: store.iocname += '_sim' else: # write the iocs root = os.path.abspath(options.out) iocpath = os.path.join(root, store.iocname) if options.simarch: iocpath += '_sim' # store.iocbuilder.SetEpicsPort(6064) substitute_boot = not options.no_substitute_boot if store.architecture == "win32-x86": substitute_boot = False if debug: print "Writing ioc to %s" % iocpath store.iocbuilder.WriteNamedIoc(iocpath, store.iocname, check_release = not options.no_check_release, substitute_boot = substitute_boot, edm_screen = options.edm_screen) if debug: print "Done"