Exemplo n.º 1
0
	def change_behaviour(self, val, gui=True):
		# print "Panel.change_behaviour=",val," gui=",gui
		val = str(val)
		self.currbehaviour = val
		dn = self.globals.settings_dir(self.globals.settingsname)
		fname = os.path.join(dn,val+".json")
		self.panelsettings = BehaviourSettings(fname)
		self.applySettings(self.panelsettings,gui=gui)
		self.player.behaviours[val].settings = self.panelsettings

		if gui:
			for ix in range(0, self.combo_behaviour.count()):
				if val == self.combo_behaviour.itemText(ix):
					# print "Found behaviour ix=",ix," val=",val
					self.combo_behaviour.setCurrentIndex(ix)
					break
Exemplo n.º 2
0
	def __init__(self,player,globals):
		super(Panel, self).__init__("")

		self.globals = globals
		self.write_file_onchange = False
		self.currbehaviour = None
		self.panelsettings = BehaviourSettings()
		self.player = player
		self.helpwindow = None

		self.label_message = QtGui.QLabel("")

		self.label_title = QtGui.QLabel("TUIO2MIDI  ")
		f = self.label_title.font()
		f.setPointSize(20)
		self.label_title.setFont(f)
		self.label_title.setAlignment(QtCore.Qt.AlignLeft)

		self.label_settingsname = self.just_label("Settings")
		self.combo_settingsname = QtGui.QComboBox()
		self.combo_settingsname.activated[str].connect(self.change_settingsname)
		self.init_combo_settingsname()

		# self.label_settingsname = self.just_label("Settings")
		# self.spinbox_settingsname = QtGui.QLineEdit()
		# self.spinbox_settingsname.returnPressed.connect(self.change_settingsname)
		# self.spinbox_settingsname.setText(settingsname)

		self.label_tuioport = self.just_label("TUIO Port")
		self.spinbox_tuioport = QtGui.QSpinBox()
		self.spinbox_tuioport.setRange(3333, 9999)
		self.spinbox_tuioport.setSingleStep(1)
		self.spinbox_tuioport.valueChanged[int].connect(self.change_tuioport)

		self.label_depthmult = self.just_label("Depth Multiplier")
		self.spinbox_depthmult = QtGui.QDoubleSpinBox()
		self.spinbox_depthmult.setRange(0.1, 3.0)
		self.spinbox_depthmult.setSingleStep(0.1)
		self.spinbox_depthmult.valueChanged.connect(self.change_depthmult)
		self.spinbox_depthmult.setValue(self.globals.depthmult)

		self.label_source = self.just_label("Source")
		self.text_source = QtGui.QLineEdit()
		self.text_source.textChanged.connect(self.change_source)

		self.label_attribute = self.just_label("Attribute")
		self.combo_attribute = QtGui.QComboBox()
		for s in Attribute.order:
			self.combo_attribute.addItem(s)
		self.combo_attribute.activated[str].connect(self.change_attribute)

		self.label_actiontype = self.just_label("Action")
		self.combo_actiontype = QtGui.QComboBox()
		self.combo_actiontype.addItem("Note")
		# self.combo_actiontype.addItem("Note (Velocity=Depth)")
		for i in range(0,128):
			self.combo_actiontype.addItem("Controller %d" % i)
		self.combo_actiontype.activated[str].connect(self.change_actiontype)

		self.label_scale = self.just_label("Scale")
		self.combo_scale = QtGui.QComboBox()
		for s in Scale.order:
			self.combo_scale.addItem(s)
		self.combo_scale.activated[str].connect(self.change_scale)

		self.label_key = self.just_label("Key")
		self.combo_key = QtGui.QComboBox()
		for i in range(len(Key.names)):
			self.combo_key.addItem(Key.names[i])
		self.combo_key.activated[str].connect(self.change_key)

		self.label_quant = self.just_label("Quantization")
		self.combo_quant = QtGui.QComboBox()
		for i in Quant.order:
			self.combo_quant.addItem(i)
		self.combo_quant.activated[str].connect(self.change_quant)

		self.label_duration = self.just_label("Duration")
		self.combo_duration = QtGui.QComboBox()
		for i in Duration.order:
			self.combo_duration.addItem(i)
		self.combo_duration.activated[str].connect(self.change_duration)

		self.label_behaviour = self.just_label("Behaviour")
		self.combo_behaviour = QtGui.QComboBox()
		self.init_combo_behaviour()

		self.label_midiin = self.just_label("Midi Input")
		self.combo_midiin = QtGui.QComboBox()
		for s in self.player.midiinputs:
			self.combo_midiin.addItem(s)
		self.combo_midiin.addItem("None")
		self.combo_midiin.activated[str].connect(self.change_midiin)
		self.change_midiin(self.globals.midiin)

		self.label_midiout = self.just_label("Midi Output")
		self.combo_midiout = QtGui.QComboBox()
		for s in self.player.midioutputs:
			self.combo_midiout.addItem(s)
		self.combo_midiout.addItem("None")
		self.combo_midiout.activated[str].connect(self.change_midiout)
		self.change_midiout(self.globals.midiout)

		self.label_thresh = self.just_label("Active Move%")
		self.spinbox_thresh = QtGui.QSpinBox()
		self.spinbox_thresh.setRange(0, 100)
		self.spinbox_thresh.setSingleStep(1)
		self.spinbox_thresh.valueChanged.connect(self.change_threshold)

		self.label_velocity = self.just_label("Velocity")
		self.spinbox_velocity = QtGui.QSpinBox()
		self.spinbox_velocity.setRange(1, 127)
		self.spinbox_velocity.setSingleStep(1)
		self.spinbox_velocity.valueChanged.connect(self.change_velocity)

		self.label_enabled = self.just_label("Enabled")
		self.checkbox_enabled = QtGui.QCheckBox()
		self.checkbox_enabled.stateChanged[int].connect(self.change_enabled)
		
		self.label_verbose = self.just_label("Verboseness")
		self.spinbox_verbose = QtGui.QSpinBox()
		self.spinbox_verbose.setRange(0, 2)
		self.spinbox_verbose.setSingleStep(1)
		self.spinbox_verbose.valueChanged[int].connect(self.change_verbose)
		self.spinbox_verbose.setValue(self.globals.verbose)
		
		self.label_channel = self.just_label("Channel")
		self.spinbox_channel = QtGui.QSpinBox()
		self.spinbox_channel.setRange(1, 17)
		self.spinbox_channel.setSingleStep(1)
		self.spinbox_channel.valueChanged.connect(self.change_channel)

		self.label_isscaled = self.just_label("Scaled")
		self.checkbox_isscaled = QtGui.QCheckBox()
		self.checkbox_isscaled.stateChanged[int].connect(self.change_isscaled)

		self.label_depthvol = self.just_label("Depth=Vol")
		self.checkbox_depthvol = QtGui.QCheckBox()
		self.checkbox_depthvol.stateChanged[int].connect(self.change_depthvol)

		self.label_pitchmin = self.just_label("Pitch/Val Min")
		self.spinbox_pitchmin = QtGui.QSpinBox()
		self.spinbox_pitchmin.setRange(0, 120)
		self.spinbox_pitchmin.setSingleStep(1)
		self.spinbox_pitchmin.valueChanged[int].connect(self.change_pitchmin)
		# self.spinbox_pitchmin.valueChanged.connect(self.change_pitchmin)

		self.label_pitchmax = self.just_label("Pitch/Val Max")
		self.spinbox_pitchmax = QtGui.QSpinBox()
		self.spinbox_pitchmax.setRange(10, 127)
		self.spinbox_pitchmax.setSingleStep(1)
		self.spinbox_pitchmax.valueChanged[int].connect(self.change_pitchmax)

		self.label_activemin = self.just_label("Active Min%")
		self.spinbox_activemin = QtGui.QSpinBox()
		self.spinbox_activemin.setRange(0, 90)
		self.spinbox_activemin.setSingleStep(1)
		# self.spinbox_activemin.valueChanged[int].connect(self.change_activemin)
		self.spinbox_activemin.valueChanged.connect(self.change_activemin)

		self.label_activemax = self.just_label("Active Max%")
		self.spinbox_activemax = QtGui.QSpinBox()
		self.spinbox_activemax.setRange(10, 100)
		self.spinbox_activemax.setSingleStep(1)
		self.spinbox_activemax.valueChanged[int].connect(self.change_activemax)

		layout_master = QtGui.QGridLayout()
		layout_title = QtGui.QGridLayout()
		layout_globals = QtGui.QGridLayout()
		layout_settings = QtGui.QGridLayout()

		#######################################

		layout_title.addWidget(self.label_title, 0, 0, 1, 1)

		self.open_button = QtGui.QPushButton("Open Settings Directory")
		self.open_button.clicked.connect(self.do_open)
		# layout_title.addWidget(self.open_button, 0, 2, 1, 1)

		# self.help_button = QtGui.QPushButton("Help")
		# self.help_button.clicked.connect(self.do_help)
		# layout.addWidget(self.help_button, row, 3, 1, 1)

		#######################################

		row = 0
		ncols = 4

		row += 1
		layout_globals.addWidget(self.just_label(" "), row, 0, 1, ncols)

		row += 1
		layout_globals.addWidget(self.open_button, row, 1, 1, 2)

		row += 1
		layout_globals.addWidget(self.just_label(" "), row, 0, 1, ncols)

		row += 1
		layout_globals.addWidget(self.label_settingsname, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.combo_settingsname, row, 2, 1, 1, QtCore.Qt.AlignTop)

		row += 1
		layout_globals.addWidget(self.label_tuioport, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.spinbox_tuioport, row, 2, 1, 1, QtCore.Qt.AlignTop)

		row += 1
		layout_globals.addWidget(self.label_depthmult, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.spinbox_depthmult, row, 2, 1, 1, QtCore.Qt.AlignTop)

		row += 1
		layout_globals.addWidget(self.label_midiin, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.combo_midiin, row, 2, 1, 1, QtCore.Qt.AlignTop)

		row += 1
		layout_globals.addWidget(self.label_midiout, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.combo_midiout, row, 2, 1, 1, QtCore.Qt.AlignTop)

		row += 1
		layout_globals.addWidget(self.label_verbose, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.spinbox_verbose, row, 2, 1, 1, QtCore.Qt.AlignTop)

		#######################################

		row += 1
		layout_settings.addWidget(self.label_behaviour, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_behaviour, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_enabled, row, 1, 1, 1)
		layout_settings.addWidget(self.checkbox_enabled, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_source, row, 1, 1, 1)
		layout_settings.addWidget(self.text_source, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_actiontype, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_actiontype, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_attribute, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_attribute, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_activemin, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_activemin, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_activemax, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_activemax, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_thresh, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_thresh, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_channel, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_channel, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_pitchmin, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_pitchmin, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_pitchmax, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_pitchmax, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_isscaled, row, 1, 1, 1)
		layout_settings.addWidget(self.checkbox_isscaled, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_scale, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_scale, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_key, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_key, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_quant, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_quant, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_duration, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_duration, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_velocity, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_velocity, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_depthvol, row, 1, 1, 1)
		layout_settings.addWidget(self.checkbox_depthvol, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_message, row, 0, 1, ncols)

		#########################################

		layout_master.addLayout(layout_title, 0, 0, 1, 1)
		layout_master.addLayout(layout_globals, 1, 0, 1, 1)

		layout_master.addWidget(self.just_label("       "), 0, 1, 1, 1)

		layout_master.addLayout(layout_settings, 0, 2, 3, 1)
		layout_master.setAlignment(layout_settings, QtCore.Qt.AlignTop)

		self.setLayout(layout_master)
