/*************************************************************************** miniCash Copyright © 2022 christoph holzheuer c.holzheuer@sourceworx.org This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. ***************************************************************************/ #include #include #include #include #include MCNetworkDialog::MCNetworkDialog( QWidget* parent, QSettings* settings ) : QDialog( parent ), _ui{new Ui::MCNetworkDialog}, _settings( settings ) { Q_ASSERT( nullptr != _settings ); _ui->setupUi( this ); // Murx, FIX! das sollte über den Translator gehen _ui->_buttonBox->button( QDialogButtonBox::Ok )->setText( "Speichern" ); _ui->_buttonBox->button( QDialogButtonBox::Cancel )->setText( "Abbrechen" ); /// Vorgabewerte setzen _ui->_receiverHost->setText( _settings->value( miniCash::keyReceiverHost ).toString() ); _ui->_receiverPort->setText( _settings->value( miniCash::keyReceiverPort, miniCash::receiverPort ).toString() ); _ui->_senderHost->setText( QHostInfo::localHostName() ); bool isReceiver = _settings->value( miniCash::keyIsTcpReceiver, miniCash::isTcpReceiver ).toBool(); bool isSender = _settings->value( miniCash::keyIsTcpSender, miniCash::isTcpSender ).toBool(); _ui->_isSender->setChecked ( isSender ); _ui->_isReceiver->setChecked( isReceiver ); onSetNetworkEnabled( true ); onTestHostEntry(); connect( _ui->_buttonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); connect( _ui->_buttonBox, SIGNAL( rejected() ), this, SLOT( reject() ) ); connect( _ui->_receiverHost, SIGNAL( textChanged(QString) ), this, SLOT( onTestHostEntry(QString) ) ); connect( _ui->_receiverPort, SIGNAL( textChanged(QString) ), this, SLOT( onTestHostEntry(QString) ) ); connect( _ui->_isSender, SIGNAL( toggled(bool) ), this, SLOT( onSetNetworkEnabled(bool) ) ); connect( _ui->_isReceiver, SIGNAL( toggled(bool) ), this, SLOT( onSetNetworkEnabled(bool) ) ); /// @see https://www.kdab.com/nailing-13-signal-slot-mistakes-clazy-1-3/: /// warning pass a context object as 3rd connect parameter connect( _ui->_buttonUseNetwork, &QAbstractButton::toggled, _ui->_receiverHost, [=]( bool isOn ) { _ui->_groupBox->setEnabled( isOn ); _useNetwork = isOn; if( !isOn ) { _ui->_isSender->setChecked( false ); _ui->_isReceiver->setChecked( false ); } } ); connect( _ui->_buttonTest, &QPushButton::clicked, _ui->_receiverHost, [=]() { QHostInfo::lookupHost( _ui->_receiverHost->text(), this, SLOT( onLookupHost(QHostInfo) ) ); } ); } /** * @brief Destruktor */ MCNetworkDialog::~MCNetworkDialog() { delete _ui; } void MCNetworkDialog::onTestHostEntry( const QString& ) { bool enable = !_ui->_receiverHost->text().isEmpty() && !_ui->_receiverPort->text().isEmpty(); _ui->_buttonTest->setEnabled( enable ); } void MCNetworkDialog::onSetNetworkEnabled( bool ) { bool isSender = _ui->_isSender->isChecked(); bool isReceiver = _ui->_isReceiver->isChecked(); _ui->_buttonTest->setEnabled( isSender ); _ui->_receiverHost->setEnabled( isSender ); _ui->_receiverPort->setEnabled( isSender ); _useNetwork = isSender || isReceiver; /// klappt nicht! Bedenke die Logik! ///_buttonUseNetwork->setChecked( _useNetwork ); _ui->_buttonUseUSB->setChecked( !_useNetwork ); _ui->_buttonUseNetwork->setChecked( _useNetwork ); _ui->_groupBox->setEnabled( _useNetwork ); } bool MCNetworkDialog::onLookupHost( const QHostInfo& hostInfo ) { if( hostInfo.error() != QHostInfo::NoError ) { _ui->_labelTest->setStyleSheet( "font-weight: bold; color: red" ); _ui->_labelTest->setText( "Host nicht gefunden" ); return false; } _ui->_labelTest->setStyleSheet( "font-weight: normal; color: green" ); _ui->_labelTest->setText( "Verbindung möglich" ); return true; } /** * @brief ok gedrückt: geänderte Daten prüfen und übernehmen */ void MCNetworkDialog::accept() { qDebug() << "MCNetworkDialog::accept()"; const QString& host = _ui->_receiverHost->text(); const QString& port = _ui->_receiverPort->text(); QHostInfo hostInfo; /// wollen wir ins netz? onSetNetworkEnabled( true ); /// wir wollen gar kein netz? if( !_useNetwork || _ui->_buttonUseUSB->isChecked() ) //return QDialog::reject(); goto xx; /// wollen wir server sein? if( !_ui->_isSender->isChecked() ) goto xx; /// wir wollen senden, also Receiver prüfen if( host.isEmpty() || port.isEmpty() ) { QMessageBox::warning ( this, "Eingabefehler", "Die Felder 'Servername' und 'Port'\n " "müssen belegt sein." ); return; } /* Nein, das haut so nicht hin // alles da, klappts dann auch mit dem Nachbarn? int res = QHostInfo::lookupHost( host, this, SLOT( onLookupHost(QHostInfo) ) ); /// hier warten, bis 'onLookupHost' zurückkommt und '_hostValid' gesetzt ist _lookupLock.lock(); */ hostInfo = QHostInfo::fromName( host ); if( onLookupHost( hostInfo ) ) goto xx; QMessageBox::warning ( this, "Netzwerkfehler", "Der Server '" + host + "' ist \n" "nicht erreichbar." ); return; xx: _settings->setValue( miniCash::keyIsTcpSender, _ui->_isSender->isChecked() ); _settings->setValue( miniCash::keyIsTcpReceiver, _ui->_isReceiver->isChecked() ); _settings->setValue( miniCash::keyReceiverHost, host ); _settings->setValue( miniCash::keyReceiverPort, port ); qDebug() << "-- isSender: " << _ui->_isSender->isChecked(); qDebug() << "-- isReceiver: " << _ui->_isReceiver->isChecked(); qDebug() << "-- host: " << host; qDebug() << "-- port: " << port; return QDialog::accept(); }