diff --git a/Configuration.cpp b/Configuration.cpp
index 185b3e4be..d5ab11655 100644
--- a/Configuration.cpp
+++ b/Configuration.cpp
@@ -604,6 +604,7 @@ class Configuration::impl final
Q_SLOT void on_udp_server_line_edit_editingFinished ();
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_extra_adi_path_select_push_button_clicked (bool);
Q_SLOT void on_calibration_intercept_spin_box_valueChanged (double);
Q_SLOT void handle_leavingSettings ();
Q_SLOT void on_calibration_slope_ppm_spin_box_valueChanged (double);
@@ -727,6 +728,7 @@ class Configuration::impl final
QDir save_directory_;
QDir default_azel_directory_;
QDir azel_directory_;
+ QString extra_adi_directory_;
QFont font_;
QFont next_font_;
@@ -1133,6 +1135,7 @@ QStringListModel * Configuration::macros () {return &m_->macros_;}
QStringListModel const * Configuration::macros () const {return &m_->macros_;}
QDir Configuration::save_directory () const {return m_->save_directory_;}
QDir Configuration::azel_directory () const {return m_->azel_directory_;}
+QString Configuration::extra_adi_directory () const {return m_->extra_adi_directory_;}
QString Configuration::rig_name () const {return m_->rig_params_.rig_name;}
bool Configuration::AzElExtraLines () const {return m_->AzElExtraLines_;}
bool Configuration::pwrBandTxMemory () const {return m_->pwrBandTxMemory_;}
@@ -2148,6 +2151,7 @@ void Configuration::impl::initialize_models ()
if (!ui_->PWR_and_SWR_check_box->isChecked()) ui_->check_SWR_check_box->setEnabled (false);
ui_->save_path_display_label->setText (save_directory_.absolutePath ());
ui_->azel_path_display_label->setText (azel_directory_.absolutePath ());
+ ui_->extra_adi_path_display_label->setText (extra_adi_directory_);
ui_->CW_id_after_73_check_box->setChecked (id_after_73_);
ui_->tx_QSY_check_box->setChecked (tx_QSY_allowed_);
ui_->progress_bar_check_box->setChecked (progressBar_red_);
@@ -2488,6 +2492,7 @@ void Configuration::impl::read_settings ()
RxBandwidth_ = settings_->value ("RxBandwidth", 2500).toInt ();
save_directory_.setPath (settings_->value ("SaveDir", default_save_directory_.absolutePath ()).toString ());
azel_directory_.setPath (settings_->value ("AzElDir", default_azel_directory_.absolutePath ()).toString ());
+ extra_adi_directory_ = settings_->value ("ExtraADIDir", QString {}).toString ();
tci_audio_ = settings_->value ("TCIAudio", tci_audio_).toBool ();
@@ -2818,6 +2823,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("PTTport", rig_params_.ptt_port);
settings_->setValue ("SaveDir", save_directory_.absolutePath ());
settings_->setValue ("AzElDir", azel_directory_.absolutePath ());
+ settings_->setValue ("ExtraADIDir", extra_adi_directory_);
if (!audio_input_device_.isNull ()) {
settings_->setValue ("SoundInName", audio_input_device_.deviceName ());
settings_->setValue ("AudioInputChannel", AudioDevice::toString (audio_input_channel_));
@@ -3487,6 +3493,11 @@ void Configuration::impl::accept ()
bLowSidelobes_ = ui_->rbLowSidelobes->isChecked();
save_directory_.setPath (ui_->save_path_display_label->text ());
azel_directory_.setPath (ui_->azel_path_display_label->text ());
+ auto const prev_extra_adi = extra_adi_directory_;
+ extra_adi_directory_ = ui_->extra_adi_path_display_label->text ();
+ if (logbook_ && extra_adi_directory_ != prev_extra_adi) {
+ logbook_->rescan ();
+ }
enable_VHF_features_ = ui_->enable_VHF_features_check_box->isChecked ();
decode_at_52s_ = ui_->decode_at_52s_check_box->isChecked ();
kHz_without_k_ = ui_->kHz_without_k_check_box->isChecked ();
@@ -4533,6 +4544,18 @@ void Configuration::impl::on_azel_path_select_push_button_clicked (bool /* check
}
}
+void Configuration::impl::on_extra_adi_path_select_push_button_clicked (bool /* checked */)
+{
+ QFileDialog fd {this, tr ("Additional ADIF Directory"), ui_->extra_adi_path_display_label->text ()};
+ fd.setFileMode (QFileDialog::Directory);
+ fd.setOption (QFileDialog::ShowDirsOnly);
+ if (fd.exec ()) {
+ if (fd.selectedFiles ().size ()) {
+ ui_->extra_adi_path_display_label->setText (fd.selectedFiles ().at (0));
+ }
+ }
+}
+
void Configuration::impl::on_calibration_intercept_spin_box_valueChanged (double)
{
rig_active_ = false; // force reset
diff --git a/Configuration.hpp b/Configuration.hpp
index 3fb9d501e..f8625ed3a 100644
--- a/Configuration.hpp
+++ b/Configuration.hpp
@@ -255,6 +255,7 @@ class Configuration final
QStringListModel const * macros () const;
QDir save_directory () const;
QDir azel_directory () const;
+ QString extra_adi_directory () const;
QString rig_name () const;
Type2MsgGen type_2_msg_gen () const;
bool AzElExtraLines () const;
diff --git a/Configuration.ui b/Configuration.ui
index d7b9c0a1e..4ddf86150 100644
--- a/Configuration.ui
+++ b/Configuration.ui
@@ -2852,6 +2852,43 @@ Right click for insert and delete options.
+ -
+
+
-
+
+
+ Additional ADIF Directory (Recursive):
+
+
+
+ -
+
+
+
+ 1
+ 0
+
+
+
+ Path to directory containing additional ADIF (.adi) files to include in worked-before scanning.
+
+
+ (none)
+
+
+
+ -
+
+
+ Click to select a directory containing additional ADIF files to scan for worked-before information.
+
+
+ Browse...
+
+
+
+
+
-
-
diff --git a/logbook/WorkedBefore.cpp b/logbook/WorkedBefore.cpp
index 7255ee4a1..3207c901c 100644
--- a/logbook/WorkedBefore.cpp
+++ b/logbook/WorkedBefore.cpp
@@ -17,6 +17,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -279,9 +280,8 @@ namespace
return QString {};
}
- worked_before_database_type loader (QString const& path, AD1CCty const * prefixes)
+ void load_file (QString const& path, AD1CCty const * prefixes, worked_before_database_type& worked)
{
- worked_before_database_type worked;
QFile inputFile {path};
if (inputFile.exists ())
{
@@ -359,6 +359,27 @@ namespace
throw LoaderException (std::runtime_error {QCoreApplication::translate ("WorkedBefore", "Error opening ADIF log file for read: %0").arg (inputFile.errorString ()).toLocal8Bit ()});
}
}
+ }
+
+ worked_before_database_type loader (QString const& path, QString const& extra_dir, AD1CCty const * prefixes)
+ {
+ worked_before_database_type worked;
+ load_file (path, prefixes, worked);
+ if (!extra_dir.isEmpty ())
+ {
+ if (QDir {extra_dir}.exists ())
+ {
+ QDirIterator it {extra_dir, QStringList {} << "*.adi" << "*.ADI",
+ QDir::Files | QDir::Readable,
+ QDirIterator::Subdirectories};
+ while (it.hasNext ())
+ {
+ auto const file_path = it.next ();
+ if (file_path != path)
+ load_file (file_path, prefixes, worked);
+ }
+ }
+ }
return worked;
}
}
@@ -376,7 +397,7 @@ class WorkedBefore::impl final
void reload ()
{
prefixes_.reload (configuration_);
- async_loader_ = QtConcurrent::run (loader, path_, &prefixes_);
+ async_loader_ = QtConcurrent::run (loader, path_, configuration_->extra_adi_directory (), &prefixes_);
loader_watcher_.setFuture (async_loader_);
}