mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-09-09 06:46:39 -04:00
f7b0d3904a
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
103 lines
2.7 KiB
C++
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
|