mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 13:30:52 -05:00 
			
		
		
		
	Working frequencies are mode dependent and a reset to defaults button has been added. Also re-factored much of the model and item delegate code to simplify several of the model implementations. Introduced a single routine called from main to register the custom types with Qt. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@5453 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
		
			
				
	
	
		
			90 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "CandidateKeyFilter.hpp"
 | 
						|
 | 
						|
#include <QModelIndex>
 | 
						|
#include <QAbstractItemModel>
 | 
						|
 | 
						|
#include "pimpl_impl.hpp"
 | 
						|
 | 
						|
class CandidateKeyFilter::impl final
 | 
						|
{
 | 
						|
public:
 | 
						|
  explicit impl (int referenced_key_column
 | 
						|
                 , int referenced_key_role
 | 
						|
                 , QAbstractItemModel const * referencing_model
 | 
						|
                 , int referencing_key_column
 | 
						|
                 , int referencing_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 * referenced_model
 | 
						|
                                        , int referenced_key_column
 | 
						|
                                        , QObject * parent
 | 
						|
                                        , int referenced_key_role)
 | 
						|
  : QSortFilterProxyModel {parent}
 | 
						|
  , m_ {referenced_key_column, referenced_key_role, nullptr, 0, Qt::EditRole}
 | 
						|
{
 | 
						|
  setSourceModel (referenced_model);
 | 
						|
}
 | 
						|
 | 
						|
CandidateKeyFilter::CandidateKeyFilter (QAbstractItemModel * referenced_model
 | 
						|
                                        , QAbstractItemModel const * referencing_model
 | 
						|
                                        , int referenced_key_column
 | 
						|
                                        , int referencing_key_column
 | 
						|
                                        , QObject * parent
 | 
						|
                                        , int referenced_key_role
 | 
						|
                                        , int referencing_key_role)
 | 
						|
  : QSortFilterProxyModel {parent}
 | 
						|
  , m_ {referenced_key_column, referenced_key_role, referencing_model, referencing_key_column, referencing_key_role}
 | 
						|
{
 | 
						|
  setSourceModel (referenced_model);
 | 
						|
}
 | 
						|
 | 
						|
CandidateKeyFilter::~CandidateKeyFilter ()
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void CandidateKeyFilter::set_active_key (QModelIndex const& index)
 | 
						|
{
 | 
						|
  if (m_->referencing_)
 | 
						|
    {
 | 
						|
      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
 | 
						|
{
 | 
						|
  if (!m_->referencing_)            // many to many passes all
 | 
						|
    {
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
 | 
						|
  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 ();
 | 
						|
}
 |