WSJT-X/FrequencyList.hpp
Bill Somerville f1858dbb4f Improvements to models and delegates
Trying to  find the  sweet spot  for completeness,  usefulness, safety
and,  performance  from  the  various  custom  item  models  and  item
delegates.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@5474 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
2015-05-31 11:51:31 +00:00

133 lines
3.1 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. 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<Item>;
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<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