| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | #ifndef FREQUENCY_LIST_HPP__
 | 
					
						
							|  |  |  | #define FREQUENCY_LIST_HPP__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "pimpl_h.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | #include <QList>
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | #include <QSortFilterProxyModel>
 | 
					
						
							| 
									
										
										
										
											2022-09-28 08:07:12 -07:00
										 |  |  | #include <QDateTime>
 | 
					
						
							|  |  |  | #include <QJsonObject>
 | 
					
						
							|  |  |  | #include <QJsonDocument>
 | 
					
						
							|  |  |  | #include <QFile>
 | 
					
						
							| 
									
										
										
										
											2022-09-29 08:44:31 -07:00
										 |  |  | #include <QException>
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "Radio.hpp"
 | 
					
						
							| 
									
										
										
										
											2017-07-07 23:11:41 +00:00
										 |  |  | #include "IARURegions.hpp"
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | #include "Modes.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Bands; | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2017-08-09 16:06:17 +00:00
										 |  |  | // Class FrequencyList_v2
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  | //  Encapsulates a  collection of  frequencies with  associated modes.
 | 
					
						
							| 
									
										
										
										
											2017-07-07 23:11:41 +00:00
										 |  |  | //  The implementation is a table  containing the list of IARU region,
 | 
					
						
							|  |  |  | //  Frequency and  mode tuples which  are editable. A third  column is
 | 
					
						
							|  |  |  | //  modeled in the  model which is an  immutable double representation
 | 
					
						
							|  |  |  | //  of the corresponding Frequency item scaled to mega-Hertz.
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2017-07-07 23:11:41 +00:00
										 |  |  | //  The  list  is ordered.   A  filter  on  IARU  region and  mode  is
 | 
					
						
							|  |  |  | //  available  and is  set by  the filter(Region,  Mode) method.   The
 | 
					
						
							|  |  |  | //  Region value IARURegions::ALL and the Mode value Modes::ALL may be
 | 
					
						
							|  |  |  | //  optionally given which passes all rows in the filtered column.
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Responsibilities
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2017-07-07 23:11:41 +00:00
										 |  |  | //  Stores internally a list of  unique region, frequency mode tuples.
 | 
					
						
							|  |  |  | //  Provides methods to  add and delete list  elements. Provides range
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  | //  iterators for a filtered view of the underlying table.
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Collaborations
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Implements the QSortFilterProxyModel interface  for a list of spot
 | 
					
						
							|  |  |  | //  frequencies.
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  | class FrequencyList_v2_101 final | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |   : public QSortFilterProxyModel | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   Q_OBJECT; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2017-07-07 23:11:41 +00:00
										 |  |  |   using Region = IARURegions::Region; | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |   using Frequency = Radio::Frequency; | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   using Mode = Modes::Mode; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct Item | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Frequency frequency_; | 
					
						
							|  |  |  |     Mode mode_; | 
					
						
							| 
									
										
										
										
											2017-07-07 23:11:41 +00:00
										 |  |  |     Region region_; | 
					
						
							| 
									
										
										
										
											2022-09-28 08:07:12 -07:00
										 |  |  |     QString description_; | 
					
						
							|  |  |  |     QString source_; | 
					
						
							|  |  |  |     QDateTime start_time_; | 
					
						
							|  |  |  |     QDateTime end_time_; | 
					
						
							| 
									
										
										
										
											2022-09-29 20:54:45 -07:00
										 |  |  |     bool preferred_;  // preferred frequency for this band and mode
 | 
					
						
							| 
									
										
										
										
											2022-09-29 08:44:31 -07:00
										 |  |  |     QString toString () const; | 
					
						
							|  |  |  |     bool isSane() const; | 
					
						
							|  |  |  |     QJsonObject toJson () const; | 
					
						
							| 
									
										
										
										
											2022-09-28 08:07:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  |   using FrequencyItems = QList<Item>; | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  |   using BandSet = QSet<QString>; | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 20:54:45 -07:00
										 |  |  |   enum Column {region_column, mode_column, frequency_column, frequency_mhz_column, description_column, start_time_column, end_time_column, source_column, preferred_column, SENTINAL}; | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  |   // an iterator that meets the requirements of the C++ for range statement
 | 
					
						
							|  |  |  |   class const_iterator | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |   public: | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  |     const_iterator (FrequencyList_v2_101 const * parent, int row) | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  |       : parent_ {parent} | 
					
						
							|  |  |  |       , row_ {row} | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-08 23:58:09 +00:00
										 |  |  |     Item const& operator * () const; | 
					
						
							|  |  |  |     Item const * operator -> () const; | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  |     bool operator != (const_iterator const&) const; | 
					
						
							| 
									
										
										
										
											2017-01-08 23:58:09 +00:00
										 |  |  |     bool operator == (const_iterator const&) const; | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  |     const_iterator& operator ++ (); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private: | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  |     FrequencyList_v2_101 const * parent_; | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  |     int row_; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  |   explicit FrequencyList_v2_101 (Bands const *, QObject * parent = nullptr); | 
					
						
							| 
									
										
										
										
											2022-09-28 08:07:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  |   ~FrequencyList_v2_101 (); | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  |   // Load and store underlying items
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   FrequencyItems frequency_list (FrequencyItems); | 
					
						
							|  |  |  |   FrequencyItems const& frequency_list () const; | 
					
						
							| 
									
										
										
										
											2017-07-07 23:11:41 +00:00
										 |  |  |   FrequencyItems frequency_list (QModelIndexList const&) const; | 
					
						
							|  |  |  |   void frequency_list_merge (FrequencyItems const&); | 
					
						
							| 
									
										
										
										
											2022-09-29 08:44:31 -07:00
										 |  |  |   void to_json_file(QFile *, QString, QString, FrequencyItems const&); | 
					
						
							|  |  |  |   static FrequencyItems from_json_file(QFile *); | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  |   // Iterators for the sorted and filtered items
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // Note that these iterators are on the final sorted and filtered
 | 
					
						
							|  |  |  |   // rows, if you need to access the underlying unfiltered and
 | 
					
						
							|  |  |  |   // unsorted frequencies then use the frequency_list() member to
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  |   // access the underlying list of rows.
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  |   const_iterator begin () const; | 
					
						
							|  |  |  |   const_iterator end () const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-12 21:03:30 +00:00
										 |  |  |   // Find a row with a given frequency
 | 
					
						
							|  |  |  |   const_iterator find (Frequency) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  |   // Bands of the frequencies
 | 
					
						
							| 
									
										
										
										
											2017-07-07 23:11:41 +00:00
										 |  |  |   BandSet all_bands (Region = IARURegions::ALL, Mode = Modes::ALL) const; | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  |   BandSet filtered_bands () const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  |   // Find the row of the nearest best working frequency given a
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  |   // frequency. Returns -1 if no suitable working frequency is found
 | 
					
						
							|  |  |  |   // in the list.
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  |   int best_working_frequency (Frequency) const; | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  |   // Find the row  of the nearest best working frequency  given a band
 | 
					
						
							|  |  |  |   // name. Returns -1 if no suitable working frequency is found in the
 | 
					
						
							|  |  |  |   // list.
 | 
					
						
							|  |  |  |   int best_working_frequency (QString const& band) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   // Set filter
 | 
					
						
							| 
									
										
										
										
											2022-09-29 08:44:31 -07:00
										 |  |  |   Q_SLOT void filter (Region, Mode, bool); | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Reset
 | 
					
						
							|  |  |  |   Q_SLOT void reset_to_defaults (); | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Model API
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   QModelIndex add (Item); | 
					
						
							|  |  |  |   bool remove (Item); | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |   bool removeDisjointRows (QModelIndexList); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   // Proxy API
 | 
					
						
							|  |  |  |   bool filterAcceptsRow (int source_row, QModelIndex const& parent) const override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 08:44:31 -07:00
										 |  |  |   // Refresh the filter based on the current filter settings (underlying data may have changed)
 | 
					
						
							|  |  |  |   void filter_refresh (); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |   // Custom roles.
 | 
					
						
							|  |  |  |   static int constexpr SortRole = Qt::UserRole; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   class impl; | 
					
						
							|  |  |  |   pimpl<impl> m_; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | inline | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  | bool operator == (FrequencyList_v2_101::Item const& lhs, FrequencyList_v2_101::Item const& rhs) | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   return | 
					
						
							|  |  |  |     lhs.frequency_ == rhs.frequency_ | 
					
						
							| 
									
										
										
										
											2017-07-07 23:11:41 +00:00
										 |  |  |     && lhs.region_ == rhs.region_ | 
					
						
							| 
									
										
										
										
											2022-09-29 08:44:31 -07:00
										 |  |  |     && lhs.mode_ == rhs.mode_ | 
					
						
							|  |  |  |     && lhs.description_ == rhs.description_ | 
					
						
							|  |  |  |     && lhs.source_ == rhs.source_ | 
					
						
							|  |  |  |     && lhs.start_time_ == rhs.start_time_ | 
					
						
							| 
									
										
										
										
											2022-09-29 20:54:45 -07:00
										 |  |  |     && lhs.end_time_ == rhs.end_time_ | 
					
						
							|  |  |  |     && lhs.preferred_ == rhs.preferred_; | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  | QDataStream& operator << (QDataStream&, FrequencyList_v2_101::Item const&); | 
					
						
							|  |  |  | QDataStream& operator >> (QDataStream&, FrequencyList_v2_101::Item&); | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if !defined (QT_NO_DEBUG_STREAM)
 | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  | QDebug operator << (QDebug, FrequencyList_v2_101::Item const&); | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  | Q_DECLARE_METATYPE (FrequencyList_v2_101::Item); | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (FrequencyList_v2_101::FrequencyItems); | 
					
						
							| 
									
										
										
										
											2017-08-09 16:06:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  | class FrequencyList_v2 final | 
					
						
							| 
									
										
										
										
											2022-09-28 08:07:12 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-28 08:07:12 -07:00
										 |  |  | public: | 
					
						
							|  |  |  |   using Frequency = Radio::Frequency; | 
					
						
							|  |  |  |   using Mode = Modes::Mode; | 
					
						
							|  |  |  |   using Region = IARURegions::Region; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct Item | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Frequency frequency_; | 
					
						
							|  |  |  |     Mode mode_; | 
					
						
							|  |  |  |     Region region_; | 
					
						
							|  |  |  |     QString toString () const; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   using FrequencyItems = QList<Item>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   FrequencyItems frequency_list_; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  | QDataStream& operator << (QDataStream&, FrequencyList_v2::Item const&); | 
					
						
							|  |  |  | QDataStream& operator >> (QDataStream&, FrequencyList_v2::Item&); | 
					
						
							| 
									
										
										
										
											2022-09-28 08:07:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 18:30:01 -07:00
										 |  |  | Q_DECLARE_METATYPE (FrequencyList_v2::Item); | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (FrequencyList_v2::FrequencyItems); | 
					
						
							| 
									
										
										
										
											2017-08-09 16:06:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Obsolete version of FrequencyList no longer used but needed to
 | 
					
						
							|  |  |  | // allow loading and saving of old settings contents without damage
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | class FrequencyList final | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |   using Frequency = Radio::Frequency; | 
					
						
							|  |  |  |   using Mode = Modes::Mode; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct Item | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Frequency frequency_; | 
					
						
							|  |  |  |     Mode mode_; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   using FrequencyItems = QList<Item>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   FrequencyItems frequency_list_; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QDataStream& operator << (QDataStream&, FrequencyList::Item const&); | 
					
						
							|  |  |  | QDataStream& operator >> (QDataStream&, FrequencyList::Item&); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | Q_DECLARE_METATYPE (FrequencyList::Item); | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (FrequencyList::FrequencyItems); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 08:44:31 -07:00
										 |  |  | class ReadFileException : public QException { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |   ReadFileException (QString const& message) | 
					
						
							|  |  |  |     : message_ {message} | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void raise () const override { throw *this; } | 
					
						
							|  |  |  |   ReadFileException * clone () const override { return new ReadFileException {*this}; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   QString filename_; | 
					
						
							|  |  |  |   QString message_; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | #endif
 |