void SpikeDetectorEditor::comboBoxChanged(ComboBox* comboBox) { if (comboBox == electrodeList) { int ID = comboBox->getSelectedId(); if (ID == 0) { SpikeDetector* processor = (SpikeDetector*) getProcessor(); processor->setElectrodeName(lastId, comboBox->getText()); refreshElectrodeList(); } else { lastId = ID; drawElectrodeButtons(ID-1); } } thresholdSlider->setActive(false); }
void SpikeDetectorEditor::comboBoxChanged(ComboBox* comboBox) { if (comboBox == electrodeList) { int ID = comboBox->getSelectedId(); if (ID == 0) { SpikeDetector* processor = (SpikeDetector*) getProcessor(); processor->setElectrodeName(lastId, comboBox->getText()); comboBox->changeItemText(lastId, comboBox->getText()); //electrodeList->setText(comboBox->getText()); //refreshElectrodeList(); } else { lastId = ID; SpikeDetector* processor = (SpikeDetector*) getProcessor(); Electrode* e = processor->setCurrentElectrodeIndex(ID-1); electrodeEditorButtons[1]->setToggleState(e->isMonitored, false); drawElectrodeButtons(ID-1); } } thresholdSlider->setActive(false); }
void SpikeDetectorEditor::drawElectrodeButtons(int ID) { SpikeDetector* processor = (SpikeDetector*) getProcessor(); electrodeButtons.clear(); int width = 20; int height = 15; int numChannels = processor->getNumChannels(ID); int row = 0; int column = 0; Array<int> activeChannels; Array<double> thresholds; for (int i = 0; i < numChannels; i++) { ElectrodeButton* button = new ElectrodeButton(processor->getChannel(ID,i)+1); electrodeButtons.add(button); thresholds.add(processor->getChannelThreshold(ID,i)); if (electrodeEditorButtons[0]->getToggleState()) { button->setToggleState(false, false); button->setRadioGroupId(299); } else { activeChannels.add(processor->getChannel(ID,i)); } if (numChannels < 3) button->setBounds(145+(column++)*width, 78+row*height, width, 15); else button->setBounds(145+(column++)*width, 70+row*height, width, 15); addAndMakeVisible(button); button->addListener(this); if (column%2 == 0) { column = 0; row++; } } channelSelector->setActiveChannels(activeChannels); thresholdSlider->setValues(thresholds); }
void SpikeDetectorEditor::refreshElectrodeList() { electrodeList->clear(); SpikeDetector* processor = (SpikeDetector*) getProcessor(); StringArray electrodeNames = processor->getElectrodeNames(); for (int i = 0; i < electrodeNames.size(); i++) { electrodeList->addItem(electrodeNames[i], electrodeList->getNumItems()+1); } }
bool SpikeDetectorEditor::addElectrode(int nChans, int electrodeID) { SpikeDetector* processor = (SpikeDetector*) getProcessor(); if (processor->addElectrode(nChans, electrodeID)) { refreshElectrodeList(); return true; } else { return false; } }
void SpikeDetectorEditor::removeElectrode(int index) { std::cout << "Deleting electrode number " << index << std::endl; SpikeDetector* processor = (SpikeDetector*) getProcessor(); processor->removeElectrode(index); refreshElectrodeList(); int newIndex = jmin(index, electrodeList->getNumItems()-1); newIndex = jmax(newIndex, 0); electrodeList->setSelectedId(newIndex, sendNotification); electrodeList->setText(electrodeList->getItemText(newIndex)); if (electrodeList->getNumItems() == 0) { electrodeButtons.clear(); electrodeList->setEditableText(false); } }
void SpikeDetectorEditor::channelChanged(int chan) { //std::cout << "New channel: " << chan << std::endl; for (int i = 0; i < electrodeButtons.size(); i++) { if (electrodeButtons[i]->getToggleState()) { electrodeButtons[i]->setChannelNum(chan); electrodeButtons[i]->repaint(); SpikeDetector* processor = (SpikeDetector*) getProcessor(); processor->setChannel(electrodeList->getSelectedItemIndex(), i, chan-1); } } }
void SpikeDetectorEditor::sliderEvent(Slider* slider) { int electrodeNum = -1; for (int i = 0; i < electrodeButtons.size(); i++) { if (electrodeButtons[i]->getToggleState()) { electrodeNum = i; //electrodeButtons[i]->getChannelNum()-1; break; } } // std::cout << "Slider value changed." << std::endl; if (electrodeNum > -1) { SpikeDetector* processor = (SpikeDetector*) getProcessor(); processor->setChannelThreshold(electrodeList->getSelectedItemIndex(), electrodeNum, slider->getValue()); } }
void SpikeDetectorEditor::comboBoxChanged(ComboBox* comboBox) { if (comboBox == electrodeList) { int ID = comboBox->getSelectedId(); std::cout << "ID: " << ID << std::endl; if (ID == 0) { //SpikeDetector* processor = (SpikeDetector*) getProcessor(); //processor->setElectrodeName(lastId, comboBox->getText()); //comboBox->changeItemText(lastId, comboBox->getText()); //electrodeList->setText(comboBox->getText()); refreshElectrodeList(); } else { lastId = ID; SpikeDetector* processor = (SpikeDetector*) getProcessor(); SimpleElectrode* e = processor->setCurrentElectrodeIndex(ID-1); electrodeEditorButtons[1]->setToggleState(e->isMonitored, dontSendNotification); drawElectrodeButtons(ID-1); } } thresholdSlider->setActive(false); }
void SpikeDetectorEditor::refreshElectrodeList() { electrodeList->clear(); SpikeDetector* processor = (SpikeDetector*) getProcessor(); StringArray electrodeNames = processor->getElectrodeNames(); for (int i = 0; i < electrodeNames.size(); i++) { electrodeList->addItem(electrodeNames[i], electrodeList->getNumItems()+1); } if (electrodeList->getNumItems() > 0) { electrodeList->setSelectedId(electrodeList->getNumItems(), sendNotification); electrodeList->setText(electrodeList->getItemText(electrodeList->getNumItems()-1)); lastId = electrodeList->getNumItems(); electrodeList->setEditableText(true); drawElectrodeButtons(electrodeList->getNumItems()-1); } }
void SpikeDetectorEditor::buttonEvent(Button* button) { if (electrodeButtons.contains((ElectrodeButton*) button)) { if (electrodeEditorButtons[0]->getToggleState()) // EDIT is active { ElectrodeButton* eb = (ElectrodeButton*) button; int electrodeNum = eb->getChannelNum()-1; // std::cout << "Channel number: " << electrodeNum << std::endl; Array<int> a; a.add(electrodeNum); channelSelector->setActiveChannels(a); SpikeDetector* processor = (SpikeDetector*) getProcessor(); thresholdSlider->setActive(true); thresholdSlider->setValue(processor->getChannelThreshold(electrodeList->getSelectedItemIndex(), electrodeButtons.indexOf((ElectrodeButton*) button))); } else { SpikeDetector* processor = (SpikeDetector*) getProcessor(); ElectrodeButton* eb = (ElectrodeButton*) button; int electrodeNum = electrodeList->getSelectedItemIndex(); int channelNum = electrodeButtons.indexOf(eb); processor->setChannelActive(electrodeNum, channelNum, button->getToggleState()); std::cout << "Disabling channel " << channelNum << " of electrode " << electrodeNum << std::endl; } } int num = numElectrodes->getText().getIntValue(); if (button == upButton) { numElectrodes->setText(String(++num), sendNotification); return; } else if (button == downButton) { if (num > 1) numElectrodes->setText(String(--num), sendNotification); return; } else if (button == plusButton) { // std::cout << "Plus button pressed!" << std::endl; if (acquisitionIsActive) { CoreServices::sendStatusMessage("Stop acquisition before adding electrodes."); return; } int type = electrodeTypes->getSelectedId(); // std::cout << type << std::endl; int nChans; switch (type) { case 1: nChans = 1; break; case 2: nChans = 2; break; case 3: nChans = 4; break; default: nChans = 1; } for (int n = 0; n < num; n++) { if (!addElectrode(nChans)) { CoreServices::sendStatusMessage("Not enough channels to add electrode."); } } electrodeEditorButtons[1]->setToggleState(false, dontSendNotification); CoreServices::updateSignalChain(this); CoreServices::highlightEditor(this); return; } else if (button == electrodeEditorButtons[0]) // EDIT { Array<int> activeChannels; for (int i = 0; i < electrodeButtons.size(); i++) { if (button->getToggleState()) { electrodeButtons[i]->setToggleState(false, dontSendNotification); electrodeButtons[i]->setRadioGroupId(299); channelSelector->activateButtons(); channelSelector->setRadioStatus(true); } else { electrodeButtons[i]->setToggleState(true, dontSendNotification); electrodeButtons[i]->setRadioGroupId(0); channelSelector->inactivateButtons(); channelSelector->setRadioStatus(false); activeChannels.add(electrodeButtons[i]->getChannelNum()-1); } } if (!button->getToggleState()) { thresholdSlider->setActive(false); // This will be -1 with nothing selected int selectedItemIndex = electrodeList->getSelectedItemIndex(); if (selectedItemIndex != -1) { drawElectrodeButtons(selectedItemIndex); } else { electrodeButtons.clear(); } } // channelSelector->setActiveChannels(activeChannels); return; } else if (button == electrodeEditorButtons[1]) // MONITOR { Button* audioMonitorButton = electrodeEditorButtons[1]; channelSelector->clearAudio(); SpikeDetector* processor = (SpikeDetector*) getProcessor(); Array<SimpleElectrode*> electrodes = processor->getElectrodes(); for (int i = 0; i < electrodes.size(); i++) { SimpleElectrode* e = electrodes[i]; e->isMonitored = false; } SimpleElectrode* e = processor->getActiveElectrode(); if (e != nullptr) { e->isMonitored = audioMonitorButton->getToggleState(); for (int i = 0; i < e->numChannels; i++) { std::cout << "Channel " << e->channels[i] << std::endl; int channelNum = e->channels[i]; channelSelector->setAudioStatus(channelNum, audioMonitorButton->getToggleState()); } } else { audioMonitorButton->setToggleState(false, dontSendNotification); } return; } else if (button == electrodeEditorButtons[2]) // DELETE { if (acquisitionIsActive) { CoreServices::sendStatusMessage("Stop acquisition before deleting electrodes."); return; } removeElectrode(electrodeList->getSelectedItemIndex()); CoreServices::updateSignalChain(this); CoreServices::highlightEditor(this); return; } }
bool SpikeDetectorEditor::addElectrode(int nChans) { SpikeDetector* processor = (SpikeDetector*) getProcessor(); return processor->addElectrode(nChans); }
void SpikeDetectorEditor::buttonEvent(Button* button) { if (electrodeEditorButtons[0]->getToggleState()) // EDIT is active { std::cout << "Editing active." << std::endl; if (electrodeButtons.contains((ElectrodeButton*) button)) { ElectrodeButton* eb = (ElectrodeButton*) button; int electrodeNum = eb->getChannelNum()-1; std::cout << "Channel number: " << electrodeNum << std::endl; Array<int> a; a.add(electrodeNum); channelSelector->setActiveChannels(a); SpikeDetector* processor = (SpikeDetector*) getProcessor(); thresholdSlider->setActive(true); thresholdSlider->setValue(processor->getChannelThreshold(electrodeList->getSelectedItemIndex(), electrodeButtons.indexOf((ElectrodeButton*) button))); } } int num = numElectrodes->getText().getIntValue(); if (button == upButton) { numElectrodes->setText(String(++num), true); return; } else if (button == downButton) { if (num > 1) numElectrodes->setText(String(--num), true); return; } else if (button == plusButton) { // std::cout << "Plus button pressed!" << std::endl; int type = electrodeTypes->getSelectedId(); std::cout << type << std::endl; int nChans; switch (type) { case 1: nChans = 1; break; case 2: nChans = 2; break; case 3: nChans = 4; break; default: nChans = 1; } for (int n = 0; n < num; n++) { if (!addElectrode(nChans)) { sendActionMessage("Not enough channels to add electrode."); } } refreshElectrodeList(); if (electrodeList->getNumItems() > 0) { electrodeList->setSelectedId(electrodeList->getNumItems(), true); electrodeList->setText(electrodeList->getItemText(electrodeList->getNumItems()-1)); lastId = electrodeList->getNumItems(); electrodeList->setEditableText(true); drawElectrodeButtons(electrodeList->getNumItems()-1); } getEditorViewport()->makeEditorVisible(this, true, true); return; } else if (button == electrodeEditorButtons[0]) // EDIT { Array<int> activeChannels; for (int i = 0; i < electrodeButtons.size(); i++) { if (button->getToggleState()) { electrodeButtons[i]->setToggleState(false, false); electrodeButtons[i]->setRadioGroupId(299); channelSelector->activateButtons(); channelSelector->setRadioStatus(true); } else { electrodeButtons[i]->setToggleState(true, false); electrodeButtons[i]->setRadioGroupId(0); channelSelector->inactivateButtons(); channelSelector->setRadioStatus(false); activeChannels.add(electrodeButtons[i]->getChannelNum()-1); } } if (!button->getToggleState()) { thresholdSlider->setActive(false); // This will be -1 with nothing selected int selectedItemIndex = electrodeList->getSelectedItemIndex(); if (selectedItemIndex != -1) { drawElectrodeButtons(selectedItemIndex); } else { electrodeButtons.clear(); } } // channelSelector->setActiveChannels(activeChannels); return; } else if (button == electrodeEditorButtons[1]) // MONITOR { return; } else if (button == electrodeEditorButtons[2]) // DELETE { removeElectrode(electrodeList->getSelectedItemIndex()); getEditorViewport()->makeEditorVisible(this, true, true); return; } }