mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-25 05:38:46 -05:00
Add network interface selection combo box widget to message_aggregator
This commit is contained in:
parent
1d9dd7df24
commit
ced3b523ea
@ -1491,7 +1491,7 @@ add_executable (message_aggregator
|
|||||||
${message_aggregator_RESOURCES_RCC}
|
${message_aggregator_RESOURCES_RCC}
|
||||||
${message_aggregator_VERSION_RESOURCES}
|
${message_aggregator_VERSION_RESOURCES}
|
||||||
)
|
)
|
||||||
target_link_libraries (message_aggregator Qt5::Widgets wsjtx_udp-static)
|
target_link_libraries (message_aggregator wsjt_qt Qt5::Widgets wsjtx_udp-static)
|
||||||
|
|
||||||
if (WSJT_CREATE_WINMAIN)
|
if (WSJT_CREATE_WINMAIN)
|
||||||
set_target_properties (message_aggregator PROPERTIES WIN32_EXECUTABLE ON)
|
set_target_properties (message_aggregator PROPERTIES WIN32_EXECUTABLE ON)
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <QtWidgets>
|
#include <QtWidgets>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
#include <QNetworkInterface>
|
||||||
|
#include <QSet>
|
||||||
|
|
||||||
#include "DecodesModel.hpp"
|
#include "DecodesModel.hpp"
|
||||||
#include "BeaconsModel.hpp"
|
#include "BeaconsModel.hpp"
|
||||||
@ -37,8 +39,10 @@ MessageAggregatorMainWindow::MessageAggregatorMainWindow ()
|
|||||||
, decodes_model_ {new DecodesModel {this}}
|
, decodes_model_ {new DecodesModel {this}}
|
||||||
, beacons_model_ {new BeaconsModel {this}}
|
, beacons_model_ {new BeaconsModel {this}}
|
||||||
, server_ {new MessageServer {this}}
|
, server_ {new MessageServer {this}}
|
||||||
, multicast_group_line_edit_ {new QLineEdit}
|
, port_spin_box_ {new QSpinBox {this}}
|
||||||
, log_table_view_ {new QTableView}
|
, multicast_group_line_edit_ {new QLineEdit {this}}
|
||||||
|
, network_interfaces_combo_box_ {new CheckableItemComboBox {this}}
|
||||||
|
, log_table_view_ {new QTableView {this}}
|
||||||
, add_call_of_interest_action_ {new QAction {tr ("&Add callsign"), this}}
|
, add_call_of_interest_action_ {new QAction {tr ("&Add callsign"), this}}
|
||||||
, delete_call_of_interest_action_ {new QAction {tr ("&Delete callsign"), this}}
|
, delete_call_of_interest_action_ {new QAction {tr ("&Delete callsign"), this}}
|
||||||
, last_call_of_interest_action_ {new QAction {tr ("&Highlight last only"), this}}
|
, last_call_of_interest_action_ {new QAction {tr ("&Highlight last only"), this}}
|
||||||
@ -68,16 +72,66 @@ MessageAggregatorMainWindow::MessageAggregatorMainWindow ()
|
|||||||
auto central_layout = new QVBoxLayout;
|
auto central_layout = new QVBoxLayout;
|
||||||
|
|
||||||
// server details
|
// server details
|
||||||
auto port_spin_box = new QSpinBox;
|
port_spin_box_->setMinimum (1);
|
||||||
port_spin_box->setMinimum (1);
|
port_spin_box_->setMaximum (std::numeric_limits<port_type>::max ());
|
||||||
port_spin_box->setMaximum (std::numeric_limits<port_type>::max ());
|
|
||||||
auto group_box_layout = new QFormLayout;
|
auto group_box_layout = new QFormLayout;
|
||||||
group_box_layout->addRow (tr ("Port number:"), port_spin_box);
|
group_box_layout->addRow (tr ("Port number:"), port_spin_box_);
|
||||||
group_box_layout->addRow (tr ("Multicast Group (blank for unicast server):"), multicast_group_line_edit_);
|
group_box_layout->addRow (tr ("Multicast Group (blank for unicast server):"), multicast_group_line_edit_);
|
||||||
|
group_box_layout->addRow (tr ("Network interfaces:"), network_interfaces_combo_box_);
|
||||||
|
int row;
|
||||||
|
QFormLayout::ItemRole role;
|
||||||
|
group_box_layout->getWidgetPosition (network_interfaces_combo_box_, &row, &role);
|
||||||
|
Q_ASSERT (row >= 0);
|
||||||
|
network_interfaces_form_label_widget_ = static_cast<QLabel *> (group_box_layout->itemAt (row, QFormLayout::LabelRole)->widget ());
|
||||||
|
network_interfaces_form_label_widget_->hide ();
|
||||||
|
network_interfaces_form_label_widget_->buddy ()->hide ();
|
||||||
|
connect (multicast_group_line_edit_, &QLineEdit::editingFinished, [this] {
|
||||||
|
if (multicast_group_line_edit_->text ().size ())
|
||||||
|
{
|
||||||
|
network_interfaces_form_label_widget_->show ();
|
||||||
|
network_interfaces_form_label_widget_->buddy ()->show ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
network_interfaces_form_label_widget_->hide ();
|
||||||
|
network_interfaces_form_label_widget_->buddy ()->hide ();
|
||||||
|
}
|
||||||
|
});
|
||||||
auto group_box = new QGroupBox {tr ("Server Details")};
|
auto group_box = new QGroupBox {tr ("Server Details")};
|
||||||
group_box->setLayout (group_box_layout);
|
group_box->setLayout (group_box_layout);
|
||||||
central_layout->addWidget (group_box);
|
central_layout->addWidget (group_box);
|
||||||
|
|
||||||
|
// populate network interface list
|
||||||
|
for (auto const& net_if : QNetworkInterface::allInterfaces ())
|
||||||
|
{
|
||||||
|
auto flags = QNetworkInterface::IsRunning | QNetworkInterface::CanMulticast;
|
||||||
|
if ((net_if.flags () & flags) == flags)
|
||||||
|
{
|
||||||
|
auto is_loopback = net_if.flags () & QNetworkInterface::IsLoopBack;
|
||||||
|
auto item = network_interfaces_combo_box_->addCheckItem (net_if.humanReadableName ()
|
||||||
|
, net_if.name ()
|
||||||
|
, is_loopback ? Qt::Checked : Qt::Unchecked);
|
||||||
|
item->setEnabled (!is_loopback);
|
||||||
|
auto tip = QString {"name(index): %1(%2) - %3"}.arg (net_if.name ()).arg (net_if.index ())
|
||||||
|
.arg (net_if.flags () & QNetworkInterface::IsUp ? "Up" : "Down");
|
||||||
|
auto hw_addr = net_if.hardwareAddress ();
|
||||||
|
if (hw_addr.size ())
|
||||||
|
{
|
||||||
|
tip += QString {"\nhw: %1"}.arg (net_if.hardwareAddress ());
|
||||||
|
}
|
||||||
|
auto aes = net_if.addressEntries ();
|
||||||
|
if (aes.size ())
|
||||||
|
{
|
||||||
|
tip += "\naddresses:";
|
||||||
|
for (auto const& ae : aes)
|
||||||
|
{
|
||||||
|
tip += QString {"\n ip: %1/%2"}.arg (ae.ip ().toString ()).arg (ae.prefixLength ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
item->setToolTip (tip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log_table_view_->setModel (log_);
|
log_table_view_->setModel (log_);
|
||||||
log_table_view_->verticalHeader ()->hide ();
|
log_table_view_->verticalHeader ()->hide ();
|
||||||
central_layout->addWidget (log_table_view_);
|
central_layout->addWidget (log_table_view_);
|
||||||
@ -200,16 +254,34 @@ MessageAggregatorMainWindow::MessageAggregatorMainWindow ()
|
|||||||
connect (decodes_model_, &DecodesModel::reply, server_, &MessageServer::reply);
|
connect (decodes_model_, &DecodesModel::reply, server_, &MessageServer::reply);
|
||||||
|
|
||||||
// UI behaviour
|
// UI behaviour
|
||||||
connect (port_spin_box, static_cast<void (QSpinBox::*)(int)> (&QSpinBox::valueChanged)
|
connect (port_spin_box_, static_cast<void (QSpinBox::*)(int)> (&QSpinBox::valueChanged)
|
||||||
, [this] (port_type port) {server_->start (port);});
|
, [this] (int /*port*/) {restart_server ();});
|
||||||
connect (multicast_group_line_edit_, &QLineEdit::editingFinished, [this, port_spin_box] () {
|
connect (multicast_group_line_edit_, &QLineEdit::editingFinished, [this] () {restart_server ();});
|
||||||
server_->start (port_spin_box->value (), QHostAddress {multicast_group_line_edit_->text ()});
|
connect (network_interfaces_combo_box_, &QComboBox::currentTextChanged, [this] () {restart_server ();});
|
||||||
});
|
|
||||||
|
|
||||||
port_spin_box->setValue (2237); // start up in unicast mode
|
port_spin_box_->setValue (2237); // start up in unicast mode
|
||||||
show ();
|
show ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MessageAggregatorMainWindow::restart_server ()
|
||||||
|
{
|
||||||
|
QSet<QString> net_ifs;
|
||||||
|
if (network_interfaces_combo_box_->isVisible ())
|
||||||
|
{
|
||||||
|
auto model = static_cast<QStandardItemModel *> (network_interfaces_combo_box_->model ());
|
||||||
|
for (int row = 0; row < model->rowCount (); ++row)
|
||||||
|
{
|
||||||
|
if (Qt::Checked == model->item (row)->checkState ())
|
||||||
|
{
|
||||||
|
net_ifs << model->item (row)->data ().toString ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
server_->start (port_spin_box_->value ()
|
||||||
|
, QHostAddress {multicast_group_line_edit_->text ()}
|
||||||
|
, net_ifs);
|
||||||
|
}
|
||||||
|
|
||||||
void MessageAggregatorMainWindow::log_qso (ClientKey const& /*key*/, QDateTime time_off
|
void MessageAggregatorMainWindow::log_qso (ClientKey const& /*key*/, QDateTime time_off
|
||||||
, QString const& dx_call
|
, QString const& dx_call
|
||||||
, QString const& dx_grid, Frequency dial_frequency, QString const& mode
|
, QString const& dx_grid, Frequency dial_frequency, QString const& mode
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
#include "MessageServer.hpp"
|
#include "MessageServer.hpp"
|
||||||
|
#include "widgets/CheckableItemComboBox.hpp"
|
||||||
|
|
||||||
class QDateTime;
|
class QDateTime;
|
||||||
class QStandardItemModel;
|
class QStandardItemModel;
|
||||||
@ -16,6 +17,8 @@ class QLineEdit;
|
|||||||
class QTableView;
|
class QTableView;
|
||||||
class ClientWidget;
|
class ClientWidget;
|
||||||
class QListWidget;
|
class QListWidget;
|
||||||
|
class QLabel;
|
||||||
|
class QSpinBox;
|
||||||
|
|
||||||
using Frequency = MessageServer::Frequency;
|
using Frequency = MessageServer::Frequency;
|
||||||
|
|
||||||
@ -38,6 +41,7 @@ public:
|
|||||||
, QString const& exchange_sent, QString const& exchange_rcvd, QString const& prop_mode);
|
, QString const& exchange_sent, QString const& exchange_rcvd, QString const& prop_mode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void restart_server ();
|
||||||
void add_client (ClientKey const&, QString const& version, QString const& revision);
|
void add_client (ClientKey const&, QString const& version, QString const& revision);
|
||||||
void remove_client (ClientKey const&);
|
void remove_client (ClientKey const&);
|
||||||
void change_highlighting (QString const& call, QColor const& bg = QColor {}, QColor const& fg = QColor {},
|
void change_highlighting (QString const& call, QColor const& bg = QColor {}, QColor const& fg = QColor {},
|
||||||
@ -52,7 +56,10 @@ private:
|
|||||||
DecodesModel * decodes_model_;
|
DecodesModel * decodes_model_;
|
||||||
BeaconsModel * beacons_model_;
|
BeaconsModel * beacons_model_;
|
||||||
MessageServer * server_;
|
MessageServer * server_;
|
||||||
|
QSpinBox * port_spin_box_;
|
||||||
QLineEdit * multicast_group_line_edit_;
|
QLineEdit * multicast_group_line_edit_;
|
||||||
|
CheckableItemComboBox * network_interfaces_combo_box_;
|
||||||
|
QLabel * network_interfaces_form_label_widget_;
|
||||||
QTableView * log_table_view_;
|
QTableView * log_table_view_;
|
||||||
QListWidget * calls_of_interest_;
|
QListWidget * calls_of_interest_;
|
||||||
QAction * add_call_of_interest_action_;
|
QAction * add_call_of_interest_action_;
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include <QNetworkInterface>
|
#include <QNetworkInterface>
|
||||||
#include <QUdpSocket>
|
#include <QUdpSocket>
|
||||||
#include <QString>
|
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
|
||||||
@ -78,7 +77,7 @@ public:
|
|||||||
QString version_;
|
QString version_;
|
||||||
QString revision_;
|
QString revision_;
|
||||||
QHostAddress multicast_group_address_;
|
QHostAddress multicast_group_address_;
|
||||||
QStringList network_interfaces_;
|
QSet<QString> network_interfaces_;
|
||||||
static BindMode constexpr bind_mode_ = ShareAddress | ReuseAddressHint;
|
static BindMode constexpr bind_mode_ = ShareAddress | ReuseAddressHint;
|
||||||
struct Client
|
struct Client
|
||||||
{
|
{
|
||||||
@ -433,9 +432,12 @@ MessageServer::MessageServer (QObject * parent, QString const& version, QString
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MessageServer::start (port_type port, QHostAddress const& multicast_group_address
|
void MessageServer::start (port_type port, QHostAddress const& multicast_group_address
|
||||||
, QStringList const& network_interface_names)
|
, QSet<QString> const& network_interface_names)
|
||||||
{
|
{
|
||||||
if (port != m_->localPort () || multicast_group_address != m_->multicast_group_address_)
|
qDebug () << "MessageServer::start port:" << port << "multicast addr:" << multicast_group_address.toString () << "network interfaces:" << network_interface_names;
|
||||||
|
if (port != m_->localPort ()
|
||||||
|
|| multicast_group_address != m_->multicast_group_address_
|
||||||
|
|| network_interface_names != m_->network_interfaces_)
|
||||||
{
|
{
|
||||||
m_->leave_multicast_group ();
|
m_->leave_multicast_group ();
|
||||||
if (impl::UnconnectedState != m_->state ())
|
if (impl::UnconnectedState != m_->state ())
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QPair>
|
#include <QPair>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QStringList>
|
#include <QSet>
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QHostAddress>
|
#include <QHostAddress>
|
||||||
@ -44,7 +44,7 @@ public:
|
|||||||
// which the server will join
|
// which the server will join
|
||||||
Q_SLOT void start (port_type port
|
Q_SLOT void start (port_type port
|
||||||
, QHostAddress const& multicast_group_address = QHostAddress {}
|
, QHostAddress const& multicast_group_address = QHostAddress {}
|
||||||
, QStringList const& network_interface_names = QStringList {});
|
, QSet<QString> const& network_interface_names = QSet<QString> {});
|
||||||
|
|
||||||
// ask the client to clear one or both of the decode windows
|
// ask the client to clear one or both of the decode windows
|
||||||
Q_SLOT void clear_decodes (ClientKey const&, quint8 window = 0);
|
Q_SLOT void clear_decodes (ClientKey const&, quint8 window = 0);
|
||||||
|
@ -169,7 +169,7 @@ public:
|
|||||||
connect (server_, &MessageServer::client_opened, this, &Server::add_client);
|
connect (server_, &MessageServer::client_opened, this, &Server::add_client);
|
||||||
connect (server_, &MessageServer::client_closed, this, &Server::remove_client);
|
connect (server_, &MessageServer::client_closed, this, &Server::remove_client);
|
||||||
|
|
||||||
server_->start (port, multicast_group, network_interface_names);
|
server_->start (port, multicast_group, QSet<QString> {network_interface_names.begin (), network_interface_names.end ()});
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
Reference in New Issue
Block a user