WSJT-X/StationList.hpp
Bill Somerville 3781bdb57a Fix another issue with station details not being saved
Due to  what appears to be  a Qt bug, any  in progress user edit  to a
table  fields is  not  updated  in the  underlying  data models  until
QDialog::accept() is  called, this means that  model validation before
calling QDialog::accept() is tricky.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@5164 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
2015-04-06 13:25:51 +00:00

103 lines
2.8 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_;
};
#if !defined (QT_NO_DEBUG_STREAM)
QDebug operator << (QDebug debug, StationList::Station const&);
#endif
// 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_;
}
Q_DECLARE_METATYPE (StationList::Station);
Q_DECLARE_METATYPE (StationList::Stations);
#endif