Move the last settings to the widget

creator-widgets
Phil Taylor 2023-06-11 22:31:32 +01:00
rodzic 52ac74c499
commit 021283df81
9 zmienionych plików z 3566 dodań i 3044 usunięć

Wyświetl plik

@ -10,6 +10,7 @@ settingswidget::settingswidget(QWidget *parent) :
{
ui->setupUi(this);
connect(ui->serverUsersTable,SIGNAL(rowAdded(int)),this, SLOT(serverAddUserLine(int)));
createSettingsListItems();
populateComboBoxes();
@ -870,8 +871,10 @@ void settingswidget::updateServerConfig(prefServerItem si)
quietlyUpdateLineEdit(ui->serverAudioPortText, QString::number(serverConfig->audioPort));
break;
case s_audioOutput:
ui->serverTXAudioOutputCombo->setCurrentIndex(audioDev->findOutput("Server", serverConfig->rigs.first()->txAudioSetup.name));
break;
case s_audioInput:
ui->serverRXAudioInputCombo->setCurrentIndex(audioDev->findInput("Server", serverConfig->rigs.first()->rxAudioSetup.name));
break;
case s_resampleQuality:
// Not used here
@ -1107,7 +1110,8 @@ void settingswidget::populateServerUsers()
QList<SERVERUSER>::iterator user = serverConfig->users.begin();
while (user != serverConfig->users.end())
{
serverAddUserLine(user->username, user->password, user->userType);
ui->serverUsersTable->insertRow(ui->serverUsersTable->rowCount());
serverAddUserLine(ui->serverUsersTable->rowCount()-1, user->username, user->password, user->userType);
if((user->username == "") && !blank)
blank = true;
row++;
@ -1115,14 +1119,12 @@ void settingswidget::populateServerUsers()
}
}
void settingswidget::serverAddUserLine(const QString &user, const QString &pass, const int &type)
void settingswidget::serverAddUserLine(int row, const QString &user, const QString &pass, const int &type)
{
// migration TODO: Review these signals/slots
ui->serverUsersTable->blockSignals(true);
ui->serverUsersTable->insertRow(ui->serverUsersTable->rowCount());
ui->serverUsersTable->setItem(ui->serverUsersTable->rowCount() - 1, 0, new QTableWidgetItem());
ui->serverUsersTable->setItem(ui->serverUsersTable->rowCount() - 1, 1, new QTableWidgetItem());
ui->serverUsersTable->setItem(ui->serverUsersTable->rowCount() - 1, 2, new QTableWidgetItem());
@ -2566,15 +2568,6 @@ void settingswidget::onServerUserFieldChanged()
QComboBox* comboBox = (QComboBox*)ui->serverUsersTable->cellWidget(row, 2);
serverConfig->users[row].userType = comboBox->currentIndex();
}
else if (col == 3)
{
serverConfig->users.removeAt(row);
ui->serverUsersTable->setRowCount(0);
foreach(SERVERUSER user, serverConfig->users)
{
serverAddUserLine(user.username, user.password, user.userType);
}
}
}
}
/* End of UDP Server settings */

Wyświetl plik

@ -232,6 +232,8 @@ private slots:
void on_colorSetBtnMeterPeakScale_clicked();
void on_colorEditMeterPeakScale_editingFinished();
void serverAddUserLine(int row,const QString& user="", const QString& pass="", const int& type=0);
private:
Ui::settingswidget *ui;
void createSettingsListItems();
@ -265,7 +267,6 @@ private:
QString setColorFromString(QString aarrggbb, QLedLabel *led);
void populateServerUsers();
void serverAddUserLine(const QString& user, const QString& pass, const int& type);
preferences *prefs = NULL;
colorPrefsType *colorPreset;

Wyświetl plik

@ -41,7 +41,7 @@
<item>
<widget class="QStackedWidget" name="settingsStack">
<property name="currentIndex">
<number>5</number>
<number>3</number>
</property>
<widget class="QWidget" name="radioAccess">
<layout class="QVBoxLayout" name="verticalLayout_21">
@ -2464,6 +2464,12 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_32">
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Users</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<item>
<widget class="tableWidget" name="serverUsersTable">
<property name="sizePolicy">
@ -2493,26 +2499,29 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
<property name="midLineWidth">
<number>0</number>
</property>
<property name="editTriggers">
<set>QAbstractItemView::DoubleClicked</set>
</property>
<property name="columnCount">
<number>4</number>
<number>3</number>
</property>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>100</number>
<number>140</number>
</attribute>
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderShowSortIndicator" stdset="0">
<bool>true</bool>
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderStretchLastSection">
<bool>false</bool>
@ -2532,31 +2541,13 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
<string>Admin</string>
</property>
</column>
<column>
<property name="text">
<string>Delete?</string>
</property>
</column>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_17">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6"/>
</item>
<item>
<spacer name="verticalSpacer_7">
<property name="orientation">

Wyświetl plik

