From ac582891886fd1706f0bf217a7b3b1e0d06bc20a Mon Sep 17 00:00:00 2001 From: Phil Taylor Date: Sat, 25 Mar 2023 09:09:42 +0000 Subject: [PATCH] Initial support for Stream Deck Pro (other Stream Deck support to follow) --- controllersetup.cpp | 566 ++++++++----- controllersetup.h | 58 +- packettypes.h | 30 + resources/resources.qrc | 1 + resources/streamdeckplus.png | Bin 0 -> 231406 bytes usbcontroller.cpp | 1511 +++++++++++++++++++--------------- usbcontroller.h | 98 ++- wfmain.cpp | 78 +- wfmain.h | 5 +- wfviewtypes.h | 13 +- 10 files changed, 1396 insertions(+), 964 deletions(-) create mode 100644 resources/streamdeckplus.png diff --git a/controllersetup.cpp b/controllersetup.cpp index ff18686..eae795c 100644 --- a/controllersetup.cpp +++ b/controllersetup.cpp @@ -17,27 +17,60 @@ controllerSetup::controllerSetup(QWidget* parent) : controllerSetup::~controllerSetup() { - - if (onEventProxy != Q_NULLPTR) { - delete onEventProxy; - delete onEvent; - } - - if (offEventProxy != Q_NULLPTR) { - delete offEventProxy; - delete offEvent; - } - - if (knobEventProxy != Q_NULLPTR) { - delete knobEventProxy; - delete knobEvent; - } - 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) @@ -47,50 +80,66 @@ void controllerSetup::mousePressed(controllerScene* scene, QPoint p) } bool found = false; - QMutexLocker locker(mutex); + QPoint gp = this->mapToGlobal(p); - - - for (BUTTON& b : *buttons) + for (auto b = buttons->begin(); b != buttons->end(); b++) { - - if (ui->tabWidget->currentWidget()->objectName() == b.devicePath && b.pos.contains(p)) + if (b->page == b->parent->currentPage && ui->tabWidget->currentWidget()->objectName() == b->path && b->pos.contains(p)) { found = true; - currentButton = &b; + 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->move(p); onEvent->setCurrentIndex(onEvent->findData(currentButton->onCommand->index)); onEvent->show(); + onLabel->show(); onEvent->blockSignals(false); - p.setY(p.y() + 40); offEvent->blockSignals(true); - offEvent->move(p); 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 (KNOB& k : *knobs) + for (auto k = knobs->begin(); k != knobs->end(); k++) { - if (ui->tabWidget->currentWidget()->objectName() == k.devicePath && k.pos.contains(p)) + if (k->page == k->parent->currentPage && ui->tabWidget->currentWidget()->objectName() == k->path && k->pos.contains(p)) { found = true; - currentKnob = &k; + currentKnob = k; qDebug() << "Knob" << currentKnob->num << "Event" << currentKnob->command->text; + + updateDialog->setWindowTitle(QString("Update knob %0").arg(k->num)); + knobEvent->blockSignals(true); - knobEvent->move(p); 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; } } @@ -98,26 +147,15 @@ void controllerSetup::mousePressed(controllerScene* scene, QPoint p) if(found) { - found=false; - foreach (QGraphicsItem *item, scene->items()) - { - QGraphicsProxyWidget *node = dynamic_cast(item); - if (node) { - found=true; - break; - } - } - if (!found) { - scene->addItem(offEvent->graphicsProxyWidget()); - scene->addItem(onEvent->graphicsProxyWidget()); - scene->addItem(knobEvent->graphicsProxyWidget()); - } + updateDialog->show(); + updateDialog->move(gp); + updateDialog->adjustSize(); } else { - onEvent->hide(); - offEvent->hide(); - knobEvent->hide(); + updateDialog->hide(); + currentButton = Q_NULLPTR; + currentKnob = Q_NULLPTR; } } @@ -133,7 +171,7 @@ void controllerSetup::onEventIndexChanged(int index) { 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 programButton(currentButton->devicePath,currentButton->num, currentButton->onCommand->text); + emit sendRequest(currentButton->parent,usbFeatureType::featureButton,currentButton->num,currentButton->onCommand->text); } } @@ -152,6 +190,8 @@ void controllerSetup::offEventIndexChanged(int index) { } } + + void controllerSetup::knobEventIndexChanged(int index) { Q_UNUSED(index); // If command is changed, delete current command and deep copy the new command @@ -167,6 +207,34 @@ void controllerSetup::knobEventIndexChanged(int index) { } } + +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); @@ -241,13 +309,22 @@ void controllerSetup::newDevice(USBDEVICE* dev, CONTROLLER* cntrl, QVectormessage->setAlignment(Qt::AlignRight); connect(disabled, qOverload(&QCheckBox::clicked), - [dev,this,widget](bool checked) { this->disableClicked(dev->path,checked,widget); }); + [dev,this,widget](bool checked) { this->disableClicked(dev,checked,widget); }); disabled->setChecked(dev->disabled); QGraphicsView *view = new QGraphicsView(); layout->addWidget(view); + QSpinBox *page = new QSpinBox(); + page->setValue(1); + page->setMinimum(1); + page->setMaximum(dev->pages); + page->setToolTip("Select current page to edit"); + layout->addWidget(page,0,Qt::AlignBottom | Qt::AlignRight); + dev->pageSpin = page; + + QHBoxLayout* senslayout = new QHBoxLayout(); layout->addLayout(senslayout); QLabel* senslabel = new QLabel("Sensitivity"); @@ -260,11 +337,11 @@ void controllerSetup::newDevice(USBDEVICE* dev, CONTROLLER* cntrl, QVectoraddWidget(sens); sens->setValue(cntrl->sensitivity); connect(sens, &QSlider::valueChanged, - [dev,this](int val) { this->sensitivityMoved(dev->path,val); }); + [dev,this](int val) { this->sensitivityMoved(dev,val); }); QImage image; - switch (dev->usbDevice) { + switch (dev->type.model) { case shuttleXpress: image.load(":/resources/shuttlexpress.png"); break; @@ -283,6 +360,9 @@ void controllerSetup::newDevice(USBDEVICE* dev, CONTROLLER* cntrl, QVectorgraphicsView->setSceneRect(scene->itemsBoundingRect()); this->adjustSize(); @@ -298,206 +378,176 @@ void controllerSetup::newDevice(USBDEVICE* dev, CONTROLLER* cntrl, QVectorscene = scene; view->setScene(scene); - connect(scene, SIGNAL(mousePressed(controllerScene *,QPoint)), this, SLOT(mousePressed(controllerScene *,QPoint))); + connect(scene, SIGNAL(mousePressed(controllerScene*,QPoint)), this, SLOT(mousePressed(controllerScene*,QPoint))); scene->addItem(bgImage); + QGridLayout* grid = new QGridLayout(); layout->addLayout(grid); - if (dev->usbDevice == QuickKeys) - { - // Add QuickKeys section + QLabel* brightlabel = new QLabel("Brightness"); + grid->addWidget(brightlabel,0,0); + QComboBox *brightness = new QComboBox(); + brightness->addItem("Off"); + brightness->addItem("Low"); + brightness->addItem("Medium"); + brightness->addItem("High"); + brightness->setCurrentIndex(cntrl->brightness); + grid->addWidget(brightness,1,0); + connect(brightness, qOverload(&QComboBox::currentIndexChanged), + [dev,this](int index) { this->brightnessChanged(dev,index); }); - QLabel* brightlabel = new QLabel("Brightness"); - grid->addWidget(brightlabel,0,0); - QComboBox *brightness = new QComboBox(); - brightness->addItem("Off"); - brightness->addItem("Low"); - brightness->addItem("Medium"); - brightness->addItem("High"); - brightness->setCurrentIndex(cntrl->brightness); - grid->addWidget(brightness,1,0); - connect(brightness, qOverload(&QComboBox::currentIndexChanged), - [dev,this](int index) { this->brightnessChanged(dev->path,index); }); + QLabel* speedlabel = new QLabel("Speed"); + grid->addWidget(speedlabel,0,1); + QComboBox *speed = new QComboBox(); + speed->addItem("Fastest"); + speed->addItem("Faster"); + speed->addItem("Normal"); + speed->addItem("Slower"); + speed->addItem("Slowest"); + speed->setCurrentIndex(cntrl->speed); + grid->addWidget(speed,1,1); + connect(speed, qOverload(&QComboBox::currentIndexChanged), + [dev,this](int index) { this->speedChanged(dev,index); }); - QLabel* speedlabel = new QLabel("Speed"); - grid->addWidget(speedlabel,0,1); - QComboBox *speed = new QComboBox(); - speed->addItem("Fastest"); - speed->addItem("Faster"); - speed->addItem("Normal"); - speed->addItem("Slower"); - speed->addItem("Slowest"); - speed->setCurrentIndex(cntrl->speed); - grid->addWidget(speed,1,1); - connect(speed, qOverload(&QComboBox::currentIndexChanged), - [dev,this](int index) { this->speedChanged(dev->path,index); }); + QLabel* orientlabel = new QLabel("Orientation"); + grid->addWidget(orientlabel,0,2); + QComboBox *orientation = new QComboBox(); + orientation->addItem("Rotate 0"); + orientation->addItem("Rotate 90"); + orientation->addItem("Rotate 180"); + orientation->addItem("Rotate 270"); + orientation->setCurrentIndex(cntrl->orientation); + grid->addWidget(orientation,1,2); + connect(orientation, qOverload(&QComboBox::currentIndexChanged), + [dev,this](int index) { this->orientationChanged(dev,index); }); - QLabel* orientlabel = new QLabel("Orientation"); - grid->addWidget(orientlabel,0,2); - QComboBox *orientation = new QComboBox(); - orientation->addItem("Rotate 0"); - orientation->addItem("Rotate 90"); - orientation->addItem("Rotate 180"); - orientation->addItem("Rotate 270"); - orientation->setCurrentIndex(cntrl->orientation); - grid->addWidget(orientation,1,2); - connect(orientation, qOverload(&QComboBox::currentIndexChanged), - [dev,this](int index) { this->orientationChanged(dev->path,index); }); + QLabel* colorlabel = new QLabel("Color"); + grid->addWidget(colorlabel,0,3); + QPushButton* color = new QPushButton("Select"); + grid->addWidget(color,1,3); + connect(color, &QPushButton::clicked, + [dev,this]() { this->colorPicker(dev); }); - QLabel* colorlabel = new QLabel("Dial Color"); - grid->addWidget(colorlabel,0,3); - QPushButton* color = new QPushButton("Select"); - grid->addWidget(color,1,3); - connect(color, &QPushButton::clicked, - [dev,this]() { this->colorPicker(dev->path); }); + QLabel* timeoutlabel = new QLabel("Timeout"); + grid->addWidget(timeoutlabel,0,4); + QSpinBox *timeout = new QSpinBox(); + timeout->setValue(cntrl->timeout); + grid->addWidget(timeout,1,4); + connect(timeout, qOverload(&QSpinBox::valueChanged), + [dev,this](int index) { this->timeoutChanged(dev,index); }); - QLabel* timeoutlabel = new QLabel("Timeout"); - grid->addWidget(timeoutlabel,0,4); - QSpinBox *timeout = new QSpinBox(); - timeout->setValue(cntrl->timeout); - grid->addWidget(timeout,1,4); - connect(timeout, qOverload(&QSpinBox::valueChanged), - [dev,this](int index) { this->timeoutChanged(dev->path,index); }); - - // Finally update the device with the default values - emit programSensitivity(dev->path, cntrl->sensitivity); - emit programBrightness(dev->path,cntrl->brightness); - emit programOrientation(dev->path,cntrl->orientation); - emit programSpeed(dev->path,cntrl->speed); - emit programTimeout(dev->path,cntrl->timeout); - emit programWheelColour(dev->path, cntrl->color.red(), cntrl->color.green(), cntrl->color.blue()); - } + QLabel* pageslabel = new QLabel("Pages"); + grid->addWidget(pageslabel,0,5); + QSpinBox *pages = new QSpinBox(); + pages->setValue(dev->pages); + pages->setMinimum(1); + grid->addWidget(pages,1,5); + connect(pages, qOverload(&QSpinBox::valueChanged), + [dev,this](int index) { this->pagesChanged(dev,index); }); + for (int i=0;i<6;i++) + grid->setColumnStretch(i,1); QLabel *helpText = new QLabel(); - helpText->setText("

Button configuration: Right-click on each button to configure it.

Top selection is command to send when button is pressed and bottom is (optional) command to send when button is released.

"); + helpText->setText("

Button configuration: Right-click on each button to configure it.

"); helpText->setAlignment(Qt::AlignCenter); layout->addWidget(helpText); - if (dev->usbDevice != usbNone) - { - offEvent = new QComboBox; - onEvent = new QComboBox; - knobEvent = new QComboBox; - onEvent->blockSignals(true); - offEvent->blockSignals(true); - knobEvent->blockSignals(true); - onEvent->clear(); - offEvent->clear(); - knobEvent->clear(); + onEvent->blockSignals(true); + offEvent->blockSignals(true); + knobEvent->blockSignals(true); - onEvent->setMaxVisibleItems(5); - offEvent->setMaxVisibleItems(5); - knobEvent->setMaxVisibleItems(5); + onEvent->clear(); + offEvent->clear(); + knobEvent->clear(); - onEvent->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - offEvent->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - knobEvent->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + /* + onEvent->setMaxVisibleItems(5); + offEvent->setMaxVisibleItems(5); + knobEvent->setMaxVisibleItems(5); - onEvent->setStyleSheet("combobox-popup: 0;"); - offEvent->setStyleSheet("combobox-popup: 0;"); - knobEvent->setStyleSheet("combobox-popup: 0;"); + onEvent->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + offEvent->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + knobEvent->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - for (COMMAND& c : *commands) { - if (c.cmdType == commandButton || c.text == "None") { - onEvent->addItem(c.text, c.index); - offEvent->addItem(c.text, c.index); - } + onEvent->setStyleSheet("combobox-popup: 0;"); + offEvent->setStyleSheet("combobox-popup: 0;"); + knobEvent->setStyleSheet("combobox-popup: 0;"); + */ - if (c.cmdType == commandKnob || c.text == "None") { - knobEvent->addItem(c.text, c.index); - } + for (COMMAND& c : *commands) { + if (c.cmdType == commandButton || c.text == "None") { + onEvent->addItem(c.text, c.index); + offEvent->addItem(c.text, c.index); } - onEvent->blockSignals(false); - offEvent->blockSignals(false); - knobEvent->blockSignals(false); - - onEvent->hide(); - offEvent->hide(); - knobEvent->hide(); - - // Set button text - for (BUTTON& b : *buttons) - { - - if (b.devicePath == dev->path) { - b.onText = new QGraphicsTextItem(b.onCommand->text); - b.onText->setDefaultTextColor(b.textColour); - scene->addItem(b.onText); - b.onText->setPos(b.pos.center().x() - b.onText->boundingRect().width() / 2, - (b.pos.center().y() - b.onText->boundingRect().height() / 2) - 6); - emit programButton(b.devicePath,b.num, b.onCommand->text); // Program the button with ontext if supported - - b.offText = new QGraphicsTextItem(b.offCommand->text); - b.offText->setDefaultTextColor(b.textColour); - scene->addItem(b.offText); - b.offText->setPos(b.pos.center().x() - b.offText->boundingRect().width() / 2, - (b.pos.center().y() - b.onText->boundingRect().height() / 2) + 6); - } + if (c.cmdType == commandKnob || c.text == "None") { + knobEvent->addItem(c.text, c.index); } - - // Set knob text - - for (KNOB& k : *knobs) - { - if (k.devicePath == dev->path) { - k.text = new QGraphicsTextItem(k.command->text); - k.text->setDefaultTextColor(k.textColour); - scene->addItem(k.text); - k.text->setPos(k.pos.center().x() - k.text->boundingRect().width() / 2, - (k.pos.center().y() - k.text->boundingRect().height() / 2)); - } - } - view->setSceneRect(scene->itemsBoundingRect()); - - // Add comboboxes to scene after everything else. - 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))); - - onEventProxy = new QGraphicsProxyWidget(); - onEventProxy->setWidget(onEvent); - offEventProxy = new QGraphicsProxyWidget(); - offEventProxy->setWidget(offEvent); - knobEventProxy = new QGraphicsProxyWidget(); - knobEventProxy->setWidget(knobEvent); - - this->adjustSize(); - } + onEvent->blockSignals(false); + offEvent->blockSignals(false); + knobEvent->blockSignals(false); + + onEvent->hide(); + offEvent->hide(); + knobEvent->hide(); + + locker.unlock(); + pageChanged(dev,1); + locker.relock(); + + view->setSceneRect(scene->itemsBoundingRect()); + + // Add comboboxes to scene after everything else. + + // Attach pageChanged() here so we have access to all necessary vars + connect(page, qOverload(&QSpinBox::valueChanged), + [dev, this](int index) { this->pageChanged(dev, index); }); + + + this->adjustSize(); numTabs++; + // Finally update the device with the default values + emit sendRequest(dev,usbFeatureType::featureSensitivity,cntrl->sensitivity); + emit sendRequest(dev,usbFeatureType::featureBrightness,cntrl->brightness); + emit sendRequest(dev,usbFeatureType::featureOrientation,cntrl->orientation); + emit sendRequest(dev,usbFeatureType::featureSpeed,cntrl->speed); + emit sendRequest(dev,usbFeatureType::featureTimeout,cntrl->timeout); + emit sendRequest(dev,usbFeatureType::featureColor,1,cntrl->color.name(QColor::HexArgb)); + } -void controllerSetup::sensitivityMoved(QString path, int val) +void controllerSetup::sensitivityMoved(USBDEVICE* dev, int val) { - qInfo(logUsbControl()) << "Setting sensitivity" << val <<"for device" << path; - emit programSensitivity(path, val); + qInfo(logUsbControl()) << "Setting sensitivity" << val <<"for device" << dev->path; + emit sendRequest(dev,usbFeatureType::featureSensitivity,val); } -void controllerSetup::brightnessChanged(QString path, int index) +void controllerSetup::brightnessChanged(USBDEVICE* dev, int index) { - emit programBrightness(path, (quint8)index); + emit sendRequest(dev,usbFeatureType::featureBrightness,index); } -void controllerSetup::orientationChanged(QString path, int index) +void controllerSetup::orientationChanged(USBDEVICE* dev, int index) { - emit programOrientation(path, (quint8)index); + emit sendRequest(dev,usbFeatureType::featureOrientation,index); } -void controllerSetup::speedChanged(QString path, int index) +void controllerSetup::speedChanged(USBDEVICE* dev, int index) { - emit programSpeed(path, (quint8)index); + emit sendRequest(dev,usbFeatureType::featureSpeed,index); } -void controllerSetup::colorPicker(QString path) +void controllerSetup::colorPicker(USBDEVICE* dev) { QColorDialog::ColorDialogOptions options; options.setFlag(QColorDialog::ShowAlphaChannel, false); @@ -509,18 +559,112 @@ void controllerSetup::colorPicker(QString path) selColor = initialColor; } initialColor = selColor; - emit programWheelColour(path, (quint8)selColor.red(), (quint8)selColor.green(), (quint8)initialColor.blue()); + emit sendRequest(dev,usbFeatureType::featureColor,1,selColor.name(QColor::HexArgb)); } -void controllerSetup::timeoutChanged(QString path, int val) +void controllerSetup::timeoutChanged(USBDEVICE* dev, int val) { - emit programTimeout(path, (quint8)val); - emit programOverlay(path, 3, QString("Sleep timeout set to %0 minutes").arg(val)); + emit sendRequest(dev,usbFeatureType::featureTimeout,val); + emit sendRequest(dev,usbFeatureType::featureOverlay,val,QString("Sleep timeout set to %0 minutes").arg(val)); } -void controllerSetup::disableClicked(QString path, bool clicked, QWidget* widget) +void controllerSetup::pagesChanged(USBDEVICE* dev, int val) +{ + emit programPages(dev,val); + dev->pageSpin->setMaximum(val); // Update pageSpin +} + +void controllerSetup::pageChanged(USBDEVICE* dev, int val) +{ + if (dev->currentPage == val) // We haven't changed page! + return; + + if (val > dev->pages) + val=1; + if (val < 1) + val = dev->pages; + + QMutexLocker locker(mutex); + + int lastPage = dev->currentPage; + dev->currentPage=val; + dev->pageSpin->setValue(val); + + // (re)set button text + for (auto b = buttons->begin();b != buttons->end(); b++) + { + if (b->parent == dev) + { + if (b->page == lastPage) + { + if (b->onText != Q_NULLPTR) { + dev->scene->removeItem(b->onText); + delete b->onText; + b->onText = Q_NULLPTR; + } + if (b->offText != Q_NULLPTR) { + dev->scene->removeItem(b->offText); + delete b->offText; + b->offText = Q_NULLPTR; + } + } + else if (b->page == dev->currentPage) + { + b->onText = new QGraphicsTextItem(b->onCommand->text); + b->onText->setDefaultTextColor(b->textColour); + dev->scene->addItem(b->onText); + b->onText->setPos(b->pos.center().x() - b->onText->boundingRect().width() / 2, + (b->pos.center().y() - b->onText->boundingRect().height() / 2) - 6); + emit sendRequest(dev,usbFeatureType::featureButton,b->num,b->onCommand->text,Q_NULLPTR,&b->background); + + b->offText = new QGraphicsTextItem(b->offCommand->text); + b->offText->setDefaultTextColor(b->textColour); + dev->scene->addItem(b->offText); + b->offText->setPos(b->pos.center().x() - b->offText->boundingRect().width() / 2, + (b->pos.center().y() - b->onText->boundingRect().height() / 2) + 6); + } + } + } + // Set knob text + + for (auto k = knobs->begin();k != knobs->end(); k++) + { + if (k->parent == dev) { + if (k->page == lastPage) + { + if (k->text) { + dev->scene->removeItem(k->text); + delete k->text; + k->text = Q_NULLPTR; + } + } + else if (k->page == dev->currentPage) + { + k->text = new QGraphicsTextItem(k->command->text); + k->text->setDefaultTextColor(k->textColour); + dev->scene->addItem(k->text); + k->text->setPos(k->pos.center().x() - k->text->boundingRect().width() / 2, + (k->pos.center().y() - k->text->boundingRect().height() / 2)); + } + } + } +} + +void controllerSetup::disableClicked(USBDEVICE* dev, bool clicked, QWidget* widget) { // Disable checkbox has been clicked - emit programDisable(path,clicked); + emit programDisable(dev, clicked); widget->setEnabled(!clicked); } + +void controllerSetup::setConnected(USBDEVICE* dev) +{ + if (dev->connected) + { + dev->message->setStyleSheet("QLabel { color : green; }"); + dev->message->setText("Connected"); + } else { + dev->message->setStyleSheet("QLabel { color : red; }"); + dev->message->setText("Not Connected"); + } +} diff --git a/controllersetup.h b/controllersetup.h index c215a08..c619340 100644 --- a/controllersetup.h +++ b/controllersetup.h @@ -25,6 +25,7 @@ #include #include #include +#include #include "usbcontroller.h" @@ -64,34 +65,36 @@ public: ~controllerSetup(); signals: - void programButton(QString path, quint8 but, QString text); - void programSensitivity(QString path, quint8 level); - void programBrightness(QString path, quint8 level); - void programWheelColour(QString path, quint8 r, quint8 g, quint8 b); - void programOverlay(QString path, quint8 duration, QString text); - void programOrientation(QString path, quint8 value); - void programSpeed(QString path, quint8 value); - void programTimeout(QString path, quint8 value); - void programDisable(QString path, bool disable); + void sendRequest(USBDEVICE* dev, usbFeatureType request, quint8 val=0, QString text="", QImage* img=Q_NULLPTR, QColor* color=Q_NULLPTR); + void programDisable(USBDEVICE* dev, bool disable); + void programPages(USBDEVICE* dev, int pages); public slots: + void init(); void newDevice(USBDEVICE* dev, CONTROLLER* cntrl, QVector