Compare commits

...

18 Commits

Author SHA1 Message Date
Jordan Sherer 873929b3f6 Fixed configuration ui for compose textbox 2018-09-12 20:51:46 -04:00
Jordan Sherer e52a62e689 Fixed font picker remember choice 2018-09-12 16:37:58 -04:00
Jordan Sherer bafaf8a5ae Fixed saving of .wav files when it was disabled 2018-09-12 16:08:25 -04:00
Jordan Sherer f4ed9a9eac Fixed windows build 2018-09-12 11:56:38 -04:00
Jordan Sherer 71bf19b21c Bump to 0.6.1 2018-09-12 10:12:54 -04:00
Jordan Sherer 1181e68f27 Fixed highlighting when my call apprears in the band activity 2018-09-12 10:05:35 -04:00
Jordan Sherer 0722bdad52 Added application font name to button 2018-09-12 09:59:13 -04:00
Jordan Sherer 92c88f6c0a Moved notifications to a new configuration tab 2018-09-12 09:55:31 -04:00
Jordan Sherer 67a5f49ba2 Fixed installer icons 2018-09-12 09:29:24 -04:00
Jordan Sherer d715b1d534 Fixed band and call activity sorting when empty values are present 2018-09-12 09:04:22 -04:00
Jordan Sherer 23e378f977 Fixed QSY frequency offset of band and call activity 2018-09-11 23:03:44 -04:00
Jordan Sherer f27d664f61 Updated behavior of allcall to not respond automatically if we have a callsign selected 2018-09-11 19:04:54 -04:00
Jordan Sherer 16c665d199 Newline should remove block from cache 2018-09-11 18:58:33 -04:00
Jordan Sherer 0b11b1b1d3 Changed offset qsy to be a specific action. Clicking the tables no longer change your offset 2018-09-11 18:54:32 -04:00
Jordan Sherer e699d2e081 Fixed buffered messages from ages ago getting sent 2018-09-11 17:41:21 -04:00
Jordan Sherer 9f25842c79 Fixed message reply dialog to be non-modal 2018-09-11 13:35:29 -04:00
Jordan Sherer fddca6522e Added more sane defaults to tx watchdog. Fixed bug in relay disabled when no relay required 2018-09-11 11:20:17 -04:00
Jordan Sherer df0b06ccb7 Allow configuration for rig frequency changes during transmit 2018-09-11 10:52:07 -04:00
34 changed files with 709 additions and 369 deletions
+1
View File
@@ -306,6 +306,7 @@ set (wsjtx_CXXSRCS
varicode.cpp
SelfDestructMessageBox.cpp
messagereplydialog.cpp
keyeater.cpp
APRSISClient.cpp
mainwindow.cpp
Configuration.cpp
+78 -23
View File
@@ -473,7 +473,9 @@ private:
Q_SLOT void on_rxBackgroundButton_clicked();
Q_SLOT void on_rxForegroundButton_clicked();
Q_SLOT void on_rxFontButton_clicked();
Q_SLOT void on_txBackgroundButton_clicked();
Q_SLOT void on_composeBackgroundButton_clicked();
Q_SLOT void on_composeForegroundButton_clicked();
Q_SLOT void on_composeFontButton_clicked();
Q_SLOT void on_txForegroundButton_clicked();
Q_SLOT void on_txFontButton_clicked();
@@ -519,6 +521,9 @@ private:
QFont tx_text_font_;
QFont next_tx_text_font_;
QFont compose_text_font_;
QFont next_compose_text_font_;
bool restart_sound_input_device_;
bool restart_sound_output_device_;
@@ -582,8 +587,10 @@ private:
QColor next_color_rx_background_;
QColor color_rx_foreground_;
QColor next_color_rx_foreground_;
QColor color_tx_background_;
QColor next_color_tx_background_;
QColor color_compose_background_;
QColor next_color_compose_background_;
QColor color_compose_foreground_;
QColor next_color_compose_foreground_;
QColor color_tx_foreground_;
QColor next_color_tx_foreground_;
QColor color_DXCC_;
@@ -597,7 +604,7 @@ private:
double degrade_;
double txDelay_;
bool id_after_73_;
bool tx_QSY_allowed_;
bool tx_qsy_allowed_;
bool spot_to_reporting_networks_;
bool transmit_directed_;
bool autoreply_off_at_startup_;
@@ -695,13 +702,15 @@ QColor Configuration::color_CQ () const {return m_->color_cq_;}
QColor Configuration::color_MyCall () const {return m_->color_mycall_;}
QColor Configuration::color_rx_background () const {return m_->color_rx_background_;}
QColor Configuration::color_rx_foreground () const {return m_->color_rx_foreground_;}
QColor Configuration::color_tx_background () const {return m_->color_tx_background_;}
QColor Configuration::color_tx_foreground () const {return m_->color_tx_foreground_;}
QColor Configuration::color_compose_background () const {return m_->color_compose_background_;}
QColor Configuration::color_compose_foreground () const {return m_->color_compose_foreground_;}
QColor Configuration::color_DXCC () const {return m_->color_DXCC_;}
QColor Configuration::color_NewCall () const {return m_->color_NewCall_;}
QFont Configuration::text_font () const {return m_->font_;}
QFont Configuration::rx_text_font () const {return m_->rx_text_font_;}
QFont Configuration::tx_text_font () const {return m_->tx_text_font_;}
QFont Configuration::compose_text_font () const {return m_->compose_text_font_;}
qint32 Configuration::id_interval () const {return m_->id_interval_;}
qint32 Configuration::ntrials() const {return m_->ntrials_;}
qint32 Configuration::aggressive() const {return m_->aggressive_;}
@@ -709,7 +718,7 @@ double Configuration::degrade() const {return m_->degrade_;}
double Configuration::txDelay() const {return m_->txDelay_;}
qint32 Configuration::RxBandwidth() const {return m_->RxBandwidth_;}
bool Configuration::id_after_73 () const {return m_->id_after_73_;}
bool Configuration::tx_QSY_allowed () const {return m_->tx_QSY_allowed_;}
bool Configuration::tx_qsy_allowed () const {return m_->tx_qsy_allowed_;}
bool Configuration::spot_to_reporting_networks () const
{
// rig must be open and working to spot externally
@@ -1275,9 +1284,9 @@ void Configuration::impl::initialize_models ()
ui_->labMyCall->setStyleSheet(QString("background: %1").arg(color_mycall_.name()));
ui_->rxLabel->setStyleSheet(QString("background: %1").arg(color_rx_background_.name()));
ui_->txLabel->setStyleSheet(QString("background: %1").arg(color_tx_background_.name()));
ui_->rxForegroundLabel->setStyleSheet(QString("background: %1; color: %2").arg(color_rx_background_.name()).arg(color_rx_foreground_.name()));
ui_->txForegroundLabel->setStyleSheet(QString("background: %1; color: %2").arg(color_rx_background_.name()).arg(color_tx_foreground_.name()));
ui_->composeLabel->setStyleSheet(QString("background: %1; color: %2").arg(color_compose_background_.name()).arg(color_compose_foreground_.name()));
ui_->CW_id_interval_spin_box->setValue (id_interval_);
ui_->sbNtrials->setValue (ntrials_);
@@ -1291,7 +1300,7 @@ void Configuration::impl::initialize_models ()
ui_->sound_dm_path_display_label->setText(sound_dm_path_);
ui_->sound_am_path_display_label->setText(sound_am_path_);
ui_->CW_id_after_73_check_box->setChecked (id_after_73_);
ui_->tx_QSY_check_box->setChecked (tx_QSY_allowed_);
ui_->tx_qsy_check_box->setChecked (tx_qsy_allowed_);
ui_->psk_reporter_check_box->setChecked (spot_to_reporting_networks_);
ui_->transmit_directed_check_box->setChecked(transmit_directed_);
ui_->autoreply_off_check_box->setChecked (autoreply_off_at_startup_);
@@ -1413,7 +1422,8 @@ void Configuration::impl::read_settings ()
next_color_mycall_ = color_mycall_ = settings_->value("colorMyCall","#ff6666").toString();
next_color_rx_background_ = color_rx_background_ = settings_->value("color_rx_background","#ffeaa7").toString();
next_color_rx_foreground_ = color_rx_foreground_ = settings_->value("color_rx_foreground","#000000").toString();
next_color_tx_background_ = color_tx_background_ = settings_->value("color_tx_background","#ffffff").toString();
next_color_compose_background_ = color_compose_background_ = settings_->value("color_compose_background","#ffffff").toString();
next_color_compose_foreground_ = color_compose_foreground_ = settings_->value("color_compose_foreground","#000000").toString();
next_color_tx_foreground_ = color_tx_foreground_ = settings_->value("color_tx_foreground","#ff0000").toString();
next_color_DXCC_ = color_DXCC_ = settings_->value("colorDXCC","#ff00ff").toString();
next_color_NewCall_ = color_NewCall_ = settings_->value("colorNewCall","#ffaaff").toString();
@@ -1428,6 +1438,7 @@ void Configuration::impl::read_settings ()
{
next_font_ = font_;
}
ui_->font_push_button->setText(QString("Application Font (%1 %2)").arg(next_font_.family()).arg(next_font_.pointSize()));
if (next_tx_text_font_.fromString (settings_->value ("TXTextFont", QGuiApplication::font ().toString ()).toString ())
&& next_tx_text_font_ != tx_text_font_)
@@ -1455,6 +1466,19 @@ void Configuration::impl::read_settings ()
ui_->rxFontButton->setText(QString("Font (%1 %2)").arg(next_rx_text_font_.family()).arg(next_rx_text_font_.pointSize()));
if (next_compose_text_font_.fromString (settings_->value ("composeTextFont", QGuiApplication::font ().toString ()).toString ())
&& next_compose_text_font_ != compose_text_font_)
{
compose_text_font_ = next_compose_text_font_;
Q_EMIT self_->compose_text_font_changed (compose_text_font_);
}
else
{
next_compose_text_font_ = compose_text_font_;
}
ui_->composeFontButton->setText(QString("Font (%1 %2)").arg(next_compose_text_font_.family()).arg(next_compose_text_font_.pointSize()));
id_interval_ = settings_->value ("IDint", 0).toInt ();
ntrials_ = settings_->value ("nTrials", 6).toInt ();
txDelay_ = settings_->value ("TxDelay",0.2).toDouble();
@@ -1530,7 +1554,7 @@ void Configuration::impl::read_settings ()
monitor_last_used_ = settings_->value ("MonitorLastUsed", false).toBool ();
spot_to_reporting_networks_ = settings_->value ("PSKReporter", true).toBool ();
id_after_73_ = settings_->value ("After73", false).toBool ();
tx_QSY_allowed_ = settings_->value ("TxQSYAllowed", false).toBool ();
tx_qsy_allowed_ = settings_->value ("TxQSYAllowed", false).toBool ();
use_dynamic_info_ = settings_->value ("AutoGrid", false).toBool ();
auto loadedMacros = settings_->value ("Macros", QStringList {"TNX 73 GL"}).toStringList();
@@ -1587,6 +1611,9 @@ void Configuration::impl::read_settings ()
disable_TX_on_73_ = settings_->value ("73TxDisable", false).toBool ();
beacon_ = settings_->value ("TxBeacon", 30).toInt ();
watchdog_ = settings_->value ("TxWatchdog", 0).toInt ();
if(watchdog_){
watchdog_ = qMax(5, watchdog_);
}
TX_messages_ = settings_->value ("Tx2QSO", true).toBool ();
enable_VHF_features_ = settings_->value("VHFUHF",false).toBool ();
decode_at_52s_ = settings_->value("Decode52",false).toBool ();
@@ -1634,7 +1661,8 @@ void Configuration::impl::write_settings ()
settings_->setValue("colorMyCall",color_mycall_);
settings_->setValue("color_rx_background",color_rx_background_);
settings_->setValue("color_rx_foreground",color_rx_foreground_);
settings_->setValue("color_tx_background",color_tx_background_);
settings_->setValue("color_compose_background",color_compose_background_);
settings_->setValue("color_compose_foreground",color_compose_foreground_);
settings_->setValue("color_tx_foreground",color_tx_foreground_);
settings_->setValue("colorDXCC",color_DXCC_);
settings_->setValue("colorNewCall",color_NewCall_);
@@ -1681,7 +1709,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("MonitorLastUsed", monitor_last_used_);
settings_->setValue ("PSKReporter", spot_to_reporting_networks_);
settings_->setValue ("After73", id_after_73_);
settings_->setValue ("TxQSYAllowed", tx_QSY_allowed_);
settings_->setValue ("TxQSYAllowed", tx_qsy_allowed_);
settings_->setValue ("Macros", macros_.stringList ());
settings_->setValue (versionedFrequenciesSettingsKey, QVariant::fromValue (frequencies_.frequency_list ()));
settings_->setValue ("stations", QVariant::fromValue (stations_.station_list ()));
@@ -2014,11 +2042,18 @@ void Configuration::impl::accept ()
Q_EMIT self_->rx_text_font_changed (rx_text_font_);
}
if (next_compose_text_font_ != compose_text_font_)
{
compose_text_font_ = next_compose_text_font_;
Q_EMIT self_->compose_text_font_changed (compose_text_font_);
}
color_cq_ = next_color_cq_;
color_mycall_ = next_color_mycall_;
color_rx_background_ = next_color_rx_background_;
color_rx_foreground_ = next_color_rx_foreground_;
color_tx_background_ = next_color_tx_background_;
color_compose_background_ = next_color_compose_background_;
color_compose_foreground_ = next_color_compose_foreground_;
color_tx_foreground_ = next_color_tx_foreground_;
color_DXCC_ = next_color_DXCC_;
color_NewCall_ = next_color_NewCall_;
@@ -2120,7 +2155,7 @@ void Configuration::impl::accept ()
degrade_ = ui_->sbDegrade->value ();
RxBandwidth_ = ui_->sbBandwidth->value ();
id_after_73_ = ui_->CW_id_after_73_check_box->isChecked ();
tx_QSY_allowed_ = ui_->tx_QSY_check_box->isChecked ();
tx_qsy_allowed_ = ui_->tx_qsy_check_box->isChecked ();
transmit_directed_ = ui_->transmit_directed_check_box->isChecked();
autoreply_off_at_startup_ = ui_->autoreply_off_check_box->isChecked ();
relay_disabled_ = ui_->relay_disabled_check_box->isChecked();
@@ -2248,6 +2283,8 @@ void Configuration::impl::reject ()
void Configuration::impl::on_font_push_button_clicked ()
{
next_font_ = QFontDialog::getFont (0, next_font_, this);
ui_->font_push_button->setText(QString("Application Font (%1 %2)").arg(next_font_.family()).arg(next_font_.pointSize()));
}
QColor getColor(QColor initial, QWidget *parent, QString title){
@@ -2316,7 +2353,7 @@ void Configuration::impl::on_rxForegroundButton_clicked()
void Configuration::impl::on_rxFontButton_clicked ()
{
next_rx_text_font_ = QFontDialog::getFont (0, rx_text_font_ , this
next_rx_text_font_ = QFontDialog::getFont (0, next_rx_text_font_ , this
, tr ("Font Chooser")
#if QT_VERSION >= 0x050201
, 0
@@ -2325,15 +2362,23 @@ void Configuration::impl::on_rxFontButton_clicked ()
ui_->rxFontButton->setText(QString("Font (%1 %2)").arg(next_rx_text_font_.family()).arg(next_rx_text_font_.pointSize()));
}
void Configuration::impl::on_txBackgroundButton_clicked()
void Configuration::impl::on_composeBackgroundButton_clicked()
{
auto new_color = getColor(next_color_tx_background_, this, "Transmitted Messages Background Color");
auto new_color = getColor(next_color_compose_background_, this, "Compose Messages Background Color");
if (new_color.isValid ())
{
next_color_tx_background_ = new_color;
ui_->txLabel->setStyleSheet(QString("background: %1").arg(next_color_tx_background_.name()));
ui_->rxForegroundLabel->setStyleSheet(QString("background: %1; color: %2").arg(next_color_rx_background_.name()).arg(next_color_rx_foreground_.name()));
ui_->txForegroundLabel->setStyleSheet(QString("background: %1; color: %2").arg(next_color_rx_background_.name()).arg(next_color_tx_foreground_.name()));
next_color_compose_background_ = new_color;
ui_->composeLabel->setStyleSheet(QString("background: %1; color: %2").arg(next_color_compose_background_.name()).arg(next_color_compose_foreground_.name()));
}
}
void Configuration::impl::on_composeForegroundButton_clicked()
{
auto new_color = getColor(next_color_compose_foreground_, this, "Compose Messages Foreground Color");
if (new_color.isValid ())
{
next_color_compose_foreground_ = new_color;
ui_->composeLabel->setStyleSheet(QString("background: %1; color: %2").arg(next_color_compose_background_.name()).arg(next_color_compose_foreground_.name()));
}
}
@@ -2343,7 +2388,6 @@ void Configuration::impl::on_txForegroundButton_clicked()
if (new_color.isValid ())
{
next_color_tx_foreground_ = new_color;
ui_->txLabel->setStyleSheet(QString("background: %1").arg(next_color_tx_background_.name()));
ui_->rxForegroundLabel->setStyleSheet(QString("background: %1; color: %2").arg(next_color_rx_background_.name()).arg(next_color_rx_foreground_.name()));
ui_->txForegroundLabel->setStyleSheet(QString("background: %1; color: %2").arg(next_color_rx_background_.name()).arg(next_color_tx_foreground_.name()));
}
@@ -2351,7 +2395,7 @@ void Configuration::impl::on_txForegroundButton_clicked()
void Configuration::impl::on_txFontButton_clicked ()
{
next_tx_text_font_ = QFontDialog::getFont (0, tx_text_font_ , this
next_tx_text_font_ = QFontDialog::getFont (0, next_tx_text_font_ , this
, tr ("Font Chooser")
#if QT_VERSION >= 0x050201
, 0
@@ -2361,6 +2405,17 @@ void Configuration::impl::on_txFontButton_clicked ()
ui_->txFontButton->setText(QString("Font (%1 %2)").arg(next_tx_text_font_.family()).arg(next_tx_text_font_.pointSize()));
}
void Configuration::impl::on_composeFontButton_clicked ()
{
next_compose_text_font_ = QFontDialog::getFont (0, next_compose_text_font_ , this
, tr ("Font Chooser")
#if QT_VERSION >= 0x050201
, 0
#endif
);
ui_->composeFontButton->setText(QString("Font (%1 %2)").arg(next_compose_text_font_.family()).arg(next_compose_text_font_.pointSize()));
}
void Configuration::impl::on_PTT_port_combo_box_activated (int /* index */)
{
set_rig_invariants ();
+5 -2
View File
@@ -106,6 +106,7 @@ public:
QFont text_font () const;
QFont rx_text_font () const;
QFont tx_text_font () const;
QFont compose_text_font () const;
qint32 id_interval () const;
qint32 ntrials() const;
qint32 aggressive() const;
@@ -113,7 +114,7 @@ public:
double degrade() const;
double txDelay() const;
bool id_after_73 () const;
bool tx_QSY_allowed () const;
bool tx_qsy_allowed () const;
bool spot_to_reporting_networks () const;
void set_spot_to_reporting_networks (bool);
bool transmit_directed() const;
@@ -184,8 +185,9 @@ public:
QColor color_MyCall () const;
QColor color_rx_background () const;
QColor color_rx_foreground () const;
QColor color_tx_background () const;
QColor color_tx_foreground () const;
QColor color_compose_background () const;
QColor color_compose_foreground () const;
QColor color_DXCC () const;
QColor color_NewCall () const;
bool pwrBandTxMemory () const;
@@ -281,6 +283,7 @@ public:
Q_SIGNAL void gui_text_font_changed (QFont);
Q_SIGNAL void tx_text_font_changed (QFont);
Q_SIGNAL void rx_text_font_changed (QFont);
Q_SIGNAL void compose_text_font_changed (QFont);
Q_SIGNAL void colors_changed ();
//
+296 -192
View File
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>692</width>
<height>706</height>
<height>735</height>
</rect>
</property>
<property name="windowTitle">
@@ -359,7 +359,7 @@
<item>
<widget class="QCheckBox" name="relay_disabled_check_box">
<property name="text">
<string>Disable message passing (&gt;) when AUTO is enabled</string>
<string>Disable message relay (&gt;) when AUTO is enabled</string>
</property>
</widget>
</item>
@@ -390,13 +390,17 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="tx_QSY_check_box">
<widget class="QCheckBox" name="transmit_directed_check_box">
<property name="text">
<string>Immediately transmit directed responses from the menu</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="tx_qsy_check_box">
<property name="enabled">
<bool>true</bool>
</property>
<property name="visible">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
@@ -405,13 +409,6 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="transmit_directed_check_box">
<property name="text">
<string>Immediately transmit directed responses from the menu</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="single_decode_check_box">
<property name="enabled">
@@ -574,6 +571,9 @@
<property name="prefix">
<string/>
</property>
<property name="singleStep">
<number>5</number>
</property>
<property name="value">
<number>0</number>
</property>
@@ -1797,95 +1797,6 @@ both here.</string>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_13">
<property name="title">
<string>Notification Sounds</string>
</property>
<layout class="QGridLayout" name="gridLayout_18">
<item row="1" column="0">
<widget class="QLabel" name="sound_dm_path_label">
<property name="text">
<string>Directed Message Received:</string>
</property>
<property name="buddy">
<cstring>azel_path_select_push_button</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="sound_dm_path_display_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);</string>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="sound_dm_path_select_push_button">
<property name="text">
<string>Select</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="sound_dm_path_reset_push_button">
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="sound_am_path_label">
<property name="text">
<string>Alert Message Received:</string>
</property>
<property name="buddy">
<cstring>azel_path_select_push_button</cstring>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="sound_am_path_select_push_button">
<property name="text">
<string>Select</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="sound_am_path_reset_push_button">
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="sound_am_path_display_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);</string>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="split_operation_group_box_2">
<property name="toolTip">
@@ -2661,6 +2572,142 @@ Right click for insert and delete options.</string>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Notifications</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_16">
<item>
<widget class="QGroupBox" name="groupBox_13">
<property name="title">
<string>Notification Sounds</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_17">
<item>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QGridLayout" name="gridLayout_19">
<property name="leftMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="sound_dm_path_label">
<property name="text">
<string>Directed Message Received:</string>
</property>
<property name="buddy">
<cstring>azel_path_select_push_button</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="sound_dm_path_display_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);</string>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="sound_dm_path_select_push_button">
<property name="text">
<string>Select</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QPushButton" name="sound_dm_path_reset_push_button">
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="sound_am_path_label">
<property name="text">
<string>Reply Message Received:</string>
</property>
<property name="buddy">
<cstring>azel_path_select_push_button</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="sound_am_path_display_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);</string>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="sound_am_path_select_push_button">
<property name="text">
<string>Select</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="sound_am_path_reset_push_button">
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="label_20">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Notification sounds are played over the default system soundcard. Special care must be taken while using VOX to ensure notification sounds are not transmitted.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_6">
<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="colors_tab">
<attribute name="title">
<string>UI</string>
@@ -2700,7 +2747,7 @@ Right click for insert and delete options.</string>
<item>
<widget class="QGroupBox" name="groupBox_9">
<property name="title">
<string>Band Activity Background</string>
<string>Band Activity Background:</string>
</property>
<layout class="QGridLayout" name="gridLayout_15">
<item row="0" column="0">
@@ -2771,12 +2818,55 @@ Right click for insert and delete options.</string>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_12">
<widget class="QGroupBox" name="groupBox_8">
<property name="title">
<string>Message Background</string>
<string>Messages:</string>
</property>
<layout class="QGridLayout" name="gridLayout_13">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_8">
<item row="6" column="1">
<widget class="QPushButton" name="rxFontButton">
<property name="text">
<string>Font</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="rxBackgroundButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Textbox Color</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="rxForegroundButton">
<property name="text">
<string>Foreground Color</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="rxForegroundLabel">
<property name="styleSheet">
<string notr="true">QLabel{background-color: #ffeaa7}</string>
</property>
<property name="text">
<string>K1ABC</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="rxLabel">
<property name="enabled">
<bool>true</bool>
@@ -2798,24 +2888,98 @@ Right click for insert and delete options.</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="rxBackgroundButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>140</width>
<height>0</height>
</size>
<item row="9" column="0">
<widget class="QLabel" name="txForegroundLabel">
<property name="styleSheet">
<string notr="true">QLabel{background-color: #ffeaa7}</string>
</property>
<property name="text">
<string>Receive Background Color</string>
<string>K1ABC</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="txLabel">
<item row="8" column="0">
<widget class="QLabel" name="label_22">
<property name="text">
<string>Transmitted:</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QPushButton" name="txFontButton">
<property name="text">
<string>Font</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QPushButton" name="txForegroundButton">
<property name="text">
<string>Foreground Color</string>
</property>
</widget>
</item>
<item row="7" column="1">
<spacer name="verticalSpacer_10">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_21">
<property name="text">
<string>Received:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<spacer name="verticalSpacer_9">
<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>
<item>
<widget class="QGroupBox" name="groupBox_14">
<property name="title">
<string>Message Composition:</string>
</property>
<layout class="QGridLayout" name="gridLayout_18">
<item row="0" column="1">
<widget class="QPushButton" name="composeBackgroundButton">
<property name="text">
<string> Textbox Color</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="composeFontButton">
<property name="text">
<string>Font</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="composeLabel">
<property name="enabled">
<bool>true</bool>
</property>
@@ -2836,84 +3000,25 @@ Right click for insert and delete options.</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="txBackgroundButton">
<property name="text">
<string>Transmit Background Color</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_8">
<property name="title">
<string>Messages Received</string>
</property>
<layout class="QGridLayout" name="gridLayout_8">
<item row="3" column="1">
<widget class="QPushButton" name="rxFontButton">
<property name="text">
<string>Font</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="rxForegroundButton">
<widget class="QPushButton" name="composeForegroundButton">
<property name="text">
<string>Foreground Color</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="rxForegroundLabel">
<property name="styleSheet">
<string notr="true">QLabel{background-color: #ffeaa7}</string>
</property>
<property name="text">
<string>K1ABC</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_11">
<property name="title">
<string>Messages Transmitted</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="1" column="1">
<widget class="QPushButton" name="txForegroundButton">
<property name="text">
<string>Foreground Color</string>
<spacer name="verticalSpacer_12">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="txFontButton">
<property name="text">
<string>Font</string>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="txForegroundLabel">
<property name="styleSheet">
<string notr="true">QLabel{background-color: #ffeaa7}</string>
</property>
<property name="text">
<string>K1ABC</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</spacer>
</item>
</layout>
</widget>
@@ -3241,7 +3346,6 @@ soundcard changes</string>
<tabstop>tx_watchdog_spin_box</tabstop>
<tabstop>CW_id_after_73_check_box</tabstop>
<tabstop>enable_VHF_features_check_box</tabstop>
<tabstop>tx_QSY_check_box</tabstop>
<tabstop>single_decode_check_box</tabstop>
<tabstop>decode_at_52s_check_box</tabstop>
<tabstop>CW_id_interval_spin_box</tabstop>
@@ -3372,11 +3476,11 @@ soundcard changes</string>
</connection>
</connections>
<buttongroups>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
</buttongroups>
+1 -1
View File
@@ -1 +1 @@
IDI_ICON1 ICON DISCARDABLE "../icons/windows-icons/wsjtx.ico"
IDI_ICON1 ICON DISCARDABLE "../icons/windows-icons/ft8call.ico"
+1 -1
View File
@@ -1 +1 @@
IDI_ICON1 ICON DISCARDABLE "../icons/windows-icons/wsjtx.ico"
IDI_ICON1 ICON DISCARDABLE "../icons/windows-icons/ft8call.ico"
+1 -1
View File
@@ -1,6 +1,6 @@
# Version number components
set (WSJTX_VERSION_MAJOR 0)
set (WSJTX_VERSION_MINOR 6)
set (WSJTX_VERSION_PATCH 0)
set (WSJTX_VERSION_PATCH 1)
set (WSJTX_RC 0) # release candidate number, comment out or zero for development versions
set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build
@@ -15,9 +15,6 @@
viewBox="0 0 714.37498 270.93334"
version="1.1"
id="svg16"
inkscape:export-filename="/home/jordan/bitmap.png"
inkscape:export-xdpi="300.06662"
inkscape:export-ydpi="300.06662"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="icon_1024.svg">
<defs

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

+3 -2
View File
@@ -29,8 +29,9 @@ convert '/tmp/image-%d.png[0-1]' -background transparent \
rm /tmp/image-0.png /tmp/image-1.png
identify -format '%f %p/%n %m %C/%Q %r %G %A %z\n' ../icons/windows-icons/ft8call.ico
#
inkscape -z -e /dev/stdout -w 150 -h 57 -b white installer_logo.svg | tail -n +4 | \
convert png:- -resize 150x57 +matte BMP3:../icons/windows-icons/installer_logo.bmp
#inkscape -z -e /dev/stdout -w 150 -h 57 -b white installer_logo.svg | tail -n +4 | \
# convert png:- -resize 150x57 +matte BMP3:../icons/windows-icons/installer_logo.bmp
convert png:installer_logo.svg.png -resize 150x57 +matte BMP3:../icons/windows-icons/installer_logo.bmp
identify -format '%f %p/%n %m %C/%Q %r %G %A %z\n' ../icons/windows-icons/installer_logo.bmp
#
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 KiB

+29
View File
@@ -0,0 +1,29 @@
#include "keyeater.h"
bool EscapeKeyPressEater::eventFilter(QObject *obj, QEvent *event){
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_Escape){
return true;
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}
bool EnterKeyPressEater::eventFilter(QObject *obj, QEvent *event){
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return){
bool processed = false;
emit this->enterKeyPressed(obj, keyEvent, &processed);
if(processed){
return true;
}
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}
+33
View File
@@ -0,0 +1,33 @@
#ifndef KEYEATER_H
#define KEYEATER_H
#include <QObject>
#include <QKeyEvent>
class EscapeKeyPressEater : public QObject
{
Q_OBJECT
public:
EscapeKeyPressEater(){}
virtual ~EscapeKeyPressEater(){}
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
class EnterKeyPressEater : public QObject
{
Q_OBJECT
public:
EnterKeyPressEater(){}
virtual ~EnterKeyPressEater(){}
protected:
bool eventFilter(QObject *obj, QEvent *event);
public:
Q_SIGNAL void enterKeyPressed(QObject *obj, QKeyEvent *evt, bool *pProcessed);
};
#endif // KEYEATER_H
+232 -93
View File
@@ -170,7 +170,7 @@ QVector<QColor> g_ColorTbl;
namespace
{
Radio::Frequency constexpr default_frequency {14078500};
Radio::Frequency constexpr default_frequency {14078000};
QRegExp message_alphabet {"[^\\x00-\\x1F]*"}; // base alphabet supported by FT8CALL
@@ -304,10 +304,46 @@ namespace
edit->updateGeometry();
}
void setTextEditBackground(QTextEdit *edit, QColor color){
edit->setStyleSheet(QString("QTextEdit{ background: %1 }").arg(color.name()));
void setTextEditColors(QTextEdit *edit, QColor fg, QColor bg){
edit->setStyleSheet(QString("QTextEdit { color:%1; background: %2 }").arg(fg.name()).arg(bg.name()));
QTimer::singleShot(10, nullptr, [edit, fg, bg](){
QPalette p = edit->palette();
p.setColor(QPalette::Base, bg);
p.setColor(QPalette::Active, QPalette::Base, bg);
p.setColor(QPalette::Disabled, QPalette::Base, bg);
p.setColor(QPalette::Inactive, QPalette::Base, bg);
p.setColor(QPalette::Text, fg);
p.setColor(QPalette::Active, QPalette::Text, fg);
p.setColor(QPalette::Disabled, QPalette::Text, fg);
p.setColor(QPalette::Inactive, QPalette::Text, fg);
edit->setBackgroundRole(QPalette::Base);
edit->setForegroundRole(QPalette::Text);
edit->setPalette(p);
edit->updateGeometry();
edit->update();
});
}
/*
void setTextEditForeground(QTextEdit *edit, QColor color){
QTimer::singleShot(20, nullptr, [edit, color](){
QPalette p = edit->palette();
p.setColor(QPalette::Text, color);
p.setColor(QPalette::Active, QPalette::Text, color);
p.setColor(QPalette::Disabled, QPalette::Text, color);
p.setColor(QPalette::Inactive, QPalette::Text, color);
edit->setPalette(p);
edit->updateGeometry();
edit->update();
});
}
*/
void highlightBlock(QTextBlock block, QFont font, QColor foreground, QColor background){
QTextCursor cursor(block);
@@ -695,12 +731,12 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
connect (&m_config, &Configuration::rx_text_font_changed, [this] (QFont const&) {
setTextEditFont(ui->textEditRX, m_config.rx_text_font());
});
connect (&m_config, &Configuration::tx_text_font_changed, [this] (QFont const&) {
setTextEditFont(ui->extFreeTextMsgEdit, m_config.tx_text_font());
connect (&m_config, &Configuration::compose_text_font_changed, [this] (QFont const&) {
setTextEditFont(ui->extFreeTextMsgEdit, m_config.compose_text_font());
});
connect (&m_config, &Configuration::colors_changed, [this](){
setTextEditBackground(ui->textEditRX, m_config.color_rx_background());
setTextEditBackground(ui->extFreeTextMsgEdit, m_config.color_tx_background());
setTextEditColors(ui->textEditRX, m_config.color_rx_foreground(), m_config.color_rx_background());
setTextEditColors(ui->extFreeTextMsgEdit, m_config.color_compose_foreground(), m_config.color_compose_background());
// rehighlight
auto d = ui->textEditRX->document();
@@ -1219,6 +1255,14 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
selectedOffset = selectedItems.first()->text().toInt();
}
if(selectedOffset != -1){
auto qsyAction = menu->addAction(QString("Jump to %1Hz").arg(selectedOffset));
connect(qsyAction, &QAction::triggered, this, [this, selectedOffset](){
setFreqOffsetForRestore(selectedOffset, true);
});
menu->addSeparator();
}
menu->addAction(logAction);
logAction->setDisabled(missingCallsign);
@@ -1231,9 +1275,9 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
relayAction->setDisabled(missingCallsign);
menu->addActions({ relayAction });
auto deselect = menu->addAction("Deselect");
deselect->setDisabled(missingCallsign);
connect(deselect, &QAction::triggered, this, [this](){
auto deselectAction = menu->addAction(QString("Deselect %1").arg(selectedCall));
deselectAction->setDisabled(missingCallsign);
connect(deselectAction, &QAction::triggered, this, [this](){
ui->tableWidgetRXAll->clearSelection();
ui->tableWidgetCalls->clearSelection();
});
@@ -1281,8 +1325,16 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
QString selectedCall = callsignSelected();
bool isAllCall = isAllCallIncluded(selectedCall);
bool missingCallsign = selectedCall.isEmpty();
if(!missingCallsign && m_callActivity.contains(selectedCall)){
setFreqOffsetForRestore(m_callActivity[selectedCall].freq, true);
if(!missingCallsign && !isAllCall){
int selectedOffset = m_callActivity[selectedCall].freq;
if(selectedOffset != -1){
auto qsyAction = menu->addAction(QString("Jump to %1Hz...").arg(selectedOffset));
connect(qsyAction, &QAction::triggered, this, [this, selectedOffset](){
setFreqOffsetForRestore(selectedOffset, true);
});
menu->addSeparator();
}
}
menu->addAction(logAction);
@@ -1297,7 +1349,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
relayAction->setDisabled(missingCallsign || isAllCall);
menu->addActions({ relayAction });
auto deselect = menu->addAction("Deselect");
auto deselect = menu->addAction(QString("Deselect %1").arg(selectedCall));
deselect->setDisabled(missingCallsign);
connect(deselect, &QAction::triggered, this, [this](){
ui->tableWidgetRXAll->clearSelection();
@@ -1343,6 +1395,17 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
displayActivity(true);
/*
QTimer::singleShot(1000, this, [this](){
QPalette p;
p.setBrush(QPalette::Text, QColor(Qt::red));
p.setColor(QPalette::Text, QColor(Qt::red));
ui->extFreeTextMsgEdit->setPalette(p);
ui->extFreeTextMsgEdit->updateGeometry();
ui->extFreeTextMsgEdit->update();
});
*/
QTimer::singleShot(0, this, &MainWindow::initializeDummyData);
// this must be the last statement of constructor
@@ -1400,12 +1463,29 @@ void MainWindow::initializeDummyData(){
foreach(auto call, calls){
CallDetail cd = {};
cd.call = call;
cd.snr = i++;
cd.freq = 500 + 100*i;
cd.snr = i == 3 ? -100 : i;
cd.utcTimestamp = dt;
cd.grid = i == 5 ? "J042" : i == 6 ? "FN42" : "";
logCallActivity(cd, false);
ActivityDetail ad = {};
ad.snr = i == 3 ? -100 : i;
ad.freq = 500 + 100*i;
ad.text = QString("%1: %2 TEST").arg(call).arg(m_config.my_callsign());
ad.utcTimestamp = dt;
m_bandActivity[500+100*i] = { ad };
i++;
}
displayActivity(true);
QTimer::singleShot(10000, this, [this](){
tx_watchdog(true);
});
}
void MainWindow::initialize_fonts ()
@@ -1697,9 +1777,12 @@ void MainWindow::readSettings()
m_modeTx=m_settings->value("ModeTx","JT9").toString();
if(m_modeTx.mid(0,3)=="JT9") ui->pbTxMode->setText("Tx JT9 @");
if(m_modeTx=="JT65") ui->pbTxMode->setText("Tx JT65 #");
ui->actionNone->setChecked(m_settings->value("SaveNone",true).toBool());
ui->actionSave_decoded->setChecked(m_settings->value("SaveDecoded",false).toBool());
ui->actionSave_all->setChecked(m_settings->value("SaveAll",false).toBool());
// these save settings should never be enabled unless specifically called out by the user for every session.
ui->actionNone->setChecked(true);
ui->actionSave_decoded->setChecked(false);
ui->actionSave_all->setChecked(false);
ui->RxFreqSpinBox->setValue(0); // ensure a change is signaled
ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq",1500).toInt());
m_nSubMode=m_settings->value("SubMode",0).toInt();
@@ -1753,7 +1836,10 @@ void MainWindow::readSettings()
//ui->bandHorizontalWidget->setGeometry( m_settings->value("PanelWaterfallGeometry", ui->bandHorizontalWidget->geometry()).toRect());
//qDebug() << m_settings->value("PanelTopGeometry") << ui->extFreeTextMsg;
ui->textEditRX->setStyleSheet(QString("QTextEdit { background: %1 }").arg(m_config.color_rx_background().name()));
setTextEditColors(ui->textEditRX, m_config.color_rx_foreground(), m_config.color_rx_background());
setTextEditColors(ui->extFreeTextMsgEdit, m_config.color_compose_foreground(), m_config.color_compose_background());
{
auto const& coeffs = m_settings->value ("PhaseEqualizationCoefficients"
@@ -1968,11 +2054,15 @@ void MainWindow::dataSink(qint64 frames)
}
m_fileToSave.clear ();
// the following is potential a threading hazard - not a good
// idea to pass pointer to be processed in another thread
m_saveWAVWatcher.setFuture (QtConcurrent::run (std::bind (&MainWindow::save_wave_file,
this, m_fnameWE, &dec_data.d2[0], m_TRperiod, m_config.my_callsign(),
m_config.my_grid(), m_mode, m_nSubMode, m_freqNominal, m_hisCall, m_hisGrid)));
if(m_saveAll or m_bAltV or (m_bDecoded and m_saveDecoded) or (m_mode!="MSK144" and m_mode!="FT8")) {
m_bAltV=false;
// the following is potential a threading hazard - not a good
// idea to pass pointer to be processed in another thread
m_saveWAVWatcher.setFuture (QtConcurrent::run (std::bind (&MainWindow::save_wave_file,
this, m_fnameWE, &dec_data.d2[0], m_TRperiod, m_config.my_callsign(),
m_config.my_grid(), m_mode, m_nSubMode, m_freqNominal, m_hisCall, m_hisGrid)));
}
if (m_mode=="WSPR") {
QString c2name_string {m_fnameWE + ".c2"};
int len1=c2name_string.length();
@@ -2063,6 +2153,7 @@ QString MainWindow::save_wave_file (QString const& name, short const * data, int
{{{'I','C','M','T'}}, comment.toLocal8Bit ()},
};
auto file_name = name + ".wav";
qDebug() << "saving" << file_name;
BWFFile wav {format, file_name, list_info};
if (!wav.open (BWFFile::WriteOnly)
|| 0 > wav.write (reinterpret_cast<char const *> (data)
@@ -2175,7 +2266,7 @@ void MainWindow::fastSink(qint64 frames)
auto const& period_start = now.addSecs (-n);
m_fnameWE = m_config.save_directory ().absoluteFilePath (period_start.toString ("yyMMdd_hhmmss"));
m_fileToSave.clear ();
if(m_saveAll or m_bAltV or (m_bDecoded and m_saveDecoded) or (m_mode!="MSK144")) {
if(m_saveAll or m_bAltV or (m_bDecoded and m_saveDecoded) or (m_mode!="MSK144" and m_mode!="FT8")) {
m_bAltV=false;
// the following is potential a threading hazard - not a good
// idea to pass pointer to be processed in another thread
@@ -3086,7 +3177,7 @@ void MainWindow::diskDat() //diskDat()
void MainWindow::on_actionDelete_all_wav_files_in_SaveDir_triggered()
{
auto button = MessageBox::query_message (this, tr ("Confirm Delete"),
tr ("Are you sure you want to delete all *.wav and *.c2 files in \"%1\"?")
tr ("Are you sure you want to delete all *.wav files in \"%1\"?")
.arg (QDir::toNativeSeparators (m_config.save_directory ().absolutePath ())));
if (MessageBox::Yes == button) {
Q_FOREACH (auto const& file
@@ -4682,6 +4773,10 @@ void MainWindow::guiUpdate()
void MainWindow::startTx()
{
if(m_tx_watchdog){
return;
}
if(!prepareNextMessageFrame()){
return;
}
@@ -4755,7 +4850,7 @@ void MainWindow::stopTx()
tx_status_label.setText("");
}
if(prepareNextMessageFrame()){
if(!m_tx_watchdog && prepareNextMessageFrame()){
continueTx();
} else {
// TODO: jsherer - split this up...
@@ -5914,7 +6009,7 @@ void MainWindow::displayTextForFreq(QString text, int freq, QDateTime date, bool
}
if(isNewLine){
//m_rxFrameBlockNumbers.remove(freq);
m_rxFrameBlockNumbers.remove(freq);
m_rxFrameBlockNumbers.remove(lowFreq);
m_rxFrameBlockNumbers.remove(highFreq);
block = -1;
@@ -6171,7 +6266,7 @@ void MainWindow::on_extFreeTextMsgEdit_currentTextChanged (QString const& text)
QTextCursor c = ui->extFreeTextMsgEdit->textCursor();
c.setPosition(pos < maxpos ? pos : maxpos, QTextCursor::MoveAnchor);
highlightBlock(c.block(), m_config.tx_text_font(), QColor(Qt::black), QColor(Qt::transparent));
highlightBlock(c.block(), m_config.compose_text_font(), m_config.color_compose_foreground(), QColor(Qt::transparent));
ui->extFreeTextMsgEdit->setTextCursor(c);
}
@@ -7908,12 +8003,7 @@ void MainWindow::on_deselectButton_pressed(){
clearCallsignSelected();
}
void MainWindow::on_tableWidgetRXAll_cellClicked(int row, int /*col*/){
auto item = ui->tableWidgetRXAll->item(row, 0);
int offset = item->text().toInt();
setFreqOffsetForRestore(offset, false);
void MainWindow::on_tableWidgetRXAll_cellClicked(int /*row*/, int /*col*/){
ui->tableWidgetCalls->selectionModel()->select(
ui->tableWidgetCalls->selectionModel()->selection(),
QItemSelectionModel::Deselect);
@@ -7966,15 +8056,6 @@ void MainWindow::on_tableWidgetRXAll_selectionChanged(const QItemSelection &/*se
}
void MainWindow::on_tableWidgetCalls_cellClicked(int /*row*/, int /*col*/){
auto call = callsignSelected();
if(!m_callActivity.contains(call)){
return;
}
auto d = m_callActivity[call];
setFreqOffsetForRestore(d.freq, false);
ui->tableWidgetRXAll->selectionModel()->select(
ui->tableWidgetRXAll->selectionModel()->selection(),
QItemSelectionModel::Deselect);
@@ -7984,6 +8065,7 @@ void MainWindow::on_tableWidgetCalls_cellDoubleClicked(int row, int col){
on_tableWidgetCalls_cellClicked(row, col);
auto call = callsignSelected();
addMessageText(call);
}
@@ -8137,7 +8219,7 @@ void MainWindow::on_pbTxMode_clicked()
void MainWindow::setXIT(int n, Frequency base)
{
if (m_transmitting && !m_config.tx_QSY_allowed ()) return;
if (m_transmitting && !m_config.tx_qsy_allowed ()) return;
// If "CQ nnn ..." feature is active, set the proper Tx frequency
if(m_config.split_mode () && ui->cbCQTx->isEnabled () && ui->cbCQTx->isVisible () &&
ui->cbCQTx->isChecked())
@@ -8174,7 +8256,26 @@ void MainWindow::setXIT(int n, Frequency base)
void MainWindow::qsy(int hzDelta){
setRig(m_freqNominal + hzDelta);
setFreqOffsetForRestore(1500, false);
setFreqOffsetForRestore(m_wideGraph->centerFreq(), false);
// adjust band activity frequencies
QMap<int, QList<ActivityDetail>> newActivity;
foreach(auto offset, m_bandActivity.keys()){
if(m_bandActivity[offset].isEmpty()){
continue;
}
newActivity[offset - hzDelta] = m_bandActivity[offset];
newActivity[offset - hzDelta].last().freq -= hzDelta;
}
m_bandActivity.clear();
m_bandActivity.unite(newActivity);
// adjust call activity frequencies
foreach(auto call, m_callActivity.keys()){
m_callActivity[call].freq -= hzDelta;
}
displayActivity(true);
}
void MainWindow::setFreqOffsetForRestore(int freq, bool shouldRestore){
@@ -8199,8 +8300,8 @@ bool MainWindow::tryRestoreFreqOffset(){
void MainWindow::setFreq4(int rxFreq, int txFreq)
{
// don't allow QSY if we've already queued a transmission
if(isMessageQueuedForTransmit()){
// don't allow QSY if we've already queued a transmission, unless we have that functionality enabled.
if(isMessageQueuedForTransmit() && !m_config.tx_qsy_allowed()){
return;
}
@@ -8600,7 +8701,7 @@ void MainWindow::transmitDisplay (bool transmitting)
m_btxok=true;
}
auto QSY_allowed = !transmitting or m_config.tx_QSY_allowed () or
auto QSY_allowed = !transmitting or m_config.tx_qsy_allowed () or
!m_config.split_mode ();
if (ui->cbHoldTxFreq->isChecked ()) {
ui->RxFreqSpinBox->setEnabled (QSY_allowed);
@@ -9243,6 +9344,23 @@ void MainWindow::processBufferedActivity() {
foreach(auto freq, m_messageBuffer.keys()) {
auto buffer = m_messageBuffer[freq];
// check to make sure we empty old buffers by getting the latest timestamp
// and checking to see if it's older than one minute.
auto dt = QDateTime::currentDateTimeUtc().addDays(-1);
if(buffer.cmd.utcTimestamp.isValid()){
dt = qMax(dt, buffer.cmd.utcTimestamp);
}
if(!buffer.compound.isEmpty()){
dt = qMax(dt, buffer.compound.last().utcTimestamp);
}
if(!buffer.msgs.isEmpty()){
dt = qMax(dt, buffer.msgs.last().utcTimestamp);
}
if(dt.secsTo(QDateTime::currentDateTimeUtc()) > 60){
m_messageBuffer.remove(freq);
continue;
}
if (buffer.msgs.isEmpty()) {
continue;
}
@@ -9432,6 +9550,13 @@ void MainWindow::processCommandActivity() {
// QUERIED SNR
if (d.cmd == "?") {
// do not respond to allcall ? if:
// 1. we recently responded to one
// 2. or, we are in a directed qso...(i.e., we have a callsign selected)
if(!callsignSelected().isEmpty()){
continue;
}
reply = QString("%1 SNR %2").arg(d.from).arg(Varicode::formatSNR(d.snr));
}
@@ -9506,7 +9631,7 @@ void MainWindow::processCommandActivity() {
#endif
// PROCESS RELAY
else if (d.cmd == ">" && !isAllCall && !m_config.relay_off()) {
else if (d.cmd == ">" && !isAllCall) {
// 1. see if there are any more hops to process
// 2. if so, forward
@@ -9517,8 +9642,8 @@ void MainWindow::processCommandActivity() {
auto text = d.text;
auto match = re.match(text);
// if the text starts with a callsign, relay.
if(match.hasMatch()){
// if the text starts with a callsign, and relay is not disabled, then relay.
if(match.hasMatch() && !m_config.relay_off()){
// replace freetext with relayed free text
if(match.captured("type") != ">"){
text = text.replace(match.capturedStart("type"), match.capturedLength("type"), ">");
@@ -9659,7 +9784,7 @@ void MainWindow::processCommandActivity() {
// unless, this is an allcall, to which we should be responding on a clear frequency offset
// we always want to make sure that the directed cache has been updated at this point so we have the
// most information available to make a frequency selection.
enqueueMessage(PriorityNormal, reply, isAllCall ? -1 : d.freq, nullptr);
enqueueMessage(PriorityNormal, reply, -1, nullptr);
}
}
@@ -9700,7 +9825,7 @@ void MainWindow::processAlertReplyForCommand(CommandDetail d, QString from, QStr
}
if (btn == ab){
enqueueMessage(PriorityHigh, QString("%1%2ACK").arg(from).arg(cmd), d.freq, nullptr);
enqueueMessage(PriorityHigh, QString("%1%2ACK").arg(from).arg(cmd), -1, nullptr);
}
if(btn == rb){
@@ -9709,7 +9834,7 @@ void MainWindow::processAlertReplyForCommand(CommandDetail d, QString from, QStr
diag->setLabel(QString("Message to send to %1:").arg(fromLabel));
connect(diag, &MessageReplyDialog::accepted, this, [this, diag, from, cmd, d](){
enqueueMessage(PriorityHigh, QString("%1%2%3").arg(from).arg(cmd).arg(diag->textValue()), d.freq, nullptr);
enqueueMessage(PriorityHigh, QString("%1%2%3").arg(from).arg(cmd).arg(diag->textValue()), -1, nullptr);
});
diag->show();
@@ -9721,6 +9846,7 @@ void MainWindow::processAlertReplyForCommand(CommandDetail d, QString from, QStr
QSound::play(wav);
}
msgBox->setModal(false);
msgBox->show();
}
@@ -9770,12 +9896,8 @@ void MainWindow::processTxQueue(){
f = currentFreqOffset();
}
if(!isFreqOffsetFree(f, 60)){
f = findFreeFreqOffset(500, 2000, 60);
}
// we need a valid frequency...
if(f == 0){
if(f <= 0){
return;
}
@@ -9800,7 +9922,7 @@ void MainWindow::processTxQueue(){
// add the message to the outgoing message text box
addMessageText(message.message, true);
// check to see if we have autoreply enabled...(or if this is a beacon and the beacon button is enabled)
// check to see if this is a high priority message, or if we have autoreply enabled, or if this is a beacon and the beacon button is enabled
if(message.priority >= PriorityHigh ||
(ui->autoReplyButton->isChecked()) ||
(ui->beaconButton->isChecked() && message.message.contains("BEACON"))
@@ -9852,6 +9974,13 @@ void MainWindow::displayBandActivity() {
// Sort!
QList < int > keys = m_bandActivity.keys();
auto sortBy = getSortBy("bandActivity", "offset");
bool reverse = false;
if(sortBy.startsWith("-")){
sortBy = sortBy.mid(1);
reverse = true;
}
auto compareTimestamp = [this](const int left, int right) {
auto leftItems = m_bandActivity[left];
auto rightItems = m_bandActivity[right];
@@ -9870,7 +9999,7 @@ void MainWindow::displayBandActivity() {
return leftLast.utcTimestamp < rightLast.utcTimestamp;
};
auto compareSNR = [this](const int left, int right) {
auto compareSNR = [this, reverse](const int left, int right) {
auto leftItems = m_bandActivity[left];
auto rightItems = m_bandActivity[right];
@@ -9882,19 +10011,19 @@ void MainWindow::displayBandActivity() {
return true;
}
auto leftLast = leftItems.last();
auto rightLast = rightItems.last();
auto leftActivity = leftItems.last();
auto rightActivity = rightItems.last();
return leftLast.snr < rightLast.snr;
if(leftActivity.snr < -60 || leftActivity.snr > 60) {
leftActivity.snr *= reverse ? 1 : -1;
}
if(rightActivity.snr < -60 || rightActivity.snr > 60) {
rightActivity.snr *= reverse ? 1 : -1;
}
return leftActivity.snr < rightActivity.snr;
};
auto sortBy = getSortBy("bandActivity", "offset");
bool reverse = false;
if(sortBy.startsWith("-")){
sortBy = sortBy.mid(1);
reverse = true;
}
// compare offset
qStableSort(keys.begin(), keys.end());
@@ -9983,7 +10112,11 @@ void MainWindow::displayBandActivity() {
}
bool isDirectedAllCall = false;
if (isDirectedOffset(offset, &isDirectedAllCall) && !isDirectedAllCall) {
// TODO: jsherer - there's a potential here for a previous allcall o poison the highlight.
if (
(isDirectedOffset(offset, &isDirectedAllCall) && !isDirectedAllCall) ||
(text.last().contains(Radio::base_callsign(m_config.my_callsign())))
) {
offsetItem->setBackground(QBrush(m_config.color_MyCall()));
ageItem->setBackground(QBrush(m_config.color_MyCall()));
snrItem->setBackground(QBrush(m_config.color_MyCall()));
@@ -10034,9 +10167,17 @@ void MainWindow::displayCallActivity() {
ui->tableWidgetCalls->item(0, 0)->setSelected(true);
}
// Build the table
QList < QString > keys = m_callActivity.keys();
auto sortBy = getSortBy("callActivity", "callsign");
bool reverse = false;
if(sortBy.startsWith("-")){
sortBy = sortBy.mid(1);
reverse = true;
}
auto compareOffset = [this](const QString left, QString right) {
auto leftActivity = m_callActivity[left];
auto rightActivity = m_callActivity[right];
@@ -10044,23 +10185,19 @@ void MainWindow::displayCallActivity() {
return leftActivity.freq < rightActivity.freq;
};
auto compareDistance = [this](const QString left, QString right) {
auto compareDistance = [this, reverse](const QString left, QString right) {
auto leftActivity = m_callActivity[left];
auto rightActivity = m_callActivity[right];
if(leftActivity.grid.isEmpty()){
return false;
int leftDistance = reverse ? -100000 : 100000;
int rightDistance = reverse ? -100000 : 100000;
if(!leftActivity.grid.isEmpty()){
calculateDistance(leftActivity.grid, &leftDistance);
}
if(rightActivity.grid.isEmpty()){
return true;
if(!rightActivity.grid.isEmpty()){
calculateDistance(rightActivity.grid, &rightDistance);
}
int leftDistance = 0;
int rightDistance = 0;
calculateDistance(leftActivity.grid, &leftDistance);
calculateDistance(rightActivity.grid, &rightDistance);
return leftDistance < rightDistance;
};
@@ -10071,19 +10208,20 @@ void MainWindow::displayCallActivity() {
return leftActivity.utcTimestamp < rightActivity.utcTimestamp;
};
auto compareSNR = [this](const QString left, QString right) {
auto compareSNR = [this, reverse](const QString left, QString right) {
auto leftActivity = m_callActivity[left];
auto rightActivity = m_callActivity[right];
if(leftActivity.snr < -60 || leftActivity.snr > 60) {
leftActivity.snr *= reverse ? 1 : -1;
}
if(rightActivity.snr < -60 || rightActivity.snr > 60) {
rightActivity.snr *= reverse ? 1 : -1;
}
return leftActivity.snr < rightActivity.snr;
};
auto sortBy = getSortBy("callActivity", "callsign");
bool reverse = false;
if(sortBy.startsWith("-")){
sortBy = sortBy.mid(1);
reverse = true;
}
// compare callsign
qStableSort(keys.begin(), keys.end());
@@ -10616,9 +10754,9 @@ void MainWindow::astroUpdate ()
m_config.my_grid(), m_hisGrid,
m_freqNominal,
"Echo" == m_mode, m_transmitting,
!m_config.tx_QSY_allowed (), m_TRperiod);
!m_config.tx_qsy_allowed (), m_TRperiod);
// no Doppler correction in Tx if rig can't do it
if (m_transmitting && !m_config.tx_QSY_allowed ()) return;
if (m_transmitting && !m_config.tx_qsy_allowed ()) return;
if (!m_astroWidget->doppler_tracking ()) return;
if ((m_monitoring || m_transmitting)
// no Doppler correction below 6m
@@ -10680,7 +10818,7 @@ void MainWindow::setRig (Frequency f)
&& m_frequency_list_fcal_iter != m_config.frequencies ()->end ()) {
m_freqNominal = m_frequency_list_fcal_iter->frequency_ - ui->RxFreqSpinBox->value ();
}
if(m_transmitting && !m_config.tx_QSY_allowed ()) return;
if(m_transmitting && !m_config.tx_qsy_allowed ()) return;
if ((m_monitoring || m_transmitting) && m_config.transceiver_online ())
{
if (m_transmitting && m_config.split_mode ())
@@ -10834,6 +10972,7 @@ void MainWindow::tx_watchdog (bool triggered)
m_bTxTime=false;
if (m_tune) stop_tuning ();
if (m_auto) auto_tx_mode (false);
stopTx();
tx_status_label.setStyleSheet ("QLabel{background-color: #ff0000}");
tx_status_label.setText ("Runaway Tx watchdog");
QApplication::alert (this);
+2 -42
View File
@@ -45,6 +45,7 @@
#include "varicode.h"
#include "MessageClient.hpp"
#include "APRSISClient.h"
#include "keyeater.h"
#define NUM_JT4_SYMBOLS 206 //(72+31)*2, embedded sync
#define NUM_JT65_SYMBOLS 126 //63 data + 63 sync
@@ -710,8 +711,8 @@ private:
};
struct MessageBuffer {
QQueue<CallDetail> compound;
CommandDetail cmd;
QQueue<CallDetail> compound;
QList<ActivityDetail> msgs;
};
@@ -932,47 +933,6 @@ private:
void writeFoxQSO(QString msg);
};
class EscapeKeyPressEater : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event){
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_Escape){
return true;
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}
};
class EnterKeyPressEater : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event){
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return){
bool processed = false;
emit this->enterKeyPressed(obj, keyEvent, &processed);
if(processed){
return true;
}
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}
public:
Q_SIGNAL void enterKeyPressed(QObject *obj, QKeyEvent *evt, bool *pProcessed);
};
extern int killbyname(const char* progName);
extern void getDev(int* numDevices,char hostAPI_DeviceName[][50],
int minChan[], int maxChan[],
+2 -5
View File
@@ -4470,10 +4470,10 @@ list. The list can be maintained in Settings (F2).</string>
</action>
<action name="actionDelete_all_wav_files_in_SaveDir">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="text">
<string>Delete all *.wav &amp;&amp; *.c2 files in SaveDir</string>
<string>Delete all *.wav files in SaveDir</string>
</property>
</action>
<action name="actionQuickDecode">
@@ -4500,9 +4500,6 @@ list. The list can be maintained in Settings (F2).</string>
<property name="text">
<string>None</string>
</property>
<property name="visible">
<bool>false</bool>
</property>
</action>
<action name="actionSave_all">
<property name="checkable">
+12
View File
@@ -10,6 +10,18 @@ MessageReplyDialog::MessageReplyDialog(QWidget *parent) :
ui(new Ui::MessageReplyDialog)
{
ui->setupUi(this);
auto enterFilter = new EnterKeyPressEater();
connect(enterFilter, &EnterKeyPressEater::enterKeyPressed, this, [this](QObject *, QKeyEvent *, bool *pProcessed){
if(QApplication::keyboardModifiers() & Qt::ShiftModifier){
if(pProcessed) *pProcessed = false;
return;
}
if(pProcessed) *pProcessed = true;
this->accept();
});
ui->textEdit->installEventFilter(enterFilter);
}
MessageReplyDialog::~MessageReplyDialog()
+1
View File
@@ -2,6 +2,7 @@
#define MESSAGEREPLYDIALOG_H
#include <QDialog>
#include "keyeater.h"
namespace Ui {
class MessageReplyDialog;
+6 -1
View File
@@ -215,7 +215,7 @@ void WideGraph::on_bppSpinBox_valueChanged(int n) //b
}
void WideGraph::on_qsyPushButton_clicked(){
int hzDelta = rxFreq() - ui->centerSpinBox->value();
int hzDelta = rxFreq() - centerFreq();
emit qsy(hzDelta);
}
@@ -269,6 +269,11 @@ int WideGraph::rxFreq() //rxFr
return ui->widePlot->rxFreq();
}
int WideGraph::centerFreq()
{
return ui->centerSpinBox->value();
}
int WideGraph::nStartFreq() //nStartFreq
{
return ui->widePlot->startFreq();
+1
View File
@@ -29,6 +29,7 @@ public:
void dataSink2(float s[], float df3, int ihsym, int ndiskdata);
void setRxFreq(int n);
int rxFreq();
int centerFreq();
int nStartFreq();
int Fmin();
int Fmax();
+4 -2
View File
@@ -73,7 +73,8 @@ SOURCES += \
MessageClient.cpp \
SelfDestructMessageBox.cpp \
APRSISClient.cpp \
messagereplydialog.cpp
messagereplydialog.cpp \
keyeater.cpp
HEADERS += qt_helpers.hpp \
pimpl_h.hpp pimpl_impl.hpp \
@@ -98,7 +99,8 @@ HEADERS += qt_helpers.hpp \
MessageClient.hpp \
SelfDestructMessageBox.h \
APRSISClient.h \
messagereplydialog.h
messagereplydialog.h \
keyeater.h
INCLUDEPATH += qmake_only
+1 -1
View File
@@ -1 +1 @@
IDI_ICON1 ICON DISCARDABLE "icons/windows-icons/wsjtx.ico"
IDI_ICON1 ICON DISCARDABLE "icons/windows-icons/ft8call.ico"