Use tabs rather than a table, for satellite device set settings to workaround #840.

This commit is contained in:
Jon Beniston 2021-07-04 11:43:11 +01:00
parent 268318e02c
commit fd5a6b61e8
6 changed files with 119 additions and 252 deletions

View File

@ -44,7 +44,7 @@ Pressing this button displays the SDRangel Control dialog.
This dialog determines the actions the Satellite Tracker will take when AOS or LOS occurs for a satellite. First, select a satellite from the dropdown box. Information about the satellite's transmit and receive modes should appear in the field at the bottom of the dialog, if available in the SatNogs database.
To perform an action on an SDRangel device set on AOS or LOS, press the + button. This will add a row in the table, allowing you to select:
To perform an action on an SDRangel device set on AOS or LOS, press the "Add device set" button. This will add a new, allowing you to select:
* The device set that will be controlled. This will list all currently open device sets. You can also type the name of a new device set.
* The preset to load on AOS. This allows preset device settings (E.g. centre frequency) and demodulators to be opened when the satellite becomes visible.
@ -56,7 +56,7 @@ To perform an action on an SDRangel device set on AOS or LOS, press the + button
* A command or script to execute on AOS.
* A command or script to execute on LOS.
Multiple rows can be added, to allow independent control of multiple device sets. To remove a row, select the row by clicking the row number, then press the - button.
Multiple tabs can be added, to allow independent control of multiple device sets. To remove a tab, click the cross next to the device set name in the tab list.
<h3>6: Show Satellite Selection dialog</h3>

View File

