WSJT-X/StationList.hpp

97 lines
2.7 KiB
C++

#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.
//
// Uses the QAbstractItemModel interface of the bands model to lookup
// band information.
//
class StationList final
: public QSortFilterProxyModel
{
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_;
};
using Stations = QList<Station>;
explicit StationList (Bands const * bands, QObject * parent = nullptr);
explicit StationList (Bands const * bands, Stations, QObject * parent = nullptr);
~StationList ();
// Load and store contents.
StationList& operator = (Stations);
Stations stations () const;
//
// 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 is based on band name alone.
inline
bool operator == (StationList::Station const& lhs, StationList::Station const& rhs)
{
return lhs.band_name_ == rhs.band_name_;
}
Q_DECLARE_METATYPE (StationList::Station);
Q_DECLARE_METATYPE (StationList::Stations);
#endif