#ifndef FREQUENCY_LIST_HPP__ #define FREQUENCY_LIST_HPP__ #include "pimpl_h.hpp" #include #include #include "Radio.hpp" #include "Modes.hpp" class Bands; // // Class FrequencyList // // Encapsulates a collection of frequencies. The implementation is a // table containing the list of Frequency type elements which is // editable and a second column which is an immutable double // representation of the corresponding Frequency item scaled to // mega-Hertz. // // The list is ordered. // // Responsibilities // // Stores internally a list of unique frequencies. Provides methods // to add and delete list elements. // // 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; 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 * (); 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 the row of the nearest best working frequency given a // frequency and mode int best_working_frequency (Frequency) const; // Set filter 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 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