connectors.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. # $Id$
  2. from PyQt4 import QtCore, QtGui
  3. from qt_utils import connect
  4. import settings
  5. class ConnectorPlugger(QtCore.QObject):
  6. def __init__(self, ui, connectorModel, settingsManager):
  7. QtCore.QObject.__init__(self)
  8. self.__connectorModel = connectorModel
  9. self.__ui = ui
  10. self.__settingsManager = settingsManager
  11. self.__connector = None
  12. self.__handlers = []
  13. # Connect to connector model and view:
  14. ui.connectorList.setModel(connectorModel)
  15. connectorModel.dataChanged.connect(self.connectorPluggableChanged)
  16. connect(
  17. ui.connectorList.selectionModel(),
  18. 'currentChanged(QModelIndex, QModelIndex)',
  19. self.updateConnector
  20. )
  21. connectorModel.initialized.connect(self.__initHandlers)
  22. # Connect signals of connector panels:
  23. def __initHandlers(self):
  24. # It is essential to keep the references, otherwise the classes are
  25. # garbage collected even though they have signal-slot connections
  26. # attached to them.
  27. self.__handlers = [
  28. handler(self.__ui, self)
  29. for handler in ( AudioInHandler, CassettePortHandler,
  30. JoyPortHandler, PrinterPortHandler, SerialHandler,
  31. AudioKbdPortHandler, MIDIinHandler, MIDIoutHandler
  32. )
  33. ]
  34. # while we're at it, also connect the setting controls
  35. settingsManager = self.__settingsManager
  36. ui = self.__ui
  37. settingsManager.registerSetting('print-resolution', settings.IntegerSetting)
  38. settingsManager.connectSetting('print-resolution',
  39. ui.printerResolutionSlider)
  40. settingsManager.connectSetting('print-resolution',
  41. ui.printerResolutionSpinBox)
  42. def __updateConnectorPage(self, connector):
  43. connectorClass = self.__connectorModel.getClass(connector)
  44. # Initialise the UI page for this connector.
  45. for handler in self.__handlers:
  46. if handler.connectorClass == connectorClass:
  47. handler.updatePage(connector)
  48. page = handler.getPage()
  49. break
  50. else:
  51. print 'no handler found for connectorClass "%s"' % connectorClass
  52. return page
  53. @QtCore.pyqtSignature('QModelIndex')
  54. def updateConnector(self, index):
  55. # Find out which connector entry has become active.
  56. connector = str(index.data(QtCore.Qt.UserRole).toString())
  57. if self.__connector == connector:
  58. return
  59. self.__connector = connector
  60. page = self.__updateConnectorPage(connector)
  61. # Switch page.
  62. self.__ui.connectorStack.setCurrentWidget(page)
  63. @QtCore.pyqtSignature('QModelIndex, QModelIndex')
  64. def connectorPluggableChanged(
  65. self, topLeft, bottomRight
  66. # pylint: disable-msg=W0613
  67. # TODO: We use the fact that we know ConnectorModel will only mark
  68. # one item changed at a time. This is not correct in general.
  69. ):
  70. index = topLeft
  71. connector = str(index.data(QtCore.Qt.UserRole).toString())
  72. if self.__connector == connector:
  73. self.__updateConnectorPage(connector)
  74. def setPluggable(self, pluggable):
  75. '''Sets a new pluggable for the currently selected connector.
  76. '''
  77. self.__connectorModel.setInserted(self.__connector, pluggable,
  78. lambda message: self.__connectorChangeErrorHandler(
  79. self.__connector, message
  80. )
  81. )
  82. def __connectorChangeErrorHandler(self, connector, message):
  83. messageBox = QtGui.QMessageBox('Plugging problem', message,
  84. QtGui.QMessageBox.Warning, 0, 0, 0,
  85. self.__ui.centralwidget
  86. )
  87. messageBox.show()
  88. self.__connectorModel.queryConnector(connector)
  89. def getModel(self):
  90. return self.__connectorModel
  91. class ConnectorHandler(QtCore.QObject):
  92. connector = None
  93. def __init__(self, ui, plugger):
  94. QtCore.QObject.__init__(self)
  95. self._ui = ui
  96. self._plugger = plugger
  97. # Look up UI elements.
  98. self._unplugButton = getattr(ui, self.connector + 'UnplugButton')
  99. self._pluggableBox = getattr(ui, self.connector + 'PluggableBox')
  100. self._pluggableLabel = getattr(ui, self.connector + 'Label')
  101. self._pluggableDescLabel = getattr(ui, self.connector + 'DescLabel')
  102. self._pluggableBox.clear()
  103. self._pluggableBox.addItem('--empty--')
  104. self._pluggableBox.addItems(
  105. plugger.getModel().getPluggables(self.connectorClass)
  106. )
  107. # Connect signals.
  108. connect(self._unplugButton, 'clicked()', self.unplug)
  109. connect(self._pluggableBox, 'activated(QString)', self.selectionChanged)
  110. def unplug(self):
  111. '''Removes the currently inserted pluggable.
  112. '''
  113. self._plugger.setPluggable('')
  114. def selectionChanged(self, newSelection):
  115. self._plugger.setPluggable(newSelection)
  116. def updatePage(self, connector):
  117. pluggable = self._plugger.getModel().getInserted(connector)
  118. # set combobox to the current value
  119. self._pluggableBox.setCurrentIndex(self._pluggableBox.findText(pluggable))
  120. # set description of pluggable
  121. description = self._plugger.getModel().getPluggableDescription(pluggable)
  122. self._pluggableDescLabel.setText(description)
  123. # set description (readable name) of connector
  124. self._pluggableLabel.setText(
  125. self._plugger.getModel().getConnectorDescription(connector)
  126. )
  127. def getPage(self):
  128. return getattr(self._ui, self.connector + 'Page')
  129. class AudioInHandler(ConnectorHandler):
  130. connector = 'audioIn'
  131. connectorClass = 'Audio Input Port'
  132. class CassettePortHandler(ConnectorHandler):
  133. connector = 'casPort'
  134. connectorClass = 'Cassette Port'
  135. class JoyPortHandler(ConnectorHandler):
  136. connector = 'joyPort'
  137. connectorClass = 'Joystick Port'
  138. class PrinterPortHandler(ConnectorHandler):
  139. connector = 'printerPort'
  140. connectorClass = 'Printer Port'
  141. class SerialHandler(ConnectorHandler):
  142. connector = 'RS232'
  143. connectorClass = 'RS232'
  144. class AudioKbdPortHandler(ConnectorHandler):
  145. connector = 'Y8950KbdPort'
  146. connectorClass = 'Y8950 Keyboard Port'
  147. class MIDIinHandler(ConnectorHandler):
  148. connector = 'MIDIin'
  149. connectorClass = 'midi in'
  150. class MIDIoutHandler(ConnectorHandler):
  151. connector = 'MIDIout'
  152. connectorClass = 'midi out'