2022-10-22 19:55:08 +00:00
# include "controllersetup.h"
# include "ui_controllersetup.h"
2021-08-28 22:27:18 +00:00
# include "logcategories.h"
2022-10-22 19:55:08 +00:00
controllerSetup : : controllerSetup ( QWidget * parent ) :
2021-08-28 22:27:18 +00:00
QDialog ( parent ) ,
2022-10-22 19:55:08 +00:00
ui ( new Ui : : controllerSetup )
2021-08-28 22:27:18 +00:00
{
ui - > setupUi ( this ) ;
2023-03-17 23:35:40 +00:00
ui - > tabWidget - > clear ( ) ;
ui - > tabWidget - > hide ( ) ;
noControllersText = new QLabel ( " No USB controller found " ) ;
noControllersText - > setStyleSheet ( " QLabel { color : gray; } " ) ;
ui - > hboxLayout - > addWidget ( noControllersText ) ;
2022-10-16 23:29:11 +00:00
this - > resize ( this - > sizeHint ( ) ) ;
2021-08-28 22:27:18 +00:00
}
2022-10-22 19:55:08 +00:00
controllerSetup : : ~ controllerSetup ( )
2021-08-28 22:27:18 +00:00
{
2023-04-02 19:07:13 +00:00
qInfo ( logUsbControl ( ) ) < < " Deleting controllerSetup() window " ;
delete noControllersText ;
delete updateDialog ;
2023-04-15 10:25:35 +00:00
delete ui ; // Will delete all content in all tabs
tabs . clear ( ) ;
// Step through ALL buttons and knobs setting their text to NULL (just in case)
for ( auto b = buttons - > begin ( ) ; b ! = buttons - > end ( ) ; b + + )
{
b - > text = Q_NULLPTR ;
b - > bgRect = Q_NULLPTR ;
}
2023-04-09 22:53:51 +00:00
2023-04-15 10:25:35 +00:00
for ( auto k = knobs - > begin ( ) ; k ! = knobs - > end ( ) ; k + + )
{
k - > text = Q_NULLPTR ;
}
2023-03-25 09:09:42 +00:00
}
2021-08-28 22:27:18 +00:00
2023-03-25 16:58:28 +00:00
void controllerSetup : : hideEvent ( QHideEvent * event )
{
2023-04-12 09:24:00 +00:00
Q_UNUSED ( event )
2023-03-26 15:08:53 +00:00
qDebug ( logUsbControl ( ) ) < < " Controller window hideEvent() " ;
2023-03-25 16:58:28 +00:00
updateDialog - > hide ( ) ;
}
2023-03-28 18:07:54 +00:00
void controllerSetup : : on_tabWidget_currentChanged ( int index )
{
2023-04-15 10:25:35 +00:00
// We may get the indexChanged event before the tabWidget has been initialized
2023-04-14 09:26:54 +00:00
if ( ui - > tabWidget - > widget ( index ) ! = Q_NULLPTR ) {
QString path = ui - > tabWidget - > widget ( index ) - > objectName ( ) ;
auto tab = tabs . find ( path ) ;
if ( tab ! = tabs . end ( ) )
{
this - > resize ( this - > sizeHint ( ) ) ;
}
}
2023-03-28 18:07:54 +00:00
if ( updateDialog ! = Q_NULLPTR )
2023-04-15 10:25:35 +00:00
{
2023-03-28 18:07:54 +00:00
updateDialog - > hide ( ) ;
2023-04-15 10:25:35 +00:00
}
2023-04-14 09:26:54 +00:00
2023-03-28 18:07:54 +00:00
}
2023-04-02 19:07:13 +00:00
void controllerSetup : : init ( usbDevMap * dev , QVector < BUTTON > * but , QVector < KNOB > * kb , QVector < COMMAND > * cmd , QMutex * mut )
2023-03-25 09:09:42 +00:00
{
2023-04-02 19:07:13 +00:00
// Store pointers to all current settings
devices = dev ;
buttons = but ;
knobs = kb ;
commands = cmd ;
mutex = mut ;
2023-03-17 23:35:40 +00:00
2023-03-25 09:09:42 +00:00
updateDialog = new QDialog ( this ) ;
2023-03-25 16:58:28 +00:00
// Not sure if I like it Frameless or not?
updateDialog - > setWindowFlags ( Qt : : FramelessWindowHint | Qt : : Dialog ) ;
2023-03-17 23:35:40 +00:00
2023-04-02 19:07:13 +00:00
QGridLayout * udLayout = new QGridLayout ( updateDialog ) ;
2023-02-10 09:52:51 +00:00
2023-03-25 09:09:42 +00:00
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 ) ;
2023-04-15 20:13:43 +00:00
ledNumber = new QSpinBox ( ) ;
ledNumber - > setPrefix ( " LED: " ) ;
ledNumber - > setMinimum ( 0 ) ;
udLayout - > addWidget ( ledNumber , 3 , 1 ) ;
2023-03-25 09:09:42 +00:00
buttonLatch = new QCheckBox ( ) ;
buttonLatch - > setText ( " Toggle " ) ;
2023-04-15 20:13:43 +00:00
udLayout - > addWidget ( buttonLatch , 4 , 0 ) ;
2023-03-26 22:23:40 +00:00
QHBoxLayout * colorLayout = new QHBoxLayout ( ) ;
2023-04-15 20:13:43 +00:00
udLayout - > addLayout ( colorLayout , 4 , 1 ) ;
2023-03-26 22:23:40 +00:00
buttonOnColor = new QPushButton ( " Color " ) ;
colorLayout - > addWidget ( buttonOnColor ) ;
buttonOffColor = new QPushButton ( " Pressed " ) ;
colorLayout - > addWidget ( buttonOffColor ) ;
2023-03-25 09:09:42 +00:00
2023-03-26 15:08:53 +00:00
buttonIcon = new QPushButton ( " Icon " ) ;
2023-04-15 20:13:43 +00:00
udLayout - > addWidget ( buttonIcon , 5 , 0 ) ;
2023-03-26 15:08:53 +00:00
iconLabel = new QLabel ( " <None> " ) ;
2023-04-15 20:13:43 +00:00
udLayout - > addWidget ( iconLabel , 5 , 1 ) ;
2023-03-26 15:08:53 +00:00
udLayout - > setAlignment ( iconLabel , Qt : : AlignCenter ) ;
2023-03-25 09:09:42 +00:00
udLayout - > setSizeConstraint ( QLayout : : SetFixedSize ) ;
updateDialog - > hide ( ) ;
2023-04-02 19:07:13 +00:00
onEvent - > clear ( ) ;
offEvent - > clear ( ) ;
knobEvent - > clear ( ) ;
for ( COMMAND & c : * commands ) {
if ( c . cmdType = = commandButton | | c . cmdType = = commandAny ) {
if ( c . command = = cmdSeparator ) {
onEvent - > insertSeparator ( onEvent - > count ( ) ) ;
offEvent - > insertSeparator ( offEvent - > count ( ) ) ;
} else {
onEvent - > addItem ( c . text , c . index ) ;
offEvent - > addItem ( c . text , c . index ) ;
}
}
2023-04-09 22:53:51 +00:00
if ( c . cmdType = = commandKnob | | c . cmdType = = commandAny ) {
2023-04-02 19:07:13 +00:00
if ( c . command = = cmdSeparator ) {
knobEvent - > insertSeparator ( knobEvent - > count ( ) ) ;
} else {
knobEvent - > addItem ( c . text , c . index ) ;
}
}
}
2023-03-25 09:09:42 +00:00
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 ) ) ) ;
2023-03-26 22:23:40 +00:00
connect ( buttonOnColor , SIGNAL ( clicked ( ) ) , this , SLOT ( buttonOnColorClicked ( ) ) ) ;
connect ( buttonOffColor , SIGNAL ( clicked ( ) ) , this , SLOT ( buttonOffColorClicked ( ) ) ) ;
2023-03-26 15:08:53 +00:00
connect ( buttonIcon , SIGNAL ( clicked ( ) ) , this , SLOT ( buttonIconClicked ( ) ) ) ;
2023-03-25 09:09:42 +00:00
connect ( buttonLatch , SIGNAL ( stateChanged ( int ) ) , this , SLOT ( latchStateChanged ( int ) ) ) ;
2023-04-15 20:13:43 +00:00
connect ( ledNumber , SIGNAL ( valueChanged ( int ) ) , this , SLOT ( ledNumberChanged ( int ) ) ) ;
2023-03-25 09:09:42 +00:00
}
2023-04-15 20:13:43 +00:00
2023-04-09 22:53:51 +00:00
void controllerSetup : : showMenu ( controllerScene * scene , QPoint p )
2022-04-22 10:11:21 +00:00
{
2023-03-25 09:09:42 +00:00
Q_UNUSED ( scene ) // We might want it in the future?
2022-04-22 10:11:21 +00:00
// Receive mouse event from the scene
2023-03-25 16:58:28 +00:00
qDebug ( ) < < " Looking for knob or button at Point x= " < < p . x ( ) < < " y= " < < p . y ( ) ;
2023-02-10 00:27:01 +00:00
2023-03-25 09:09:42 +00:00
QPoint gp = this - > mapToGlobal ( p ) ;
2023-02-10 15:23:57 +00:00
2023-04-02 19:07:13 +00:00
2023-03-26 15:08:53 +00:00
// Did the user click on a button?
2023-04-02 19:07:13 +00:00
auto but = std : : find_if ( buttons - > begin ( ) , buttons - > end ( ) , [ p , this ] ( BUTTON & b )
2023-03-26 15:08:53 +00:00
{ return ( b . parent ! = Q_NULLPTR & & b . pos . contains ( p ) & & b . page = = b . parent - > currentPage & & ui - > tabWidget - > currentWidget ( ) - > objectName ( ) = = b . path ) ; } ) ;
2023-02-10 00:27:01 +00:00
2023-04-02 19:07:13 +00:00
if ( but ! = buttons - > end ( ) )
2023-03-17 23:35:40 +00:00
{
2023-04-13 14:28:46 +00:00
currentButton = & ( * but ) ;
2023-03-26 15:08:53 +00:00
currentKnob = Q_NULLPTR ;
qDebug ( ) < < " Button " < < currentButton - > num < < " On Event " < < currentButton - > onCommand - > text < < " Off Event " < < currentButton - > offCommand - > text ;
2023-04-02 19:07:13 +00:00
updateDialog - > setWindowTitle ( QString ( " Update button %0 " ) . arg ( but - > num ) ) ;
2023-03-26 15:08:53 +00:00
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 ( ) ;
2023-03-28 18:07:54 +00:00
2023-04-15 20:13:43 +00:00
ledNumber - > blockSignals ( true ) ;
ledNumber - > setMaximum ( currentButton - > parent - > type . leds ) ;
ledNumber - > setValue ( currentButton - > led ) ;
ledNumber - > blockSignals ( false ) ;
2023-03-28 18:07:54 +00:00
switch ( currentButton - > parent - > type . model )
{
2023-04-15 20:13:43 +00:00
case RC28 :
case eCoderPlus :
ledNumber - > show ( ) ;
buttonOnColor - > hide ( ) ;
buttonOffColor - > hide ( ) ;
buttonIcon - > hide ( ) ;
iconLabel - > hide ( ) ;
break ;
2023-03-28 18:07:54 +00:00
case StreamDeckMini :
case StreamDeckMiniV2 :
case StreamDeckOriginal :
case StreamDeckOriginalV2 :
case StreamDeckOriginalMK2 :
case StreamDeckXL :
case StreamDeckXLV2 :
case StreamDeckPlus :
buttonOnColor - > setStyleSheet ( QString ( " background-color: %1 " ) . arg ( currentButton - > backgroundOn . name ( QColor : : HexArgb ) ) ) ;
buttonOffColor - > setStyleSheet ( QString ( " background-color: %1 " ) . arg ( currentButton - > backgroundOff . name ( QColor : : HexArgb ) ) ) ;
buttonOnColor - > show ( ) ;
buttonOffColor - > show ( ) ;
buttonIcon - > show ( ) ;
iconLabel - > setText ( currentButton - > iconName ) ;
iconLabel - > show ( ) ;
break ;
default :
buttonOnColor - > hide ( ) ;
buttonOffColor - > hide ( ) ;
buttonIcon - > hide ( ) ;
iconLabel - > hide ( ) ;
2023-04-15 20:13:43 +00:00
ledNumber - > hide ( ) ;
2023-03-28 18:07:54 +00:00
break ;
}
2023-03-26 15:08:53 +00:00
2023-03-25 09:09:42 +00:00
updateDialog - > show ( ) ;
updateDialog - > move ( gp ) ;
updateDialog - > adjustSize ( ) ;
2023-03-25 16:58:28 +00:00
updateDialog - > raise ( ) ;
2023-03-26 15:08:53 +00:00
} else {
// It wasn't a button so was it a knob?
2023-04-02 19:07:13 +00:00
auto kb = std : : find_if ( knobs - > begin ( ) , knobs - > end ( ) , [ p , this ] ( KNOB & k )
2023-03-26 15:08:53 +00:00
{ return ( k . parent ! = Q_NULLPTR & & k . pos . contains ( p ) & & k . page = = k . parent - > currentPage & & ui - > tabWidget - > currentWidget ( ) - > objectName ( ) = = k . path ) ; } ) ;
2023-04-02 19:07:13 +00:00
if ( kb ! = knobs - > end ( ) )
2023-03-26 15:08:53 +00:00
{
2023-04-13 14:28:46 +00:00
currentKnob = & ( * kb ) ;
2023-03-26 15:08:53 +00:00
currentButton = Q_NULLPTR ;
qDebug ( ) < < " Knob " < < currentKnob - > num < < " Event " < < currentKnob - > command - > text ;
2023-04-02 19:07:13 +00:00
updateDialog - > setWindowTitle ( QString ( " Update knob %0 " ) . arg ( kb - > num ) ) ;
2023-03-26 15:08:53 +00:00
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 ( ) ;
2023-03-26 22:23:40 +00:00
buttonOnColor - > hide ( ) ;
buttonOffColor - > hide ( ) ;
2023-03-26 15:08:53 +00:00
buttonIcon - > hide ( ) ;
iconLabel - > hide ( ) ;
2023-04-15 20:13:43 +00:00
ledNumber - > hide ( ) ;
2023-03-26 15:08:53 +00:00
updateDialog - > show ( ) ;
updateDialog - > move ( gp ) ;
updateDialog - > adjustSize ( ) ;
updateDialog - > raise ( ) ;
}
else
{
// It wasn't either so hide the updateDialog();
updateDialog - > hide ( ) ;
currentButton = Q_NULLPTR ;
currentKnob = Q_NULLPTR ;
}
2022-04-22 10:11:21 +00:00
}
}
2023-03-26 15:08:53 +00:00
2022-10-22 19:55:08 +00:00
void controllerSetup : : onEventIndexChanged ( int index ) {
2023-02-09 13:21:51 +00:00
Q_UNUSED ( index ) ;
2023-03-21 13:17:35 +00:00
// If command is changed, delete current command and deep copy the new command
2023-02-10 00:27:01 +00:00
if ( currentButton ! = Q_NULLPTR & & onEvent - > currentData ( ) . toInt ( ) < commands - > size ( ) ) {
2023-02-10 15:23:57 +00:00
QMutexLocker locker ( mutex ) ;
2023-04-02 19:07:13 +00:00
currentButton - > onCommand = & commands - > at ( onEvent - > currentData ( ) . toInt ( ) ) ;
2023-04-09 22:53:51 +00:00
currentButton - > text - > setPlainText ( currentButton - > onCommand - > text ) ;
currentButton - > text - > setPos ( currentButton - > pos . center ( ) . x ( ) - currentButton - > text - > boundingRect ( ) . width ( ) / 2 ,
( currentButton - > pos . center ( ) . y ( ) - currentButton - > text - > boundingRect ( ) . height ( ) / 2 ) ) ;
2023-02-12 16:45:21 +00:00
// Signal that any button programming on the device should be completed.
2023-04-09 22:53:51 +00:00
if ( currentButton - > icon = = Q_NULLPTR ) {
emit sendRequest ( currentButton - > parent , usbFeatureType : : featureButton , currentButton - > num , currentButton - > onCommand - > text , Q_NULLPTR , & currentButton - > backgroundOn ) ;
}
2022-04-22 10:11:21 +00:00
}
}
2022-10-22 19:55:08 +00:00
void controllerSetup : : offEventIndexChanged ( int index ) {
2023-02-09 13:21:51 +00:00
Q_UNUSED ( index ) ;
2023-03-21 13:17:35 +00:00
// If command is changed, delete current command and deep copy the new command
2023-02-10 00:27:01 +00:00
if ( currentButton ! = Q_NULLPTR & & offEvent - > currentData ( ) . toInt ( ) < commands - > size ( ) ) {
2023-02-10 15:23:57 +00:00
QMutexLocker locker ( mutex ) ;
2023-04-02 19:07:13 +00:00
currentButton - > offCommand = & commands - > at ( offEvent - > currentData ( ) . toInt ( ) ) ;
2022-04-22 10:11:21 +00:00
}
}
2023-04-15 20:13:43 +00:00
void controllerSetup : : ledNumberChanged ( int index ) {
if ( currentButton ! = Q_NULLPTR ) {
QMutexLocker locker ( mutex ) ;
currentButton - > led = index ;
}
}
2023-03-25 09:09:42 +00:00
2023-02-09 13:21:51 +00:00
void controllerSetup : : knobEventIndexChanged ( int index ) {
Q_UNUSED ( index ) ;
2023-03-21 13:17:35 +00:00
// If command is changed, delete current command and deep copy the new command
2023-02-10 00:27:01 +00:00
if ( currentKnob ! = Q_NULLPTR & & knobEvent - > currentData ( ) . toInt ( ) < commands - > size ( ) ) {
2023-02-10 15:23:57 +00:00
QMutexLocker locker ( mutex ) ;
2023-04-02 19:07:13 +00:00
currentKnob - > command = & commands - > at ( knobEvent - > currentData ( ) . toInt ( ) ) ;
2023-02-09 13:21:51 +00:00
currentKnob - > text - > setPlainText ( currentKnob - > command - > text ) ;
2023-02-12 16:45:21 +00:00
currentKnob - > text - > setPos ( currentKnob - > pos . center ( ) . x ( ) - currentKnob - > text - > boundingRect ( ) . width ( ) / 2 ,
( currentKnob - > pos . center ( ) . y ( ) - currentKnob - > text - > boundingRect ( ) . height ( ) / 2 ) ) ;
2023-02-09 13:21:51 +00:00
}
}
2023-03-25 09:09:42 +00:00
2023-03-26 22:23:40 +00:00
void controllerSetup : : buttonOnColorClicked ( )
2023-03-25 09:09:42 +00:00
{
QColorDialog : : ColorDialogOptions options ;
options . setFlag ( QColorDialog : : ShowAlphaChannel , false ) ;
options . setFlag ( QColorDialog : : DontUseNativeDialog , false ) ;
2023-03-26 22:23:40 +00:00
QColor selColor = QColorDialog : : getColor ( currentButton - > backgroundOn , this , " Select Color to use for unpressed button " , options ) ;
2023-03-25 09:09:42 +00:00
2023-03-26 22:23:40 +00:00
if ( selColor . isValid ( ) & & currentButton ! = Q_NULLPTR )
2023-03-25 09:09:42 +00:00
{
2023-03-26 22:23:40 +00:00
QMutexLocker locker ( mutex ) ;
currentButton - > backgroundOn = selColor ;
2023-04-09 22:53:51 +00:00
if ( currentButton - > graphics & & currentButton - > bgRect ! = Q_NULLPTR )
{
currentButton - > bgRect - > setBrush ( currentButton - > backgroundOn ) ;
}
2023-03-28 18:07:54 +00:00
buttonOnColor - > setStyleSheet ( QString ( " background-color: %1 " ) . arg ( currentButton - > backgroundOn . name ( QColor : : HexArgb ) ) ) ;
2023-03-26 22:23:40 +00:00
emit sendRequest ( currentButton - > parent , usbFeatureType : : featureButton , currentButton - > num , currentButton - > onCommand - > text , currentButton - > icon , & currentButton - > backgroundOn ) ;
2023-03-25 09:09:42 +00:00
}
2023-03-26 22:23:40 +00:00
}
2023-03-25 09:09:42 +00:00
2023-03-26 22:23:40 +00:00
void controllerSetup : : buttonOffColorClicked ( )
{
QColorDialog : : ColorDialogOptions options ;
options . setFlag ( QColorDialog : : ShowAlphaChannel , false ) ;
options . setFlag ( QColorDialog : : DontUseNativeDialog , false ) ;
QColor selColor = QColorDialog : : getColor ( currentButton - > backgroundOff , this , " Select Color to use for pressed button " , options ) ;
if ( selColor . isValid ( ) & & currentButton ! = Q_NULLPTR )
{
2023-03-25 09:09:42 +00:00
QMutexLocker locker ( mutex ) ;
2023-03-26 22:23:40 +00:00
currentButton - > backgroundOff = selColor ;
2023-03-28 18:07:54 +00:00
buttonOffColor - > setStyleSheet ( QString ( " background-color: %1 " ) . arg ( currentButton - > backgroundOff . name ( QColor : : HexArgb ) ) ) ;
2023-03-25 09:09:42 +00:00
}
}
2023-03-26 15:08:53 +00:00
void controllerSetup : : buttonIconClicked ( )
{
QString file = QFileDialog : : getOpenFileName ( this , " Select Icon Filename " , " . " , " Images (*png *.jpg) " ) ;
if ( ! file . isEmpty ( ) ) {
QFileInfo info = QFileInfo ( file ) ;
2023-03-28 18:07:54 +00:00
currentButton - > iconName = info . fileName ( ) ;
iconLabel - > setText ( currentButton - > iconName ) ;
2023-03-26 15:08:53 +00:00
QImage image ;
image . load ( file ) ;
2023-03-26 22:23:40 +00:00
if ( currentButton - > icon ! = Q_NULLPTR )
delete currentButton - > icon ;
currentButton - > icon = new QImage ( image . scaled ( currentButton - > parent - > type . iconSize , currentButton - > parent - > type . iconSize ) ) ;
2023-04-09 22:53:51 +00:00
} else {
if ( currentButton - > icon ! = Q_NULLPTR )
{
currentButton - > iconName = " " ;
delete currentButton - > icon ;
currentButton - > icon = Q_NULLPTR ;
}
2023-03-26 15:08:53 +00:00
}
2023-04-09 22:53:51 +00:00
iconLabel - > setText ( currentButton - > iconName ) ;
emit sendRequest ( currentButton - > parent , usbFeatureType : : featureButton , currentButton - > num , currentButton - > onCommand - > text , currentButton - > icon , & currentButton - > backgroundOn ) ;
2023-03-26 15:08:53 +00:00
}
2023-03-25 09:09:42 +00:00
void controllerSetup : : latchStateChanged ( int state )
{
if ( currentButton ! = Q_NULLPTR ) {
QMutexLocker locker ( mutex ) ;
currentButton - > toggle = ( int ) state ;
}
}
2023-03-17 23:35:40 +00:00
void controllerSetup : : removeDevice ( USBDEVICE * dev )
{
QMutexLocker locker ( mutex ) ;
2023-04-02 19:07:13 +00:00
/* We need to manually delete everything that has been created for this tab */
auto tab = tabs . find ( dev - > path ) ;
if ( tab = = tabs . end ( ) )
{
qWarning ( logUsbControl ( ) ) < < " Cannot find tabContent for deleted tab " < < dev - > path ;
return ;
}
for ( auto b = buttons - > begin ( ) ; b ! = buttons - > end ( ) ; b + + )
{
if ( b - > parent = = dev & & b - > page = = dev - > currentPage )
{
2023-04-09 22:53:51 +00:00
if ( b - > text ! = Q_NULLPTR ) {
tab . value ( ) - > scene - > removeItem ( b - > text ) ;
delete b - > text ;
b - > text = Q_NULLPTR ;
2023-04-02 19:07:13 +00:00
}
2023-04-09 22:53:51 +00:00
b - > offCommand = Q_NULLPTR ;
b - > onCommand = Q_NULLPTR ;
2023-04-02 19:07:13 +00:00
if ( b - > icon ! = Q_NULLPTR ) {
delete b - > icon ;
b - > icon = Q_NULLPTR ;
}
2023-04-09 22:53:51 +00:00
if ( b - > bgRect ! = Q_NULLPTR ) {
tab . value ( ) - > scene - > removeItem ( b - > bgRect ) ;
delete b - > bgRect ;
b - > bgRect = Q_NULLPTR ;
}
2023-04-02 19:07:13 +00:00
}
}
for ( auto k = knobs - > begin ( ) ; k ! = knobs - > end ( ) ; k + + )
{
if ( k - > parent = = dev & & k - > page = = dev - > currentPage )
{
if ( k - > text ! = Q_NULLPTR ) {
tab . value ( ) - > scene - > removeItem ( k - > text ) ;
delete k - > text ;
k - > text = Q_NULLPTR ;
k - > command = Q_NULLPTR ;
}
}
}
qDebug ( logUsbControl ( ) ) < < " Removing tab content " < < dev - > product ;
2023-03-17 23:35:40 +00:00
2023-04-02 19:07:13 +00:00
if ( tab . value ( ) - > bgImage ! = Q_NULLPTR ) {
tab . value ( ) - > scene - > removeItem ( tab . value ( ) - > bgImage ) ;
delete tab . value ( ) - > bgImage ;
}
delete tab . value ( ) - > scene ;
// Find the tab within the tabWidget
2023-03-17 23:35:40 +00:00
for ( int i = 0 ; i < ui - > tabWidget - > count ( ) ; i + + ) {
auto widget = ui - > tabWidget - > widget ( i ) ;
if ( widget - > objectName ( ) = = dev - > path ) {
2023-04-02 19:07:13 +00:00
ui - > tabWidget - > removeTab ( i ) ;
break ;
2023-03-17 23:35:40 +00:00
}
}
2022-04-22 10:11:21 +00:00
2023-04-02 19:07:13 +00:00
delete tab . value ( ) ;
tabs . remove ( dev - > path ) ;
// Hide the tabWidget if no tabs exist
2023-03-17 23:35:40 +00:00
if ( ui - > tabWidget - > count ( ) = = 0 )
{
ui - > tabWidget - > hide ( ) ;
noControllersText - > show ( ) ;
this - > adjustSize ( ) ;
}
}
2023-04-02 19:07:13 +00:00
void controllerSetup : : newDevice ( USBDEVICE * dev )
2021-08-28 22:27:18 +00:00
{
2023-02-11 11:39:18 +00:00
QMutexLocker locker ( mutex ) ;
2022-10-16 23:29:11 +00:00
2023-03-29 22:33:18 +00:00
for ( int i = 0 ; i < ui - > tabWidget - > count ( ) ; i + + ) {
if ( ui - > tabWidget - > widget ( i ) - > objectName ( ) = = dev - > path )
{
qInfo ( logUsbControl ( ) ) < < " Tab for " < < dev - > product < < " ( " < < dev - > path < < " ) Already exists! " ;
return ;
}
}
2023-04-02 19:07:13 +00:00
auto tab = tabs . find ( dev - > path ) ;
if ( tab ! = tabs . end ( ) )
{
qInfo ( logUsbControl ( ) ) < < " Tab content for " < < dev - > product < < " ( " < < dev - > path < < " ) Already exists! " ;
return ;
}
2023-03-20 15:32:04 +00:00
qDebug ( logUsbControl ( ) ) < < " Adding new tab for " < < dev - > product ;
2023-03-17 23:35:40 +00:00
noControllersText - > hide ( ) ;
2023-03-20 15:32:04 +00:00
2023-04-02 19:07:13 +00:00
tabContent * c = new tabContent ( ) ;
2023-03-20 15:32:04 +00:00
2023-04-15 10:25:35 +00:00
c - > tab = new QWidget ( ) ;
c - > widget = new QWidget ( ) ;
c - > tab - > setObjectName ( dev - > path ) ;
ui - > tabWidget - > addTab ( c - > tab , dev - > product ) ;
2023-03-18 16:38:24 +00:00
2023-04-15 10:25:35 +00:00
// Create the different layouts required
c - > mainLayout = new QVBoxLayout ( c - > tab ) ;
c - > layout = new QVBoxLayout ( ) ;
c - > topLayout = new QHBoxLayout ( ) ;
c - > sensLayout = new QHBoxLayout ( ) ;
c - > grid = new QGridLayout ( ) ;
2023-03-20 15:32:04 +00:00
2023-04-15 10:25:35 +00:00
c - > mainLayout - > addLayout ( c - > topLayout ) ;
c - > mainLayout - > addWidget ( c - > widget ) ;
c - > widget - > setLayout ( c - > layout ) ;
2023-03-18 16:38:24 +00:00
2023-04-15 10:25:35 +00:00
c - > disabled = new QCheckBox ( " Disable " ) ;
c - > topLayout - > addWidget ( c - > disabled ) ;
connect ( c - > disabled , qOverload < bool > ( & QCheckBox : : clicked ) ,
[ dev , this , c ] ( bool checked ) { this - > disableClicked ( dev , checked , c - > widget ) ; } ) ;
c - > disabled - > setChecked ( dev - > disabled ) ;
2023-03-18 16:38:24 +00:00
2023-04-15 10:25:35 +00:00
c - > message = new QLabel ( ) ;
2023-03-18 16:38:24 +00:00
if ( dev - > connected ) {
2023-04-15 10:25:35 +00:00
c - > message - > setStyleSheet ( " QLabel { color : green; } " ) ;
c - > message - > setText ( " Connected " ) ;
2023-03-18 16:38:24 +00:00
} else {
2023-04-15 10:25:35 +00:00
c - > message - > setStyleSheet ( " QLabel { color : red; } " ) ;
c - > message - > setText ( " Not Connected " ) ;
2023-03-18 16:38:24 +00:00
}
2023-04-15 10:25:35 +00:00
c - > topLayout - > addWidget ( c - > message ) ;
c - > message - > setAlignment ( Qt : : AlignRight ) ;
c - > view = new QGraphicsView ( ) ;
c - > layout - > addWidget ( c - > view ) ;
c - > layout - > addLayout ( c - > sensLayout ) ;
c - > sensLabel = new QLabel ( " Sensitivity " ) ;
c - > sensLayout - > addWidget ( c - > sensLabel ) ;
c - > sens = new QSlider ( Qt : : Horizontal ) ;
c - > sens - > setMinimum ( 1 ) ;
c - > sens - > setMaximum ( 21 ) ;
c - > sens - > setInvertedAppearance ( true ) ;
c - > sensLayout - > addWidget ( c - > sens ) ;
c - > sens - > setValue ( dev - > sensitivity ) ;
connect ( c - > sens , & QSlider : : valueChanged ,
2023-03-25 09:09:42 +00:00
[ dev , this ] ( int val ) { this - > sensitivityMoved ( dev , val ) ; } ) ;
2023-03-17 23:35:40 +00:00
2023-04-15 10:25:35 +00:00
c - > sensLayout - > addStretch ( 0 ) ;
2023-04-09 22:53:51 +00:00
2023-04-15 10:25:35 +00:00
c - > pageLabel = new QLabel ( " Page: " ) ;
c - > sensLayout - > addWidget ( c - > pageLabel ) ;
c - > page = new QSpinBox ( ) ;
c - > page - > setValue ( 1 ) ;
c - > page - > setMinimum ( 1 ) ;
c - > page - > setMaximum ( dev - > pages ) ;
c - > page - > setToolTip ( " Select current page to edit " ) ;
c - > sensLayout - > addWidget ( c - > page ) ;
dev - > pageSpin = c - > page ;
2023-04-09 22:53:51 +00:00
2023-04-15 10:25:35 +00:00
c - > image = new QImage ( ) ;
2023-03-25 09:09:42 +00:00
switch ( dev - > type . model ) {
2023-04-13 13:36:16 +00:00
case shuttleXpress :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/shuttlexpress.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
case shuttlePro2 :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/shuttlepro.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
case RC28 :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/rc28.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
case xBoxGamepad :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/xbox.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
case eCoderPlus :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/ecoder.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
case QuickKeys :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/quickkeys.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
case StreamDeckOriginal :
case StreamDeckOriginalV2 :
case StreamDeckOriginalMK2 :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/streamdeck.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
case StreamDeckMini :
case StreamDeckMiniV2 :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/streamdeckmini.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
case StreamDeckXL :
case StreamDeckXLV2 :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/streamdeckxl.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
case StreamDeckPlus :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/streamdeckplus.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
case StreamDeckPedal :
2023-04-15 10:25:35 +00:00
c - > image - > load ( " :/resources/streamdeckpedal.png " ) ;
2023-04-13 13:36:16 +00:00
break ;
default :
this - > adjustSize ( ) ;
break ;
2023-03-18 16:38:24 +00:00
}
2023-04-15 10:25:35 +00:00
c - > bgImage = new QGraphicsPixmapItem ( QPixmap : : fromImage ( * c - > image ) ) ;
c - > view - > setMinimumSize ( c - > bgImage - > boundingRect ( ) . width ( ) + 2 , c - > bgImage - > boundingRect ( ) . height ( ) + 2 ) ;
2023-04-02 19:07:13 +00:00
ui - > tabWidget - > show ( ) ;
c - > scene = new controllerScene ( ) ;
2023-04-15 10:25:35 +00:00
c - > view - > setScene ( c - > scene ) ;
2023-04-09 22:53:51 +00:00
connect ( c - > scene , SIGNAL ( showMenu ( controllerScene * , QPoint ) ) , this , SLOT ( showMenu ( controllerScene * , QPoint ) ) ) ;
2023-04-02 19:07:13 +00:00
c - > scene - > addItem ( c - > bgImage ) ;
2023-04-15 10:25:35 +00:00
c - > layout - > addLayout ( c - > grid ) ;
c - > brightLabel = new QLabel ( " Brightness " ) ;
c - > grid - > addWidget ( c - > brightLabel , 0 , 0 ) ;
c - > brightness = new QComboBox ( ) ;
c - > brightness - > addItem ( " Off " ) ;
c - > brightness - > addItem ( " Low " ) ;
c - > brightness - > addItem ( " Medium " ) ;
c - > brightness - > addItem ( " High " ) ;
c - > brightness - > setCurrentIndex ( dev - > brightness ) ;
c - > grid - > addWidget ( c - > brightness , 1 , 0 ) ;
connect ( c - > brightness , qOverload < int > ( & QComboBox : : currentIndexChanged ) ,
2023-03-25 09:09:42 +00:00
[ dev , this ] ( int index ) { this - > brightnessChanged ( dev , index ) ; } ) ;
2023-04-15 10:25:35 +00:00
c - > speedLabel = new QLabel ( " Speed " ) ;
c - > grid - > addWidget ( c - > speedLabel , 0 , 1 ) ;
c - > speed = new QComboBox ( ) ;
c - > speed - > addItem ( " Fastest " ) ;
c - > speed - > addItem ( " Faster " ) ;
c - > speed - > addItem ( " Normal " ) ;
c - > speed - > addItem ( " Slower " ) ;
c - > speed - > addItem ( " Slowest " ) ;
c - > speed - > setCurrentIndex ( dev - > speed ) ;
c - > grid - > addWidget ( c - > speed , 1 , 1 ) ;
connect ( c - > speed , qOverload < int > ( & QComboBox : : currentIndexChanged ) ,
2023-03-25 09:09:42 +00:00
[ dev , this ] ( int index ) { this - > speedChanged ( dev , index ) ; } ) ;
2023-04-15 10:25:35 +00:00
c - > orientLabel = new QLabel ( " Orientation " ) ;
c - > grid - > addWidget ( c - > orientLabel , 0 , 2 ) ;
c - > orientation = new QComboBox ( ) ;
c - > orientation - > addItem ( " Rotate 0 " ) ;
c - > orientation - > addItem ( " Rotate 90 " ) ;
c - > orientation - > addItem ( " Rotate 180 " ) ;
c - > orientation - > addItem ( " Rotate 270 " ) ;
c - > orientation - > setCurrentIndex ( dev - > orientation ) ;
c - > grid - > addWidget ( c - > orientation , 1 , 2 ) ;
connect ( c - > orientation , qOverload < int > ( & QComboBox : : currentIndexChanged ) ,
2023-03-25 09:09:42 +00:00
[ dev , this ] ( int index ) { this - > orientationChanged ( dev , index ) ; } ) ;
2023-04-15 10:25:35 +00:00
c - > color = new QPushButton ( " Color " ) ;
c - > color - > setStyleSheet ( QString ( " background-color: %1 " ) . arg ( dev - > color . name ( QColor : : HexArgb ) ) ) ;
c - > grid - > addWidget ( c - > color , 1 , 3 ) ;
connect ( c - > color , & QPushButton : : clicked ,
[ dev , c , this ] ( ) { this - > colorPicker ( dev , c - > color , dev - > color ) ; } ) ;
c - > timeoutLabel = new QLabel ( " Timeout " ) ;
c - > grid - > addWidget ( c - > timeoutLabel , 0 , 4 ) ;
c - > timeout = new QSpinBox ( ) ;
c - > timeout - > setValue ( dev - > timeout ) ;
c - > grid - > addWidget ( c - > timeout , 1 , 4 ) ;
connect ( c - > timeout , qOverload < int > ( & QSpinBox : : valueChanged ) ,
2023-03-25 09:09:42 +00:00
[ dev , this ] ( int index ) { this - > timeoutChanged ( dev , index ) ; } ) ;
2023-04-15 10:25:35 +00:00
c - > pagesLabel = new QLabel ( " Num Pages " ) ;
c - > grid - > addWidget ( c - > pagesLabel , 0 , 5 ) ;
c - > pages = new QSpinBox ( ) ;
c - > pages - > setValue ( dev - > pages ) ;
c - > pages - > setMinimum ( 1 ) ;
c - > grid - > addWidget ( c - > pages , 1 , 5 ) ;
connect ( c - > pages , qOverload < int > ( & QSpinBox : : valueChanged ) ,
2023-03-25 09:09:42 +00:00
[ dev , this ] ( int index ) { this - > pagesChanged ( dev , index ) ; } ) ;
2023-02-10 00:27:01 +00:00
2023-04-02 19:07:13 +00:00
for ( int i = 0 ; i < 6 ; i + + )
2023-04-15 10:25:35 +00:00
c - > grid - > setColumnStretch ( i , 1 ) ;
2023-02-12 16:45:21 +00:00
2023-04-15 10:25:35 +00:00
c - > helpText = new QLabel ( ) ;
c - > helpText - > setText ( " <p><b>Button configuration:</b> Right-click on each button to configure it.</p> " ) ;
c - > helpText - > setAlignment ( Qt : : AlignCenter ) ;
c - > layout - > addWidget ( c - > helpText ) ;
2023-03-25 09:09:42 +00:00
2023-04-15 10:25:35 +00:00
c - > view - > setSceneRect ( c - > scene - > itemsBoundingRect ( ) ) ;
2023-03-25 09:09:42 +00:00
this - > adjustSize ( ) ;
2023-03-17 23:35:40 +00:00
numTabs + + ;
2023-04-02 19:07:13 +00:00
tabs . insert ( dev - > path , c ) ;
2023-03-17 23:35:40 +00:00
2023-03-29 22:33:18 +00:00
dev - > uiCreated = true ;
2023-03-25 09:09:42 +00:00
// Finally update the device with the default values
2023-04-02 19:07:13 +00:00
emit sendRequest ( dev , usbFeatureType : : featureSensitivity , dev - > sensitivity ) ;
emit sendRequest ( dev , usbFeatureType : : featureBrightness , dev - > brightness ) ;
emit sendRequest ( dev , usbFeatureType : : featureOrientation , dev - > orientation ) ;
emit sendRequest ( dev , usbFeatureType : : featureSpeed , dev - > speed ) ;
emit sendRequest ( dev , usbFeatureType : : featureTimeout , dev - > timeout ) ;
2023-04-09 22:53:51 +00:00
emit sendRequest ( dev , usbFeatureType : : featureColor , 0 , " " , Q_NULLPTR , & dev - > color ) ;
2023-04-02 19:07:13 +00:00
2023-04-12 10:14:40 +00:00
// Attach pageChanged() here so we have access to all necessary vars
2023-04-15 10:25:35 +00:00
connect ( c - > page , qOverload < int > ( & QSpinBox : : valueChanged ) ,
2023-04-12 10:14:40 +00:00
[ dev , this ] ( int index ) { this - > pageChanged ( dev , index ) ; } ) ;
2023-04-13 13:36:16 +00:00
// Hide all controls that are not relevant to this controller
// We rely on being able to fallthrough case
# if defined __GNUC__
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
# endif
switch ( dev - > type . model ) {
case QuickKeys :
break ;
case StreamDeckPedal :
2023-04-15 10:25:35 +00:00
c - > sensLabel - > setVisible ( false ) ;
c - > sens - > setVisible ( false ) ;
2023-04-13 13:36:16 +00:00
case shuttleXpress :
case shuttlePro2 :
case RC28 :
case xBoxGamepad :
case eCoderPlus :
2023-04-15 10:25:35 +00:00
c - > brightLabel - > setVisible ( false ) ;
c - > speedLabel - > setVisible ( false ) ;
c - > timeoutLabel - > setVisible ( false ) ;
c - > orientLabel - > setVisible ( false ) ;
c - > brightness - > setVisible ( false ) ;
c - > speed - > setVisible ( false ) ;
c - > timeout - > setVisible ( false ) ;
c - > orientation - > setVisible ( false ) ;
c - > color - > setVisible ( false ) ;
2023-04-13 13:36:16 +00:00
break ;
case StreamDeckOriginal :
case StreamDeckOriginalV2 :
case StreamDeckOriginalMK2 :
case StreamDeckMini :
case StreamDeckMiniV2 :
case StreamDeckXL :
case StreamDeckXLV2 :
2023-04-15 10:25:35 +00:00
c - > sensLabel - > setVisible ( false ) ;
c - > sens - > setVisible ( false ) ; // No knobs!
2023-04-13 13:36:16 +00:00
case StreamDeckPlus :
2023-04-15 10:25:35 +00:00
c - > speedLabel - > setVisible ( false ) ;
c - > timeoutLabel - > setVisible ( false ) ;
c - > orientLabel - > setVisible ( false ) ;
c - > speed - > setVisible ( false ) ;
c - > timeout - > setVisible ( false ) ;
c - > orientation - > setVisible ( false ) ;
2023-04-13 13:36:16 +00:00
break ;
default :
break ;
}
// Don't allow fallthrough elsewhere in the file.
# if defined __GNUC__
# pragma GCC diagnostic pop
# endif
2023-04-09 22:53:51 +00:00
// pageChanged will update the buttons/knobs for the tab (using qTimer ensures mutex is unlocked first)
QTimer : : singleShot ( 0 , this , [ = ] ( ) { pageChanged ( dev , 1 ) ; } ) ;
2023-03-25 09:09:42 +00:00
2023-02-07 09:32:33 +00:00
}
2022-10-16 23:29:11 +00:00
2023-03-25 09:09:42 +00:00
void controllerSetup : : sensitivityMoved ( USBDEVICE * dev , int val )
2023-02-07 09:32:33 +00:00
{
2023-03-28 18:07:54 +00:00
qInfo ( logUsbControl ( ) ) < < " Setting sensitivity " < < val < < " for device " < < dev - > product ;
2023-03-25 09:09:42 +00:00
emit sendRequest ( dev , usbFeatureType : : featureSensitivity , val ) ;
2023-02-07 18:41:02 +00:00
}
2023-02-12 16:45:21 +00:00
2023-03-25 09:09:42 +00:00
void controllerSetup : : brightnessChanged ( USBDEVICE * dev , int index )
2023-02-12 16:45:21 +00:00
{
2023-03-25 09:09:42 +00:00
emit sendRequest ( dev , usbFeatureType : : featureBrightness , index ) ;
2023-02-12 16:45:21 +00:00
}
2023-03-25 09:09:42 +00:00
void controllerSetup : : orientationChanged ( USBDEVICE * dev , int index )
2023-02-12 16:45:21 +00:00
{
2023-03-25 09:09:42 +00:00
emit sendRequest ( dev , usbFeatureType : : featureOrientation , index ) ;
2023-02-12 16:45:21 +00:00
}
2023-03-25 09:09:42 +00:00
void controllerSetup : : speedChanged ( USBDEVICE * dev , int index )
2023-02-12 16:45:21 +00:00
{
2023-03-25 09:09:42 +00:00
emit sendRequest ( dev , usbFeatureType : : featureSpeed , index ) ;
2023-02-12 16:45:21 +00:00
}
2023-04-02 19:07:13 +00:00
void controllerSetup : : colorPicker ( USBDEVICE * dev , QPushButton * btn , QColor current )
2023-02-12 16:45:21 +00:00
{
QColorDialog : : ColorDialogOptions options ;
options . setFlag ( QColorDialog : : ShowAlphaChannel , false ) ;
options . setFlag ( QColorDialog : : DontUseNativeDialog , false ) ;
2023-04-02 19:07:13 +00:00
QColor selColor = QColorDialog : : getColor ( current , this , " Select Color " , options ) ;
2023-02-12 16:45:21 +00:00
2023-04-02 19:07:13 +00:00
if ( selColor . isValid ( ) )
2023-02-12 16:45:21 +00:00
{
2023-04-02 19:07:13 +00:00
btn - > setStyleSheet ( QString ( " background-color: %1 " ) . arg ( selColor . name ( QColor : : HexArgb ) ) ) ;
2023-04-09 22:53:51 +00:00
emit sendRequest ( dev , usbFeatureType : : featureColor , 0 , " " , Q_NULLPTR , & selColor ) ;
2023-02-12 16:45:21 +00:00
}
2023-03-25 09:09:42 +00:00
}
void controllerSetup : : timeoutChanged ( USBDEVICE * dev , int val )
{
emit sendRequest ( dev , usbFeatureType : : featureTimeout , val ) ;
emit sendRequest ( dev , usbFeatureType : : featureOverlay , val , QString ( " Sleep timeout set to %0 minutes " ) . arg ( val ) ) ;
}
void controllerSetup : : pagesChanged ( USBDEVICE * dev , int val )
{
emit programPages ( dev , val ) ;
dev - > pageSpin - > setMaximum ( val ) ; // Update pageSpin
2023-02-12 16:45:21 +00:00
}
2023-03-25 09:09:42 +00:00
void controllerSetup : : pageChanged ( USBDEVICE * dev , int val )
2023-02-12 16:45:21 +00:00
{
2023-04-02 19:07:13 +00:00
2023-04-12 10:14:40 +00:00
QMutexLocker locker ( mutex ) ;
2023-04-09 22:53:51 +00:00
2023-04-02 19:07:13 +00:00
auto tab = tabs . find ( dev - > path ) ;
if ( tab = = tabs . end ( ) )
{
qWarning ( logUsbControl ( ) ) < < " Cannot find tabContent while changing page " < < dev - > path ;
2023-03-25 09:09:42 +00:00
return ;
2023-04-02 19:07:13 +00:00
}
2023-03-25 09:09:42 +00:00
if ( val > dev - > pages )
val = 1 ;
if ( val < 1 )
val = dev - > pages ;
2023-03-26 15:08:53 +00:00
updateDialog - > hide ( ) ; // Hide the dialog if the page changes.
2023-03-25 09:09:42 +00:00
dev - > currentPage = val ;
2023-04-12 10:14:40 +00:00
// Need to block signals so this isn't called recursively.
dev - > pageSpin - > blockSignals ( true ) ;
2023-03-25 09:09:42 +00:00
dev - > pageSpin - > setValue ( val ) ;
2023-04-12 10:14:40 +00:00
dev - > pageSpin - > blockSignals ( false ) ;
2023-03-25 09:09:42 +00:00
// (re)set button text
for ( auto b = buttons - > begin ( ) ; b ! = buttons - > end ( ) ; b + + )
{
if ( b - > parent = = dev )
{
2023-04-12 09:24:00 +00:00
// Make sure we delete any other pages content and then update to latest.
if ( b - > text ! = Q_NULLPTR ) {
tab . value ( ) - > scene - > removeItem ( b - > text ) ;
delete b - > text ;
b - > text = Q_NULLPTR ;
}
if ( b - > graphics & & b - > bgRect ! = Q_NULLPTR ) {
tab . value ( ) - > scene - > removeItem ( b - > bgRect ) ;
delete b - > bgRect ;
b - > bgRect = Q_NULLPTR ;
2023-03-25 09:09:42 +00:00
}
2023-04-09 22:53:51 +00:00
if ( b - > page = = dev - > currentPage )
2023-03-25 09:09:42 +00:00
{
2023-04-09 22:53:51 +00:00
if ( b - > graphics )
{
b - > bgRect = new QGraphicsRectItem ( b - > pos ) ;
b - > bgRect - > setBrush ( b - > backgroundOn ) ;
tab . value ( ) - > scene - > addItem ( b - > bgRect ) ;
}
b - > text = new QGraphicsTextItem ( b - > onCommand - > text ) ;
b - > text - > setDefaultTextColor ( b - > textColour ) ;
tab . value ( ) - > scene - > addItem ( b - > text ) ;
b - > text - > setPos ( b - > pos . center ( ) . x ( ) - b - > text - > boundingRect ( ) . width ( ) / 2 ,
( b - > pos . center ( ) . y ( ) - b - > text - > boundingRect ( ) . height ( ) / 2 ) ) ;
2023-03-26 22:23:40 +00:00
emit sendRequest ( dev , usbFeatureType : : featureButton , b - > num , b - > onCommand - > text , b - > icon , & b - > backgroundOn ) ;
2023-03-25 09:09:42 +00:00
}
}
}
// Set knob text
for ( auto k = knobs - > begin ( ) ; k ! = knobs - > end ( ) ; k + + )
{
if ( k - > parent = = dev ) {
2023-04-12 09:24:00 +00:00
if ( k - > text ! = Q_NULLPTR ) {
tab . value ( ) - > scene - > removeItem ( k - > text ) ;
delete k - > text ;
k - > text = Q_NULLPTR ;
2023-03-25 09:09:42 +00:00
}
2023-04-09 22:53:51 +00:00
if ( k - > page = = dev - > currentPage )
2023-03-25 09:09:42 +00:00
{
k - > text = new QGraphicsTextItem ( k - > command - > text ) ;
k - > text - > setDefaultTextColor ( k - > textColour ) ;
2023-04-02 19:07:13 +00:00
tab . value ( ) - > scene - > addItem ( k - > text ) ;
2023-03-25 09:09:42 +00:00
k - > text - > setPos ( k - > pos . center ( ) . x ( ) - k - > text - > boundingRect ( ) . width ( ) / 2 ,
( k - > pos . center ( ) . y ( ) - k - > text - > boundingRect ( ) . height ( ) / 2 ) ) ;
}
}
}
2023-02-12 16:45:21 +00:00
}
2023-03-25 09:09:42 +00:00
void controllerSetup : : disableClicked ( USBDEVICE * dev , bool clicked , QWidget * widget )
2023-03-18 16:38:24 +00:00
{
// Disable checkbox has been clicked
2023-03-25 09:09:42 +00:00
emit programDisable ( dev , clicked ) ;
2023-04-02 19:07:13 +00:00
2023-03-18 16:38:24 +00:00
widget - > setEnabled ( ! clicked ) ;
2023-04-02 19:07:13 +00:00
2023-03-18 16:38:24 +00:00
}
2023-03-25 09:09:42 +00:00
void controllerSetup : : setConnected ( USBDEVICE * dev )
{
2023-03-29 22:33:18 +00:00
QMutexLocker locker ( mutex ) ;
2023-04-02 19:07:13 +00:00
auto tab = tabs . find ( dev - > path ) ;
if ( tab ! = tabs . end ( ) )
2023-03-25 09:09:42 +00:00
{
2023-03-29 22:33:18 +00:00
if ( dev - > connected )
{
2023-04-15 10:25:35 +00:00
tab . value ( ) - > message - > setStyleSheet ( " QLabel { color : green; } " ) ;
tab . value ( ) - > message - > setText ( " Connected " ) ;
2023-03-29 22:33:18 +00:00
} else {
2023-04-15 10:25:35 +00:00
tab . value ( ) - > message - > setStyleSheet ( " QLabel { color : red; } " ) ;
tab . value ( ) - > message - > setText ( " Not Connected " ) ;
2023-03-29 22:33:18 +00:00
}
}
}
void controllerSetup : : on_backupButton_clicked ( )
{
QString file = QFileDialog : : getSaveFileName ( this , " Select Backup Filename " , " . " , " Backup Files (*.ini) " ) ;
if ( ! file . isEmpty ( ) ) {
2023-04-09 22:53:51 +00:00
auto devIt = devices - > find ( ui - > tabWidget - > currentWidget ( ) - > objectName ( ) ) ;
if ( devIt = = devices - > end ( ) )
{
qWarning ( logUsbControl ) < < " on_restoreButton_clicked() Cannot find existing controller, aborting! " ;
}
else
{
emit backup ( & devIt . value ( ) , file ) ;
}
2023-03-29 22:33:18 +00:00
}
}
void controllerSetup : : on_restoreButton_clicked ( )
{
2023-04-02 19:07:13 +00:00
QMutexLocker locker ( mutex ) ;
2023-03-29 22:33:18 +00:00
QString file = QFileDialog : : getOpenFileName ( this , " Select Backup Filename " , " . " , " Backup Files (*.ini) " ) ;
if ( ! file . isEmpty ( ) ) {
2023-04-02 19:07:13 +00:00
QString path = ui - > tabWidget - > currentWidget ( ) - > objectName ( ) ;
auto devIt = devices - > find ( path ) ;
if ( devIt = = devices - > end ( ) )
{
qWarning ( logUsbControl ) < < " on_restoreButton_clicked() Cannot find existing controller, aborting! " ;
return ;
}
auto dev = & devIt . value ( ) ;
QSettings * settings = new QSettings ( file , QSettings : : Format : : IniFormat ) ;
QString version = settings - > value ( " Version " , " " ) . toString ( ) ;
settings - > beginGroup ( " Controller " ) ;
QString model = settings - > value ( " Model " , " " ) . toString ( ) ;
delete settings ;
if ( model ! = dev - > product ) {
QMessageBox msgBox ;
msgBox . setText ( " Stored controller does not match " ) ;
2023-04-13 14:28:46 +00:00
msgBox . setInformativeText ( QString ( " Backup: %0 \n Current: %1 \n \n This will probably not work! " ) . arg ( model , dev - > product ) ) ;
2023-04-02 19:07:13 +00:00
msgBox . setStandardButtons ( QMessageBox : : Ok | QMessageBox : : Cancel ) ;
msgBox . setDefaultButton ( QMessageBox : : Cancel ) ;
int ret = msgBox . exec ( ) ;
if ( ret = = QMessageBox : : Cancel ) {
return ;
}
}
if ( version ! = QString ( WFVIEW_VERSION ) )
{
QMessageBox msgBox ;
msgBox . setText ( " Version mismatch " ) ;
2023-04-13 14:28:46 +00:00
msgBox . setInformativeText ( QString ( " Backup was from a different version of wfview \n Backup: %0 \n Current: %1 \n \n Please verify compatibility " ) . arg ( version , QString ( WFVIEW_VERSION ) ) ) ;
2023-04-02 19:07:13 +00:00
msgBox . setStandardButtons ( QMessageBox : : Ok | QMessageBox : : Cancel ) ;
msgBox . setDefaultButton ( QMessageBox : : Cancel ) ;
int ret = msgBox . exec ( ) ;
if ( ret = = QMessageBox : : Cancel ) {
return ;
}
}
2023-04-09 22:53:51 +00:00
emit restore ( dev , file ) ;
2023-03-25 09:09:42 +00:00
}
}
2023-03-29 22:33:18 +00:00