| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | #include "CandidateKeyFilter.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QModelIndex>
 | 
					
						
							|  |  |  | #include <QAbstractItemModel>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "pimpl_impl.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CandidateKeyFilter::impl final | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   explicit impl (int referenced_key_column | 
					
						
							|  |  |  |                  , int referenced_key_role | 
					
						
							|  |  |  |                  , QAbstractItemModel const * referencing_model | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |                  , int referencing_key_column | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |                  , int referencing_key_role) | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |     : 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_; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  | CandidateKeyFilter::CandidateKeyFilter (QAbstractItemModel * referenced_model | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |                                         , int referenced_key_column | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |                                         , QObject * parent | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |                                         , int referenced_key_role) | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   : 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} | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   setSourceModel (referenced_model); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CandidateKeyFilter::~CandidateKeyFilter () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CandidateKeyFilter::set_active_key (QModelIndex const& index) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   if (m_->referencing_) | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |       if (index.isValid () ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           Q_ASSERT (index.column () == m_->referencing_key_column_); | 
					
						
							|  |  |  |           m_->active_key_ = index; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       invalidateFilter (); | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool CandidateKeyFilter::filterAcceptsRow (int candidate_row, QModelIndex const& candidate_parent) const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-28 23:22:17 +00:00
										 |  |  |   if (!m_->referencing_)            // many to many passes all
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 01:57:47 +00:00
										 |  |  |   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 (); | 
					
						
							|  |  |  | } |