mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 13:10:19 -04:00 
			
		
		
		
	Allow band drop down list to be used to select FreqCal frequencies, also resets position in automatic cycle. Tidy up some unnecessary code. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7486 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
		
			
				
	
	
		
			152 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef FREQUENCY_LIST_HPP__
 | |
| #define FREQUENCY_LIST_HPP__
 | |
| 
 | |
| #include "pimpl_h.hpp"
 | |
| 
 | |
| #include <QList>
 | |
| #include <QSortFilterProxyModel>
 | |
| 
 | |
| #include "Radio.hpp"
 | |
| #include "Modes.hpp"
 | |
| 
 | |
| class Bands;
 | |
| 
 | |
| //
 | |
| // Class FrequencyList
 | |
| //
 | |
| //  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.
 | |
| //
 | |
| //  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.
 | |
| //
 | |
| // Responsibilities
 | |
| //
 | |
| //  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.
 | |
| //
 | |
| // Collaborations
 | |
| //
 | |
| //  Implements the QSortFilterProxyModel interface  for a list of spot
 | |
| //  frequencies.
 | |
| //
 | |
| class FrequencyList final
 | |
|   : public QSortFilterProxyModel
 | |
| {
 | |
|   Q_OBJECT;
 | |
| 
 | |
| public:
 | |
|   using Frequency = Radio::Frequency;
 | |
|   using Mode = Modes::Mode;
 | |
| 
 | |
|   struct Item
 | |
|   {
 | |
|     Frequency frequency_;
 | |
|     Mode mode_;
 | |
|   };
 | |
|   using FrequencyItems = QList<Item>;
 | |
|   using BandSet = QSet<QString>;
 | |
| 
 | |
|   enum Column {mode_column, frequency_column, frequency_mhz_column};
 | |
| 
 | |
|   // 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 * () const;
 | |
|     Item const * operator -> () const;
 | |
|     bool operator != (const_iterator const&) const;
 | |
|     bool operator == (const_iterator const&) const;
 | |
|     const_iterator& operator ++ ();
 | |
| 
 | |
|   private:
 | |
|     FrequencyList const * parent_;
 | |
|     int row_;
 | |
|   };
 | |
| 
 | |
|   explicit FrequencyList (Bands const *, QObject * parent = nullptr);
 | |
|   ~FrequencyList ();
 | |
| 
 | |
|   // Load and store underlying items
 | |
|   FrequencyItems frequency_list (FrequencyItems);
 | |
|   FrequencyItems const& frequency_list () const;
 | |
| 
 | |
|   // 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
 | |
|   // access the underlying list of rows.
 | |
|   const_iterator begin () const;
 | |
|   const_iterator end () const;
 | |
| 
 | |
|   // Find a row with a given frequency
 | |
|   const_iterator find (Frequency) const;
 | |
| 
 | |
|   // Bands of the frequencies
 | |
|   BandSet all_bands (Mode = Modes::NULL_MODE) const;
 | |
|   BandSet filtered_bands () const;
 | |
| 
 | |
|   // Find the row of the nearest best working frequency given a
 | |
|   // frequency. Returns -1 if no suitable working frequency is found
 | |
|   // in the list.
 | |
|   int best_working_frequency (Frequency) const;
 | |
| 
 | |
|   // 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;
 | |
| 
 | |
|   // Set filter
 | |
|   Q_SLOT void filter (Mode);
 | |
| 
 | |
|   // Reset
 | |
|   Q_SLOT void reset_to_defaults ();
 | |
| 
 | |
|   // Model API
 | |
|   QModelIndex add (Item);
 | |
|   bool remove (Item);
 | |
|   bool removeDisjointRows (QModelIndexList);
 | |
| 
 | |
|   // Proxy API
 | |
|   bool filterAcceptsRow (int source_row, QModelIndex const& parent) const override;
 | |
| 
 | |
|   // Custom roles.
 | |
|   static int constexpr SortRole = Qt::UserRole;
 | |
| 
 | |
| private:
 | |
|   class impl;
 | |
|   pimpl<impl> m_;
 | |
| };
 | |
| 
 | |
| 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);
 | |
| 
 | |
| #endif
 |