| 
									
										
										
										
											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>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Radio.hpp"
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | #include "Modes.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Bands; | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Class FrequencyList
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  | //  Encapsulates a  collection of  frequencies with  associated modes.
 | 
					
						
							|  |  |  | //  The implementation is a table containing the list of 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
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  | //  The list is ordered.  A filter on mode is available  and is set by
 | 
					
						
							|  |  |  | //  the filter(Mode)  method. The  Mode value  Modes::NULL_MODE passes
 | 
					
						
							|  |  |  | //  all rows in the filter.
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Responsibilities
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  | //  Stores  internally  a  list   of  unique  frequency  mode  tuples.
 | 
					
						
							|  |  |  | //  Provides methods to add and delete list elements. Provides range
 | 
					
						
							|  |  |  | //  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.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | class FrequencyList final | 
					
						
							|  |  |  |   : public QSortFilterProxyModel | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   Q_OBJECT; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | public: | 
					
						
							|  |  |  |   using Frequency = Radio::Frequency; | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   using Mode = Modes::Mode; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct Item | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Frequency frequency_; | 
					
						
							|  |  |  |     Mode mode_; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   using FrequencyItems = QList<Item>; | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  |   using BandSet = QSet<QString>; | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   enum Column {mode_column, frequency_column, frequency_mhz_column}; | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							|  |  |  |     const_iterator (FrequencyList const * parent, int row) | 
					
						
							|  |  |  |       : parent_ {parent} | 
					
						
							|  |  |  |       , row_ {row} | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Item const& operator * (); | 
					
						
							|  |  |  |     bool operator != (const_iterator const&) const; | 
					
						
							|  |  |  |     const_iterator& operator ++ (); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private: | 
					
						
							|  |  |  |     FrequencyList const * parent_; | 
					
						
							|  |  |  |     int row_; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   explicit FrequencyList (Bands const *, QObject * parent = nullptr); | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |   ~FrequencyList (); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  |   // Bands of the frequencies
 | 
					
						
							| 
									
										
										
										
											2015-06-06 00:06:46 +00:00
										 |  |  |   BandSet all_bands (Mode = Modes::NULL_MODE) 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
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:40 +00:00
										 |  |  |   Q_SLOT void filter (Mode); | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | bool operator == (FrequencyList::Item const& lhs, FrequencyList::Item const& rhs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return | 
					
						
							|  |  |  |     lhs.frequency_ == rhs.frequency_ | 
					
						
							|  |  |  |     && lhs.mode_ == rhs.mode_; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QDataStream& operator << (QDataStream&, FrequencyList::Item const&); | 
					
						
							|  |  |  | QDataStream& operator >> (QDataStream&, FrequencyList::Item&); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined (QT_NO_DEBUG_STREAM)
 | 
					
						
							|  |  |  | QDebug operator << (QDebug, FrequencyList::Item const&); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (FrequencyList::Item); | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (FrequencyList::FrequencyItems); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | #endif
 |