mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-09-09 06:46:39 -04:00
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
71 lines
2.4 KiB
C++
71 lines
2.4 KiB
C++
#include "CandidateKeyFilter.hpp"
|
|
|
|
#include <QModelIndex>
|
|
#include <QAbstractItemModel>
|
|
|
|
#include "pimpl_impl.hpp"
|
|
|
|
class CandidateKeyFilter::impl final
|
|
{
|
|
public:
|
|
explicit impl (QAbstractItemModel const * referencing_model
|
|
, int referencing_key_column
|
|
, int referenced_key_column
|
|
, int referencing_key_role
|
|
, int referenced_key_role)
|
|
: referencing_ {referencing_model}
|
|
, referencing_key_column_ {referencing_key_column}
|
|
, referencing_key_role_ {referencing_key_role}
|
|
, referenced_key_column_ {referenced_key_column}
|
|
, referenced_key_role_ {referenced_key_role}
|
|
{
|
|
}
|
|
|
|
QAbstractItemModel const * referencing_;
|
|
int referencing_key_column_;
|
|
int referencing_key_role_;
|
|
int referenced_key_column_;
|
|
int referenced_key_role_;
|
|
QModelIndex active_key_;
|
|
};
|
|
|
|
CandidateKeyFilter::CandidateKeyFilter (QAbstractItemModel const * referencing_model
|
|
, QAbstractItemModel * referenced_model
|
|
, int referencing_key_column
|
|
, int referenced_key_column
|
|
, int referencing_key_role
|
|
, int referenced_key_role)
|
|
: QSortFilterProxyModel {nullptr} // ForeignKeyDelegate owns us
|
|
, m_ {referencing_model, referencing_key_column, referenced_key_column, referencing_key_role, referenced_key_role}
|
|
{
|
|
setSourceModel (referenced_model);
|
|
}
|
|
|
|
CandidateKeyFilter::~CandidateKeyFilter ()
|
|
{
|
|
}
|
|
|
|
void CandidateKeyFilter::set_active_key (QModelIndex const& index)
|
|
{
|
|
if (index.isValid () )
|
|
{
|
|
Q_ASSERT (index.column () == m_->referencing_key_column_);
|
|
m_->active_key_ = index;
|
|
}
|
|
invalidateFilter ();
|
|
}
|
|
|
|
bool CandidateKeyFilter::filterAcceptsRow (int candidate_row, QModelIndex const& candidate_parent) const
|
|
{
|
|
auto candidate_key = sourceModel ()->index (candidate_row, m_->referenced_key_column_, candidate_parent).data (m_->referenced_key_role_);
|
|
|
|
// Include the current key.
|
|
if (m_->active_key_.isValid () && candidate_key == m_->active_key_.data (m_->referencing_key_role_))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
// Filter out any candidates already in the referencing key rows.
|
|
return m_->referencing_->match (m_->referencing_->index (0, m_->referencing_key_column_), m_->referencing_key_role_, candidate_key, 1, Qt::MatchExactly).isEmpty ();
|
|
}
|