#!/bin/env python3 import gex import sys from PyQt4 import QtGui, QtCore import ini_syntax class GexIniEditor(QtGui.QMainWindow): """ Gexync is a GEX ini file editor. The editor loads the INI file through the communication interface without having to mount the virtual filesystem, which is unreliable on some systems. This utility allows live editing of the UNITS.INI file. On save, a new version is loaded with formatting and error messages generated by GEX, as if the virtual config filesystem was re-mounted. The editor does not keep GEX claimed, instead does so only when needed. This allows testing of the current configuration without having to close and reopen the editor. """ def __init__(self, xferLambda): self.xferLambda = xferLambda self.filenum = int(sys.argv[1]) if len(sys.argv)>1 else 0 super().__init__() self.initUI() # TODO let user pick GEX device if multiple def initToolbar(self): icon = self.style().standardIcon(QtGui.QStyle.SP_BrowserReload) loadAction = QtGui.QAction(icon, 'Reload', self) loadAction.setShortcut('Ctrl+O') loadAction.triggered.connect(self.gexLoad) icon = self.style().standardIcon(QtGui.QStyle.SP_DialogSaveButton) syncAction = QtGui.QAction(icon, 'Write Changes', self) syncAction.setShortcut('Ctrl+S') syncAction.triggered.connect(self.gexSync) icon = self.style().standardIcon(QtGui.QStyle.SP_DialogOkButton) persAction = QtGui.QAction(icon, 'Persist', self) persAction.setShortcut('Ctrl+P') persAction.triggered.connect(self.gexPersist) self.toolbar = self.addToolBar('Toolbar') self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) self.toolbar.addAction(loadAction) self.toolbar.addAction(syncAction) self.toolbar.addSeparator() self.toolbar.addAction(persAction) def initEditor(self): self.editor = QtGui.QPlainTextEdit() # Editor background and text color pal = QtGui.QPalette() bgc = QtGui.QColor(0xFFFFF6) pal.setColor(QtGui.QPalette.Base, bgc) textc = QtGui.QColor(0x000000) pal.setColor(QtGui.QPalette.Text, textc) self.editor.setPalette(pal) # Font font = QtGui.QFont('Liberation Mono', 12) font.setStyleHint(QtGui.QFont.TypeWriter) self.editor.setFont(font) # Initial size self.highlight = ini_syntax.IniHighlighter(self.editor.document()) def initUI(self): self.setWindowTitle('GEX config file editor') self.initToolbar() self.initEditor() self.setCentralWidget(self.editor) self.show() self.gexLoad() def gexLoad(self): self.editor.setPlainText("") self.editor.repaint() client = gex.Client(self.xferLambda(), load_units=False) read_ini = client.ini_read(self.filenum) client.close() self.editor.setPlainText(read_ini) self.highlight.rehighlight() self.setWindowTitle('GEX config file editor') def gexSync(self): new_txt = self.editor.toPlainText() self.editor.setPlainText("") self.editor.repaint() client = gex.Client(self.xferLambda(), load_units=False) client.ini_write(new_txt) read_ini = client.ini_read(self.filenum) client.close() self.editor.setPlainText(read_ini) self.highlight.rehighlight() self.setWindowTitle('*GEX config file editor') def gexPersist(self): client = gex.Client(self.xferLambda(), load_units=False) client.ini_persist() client.close() self.setWindowTitle('GEX config file editor') if __name__ == '__main__': app = QtGui.QApplication(sys.argv) editor = GexIniEditor(lambda: gex.TrxRawUSB()) # editor = GexIniEditor(lambda: gex.TrxSerialThread(port='/dev/ttyUSB1', # baud=57600)) # centered resize w = 800 h = 900 ss = app.desktop().availableGeometry().size() editor.setGeometry(int(ss.width() / 2 - w / 2), int(ss.height() / 2 - h / 2), w, h) sys.exit(app.exec_())