/ filters / filtercontainer.cpp
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  }