filtercontainer.cpp
1 #include "filtercontainer.h" 2 #include "filter.h" 3 #include <QtQml> 4 5 namespace qqsfpm { 6 7 /*! 8 \qmltype FilterContainer 9 \qmlabstract 10 \inqmlmodule SortFilterProxyModel 11 \ingroup FilterAttached 12 \brief Abstract interface for types containing \l {Filter}{Filters}. 13 14 \section2 Types implementing this interface: 15 \annotatedlist FilterContainer 16 */ 17 18 QList<Filter*> FilterContainer::filters() const 19 { 20 return m_filters; 21 } 22 23 void FilterContainer::appendFilter(Filter* filter) 24 { 25 m_filters.append(filter); 26 onFilterAppended(filter); 27 } 28 29 void FilterContainer::removeFilter(Filter* filter) 30 { 31 m_filters.removeOne(filter); 32 onFilterRemoved(filter); 33 } 34 35 void FilterContainer::clearFilters() 36 { 37 m_filters.clear(); 38 onFiltersCleared(); 39 } 40 41 QQmlListProperty<Filter> FilterContainer::filtersListProperty() 42 { 43 return QQmlListProperty<Filter>(reinterpret_cast<QObject*>(this), &m_filters, 44 &FilterContainer::append_filter, 45 &FilterContainer::count_filter, 46 &FilterContainer::at_filter, 47 &FilterContainer::clear_filters); 48 } 49 50 void FilterContainer::append_filter(QQmlListProperty<Filter>* list, Filter* filter) 51 { 52 if (!filter) 53 return; 54 55 FilterContainer* that = reinterpret_cast<FilterContainer*>(list->object); 56 that->appendFilter(filter); 57 } 58 59 qqsfpm::FilterContainer::sizetype FilterContainer::count_filter(QQmlListProperty<Filter>* list) 60 { 61 QList<Filter*>* filters = static_cast<QList<Filter*>*>(list->data); 62 return filters->count(); 63 } 64 65 Filter* FilterContainer::at_filter(QQmlListProperty<Filter>* list, qqsfpm::FilterContainer::sizetype index) 66 { 67 QList<Filter*>* filters = static_cast<QList<Filter*>*>(list->data); 68 return filters->at(index); 69 } 70 71 void FilterContainer::clear_filters(QQmlListProperty<Filter> *list) 72 { 73 FilterContainer* that = reinterpret_cast<FilterContainer*>(list->object); 74 that->clearFilters(); 75 } 76 77 FilterContainerAttached::FilterContainerAttached(QObject* object) : QObject(object), 78 m_filter(qobject_cast<Filter*>(object)) 79 { 80 if (!m_filter) 81 qmlWarning(object) << "FilterContainer must be attached to a Filter"; 82 } 83 84 FilterContainerAttached::~FilterContainerAttached() 85 { 86 if (m_filter && m_container) { 87 FilterContainer* container = qobject_cast<FilterContainer*>(m_container.data()); 88 container->removeFilter(m_filter); 89 } 90 } 91 92 /*! 93 \qmlattachedproperty bool FilterContainer::container 94 This attached property allows you to include in a \l FilterContainer a \l Filter that 95 has been instantiated outside of the \l FilterContainer, for example in an Instantiator. 96 */ 97 QObject* FilterContainerAttached::container() const 98 { 99 return m_container; 100 } 101 102 void FilterContainerAttached::setContainer(QObject* object) 103 { 104 if (m_container == object) 105 return; 106 107 FilterContainer* container = qobject_cast<FilterContainer*>(object); 108 if (object && !container) 109 qmlWarning(parent()) << "container must inherits from FilterContainer, " << object->metaObject()->className() << " provided"; 110 111 if (m_container && m_filter) 112 qobject_cast<FilterContainer*>(m_container.data())->removeFilter(m_filter); 113 114 m_container = container ? object : nullptr; 115 if (container && m_filter) 116 container->appendFilter(m_filter); 117 118 Q_EMIT containerChanged(); 119 } 120 121 FilterContainerAttached* FilterContainerAttached::qmlAttachedProperties(QObject* object) 122 { 123 return new FilterContainerAttached(object); 124 } 125 126 }