| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | #ifndef STATION_LIST_HPP__
 | 
					
						
							|  |  |  | #define STATION_LIST_HPP__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QSortFilterProxyModel>
 | 
					
						
							|  |  |  | #include <QString>
 | 
					
						
							|  |  |  | #include <QList>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "pimpl_h.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Radio.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Bands; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Class StationList
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Encapsulates information  about a  collection of  unique operating
 | 
					
						
							|  |  |  | //  stations per  band. The implementation  is a table model  with the
 | 
					
						
							|  |  |  | //  first column  being the unique  (within the table rows)  band name
 | 
					
						
							|  |  |  | //  and, the  second the frequency  offset for transverter  usage and,
 | 
					
						
							|  |  |  | //  the third the antenna description. All are editable.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Responsibilities
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Stores internally an unordered table of bands.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  If  an ordered  representaion is  required then  wrapping with  an
 | 
					
						
							|  |  |  | //  appropriate        proxy         model        is        sufficient
 | 
					
						
							|  |  |  | //  e.g. QSortFilterProxyModel. A custom SortRole role is provided for
 | 
					
						
							|  |  |  | //  the band  name column which  returns a numeric value  (Bands lower
 | 
					
						
							|  |  |  | //  frequency limit) which gives a strict frequency ordering by band.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Collaborations
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Implements the  QAbstractTableModel interface for a  grid of bands
 | 
					
						
							|  |  |  | //  with offset frequencies and antenna descriptions.
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2015-05-31 11:51:31 +00:00
										 |  |  | //  Uses the Bands model to lookup band information.
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | class StationList final | 
					
						
							|  |  |  |   : public QSortFilterProxyModel | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-06-06 12:56:25 +01:00
										 |  |  |   Q_OBJECT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | public: | 
					
						
							|  |  |  |   using Frequency = Radio::Frequency; | 
					
						
							|  |  |  |   using FrequencyDelta = Radio::FrequencyDelta; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // Struct Station
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   //  Aggregation of fields that describe a radio station on a band.
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   struct Station | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     QString band_name_; | 
					
						
							|  |  |  |     FrequencyDelta offset_; | 
					
						
							|  |  |  |     QString antenna_description_; | 
					
						
							| 
									
										
										
										
											2020-09-26 13:57:21 +01:00
										 |  |  |     QString toString () const; | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   using Stations = QList<Station>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   enum Column {band_column, offset_column, description_column}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |   explicit StationList (Bands const * bands, QObject * parent = nullptr); | 
					
						
							|  |  |  |   explicit StationList (Bands const * bands, Stations, QObject * parent = nullptr); | 
					
						
							|  |  |  |   ~StationList (); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   // Load and query contents.
 | 
					
						
							|  |  |  |   Stations station_list (Stations); | 
					
						
							|  |  |  |   Stations const& station_list () const; | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // Model API
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   QModelIndex add (Station);                 // Add a new Station
 | 
					
						
							|  |  |  |   bool remove (Station);                     // Remove a Station
 | 
					
						
							|  |  |  |   bool removeDisjointRows (QModelIndexList); // Remove one or more stations
 | 
					
						
							|  |  |  |   FrequencyDelta offset (Frequency) const;   // Return the offset to be used for a Frequency
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Custom sort role.
 | 
					
						
							|  |  |  |   static int constexpr SortRole = Qt::UserRole; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   class impl; | 
					
						
							|  |  |  |   pimpl<impl> m_; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Station equivalence
 | 
					
						
							|  |  |  | inline | 
					
						
							|  |  |  | bool operator == (StationList::Station const& lhs, StationList::Station const& rhs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return lhs.band_name_ == rhs.band_name_ | 
					
						
							|  |  |  |     && lhs.offset_ == rhs.offset_ | 
					
						
							|  |  |  |     && lhs.antenna_description_ == rhs.antenna_description_; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | QDataStream& operator << (QDataStream&, StationList::Station const&); | 
					
						
							|  |  |  | QDataStream& operator >> (QDataStream&, StationList::Station&); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined (QT_NO_DEBUG_STREAM)
 | 
					
						
							|  |  |  | QDebug operator << (QDebug debug, StationList::Station const&); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | Q_DECLARE_METATYPE (StationList::Station); | 
					
						
							|  |  |  | Q_DECLARE_METATYPE (StationList::Stations); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |