objectbrowser.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "objectbrowser.h"
  2. #include "../lib/mapObjects/CObjectClassesHandler.h"
  3. ObjectBrowser::ObjectBrowser(QObject *parent)
  4. : QSortFilterProxyModel{parent}, terrain(Terrain::ANY)
  5. {
  6. }
  7. bool ObjectBrowser::filterAcceptsRow(int source_row, const QModelIndex & source_parent) const
  8. {
  9. bool result = QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
  10. QModelIndex currentIndex = sourceModel()->index(source_row, 0, source_parent);
  11. int childCount = currentIndex.model()->rowCount(currentIndex);
  12. if(childCount)
  13. return false;
  14. auto item = dynamic_cast<QStandardItemModel*>(sourceModel())->itemFromIndex(currentIndex);
  15. if(!item)
  16. return result;
  17. if(!filterAcceptsRowText(source_row, source_parent))
  18. return false;
  19. if(terrain == Terrain::ANY)
  20. return result;
  21. auto data = item->data().toJsonObject();
  22. if(data.empty())
  23. return result;
  24. auto objIdJson = data["id"];
  25. if(objIdJson == QJsonValue::Undefined)
  26. return result;
  27. auto objId = data["id"].toInt();
  28. auto objSubId = data["subid"].toInt();
  29. auto templateId = data["template"].toInt();
  30. auto factory = VLC->objtypeh->getHandlerFor(objId, objSubId);
  31. auto templ = factory->getTemplates()[templateId];
  32. result = result & templ->canBePlacedAt(terrain);
  33. //text filter
  34. return result;
  35. }
  36. bool ObjectBrowser::filterAcceptsRowText(int source_row, const QModelIndex &source_parent) const
  37. {
  38. if(source_parent.isValid())
  39. {
  40. if(filterAcceptsRowText(source_parent.row(), source_parent.parent()))
  41. return true;
  42. }
  43. QModelIndex index = sourceModel()->index(source_row, 0 ,source_parent);
  44. if(!index.isValid())
  45. return false;
  46. auto item = dynamic_cast<QStandardItemModel*>(sourceModel())->itemFromIndex(index);
  47. if(!item)
  48. return false;
  49. return (filter.isNull() || filter.isEmpty() || item->text().contains(filter, Qt::CaseInsensitive));
  50. }