Compare commits

...

18 Commits

Author SHA1 Message Date
Jordan Sherer 22e4b0891e Bump eol 2018-11-15 22:09:03 -05:00
Jordan Sherer 8c564b6637 Added control menu 2018-11-15 22:06:52 -05:00
Jordan Sherer 97763ed82d Bump to 0.9 2018-11-15 21:57:20 -05:00
Jordan Sherer a7849c5b72 Added push button bold style for colorblindness 2018-11-15 21:57:04 -05:00
Jordan Sherer 04394273dd Added notification for CQ messages 2018-11-15 15:03:05 -05:00
Jordan Sherer 1052dd3f9f Added macro expansion in typed message text 2018-11-14 22:48:31 -05:00
Jordan Sherer 78ed799a8b Updated configuration panel to be more flexible (scroll areas) 2018-11-14 22:03:45 -05:00
Jordan Sherer c0d08f87b6 Added keyboard shortcuts to the basic Show actions. Added show action to disable tooltips 2018-11-13 12:35:39 -05:00
Jordan Sherer f92b3db5ea Added ability to add an arbitrary station to the heard list manually 2018-11-12 16:51:51 -05:00
Jordan Sherer cebed44ccd User Interface Tweaks:
* Changed Window Menu to View Menu
* Added Show Clock to View Menu
* Changed minimum sizing for better fit on smaller screens
* Reordered Clock and Date for Clock Priority
2018-11-12 16:34:31 -05:00
Jordan Sherer d47d88681b Updated dependencies list 2018-11-11 15:06:45 -05:00
Jordan Sherer 1be0ee4f4f Added a reference to dependency installation 2018-11-11 14:58:23 -05:00
Jordan Sherer 43d8986e0a Tweaking window sizes 2018-11-08 17:11:25 -05:00
Jordan Sherer fd69dce0ae Fixed word wrapping of non-breaking space words by only replacing double spaces 2018-11-06 23:06:05 -05:00
Jordan Sherer b2fb3f31ac Added azimuth to the distance column 2018-11-06 17:28:21 -05:00
Jordan Sherer db704858e2 Merge branch 'ft8call-develop' of bitbucket.org:widefido/js8call into ft8call-develop 2018-11-05 21:36:13 -05:00
Jordan Sherer 1d11f0f8ba Fixed word wrapping with no break spaces 2018-11-05 21:13:16 -05:00
Jordan Sherer b6bc50a8e1 Fixed QAction for older Qt versions 2018-11-05 17:00:59 -05:00
9 changed files with 4104 additions and 3532 deletions
+51 -4
View File
@@ -463,6 +463,9 @@ private:
void delete_selected_macros (QModelIndexList); void delete_selected_macros (QModelIndexList);
Q_SLOT void on_save_path_select_push_button_clicked (bool); Q_SLOT void on_save_path_select_push_button_clicked (bool);
Q_SLOT void on_azel_path_select_push_button_clicked (bool); Q_SLOT void on_azel_path_select_push_button_clicked (bool);
Q_SLOT void on_sound_cq_path_select_push_button_clicked();
Q_SLOT void on_sound_cq_path_test_push_button_clicked();
Q_SLOT void on_sound_cq_path_reset_push_button_clicked();
Q_SLOT void on_sound_dm_path_select_push_button_clicked(); Q_SLOT void on_sound_dm_path_select_push_button_clicked();
Q_SLOT void on_sound_dm_path_test_push_button_clicked(); Q_SLOT void on_sound_dm_path_test_push_button_clicked();
Q_SLOT void on_sound_dm_path_reset_push_button_clicked(); Q_SLOT void on_sound_dm_path_reset_push_button_clicked();
@@ -517,6 +520,7 @@ private:
QDir default_azel_directory_; QDir default_azel_directory_;
QDir azel_directory_; QDir azel_directory_;
QString sound_cq_path_; // cq message sound file
QString sound_dm_path_; // directed message sound file QString sound_dm_path_; // directed message sound file
QString sound_am_path_; // alert message sound file QString sound_am_path_; // alert message sound file
@@ -810,6 +814,7 @@ QStringListModel * Configuration::macros () {return &m_->macros_;}
QStringListModel const * Configuration::macros () const {return &m_->macros_;} QStringListModel const * Configuration::macros () const {return &m_->macros_;}
QDir Configuration::save_directory () const {return m_->save_directory_;} QDir Configuration::save_directory () const {return m_->save_directory_;}
QDir Configuration::azel_directory () const {return m_->azel_directory_;} QDir Configuration::azel_directory () const {return m_->azel_directory_;}
QString Configuration::sound_cq_path() const {return m_->sound_cq_path_;}
QString Configuration::sound_dm_path() const {return m_->sound_dm_path_;} QString Configuration::sound_dm_path() const {return m_->sound_dm_path_;}
QString Configuration::sound_am_path() const {return m_->sound_am_path_;} QString Configuration::sound_am_path() const {return m_->sound_am_path_;}
QString Configuration::rig_name () const {return m_->rig_params_.rig_name;} QString Configuration::rig_name () const {return m_->rig_params_.rig_name;}
@@ -1042,6 +1047,7 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory,
, default_audio_output_device_selected_ {false} , default_audio_output_device_selected_ {false}
{ {
ui_->setupUi (this); ui_->setupUi (this);
// ui_->groupBox_6->setVisible(false); //### Temporary ??? ### // ui_->groupBox_6->setVisible(false); //### Temporary ??? ###
{ {
@@ -1331,6 +1337,7 @@ void Configuration::impl::initialize_models ()
ui_->PTT_method_button_group->button (rig_params_.ptt_type)->setChecked (true); ui_->PTT_method_button_group->button (rig_params_.ptt_type)->setChecked (true);
ui_->save_path_display_label->setText (save_directory_.absolutePath ()); ui_->save_path_display_label->setText (save_directory_.absolutePath ());
ui_->azel_path_display_label->setText (azel_directory_.absolutePath ()); ui_->azel_path_display_label->setText (azel_directory_.absolutePath ());
ui_->sound_cq_path_display_label->setText(sound_cq_path_);
ui_->sound_dm_path_display_label->setText(sound_dm_path_); ui_->sound_dm_path_display_label->setText(sound_dm_path_);
ui_->sound_am_path_display_label->setText(sound_am_path_); ui_->sound_am_path_display_label->setText(sound_am_path_);
ui_->CW_id_after_73_check_box->setChecked (id_after_73_); ui_->CW_id_after_73_check_box->setChecked (id_after_73_);
@@ -1430,7 +1437,7 @@ void Configuration::impl::done (int r)
{ {
// do this here since window is still on screen at this point // do this here since window is still on screen at this point
SettingsGroup g {settings_, "Configuration"}; SettingsGroup g {settings_, "Configuration"};
settings_->setValue ("window/geometry", saveGeometry ()); settings_->setValue ("WindowGeometry", saveGeometry ());
QDialog::done (r); QDialog::done (r);
} }
@@ -1438,7 +1445,9 @@ void Configuration::impl::done (int r)
void Configuration::impl::read_settings () void Configuration::impl::read_settings ()
{ {
SettingsGroup g {settings_, "Configuration"}; SettingsGroup g {settings_, "Configuration"};
restoreGeometry (settings_->value ("window/geometry").toByteArray ()); setMinimumSize(800, 400);
restoreGeometry (settings_->value ("WindowGeometry").toByteArray ());
setMinimumSize(800, 400);
auto_switch_bands_ = settings_->value("AutoSwitchBands", false).toBool(); auto_switch_bands_ = settings_->value("AutoSwitchBands", false).toBool();
my_callsign_ = settings_->value ("MyCall", QString {}).toString (); my_callsign_ = settings_->value ("MyCall", QString {}).toString ();
@@ -1533,6 +1542,7 @@ void Configuration::impl::read_settings ()
RxBandwidth_ = settings_->value ("RxBandwidth", 2500).toInt (); RxBandwidth_ = settings_->value ("RxBandwidth", 2500).toInt ();
save_directory_ = settings_->value ("SaveDir", default_save_directory_.absolutePath ()).toString (); save_directory_ = settings_->value ("SaveDir", default_save_directory_.absolutePath ()).toString ();
azel_directory_ = settings_->value ("AzElDir", default_azel_directory_.absolutePath ()).toString (); azel_directory_ = settings_->value ("AzElDir", default_azel_directory_.absolutePath ()).toString ();
sound_cq_path_ = settings_->value ("SoundCQPath", "").toString ();
sound_dm_path_ = settings_->value ("SoundDMPath", "").toString (); sound_dm_path_ = settings_->value ("SoundDMPath", "").toString ();
sound_am_path_ = settings_->value ("SoundAMPath", "").toString (); sound_am_path_ = settings_->value ("SoundAMPath", "").toString ();
@@ -1736,6 +1746,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("PTTport", rig_params_.ptt_port); settings_->setValue ("PTTport", rig_params_.ptt_port);
settings_->setValue ("SaveDir", save_directory_.absolutePath ()); settings_->setValue ("SaveDir", save_directory_.absolutePath ());
settings_->setValue ("AzElDir", azel_directory_.absolutePath ()); settings_->setValue ("AzElDir", azel_directory_.absolutePath ());
settings_->setValue ("SoundCQPath", sound_cq_path_);
settings_->setValue ("SoundDMPath", sound_dm_path_); settings_->setValue ("SoundDMPath", sound_dm_path_);
settings_->setValue ("SoundAMPath", sound_am_path_); settings_->setValue ("SoundAMPath", sound_am_path_);
@@ -1880,7 +1891,8 @@ void Configuration::impl::set_rig_invariants ()
// makes no sense with rig as "None" // makes no sense with rig as "None"
ui_->monitor_last_used_check_box->setEnabled (false); ui_->monitor_last_used_check_box->setEnabled (false);
ui_->CAT_control_group_box->setEnabled (false); ui_->catTab->setEnabled(false);
//ui_->CAT_control_group_box->setEnabled (false);
ui_->test_CAT_push_button->setEnabled (false); ui_->test_CAT_push_button->setEnabled (false);
ui_->test_PTT_push_button->setEnabled (TransceiverFactory::PTT_method_DTR == ptt_method ui_->test_PTT_push_button->setEnabled (TransceiverFactory::PTT_method_DTR == ptt_method
|| TransceiverFactory::PTT_method_RTS == ptt_method); || TransceiverFactory::PTT_method_RTS == ptt_method);
@@ -1889,7 +1901,8 @@ void Configuration::impl::set_rig_invariants ()
else else
{ {
ui_->monitor_last_used_check_box->setEnabled (true); ui_->monitor_last_used_check_box->setEnabled (true);
ui_->CAT_control_group_box->setEnabled (true); ui_->catTab->setEnabled(true);
//ui_->CAT_control_group_box->setEnabled (true);
ui_->test_CAT_push_button->setEnabled (true); ui_->test_CAT_push_button->setEnabled (true);
ui_->test_PTT_push_button->setEnabled (false); ui_->test_PTT_push_button->setEnabled (false);
ui_->TX_audio_source_group_box->setEnabled (transceiver_factory_.has_CAT_PTT_mic_data (rig) && TransceiverFactory::PTT_method_CAT == ptt_method); ui_->TX_audio_source_group_box->setEnabled (transceiver_factory_.has_CAT_PTT_mic_data (rig) && TransceiverFactory::PTT_method_CAT == ptt_method);
@@ -1940,7 +1953,9 @@ void Configuration::impl::set_rig_invariants ()
break; break;
} }
} }
ui_->CAT_serial_port_parameters_group_box->setEnabled (is_serial_CAT); ui_->CAT_serial_port_parameters_group_box->setEnabled (is_serial_CAT);
ui_->force_DTR_combo_box->setEnabled (is_serial_CAT ui_->force_DTR_combo_box->setEnabled (is_serial_CAT
&& (cat_port != ptt_port && (cat_port != ptt_port
|| !ui_->PTT_DTR_radio_button->isEnabled () || !ui_->PTT_DTR_radio_button->isEnabled ()
@@ -2277,6 +2292,7 @@ void Configuration::impl::accept ()
data_mode_ = static_cast<DataMode> (ui_->TX_mode_button_group->checkedId ()); data_mode_ = static_cast<DataMode> (ui_->TX_mode_button_group->checkedId ());
save_directory_ = ui_->save_path_display_label->text (); save_directory_ = ui_->save_path_display_label->text ();
azel_directory_ = ui_->azel_path_display_label->text (); azel_directory_ = ui_->azel_path_display_label->text ();
sound_cq_path_ = ui_->sound_cq_path_display_label->text();
sound_dm_path_ = ui_->sound_dm_path_display_label->text(); sound_dm_path_ = ui_->sound_dm_path_display_label->text();
sound_am_path_ = ui_->sound_am_path_display_label->text(); sound_am_path_ = ui_->sound_am_path_display_label->text();
enable_VHF_features_ = ui_->enable_VHF_features_check_box->isChecked (); enable_VHF_features_ = ui_->enable_VHF_features_check_box->isChecked ();
@@ -2945,6 +2961,37 @@ void Configuration::impl::on_azel_path_select_push_button_clicked (bool /* check
} }
} }
void Configuration::impl::on_sound_cq_path_select_push_button_clicked(){
QStringList filters;
filters << "Audio files (*.wav)"
<< "Any files (*)";
QFileDialog fd {this, tr ("Sound File"), ui_->sound_cq_path_display_label->text ()};
fd.setNameFilters(filters);
if (fd.exec ()) {
if (fd.selectedFiles ().size ()) {
if(rig_params_.ptt_type == TransceiverFactory::PTT_method_VOX){
QMessageBox::warning(this, "Notifications Sounds Warning", "You have enabled notification sounds while using VOX. To avoid transmitting these notification sounds, please make sure your rig is using a different sound card than your system.");
}
ui_->sound_cq_path_display_label->setText(fd.selectedFiles().at(0));
}
}
}
void Configuration::impl::on_sound_cq_path_test_push_button_clicked(){
auto path = ui_->sound_cq_path_display_label->text();
if(path.isEmpty()){
return;
}
QSound::play(path);
}
void Configuration::impl::on_sound_cq_path_reset_push_button_clicked(){
ui_->sound_cq_path_display_label->clear();
}
void Configuration::impl::on_sound_dm_path_select_push_button_clicked(){ void Configuration::impl::on_sound_dm_path_select_push_button_clicked(){
QStringList filters; QStringList filters;
filters << "Audio files (*.wav)" filters << "Audio files (*.wav)"
+1
View File
@@ -180,6 +180,7 @@ public:
QStringListModel const * macros () const; QStringListModel const * macros () const;
QDir save_directory () const; QDir save_directory () const;
QDir azel_directory () const; QDir azel_directory () const;
QString sound_cq_path() const;
QString sound_dm_path() const; QString sound_dm_path() const;
QString sound_am_path() const; QString sound_am_path() const;
QString rig_name () const; QString rig_name () const;
+1087 -759
View File
File diff suppressed because it is too large Load Diff
+7
View File
@@ -50,6 +50,13 @@ require this so normally you can choose not to install libusb-1.0-dev
but if you have a SoftRock USB or similar SDR that uses a custom USB but if you have a SoftRock USB or similar SDR that uses a custom USB
interface then it is required. interface then it is required.
On Debian based systems, install requirements like:
sudo apt install git cmake clang gfortran \
libfftw3-dev git libgfortran3 libusb-1.0-dev autoconf libtool \
texinfo qt5-default qtmultimedia5-dev libqt5multimedia5-plugins libqt5serialport5-dev \
libudev-dev pkg-config
The Hamlib library is required. Currently WSJT-X needs to be built The Hamlib library is required. Currently WSJT-X needs to be built
using a forked version of the Hamlib git master. This fork contains using a forked version of the Hamlib git master. This fork contains
patches not yet accepted by the Hamlib development team which are patches not yet accepted by the Hamlib development team which are
+2 -2
View File
@@ -1,6 +1,6 @@
# Version number components # Version number components
set (WSJTX_VERSION_MAJOR 0) set (WSJTX_VERSION_MAJOR 0)
set (WSJTX_VERSION_MINOR 8) set (WSJTX_VERSION_MINOR 9)
set (WSJTX_VERSION_PATCH 3) set (WSJTX_VERSION_PATCH 0)
set (WSJTX_RC 0) # release candidate number, comment out or zero for development versions 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 set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build
+208 -25
View File
@@ -1102,10 +1102,9 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
ui->menuTools->setEnabled(false); ui->menuTools->setEnabled(false);
ui->menuView->setEnabled(false); ui->menuView->setEnabled(false);
foreach(auto action, ui->menuBar->actions()){ foreach(auto action, ui->menuBar->actions()){
if(action->text() == "View") ui->menuBar->removeAction(action); if(action->text() == "Old View") ui->menuBar->removeAction(action);
if(action->text() == "Mode") ui->menuBar->removeAction(action); if(action->text() == "Old Mode") ui->menuBar->removeAction(action);
//if(action->text() == "Decode") ui->menuBar->removeAction(action); if(action->text() == "Old Tools") ui->menuBar->removeAction(action);
if(action->text() == "Tools") ui->menuBar->removeAction(action);
} }
ui->dxCallEntry->clear(); ui->dxCallEntry->clear();
ui->dxGridEntry->clear(); ui->dxGridEntry->clear();
@@ -1295,6 +1294,22 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
auto clearAction4 = new QAction(QIcon::fromTheme("edit-clear"), QString("Clear"), ui->tableWidgetCalls); auto clearAction4 = new QAction(QIcon::fromTheme("edit-clear"), QString("Clear"), ui->tableWidgetCalls);
connect(clearAction4, &QAction::triggered, this, [this](){ this->on_clearAction_triggered(ui->tableWidgetCalls); }); connect(clearAction4, &QAction::triggered, this, [this](){ this->on_clearAction_triggered(ui->tableWidgetCalls); });
auto addStation = new QAction(QString("Add New Station.."), ui->tableWidgetCalls);
connect(addStation, &QAction::triggered, this, [this](){
bool ok = false;
QString callsign = QInputDialog::getText(this, tr("Add New Station..."),
tr("Station Callsign:"), QLineEdit::Normal,
"", &ok).toUpper().trimmed();
if(!ok || callsign.isEmpty()){
return;
}
CallDetail cd = {};
cd.call = callsign;
m_callActivity[callsign] = cd;
displayActivity(true);
});
auto removeStation = new QAction(QString("Remove Station"), ui->tableWidgetCalls); auto removeStation = new QAction(QString("Remove Station"), ui->tableWidgetCalls);
connect(removeStation, &QAction::triggered, this, [this](){ connect(removeStation, &QAction::triggered, this, [this](){
QString selectedCall = callsignSelected(); QString selectedCall = callsignSelected();
@@ -1306,7 +1321,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
ui->tableWidgetCalls->setContextMenuPolicy(Qt::CustomContextMenu); ui->tableWidgetCalls->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->tableWidgetCalls, &QTableWidget::customContextMenuRequested, this, [this, logAction, clearAction4, clearActionAll, removeStation](QPoint const &point){ connect(ui->tableWidgetCalls, &QTableWidget::customContextMenuRequested, this, [this, logAction, clearAction4, clearActionAll, addStation, removeStation](QPoint const &point){
QMenu * menu = new QMenu(ui->tableWidgetCalls); QMenu * menu = new QMenu(ui->tableWidgetCalls);
ui->tableWidgetRXAll->selectionModel()->clearSelection(); ui->tableWidgetRXAll->selectionModel()->clearSelection();
@@ -1352,6 +1367,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
menu->addSeparator(); menu->addSeparator();
menu->addAction(addStation);
removeStation->setDisabled(missingCallsign || isAllCall); removeStation->setDisabled(missingCallsign || isAllCall);
menu->addAction(removeStation); menu->addAction(removeStation);
@@ -1390,6 +1406,35 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
ui->heartbeatButton->setContextMenuPolicy(Qt::ActionsContextMenu); ui->heartbeatButton->setContextMenuPolicy(Qt::ActionsContextMenu);
ui->heartbeatButton->addAction(heartbeatNow); ui->heartbeatButton->addAction(heartbeatNow);
int width = 75;
/*
QList<QPushButton*> btns;
foreach(auto child, ui->buttonGrid->children()){
if(!child->isWidgetType()){
continue;
}
if(!child->objectName().contains("Button")){
continue;
}
auto b = qobject_cast<QPushButton*>(child);
width = qMax(width, b->geometry().width());
btns.append(b);
}
*/
auto buttonLayout = ui->buttonGrid->layout();
auto gridButtonLayout = qobject_cast<QGridLayout*>(buttonLayout);
gridButtonLayout->setColumnMinimumWidth(0, width);
gridButtonLayout->setColumnMinimumWidth(1, width);
gridButtonLayout->setColumnMinimumWidth(2, width);
gridButtonLayout->setColumnMinimumWidth(3, width);
gridButtonLayout->setColumnStretch(0, 1);
gridButtonLayout->setColumnStretch(1, 1);
gridButtonLayout->setColumnStretch(2, 1);
gridButtonLayout->setColumnStretch(3, 1);
pskSetLocal(); pskSetLocal();
aprsSetLocal(); aprsSetLocal();
@@ -1415,7 +1460,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
if (!m_valid) throw std::runtime_error {"Fatal initialization exception"}; if (!m_valid) throw std::runtime_error {"Fatal initialization exception"};
} }
QDate eol(2018, 11, 15); QDate eol(2018, 11, 30);
void MainWindow::checkExpiryWarningMessage() void MainWindow::checkExpiryWarningMessage()
{ {
@@ -1690,6 +1735,7 @@ void MainWindow::writeSettings()
m_settings->setValue("ShowTimeDrift", ui->driftSyncFrame->isVisible()); m_settings->setValue("ShowTimeDrift", ui->driftSyncFrame->isVisible());
m_settings->setValue("TimeDrift", ui->driftSpinBox->value()); m_settings->setValue("TimeDrift", ui->driftSpinBox->value());
m_settings->setValue("SelCal", ui->selcalButton->isChecked()); m_settings->setValue("SelCal", ui->selcalButton->isChecked());
m_settings->setValue("ShowTooltips", ui->actionShow_Tooltips->isChecked());
m_settings->endGroup(); m_settings->endGroup();
@@ -1762,8 +1808,9 @@ void MainWindow::readSettings()
ui->cbAutoSeq->setVisible(false); ui->cbAutoSeq->setVisible(false);
ui->cbFirst->setVisible(false); ui->cbFirst->setVisible(false);
m_settings->beginGroup("MainWindow"); m_settings->beginGroup("MainWindow");
setMinimumSize(800, 400);
restoreGeometry (m_settings->value ("geometry", saveGeometry ()).toByteArray ()); restoreGeometry (m_settings->value ("geometry", saveGeometry ()).toByteArray ());
setMinimumSize(800, 545); setMinimumSize(800, 400);
m_geometryNoControls = m_settings->value ("geometryNoControls",saveGeometry()).toByteArray(); m_geometryNoControls = m_settings->value ("geometryNoControls",saveGeometry()).toByteArray();
restoreState (m_settings->value ("state", saveState ()).toByteArray ()); restoreState (m_settings->value ("state", saveState ()).toByteArray ());
@@ -1800,6 +1847,7 @@ void MainWindow::readSettings()
ui->driftSyncFrame->setVisible(m_settings->value("ShowTimeDrift", false).toBool()); ui->driftSyncFrame->setVisible(m_settings->value("ShowTimeDrift", false).toBool());
ui->driftSpinBox->setValue(m_settings->value("TimeDrift", 0).toInt()); ui->driftSpinBox->setValue(m_settings->value("TimeDrift", 0).toInt());
ui->selcalButton->setChecked(m_settings->value("SelCal", false).toBool()); ui->selcalButton->setChecked(m_settings->value("SelCal", false).toBool());
ui->actionShow_Tooltips->setChecked(m_settings->value("ShowTooltips", true).toBool());
m_settings->endGroup(); m_settings->endGroup();
@@ -2292,18 +2340,42 @@ void MainWindow::showStatusMessage(const QString& statusMsg)
* on OSX fixing a weird bug where they aren't displayed correctly. * on OSX fixing a weird bug where they aren't displayed correctly.
*/ */
void rebuildMacQAction(QMenu *menu, QAction *existingAction){ void rebuildMacQAction(QMenu *menu, QAction *existingAction){
auto dummyAction = new QAction("..."); auto dummyAction = new QAction("...", menu);
menu->insertAction(existingAction, dummyAction); menu->insertAction(existingAction, dummyAction);
menu->insertAction(dummyAction, existingAction); menu->insertAction(dummyAction, existingAction);
menu->removeAction(dummyAction); menu->removeAction(dummyAction);
} }
void MainWindow::on_menuControl_aboutToShow(){
ui->actionEnable_Spotting->setChecked(ui->spotButton->isChecked());
ui->actionEnable_Auto_Reply->setChecked(ui->autoReplyButton->isChecked());
ui->actionEnable_Heartbeat->setChecked(ui->heartbeatButton->isChecked());
ui->actionEnable_Selcall->setChecked(ui->selcalButton->isChecked());
}
void MainWindow::on_actionEnable_Spotting_toggled(bool checked){
ui->spotButton->setChecked(checked);
}
void MainWindow::on_actionEnable_Auto_Reply_toggled(bool checked){
ui->autoReplyButton->setChecked(checked);
}
void MainWindow::on_actionEnable_Heartbeat_toggled(bool checked){
ui->heartbeatButton->setChecked(checked);
}
void MainWindow::on_actionEnable_Selcall_toggled(bool checked){
ui->selcalButton->setChecked(checked);
}
void MainWindow::on_menuWindow_aboutToShow(){ void MainWindow::on_menuWindow_aboutToShow(){
auto hsizes = ui->textHorizontalSplitter->sizes(); auto hsizes = ui->textHorizontalSplitter->sizes();
ui->actionShow_Band_Activity->setChecked(hsizes.at(0) > 0); ui->actionShow_Band_Activity->setChecked(hsizes.at(0) > 0);
ui->actionShow_Call_Activity->setChecked(hsizes.at(2) > 0); ui->actionShow_Call_Activity->setChecked(hsizes.at(2) > 0);
auto vsizes = ui->mainSplitter->sizes(); auto vsizes = ui->mainSplitter->sizes();
ui->actionShow_Frequency_Clock->setChecked(vsizes.first() > 0);
ui->actionShow_Waterfall->setChecked(vsizes.last() > 0); ui->actionShow_Waterfall->setChecked(vsizes.last() > 0);
ui->actionShow_Waterfall_Controls->setChecked(m_wideGraph->controlsVisible()); ui->actionShow_Waterfall_Controls->setChecked(m_wideGraph->controlsVisible());
ui->actionShow_Waterfall_Controls->setEnabled(ui->actionShow_Waterfall->isChecked()); ui->actionShow_Waterfall_Controls->setEnabled(ui->actionShow_Waterfall->isChecked());
@@ -2343,6 +2415,13 @@ void MainWindow::on_menuWindow_aboutToShow(){
#endif #endif
} }
void MainWindow::on_actionShow_Frequency_Clock_triggered(bool checked){
auto vsizes = ui->mainSplitter->sizes();
vsizes[0] = checked ? ui->logHorizontalWidget->minimumHeight() : 0;
ui->logHorizontalWidget->setVisible(checked);
ui->mainSplitter->setSizes(vsizes);
}
void MainWindow::on_actionShow_Band_Activity_triggered(bool checked){ void MainWindow::on_actionShow_Band_Activity_triggered(bool checked){
auto hsizes = ui->textHorizontalSplitter->sizes(); auto hsizes = ui->textHorizontalSplitter->sizes();
hsizes[0] = checked ? ui->textHorizontalSplitter->width()/4 : 0; hsizes[0] = checked ? ui->textHorizontalSplitter->width()/4 : 0;
@@ -2435,6 +2514,8 @@ void MainWindow::openSettings(int tab){
m_msAudioOutputBuffered); m_msAudioOutputBuffered);
} }
ui->bandComboBox->view ()->setMinimumWidth (ui->bandComboBox->view ()->sizeHintForColumn (FrequencyList_v2::frequency_mhz_column));
displayDialFrequency (); displayDialFrequency ();
displayActivity(true); displayActivity(true);
@@ -2566,6 +2647,34 @@ void MainWindow::on_autoButton_clicked (bool checked)
} }
} }
void MainWindow::on_autoReplyButton_toggled(bool checked){
resetPushButtonToggleText(ui->autoReplyButton);
}
void MainWindow::on_monitorButton_toggled(bool checked){
resetPushButtonToggleText(ui->monitorButton);
}
void MainWindow::on_monitorTxButton_toggled(bool checked){
resetPushButtonToggleText(ui->monitorTxButton);
}
void MainWindow::on_selcalButton_toggled(bool checked){
resetPushButtonToggleText(ui->selcalButton);
}
void MainWindow::on_tuneButton_toggled(bool checked){
resetPushButtonToggleText(ui->tuneButton);
}
void MainWindow::on_spotButton_toggled(bool checked){
resetPushButtonToggleText(ui->spotButton);
}
void MainWindow::on_heartbeatButton_toggled(bool checked){
resetPushButtonToggleText(ui->heartbeatButton);
}
void MainWindow::auto_tx_mode (bool state) void MainWindow::auto_tx_mode (bool state)
{ {
ui->autoButton->setChecked (state); ui->autoButton->setChecked (state);
@@ -2702,6 +2811,13 @@ bool MainWindow::eventFilter (QObject * object, QEvent * event)
remove_child_from_event_filter (static_cast<QChildEvent *> (event)->child ()); remove_child_from_event_filter (static_cast<QChildEvent *> (event)->child ());
break; break;
case QEvent::ToolTip:
if(!ui->actionShow_Tooltips->isChecked()){
return true;
}
break;
default: break; default: break;
} }
return QObject::eventFilter(object, event); return QObject::eventFilter(object, event);
@@ -3674,6 +3790,9 @@ void MainWindow::readFromStdout() //readFromStdout
// it is not processed elsewhere, so we need to just log it here. // it is not processed elsewhere, so we need to just log it here.
logCallActivity(cd, true); logCallActivity(cd, true);
// play cq notification
playSoundNotification(m_config.sound_cq_path());
} else { } else {
// convert HEARTBEAT to a directed command and process... // convert HEARTBEAT to a directed command and process...
cmd.from = cd.call; cmd.from = cd.call;
@@ -3897,6 +4016,15 @@ void MainWindow::readFromStdout() //readFromStdout
// See MainWindow::postDecode for displaying the latest decodes // See MainWindow::postDecode for displaying the latest decodes
} }
void MainWindow::playSoundNotification(const QString &path){
if(path.isEmpty()){
return;
}
qDebug() << "Trying to play sound file" << path;
QSound::play(path);
}
bool MainWindow::hasExistingMessageBuffer(int offset, bool drift, int *pPrevOffset){ bool MainWindow::hasExistingMessageBuffer(int offset, bool drift, int *pPrevOffset){
if(m_messageBuffer.contains(offset)){ if(m_messageBuffer.contains(offset)){
@@ -4382,6 +4510,7 @@ void MainWindow::guiUpdate()
tx_status_label.setText(t.trimmed()); tx_status_label.setText(t.trimmed());
} }
} }
} else if(m_monitoring) { } else if(m_monitoring) {
if (m_tx_watchdog) { if (m_tx_watchdog) {
tx_status_label.setStyleSheet ("QLabel{background-color: #ff0000}"); tx_status_label.setStyleSheet ("QLabel{background-color: #ff0000}");
@@ -4405,9 +4534,10 @@ void MainWindow::guiUpdate()
auto drift = DriftingDateTime::drift(); auto drift = DriftingDateTime::drift();
QDateTime t = DriftingDateTime::currentDateTimeUtc(); QDateTime t = DriftingDateTime::currentDateTimeUtc();
QString utc = t.date().toString("yyyy MMM dd") + "\n " + QStringList parts;
t.time().toString() + (!drift ? " " : QString(" (%1%2ms)").arg(drift > 0 ? "+" : "").arg(drift)); parts << (t.time().toString() + (!drift ? " " : QString(" (%1%2ms)").arg(drift > 0 ? "+" : "").arg(drift)));
ui->labUTC->setText(utc); parts << t.date().toString("yyyy MMM dd");
ui->labUTC->setText(parts.join("\n"));
auto delta = t.secsTo(m_nextHeartbeat); auto delta = t.secsTo(m_nextHeartbeat);
QString ping; QString ping;
@@ -5170,7 +5300,7 @@ int MainWindow::writeMessageTextToUI(QDateTime date, QString text, int freq, boo
c.insertText(text); c.insertText(text);
} else { } else {
text = text.toHtmlEscaped(); text = text.toHtmlEscaped();
text = text.replace(" ", "&nbsp;"); text = text.replace(" ", "&nbsp;&nbsp;");
if(bold){ if(bold){
text = QString("<strong>%1</strong>").arg(text); text = QString("<strong>%1</strong>").arg(text);
} }
@@ -5341,7 +5471,7 @@ void MainWindow::createMessage(QString const& text){
} }
resetMessageTransmitQueue(); resetMessageTransmitQueue();
createMessageTransmitQueue(text); createMessageTransmitQueue(replaceMacros(text, buildMacroValues(), false));
} }
void MainWindow::createMessageTransmitQueue(QString const& text){ void MainWindow::createMessageTransmitQueue(QString const& text){
@@ -5650,7 +5780,7 @@ void MainWindow::prepareHeartbeat(){
QString MainWindow::calculateDistance(QString const& value, int *pDistance) QString MainWindow::calculateDistance(QString const& value, int *pDistance, int *pAzimuth)
{ {
QString grid = value.trimmed(); QString grid = value.trimmed();
if(grid.isEmpty() || grid.length() < 4){ if(grid.isEmpty() || grid.length() < 4){
@@ -5664,20 +5794,21 @@ QString MainWindow::calculateDistance(QString const& value, int *pDistance)
const_cast <char *> ((grid + " ").left (6).toLatin1().constData()),&utch, const_cast <char *> ((grid + " ").left (6).toLatin1().constData()),&utch,
&nAz,&nEl,&nDmiles,&nDkm,&nHotAz,&nHotABetter,6,6); &nAz,&nEl,&nDmiles,&nDkm,&nHotAz,&nHotABetter,6,6);
if(pAzimuth) *pAzimuth = nAz;
if(m_config.miles()){ if(m_config.miles()){
if(pDistance) *pDistance = nDmiles; if(pDistance) *pDistance = nDmiles;
return QString("%1 mi").arg(nDmiles); return QString("%1 mi / %2°").arg(nDmiles).arg(nAz);
} }
if(pDistance) *pDistance = nDkm; if(pDistance) *pDistance = nDkm;
return QString("%1 km").arg(nDkm); return QString("%1 km / %2°").arg(nDkm).arg(nAz);
} }
// this function is called by auto_tx_mode, which is called by autoButton.clicked // this function is called by auto_tx_mode, which is called by autoButton.clicked
void MainWindow::on_startTxButton_toggled(bool checked) void MainWindow::on_startTxButton_toggled(bool checked)
{ {
if(checked){ if(checked){
checkExpiryWarningMessage();
createMessage(ui->extFreeTextMsgEdit->toPlainText()); createMessage(ui->extFreeTextMsgEdit->toPlainText());
startTx(); startTx();
} else { } else {
@@ -7245,7 +7376,51 @@ void MainWindow::stopTuneATU()
m_bTxTime=false; m_bTxTime=false;
} }
void MainWindow::resetPushButtonToggleText(QPushButton *btn){
bool checked = btn->isChecked();
auto style = btn->styleSheet();
if(checked){
style = style.replace("font-weight:normal;", "font-weight:bold;");
} else {
style = style.replace("font-weight:bold;", "font-weight:normal;");
}
btn->setStyleSheet(style);
#if PUSH_BUTTON_CHECKMARK
auto on = "";
auto text = btn->text();
if(checked){
btn->setText(on + text.replace(on, ""));
} else {
btn->setText(text.replace(on, ""));
}
#endif
#if PUSH_BUTTON_MIN_WIDTH
int width = 0;
QList<QPushButton*> btns;
foreach(auto child, ui->buttonGrid->children()){
if(!child->isWidgetType()){
continue;
}
if(!child->objectName().contains("Button")){
continue;
}
auto b = qobject_cast<QPushButton*>(child);
width = qMax(width, b->geometry().width());
btns.append(b);
}
foreach(auto child, btns){
child->setMinimumWidth(width);
}
#endif
}
void MainWindow::on_monitorTxButton_clicked(){ void MainWindow::on_monitorTxButton_clicked(){
ui->monitorTxButton->setChecked(false);
on_stopTxButton_clicked(); on_stopTxButton_clicked();
} }
@@ -7779,6 +7954,8 @@ void MainWindow::aprsSetLocal ()
void MainWindow::transmitDisplay (bool transmitting) void MainWindow::transmitDisplay (bool transmitting)
{ {
ui->monitorTxButton->setChecked(transmitting);
if (transmitting == m_transmitting) { if (transmitting == m_transmitting) {
if (transmitting) { if (transmitting) {
ui->signal_meter_widget->setValue(0,0); ui->signal_meter_widget->setValue(0,0);
@@ -7822,8 +7999,10 @@ void MainWindow::transmitDisplay (bool transmitting)
} }
// TODO: jsherer - encapsulate this in a function? // TODO: jsherer - encapsulate this in a function?
/*
ui->monitorButton->setVisible(!transmitting); ui->monitorButton->setVisible(!transmitting);
ui->monitorTxButton->setVisible(transmitting); ui->monitorTxButton->setVisible(transmitting);
*/
} }
void MainWindow::on_sbFtol_valueChanged(int value) void MainWindow::on_sbFtol_valueChanged(int value)
@@ -8757,10 +8936,7 @@ void MainWindow::processCommandActivity() {
}); });
if(!isAllCall){ if(!isAllCall){
auto wav = m_config.sound_dm_path(); playSoundNotification(m_config.sound_dm_path());
if(!wav.isEmpty()){
QSound::play(wav);
}
} }
writeDirectedCommandToFile(d); writeDirectedCommandToFile(d);
@@ -9133,10 +9309,7 @@ void MainWindow::processAlertReplyForCommand(CommandDetail d, QString from, QStr
} }
}); });
auto wav = m_config.sound_am_path(); playSoundNotification(m_config.sound_am_path());
if(!wav.isEmpty()){
QSound::play(wav);
}
msgBox->setModal(false); msgBox->setModal(false);
msgBox->show(); msgBox->show();
@@ -9626,6 +9799,7 @@ void MainWindow::displayCallActivity() {
auto flagItem = new QTableWidgetItem(flag); auto flagItem = new QTableWidgetItem(flag);
flagItem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); flagItem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
ui->tableWidgetCalls->setItem(row, col++, flagItem); ui->tableWidgetCalls->setItem(row, col++, flagItem);
if(d.utcTimestamp.isValid()){
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("(%1)").arg(since(d.utcTimestamp)))); ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("(%1)").arg(since(d.utcTimestamp))));
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("%1").arg(Varicode::formatSNR(d.snr)))); ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("%1").arg(Varicode::formatSNR(d.snr))));
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("%1").arg(d.freq))); ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("%1").arg(d.freq)));
@@ -9639,6 +9813,15 @@ void MainWindow::displayCallActivity() {
distanceItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); distanceItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, col++, distanceItem); ui->tableWidgetCalls->setItem(ui->tableWidgetCalls->rowCount() - 1, col++, distanceItem);
} else {
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(""));
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(""));
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(""));
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(""));
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(""));
ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(""));
}
if (isCallSelected) { if (isCallSelected) {
for(int i = 0; i < ui->tableWidgetCalls->columnCount(); i++){ for(int i = 0; i < ui->tableWidgetCalls->columnCount(); i++){
ui->tableWidgetCalls->item(row, i)->setSelected(true); ui->tableWidgetCalls->item(row, i)->setSelected(true);
+17 -1
View File
@@ -130,6 +130,7 @@ public slots:
void msgAvgDecode2(); void msgAvgDecode2();
void fastPick(int x0, int x1, int y); void fastPick(int x0, int x1, int y);
void playSoundNotification(const QString &path);
bool hasExistingMessageBuffer(int offset, bool drift, int *pPrevOffset); bool hasExistingMessageBuffer(int offset, bool drift, int *pPrevOffset);
void logCallActivity(CallDetail d, bool spot=true); void logCallActivity(CallDetail d, bool spot=true);
QString lookupCallInCompoundCache(QString const &call); QString lookupCallInCompoundCache(QString const &call);
@@ -170,7 +171,13 @@ private slots:
void on_tx4_editingFinished(); void on_tx4_editingFinished();
void on_tx5_currentTextChanged (QString const&); void on_tx5_currentTextChanged (QString const&);
void on_tx6_editingFinished(); void on_tx6_editingFinished();
void on_menuControl_aboutToShow();
void on_actionEnable_Spotting_toggled(bool checked);
void on_actionEnable_Auto_Reply_toggled(bool checked);
void on_actionEnable_Heartbeat_toggled(bool checked);
void on_actionEnable_Selcall_toggled(bool checked);
void on_menuWindow_aboutToShow(); void on_menuWindow_aboutToShow();
void on_actionShow_Frequency_Clock_triggered(bool checked);
void on_actionShow_Band_Activity_triggered(bool checked); void on_actionShow_Band_Activity_triggered(bool checked);
void on_actionShow_Call_Activity_triggered(bool checked); void on_actionShow_Call_Activity_triggered(bool checked);
void on_actionShow_Waterfall_triggered(bool checked); void on_actionShow_Waterfall_triggered(bool checked);
@@ -185,6 +192,7 @@ private slots:
void on_actionAbout_triggered(); void on_actionAbout_triggered();
void on_autoButton_clicked (bool); void on_autoButton_clicked (bool);
void on_labDialFreq_clicked(); void on_labDialFreq_clicked();
void resetPushButtonToggleText(QPushButton *btn);
void on_monitorTxButton_clicked(); void on_monitorTxButton_clicked();
void on_stopTxButton_clicked(); void on_stopTxButton_clicked();
void on_stopButton_clicked(); void on_stopButton_clicked();
@@ -307,7 +315,7 @@ private slots:
void unpauseHeartbeat(); void unpauseHeartbeat();
void checkHeartbeat(); void checkHeartbeat();
void prepareHeartbeat(); void prepareHeartbeat();
QString calculateDistance(QString const& grid, int *pDistance=nullptr); QString calculateDistance(QString const& grid, int *pDistance=nullptr, int *pAzimuth=nullptr);
void on_driftSpinBox_valueChanged(int n); void on_driftSpinBox_valueChanged(int n);
void on_driftSyncButton_clicked(); void on_driftSyncButton_clicked();
void on_driftSyncEndButton_clicked(); void on_driftSyncEndButton_clicked();
@@ -342,6 +350,14 @@ private slots:
void stop_tuning (); void stop_tuning ();
void stopTuneATU(); void stopTuneATU();
void auto_tx_mode(bool); void auto_tx_mode(bool);
void on_autoReplyButton_toggled(bool checked);
void on_monitorButton_toggled(bool checked);
void on_monitorTxButton_toggled(bool checked);
void on_selcalButton_toggled(bool checked);
void on_tuneButton_toggled(bool checked);
void on_spotButton_toggled(bool checked);
void on_heartbeatButton_toggled(bool checked);
void on_actionMessage_averaging_triggered(); void on_actionMessage_averaging_triggered();
void on_actionFox_Log_triggered(); void on_actionFox_Log_triggered();
void on_actionInclude_averaging_toggled (bool); void on_actionInclude_averaging_toggled (bool);
+604 -614
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1083</width> <width>1083</width>
<height>337</height> <height>154</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -43,7 +43,7 @@
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>400</width> <width>400</width>
<height>100</height> <height>10</height>
</size> </size>
</property> </property>
<property name="frameShape"> <property name="frameShape">