Exemplo n.º 3
0
class Panel(QtGui.QGroupBox):

	def __init__(self,player,globals):
		super(Panel, self).__init__("")

		self.globals = globals
		self.write_file_onchange = False
		self.currbehaviour = None
		self.panelsettings = BehaviourSettings()
		self.player = player
		self.helpwindow = None

		self.label_message = QtGui.QLabel("")

		self.label_title = QtGui.QLabel("TUIO2MIDI  ")
		f = self.label_title.font()
		f.setPointSize(20)
		self.label_title.setFont(f)
		self.label_title.setAlignment(QtCore.Qt.AlignLeft)

		self.label_settingsname = self.just_label("Settings")
		self.combo_settingsname = QtGui.QComboBox()
		self.combo_settingsname.activated[str].connect(self.change_settingsname)
		self.init_combo_settingsname()

		# self.label_settingsname = self.just_label("Settings")
		# self.spinbox_settingsname = QtGui.QLineEdit()
		# self.spinbox_settingsname.returnPressed.connect(self.change_settingsname)
		# self.spinbox_settingsname.setText(settingsname)

		self.label_tuioport = self.just_label("TUIO Port")
		self.spinbox_tuioport = QtGui.QSpinBox()
		self.spinbox_tuioport.setRange(3333, 9999)
		self.spinbox_tuioport.setSingleStep(1)
		self.spinbox_tuioport.valueChanged[int].connect(self.change_tuioport)

		self.label_depthmult = self.just_label("Depth Multiplier")
		self.spinbox_depthmult = QtGui.QDoubleSpinBox()
		self.spinbox_depthmult.setRange(0.1, 3.0)
		self.spinbox_depthmult.setSingleStep(0.1)
		self.spinbox_depthmult.valueChanged.connect(self.change_depthmult)
		self.spinbox_depthmult.setValue(self.globals.depthmult)

		self.label_source = self.just_label("Source")
		self.text_source = QtGui.QLineEdit()
		self.text_source.textChanged.connect(self.change_source)

		self.label_attribute = self.just_label("Attribute")
		self.combo_attribute = QtGui.QComboBox()
		for s in Attribute.order:
			self.combo_attribute.addItem(s)
		self.combo_attribute.activated[str].connect(self.change_attribute)

		self.label_actiontype = self.just_label("Action")
		self.combo_actiontype = QtGui.QComboBox()
		self.combo_actiontype.addItem("Note")
		# self.combo_actiontype.addItem("Note (Velocity=Depth)")
		for i in range(0,128):
			self.combo_actiontype.addItem("Controller %d" % i)
		self.combo_actiontype.activated[str].connect(self.change_actiontype)

		self.label_scale = self.just_label("Scale")
		self.combo_scale = QtGui.QComboBox()
		for s in Scale.order:
			self.combo_scale.addItem(s)
		self.combo_scale.activated[str].connect(self.change_scale)

		self.label_key = self.just_label("Key")
		self.combo_key = QtGui.QComboBox()
		for i in range(len(Key.names)):
			self.combo_key.addItem(Key.names[i])
		self.combo_key.activated[str].connect(self.change_key)

		self.label_quant = self.just_label("Quantization")
		self.combo_quant = QtGui.QComboBox()
		for i in Quant.order:
			self.combo_quant.addItem(i)
		self.combo_quant.activated[str].connect(self.change_quant)

		self.label_duration = self.just_label("Duration")
		self.combo_duration = QtGui.QComboBox()
		for i in Duration.order:
			self.combo_duration.addItem(i)
		self.combo_duration.activated[str].connect(self.change_duration)

		self.label_behaviour = self.just_label("Behaviour")
		self.combo_behaviour = QtGui.QComboBox()
		self.init_combo_behaviour()

		self.label_midiin = self.just_label("Midi Input")
		self.combo_midiin = QtGui.QComboBox()
		for s in self.player.midiinputs:
			self.combo_midiin.addItem(s)
		self.combo_midiin.addItem("None")
		self.combo_midiin.activated[str].connect(self.change_midiin)
		self.change_midiin(self.globals.midiin)

		self.label_midiout = self.just_label("Midi Output")
		self.combo_midiout = QtGui.QComboBox()
		for s in self.player.midioutputs:
			self.combo_midiout.addItem(s)
		self.combo_midiout.addItem("None")
		self.combo_midiout.activated[str].connect(self.change_midiout)
		self.change_midiout(self.globals.midiout)

		self.label_thresh = self.just_label("Active Move%")
		self.spinbox_thresh = QtGui.QSpinBox()
		self.spinbox_thresh.setRange(0, 100)
		self.spinbox_thresh.setSingleStep(1)
		self.spinbox_thresh.valueChanged.connect(self.change_threshold)

		self.label_velocity = self.just_label("Velocity")
		self.spinbox_velocity = QtGui.QSpinBox()
		self.spinbox_velocity.setRange(1, 127)
		self.spinbox_velocity.setSingleStep(1)
		self.spinbox_velocity.valueChanged.connect(self.change_velocity)

		self.label_enabled = self.just_label("Enabled")
		self.checkbox_enabled = QtGui.QCheckBox()
		self.checkbox_enabled.stateChanged[int].connect(self.change_enabled)
		
		self.label_verbose = self.just_label("Verboseness")
		self.spinbox_verbose = QtGui.QSpinBox()
		self.spinbox_verbose.setRange(0, 2)
		self.spinbox_verbose.setSingleStep(1)
		self.spinbox_verbose.valueChanged[int].connect(self.change_verbose)
		self.spinbox_verbose.setValue(self.globals.verbose)
		
		self.label_channel = self.just_label("Channel")
		self.spinbox_channel = QtGui.QSpinBox()
		self.spinbox_channel.setRange(1, 17)
		self.spinbox_channel.setSingleStep(1)
		self.spinbox_channel.valueChanged.connect(self.change_channel)

		self.label_isscaled = self.just_label("Scaled")
		self.checkbox_isscaled = QtGui.QCheckBox()
		self.checkbox_isscaled.stateChanged[int].connect(self.change_isscaled)

		self.label_depthvol = self.just_label("Depth=Vol")
		self.checkbox_depthvol = QtGui.QCheckBox()
		self.checkbox_depthvol.stateChanged[int].connect(self.change_depthvol)

		self.label_pitchmin = self.just_label("Pitch/Val Min")
		self.spinbox_pitchmin = QtGui.QSpinBox()
		self.spinbox_pitchmin.setRange(0, 120)
		self.spinbox_pitchmin.setSingleStep(1)
		self.spinbox_pitchmin.valueChanged[int].connect(self.change_pitchmin)
		# self.spinbox_pitchmin.valueChanged.connect(self.change_pitchmin)

		self.label_pitchmax = self.just_label("Pitch/Val Max")
		self.spinbox_pitchmax = QtGui.QSpinBox()
		self.spinbox_pitchmax.setRange(10, 127)
		self.spinbox_pitchmax.setSingleStep(1)
		self.spinbox_pitchmax.valueChanged[int].connect(self.change_pitchmax)

		self.label_activemin = self.just_label("Active Min%")
		self.spinbox_activemin = QtGui.QSpinBox()
		self.spinbox_activemin.setRange(0, 90)
		self.spinbox_activemin.setSingleStep(1)
		# self.spinbox_activemin.valueChanged[int].connect(self.change_activemin)
		self.spinbox_activemin.valueChanged.connect(self.change_activemin)

		self.label_activemax = self.just_label("Active Max%")
		self.spinbox_activemax = QtGui.QSpinBox()
		self.spinbox_activemax.setRange(10, 100)
		self.spinbox_activemax.setSingleStep(1)
		self.spinbox_activemax.valueChanged[int].connect(self.change_activemax)

		layout_master = QtGui.QGridLayout()
		layout_title = QtGui.QGridLayout()
		layout_globals = QtGui.QGridLayout()
		layout_settings = QtGui.QGridLayout()

		#######################################

		layout_title.addWidget(self.label_title, 0, 0, 1, 1)

		self.open_button = QtGui.QPushButton("Open Settings Directory")
		self.open_button.clicked.connect(self.do_open)
		# layout_title.addWidget(self.open_button, 0, 2, 1, 1)

		# self.help_button = QtGui.QPushButton("Help")
		# self.help_button.clicked.connect(self.do_help)
		# layout.addWidget(self.help_button, row, 3, 1, 1)

		#######################################

		row = 0
		ncols = 4

		row += 1
		layout_globals.addWidget(self.just_label(" "), row, 0, 1, ncols)

		row += 1
		layout_globals.addWidget(self.open_button, row, 1, 1, 2)

		row += 1
		layout_globals.addWidget(self.just_label(" "), row, 0, 1, ncols)

		row += 1
		layout_globals.addWidget(self.label_settingsname, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.combo_settingsname, row, 2, 1, 1, QtCore.Qt.AlignTop)

		row += 1
		layout_globals.addWidget(self.label_tuioport, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.spinbox_tuioport, row, 2, 1, 1, QtCore.Qt.AlignTop)

		row += 1
		layout_globals.addWidget(self.label_depthmult, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.spinbox_depthmult, row, 2, 1, 1, QtCore.Qt.AlignTop)

		row += 1
		layout_globals.addWidget(self.label_midiin, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.combo_midiin, row, 2, 1, 1, QtCore.Qt.AlignTop)

		row += 1
		layout_globals.addWidget(self.label_midiout, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.combo_midiout, row, 2, 1, 1, QtCore.Qt.AlignTop)

		row += 1
		layout_globals.addWidget(self.label_verbose, row, 1, 1, 1, QtCore.Qt.AlignTop)
		layout_globals.addWidget(self.spinbox_verbose, row, 2, 1, 1, QtCore.Qt.AlignTop)

		#######################################

		row += 1
		layout_settings.addWidget(self.label_behaviour, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_behaviour, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_enabled, row, 1, 1, 1)
		layout_settings.addWidget(self.checkbox_enabled, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_source, row, 1, 1, 1)
		layout_settings.addWidget(self.text_source, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_actiontype, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_actiontype, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_attribute, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_attribute, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_activemin, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_activemin, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_activemax, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_activemax, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_thresh, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_thresh, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_channel, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_channel, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_pitchmin, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_pitchmin, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_pitchmax, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_pitchmax, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_isscaled, row, 1, 1, 1)
		layout_settings.addWidget(self.checkbox_isscaled, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_scale, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_scale, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_key, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_key, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_quant, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_quant, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_duration, row, 1, 1, 1)
		layout_settings.addWidget(self.combo_duration, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_velocity, row, 1, 1, 1)
		layout_settings.addWidget(self.spinbox_velocity, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_depthvol, row, 1, 1, 1)
		layout_settings.addWidget(self.checkbox_depthvol, row, 2, 1, 1)

		row += 1
		layout_settings.addWidget(self.label_message, row, 0, 1, ncols)

		#########################################

		layout_master.addLayout(layout_title, 0, 0, 1, 1)
		layout_master.addLayout(layout_globals, 1, 0, 1, 1)

		layout_master.addWidget(self.just_label("       "), 0, 1, 1, 1)

		layout_master.addLayout(layout_settings, 0, 2, 3, 1)
		layout_master.setAlignment(layout_settings, QtCore.Qt.AlignTop)

		self.setLayout(layout_master)

	def init_combo_behaviour(self):
		self.combo_behaviour.clear()
		if self.player.behaviournames:
			for i in self.player.behaviournames:
				if self.currbehaviour == None:
					self.currbehaviour = i
				self.combo_behaviour.addItem(i)
			self.combo_behaviour.activated[str].connect(self.change_behaviour)

	def init_combo_settingsname(self):
		self.combo_settingsname.clear()
		dir = self.globals.settings_dir()
		settingsnames = [f.replace(".json","") for f in os.listdir(dir) if os.path.isdir(os.path.join(dir,f)) ]
		settingsnames.sort()
		ix = 0
		for i in settingsnames:
			self.combo_settingsname.addItem(i)
			if self.globals.settingsname == i:
				self.combo_settingsname.setCurrentIndex(ix)
				# ix = i
			ix += 1
		# self.combo_settingsname.activated[str].connect(self.change_settingsname)

	def just_label(self, s):
		# in case the label Alignment needs to be changed
		label = QtGui.QLabel(s)
		return label

	def set_player(self,player):
		self.player = player

	def do_help(self):
		self.helpwindow = HelpPopup()
		self.helpwindow.setGeometry(QtCore.QRect(300, 100, 400, 150))
		self.helpwindow.show()

	def do_open(self):
		# the quotes around the title (\"Settings\") are important
		os.system("start \"Settings\" explorer \"%s\"" % self.globals.settings_dir())

	def close_help(self):
		if self.helpwindow:
			self.helpwindow.close()

	def set_message(self, msg):
		self.label_message.setText(msg)

	def change_settingsname(self, val, gui=True):
		val = str(val)
		self.globals.settingsname = val
		self.player.init_settings(val)
		self.currbehaviour = None
		self.init_combo_behaviour()
		if self.currbehaviour:
			self.change_behaviour(self.currbehaviour, True)
			self.globals.write()

		# self.update_scalenotes()

	def change_tuioport(self, val, gui=True):
		val = int(val)
		self.globals.tuioport = val
		if gui:
			self.spinbox_tuioport.setValue(val)
			self.globals.write()

	def change_depthmult(self, val, gui=True):
		val = float(val)
		self.globals.depthmult = val
		if gui:
			self.spinbox_depthmult.setValue(val)
			self.globals.write()

	####### Behaviour

	def change_behaviour(self, val, gui=True):
		# print "Panel.change_behaviour=",val," gui=",gui
		val = str(val)
		self.currbehaviour = val
		dn = self.globals.settings_dir(self.globals.settingsname)
		fname = os.path.join(dn,val+".json")
		self.panelsettings = BehaviourSettings(fname)
		self.applySettings(self.panelsettings,gui=gui)
		self.player.behaviours[val].settings = self.panelsettings

		if gui:
			for ix in range(0, self.combo_behaviour.count()):
				if val == self.combo_behaviour.itemText(ix):
					# print "Found behaviour ix=",ix," val=",val
					self.combo_behaviour.setCurrentIndex(ix)
					break

	def write_settings(self):
		# we want to write self.panelsettings
		if not self.write_file_onchange:
			return
		bn = str(self.combo_behaviour.currentText())
		self.player.behaviours[bn].settings = self.panelsettings
		dn = self.globals.settings_dir(self.globals.settingsname)
		# Make sure the directory exists
		try:
			os.stat(dn)
		except:
			# directory doesn't exist, probably
			os.makedirs(dn)

		fname = os.path.join(dn,bn+".json")
		self.panelsettings.write_behaviour(fname)

	def applySettings(self,s,gui):
		self.change_attribute(s.attribute,gui)
		self.change_actiontype(s.actiontype,gui)
		self.change_source(s.source,gui)
		self.change_activemin(s.activemin,gui)
		self.change_activemax(s.activemax,gui)
		self.change_pitchmin(s.valuemin,gui)
		self.change_pitchmax(s.valuemax,gui)
		self.change_threshold(s.threshold,gui)
		self.change_isscaled(s.isscaled,gui)
		self.change_depthvol(s.depthvol,gui)
		self.change_channel(s.channel,gui)
		self.change_duration(s.duration,gui)
		self.change_enabled(s.enabled,gui)
		self.change_quant(s.quant,gui)
		self.change_scale(s.scale,gui)
		self.change_key(s.key,gui)
		self.change_velocity(s.velocity,gui)

	####### Midi Input

	def change_midiin(self, val):
		self.midiin = val
		if not self.player.open_midiin(val):
			self.combo_midiin.setCurrentIndex(self.indexof_midiin("None"))
			self.midiin = "None"
		else:
			i = self.indexof_midiin(val)
			self.combo_midiin.setCurrentIndex(i)

	def indexof_midiin(self, name):
		# Assumes that None is after all midiinputs
		if name == "None":
			return len(self.player.midiinputs)
		return self.player.midiinputs.index(name)

	####### Midi Output

	def change_midiout(self, val, gui=True):
		val = str(val)
		if not self.player.open_midiout(val):
			if gui:
				self.combo_midiout.setCurrentIndex(self.indexof_midiout("None"))
				self.midiout = "None"
		else:
			i = self.indexof_midiout(val)
			self.combo_midiout.setCurrentIndex(i)
			self.globals.midiout = val
			self.globals.write()

	def indexof_midiout(self, name):
		# Assumes that None is after all midioutputs
		if name == "None":
			return len(self.player.midioutputs)
		return self.player.midioutputs.index(name)

	####### Duration

	def change_duration(self, val, gui=True):
		val = str(val)
		self.player.set_duration(val)
		self.panelsettings.duration = val
		if gui:
			for ix in range(0, self.combo_duration.count()):
				if val == self.combo_duration.itemText(ix):
					self.combo_duration.setCurrentIndex(ix)
					self.write_settings()
					break

	####### Quant

	def change_quant(self, val, gui=True):
		val = str(val)
		self.player.set_quant(val)
		self.panelsettings.quant = val
		if gui:
			for ix in range(0, self.combo_quant.count()):
				if val == self.combo_quant.itemText(ix):
					self.combo_quant.setCurrentIndex(ix)
					self.write_settings()
					break

	####### Scale

	def update_scalenotes(self):
		# print "UPDATE_SCALENOTES!  for self=",self," currbehaviour=",self.currbehaviour
		self.player.behaviours[self.currbehaviour].update_scalenotes()

	def change_scale(self, val, gui=True):
		val = str(val)
		self.player.set_scale(val)
		self.panelsettings.scale = val
		self.update_scalenotes()
		if gui:
			for ix in range(0, self.combo_scale.count()):
				if val == self.combo_scale.itemText(ix):
					self.combo_scale.setCurrentIndex(ix)
					self.write_settings()
					break

	####### Key

	def change_key(self, val, gui=True):
		val = str(val)
		self.player.set_key(val)
		self.panelsettings.key = val
		self.update_scalenotes()
		if gui:
			ix = Key.names.index(val)
			self.combo_key.setCurrentIndex(ix)
			self.write_settings()

	####### Source

	def change_source(self, val, gui=True):
		val = str(val)
		self.player.set_source(val)
		self.panelsettings.source = val
		if self.currbehaviour:
			self.player.behaviours[self.currbehaviour].settings = self.panelsettings
		if gui:
			self.text_source.setText(val)
			self.write_settings()

	####### Attribute

	def change_attribute(self, val, gui=True):
		val = str(val)
		self.player.set_attribute(val)
		self.panelsettings.attribute = val
		if self.currbehaviour:
			self.player.behaviours[self.currbehaviour].settings = self.panelsettings
		if gui:
			for ix in range(0, self.combo_attribute.count()):
				if val == self.combo_attribute.itemText(ix):
					self.combo_attribute.setCurrentIndex(ix)
					self.write_settings()

	####### ActionType

	def change_actiontype(self, val, gui=True):
		val = str(val)
		self.player.set_actiontype(val)
		self.panelsettings.actiontype = val
		if self.currbehaviour:
			self.player.behaviours[self.currbehaviour].settings = self.panelsettings
		if gui:
			for ix in range(0, self.combo_actiontype.count()):
				if val == self.combo_actiontype.itemText(ix):
					self.combo_actiontype.setCurrentIndex(ix)
					self.write_settings()

	####### Threshold

	def change_threshold(self, val, gui=True):
		# self.player.set_threshold(val)
		self.panelsettings.threshold = val
		if gui:
			self.spinbox_thresh.setValue(val)
			self.write_settings()

	####### Velocity

	def change_velocity(self, val, gui=True):
		self.player.set_velocity(val)
		self.panelsettings.velocity = val
		if gui:
			self.spinbox_velocity.setValue(val)
			self.write_settings()

	####### Enabled

	def change_enabled(self, val, gui=True):
		self.player.set_enabled(val)
		self.panelsettings.enabled = val
		if gui:
			self.checkbox_enabled.setChecked(val)
			self.write_settings()

	####### Verbose

	def change_verbose(self, val, gui=True):
		self.globals.verbose = val
		if gui:
			self.spinbox_verbose.setValue(val)
			self.globals.write()

	####### Channel

	def change_channel(self, val, gui=True):
		self.player.set_channel(val)
		self.panelsettings.channel = val
		if gui:
		  self.spinbox_channel.setValue(val)
		  self.write_settings()

	####### Scaleit

	def change_isscaled(self, val, gui=True):
		self.player.set_isscaled(val)
		self.panelsettings.isscaled = val
		if gui:
			self.checkbox_isscaled.setChecked(val)
			self.write_settings()

	####### DepthVol

	def change_depthvol(self, val, gui=True):
		self.player.set_depthvol(val)
		self.panelsettings.depthvol = val
		if gui:
			self.checkbox_depthvol.setChecked(val)
			self.write_settings()

	####### Pitchmin

	def change_pitchmin(self, val, gui=True):
		self.player.set_pitchmin(val)
		self.panelsettings.valuemin = val
		if gui:
			self.spinbox_pitchmin.setValue(val)
			self.write_settings()

	####### Pitchmax

	def change_pitchmax(self, val, gui=True):
		self.player.set_pitchmax(val)
		self.panelsettings.valuemax = val
		if gui:
			self.spinbox_pitchmax.setValue(val)
			self.write_settings()

	####### activemin

	def change_activemin(self, val, gui=True):
		self.player.set_activemin(val)
		self.panelsettings.activemin = val
		if gui:
			self.spinbox_activemin.setValue(val)
			self.write_settings()

	####### activemax

	def change_activemax(self, val, gui=True):
		self.player.set_activemax(val)
		self.panelsettings.activemax = val
		if gui:
			self.spinbox_activemax.setValue(val)
			self.write_settings()