class Window( QMainWindow ): def __init__(self, *args, **kwargs ): QMainWindow.__init__( self, *args, **kwargs ) self.installEventFilter( self ) self.setWindowFlags(QtCore.Qt.Drawer) self.layoutWidget = QWidget() self.setCentralWidget( self.layoutWidget ) self.layout = QVBoxLayout( self.layoutWidget ) self.layout.setContentsMargins( 5,5,5,5 ) self.ui_labels = UI_labels() self.ui_driverAttr1 = UI_attrlist() self.ui_driverAttr2 = UI_attrlist() self.ui_buttons = UI_buttons() self.layout.addWidget( self.ui_labels ) self.layout.addWidget( self.ui_driverAttr1 ) self.layout.addWidget( self.ui_driverAttr2 ) self.layout.addWidget( self.ui_buttons ) self.ui_driverAttr1.lineEdit_key.setText( '0' ) self.ui_driverAttr1.lineEdit_value.setText( '0' ) self.ui_driverAttr2.lineEdit_key.setText( '1' ) self.ui_driverAttr2.lineEdit_value.setText( '1' ) def addLineCommand(): numItems = self.layout.count() attrlist = UI_attrlist() self.layout.insertWidget( numItems-1, attrlist ) self.ui_buttons.button_connect.clicked.connect( partial( Commands.connectCommand, self ) ) self.ui_buttons.button_addLine.clicked.connect( addLineCommand ) def eventFilter( self, *args, **kwargs): event = args[1] if event.type() == QtCore.QEvent.LayoutRequest or event.type() == QtCore.QEvent.Move : pass
class Window(QMainWindow): def __init__(self, *args, **kwargs): QMainWindow.__init__(self, *args, **kwargs) self.installEventFilter(self) self.setWindowFlags(QtCore.Qt.Drawer) self.layoutWidget = QWidget() self.setCentralWidget(self.layoutWidget) self.layout = QVBoxLayout(self.layoutWidget) self.layout.setContentsMargins(5, 5, 5, 5) self.ui_labels = UI_labels() self.ui_driverAttr1 = UI_attrlist() self.ui_driverAttr2 = UI_attrlist() self.ui_buttons = UI_buttons() self.layout.addWidget(self.ui_labels) self.layout.addWidget(self.ui_driverAttr1) self.layout.addWidget(self.ui_driverAttr2) self.layout.addWidget(self.ui_buttons) self.ui_driverAttr1.lineEdit_key.setText('0') self.ui_driverAttr1.lineEdit_value.setText('0') self.ui_driverAttr2.lineEdit_key.setText('1') self.ui_driverAttr2.lineEdit_value.setText('1') def addLineCommand(): numItems = self.layout.count() attrlist = UI_attrlist() self.layout.insertWidget(numItems - 1, attrlist) self.ui_buttons.button_connect.clicked.connect( partial(Commands.connectCommand, self)) self.ui_buttons.button_addLine.clicked.connect(addLineCommand) def eventFilter(self, *args, **kwargs): event = args[1] if event.type() == QtCore.QEvent.LayoutRequest or event.type( ) == QtCore.QEvent.Move: pass
class FormPage(QWidget): statusMessage = Signal(str) def __init__(self, parent): super(FormPage, self).__init__(parent) layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) formframe = QGroupBox(self) self.vbox = QVBoxLayout(formframe) self.form = PropertyFormLayout() self.vbox.addLayout(self.form) self.vbox.addStretch(1) self._has_stretch = True layout.addWidget(formframe) def _removeStretch(self): if self._has_stretch: self.vbox.removeItem(self.vbox.itemAt(self.vbox.count() - 1)) self._has_stretch = False; def addStretch(self): if not self._has_stretch: self.vbox.addStretch(1) self._has_stretch = True def addProperty(self, kind, path, row, col, *args, **kwargs): self.form.addProperty(self, kind, path, row, col, *args, **kwargs) def addWidget(self, widget, *args): self._removeStretch() self.form.addWidget(widget, *args) def addLayout(self, sublayout, *args): self._removeStretch() self.form.addLayout(sublayout, *args) def status_message(self, msg, *args): self.statusMessage.emit(msg.format(*args))
class DeviceList(QScrollArea): def __init__(self, programming_handler, info_handler, reset_handler): super(DeviceList, self).__init__() self.deviceWidgets = [] self.programming_handler = programming_handler self.info_handler = info_handler self.reset_handler = reset_handler self.updateCounter = 0 self.initUI() def initUI(self): self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.listWidget = QWidget() self.layout = QVBoxLayout() self.layout.setContentsMargins(0, 0, 0, 0) self.listWidget.setLayout(self.layout) self.setWidgetResizable(True) self.setWidget(self.listWidget) self.updateList() def updateList(self): self.updateCounter += 1 deviceInfoList = list( filter(is_supported_device, easyhid.Enumeration().find())) deleteList = [] deviceIds = [dev.path for dev in deviceInfoList] oldDevices = [] newDevices = [] # look at the list of connected devices and find out which devices are # no longer connected and remove them i = 0 while i < self.layout.count(): devItem = self.layout.itemAt(i).widget() if hasattr(devItem, "device") and (devItem.device.path in deviceIds): oldDevices.append(devItem.device) i += 1 else: self.layout.takeAt(i).widget().deleteLater() # Now find the list of new devices oldDeviceIds = [dev.path for dev in oldDevices] for dev in deviceInfoList: if dev.path in oldDeviceIds: continue else: newDevices.append(dev) for devInfo in newDevices: devWidget = DeviceWidget(devInfo) if devWidget.label: self.deviceWidgets.append(devWidget) self.layout.addWidget(devWidget) devWidget.program.connect(self.programming_handler) devWidget.show_info.connect(self.info_handler) devWidget.reset.connect(self.reset_handler) # if len(self.deviceWidgets) == 0: if len(oldDevices) == 0 and len(newDevices) == 0: n = self.updateCounter % 4 label = QLabel("Scanning for devices" + "." * n + " " * (4 - n)) self.layout.setAlignment(Qt.AlignCenter) self.layout.addWidget(label) self.deviceWidgets = [] else: self.layout.setAlignment(Qt.AlignTop) self.updateCounter = 0
class Window( QMainWindow ): def __init__(self, *args, **kwargs ): QMainWindow.__init__( self, *args, **kwargs ) self.installEventFilter( self ) self.setWindowFlags(QtCore.Qt.Drawer) self.layoutWidget = QWidget() self.setCentralWidget( self.layoutWidget ) self.layout = QVBoxLayout( self.layoutWidget ) self.layout.setContentsMargins( 5,5,5,5 ) self.ui_labels = UI_labels() self.ui_driverAttr = UI_attrlist() #self.ui_options = UI_options() self.ui_buttons = UI_buttons() self.layout.addWidget( self.ui_labels ) self.layout.addWidget( self.ui_driverAttr ) #self.layout.addWidget( self.ui_options ) self.layout.addWidget( self.ui_buttons ) def addLineCommand(): numItems = self.layout.count() attrlist = UI_attrlist() self.layout.insertWidget( numItems-2, attrlist ) def setAttrCommand(): import pymel.core cmds.undoInfo( ock=1 ) sels = pymel.core.ls( sl=1 ) numItems = self.layout.count() for i in range( 1, numItems-1 ): targetWidget = self.layout.itemAt( i ).widget() attrName = targetWidget.lineEdit_srcAttr.text() attrValue = targetWidget.lineEdit_dstAttr.text() if not attrName or not attrValue: continue for sel in sels: attrType = sel.attr( attrName ).type() if attrType == 'string': sel.attr( attrName ).set( attrValue ) else: print "attr value : ", attrValue if attrValue.find( ',' ) != -1: values = [ float( value ) for value in attrValue.split( ',' ) ] sel.attr( attrName ).set( values ) else: sel.attr( attrName ).set( float( attrValue ) ) cmds.undoInfo( cck=1 ) self.ui_buttons.button_connect.clicked.connect( setAttrCommand ) self.ui_buttons.button_addLine.clicked.connect( addLineCommand ) def eventFilter( self, *args, **kwargs): event = args[1] if event.type() == QtCore.QEvent.LayoutRequest or event.type() == QtCore.QEvent.Move : pass
nameToCreate.setParent(widget) createLayout.insertWidget(createLayout.count()-2, nameToCreate) doneButton.hide() nameToCreate.hide() def doCreate(): createButton.hide() doneButton.show() nameToCreate.show() createButton.clicked.connect(doCreate) createdLayout = QVBoxLayout() layout.insertLayout(layout.count()-1, createdLayout) def doneCreating(): name = nameToCreate.text() created = QPushButton() created.setText("{0} @ {1}".format(name, hex(id(created)))) createdLayout.addWidget(created) doneButton.hide() nameToCreate.hide() createButton.show() doneButton.clicked.connect(doneCreating) nameToCreate.setMinimumWidth(150) widget.adjustSize()
def test_add_layout_succeeding(self): parent = QVBoxLayout() ChildAdder.add(QHBoxLayout(), 'fred', parent) self.assertEqual(parent.count(), 1) self.assertTrue(isinstance(parent.itemAt(0), QHBoxLayout))
class Window(QMainWindow): def __init__(self, *args, **kwargs): QMainWindow.__init__(self, *args, **kwargs) self.installEventFilter(self) self.setWindowFlags(QtCore.Qt.Drawer) self.layoutWidget = QWidget() self.setCentralWidget(self.layoutWidget) self.layout = QVBoxLayout(self.layoutWidget) self.layout.setContentsMargins(5, 5, 5, 5) self.ui_labels = UI_labels() self.ui_driverAttr = UI_attrlist() self.ui_options = UI_options() self.ui_buttons = UI_buttons() self.layout.addWidget(self.ui_labels) self.layout.addWidget(self.ui_driverAttr) self.layout.addWidget(self.ui_options) self.layout.addWidget(self.ui_buttons) def addLineCommand(): numItems = self.layout.count() attrlist = UI_attrlist() self.layout.insertWidget(numItems - 2, attrlist) def connectCommand(): cmds.undoInfo(ock=1) sels = cmds.ls(sl=1) numItems = self.layout.count() optionWidget = self.layout.itemAt(numItems - 2).widget() for i in range(1, numItems - 2): targetWidget = self.layout.itemAt(i).widget() srcAttr = targetWidget.lineEdit_srcAttr.text() dstAttr = targetWidget.lineEdit_dstAttr.text() if not srcAttr or not dstAttr: continue try: for sel in sels[1:]: target = sel if optionWidget.checkBox.isChecked(): selParents = cmds.listRelatives(sel, p=1, f=1) if selParents: target = selParents[0] cmds.connectAttr(sels[0] + '.' + srcAttr, target + '.' + dstAttr) except: pass cmds.undoInfo(cck=1) self.ui_buttons.button_connect.clicked.connect(connectCommand) self.ui_buttons.button_addLine.clicked.connect(addLineCommand) def eventFilter(self, *args, **kwargs): event = args[1] if event.type() == QtCore.QEvent.LayoutRequest or event.type( ) == QtCore.QEvent.Move: pass
class UI_Form( QMainWindow ): def __init__(self, *args, **kwargs ): QMainWindow.__init__( self, *args, **kwargs ) self.installEventFilter( self ) self.setWindowTitle( " PingoTools Installer" ) self.setWindowIcon( QtGui.QIcon( os.path.dirname( __file__ ) + '/images/letter-p.png') ) self.resize( 518, 400 ) self.mainWidget = QWidget() self.setCentralWidget( self.mainWidget ) self.mainLayout = QVBoxLayout() self.mainWidget.setLayout( self.mainLayout ) self.firstPage() def firstPage(self): for i in range( self.mainLayout.count() ): item = self.mainLayout.itemAt(0) item.widget().setParent( None ) title = QLabel( "<p style='color:rgb( 137,129,120 )'>Welcome to the PingoTools Installer</p>" ) title.setFixedHeight( 50 ) titleFont = QFont() titleFont.setPixelSize( 18 ) titleFont.setBold( True ) titleFont.setFamily( "Helvetica [Cronyx]" ) title.setAlignment( QtCore.Qt.AlignCenter ) title.setFont( titleFont ) description = QLabel() description.setAlignment( QtCore.Qt.AlignCenter ) buttonsWidget = QWidget(); buttonsWidget.setMaximumHeight( 50 ) buttonsLayout = QHBoxLayout( buttonsWidget ) emptyArea = QLabel() buttonNext = QPushButton( 'Next > ' ) buttonCancel = QPushButton( 'Cancel' ) buttonsLayout.addWidget( emptyArea ) buttonsLayout.addWidget( buttonNext ); buttonNext.setFixedWidth( 100 ) buttonsLayout.addWidget( buttonCancel ); buttonCancel.setFixedWidth( 100 ) self.mainLayout.addWidget( title ) self.mainLayout.addWidget( description ) self.mainLayout.addWidget( buttonsWidget ) origWidth = 500 frontImage = QImage() frontImage.load( os.path.dirname( __file__ ) + '/images/pingoTools_main.jpg' ) trValue = QTransform().scale( float(origWidth)/frontImage.width(), float(origWidth)/frontImage.width() ) transformedImage = frontImage.transformed( trValue ) pixmap = QPixmap.fromImage( transformedImage ) description.setPixmap( pixmap ) description.setGeometry( 0,0, transformedImage.width() , transformedImage.height() ) description.paintEvent(QPaintEvent(QtCore.QRect( 0,0,self.width(), self.height() ))) QtCore.QObject.connect( buttonNext, QtCore.SIGNAL( 'clicked()' ), self.secondPage ) QtCore.QObject.connect( buttonCancel, QtCore.SIGNAL( 'clicked()' ), self.cmd_cancel ) def secondPage(self): for i in range( self.mainLayout.count() ): item = self.mainLayout.itemAt(0) item.widget().setParent( None ) title = QLabel( "설치할 플러그인을 선택하십시오.".decode( 'utf-8' ) ) title.setFixedHeight( 50 ) listWidget = QListWidget() listWidget.setFixedHeight( 273 ) widgetItem_for2015 = QListWidgetItem("PingoTools for Maya2015", listWidget ) widgetItem_for2016 = QListWidgetItem("PingoTools for Maya2016", listWidget ) widgetItem_for2017 = QListWidgetItem("PingoTools for Maya2017", listWidget ) widgetItem_for2015.setCheckState( QtCore.Qt.Checked ) widgetItem_for2016.setCheckState( QtCore.Qt.Checked ) widgetItem_for2017.setCheckState( QtCore.Qt.Checked ) #widgetItem_for2015.setFlags( not QtCore.Qt.ItemIsSelectable ) buttonsWidget = QWidget(); buttonsWidget.setMaximumHeight( 50 ) buttonsLayout = QHBoxLayout( buttonsWidget ) emptyArea = QLabel() buttonBack = QPushButton( 'Back < ' ) buttonNext = QPushButton( 'Install' ) buttonCancel = QPushButton( 'Cancel' ) buttonsLayout.addWidget( emptyArea ) buttonsLayout.addWidget( buttonBack ); buttonBack.setFixedWidth( 100 ) buttonsLayout.addWidget( buttonNext ); buttonNext.setFixedWidth( 100 ) buttonsLayout.addWidget( buttonCancel ); buttonCancel.setFixedWidth( 100 ) self.mainLayout.addWidget( title ) self.mainLayout.addWidget( listWidget ) self.mainLayout.addWidget( buttonsWidget ) QtCore.QObject.connect( buttonBack, QtCore.SIGNAL( 'clicked()' ), self.firstPage ) QtCore.QObject.connect( buttonNext, QtCore.SIGNAL( 'clicked()' ), self.lastPage ) QtCore.QObject.connect( buttonCancel, QtCore.SIGNAL( 'clicked()' ), self.cmd_cancel ) def installPage(self): for i in range( self.mainLayout.count() ): item = self.mainLayout.itemAt(i) item.widget().setParent( None ) pass def lastPage(self): for i in range( self.mainLayout.count() ): item = self.mainLayout.itemAt(0) item.widget().setParent( None ) title = QLabel( "".decode( 'utf-8' ) ) title.setFixedHeight( 50 ) description = QLabel( "<p style='line-height:150%';'><b>PingoTools</b> 인스톨이 완료되었습니다.<p>".decode( 'utf-8' ) ) description.setAlignment( QtCore.Qt.AlignCenter ) buttonsWidget = QWidget(); buttonsWidget.setMaximumHeight( 50 ) buttonsLayout = QHBoxLayout( buttonsWidget ) emptyArea = QLabel() buttonClose = QPushButton( 'Close' ); buttonClose.setFixedWidth( 100 ) buttonsLayout.addWidget( emptyArea ) buttonsLayout.addWidget( buttonClose ) self.mainLayout.addWidget( title ) self.mainLayout.addWidget( description ) self.mainLayout.addWidget( buttonsWidget ) QtCore.QObject.connect( buttonClose, QtCore.SIGNAL( 'clicked()' ), self.cmd_close ) def cmd_cancel(self): messageBox = QMessageBox( self ) messageBox.setModal( True ) messageBox.setWindowTitle( "설치 취소".decode( 'utf-8' )) messageBox.setText( "설치를 취소하시겠습니까?".decode( 'utf-8' ) ) messageBox.setStandardButtons( QMessageBox.Yes| QMessageBox.No ) messageBox.setDefaultButton( QMessageBox.Yes ) result = messageBox.exec_() if result == QMessageBox.Yes: cancelWaningMessageBox = QMessageBox( self ) cancelWaningMessageBox.setModal( True ) cancelWaningMessageBox.setWindowTitle( "취소완료".decode( 'utf-8' ) ) cancelWaningMessageBox.setText( "설치가 취소되었습니다.".decode( 'utf-8' ) ) cancelWaningMessageBox.setStandardButtons( QMessageBox.Ok ) result = cancelWaningMessageBox.exec_() self.close() else: pass def cmd_close(self): self.close()
class Window( QMainWindow ): def __init__(self, *args, **kwargs ): QMainWindow.__init__( self, *args, **kwargs ) self.installEventFilter( self ) self.setWindowFlags(QtCore.Qt.Drawer) self.layoutWidget = QWidget() self.setCentralWidget( self.layoutWidget ) self.layout = QVBoxLayout( self.layoutWidget ) self.layout.setContentsMargins( 5,5,5,5 ) self.ui_labels = UI_labels() self.ui_driverAttr = UI_attrlist() self.ui_options = UI_options() self.ui_buttons = UI_buttons() self.layout.addWidget( self.ui_labels ) self.layout.addWidget( self.ui_driverAttr ) self.layout.addWidget( self.ui_options ) self.layout.addWidget( self.ui_buttons ) def addLineCommand(): numItems = self.layout.count() attrlist = UI_attrlist() self.layout.insertWidget( numItems-2, attrlist ) def connectCommand(): cmds.undoInfo( ock=1 ) sels = cmds.ls( sl=1 ) numItems = self.layout.count() optionWidget = self.layout.itemAt( numItems-2 ).widget() for i in range( 1, numItems-2 ): targetWidget = self.layout.itemAt( i ).widget() srcAttr = targetWidget.lineEdit_srcAttr.text() dstAttr = targetWidget.lineEdit_dstAttr.text() if not srcAttr or not dstAttr: continue try: for sel in sels[1:]: target = sel if optionWidget.checkBox.isChecked(): selParents = cmds.listRelatives( sel, p=1, f=1 ) if selParents: target = selParents[0] cmds.connectAttr( sels[0] + '.' + srcAttr, target + '.' + dstAttr ) except: pass cmds.undoInfo( cck=1 ) self.ui_buttons.button_connect.clicked.connect( connectCommand ) self.ui_buttons.button_addLine.clicked.connect( addLineCommand ) def eventFilter( self, *args, **kwargs): event = args[1] if event.type() == QtCore.QEvent.LayoutRequest or event.type() == QtCore.QEvent.Move : pass
class EegCarDashboardWindow(QWidget): def setSliderMaxThrottle(self, x): self.setMaxThrottle(x) # self.dashboard.set_throttle(x) # self.dashboard.wheel.forward(x) def setSteeringValue(self, x): # x range is 1-9 need to scale (10-90) x = x*10 self.dashboard.set_steering(x) # self.dashboard.steering.turn_by_position(x) pot = 1.5 self.dashboard.steering.turn_by_position(x, pot) def setSteeringTurnRangeValue(self, x): ticks = int(100000 * (x/10.0)) # max is 100000 # print "STEERING TURN TICKS %d" % ticks self.dashboard.set_steering_eeg_turn_ticks(ticks) def steering_update_current_pos(self): # x = int(self.steering_current_pos.text()) + delta_x # while check busy ## read position ## print 'current pos %d' % x ticks = int(self.steering_move_ticks.text()) seconds = int(ticks/(DEFAULT_STEERING_SPEED*7)) seconds = seconds + 1 # at least one second ending_time = time.time() + seconds while time.time() < ending_time: # print "ENDNIG: %d" % ending_time # print "CURRENT: %d" % time.time() self.steering_set_current_pos(self.dashboard.steering.get_current_location()) def steering_set_current_pos(self, x): self.steering_current_pos.setText(str(x)) def steering_move_left(self): ticks = int(self.steering_move_ticks.text()) # Stepping Motor MOVE! self.dashboard.steering.stepping_driver.forward(ticks) self.setMessage('Steering left') self.steering_update_current_pos() def steering_move_right(self): ticks = int(self.steering_move_ticks.text()) # Stepping Motor MOVE! self.dashboard.steering.stepping_driver.backward(ticks) self.setMessage('Steering right') self.steering_update_current_pos() def set_steering_move_ticks_value(self): self.steering_move_ticks.blockSignals(True) # update line edit ticks = int(self.steering_move_ticks.text()) self.steering_move_ticks.setText(str(ticks)) self.steering_move_ticks.blockSignals(False) self.steering_move_ticks.setModified(True) if self.steering_move_ticks.isModified(): self.steering_move_ticks.clearFocus() self.maxThrottle.setModified(False) def steering_reset_position(self): # RESET self.setMessage('Steering Controller Reset') self.dashboard.steering.stepping_driver.reset() # reset self.dashboard.steering.stepping_driver.set_speed(DEFAULT_STEERING_SPEED) # set speed self.steering_update_current_pos() def setMessage(self, msg): self.statusBar.showMessage(msg, 2000) def remote_control(self, state): if state == QtCore.Qt.Checked: self.dashboard.set_rc_mode(True) self.setMessage('SET RC MODE') else: self.dashboard.set_rc_mode(False) self.setMessage('CLEAR RC MODE') def keep_mode_control(self, state): if state == QtCore.Qt.Checked: self.keep_mode = True self.setMessage('Keep Mode (EEG)') else: self.keep_mode = False self.setMessage('Keyboard Mode') def power_handle_mode_control(self, state): if state == QtCore.Qt.Checked: self.dashboard.set_power_handle_mode(True) self.setMessage('Power Handle (Auto Steering Middle)') else: self.dashboard.set_power_handle_mode(False) self.setMessage('Turn Off Power Handle') def ignore_eeg_input_control(self, state): if state == QtCore.Qt.Checked: self.dashboard.set_ignore_eeg_input(True) self.setMessage('Ignore EEG Input') else: self.dashboard.set_ignore_eeg_input(False) self.setMessage('Access EEG Input') def stright_control(self, state): if state == QtCore.Qt.Checked: self.dashboard.set_rc_stright_mode(True) self.setMessage('RC STRIGHT Mode') else: self.dashboard.set_rc_stright_mode(False) self.setMessage('RC FREE L/R Mode') def __init__(self): QWidget.__init__(self) self.setWindowTitle("EEG Pilot Dashboard") self.setGeometry(0, 0, 750, 800) # self.setGeometry(300, 300, 750, 800) self.dashboard = EegCarDashboard() self.dashboard.set_max_throttle(DEFAULT_MAX_THROTTLE) self.dashboard.set_backward_max_throttle(DEFAULT_MAX_BACK_THROTTLE) self.layout = QVBoxLayout(self) # Drive Setting self.rc_mode = QCheckBox('Remote Control', self) self.rc_mode.stateChanged.connect(self.remote_control) self.rc_stright_mode = QCheckBox('RC Stright', self) self.rc_stright_mode.stateChanged.connect(self.stright_control) self.keep_mode_checkbox = QCheckBox('Keep Mode', self) self.keep_mode_checkbox.stateChanged.connect(self.keep_mode_control) self.power_handle_mode_checkbox = QCheckBox('Power Handle', self) self.power_handle_mode_checkbox.stateChanged.connect(self.power_handle_mode_control) self.ignore_eeg_input = QCheckBox('Ignore Eeg Input', self) self.ignore_eeg_input.stateChanged.connect(self.ignore_eeg_input_control) drive_layout = QHBoxLayout(self) drive_layout.addWidget(self.rc_mode) drive_layout.addWidget(self.rc_stright_mode) drive_layout.addWidget(self.keep_mode_checkbox) drive_layout.addWidget(self.power_handle_mode_checkbox) drive_layout.addWidget(self.ignore_eeg_input) drive_groupbox = QtGui.QGroupBox("Drive Status & Setting") drive_groupbox.setLayout(drive_layout) # Throttle Setting self.throttle_slider = QSlider(Qt.Horizontal) self.throttle_slider.setFocusPolicy(Qt.StrongFocus) self.throttle_slider.setTickPosition(QSlider.TicksBothSides) self.throttle_slider.setTickInterval(10) self.throttle_slider.setSingleStep(10) self.throttle_slider.setValue(DEFAULT_MAX_THROTTLE) self.throttle_slider.valueChanged.connect(self.throttle_slider.setValue) self.connect(self.throttle_slider, SIGNAL("valueChanged(int)"), self.setSliderMaxThrottle) self.throttle_label = QLabel('Max Throttle (%): ', self) self.maxThrottle = QLineEdit(str(DEFAULT_MAX_THROTTLE)) # self.maxThrottle.textChanged[str].connect(self.setMaxThrottle) self.maxThrottle.editingFinished.connect(self.setMaxThrottle) self.maxThrottle.setMaxLength(2) self.maxThrottle.setMaximumWidth(40) self.backwardMaxThrottle = QLineEdit(str(DEFAULT_MAX_BACK_THROTTLE)) # self.maxThrottle.textChanged[str].connect(self.setMaxThrottle) self.backwardMaxThrottle.editingFinished.connect(self.setBackwardMaxThrottle) self.backwardMaxThrottle.setMaxLength(2) self.backwardMaxThrottle.setMaximumWidth(40) throttle_layout = QHBoxLayout(self) throttle_layout.addWidget(self.throttle_label) throttle_layout.addWidget(self.throttle_slider) throttle_layout.addWidget(QLabel("Forward Max:")) throttle_layout.addWidget(self.maxThrottle) throttle_layout.addWidget(QLabel("Backward Max:")) throttle_layout.addWidget(self.backwardMaxThrottle) throttle_groupbox = QtGui.QGroupBox("Max Throttle Setting (30-99)") throttle_groupbox.setLayout(throttle_layout) # Steering self.steering_label = QLabel('Turn Range', self) self.steering_turn_range_slider = QSlider(Qt.Horizontal) self.steering_turn_range_slider.setFocusPolicy(Qt.StrongFocus) self.steering_turn_range_slider.setTickPosition(QSlider.TicksBothSides) self.steering_turn_range_slider.setRange(1, 9) # self.steering_slider.setMinimum(2) # self.steering_slider.setMaximum(8) self.steering_turn_range_slider.setMinimum(4) self.steering_turn_range_slider.setMaximum(8) self.steering_turn_range_slider.setTickInterval(1) self.steering_turn_range_slider.setSingleStep(1) self.steering_turn_range_slider.setValue(6) self.steering_turn_range_slider.valueChanged.connect(self.steering_turn_range_slider.setValue) self.connect(self.steering_turn_range_slider, SIGNAL("valueChanged(int)"), self.setSteeringTurnRangeValue) self.steering_adjust_label = QLabel(' Home Adjust ', self) self.steering_move_left_button = QPushButton('<Left+', self) self.steering_current_pos = QLabel('0', self) self.steering_move_right_button = QPushButton('-Right>', self) self.steering_move_ticks = QLineEdit(str(5000)) self.steering_move_ticks.editingFinished.connect(self.set_steering_move_ticks_value) self.steering_move_ticks.setMaxLength(5) self.steering_move_ticks.setMaximumWidth(50) self.steering_reset = QPushButton('Reset', self) self.steering_move_left_button.clicked.connect(self.steering_move_left) self.steering_move_right_button.clicked.connect(self.steering_move_right) self.steering_reset.clicked.connect(self.steering_reset_position) steering_layout = QHBoxLayout(self) steering_layout.addWidget(self.steering_label) # steering_layout.addWidget(self.steering_slider) steering_layout.addWidget(self.steering_turn_range_slider) steering_layout.addWidget(self.steering_adjust_label) steering_layout.addWidget(self.steering_move_left_button) steering_layout.addWidget(self.steering_current_pos) steering_layout.addWidget(self.steering_move_right_button) steering_layout.addWidget(self.steering_move_ticks) steering_layout.addWidget(self.steering_reset) steering_groupbox = QtGui.QGroupBox("Steering Setting") steering_groupbox.setLayout(steering_layout) self.layout.addWidget(self.dashboard, 2) self.layout.addWidget(drive_groupbox) self.layout.addWidget(throttle_groupbox) self.layout.addWidget(steering_groupbox) self.statusBar = QStatusBar() self.statusBar.showMessage('Ready', 2000) self.layout.addWidget(self.statusBar) self.setIcon() self.show() # save the state self.default_backgroundcolor = self.palette().color(QtGui.QPalette.Background) self.previos_steering = 50 self.init_keep_mode() self.init_power_handle_mode() # Timer For reading current steering position # self.timer = QtCore.QTimer() # self.timer.timeout.connect(self.readSteeringPos) # # check every second # self.timer.start(1000) # Timer For Powerhandle # self.power_handle_timer = QtCore.QTimer() # self.power_handle_timer.timeout.connect(self.update_power_handle) # # check every half second # self.power_handle_timer.start(500) # # Timer For Start Accel # self.start_accel_timer = QtCore.QTimer() # # self.start_accel_timer.singleShot(5000, self.end_start_accel_handle) # self.can_start_accel = True # def set_start_accel(self, value): # self.can_start_accel = value # def get_start_accel(self): # return self.can_start_accel # def end_start_accel_handle(self): # self.dashboard.end_start_accel() # def update_power_handle(self): # if self.power_handle_mode: # self.dashboard.update_power_handle() def readSteeringPos(self): # self.setMessage(str(self.dashboard.steering.get_current_steering())) # TODO: is it thread safe? # self.steering_set_current_pos(self.dashboard.steering.get_current_location()) return def getMaxThrottle(self): return int(self.maxThrottle.text()) def getBackwardMaxThrottle(self): return int(self.backwardMaxThrottle.text()) def setMaxThrottle(self, _throttle=None): if _throttle is None: # from line textbox throttle = self.getMaxThrottle() self.throttle_slider.blockSignals(True); # update slider self.throttle_slider.setValue(throttle); self.throttle_slider.blockSignals(False); else: # from slider throttle = _throttle self.maxThrottle.blockSignals(True); # update line edit self.maxThrottle.setText(str(throttle)) self.maxThrottle.blockSignals(False); self.maxThrottle.setModified(True) if self.maxThrottle.isModified(): if throttle >= FORWARD_THROTTLE_THRESHOLD: # forward throttle threshold is 20 self.dashboard.set_max_throttle(throttle) self.setMessage("Forward Max Throttle: %d" % throttle) self.maxThrottle.clearFocus() self.maxThrottle.setModified(False) def setBackwardMaxThrottle(self): throttle = self.getBackwardMaxThrottle() if self.backwardMaxThrottle.isModified(): if throttle >= BACKWARD_THROTTLE_THRESHOLD: # backward throttle threshold is 20 self.dashboard.set_backward_max_throttle(throttle) self.backwardMaxThrottle.clearFocus() self.backwardMaxThrottle.setModified(False) def setIcon(self): self.appIcon = QIcon('logo.png') self.setWindowIcon(self.appIcon) def init_keep_mode(self): self.w_keep_countdown = 0 self.x_keep_countdown = 0 self.a_keep_countdown = 0 self.d_keep_countdown = 0 self.default_keep_countdown = DEFAULT_KEEP_COUNT # self.default_keep_countdown = 28 # self.default_keep_countdown = 38 self.keep_mode = False def init_power_handle_mode(self): self.power_handle_mode = False def is_keep_mode(self, ignore_key): # if key is 'w' -> w_keep_countdown # if key is 'x' -> x_keep_countdown # ignore several 's' key while chountdown number to zero if self.keep_mode: if ignore_key == Qt.Key_S: if self.dashboard.power_handle_mode == True: self.dashboard.update_power_handle() if self.w_keep_countdown > 0: self.w_keep_countdown = self.w_keep_countdown - 1 # print "w keep countdown %d" % self.w_keep_countdown self.setMessage("w keep countdown %d" % self.w_keep_countdown) self.x_keep_countdown = 0 return True if self.x_keep_countdown > 0: self.x_keep_countdown = self.x_keep_countdown - 1 # print "x keep countdown %d" % self.x_keep_countdown self.setMessage("x keep countdown %d" % self.x_keep_countdown) self.w_keep_countdown = 0 return True if ignore_key == Qt.Key_X: if self.w_keep_countdown > 0: self.w_keep_countdown = self.w_keep_countdown - 1 self.setMessage("w keep countdown %d" % self.w_keep_countdown) if self.w_keep_countdown < DEFAULT_KEEP_COUNT - 10: # self.stop() self.dashboard.set_key_input('s') self.dashboard.stop() self.dashboard.set_start_accel(True) return True if ignore_key == Qt.Key_W: if self.x_keep_countdown > 0: self.x_keep_countdown = self.x_keep_countdown - 1 self.setMessage("x keep countdown %d" % self.x_keep_countdown) if self.x_keep_countdown < DEFAULT_KEEP_COUNT - 10: # self.stop() self.dashboard.set_key_input('s') self.dashboard.stop() self.dashboard.set_start_accel(True) return True return False def go_to_keep_mode(self, key): if key == Qt.Key_W: self.w_keep_countdown = self.default_keep_countdown if key == Qt.Key_X: self.x_keep_countdown = self.default_keep_countdown # A, D make a w_keep_countdown FOR powerhandle if key == Qt.Key_A: self.w_keep_countdown = self.default_keep_countdown if key == Qt.Key_D: self.w_keep_countdown = self.default_keep_countdown def keyPressEvent(self, event): if self.dashboard.rc_mode == True : if self.dashboard.ignore_eeg_input == True: self.ignore_eeg_input.setChecked(True) if event.key(): self.dashboard.set_key_input('Ignore') return else: self.ignore_eeg_input.setChecked(False) # self.update_power_handle(event.key()) if self.is_keep_mode(event.key()): return if event.key() == Qt.Key_S: self.dashboard.set_key_input('s') self.dashboard.stop() self.dashboard.set_start_accel(True) if event.key() == Qt.Key_W: self.dashboard.set_key_input('w') if self.dashboard.get_start_accel() == True: self.dashboard.start_accel_forward() else: self.dashboard.forward() if event.key() == Qt.Key_A: self.dashboard.set_key_input('a') if self.dashboard.get_start_accel() == True: self.dashboard.start_accel_turn_left() else: self.dashboard.turn_left() if event.key() == Qt.Key_X: self.dashboard.set_key_input('x') if self.dashboard.get_start_accel() == True: self.dashboard.start_accel_backward() else: self.dashboard.backward() if event.key() == Qt.Key_D: self.dashboard.set_key_input('d') if self.dashboard.get_start_accel() == True: self.dashboard.start_accel_turn_right() else: self.dashboard.turn_right() if event.key() == Qt.Key_B: self.dashboard.set_key_input('b') self.dashboard.brake() if event.key() == Qt.Key_R: self.dashboard.set_key_input('r') # TODO: Make Inspection Mode # self.dashboard.steering.position_clear() #pot = self.dashboard.wheel.get_steering_pot() #self.dashboard.steering.middle_position(pot) if event.key() == Qt.Key_F: if self.dashboard.isFullScreen(): for i in range(self.layout.count()): w = self.layout.itemAt(i).widget() w.show() self.dashboard.showNormal() self.change_backgroundcolor(self.default_backgroundcolor); self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowTitleHint) self.showNormal() else: for i in range(self.layout.count()): w = self.layout.itemAt(i).widget() if w == self.dashboard: continue w.hide() self.change_backgroundcolor(Qt.black); self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint) self.showMaximized() self.dashboard.showFullScreen() self.dashboard.reset_label_position() if event.key() == Qt.Key_Escape: self.dashboard.close() self.close() self.go_to_keep_mode(event.key()) def change_backgroundcolor(self, color): p = self.palette() p.setColor(self.backgroundRole(), color) self.setPalette(p)
class Window(QMainWindow): def __init__(self, *args, **kwargs): QMainWindow.__init__(self, *args, **kwargs) self.installEventFilter(self) self.setWindowFlags(QtCore.Qt.Drawer) self.layoutWidget = QWidget() self.setCentralWidget(self.layoutWidget) self.layout = QVBoxLayout(self.layoutWidget) self.layout.setContentsMargins(5, 5, 5, 5) self.ui_labels = UI_labels() self.ui_driverAttr = UI_attrlist() #self.ui_options = UI_options() self.ui_buttons = UI_buttons() self.layout.addWidget(self.ui_labels) self.layout.addWidget(self.ui_driverAttr) #self.layout.addWidget( self.ui_options ) self.layout.addWidget(self.ui_buttons) def addLineCommand(): numItems = self.layout.count() attrlist = UI_attrlist() self.layout.insertWidget(numItems - 2, attrlist) def connectCommand(): import pymel.core cmds.undoInfo(ock=1) sels = pymel.core.ls(sl=1) numItems = self.layout.count() enumNames = [] targetObjects = [] attrName = 'mode' for i in range(1, numItems - 1): targetWidget = self.layout.itemAt(i).widget() eachEnumName = targetWidget.lineEdit_srcAttr.text() targetObject = pymel.core.ls( targetWidget.lineEdit_dstAttr.text())[0] if not eachEnumName: continue enumNames.append(eachEnumName) targetObjects.append(targetObject) enumName = ':'.join(enumNames) + ':' addAttr(sels[-1], ln=attrName, at='enum', enumName=enumName, k=1) for i in range(len(targetObjects)): if not targetObjects[i]: continue condition = pymel.core.createNode('condition') sels[-1].attr(attrName) >> condition.firstTerm condition.secondTerm.set(i) condition.colorIfTrueR.set(1) condition.colorIfFalseR.set(0) condition.outColorR >> targetObjects[i].v cmds.undoInfo(cck=1) self.ui_buttons.button_connect.clicked.connect(connectCommand) self.ui_buttons.button_addLine.clicked.connect(addLineCommand) def eventFilter(self, *args, **kwargs): event = args[1] if event.type() == QtCore.QEvent.LayoutRequest or event.type( ) == QtCore.QEvent.Move: pass
class Window( QMainWindow ): def __init__(self, *args, **kwargs ): QMainWindow.__init__( self, *args, **kwargs ) self.installEventFilter( self ) self.setWindowFlags(QtCore.Qt.Drawer) self.layoutWidget = QWidget() self.setCentralWidget( self.layoutWidget ) self.layout = QVBoxLayout( self.layoutWidget ) self.layout.setContentsMargins( 5,5,5,5 ) self.ui_labels = UI_labels() self.ui_driverAttr = UI_attrlist() #self.ui_options = UI_options() self.ui_buttons = UI_buttons() self.layout.addWidget( self.ui_labels ) self.layout.addWidget( self.ui_driverAttr ) #self.layout.addWidget( self.ui_options ) self.layout.addWidget( self.ui_buttons ) def addLineCommand(): numItems = self.layout.count() attrlist = UI_attrlist() self.layout.insertWidget( numItems-2, attrlist ) def connectCommand(): import pymel.core cmds.undoInfo( ock=1 ) sels = pymel.core.ls( sl=1 ) numItems = self.layout.count() enumNames = [] targetObjects = [] attrName = 'mode' for i in range( 1, numItems-1 ): targetWidget = self.layout.itemAt( i ).widget() eachEnumName = targetWidget.lineEdit_srcAttr.text() targetObject = pymel.core.ls( targetWidget.lineEdit_dstAttr.text() )[0] if not eachEnumName: continue enumNames.append( eachEnumName ) targetObjects.append( targetObject ) enumName = ':'.join( enumNames ) + ':' addAttr( sels[-1], ln=attrName, at='enum', enumName = enumName, k=1 ) for i in range( len( targetObjects ) ): if not targetObjects[i]: continue condition = pymel.core.createNode( 'condition' ) sels[-1].attr( attrName ) >> condition.firstTerm condition.secondTerm.set( i ) condition.colorIfTrueR.set( 1 ) condition.colorIfFalseR.set( 0 ) condition.outColorR >> targetObjects[i].v cmds.undoInfo( cck=1 ) self.ui_buttons.button_connect.clicked.connect( connectCommand ) self.ui_buttons.button_addLine.clicked.connect( addLineCommand ) def eventFilter( self, *args, **kwargs): event = args[1] if event.type() == QtCore.QEvent.LayoutRequest or event.type() == QtCore.QEvent.Move : pass