#include "controllersetup.h" #include "ui_controllersetup.h" #include "logcategories.h" controllerSetup::controllerSetup(QWidget* parent) : QDialog(parent), ui(new Ui::controllerSetup) { ui->setupUi(this); ui->tabWidget->clear(); ui->tabWidget->hide(); noControllersText = new QLabel("No USB controller found"); noControllersText->setStyleSheet("QLabel { color : gray; }"); ui->hboxLayout->addWidget(noControllersText); this->resize(this->sizeHint()); } controllerSetup::~controllerSetup() { delete ui; } void controllerSetup::init() { updateDialog = new QDialog(this); //updateDialog->setModal(true); QGridLayout* udLayout = new QGridLayout; updateDialog->setLayout(udLayout); updateDialog->setBaseSize(1, 1); onLabel = new QLabel("On"); udLayout->addWidget(onLabel,0,0); onEvent = new QComboBox(); udLayout->addWidget(onEvent,0,1); onLabel->setBuddy(onEvent); offLabel = new QLabel("Off"); udLayout->addWidget(offLabel,1,0); offEvent = new QComboBox(); udLayout->addWidget(offEvent,1,1); offLabel->setBuddy(offEvent); knobLabel = new QLabel("Knob"); udLayout->addWidget(knobLabel,2,0); knobEvent = new QComboBox(); udLayout->addWidget(knobEvent,2,1); knobLabel->setBuddy(knobEvent); buttonColor = new QPushButton("Color"); udLayout->addWidget(buttonColor,3,0); buttonLatch = new QCheckBox(); buttonLatch->setText("Toggle"); udLayout->addWidget(buttonLatch,3,1); udLayout->setAlignment(buttonLatch,Qt::AlignRight); udLayout->setSizeConstraint(QLayout::SetFixedSize); updateDialog->hide(); connect(offEvent, SIGNAL(currentIndexChanged(int)), this, SLOT(offEventIndexChanged(int))); connect(onEvent, SIGNAL(currentIndexChanged(int)), this, SLOT(onEventIndexChanged(int))); connect(knobEvent, SIGNAL(currentIndexChanged(int)), this, SLOT(knobEventIndexChanged(int))); connect(buttonColor, SIGNAL(clicked()), this, SLOT(buttonColorClicked())); connect(buttonLatch, SIGNAL(stateChanged(int)), this, SLOT(latchStateChanged(int))); } void controllerSetup::mousePressed(controllerScene* scene, QPoint p) { Q_UNUSED (scene) // We might want it in the future? // Receive mouse event from the scene qDebug() << "Looking for button Point x=" << p.x() << " y=" << p.y(); if (onEvent == Q_NULLPTR|| offEvent == Q_NULLPTR|| knobEvent == Q_NULLPTR) { qInfo(logUsbControl()) << "Event missing, cannot continue..."; return; } bool found = false; QPoint gp = this->mapToGlobal(p); for (auto b = buttons->begin(); b != buttons->end(); b++) { if (b->page == b->parent->currentPage && ui->tabWidget->currentWidget()->objectName() == b->path && b->pos.contains(p)) { found = true; currentButton = b; qDebug() << "Button" << currentButton->num << "On Event" << currentButton->onCommand->text << "Off Event" << currentButton->offCommand->text; updateDialog->setWindowTitle(QString("Update button %0").arg(b->num)); onEvent->blockSignals(true); onEvent->setCurrentIndex(onEvent->findData(currentButton->onCommand->index)); onEvent->show(); onLabel->show(); onEvent->blockSignals(false); offEvent->blockSignals(true); offEvent->setCurrentIndex(offEvent->findData(currentButton->offCommand->index)); offEvent->show(); offLabel->show(); offEvent->blockSignals(false); knobEvent->hide(); knobLabel->hide(); buttonLatch->blockSignals(true); buttonLatch->setChecked(currentButton->toggle); buttonLatch->blockSignals(false); buttonLatch->show(); buttonColor->show(); currentKnob = Q_NULLPTR; break; } } if (!found) { for (auto k = knobs->begin(); k != knobs->end(); k++) { if (k->page == k->parent->currentPage && ui->tabWidget->currentWidget()->objectName() == k->path && k->pos.contains(p)) { found = true; currentKnob = k; qDebug() << "Knob" << currentKnob->num << "Event" << currentKnob->command->text; updateDialog->setWindowTitle(QString("Update knob %0").arg(k->num)); knobEvent->blockSignals(true); knobEvent->setCurrentIndex(knobEvent->findData(currentKnob->command->index)); knobEvent->show(); knobLabel->show(); knobEvent->blockSignals(false); onEvent->hide(); offEvent->hide(); onLabel->hide(); offLabel->hide(); buttonLatch->hide(); buttonColor->hide(); currentButton = Q_NULLPTR; break; } } } if(found) { updateDialog->show(); updateDialog->move(gp); updateDialog->adjustSize(); } else { updateDialog->hide(); currentButton = Q_NULLPTR; currentKnob = Q_NULLPTR; } } void controllerSetup::onEventIndexChanged(int index) { Q_UNUSED(index); // If command is changed, delete current command and deep copy the new command if (currentButton != Q_NULLPTR && onEvent->currentData().toInt() < commands->size()) { QMutexLocker locker(mutex); if (currentButton->onCommand) delete currentButton->onCommand; currentButton->onCommand = new COMMAND(commands->at(onEvent->currentData().toInt())); currentButton->onText->setPlainText(currentButton->onCommand->text); currentButton->onText->setPos(currentButton->pos.center().x() - currentButton->onText->boundingRect().width() / 2, (currentButton->pos.center().y() - currentButton->onText->boundingRect().height() / 2)-6); // Signal that any button programming on the device should be completed. emit sendRequest(currentButton->parent,usbFeatureType::featureButton,currentButton->num,currentButton->onCommand->text); } } void controllerSetup::offEventIndexChanged(int index) { Q_UNUSED(index); // If command is changed, delete current command and deep copy the new command if (currentButton != Q_NULLPTR && offEvent->currentData().toInt() < commands->size()) { QMutexLocker locker(mutex); if (currentButton->offCommand) delete currentButton->offCommand; currentButton->offCommand = new COMMAND(commands->at(offEvent->currentData().toInt())); currentButton->offText->setPlainText(currentButton->offCommand->text); currentButton->offText->setPos(currentButton->pos.center().x() - currentButton->offText->boundingRect().width() / 2, (currentButton->pos.center().y() - currentButton->offText->boundingRect().height() / 2)+6); } } void controllerSetup::knobEventIndexChanged(int index) { Q_UNUSED(index); // If command is changed, delete current command and deep copy the new command if (currentKnob != Q_NULLPTR && knobEvent->currentData().toInt() < commands->size()) { QMutexLocker locker(mutex); if (currentKnob->command) delete currentKnob->command; currentKnob->command = new COMMAND(commands->at(knobEvent->currentData().toInt())); currentKnob->text->setPlainText(currentKnob->command->text); currentKnob->text->setPos(currentKnob->pos.center().x() - currentKnob->text->boundingRect().width() / 2, (currentKnob->pos.center().y() - currentKnob->text->boundingRect().height() / 2)); } } void controllerSetup::buttonColorClicked() { QColorDialog::ColorDialogOptions options; options.setFlag(QColorDialog::ShowAlphaChannel, false); options.setFlag(QColorDialog::DontUseNativeDialog, false); QColor selColor = QColorDialog::getColor(initialColor, this, "Select Color", options); if(!selColor.isValid()) { return; } if (currentButton != Q_NULLPTR) { QMutexLocker locker(mutex); currentButton->background = selColor; emit sendRequest(currentButton->parent,usbFeatureType::featureButton,currentButton->num,currentButton->onCommand->text,Q_NULLPTR,¤tButton->background); } } void controllerSetup::latchStateChanged(int state) { if (currentButton != Q_NULLPTR) { QMutexLocker locker(mutex); currentButton->toggle=(int)state; } } void controllerSetup::removeDevice(USBDEVICE* dev) { QMutexLocker locker(mutex); int remove = -1; for (int i = 0; i < ui->tabWidget->count(); i++) { auto widget = ui->tabWidget->widget(i); if (widget->objectName() == dev->path) { qDeleteAll(widget->findChildren("", Qt::FindDirectChildrenOnly)); remove = i; } } if (remove != -1) { qInfo(logUsbControl()) << "Removing tab" << dev->product; ui->tabWidget->removeTab(remove); } if (ui->tabWidget->count() == 0) { ui->tabWidget->hide(); noControllersText->show(); this->adjustSize(); } } void controllerSetup::newDevice(USBDEVICE* dev, CONTROLLER* cntrl, QVector