diff --git a/.bzrignore b/.bzrignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.bzrignore @@ -0,0 +1 @@ +.idea diff --git a/colourterm.py b/colourterm.py index 20b4e26..125fd29 100755 --- a/colourterm.py +++ b/colourterm.py @@ -15,8 +15,8 @@ if __name__ == "__main__": app.setOrganizationDomain(u'snyman.info') app.setApplicationName(u'ColourTerm') init_resources() - mainWindow = MainWindow() - mainWindow.show() + main_window = MainWindow() + main_window.show() exit_code = app.exec_() cleanup_resources() sys.exit(exit_code) diff --git a/colourterm/__init__.py b/colourterm/__init__.py index ff4584e..5a3e7a9 100644 --- a/colourterm/__init__.py +++ b/colourterm/__init__.py @@ -3,9 +3,9 @@ import re from PyQt4 import QtCore, QtGui try: - fromUtf8 = QtCore.QString.fromUtf8 + from_utf8 = QtCore.QString.fromUtf8 except AttributeError: - fromUtf8 = lambda s: s + from_utf8 = lambda s: s class SComboBox(QtGui.QComboBox): @@ -29,7 +29,7 @@ class Highlight(object): self.foreground = foreground self.background = background - def setPattern(self, pattern): + def set_pattern(self, pattern): self.pattern = pattern try: self.regex = re.compile(pattern) @@ -38,8 +38,7 @@ class Highlight(object): def translate(context, string, description=None): - return QtGui.QApplication.translate(context, string, description, - QtGui.QApplication.UnicodeUTF8) + return QtGui.QApplication.translate(context, string, description, QtGui.QApplication.UnicodeUTF8) def create_default_highlights(): @@ -50,8 +49,8 @@ def create_default_highlights(): ] -from settingsdialog import SettingsDialog -from connectdialog import ConnectDialog +from colourterm.settingsdialog import SettingsDialog +from colourterm.connectdialog import ConnectDialog -__all__ = ['SettingsDialog', 'ConnectDialog', 'SComboBox', 'Highlight', 'translate', 'fromUtf8'] +__all__ = ['SettingsDialog', 'ConnectDialog', 'SComboBox', 'Highlight', 'translate', 'from_utf8'] diff --git a/colourterm/connectdialog.py b/colourterm/connectdialog.py index 1af7fd7..1aac1ac 100644 --- a/colourterm/connectdialog.py +++ b/colourterm/connectdialog.py @@ -5,7 +5,7 @@ from serial import Serial, FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS, PARITY_NONE, PARITY_SPACE, STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO, SerialException from serial.tools import list_ports -from colourterm import fromUtf8, translate +from colourterm import from_utf8, translate DATA_BITS = { @@ -28,166 +28,196 @@ STOP_BITS = { } -class Ui_ConnectDialog(object): - def setupUi(self, connectDialog): - self.deviceLayout = QtGui.QGridLayout(connectDialog) - self.deviceLayout.setSpacing(8) - self.deviceLayout.setContentsMargins(8, 8, 8, 0) - self.deviceLayout.setObjectName(fromUtf8('deviceLayout')) - self.portLabel = QtGui.QLabel(connectDialog) - self.portLabel.setObjectName(fromUtf8('portLabel')) - self.deviceLayout.addWidget(self.portLabel, 0, 0, 1, 1) - self.portEdit = QtGui.QComboBox(connectDialog) - self.portEdit.setObjectName(fromUtf8('portEdit')) - self.portEdit.setEditable(True) - self.deviceLayout.addWidget(self.portEdit, 0, 1, 1, 1) - self.baudLabel = QtGui.QLabel(connectDialog) - self.baudLabel.setObjectName(fromUtf8('baudLabel')) - self.deviceLayout.addWidget(self.baudLabel, 1, 0, 1, 1) - self.baudComboBox = QtGui.QComboBox(connectDialog) - self.baudComboBox.setObjectName(fromUtf8('baudComboBox')) - self.baudComboBox.addItem(fromUtf8('')) - self.baudComboBox.addItem(fromUtf8('')) - self.baudComboBox.addItem(fromUtf8('')) - self.baudComboBox.addItem(fromUtf8('')) - self.baudComboBox.addItem(fromUtf8('')) - self.baudComboBox.addItem(fromUtf8('')) - self.baudComboBox.addItem(fromUtf8('')) - self.baudComboBox.addItem(fromUtf8('')) - self.baudComboBox.addItem(fromUtf8('')) - self.baudComboBox.addItem(fromUtf8('')) - self.deviceLayout.addWidget(self.baudComboBox, 1, 1, 1, 1) - self.dataBitsLabel = QtGui.QLabel(connectDialog) - self.dataBitsLabel.setObjectName(fromUtf8('dataBitsLabel')) - self.deviceLayout.addWidget(self.dataBitsLabel, 2, 0, 1, 1) - self.dataBitsComboBox = QtGui.QComboBox(connectDialog) - self.dataBitsComboBox.setObjectName(fromUtf8('dataBitsComboBox')) - self.dataBitsComboBox.addItem(fromUtf8('')) - self.dataBitsComboBox.addItem(fromUtf8('')) - self.dataBitsComboBox.addItem(fromUtf8('')) - self.dataBitsComboBox.addItem(fromUtf8('')) - self.deviceLayout.addWidget(self.dataBitsComboBox, 2, 1, 1, 1) - self.stopBitsLabel = QtGui.QLabel(connectDialog) - self.stopBitsLabel.setObjectName(fromUtf8('stopBitsLabel')) - self.deviceLayout.addWidget(self.stopBitsLabel, 3, 0, 1, 1) - self.stopBitsComboBox = QtGui.QComboBox(connectDialog) - self.stopBitsComboBox.setObjectName(fromUtf8('stopBitsComboBox')) - self.stopBitsComboBox.addItem(fromUtf8('')) - self.stopBitsComboBox.addItem(fromUtf8('')) - self.stopBitsComboBox.addItem(fromUtf8('')) - self.deviceLayout.addWidget(self.stopBitsComboBox, 3, 1, 1, 1) - self.parityLabel = QtGui.QLabel(connectDialog) - self.parityLabel.setObjectName(fromUtf8('parityLabel')) - self.deviceLayout.addWidget(self.parityLabel, 4, 0, 1, 1) - self.parityComboBox = QtGui.QComboBox(connectDialog) - self.parityComboBox.setObjectName(fromUtf8('parityComboBox')) - self.parityComboBox.addItem(fromUtf8('')) - self.parityComboBox.addItem(fromUtf8('')) - self.parityComboBox.addItem(fromUtf8('')) - self.parityComboBox.addItem(fromUtf8('')) - self.parityComboBox.addItem(fromUtf8('')) - self.deviceLayout.addWidget(self.parityComboBox, 4, 1, 1, 1) - self.handshakeLabel = QtGui.QLabel(connectDialog) - self.handshakeLabel.setObjectName(fromUtf8('handshakeLabel')) - self.deviceLayout.addWidget(self.handshakeLabel, 0, 2, 1, 1) - self.softwareCheckBox = QtGui.QCheckBox(connectDialog) - self.softwareCheckBox.setObjectName(fromUtf8('softwareCheckBox')) - self.deviceLayout.addWidget(self.softwareCheckBox, 0, 3, 1, 1) - self.hardwareCheckBox = QtGui.QCheckBox(connectDialog) - self.hardwareCheckBox.setObjectName(fromUtf8('hardwareCheckBox')) - self.deviceLayout.addWidget(self.hardwareCheckBox, 1, 3, 1, 1) - self.openModeLabel = QtGui.QLabel(connectDialog) - self.openModeLabel.setObjectName(fromUtf8('openModeLabel')) - self.deviceLayout.addWidget(self.openModeLabel, 2, 2, 1, 1) - self.readingCheckBox = QtGui.QCheckBox(connectDialog) - self.readingCheckBox.setChecked(True) - self.readingCheckBox.setObjectName(fromUtf8('readingCheckBox')) - self.deviceLayout.addWidget(self.readingCheckBox, 2, 3, 1, 1) - self.writingCheckBox = QtGui.QCheckBox(connectDialog) - self.writingCheckBox.setChecked(True) - self.writingCheckBox.setObjectName(fromUtf8('writingCheckBox')) - self.deviceLayout.addWidget(self.writingCheckBox, 3, 3, 1, 1) - self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) - self.deviceLayout.addWidget(self.buttonBox, 5, 0, 1, 4) - - self.retranslateUi(connectDialog) - self.baudComboBox.setCurrentIndex(4) - QtCore.QMetaObject.connectSlotsByName(connectDialog) - self.buttonBox.accepted.connect(connectDialog.accept) - self.buttonBox.rejected.connect(connectDialog.reject) - - def retranslateUi(self, connectDialog): - connectDialog.setWindowTitle(translate('ConnectDialog', 'Open Port')) - self.portLabel.setText(translate('ConnectDialog', 'Port:')) - self.baudLabel.setText(translate('ConnectDialog', 'Baude rate:')) - self.baudComboBox.setItemText(0, translate('ConnectDialog', '921600')) - self.baudComboBox.setItemText(1, translate('ConnectDialog', '576000')) - self.baudComboBox.setItemText(2, translate('ConnectDialog', '460800')) - self.baudComboBox.setItemText(3, translate('ConnectDialog', '230400')) - self.baudComboBox.setItemText(4, translate('ConnectDialog', '115200')) - self.baudComboBox.setItemText(5, translate('ConnectDialog', '57600')) - self.baudComboBox.setItemText(6, translate('ConnectDialog', '38400')) - self.baudComboBox.setItemText(7, translate('ConnectDialog', '19200')) - self.baudComboBox.setItemText(8, translate('ConnectDialog', '9600')) - self.baudComboBox.setItemText(9, translate('ConnectDialog', '4800')) - self.dataBitsLabel.setText(translate('ConnectDialog', 'Data bits:')) - self.dataBitsComboBox.setItemText(0, translate('ConnectDialog', '8')) - self.dataBitsComboBox.setItemText(1, translate('ConnectDialog', '7')) - self.dataBitsComboBox.setItemText(2, translate('ConnectDialog', '6')) - self.dataBitsComboBox.setItemText(3, translate('ConnectDialog', '5')) - self.stopBitsLabel.setText(translate('ConnectDialog', 'Stop bits:')) - self.stopBitsComboBox.setItemText(0, translate('ConnectDialog', '1')) - self.stopBitsComboBox.setItemText(1, translate('ConnectDialog', '1.5')) - self.stopBitsComboBox.setItemText(2, translate('ConnectDialog', '2')) - self.parityLabel.setText(translate('ConnectDialog', 'Parity:')) - self.parityComboBox.setItemText(0, translate('ConnectDialog', 'None')) - self.parityComboBox.setItemText(1, translate('ConnectDialog', 'Odd')) - self.parityComboBox.setItemText(2, translate('ConnectDialog', 'Even')) - self.parityComboBox.setItemText(3, translate('ConnectDialog', 'Mark')) - self.parityComboBox.setItemText(4, translate('ConnectDialog', 'Space')) - self.handshakeLabel.setText(translate('ConnectDialog', 'Handshake:')) - self.softwareCheckBox.setText(translate('ConnectDialog', 'Software')) - self.hardwareCheckBox.setText(translate('ConnectDialog', 'Hardware')) - self.openModeLabel.setText(translate('ConnectDialog', 'Open mode:')) - self.readingCheckBox.setText(translate('ConnectDialog', 'Reading')) - self.writingCheckBox.setText(translate('ConnectDialog', 'Writing')) - -class ConnectDialog(QtGui.QDialog, Ui_ConnectDialog): - +class UiConnectDialog(object): def __init__(self): - QtGui.QDialog.__init__(self) - self.setupUi(self) + """ + Just to satisfy PEP8/PyLint + """ + self.device_layout = None + self.port_label = None + self.port_edit = None + self.baud_label = None + self.baud_combobox = None + self.data_bits_label = None + self.data_bits_combobox = None + self.stop_bits_label = None + self.stop_bits_combobox = None + self.parity_label = None + self.parity_combobox = None + self.handshake_label = None + self.software_checkbox = None + self.hardware_checkbox = None + self.open_mode_label = None + self.reading_checkbox = None + self.writing_checkbox = None + self.button_box = None - def getPort(self): - return unicode(self.portEdit.currentText()) + def setup_ui(self, connect_dialog): + """ + Set up the user interface + """ + self.device_layout = QtGui.QGridLayout(connect_dialog) + self.device_layout.setSpacing(8) + self.device_layout.setContentsMargins(8, 8, 8, 0) + self.device_layout.setObjectName(from_utf8('device_layout')) + self.port_label = QtGui.QLabel(connect_dialog) + self.port_label.setObjectName(from_utf8('port_label')) + self.device_layout.addWidget(self.port_label, 0, 0, 1, 1) + self.port_edit = QtGui.QComboBox(connect_dialog) + self.port_edit.setObjectName(from_utf8('port_edit')) + self.port_edit.setEditable(True) + self.device_layout.addWidget(self.port_edit, 0, 1, 1, 1) + self.baud_label = QtGui.QLabel(connect_dialog) + self.baud_label.setObjectName(from_utf8('baud_label')) + self.device_layout.addWidget(self.baud_label, 1, 0, 1, 1) + self.baud_combobox = QtGui.QComboBox(connect_dialog) + self.baud_combobox.setObjectName(from_utf8('baud_combobox')) + self.baud_combobox.addItem(from_utf8('')) + self.baud_combobox.addItem(from_utf8('')) + self.baud_combobox.addItem(from_utf8('')) + self.baud_combobox.addItem(from_utf8('')) + self.baud_combobox.addItem(from_utf8('')) + self.baud_combobox.addItem(from_utf8('')) + self.baud_combobox.addItem(from_utf8('')) + self.baud_combobox.addItem(from_utf8('')) + self.baud_combobox.addItem(from_utf8('')) + self.baud_combobox.addItem(from_utf8('')) + self.device_layout.addWidget(self.baud_combobox, 1, 1, 1, 1) + self.data_bits_label = QtGui.QLabel(connect_dialog) + self.data_bits_label.setObjectName(from_utf8('data_bits_label')) + self.device_layout.addWidget(self.data_bits_label, 2, 0, 1, 1) + self.data_bits_combobox = QtGui.QComboBox(connect_dialog) + self.data_bits_combobox.setObjectName(from_utf8('data_bits_combobox')) + self.data_bits_combobox.addItem(from_utf8('')) + self.data_bits_combobox.addItem(from_utf8('')) + self.data_bits_combobox.addItem(from_utf8('')) + self.data_bits_combobox.addItem(from_utf8('')) + self.device_layout.addWidget(self.data_bits_combobox, 2, 1, 1, 1) + self.stop_bits_label = QtGui.QLabel(connect_dialog) + self.stop_bits_label.setObjectName(from_utf8('stop_bits_label')) + self.device_layout.addWidget(self.stop_bits_label, 3, 0, 1, 1) + self.stop_bits_combobox = QtGui.QComboBox(connect_dialog) + self.stop_bits_combobox.setObjectName(from_utf8('stop_bits_combobox')) + self.stop_bits_combobox.addItem(from_utf8('')) + self.stop_bits_combobox.addItem(from_utf8('')) + self.stop_bits_combobox.addItem(from_utf8('')) + self.device_layout.addWidget(self.stop_bits_combobox, 3, 1, 1, 1) + self.parity_label = QtGui.QLabel(connect_dialog) + self.parity_label.setObjectName(from_utf8('parity_label')) + self.device_layout.addWidget(self.parity_label, 4, 0, 1, 1) + self.parity_combobox = QtGui.QComboBox(connect_dialog) + self.parity_combobox.setObjectName(from_utf8('parity_combobox')) + self.parity_combobox.addItem(from_utf8('')) + self.parity_combobox.addItem(from_utf8('')) + self.parity_combobox.addItem(from_utf8('')) + self.parity_combobox.addItem(from_utf8('')) + self.parity_combobox.addItem(from_utf8('')) + self.device_layout.addWidget(self.parity_combobox, 4, 1, 1, 1) + self.handshake_label = QtGui.QLabel(connect_dialog) + self.handshake_label.setObjectName(from_utf8('handshake_label')) + self.device_layout.addWidget(self.handshake_label, 0, 2, 1, 1) + self.software_checkbox = QtGui.QCheckBox(connect_dialog) + self.software_checkbox.setObjectName(from_utf8('software_checkbox')) + self.device_layout.addWidget(self.software_checkbox, 0, 3, 1, 1) + self.hardware_checkbox = QtGui.QCheckBox(connect_dialog) + self.hardware_checkbox.setObjectName(from_utf8('hardware_checkbox')) + self.device_layout.addWidget(self.hardware_checkbox, 1, 3, 1, 1) + self.open_mode_label = QtGui.QLabel(connect_dialog) + self.open_mode_label.setObjectName(from_utf8('open_mode_label')) + self.device_layout.addWidget(self.open_mode_label, 2, 2, 1, 1) + self.reading_checkbox = QtGui.QCheckBox(connect_dialog) + self.reading_checkbox.setChecked(True) + self.reading_checkbox.setObjectName(from_utf8('reading_checkbox')) + self.device_layout.addWidget(self.reading_checkbox, 2, 3, 1, 1) + self.writing_checkbox = QtGui.QCheckBox(connect_dialog) + self.writing_checkbox.setChecked(True) + self.writing_checkbox.setObjectName(from_utf8('writing_checkbox')) + self.device_layout.addWidget(self.writing_checkbox, 3, 3, 1, 1) + self.button_box = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) + self.device_layout.addWidget(self.button_box, 5, 0, 1, 4) - def getBaud(self): - return int(unicode(self.baudComboBox.currentText())) + self.retranslate_ui(connect_dialog) + self.baud_combobox.setCurrentIndex(4) + self.button_box.accepted.connect(connect_dialog.accept) + self.button_box.rejected.connect(connect_dialog.reject) - def getDataBits(self): - return DATA_BITS[unicode(self.dataBitsComboBox.currentText())] + def retranslate_ui(self, connect_dialog): + """ + Translate the user interface. + """ + connect_dialog.setWindowTitle(translate('ConnectDialog', 'Open Port')) + self.port_label.setText(translate('ConnectDialog', 'Port:')) + self.baud_label.setText(translate('ConnectDialog', 'Baude rate:')) + self.baud_combobox.setItemText(0, translate('ConnectDialog', '921600')) + self.baud_combobox.setItemText(1, translate('ConnectDialog', '576000')) + self.baud_combobox.setItemText(2, translate('ConnectDialog', '460800')) + self.baud_combobox.setItemText(3, translate('ConnectDialog', '230400')) + self.baud_combobox.setItemText(4, translate('ConnectDialog', '115200')) + self.baud_combobox.setItemText(5, translate('ConnectDialog', '57600')) + self.baud_combobox.setItemText(6, translate('ConnectDialog', '38400')) + self.baud_combobox.setItemText(7, translate('ConnectDialog', '19200')) + self.baud_combobox.setItemText(8, translate('ConnectDialog', '9600')) + self.baud_combobox.setItemText(9, translate('ConnectDialog', '4800')) + self.data_bits_label.setText(translate('ConnectDialog', 'Data bits:')) + self.data_bits_combobox.setItemText(0, translate('ConnectDialog', '8')) + self.data_bits_combobox.setItemText(1, translate('ConnectDialog', '7')) + self.data_bits_combobox.setItemText(2, translate('ConnectDialog', '6')) + self.data_bits_combobox.setItemText(3, translate('ConnectDialog', '5')) + self.stop_bits_label.setText(translate('ConnectDialog', 'Stop bits:')) + self.stop_bits_combobox.setItemText(0, translate('ConnectDialog', '1')) + self.stop_bits_combobox.setItemText(1, translate('ConnectDialog', '1.5')) + self.stop_bits_combobox.setItemText(2, translate('ConnectDialog', '2')) + self.parity_label.setText(translate('ConnectDialog', 'Parity:')) + self.parity_combobox.setItemText(0, translate('ConnectDialog', 'None')) + self.parity_combobox.setItemText(1, translate('ConnectDialog', 'Odd')) + self.parity_combobox.setItemText(2, translate('ConnectDialog', 'Even')) + self.parity_combobox.setItemText(3, translate('ConnectDialog', 'Mark')) + self.parity_combobox.setItemText(4, translate('ConnectDialog', 'Space')) + self.handshake_label.setText(translate('ConnectDialog', 'Handshake:')) + self.software_checkbox.setText(translate('ConnectDialog', 'Software')) + self.hardware_checkbox.setText(translate('ConnectDialog', 'Hardware')) + self.open_mode_label.setText(translate('ConnectDialog', 'Open mode:')) + self.reading_checkbox.setText(translate('ConnectDialog', 'Reading')) + self.writing_checkbox.setText(translate('ConnectDialog', 'Writing')) - def getStopBits(self): - return STOP_BITS[unicode(self.stopBitsComboBox.currentText())] - def getParity(self): - return PARITY_BITS[unicode(self.parityComboBox.currentText())] +class ConnectDialog(QtGui.QDialog, UiConnectDialog): - def getSoftwareHandshake(self): - return self.softwareCheckBox.isChecked() + def __init__(self, parent): + #super(ConnectDialog, self).__init__() + QtGui.QDialog.__init__(self, parent=parent) + self.setup_ui(self) - def getHardwareHandshake(self): - return self.hardwareCheckBox.isChecked() + def get_port(self): + return unicode(self.port_edit.currentText()) - def updatePortCombobox(self): - self.portEdit.clear() + def get_baud(self): + return int(unicode(self.baud_combobox.currentText())) + + def get_data_bits(self): + return DATA_BITS[str(self.data_bits_combobox.currentText())] + + def get_stop_bits(self): + return STOP_BITS[str(self.stop_bits_combobox.currentText())] + + def get_parity(self): + return PARITY_BITS[str(self.parity_combobox.currentText())] + + def get_software_handshake(self): + return self.software_checkbox.isChecked() + + def get_hardware_handshake(self): + return self.hardware_checkbox.isChecked() + + def update_port_combobox(self): + self.port_edit.clear() ports = [] - for port in self._getSerialPorts(): + for port in self._get_serial_ports(): ports.append(port) ports.sort() - self.portEdit.addItems(ports) + self.port_edit.addItems(ports) - def _getSerialPorts(self): + def _get_serial_ports(self): """ Returns a generator for all available serial ports """ diff --git a/colourterm/cwebview.py b/colourterm/cwebview.py index 9fda7b3..ace7adf 100644 --- a/colourterm/cwebview.py +++ b/colourterm/cwebview.py @@ -3,6 +3,7 @@ This module contains a child class of QWebView in order to reimplement the wheel """ from PyQt4 import QtCore, QtWebKit + class CWebView(QtWebKit.QWebView): """ This is a reimplementation of QWebView in order to override the wheelEvent method. diff --git a/colourterm/mainwindow.py b/colourterm/mainwindow.py index 46358e7..99c6b7e 100644 --- a/colourterm/mainwindow.py +++ b/colourterm/mainwindow.py @@ -5,284 +5,317 @@ import threading from PyQt4 import QtCore, QtGui from serial import Serial, SerialException -from colourterm import SettingsDialog, ConnectDialog, SComboBox, Highlight, fromUtf8, translate, create_default_highlights +from colourterm import SettingsDialog, ConnectDialog, SComboBox, Highlight, from_utf8, translate, \ + create_default_highlights from colourterm.cwebview import CWebView -class Ui_MainWindow(object): - def setupUi(self, mainWindow): - mainWindow.setObjectName(fromUtf8('MainWindow')) - mainWindow.resize(800, 600) - self.centralwidget = QtGui.QWidget(mainWindow) - self.centralwidget.setObjectName(fromUtf8('centralwidget')) - self.centralLayout = QtGui.QVBoxLayout(self.centralwidget) - self.centralLayout.setSpacing(8) - self.centralLayout.setContentsMargins(0, 0, 0, 8) - self.centralLayout.setObjectName(fromUtf8('centralLayout')) - self.outputBrowser = CWebView(self.centralwidget) - self.outputBrowser.setHtml('
' % str(QtGui.QApplication.palette().color(QtGui.QPalette.Text).name())) - self.outputBrowser.setObjectName(fromUtf8('outputBrowser')) - self.centralLayout.addWidget(self.outputBrowser) - self.sendLayout = QtGui.QHBoxLayout() - self.sendLayout.setSpacing(8) - self.sendLayout.setObjectName(fromUtf8('sendLayout')) - self.sendComboBox = SComboBox(self.centralwidget) - self.sendComboBox.setEditable(True) - self.sendComboBox.setEnabled(False) - self.sendComboBox.setObjectName(fromUtf8('sendComboBox')) - self.sendLayout.addWidget(self.sendComboBox) - self.sendButton = QtGui.QPushButton(self.centralwidget) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.sendButton.sizePolicy().hasHeightForWidth()) - self.sendButton.setSizePolicy(sizePolicy) - self.sendButton.setMaximumSize(QtCore.QSize(100, 16777215)) - self.sendButton.setObjectName(fromUtf8('sendButton')) - self.sendLayout.addWidget(self.sendButton) - self.centralLayout.addLayout(self.sendLayout) - mainWindow.setCentralWidget(self.centralwidget) - self.statusbar = QtGui.QStatusBar(mainWindow) - self.statusbar.setObjectName(fromUtf8('statusbar')) - mainWindow.setStatusBar(self.statusbar) - self.toolBar = QtGui.QToolBar(mainWindow) - self.toolBar.setMovable(False) - self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) - self.toolBar.setFloatable(False) - self.toolBar.setObjectName(fromUtf8('toolBar')) - mainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) - self.openAction = QtGui.QAction(mainWindow) - connectIcon = QtGui.QIcon() - connectIcon.addPixmap(QtGui.QPixmap(fromUtf8(':/toolbar/network-connect.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.openAction.setIcon(connectIcon) - self.openAction.setObjectName(fromUtf8('openAction')) - self.closeAction = QtGui.QAction(mainWindow) - disconnectIcon = QtGui.QIcon() - disconnectIcon.addPixmap(QtGui.QPixmap(fromUtf8(':/toolbar/network-disconnect.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.closeAction.setIcon(disconnectIcon) - self.closeAction.setObjectName(fromUtf8('closeAction')) - self.captureAction = QtGui.QAction(mainWindow) - captureIcon = QtGui.QIcon() - captureIcon.addPixmap(QtGui.QPixmap(fromUtf8(':/toolbar/capture-to-disk.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.captureAction.setIcon(captureIcon) - self.captureAction.setCheckable(True) - self.captureAction.setChecked(False) - self.captureAction.setObjectName(fromUtf8('captureAction')) - self.followAction = QtGui.QAction(mainWindow) - self.followAction.setShortcut(QtCore.Qt.Key_F) - followIcon = QtGui.QIcon() - followIcon.addPixmap(QtGui.QPixmap(fromUtf8(':/toolbar/follow-output.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.followAction.setIcon(followIcon) - self.followAction.setCheckable(True) - self.followAction.setChecked(True) - self.followAction.setObjectName(fromUtf8('followAction')) - self.configureAction = QtGui.QAction(mainWindow) - configureIcon = QtGui.QIcon() - configureIcon.addPixmap(QtGui.QPixmap(fromUtf8(':/toolbar/configure.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.configureAction.setIcon(configureIcon) - self.configureAction.setObjectName(fromUtf8('configureAction')) - self.exitAction = QtGui.QAction(mainWindow) - exitIcon = QtGui.QIcon() - exitIcon.addPixmap(QtGui.QPixmap(fromUtf8(':/toolbar/application-exit.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.exitAction.setIcon(exitIcon) - self.exitAction.setObjectName(fromUtf8('exitAction')) - self.toolBar.addAction(self.openAction) - self.toolBar.addAction(self.closeAction) - self.toolBar.addAction(self.captureAction) - self.toolBar.addAction(self.followAction) - self.toolBar.addAction(self.configureAction) - self.toolBar.addAction(self.exitAction) +class UiMainWindow(object): + def __init__(self): + """ + Just to satisfy PEP8/PyLint + """ + self.central_widget = None + self.central_layout = None + self.output_browser = None + self.send_layout = None + self.send_combobox = None + self.send_button = None + self.status_bar = None + self.tool_bar = None + self.open_action = None + self.close_action = None + self.capture_action = None + self.follow_action = None + self.configure_action = None + self.exit_action = None - self.retranslateUi(mainWindow) - QtCore.QMetaObject.connectSlotsByName(mainWindow) + def setup_ui(self, main_window): + """ + Set up the user interface + """ + main_window.setObjectName(from_utf8('MainWindow')) + main_window.resize(800, 600) + self.central_widget = QtGui.QWidget(main_window) + self.central_widget.setObjectName(from_utf8('central_widget')) + self.central_layout = QtGui.QVBoxLayout(self.central_widget) + self.central_layout.setSpacing(8) + self.central_layout.setContentsMargins(0, 0, 0, 8) + self.central_layout.setObjectName(from_utf8('centralLayout')) + self.output_browser = CWebView(self.central_widget) + self.output_browser.setHtml('' % + str(QtGui.QApplication.palette().color(QtGui.QPalette.Text).name())) + self.output_browser.setObjectName(from_utf8('outputBrowser')) + self.central_layout.addWidget(self.output_browser) + self.send_layout = QtGui.QHBoxLayout() + self.send_layout.setSpacing(8) + self.send_layout.setObjectName(from_utf8('sendLayout')) + self.send_combobox = SComboBox(self.central_widget) + self.send_combobox.setEditable(True) + self.send_combobox.setEnabled(False) + self.send_combobox.setObjectName(from_utf8('sendComboBox')) + self.send_layout.addWidget(self.send_combobox) + self.send_button = QtGui.QPushButton(self.central_widget) + size_policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + size_policy.setHorizontalStretch(0) + size_policy.setVerticalStretch(0) + size_policy.setHeightForWidth(self.send_button.sizePolicy().hasHeightForWidth()) + self.send_button.setSizePolicy(size_policy) + self.send_button.setMaximumSize(QtCore.QSize(100, 16777215)) + self.send_button.setObjectName(from_utf8('sendButton')) + self.send_layout.addWidget(self.send_button) + self.central_layout.addLayout(self.send_layout) + main_window.setCentralWidget(self.central_widget) + self.status_bar = QtGui.QStatusBar(main_window) + self.status_bar.setObjectName(from_utf8('status_bar')) + main_window.setStatusBar(self.status_bar) + self.tool_bar = QtGui.QToolBar(main_window) + self.tool_bar.setMovable(False) + self.tool_bar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) + self.tool_bar.setFloatable(False) + self.tool_bar.setObjectName(from_utf8('tool_bar')) + main_window.addToolBar(QtCore.Qt.TopToolBarArea, self.tool_bar) + self.open_action = QtGui.QAction(main_window) + connect_icon = QtGui.QIcon() + connect_icon.addPixmap(QtGui.QPixmap(from_utf8(':/toolbar/network-connect.png')), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.open_action.setIcon(connect_icon) + self.open_action.setObjectName(from_utf8('open_action')) + self.close_action = QtGui.QAction(main_window) + disconnect_icon = QtGui.QIcon() + disconnect_icon.addPixmap(QtGui.QPixmap(from_utf8(':/toolbar/network-disconnect.png')), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.close_action.setIcon(disconnect_icon) + self.close_action.setObjectName(from_utf8('close_action')) + self.capture_action = QtGui.QAction(main_window) + capture_icon = QtGui.QIcon() + capture_icon.addPixmap(QtGui.QPixmap(from_utf8(':/toolbar/capture-to-disk.png')), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.capture_action.setIcon(capture_icon) + self.capture_action.setCheckable(True) + self.capture_action.setChecked(False) + self.capture_action.setObjectName(from_utf8('capture_action')) + self.follow_action = QtGui.QAction(main_window) + self.follow_action.setShortcut(QtCore.Qt.Key_F) + follow_icon = QtGui.QIcon() + follow_icon.addPixmap(QtGui.QPixmap(from_utf8(':/toolbar/follow-output.png')), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.follow_action.setIcon(follow_icon) + self.follow_action.setCheckable(True) + self.follow_action.setChecked(True) + self.follow_action.setObjectName(from_utf8('follow_action')) + self.configure_action = QtGui.QAction(main_window) + configure_icon = QtGui.QIcon() + configure_icon.addPixmap(QtGui.QPixmap(from_utf8(':/toolbar/configure.png')), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.configure_action.setIcon(configure_icon) + self.configure_action.setObjectName(from_utf8('configure_action')) + self.exit_action = QtGui.QAction(main_window) + exit_icon = QtGui.QIcon() + exit_icon.addPixmap(QtGui.QPixmap(from_utf8(':/toolbar/application-exit.png')), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.exit_action.setIcon(exit_icon) + self.exit_action.setObjectName(from_utf8('exit_action')) + self.tool_bar.addAction(self.open_action) + self.tool_bar.addAction(self.close_action) + self.tool_bar.addAction(self.capture_action) + self.tool_bar.addAction(self.follow_action) + self.tool_bar.addAction(self.configure_action) + self.tool_bar.addAction(self.exit_action) - def retranslateUi(self, mainWindow): - mainWindow.setWindowTitle(translate('MainWindow', 'ColourTerm')) - self.sendButton.setText(translate('MainWindow', 'Send')) - self.toolBar.setWindowTitle(translate('MainWindow', 'toolBar')) - self.openAction.setText(translate('MainWindow', 'Open...')) - self.openAction.setToolTip(translate('MainWindow', 'Open...')) - self.closeAction.setText(translate('MainWindow', 'Close')) - self.closeAction.setToolTip(translate('MainWindow', 'Close')) - self.captureAction.setText(translate('MainWindow', 'Capture')) - self.captureAction.setToolTip(translate('MainWindow', 'Capture to File')) - self.followAction.setText(translate('MainWindow', '&Follow')) - self.configureAction.setText(translate('MainWindow', 'Configure...')) - self.configureAction.setToolTip(translate('MainWindow', 'Configure...')) - self.exitAction.setText(translate('MainWindow', 'Exit')) + self.retranslate_ui(main_window) + + def retranslate_ui(self, main_window): + """ + Translate the user interface + """ + main_window.setWindowTitle(translate('MainWindow', 'ColourTerm')) + self.send_button.setText(translate('MainWindow', 'Send')) + self.tool_bar.setWindowTitle(translate('MainWindow', 'tool_bar')) + self.open_action.setText(translate('MainWindow', 'Open...')) + self.open_action.setToolTip(translate('MainWindow', 'Open...')) + self.close_action.setText(translate('MainWindow', 'Close')) + self.close_action.setToolTip(translate('MainWindow', 'Close')) + self.capture_action.setText(translate('MainWindow', 'Capture')) + self.capture_action.setToolTip(translate('MainWindow', 'Capture to File')) + self.follow_action.setText(translate('MainWindow', '&Follow')) + self.configure_action.setText(translate('MainWindow', 'Configure...')) + self.configure_action.setToolTip(translate('MainWindow', 'Configure...')) + self.exit_action.setText(translate('MainWindow', 'Exit')) -class MainWindow(QtGui.QMainWindow, Ui_MainWindow): +class MainWindow(QtGui.QMainWindow, UiMainWindow): updateOutput = QtCore.pyqtSignal(str) def __init__(self): - QtGui.QMainWindow.__init__(self) - self.terminalLines = [] - self.maxLines = 5000 - self.setupUi(self) + super(MainWindow, self).__init__() + self.terminal_lines = [] + self.max_lines = 5000 + self.setup_ui(self) self.device = None - self.deviceClosed = True - self.followOutput = True - self.captureFile = None - self.captureFileName = u'' - self.highlights = self.loadHighlights() + self.device_closed = True + self.follow_output = True + self.capture_file = None + self.capture_filename = u'' + self.highlights = self.load_highlights() if not self.highlights: self.highlights = create_default_highlights() - self.settingsDialog = SettingsDialog() - self.connectDialog = ConnectDialog() - self.openAction.triggered.connect(self.onOpenActionTriggered) - self.closeAction.triggered.connect(self.onCloseActionTriggered) - self.captureAction.toggled.connect(self.onCaptureActionToggled) - self.followAction.toggled.connect(self.onFollowActionToggled) - self.configureAction.triggered.connect(self.onConfigureActionTriggered) - self.exitAction.triggered.connect(self.close) - self.sendComboBox.keyPressed.connect(self.onSendComboBoxKeyPressed) - self.sendButton.clicked.connect(self.onSendButtonClicked) - self.outputBrowser.page().mainFrame().contentsSizeChanged.connect(self.onContentsSizeChanged) - self.outputBrowser.onScroll.connect(self.onOutputBrowserScrolled) - self.updateOutput.connect(self.onUpdateOutput) + self.settings_dialog = SettingsDialog() + self.connect_dialog = ConnectDialog(self) + self.open_action.triggered.connect(self.on_open_action_triggered) + self.close_action.triggered.connect(self.on_close_action_triggered) + self.capture_action.toggled.connect(self.on_capture_action_toggled) + self.follow_action.toggled.connect(self.on_follow_action_toggled) + self.configure_action.triggered.connect(self.on_configure_action_triggered) + self.exit_action.triggered.connect(self.close) + self.send_combobox.keyPressed.connect(self.on_send_combobox_key_pressed) + self.send_button.clicked.connect(self.on_send_button_clicked) + self.output_browser.page().mainFrame().contentsSizeChanged.connect(self.on_contents_size_changed) + self.output_browser.onScroll.connect(self.on_output_browser_scrolled) + self.updateOutput.connect(self.on_update_output) def close(self): - if not self.deviceClosed: - self.deviceClosed = True - if self.captureFile: - self.captureFile.flush() - self.captureFile.close() + if not self.device_closed: + self.device_closed = True + if self.capture_file: + self.capture_file.flush() + self.capture_file.close() return QtGui.QMainWindow.close(self) - def documentBody(self): - return self.outputBrowser.page().mainFrame().documentElement().findFirst('pre') + def document_body(self): + return self.output_browser.page().mainFrame().documentElement().findFirst('pre') - def receiveText(self): + def receive_text(self): output = '' - while not self.deviceClosed: + while not self.device_closed: output += self.device.read(1) if output.endswith('\r\n'): - #self.terminalLines.append(output.strip('\r\n')) - #if len(self.terminalLines) > self.maxLines: - # self.terminalLines = self.terminalLines[-self.maxLines:] + #self.terminal_lines.append(output.strip('\r\n')) + #if len(self.terminal_lines) > self.max_lines: + # self.terminal_lines = self.terminal_lines[-self.max_lines:] # self.refreshOutput() #else: self.updateOutput.emit(output.strip('\r\n')) output = '' - def onOpenActionTriggered(self): - self.connectDialog.updatePortCombobox() - if self.connectDialog.exec_() == QtGui.QDialog.Accepted: - if not self.deviceClosed: - self.deviceClosed = True + def on_open_action_triggered(self): + self.connect_dialog.update_port_combobox() + if self.connect_dialog.exec_() == QtGui.QDialog.Accepted: + if not self.device_closed: + self.device_closed = True self.device.close() try: self.device = Serial( - port=self.connectDialog.getPort(), - baudrate=self.connectDialog.getBaud(), - bytesize=self.connectDialog.getDataBits(), - parity=self.connectDialog.getParity(), - stopbits=self.connectDialog.getStopBits(), + port=self.connect_dialog.get_port(), + baudrate=self.connect_dialog.get_baud(), + bytesize=self.connect_dialog.get_data_bits(), + parity=self.connect_dialog.get_parity(), + stopbits=self.connect_dialog.get_stop_bits(), timeout=0, - xonxoff=self.connectDialog.getSoftwareHandshake(), - rtscts=self.connectDialog.getHardwareHandshake(), + xonxoff=self.connect_dialog.get_software_handshake(), + rtscts=self.connect_dialog.get_hardware_handshake(), dsrdtr=None ) - self.deviceClosed = False + self.device_closed = False if not self.device.isOpen(): self.device.open() - outputThread = threading.Thread(target=self.receiveText) - outputThread.start() - except SerialException, e: + output_thread = threading.Thread(target=self.receive_text) + output_thread.start() + except SerialException as e: QtGui.QMessageBox.critical(self, 'Error opening port', e.args[0]) - self.sendComboBox.setEnabled(not self.deviceClosed) - if self.sendComboBox.isEnabled(): - self.sendComboBox.setFocus() + self.send_combobox.setEnabled(not self.device_closed) + if self.send_combobox.isEnabled(): + self.send_combobox.setFocus() - def onCloseActionTriggered(self): - self.deviceClosed = True + def on_close_action_triggered(self): + self.device_closed = True if self.device.isOpen(): self.device.close() - self.sendComboBox.setEnabled(not self.deviceClosed) + self.send_combobox.setEnabled(not self.device_closed) - def onCaptureActionToggled(self, enabled): - if enabled and not self.captureFile: - if self.captureFileName: - baseDir = os.path.basename(self.captureFileName) + def on_capture_action_toggled(self, enabled): + if enabled and not self.capture_file: + if self.capture_filename: + base_dir = os.path.basename(self.capture_filename) else: - baseDir = u'' - self.captureFileName = QtGui.QFileDialog.getSaveFileName(self, u'Capture To File', - baseDir, u'Text files (*.txt *.log);;All files (*)') - self.captureFile = open(self.captureFileName, u'w') - self.statusbar.showMessage(self.captureFileName) - elif self.captureFile and not enabled: - self.captureFileName = u'' - self.captureFile.flush() - self.captureFile.close() - self.captureFile = None - self.statusbar.clearMessage() + base_dir = u'' + self.capture_filename = QtGui.QFileDialog.getSaveFileName(self, u'Capture To File', base_dir, + u'Text files (*.txt *.log);;All files (*)') + self.capture_file = open(self.capture_filename, u'w') + self.status_bar.showMessage(self.capture_filename) + elif self.capture_file and not enabled: + self.capture_filename = u'' + self.capture_file.flush() + self.capture_file.close() + self.capture_file = None + self.status_bar.clearMessage() - def onFollowActionToggled(self, enabled): - self.followOutput = enabled + def on_follow_action_toggled(self, enabled): + self.follow_output = enabled if enabled: - self.outputBrowser.page().mainFrame().scroll(0, - self.outputBrowser.page().mainFrame().contentsSize().height()) + self.output_browser.page().mainFrame().scroll( + 0, self.output_browser.page().mainFrame().contentsSize().height()) - def onConfigureActionTriggered(self): - self.settingsDialog.setHighlights(self.highlights) - self.settingsDialog.exec_() - self.highlights = self.settingsDialog.highlights() - self.saveHighlights(self.highlights) - self.refreshOutput() + def on_configure_action_triggered(self): + self.settings_dialog.set_highlights(self.highlights) + self.settings_dialog.exec_() + self.highlights = self.settings_dialog.highlights() + self.save_highlights(self.highlights) + self.refresh_output() - def onSendComboBoxKeyPressed(self, key): + def on_send_combobox_key_pressed(self, key): if key == QtCore.Qt.Key_Return or key == QtCore.Qt.Key_Enter: - self.onSendButtonClicked() + self.on_send_button_clicked() - def onSendButtonClicked(self): + def on_send_button_clicked(self): if self.device.isOpen(): - output = str(self.sendComboBox.currentText()) - self.sendComboBox.insertItem(0, output) - self.sendComboBox.setCurrentIndex(0) - self.sendComboBox.clearEditText() + output = str(self.send_combobox.currentText()) + self.send_combobox.insertItem(0, output) + self.send_combobox.setCurrentIndex(0) + self.send_combobox.clearEditText() self.device.write(output + '\r\n') - def onContentsSizeChanged(self, size): - if self.followOutput: - self.outputBrowser.page().mainFrame().scroll(0, size.height()) - self.outputBrowser.update() + def on_contents_size_changed(self, size): + if self.follow_output: + self.output_browser.page().mainFrame().scroll(0, size.height()) + self.output_browser.update() - def onUpdateOutput(self, output): - #self.terminalLines.append(output) - if self.captureFile: - self.captureFile.write(output + u'\n') - self.captureFile.flush() - #if len(self.terminalLines) > 5000: - # self.terminalLines = self.terminalLines[-5000:] + def on_update_output(self, output): + #self.terminal_lines.append(output) + if self.capture_file: + self.capture_file.write(output + '\n') + self.capture_file.flush() + #if len(self.terminal_lines) > 5000: + # self.terminal_lines = self.terminal_lines[-5000:] # self.refreshOutput() #else: - output = self.styleOutput(output) - self.documentBody().appendInside(output) + output = self.style_output(output) + self.document_body().appendInside(output) - def onOutputBrowserScrolled(self): - scrollValue = self.outputBrowser.page().mainFrame().scrollBarValue(QtCore.Qt.Vertical) - scrollMax = self.outputBrowser.page().mainFrame().scrollBarMaximum(QtCore.Qt.Vertical) - if scrollValue < scrollMax: - self.onFollowActionToggled(False) - self.followAction.setChecked(False) + def on_output_browser_scrolled(self): + scroll_value = self.output_browser.page().mainFrame().scrollBarValue(QtCore.Qt.Vertical) + scroll_max = self.output_browser.page().mainFrame().scrollBarMaximum(QtCore.Qt.Vertical) + if scroll_value < scroll_max: + self.on_follow_action_toggled(False) + self.follow_action.setChecked(False) else: - self.onFollowActionToggled(True) - self.followAction.setChecked(True) + self.on_follow_action_toggled(True) + self.follow_action.setChecked(True) - def refreshOutput(self): - elements = self.outputBrowser.page().mainFrame().findAllElements('div') + def refresh_output(self): + elements = self.output_browser.page().mainFrame().findAllElements('div') lines = [unicode(element.toPlainText()) for element in elements] - pre = self.outputBrowser.page().mainFrame().findFirstElement('pre') + pre = self.output_browser.page().mainFrame().findFirstElement('pre') pre.setInnerXml('') for line in lines: - output = self.styleOutput(line) - self.documentBody().appendInside(output) - self.outputBrowser.page().mainFrame().scroll(0, self.outputBrowser.page().mainFrame().contentsSize().height()) - self.outputBrowser.update() + output = self.style_output(line) + self.document_body().appendInside(output) + self.output_browser.page().mainFrame().scroll(0, self.output_browser.page().mainFrame().contentsSize().height()) + self.output_browser.update() - def styleOutput(self, output): - style = u'font-family: Ubuntu Mono; ' + def style_output(self, output): + style = u'font-family: \'Ubuntu Mono\', monospace; ' if not output: output = u' ' for highlight in self.highlights: @@ -301,7 +334,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): output = u'