WSJT-X/StationList.hpp
Bill Somerville f7b0d3904a Ensure all model proxy caches are flushed before access
This fixes a defect where station detail changes are not saved.

The Qt sort and filter proxy models utilize an item cache that must be
flushed by  callig submit() before  accessing the underlying  model if
the proxy model has been used for updates.

Also  separated  the   item  model  candidate  key   filter  from  the
implementation  internals of  the foreign  key item  delegate so  that
candidate key filtered models can be used directly as view models.

Make the insert new station details band combo box use a candidate key
filtered item model to avoid constraint violations. Constraint is zero
or one station records per band.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@5161 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
2015-04-06 01:57:47 +00:00

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