@ -16,7 +16,7 @@
///////////////////////////////////////////////////////////////////////////////////
#include <QDebug>
#include <QHBoxLayout>
#include <QFormLayout>
#include <QSizePolicy>
#include "satellitedevicesettingsgui.h"
@ -28,20 +28,25 @@
#include "plugin/pluginapi.h"
SatelliteDeviceSettingsGUI::SatelliteDeviceSettingsGUI(SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings,
QTableWidget *table)
QTabWidget *tab, QWidget *parent) :
QWidget(parent),
m_tab(tab)
{
m_devSettings = devSettings;
QFormLayout *formLayout = new QFormLayout();
// Device set
m_deviceSetWidget = new QComboBox();
m_deviceSetWidget->setEditable(true);
m_deviceSetWidget->setToolTip(table->horizontalHeaderItem(SAT_DEVICE_COL_DEVICESET)->toolTip());
m_deviceSetItem = new QWidget();
layout(m_deviceSetItem, m_deviceSetWidget);
m_deviceSetWidget->setToolTip("Device set to control");
formLayout->addRow("Device set", m_deviceSetWidget);
addDeviceSets();
int devSetIdx = m_deviceSetWidget->findText(devSettings->m_deviceSet);
if (devSetIdx != -1)
{
m_deviceSetWidget->setCurrentIndex(devSetIdx);
}
else
{
m_deviceSetWidget->addItem(devSettings->m_deviceSet);
@ -52,9 +57,8 @@ SatelliteDeviceSettingsGUI::SatelliteDeviceSettingsGUI(SatelliteTrackerSettings:
m_presetWidget = new QComboBox();
m_presetWidget->setEditable(false);
m_presetWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
m_presetWidget->setToolTip(table->horizontalHeaderItem(SAT_DEVICE_COL_PRESET)->toolTip());
m_presetItem = new QWidget();
layout(m_presetItem, m_presetWidget);
m_presetWidget->setToolTip("Preset to load on AOS");
formLayout->addRow("Preset", m_presetWidget);
addPresets(devSettings->m_deviceSet);
const MainSettings& mainSettings = MainCore::instance()->getSettings();
@ -82,11 +86,10 @@ SatelliteDeviceSettingsGUI::SatelliteDeviceSettingsGUI(SatelliteTrackerSettings:
}
// Doppler
m_dopplerWidget = new QComboBox();
m_dopplerWidget = new QListView();
m_dopplerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
m_dopplerWidget->setToolTip(table->horizontalHeaderItem(SAT_DEVICE_COL_DOPPLER)->toolTip());
m_dopplerItem = new QWidget();
layout(m_dopplerItem, m_dopplerWidget);
m_dopplerWidget->setToolTip("Channels that will have Doppler correction applied");
formLayout->addRow("Doppler correction", m_dopplerWidget);
m_dopplerWidget->setModel(&m_dopplerModel);
addChannels();
@ -96,66 +99,48 @@ SatelliteDeviceSettingsGUI::SatelliteDeviceSettingsGUI(SatelliteTrackerSettings:
// Start on AOS
m_startOnAOSWidget = new QCheckBox();
m_startOnAOSWidget->setChecked(devSettings->m_startOnAOS);
m_startOnAOSWidget->setToolTip(table->horizontalHeaderItem(SAT_DEVICE_COL_START)->toolTip());
m_startOnAOSItem = new QWidget();
layout(m_startOnAOSItem, m_startOnAOSWidget);
m_startOnAOSWidget->setToolTip("Start acquisition on AOS");
formLayout->addRow("Start acquisition on AOS", m_startOnAOSWidget);
// Stop on AOS
m_stopOnLOSWidget = new QCheckBox();
m_stopOnLOSWidget->setChecked(devSettings->m_stopOnLOS);
m_stopOnLOSWidget->setToolTip(table->horizontalHeaderItem(SAT_DEVICE_COL_STOP)->toolTip());
m_stopOnLOSItem = new QWidget();
layout(m_stopOnLOSItem, m_stopOnLOSWidget);
m_stopOnLOSWidget->setToolTip("Stop acquisition on LOS");
formLayout->addRow("Stop acquisition on LOS", m_stopOnLOSWidget);
// Start file sink
m_startStopFileSinkWidget = new QCheckBox();
m_startStopFileSinkWidget->setChecked(devSettings->m_startStopFileSink);
m_startStopFileSinkWidget->setToolTip(table->horizontalHeaderItem(SAT_DEVICE_COL_START_FILE_SINK)->toolTip());
m_startStopFileSinkItem = new QWidget();
layout(m_startStopFileSinkItem, m_startStopFileSinkWidget);
m_startStopFileSinkWidget->setToolTip("Start file sinks recording on AOS and stop recording on LOS");
formLayout->addRow("Start/stop file sinks on AOS/LOS", m_startStopFileSinkWidget);
// Frequency override
m_frequencyItem = new QTableWidgetItem();
m_frequencyItem->setToolTip(table->horizontalHeaderItem(SAT_DEVICE_COL_FREQUENCY)->toolTip());
if (devSettings->m_frequency != 0)
m_frequencyItem->setData(Qt::DisplayRole, QString("%1").arg(devSettings->m_frequency/1000000.0, 0, 'f', 3, QLatin1Char(' ')));
m_frequencyWidget = new QLineEdit();
m_frequencyWidget->setToolTip("Override the center frequency in the preset with a value specified here in MHz.\nThis allows a single preset to be shared between different satellites that differ only in frequency.");
// FIXME: Set mask for numeric or blank
if (devSettings->m_frequency != 0) {
m_frequencyWidget->setText(QString("%1").arg(devSettings->m_frequency/1000000.0, 0, 'f', 3, QLatin1Char(' ')));
}
formLayout->addRow("Override preset frequency (MHz)", m_frequencyWidget);
// AOS command
m_aosCommandItem = new QTableWidgetItem();
m_aosCommandItem->setText(devSettings->m_aosCommand);
m_aosCommandItem->setToolTip(table->horizontalHeaderItem(SAT_DEVICE_COL_AOS_COMMAND)->toolTip());
m_aosCommandWidget = new QLineEdit();
m_aosCommandWidget->setText(devSettings->m_aosCommand);
m_aosCommandWidget->setToolTip("Command to execute on AOS");
formLayout->addRow("AOS command", m_aosCommandWidget);
// LOS command
m_losCommandItem = new QTableWidgetItem();
m_losCommandItem->setText(devSettings->m_losCommand);
m_losCommandItem->setToolTip(table->horizontalHeaderItem(SAT_DEVICE_COL_LOS_COMMAND)->toolTip());
m_losCommandWidget = new QLineEdit();
m_losCommandWidget->setText(devSettings->m_losCommand);
m_losCommandWidget->setToolTip("Command to execute on LOS");
formLayout->addRow("LOS command", m_losCommandWidget);
int row = table->rowCount();
table->setRowCount(row + 1);
table->setCellWidget(row, SAT_DEVICE_COL_DEVICESET, m_deviceSetItem);
table->setCellWidget(row, SAT_DEVICE_COL_PRESET, m_presetItem);
table->setCellWidget(row, SAT_DEVICE_COL_DOPPLER, m_dopplerItem);
table->setCellWidget(row, SAT_DEVICE_COL_START, m_startOnAOSItem);
table->setCellWidget(row, SAT_DEVICE_COL_STOP, m_stopOnLOSItem);
table->setCellWidget(row, SAT_DEVICE_COL_START_FILE_SINK, m_startStopFileSinkItem);
table->setItem(row, SAT_DEVICE_COL_FREQUENCY, m_frequencyItem);
table->setItem(row, SAT_DEVICE_COL_AOS_COMMAND, m_aosCommandItem);
table->setItem(row, SAT_DEVICE_COL_LOS_COMMAND, m_losCommandItem);
table->resizeColumnsToContents();
setLayout(formLayout);
connect(m_deviceSetWidget, SIGNAL(currentTextChanged(const QString &)), this, SLOT(on_m_deviceSetWidget_currentTextChanged(const QString &)));
connect(m_presetWidget, SIGNAL(currentIndexChanged(int)), this, SLOT(on_m_presetWidget_currentIndexChanged(int)));
}
void SatelliteDeviceSettingsGUI::layout(QWidget *parent, QWidget *child)
{
QHBoxLayout* pLayout = new QHBoxLayout(parent);
pLayout->addWidget(child);
pLayout->setAlignment(Qt::AlignCenter);
pLayout->setContentsMargins(0, 0, 0, 0);
parent->setLayout(pLayout);
}
// Add available devicesets to the combobox
void SatelliteDeviceSettingsGUI::addDeviceSets()
{
@ -210,8 +195,9 @@ const Preset* SatelliteDeviceSettingsGUI::getSelectedPreset()
|| ((preset->isSinkPreset() && (m_currentPresets == "T")))
|| ((preset->isMIMOPreset() && (m_currentPresets == "M"))))
{
if (listIdx == presetIdx)
if (listIdx == presetIdx) {
return preset;
}
presetIdx++;
}
}
@ -247,8 +233,12 @@ void SatelliteDeviceSettingsGUI::on_m_deviceSetWidget_currentTextChanged(const Q
{
if (!text.isEmpty())
{
if (text[0] != m_currentPresets)
if (text[0] != m_currentPresets) {
addPresets(text[0]);
}
// Set name of tab to match
int currentTabIndex = m_tab->currentIndex();
m_tab->setTabText(currentTabIndex, text);
}
}
@ -279,13 +269,14 @@ void SatelliteDeviceSettingsGUI::accept()
m_devSettings->m_doppler.clear();
for (int i = 0; i < m_dopplerItems.size(); i++)
{
if (m_dopplerItems[i]->checkState() == Qt::Checked)
if (m_dopplerItems[i]->checkState() == Qt::Checked) {
m_devSettings->m_doppler.append(i);
}
}
m_devSettings->m_startOnAOS = m_startOnAOSWidget->isChecked();
m_devSettings->m_stopOnLOS = m_stopOnLOSWidget->isChecked();
m_devSettings->m_startStopFileSink = m_startStopFileSinkWidget->isChecked();
m_devSettings->m_frequency = (quint64)(m_frequencyItem->data(Qt::DisplayRole).toDouble() * 1000000.0);
m_devSettings->m_aosCommand = m_aosCommandItem->text();
m_devSettings->m_losCommand = m_losCommandItem->text();
m_devSettings->m_frequency = (quint64)(m_frequencyWidget->text().toDouble() * 1000000.0);
m_devSettings->m_aosCommand = m_aosCommandWidget->text();
m_devSettings->m_losCommand = m_losCommandWidget->text();
}

View File

@ -19,7 +19,10 @@
#define INCLUDE_FEATURE_SATELLITEDEVICESETTINGSGUI_H
#include <QComboBox>
#include <QListView>
#include <QLineEdit>
#include <QCheckBox>
#include <QTabWidget>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QStandardItemModel>
@ -30,19 +33,18 @@
class SatelliteRadioControlDialog;
class SatelliteDeviceSettingsGUI : public QObject
class SatelliteDeviceSettingsGUI : public QWidget
{
Q_OBJECT
public:
SatelliteDeviceSettingsGUI(SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings,
QTableWidget *table);
explicit SatelliteDeviceSettingsGUI(SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings,
QTabWidget *tab, QWidget *parent = nullptr);
void accept();
protected:
void layout(QWidget *parent, QWidget *child);
void addDeviceSets();
void addPresets(const QString& deviceSet);
void addChannels();
@ -56,21 +58,16 @@ private slots:
protected:
friend SatelliteRadioControlDialog;
QWidget *m_deviceSetItem;
QTabWidget *m_tab;
QComboBox *m_deviceSetWidget;
QWidget *m_presetItem;
QComboBox *m_presetWidget;
QWidget *m_dopplerItem;
QComboBox *m_dopplerWidget;
QWidget *m_startOnAOSItem;
QListView *m_dopplerWidget;
QCheckBox *m_startOnAOSWidget;
QWidget *m_stopOnLOSItem;
QCheckBox *m_stopOnLOSWidget;
QWidget *m_startStopFileSinkItem;
QCheckBox *m_startStopFileSinkWidget;
QTableWidgetItem *m_frequencyItem;
QTableWidgetItem *m_aosCommandItem;
QTableWidgetItem *m_losCommandItem;
QLineEdit *m_frequencyWidget;
QLineEdit *m_aosCommandWidget;
QLineEdit *m_losCommandWidget;
QChar m_currentPresets;
QStandardItemModel m_dopplerModel;
@ -78,17 +75,6 @@ protected:
SatelliteTrackerSettings::SatelliteDeviceSettings *m_devSettings;
enum SatDeviceCol {
SAT_DEVICE_COL_DEVICESET,
SAT_DEVICE_COL_PRESET,
SAT_DEVICE_COL_DOPPLER,
SAT_DEVICE_COL_START,
SAT_DEVICE_COL_STOP,
SAT_DEVICE_COL_START_FILE_SINK,
SAT_DEVICE_COL_FREQUENCY,
SAT_DEVICE_COL_AOS_COMMAND,
SAT_DEVICE_COL_LOS_COMMAND
};
};
#endif // INCLUDE_FEATURE_SATELLITEDEVICESETTINGSGUI_H

View File

@ -37,13 +37,13 @@ SatelliteRadioControlDialog::SatelliteRadioControlDialog(SatelliteTrackerSetting
{
ui->setupUi(this);
// Must resize before setting m_deviceSettings
resizeTable();
m_deviceSettings = m_settings->m_deviceSettings;
for (int i = 0; i < settings->m_satellites.size(); i++)
for (int i = 0; i < settings->m_satellites.size(); i++) {
ui->satelliteSelect->addItem(settings->m_satellites[i]);
}
connect(ui->tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(on_tabCloseRequested(int)));
}
SatelliteRadioControlDialog::~SatelliteRadioControlDialog()
@ -53,28 +53,22 @@ SatelliteRadioControlDialog::~SatelliteRadioControlDialog()
void SatelliteRadioControlDialog::accept()
{
for (int i = 0; i < m_devSettingsGUIs.size(); i++)
for (int i = 0; i < m_devSettingsGUIs.size(); i++) {
m_devSettingsGUIs[i]->accept();
}
QDialog::accept();
m_settings->m_deviceSettings = m_deviceSettings;
}
void SatelliteRadioControlDialog::resizeTable()
{
on_add_clicked();
ui->table->resizeColumnsToContents();
ui->table->selectRow(0);
on_remove_clicked();
ui->table->selectRow(-1);
}
void SatelliteRadioControlDialog::on_add_clicked()
{
QString name = ui->satelliteSelect->currentText();
if (!name.isEmpty())
{
SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings = new SatelliteTrackerSettings::SatelliteDeviceSettings();
SatelliteDeviceSettingsGUI *devSettingsGUI = new SatelliteDeviceSettingsGUI(devSettings, ui->table);
SatelliteDeviceSettingsGUI *devSettingsGUI = new SatelliteDeviceSettingsGUI(devSettings, ui->tabWidget, ui->tabWidget);
int index = ui->tabWidget->addTab(devSettingsGUI, "R0");
ui->tabWidget->setCurrentIndex(index);
m_devSettingsGUIs.append(devSettingsGUI);
QList<SatelliteTrackerSettings::SatelliteDeviceSettings *> *devSettingsList = m_deviceSettings.value(name);
@ -82,21 +76,15 @@ void SatelliteRadioControlDialog::on_add_clicked()
}
}
// Remove selected row
void SatelliteRadioControlDialog::on_remove_clicked()
// Remove tab
void SatelliteRadioControlDialog::on_tabCloseRequested(int index)
{
// Selection mode is single, so only a single row should be returned
QModelIndexList indexList = ui->table->selectionModel()->selectedRows();
if (!indexList.isEmpty())
{
int row = indexList.at(0).row();
ui->table->removeRow(row);
delete m_devSettingsGUIs.takeAt(row);
ui->tabWidget->removeTab(index);
delete m_devSettingsGUIs.takeAt(index);
QString name = ui->satelliteSelect->currentText();
QList<SatelliteTrackerSettings::SatelliteDeviceSettings *> *devSettingsList = m_deviceSettings.value(name);
delete devSettingsList->takeAt(row);
}
QString name = ui->satelliteSelect->currentText();
QList<SatelliteTrackerSettings::SatelliteDeviceSettings *> *devSettingsList = m_deviceSettings.value(name);
delete devSettingsList->takeAt(index);
}
void SatelliteRadioControlDialog::on_satelliteSelect_currentIndexChanged(int index)
@ -104,23 +92,26 @@ void SatelliteRadioControlDialog::on_satelliteSelect_currentIndexChanged(int ind
(void) index;
// Save details from current GUI elements
for (int i = 0; i < m_devSettingsGUIs.size(); i++)
for (int i = 0; i < m_devSettingsGUIs.size(); i++) {
m_devSettingsGUIs[i]->accept();
}
// Clear GUI
ui->table->setRowCount(0);
ui->tabWidget->clear();
qDeleteAll(m_devSettingsGUIs);
m_devSettingsGUIs.clear();
// Create settings list for newly selected satellite, if one doesn't already exist
QString name = ui->satelliteSelect->currentText();
if (!m_deviceSettings.contains(name))
if (!m_deviceSettings.contains(name)) {
m_deviceSettings.insert(name, new QList<SatelliteTrackerSettings::SatelliteDeviceSettings *>());
}
// Add existing settings to GUI
QList<SatelliteTrackerSettings::SatelliteDeviceSettings *> *devSettingsList = m_deviceSettings.value(name);
for (int i = 0; i < devSettingsList->size(); i++)
{
SatelliteDeviceSettingsGUI *devSettingsGUI = new SatelliteDeviceSettingsGUI(devSettingsList->at(i), ui->table);
SatelliteDeviceSettingsGUI *devSettingsGUI = new SatelliteDeviceSettingsGUI(devSettingsList->at(i), ui->tabWidget, ui->tabWidget);
ui->tabWidget->addTab(devSettingsGUI, devSettingsList->at(i)->m_deviceSet);
m_devSettingsGUIs.append(devSettingsGUI);
}

View File

@ -35,12 +35,11 @@ public:
SatelliteTrackerSettings *m_settings;
private:
void resizeTable();
private slots:
void accept();
void on_add_clicked();
void on_remove_clicked();
void on_tabCloseRequested(int index);
void on_satelliteSelect_currentIndexChanged(int index);
private:

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>955</width>
<height>400</height>
<height>771</height>
</rect>
</property>
<property name="font">
@ -26,98 +26,15 @@
<item>
<widget class="QGroupBox" name="groupBox">
<layout class="QGridLayout" name="gridLayout">
<item row="5" column="0">
<widget class="QTableWidget" name="table">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
<item row="7" column="0">
<widget class="QLabel" name="satelliteModesLabel">
<property name="text">
<string>Satellite modes</string>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<column>
<property name="text">
<string>Device set</string>
</property>
<property name="toolTip">
<string>Device set to control</string>
</property>
</column>
<column>
<property name="text">
<string>Preset to load on AOS</string>
</property>
<property name="toolTip">
<string>Preset to load to device set</string>
</property>
</column>
<column>
<property name="text">
<string>Doppler correction</string>
</property>
<property name="toolTip">
<string>Channel numbers that will have Doppler correction applied</string>
</property>
</column>
<column>
<property name="text">
<string>Start on AOS</string>
</property>
<property name="toolTip">
<string>Start acquisition on AOS</string>
</property>
</column>
<column>
<property name="text">
<string>Stop on LOS</string>
</property>
<property name="toolTip">
<string>Stop acquisition on LOS</string>
</property>
</column>
<column>
<property name="text">
<string>Start/stop file sinks</string>
</property>
<property name="toolTip">
<string>Start file sinks recording on AOS and stop recording on LOS</string>
</property>
</column>
<column>
<property name="text">
<string>Override frequency (MHz)</string>
</property>
<property name="toolTip">
<string>Override the center frequency in the preset with a value specified here in MHz.
This allows a single preset to be shared between different satellites that differ only in frequency.</string>
</property>
</column>
<column>
<property name="text">
<string>AOS command</string>
</property>
<property name="toolTip">
<string>Command to execute on AOS</string>
</property>
</column>
<column>
<property name="text">
<string>LOS command</string>
</property>
<property name="toolTip">
<string>Command to execute on LOS</string>
</property>
</column>
</widget>
</item>
<item row="8" column="0">
<widget class="QTextEdit" name="satelliteModes">
<property name="toolTip">
<string>Satellite modes from SatNOGS</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
<item row="5" column="0">
<layout class="QHBoxLayout" name="buttonsHorizontalLayout"/>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="satHorizontalLayout">
@ -138,6 +55,16 @@ This allows a single preset to be shared between different satellites that diffe
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="add">
<property name="toolTip">
<string>Add device set control settings tab</string>
</property>
<property name="text">
<string>Add device set</string>
</property>
</widget>
</item>
<item>
<spacer name="satHorizontalSpacer">
<property name="orientation">
@ -153,47 +80,23 @@ This allows a single preset to be shared between different satellites that diffe
</item>
</layout>
</item>
<item row="6" column="0">
<layout class="QHBoxLayout" name="buttonsHorizontalLayout">
<item>
<widget class="QPushButton" name="add">
<property name="toolTip">
<string>Add device set control</string>
</property>
<property name="text">
<string>+</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="remove">
<property name="toolTip">
<string>Remove device set control</string>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item>
<spacer name="buttonsHorizontalSpacer">
<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 row="8" column="0">
<widget class="QTextEdit" name="satelliteModes">
<property name="toolTip">
<string>Satellite modes from SatNOGS</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="satelliteModesLabel">
<property name="text">
<string>Satellite modes</string>
<item row="2" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>-1</number>
</property>
<property name="tabsClosable">
<bool>true</bool>
</property>
</widget>
</item>
@ -214,9 +117,6 @@ This allows a single preset to be shared between different satellites that diffe
</widget>
<tabstops>
<tabstop>satelliteSelect</tabstop>
<tabstop>table</tabstop>
<tabstop>add</tabstop>
<tabstop>remove</tabstop>
<tabstop>satelliteModes</tabstop>
</tabstops>
<resources>