@ -662,22 +662,35 @@ void spectrumScope::showHideControls(spectrumMode_t mode)
{
if((mode==spectModeCenter) || (mode==spectModeScrollC))
{
//edgeLabel->hide();
edgeCombo->hide();
edgeButton->hide();
toFixedButton->show();
//spanLabel->show();
spanCombo->show();
} else {
//edgeLabel->show();
edgeCombo->show();
edgeButton->show();
toFixedButton->hide();
//spanLabel->hide();
spanCombo->hide();
}
}
void spectrumScope::enableScope(bool en)
{
this->splitter->setVisible(en);
// Hide these controls if disabled
if (!en) {
this->edgeCombo->setVisible(en);
this->edgeButton->setVisible(en);
this->toFixedButton->setVisible(en);
this->spanCombo->setVisible(en);
}
this->themeCombo->setVisible(en);
this->clearPeaksButton->setVisible(en);
this->speedCombo->setVisible(en);
this->holdButton->setVisible(en);
}
void spectrumScope::selectScopeMode(spectrumMode_t m)
{
scopeModeCombo->blockSignals(true);

Wyświetl plik

@ -54,6 +54,8 @@ public:
void setTuningFloorZeros(bool tf) {this->tuningFloorZeros = tf;}
void setClickDragTuning(bool cg) { this->clickDragTuning = cg;}
void enableScope(bool en);
void receiveCwPitch(uchar p);
quint16 getCwPitch() { return cwPitch;}
void receivePassband(quint16 pass);

1745
wfmain - Copy.ui 100644

Plik diff jest za duży Load Diff

Wyświetl plik

@ -166,7 +166,6 @@ wfmain::wfmain(const QString settingsFile, const QString logFile, bool debugMode
setupMainUI();
connectSettingsWidget();
prepareSettingsWindow();
setSerialDevicesUI();
@ -359,27 +358,6 @@ void wfmain::openRig()
}
}
// Migrated
void wfmain::createSettingsListItems()
{
// Add items to the settings tab list widget
ui->settingsList->addItem("Radio Access"); // 0
ui->settingsList->addItem("User Interface"); // 1
ui->settingsList->addItem("Radio Settings"); // 2
ui->settingsList->addItem("Radio Server"); // 3
ui->settingsList->addItem("External Control"); // 4
ui->settingsList->addItem("DX Cluster"); // 5
ui->settingsList->addItem("Experimental"); // 6
//ui->settingsList->addItem("Audio Processing"); // 7
ui->settingsStack->setCurrentIndex(0);
}
// Migrated
void wfmain::on_settingsList_currentRowChanged(int currentRow)
{
ui->settingsStack->setCurrentIndex(currentRow);
}
void wfmain::rigConnections()
{
@ -1007,8 +985,6 @@ void wfmain::receiveNetworkAudioLevels(networkAudioLevels l)
void wfmain::setupMainUI()
{
createSettingsListItems();
ui->meter2Widget->hide();
// Future ideas:
@ -1078,8 +1054,6 @@ void wfmain::setupMainUI()
ui->tuneLockChk->setChecked(false);
freqLock = false;
connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateSizes(int)));
connect(
ui->txPowerSlider, &QSlider::valueChanged, this,
[=](const int &newValue) { statusFromSliderPercent("Tx Power", newValue);}
@ -1185,22 +1159,6 @@ void wfmain::connectSettingsWidget()
connect(setupui, SIGNAL(changedModInput(uchar,inputTypes)), this, SLOT(changedModInput(uchar,inputTypes)));
}
void wfmain::prepareSettingsWindow()
{
settingsTabisAttached = true;
settingsWidgetWindow = new QWidget;
settingsWidgetLayout = new QGridLayout;
settingsWidgetTab = new QTabWidget;
settingsWidgetWindow->setLayout(settingsWidgetLayout);
settingsWidgetLayout->addWidget(settingsWidgetTab);
settingsWidgetWindow->setWindowFlag(Qt::WindowCloseButtonHint, false);
//settingsWidgetWindow->setWindowFlag(Qt::WindowMinimizeButtonHint, false);
//settingsWidgetWindow->setWindowFlag(Qt::WindowMaximizeButtonHint, false);
// TODO: Capture an event when the window closes and handle accordingly.
}
// NOT Migrated, EHL TODO, carefully remove this function
void wfmain::updateSizes(int tabIndex)
{
@ -1209,38 +1167,13 @@ void wfmain::updateSizes(int tabIndex)
// This is a hack. It is not great, but it seems to work ok.
if(!rigCaps.hasSpectrum)
{
// Set "ignore" size policy for non-selected tabs:
for(int i=1;i<ui->tabWidget->count();i++)
if((i!=tabIndex))
ui->tabWidget->widget(i)->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); // allows size to be any size that fits the tab bar
if(tabIndex==0)
{
ui->tabWidget->widget(0)->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
ui->tabWidget->widget(0)->setMaximumSize(ui->tabWidget->widget(0)->minimumSizeHint());
ui->tabWidget->widget(0)->adjustSize(); // tab
this->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
this->setMaximumSize(QSize(940,380));
this->setMinimumSize(QSize(940,380));
resize(minimumSize());
adjustSize(); // main window
} else {
// At some other tab, with or without spectrum:
ui->tabWidget->widget(tabIndex)->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
this->setMinimumSize(QSize(1024, 600)); // not large enough for settings tab
this->setMaximumSize(QSize(65535,65535));
resize(minimumSize());
adjustSize();
}
} else {
ui->tabWidget->widget(tabIndex)->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
ui->tabWidget->widget(tabIndex)->setMaximumSize(65535,65535);
//ui->tabWidget->widget(0)->setMinimumSize();
}
}
void wfmain::getSettingsFilePath(QString settingsFile)
@ -2075,7 +2008,6 @@ void wfmain::loadSettings()
// migrated, remove these
//ui->serverRXAudioInputCombo->setEnabled(!prefs.enableLAN);
//ui->serverTXAudioOutputCombo->setEnabled(!prefs.enableLAN);
ui->audioSystemServerCombo->setEnabled(!prefs.enableLAN);
// If LAN is not enabled, disable local audio input/output
//ui->audioOutputCombo->setEnabled(prefs.enableLAN);
@ -2165,13 +2097,6 @@ void wfmain::loadSettings()
}
}
ui->serverEnableCheckbox->setChecked(serverConfig.enabled);
ui->serverControlPortText->setText(QString::number(serverConfig.controlPort));
ui->serverCivPortText->setText(QString::number(serverConfig.civPort));
ui->serverAudioPortText->setText(QString::number(serverConfig.audioPort));
RIGCONFIG* rigTemp = new RIGCONFIG();
rigTemp->rxAudioSetup.isinput = true;
rigTemp->txAudioSetup.isinput = false;
@ -2199,35 +2124,6 @@ void wfmain::loadSettings()
rigTemp->txAudioSetup.name = settings->value("ServerAudioOutput", "Default Output Device").toString();
serverConfig.rigs.append(rigTemp);
int row = 0;
ui->serverUsersTable->setRowCount(0);
QList<SERVERUSER>::iterator user = serverConfig.users.begin();
while (user != serverConfig.users.end())
{
if (user->username != "" && user->password != "")
{
serverAddUserLine(user->username, user->password, user->userType);
row++;
user++;
}
else {
user = serverConfig.users.erase(user);
}
}
if (row == 0) {
serverAddUserLine("", "", 0);
SERVERUSER user;
user.username = "";
user.password = "";
user.userType = 0;
serverConfig.users.append(user);
ui->serverAddUserBtn->setEnabled(false);
}
// At this point, the users list has exactly one empty user.
setupui->updateServerConfig(s_users);
@ -3067,117 +2963,6 @@ void wfmain::extChangedServerPref(prefServerItem i)
}
}
void wfmain::serverAddUserLine(const QString& user, const QString& pass, const int& type)
{
// migrated
ui->serverUsersTable->blockSignals(true);
ui->serverUsersTable->insertRow(ui->serverUsersTable->rowCount());
ui->serverUsersTable->setItem(ui->serverUsersTable->rowCount() - 1, 0, new QTableWidgetItem());
ui->serverUsersTable->setItem(ui->serverUsersTable->rowCount() - 1, 1, new QTableWidgetItem());
ui->serverUsersTable->setItem(ui->serverUsersTable->rowCount() - 1, 2, new QTableWidgetItem());
ui->serverUsersTable->setItem(ui->serverUsersTable->rowCount() - 1, 3, new QTableWidgetItem());
QLineEdit* username = new QLineEdit();
username->setProperty("row", (int)ui->serverUsersTable->rowCount() - 1);
username->setProperty("col", (int)0);
username->setText(user);
connect(username, SIGNAL(editingFinished()), this, SLOT(onServerUserFieldChanged()));
ui->serverUsersTable->setCellWidget(ui->serverUsersTable->rowCount() - 1, 0, username);
QLineEdit* password = new QLineEdit();
password->setProperty("row", (int)ui->serverUsersTable->rowCount() - 1);
password->setProperty("col", (int)1);
password->setEchoMode(QLineEdit::PasswordEchoOnEdit);
password->setText(pass);
connect(password, SIGNAL(editingFinished()), this, SLOT(onServerUserFieldChanged()));
ui->serverUsersTable->setCellWidget(ui->serverUsersTable->rowCount() - 1, 1, password);
QComboBox* comboBox = new QComboBox();
comboBox->insertItems(0, { "Full User","Full with no TX","Monitor only" });
comboBox->setProperty("row", (int)ui->serverUsersTable->rowCount() - 1);
comboBox->setProperty("col", (int)2);
comboBox->setCurrentIndex(type);
connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onServerUserFieldChanged()));
ui->serverUsersTable->setCellWidget(ui->serverUsersTable->rowCount() - 1, 2, comboBox);
QPushButton* button = new QPushButton();
button->setText("Delete");
button->setProperty("row", (int)ui->serverUsersTable->rowCount() - 1);
button->setProperty("col", (int)3);
connect(button, SIGNAL(clicked()), this, SLOT(onServerUserFieldChanged()));
ui->serverUsersTable->setCellWidget(ui->serverUsersTable->rowCount() - 1, 3, button);
ui->serverUsersTable->blockSignals(false);
}
void wfmain::onServerUserFieldChanged()
{
int row = sender()->property("row").toInt();
int col = sender()->property("col").toInt();
qDebug() << "Server User field col" << col << "row" << row << "changed";
// This is a new user line so add to serverUsersTable
if (serverConfig.users.length() <= row)
{
qInfo() << "Something bad has happened, serverConfig.users is shorter than table!";
}
else
{
if (col == 0)
{
QLineEdit* username = (QLineEdit*)ui->serverUsersTable->cellWidget(row, 0);
if (username->text() != serverConfig.users[row].username) {
serverConfig.users[row].username = username->text();
}
}
else if (col == 1)
{
QLineEdit* password = (QLineEdit*)ui->serverUsersTable->cellWidget(row, 1);
QByteArray pass;
passcode(password->text(), pass);
if (QString(pass) != serverConfig.users[row].password) {
serverConfig.users[row].password = pass;
}
}
else if (col == 2)
{
QComboBox* comboBox = (QComboBox*)ui->serverUsersTable->cellWidget(row, 2);
serverConfig.users[row].userType = comboBox->currentIndex();
}
else if (col == 3)
{
serverConfig.users.removeAt(row);
ui->serverUsersTable->setRowCount(0);
foreach(SERVERUSER user, serverConfig.users)
{
serverAddUserLine(user.username, user.password, user.userType);
}
}
if (row == ui->serverUsersTable->rowCount() - 1) {
ui->serverAddUserBtn->setEnabled(true);
}
}
}
void wfmain::on_serverAddUserBtn_clicked()
{
serverAddUserLine("", "", 0);
SERVERUSER user;
user.username = "";
user.password = "";
user.userType = 0;
serverConfig.users.append(user);
ui->serverAddUserBtn->setEnabled(false);
}
void wfmain::changedModInput(uchar val, inputTypes type)
{
@ -3579,7 +3364,6 @@ void wfmain::showHideSpectrum(bool show)
//ui->spectrumGroupBox->setEnabled(show);
// Window resize:
updateSizes(ui->tabWidget->currentIndex());
}
@ -3608,7 +3392,7 @@ void wfmain::shortcutF11()
void wfmain::shortcutF1()
{
ui->tabWidget->setCurrentIndex(0);
}
void wfmain::shortcutF2()
@ -3623,7 +3407,7 @@ void wfmain::shortcutF3()
void wfmain::shortcutF4()
{
ui->tabWidget->setCurrentIndex(1);
}
// Mode switch keys:
@ -4025,27 +3809,18 @@ void wfmain:: getInitialRigState()
*/
if(rigCaps.hasSpectrum)
{
queue->add(priorityImmediate,queueItem(funcScopeDataOutput,QVariant::fromValue(quint8(1)),false));
queue->add(priorityImmediate,queueItem(funcScopeOnOff,QVariant::fromValue(quint8(1)),false));
}
ui->mainScope->enableScope(this->rigCaps.commands.contains(funcScopeMainMode));
ui->subScope->enableScope(this->rigCaps.commands.contains(funcScopeSubMode));
ui->scopeSettingsGroup->setVisible(rigCaps.hasSpectrum);
ui->scopeDualBtn->setVisible(rigCaps.commands.contains(funcScopeSingleDual));
ui->antennaGroup->setVisible(rigCaps.commands.contains(funcAntenna));
/*
if(ui->scopeEnableWFBtn->checkState() == Qt::Unchecked)
{
queue->add(priorityImmediate,queueItem(funcScopeOnOff,QVariant::fromValue(quint8(0)),false));
}
else if (ui->scopeEnableWFBtn->checkState() == Qt::PartiallyChecked)
{
queue->add(priorityImmediate,queueItem(funcScopeDataOutput,QVariant::fromValue(quint8(0)),false));
queue->add(priorityImmediate,queueItem(funcScopeOnOff,QVariant::fromValue(quint8(1)),false));
}
else
{
queue->add(priorityImmediate,queueItem(funcScopeDataOutput,QVariant::fromValue(quint8(1)),false));
queue->add(priorityImmediate,queueItem(funcScopeOnOff,QVariant::fromValue(quint8(1)),false));
}
*/
// TODO work out which scope to enable and when.
queue->add(priorityImmediate,queueItem(funcScopeDataOutput,QVariant::fromValue(quint8(1)),false));
queue->add(priorityImmediate,queueItem(funcScopeOnOff,QVariant::fromValue(quint8(1)),false));
}
if (rigCaps.commands.contains(funcFilterWidth))
queue->add(priorityHigh,funcFilterWidth,false);
@ -4096,6 +3871,7 @@ void wfmain:: getInitialRigState()
if(rigCaps.commands.contains(funcTunerStatus))
queue->add(priorityImmediate,funcTunerStatus,false);
*/
}
void wfmain::showStatusBarText(QString text)
@ -4484,7 +4260,7 @@ void wfmain::receiveRigID(rigCapabilities rigCaps)
// }
// }
}
updateSizes(ui->tabWidget->currentIndex());
}
void wfmain::initPeriodicCommands()
@ -4594,379 +4370,6 @@ void wfmain::changeTxBtn()
}
}
void wfmain::handlePlotDoubleClick(QMouseEvent *me)
{
/*
if (me->button() == Qt::LeftButton) {
double x;
freqt freqGo;
//double y;
//double px;
if (!freqLock)
{
//y = plot->yAxis->pixelToCoord(me->pos().y());
x = plot->xAxis->pixelToCoord(me->pos().x());
freqGo.Hz = x * 1E6;
freqGo.Hz = roundFrequency(freqGo.Hz, tsWfScrollHz);
freqGo.MHzDouble = (float)freqGo.Hz / 1E6;
queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue<freqt>(freqGo),false));
ui->mainScope->setFrequency(freqGo);
setUIFreq();
showStatusBarText(QString("Going to %1 MHz").arg(x));
}
} else if (me->button() == Qt::RightButton) {
QCPAbstractItem* item = plot->itemAt(me->pos(), true);
QCPItemRect* rectItem = dynamic_cast<QCPItemRect*> (item);
if (rectItem != nullptr) {
double pbFreq = (pbtDefault / passbandWidth) * 127.0;
qint16 newFreq = pbFreq + 128;
queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue<ushort>(newFreq),false));
queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue<ushort>(newFreq),false));
queue->add(priorityHighest,funcPBTInner);
queue->add(priorityHighest,funcPBTOuter);
}
}
*/
}
void wfmain::handleWFDoubleClick(QMouseEvent *me)
{
/*
double x;
freqt freqGo;
//double y;
//x = wf->xAxis->pixelToCoord(me->pos().x());
//y = wf->yAxis->pixelToCoord(me->pos().y());
// cheap trick until I figure out how the axis works on the WF:
if(!freqLock)
{
x = plot->xAxis->pixelToCoord(me->pos().x());
freqGo.Hz = x*1E6;
freqGo.Hz = roundFrequency(freqGo.Hz, tsWfScrollHz);
freqGo.MHzDouble = (float)freqGo.Hz / 1E6;
queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue<freqt>(freqGo),false));
ui->mainScope->setFrequency(freqGo);
setUIFreq();
showStatusBarText(QString("Going to %1 MHz").arg(x));
}
*/
}
void wfmain::handlePlotClick(QMouseEvent* me)
{
/*
QCPAbstractItem* item = plot->itemAt(me->pos(), true);
QCPItemText* textItem = dynamic_cast<QCPItemText*> (item);
QCPItemRect* rectItem = dynamic_cast<QCPItemRect*> (item);
#if QCUSTOMPLOT_VERSION < 0x020000
int leftPix = (int)passbandIndicator->left->pixelPoint().x();
int rightPix = (int)passbandIndicator->right->pixelPoint().x();
int pbtLeftPix = (int)pbtIndicator->left->pixelPoint().x();
int pbtRightPix = (int)pbtIndicator->right->pixelPoint().x();
#else
int leftPix = (int)passbandIndicator->left->pixelPosition().x();
int rightPix = (int)passbandIndicator->right->pixelPosition().x();
int pbtLeftPix = (int)pbtIndicator->left->pixelPosition().x();
int pbtRightPix = (int)pbtIndicator->right->pixelPosition().x();
#endif
int pbtCenterPix = pbtLeftPix + ((pbtRightPix - pbtLeftPix) / 2);
int cursor = me->pos().x();
if (me->button() == Qt::LeftButton) {
if (textItem != nullptr)
{
QMap<QString, spotData*>::iterator spot = clusterSpots.find(textItem->text());
if (spot != clusterSpots.end() && spot.key() == textItem->text())
{
qInfo(logGui()) << "Clicked on spot:" << textItem->text();
freqt freqGo;
freqGo.Hz = (spot.value()->frequency) * 1E6;
freqGo.MHzDouble = spot.value()->frequency;
queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue<freqt>(freqGo),false));
}
}
else if (passbandAction == passbandStatic && rectItem != nullptr)
{
if ((cursor <= leftPix && cursor > leftPix - 10) || (cursor >= rightPix && cursor < rightPix + 10))
{
passbandAction = passbandResizing;
}
}
else if (prefs.clickDragTuningEnable)
{
this->mousePressFreq = plot->xAxis->pixelToCoord(cursor);
showStatusBarText(QString("Selected %1 MHz").arg(this->mousePressFreq));
}
else {
double x = plot->xAxis->pixelToCoord(cursor);
showStatusBarText(QString("Selected %1 MHz").arg(x));
}
}
else if (me->button() == Qt::RightButton)
{
if (textItem != nullptr) {
QMap<QString, spotData*>::iterator spot = clusterSpots.find(textItem->text());
if (spot != clusterSpots.end() && spot.key() == textItem->text()) {
// parent and children are destroyed on close
QDialog* spotDialog = new QDialog();
QVBoxLayout* vlayout = new QVBoxLayout;
//spotDialog->setFixedSize(240, 100);
spotDialog->setBaseSize(1, 1);
spotDialog->setWindowTitle(spot.value()->dxcall);
QLabel* dxcall = new QLabel(QString("DX:%1").arg(spot.value()->dxcall));
QLabel* spotter = new QLabel(QString("Spotter:%1").arg(spot.value()->spottercall));
QLabel* frequency = new QLabel(QString("Frequency:%1 MHz").arg(spot.value()->frequency));
QLabel* comment = new QLabel(QString("Comment:%1").arg(spot.value()->comment));
QAbstractButton* bExit = new QPushButton("Close");
vlayout->addWidget(dxcall);
vlayout->addWidget(spotter);
vlayout->addWidget(frequency);
vlayout->addWidget(comment);
vlayout->addWidget(bExit);
spotDialog->setLayout(vlayout);
spotDialog->show();
spotDialog->connect(bExit, SIGNAL(clicked()), spotDialog, SLOT(close()));
}
}
else if (passbandAction == passbandStatic && rectItem != nullptr)
{
if (cursor <= pbtLeftPix && cursor > pbtLeftPix - 10)
{
passbandAction = pbtInnerMove;
}
else if (cursor >= pbtRightPix && cursor < pbtRightPix + 10)
{
passbandAction = pbtOuterMove;
}
else if (cursor > pbtCenterPix - 20 && cursor < pbtCenterPix + 20)
{
passbandAction = pbtMoving;
}
this->mousePressFreq = plot->xAxis->pixelToCoord(cursor);
}
}
*/
}
void wfmain::handlePlotMouseRelease(QMouseEvent* me)
{
/*
QCPAbstractItem* item = plot->itemAt(me->pos(), true);
QCPItemText* textItem = dynamic_cast<QCPItemText*> (item);
if (textItem == nullptr && prefs.clickDragTuningEnable) {
this->mouseReleaseFreq = plot->xAxis->pixelToCoord(me->pos().x());
double delta = mouseReleaseFreq - mousePressFreq;
qInfo(logGui()) << "Mouse release delta: " << delta;
}
if (passbandAction != passbandStatic) {
passbandAction = passbandStatic;
}
*/
}
void wfmain::handlePlotMouseMove(QMouseEvent* me)
{
/*
QCPAbstractItem* item = plot->itemAt(me->pos(), true);
QCPItemText* textItem = dynamic_cast<QCPItemText*> (item);
QCPItemRect* rectItem = dynamic_cast<QCPItemRect*> (item);
#if QCUSTOMPLOT_VERSION < 0x020000
int leftPix = (int)passbandIndicator->left->pixelPoint().x();
int rightPix = (int)passbandIndicator->right->pixelPoint().x();
int pbtLeftPix = (int)pbtIndicator->left->pixelPoint().x();
int pbtRightPix = (int)pbtIndicator->right->pixelPoint().x();
#else
int leftPix = (int)passbandIndicator->left->pixelPosition().x();
int rightPix = (int)passbandIndicator->right->pixelPosition().x();
int pbtLeftPix = (int)pbtIndicator->left->pixelPosition().x();
int pbtRightPix = (int)pbtIndicator->right->pixelPosition().x();
#endif
int pbtCenterPix = pbtLeftPix + ((pbtRightPix - pbtLeftPix) / 2);
int cursor = me->pos().x();
double movedFrequency = plot->xAxis->pixelToCoord(cursor) - mousePressFreq;
if (passbandAction == passbandStatic && rectItem != nullptr)
{
if ((cursor <= leftPix && cursor > leftPix - 10) ||
(cursor >= rightPix && cursor < rightPix + 10) ||
(cursor <= pbtLeftPix && cursor > pbtLeftPix - 10) ||
(cursor >= pbtRightPix && cursor < pbtRightPix + 10))
{
setCursor(Qt::SizeHorCursor);
}
else if (cursor > pbtCenterPix - 20 && cursor < pbtCenterPix + 20) {
setCursor(Qt::OpenHandCursor);
}
}
else if (passbandAction == passbandResizing)
{
static double lastFreq = movedFrequency;
if (lastFreq - movedFrequency > 0.000049 || movedFrequency - lastFreq > 0.000049) {
// We are currently resizing the passband.
double pb = 0.0;
double origin = 0.0;
switch (currentModeInfo.mk)
{
case modeCW:
case modeCW_R:
origin = 0.0;
break;
case modeLSB:
origin = -passbandCenterFrequency;
break;
default:
origin = passbandCenterFrequency;
break;
}
if (plot->xAxis->pixelToCoord(cursor) >= ui->mainScope->getFrequency().MHzDouble + origin) {
pb = plot->xAxis->pixelToCoord(cursor) - passbandIndicator->topLeft->coords().x();
}
else {
pb = passbandIndicator->bottomRight->coords().x() - plot->xAxis->pixelToCoord(cursor);
}
queue->add(priorityImmediate,queueItem(funcFilterWidth,QVariant::fromValue<ushort>(pb * 1000000),false));
queue->add(priorityHigh,funcFilterWidth);
lastFreq = movedFrequency;
}
}
else if (passbandAction == pbtMoving) {
//qint16 shift = (qint16)(level - 128);
//PBTInner = (double)(shift / 127.0) * (passbandWidth);
// Only move if more than 100Hz
static double lastFreq = movedFrequency;
if (lastFreq - movedFrequency > 0.000049 || movedFrequency - lastFreq > 0.000049) {
double innerFreq = ((double)(PBTInner + movedFrequency) / passbandWidth) * 127.0;
double outerFreq = ((double)(PBTOuter + movedFrequency) / passbandWidth) * 127.0;
qint16 newInFreq = innerFreq + 128;
qint16 newOutFreq = outerFreq + 128;
if (newInFreq >= 0 && newInFreq <= 255 && newOutFreq >= 0 && newOutFreq <= 255) {
qDebug() << QString("Moving passband by %1 Hz (Inner %2) (Outer %3) Mode:%4").arg((qint16)(movedFrequency * 1000000))
.arg(newInFreq).arg(newOutFreq).arg(currentModeInfo.mk);
queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue<ushort>(newInFreq),false));
queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue<ushort>(newOutFreq),false));
queue->add(priorityHighest,funcPBTInner);
queue->add(priorityHighest,funcPBTOuter);
}
lastFreq = movedFrequency;
}
}
else if (passbandAction == pbtInnerMove) {
static double lastFreq = movedFrequency;
if (lastFreq - movedFrequency > 0.000049 || movedFrequency - lastFreq > 0.000049) {
double pbFreq = ((double)(PBTInner + movedFrequency) / passbandWidth) * 127.0;
qint16 newFreq = pbFreq + 128;
if (newFreq >= 0 && newFreq <= 255) {
queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue<ushort>(newFreq),false));
queue->add(priorityHighest,funcPBTInner);
}
lastFreq = movedFrequency;
}
}
else if (passbandAction == pbtOuterMove) {
static double lastFreq = movedFrequency;
if (lastFreq - movedFrequency > 0.000049 || movedFrequency - lastFreq > 0.000049) {
double pbFreq = ((double)(PBTOuter + movedFrequency) / passbandWidth) * 127.0;
qint16 newFreq = pbFreq + 128;
if (newFreq >= 0 && newFreq <= 255) {
queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue<ushort>(newFreq),false));
queue->add(priorityHighest,funcPBTOuter);
}
lastFreq = movedFrequency;
}
}
else if (passbandAction == passbandStatic && me->buttons() == Qt::LeftButton && textItem == nullptr && prefs.clickDragTuningEnable)
{
double delta = plot->xAxis->pixelToCoord(cursor) - mousePressFreq;
qDebug(logGui()) << "Mouse moving delta: " << delta;
if( (( delta < -0.0001 ) || (delta > 0.0001)) && ((delta < 0.501) && (delta > -0.501)) )
{
freqt freqGo;
freqGo.VFO = activeVFO;
freqGo.Hz = (ui->mainScope->getFrequency().MHzDouble + delta) * 1E6;
freqGo.MHzDouble = (float)freqGo.Hz / 1E6;
queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue<freqt>(freqGo),false));
}
} else {
setCursor(Qt::ArrowCursor);
}
*/
}
void wfmain::handleWFClick(QMouseEvent *me)
{
//double x = plot->xAxis->pixelToCoord(me->pos().x());
//showStatusBarText(QString("Selected %1 MHz").arg(x));
}
void wfmain::handleWFScroll(QWheelEvent *we)
{
/*
// The wheel event is typically
// .y() and is +/- 120.
// We will click the dial once for every 120 received.
//QPoint delta = we->angleDelta();
if (freqLock)
return;
freqt f;
f.Hz = 0;
f.MHzDouble = 0;
int clicks = we->angleDelta().y() / 120;
if (!clicks)
return;
unsigned int stepsHz = tsWfScrollHz;
Qt::KeyboardModifiers key = we->modifiers();
if ((key == Qt::ShiftModifier) && (stepsHz != 1))
{
stepsHz /= 10;
}
else if (key == Qt::ControlModifier)
{
stepsHz *= 10;
}
f.Hz = roundFrequencyWithStep(ui->mainScope->getFrequency().Hz, clicks, stepsHz);
f.MHzDouble = f.Hz / (double)1E6;
ui->mainScope->setFrequency(f);
queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue<freqt>(f),false));
ui->freqLabel->setText(QString("%1").arg(f.MHzDouble, 0, 'f'));
*/
}
void wfmain::handlePlotScroll(QWheelEvent *we)
{
/*
handleWFScroll(we);
*/
}
void wfmain::receiveMode(modeInfo mode, bool sub)
{
Q_UNUSED(mode)
@ -5133,7 +4536,7 @@ void wfmain::handleBandStackReg(freqt freqGo, char mode, char filter, bool dataO
ui->mainScope->setFrequency(freqGo);
//setUIFreq();
ui->tabWidget->setCurrentIndex(0);
foreach (auto md, rigCaps.modes)
{
@ -6863,7 +6266,7 @@ void wfmain::receiveValue(cacheItem val){
ui->mainScope->setFrequency(bsr.freq);
ui->tabWidget->setCurrentIndex(0);
foreach (auto md, rigCaps.modes)
{

Wyświetl plik

@ -426,14 +426,7 @@ private slots:
void receivePortError(errorType err);
void receiveStatusUpdate(networkStatus status);
void receiveNetworkAudioLevels(networkAudioLevels l);
void handlePlotClick(QMouseEvent *);
void handlePlotMouseRelease(QMouseEvent *);
void handlePlotMouseMove(QMouseEvent *);
void handlePlotDoubleClick(QMouseEvent *);
void handleWFClick(QMouseEvent *);
void handleWFDoubleClick(QMouseEvent *);
void handleWFScroll(QWheelEvent *);
void handlePlotScroll(QWheelEvent *);
void showStatusBarText(QString text);
void receiveBaudRate(quint32 baudrate);
void radioSelection(QList<radio_cap_packet> radios);
@ -506,13 +499,10 @@ private slots:
void on_memoriesBtn_clicked();
void on_settingsList_currentRowChanged(int currentRow);
void on_setClockBtn_clicked();
void onServerUserFieldChanged();
void changedModInput(uchar val, inputTypes type);
void on_serverAddUserBtn_clicked();
void on_radioStatusBtn_clicked();
void on_topLevelSlider_valueChanged(int value);
@ -547,8 +537,6 @@ private:
void saveSettings();
void connectSettingsWidget();
void createSettingsListItems();
void initLogging();
QTimer logCheckingTimer;
int logCheckingOldPosition = 0;
@ -725,16 +713,6 @@ private:
void initPeriodicCommands();
void changePollTiming(int timing_ms, bool setUI=false);
void detachSettingsTab();
void reattachSettingsTab();
void prepareSettingsWindow();
QWidget *settingsWidgetWindow;
QWidget *settingsTab;
QGridLayout *settingsWidgetLayout;
QTabWidget *settingsWidgetTab;
bool settingsTabisAttached = true;
quint64 roundFrequency(quint64 frequency, unsigned int tsHz);
quint64 roundFrequencyWithStep(quint64 oldFreq, int steps,\
unsigned int tsHz);
@ -838,7 +816,6 @@ private:
availableBands lastRequestedBand=bandGen;
SERVERCONFIG serverConfig;
void serverAddUserLine(const QString& user, const QString& pass, const int& type);
funcs getInputTypeCommand(inputTypes input);

743
wfmain.ui
Wyświetl plik

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>1086</width>
<width>1088</width>
<height>569</height>
</rect>
</property>
@ -16,15 +16,35 @@
<widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<widget class="QFrame" name="mainGroup">
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>1</number>
</property>
<widget class="QWidget" name="mainTab">
<attribute name="title">
<string>View</string>
</attribute>
<property name="midLineWidth">
<number>0</number>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
@ -187,8 +207,8 @@
</property>
<property name="maximumSize">
<size>
<width>60</width>
<height>60</height>
<width>80</width>
<height>80</height>
</size>
</property>
<property name="accessibleName">
@ -1372,7 +1392,7 @@
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox">
<widget class="QGroupBox" name="scopeSettingsGroup">
<property name="title">
<string>Scope Settings</string>
</property>
@ -1525,6 +1545,35 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="antennaGroup">
<property name="title">
<string>Antenna</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QComboBox" name="antennaSelCombo">
<property name="accessibleName">
<string>Antenna port selector</string>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="rxAntennaCheck">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>RX</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_17">
<property name="leftMargin">
@ -1550,33 +1599,6 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_9">
<property name="text">
<string>Antenna:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="antennaSelCombo">
<property name="accessibleName">
<string>Antenna port selector</string>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="rxAntennaCheck">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>RX</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@ -1600,643 +1622,27 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="settingsTab">
<attribute name="title">
<string>Settings</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_23">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<item>
<widget class="QListWidget" name="settingsList">
<property name="minimumSize">
<size>
<width>150</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QStackedWidget" name="settingsStack">
<property name="currentIndex">
<number>5</number>
<widget class="QFrame" name="">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<widget class="QWidget" name="radioAccess">
<layout class="QVBoxLayout" name="verticalLayout_21">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="userInterface">
<layout class="QVBoxLayout" name="verticalLayout_24">
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="radioSettings">
<layout class="QVBoxLayout" name="verticalLayout_25">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_31"/>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>279</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="radioServer">
<layout class="QVBoxLayout" name="verticalLayout_27">
<layout class="QHBoxLayout" name="horizontalLayout_16">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_35">
<item>
<widget class="QCheckBox" name="serverEnableCheckbox">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>20</height>
</size>
</property>
<property name="text">
<string>Enable</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_24">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_41">
<item>
<widget class="QGroupBox" name="serverSetupGroup">
<property name="title">
<string>Server Setup</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_31">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_40">
<item>
<widget class="QLabel" name="label_38">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>20</height>
</size>
</property>
<property name="text">
<string>Control Port</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="serverControlPortText">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>130</width>
<height>25</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>130</width>
<height>25</height>
</size>
</property>
<property name="inputMask">
<string>99999</string>
</property>
<property name="text">
<string>50001</string>
</property>
<property name="frame">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_37">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>20</height>
</size>
</property>
<property name="text">
<string>Civ Port</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="serverCivPortText">
<property name="minimumSize">
<size>
<width>130</width>
<height>25</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>130</width>
<height>25</height>
</size>
</property>
<property name="inputMask">
<string>99999</string>
</property>
<property name="text">
<string>50002</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_36">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>20</height>
</size>
</property>
<property name="text">
<string>Audio Port</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="serverAudioPortText">
<property name="minimumSize">
<size>
<width>130</width>
<height>25</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>130</width>
<height>25</height>
</size>
</property>
<property name="inputMask">
<string>99999</string>
</property>
<property name="text">
<string>50003</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_25">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="serverAudioHorizLayout">
<item>
<widget class="QLabel" name="label_33">
<property name="text">
<string>RX Audio Input</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_34">
<property name="text">
<string>TX Audio Output</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_44">
<property name="text">
<string>Audio System</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="audioSystemServerCombo">
<item>
<property name="text">
<string>Qt Audio</string>
</property>
</item>
<item>
<property name="text">
<string>PortAudio</string>
</property>
</item>
<item>
<property name="text">
<string>RT Audio</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_23">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_32">
<item>
<widget class="QTableWidget" name="serverUsersTable">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>160</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>750</width>
<height>330</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="lineWidth">
<property name="leftMargin">
<number>1</number>
</property>
<property name="midLineWidth">
<number>0</number>
</property>
<property name="columnCount">
<number>4</number>
</property>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>100</number>
</attribute>
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderShowSortIndicator" stdset="0">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderStretchLastSection">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string>Username</string>
</property>
</column>
<column>
<property name="text">
<string>Password</string>
</property>
</column>
<column>
<property name="text">
<string>Admin</string>
</property>
</column>
<column>
<property name="text">
<string>Delete?</string>
</property>
</column>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_17">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QPushButton" name="serverAddUserBtn">
<property name="text">
<string>Add User</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_33">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_7">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="externalControl">
<layout class="QVBoxLayout" name="verticalLayout_26">
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="cluster">
<property name="enabled">
<bool>true</bool>
</property>
<widget class="QWidget" name="horizontalLayoutWidget_2">
<property name="geometry">
<rect>
<x>10</x>
<y>470</y>
<width>801</width>
<height>24</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_451">
<item>
<widget class="QCheckBox" name="clusterSkimmerSpotsEnable">
<property name="text">
<string>Show Skimmer Spots</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_36">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
<widget class="QWidget" name="experimental">
<layout class="QVBoxLayout" name="verticalLayout_28">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_37">
<item>
<widget class="QLabel" name="label_31">
<property name="text">
<string>This page contains experimental features. Use at your own risk.</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_38">
<item>
<widget class="QPushButton" name="debugBtn">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This button runs debug functions, and is provided as a convenience for programmers. The functions executed are under:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; color:#ffff55;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot; color:#55ff55;&quot;&gt;wfmain&lt;/span&gt;&lt;span style=&quot; color:#aaaaaa;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;on_debugBtn_clicked&lt;/span&gt;&lt;span style=&quot; color:#aaaaaa;&quot;&gt;()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;in wfmain.cpp.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Debug</string>
</property>
<property name="shortcut">
<string>Ctrl+Alt+D</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_21">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_45">
<item>
<spacer name="horizontalSpacer_361">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_6">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>320</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="audioProcessing">
<property name="enabled">
<bool>true</bool>
</property>
</widget>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_16">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
<number>1</number>
</property>
<property name="rightMargin">
<number>0</number>
<number>1</number>
</property>
<item>
<widget class="QPushButton" name="aboutBtn">
@ -2340,20 +1746,11 @@
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1086</width>
<height>20</height>
</rect>
</property>
</widget>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>