2
0

objectbrowser.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * objectbrowser.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "objectbrowser.h"
  12. #include "../lib/mapObjectConstructors/AObjectTypeHandler.h"
  13. #include "../lib/mapObjectConstructors/CObjectClassesHandler.h"
  14. #include "../lib/mapObjects/ObjectTemplate.h"
  15. #include "../lib/GameLibrary.h"
  16. ObjectBrowserProxyModel::ObjectBrowserProxyModel(QObject *parent)
  17. : QSortFilterProxyModel{parent}, terrain(ETerrainId::ANY_TERRAIN)
  18. {
  19. }
  20. bool ObjectBrowserProxyModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent) const
  21. {
  22. bool result = QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
  23. QModelIndex currentIndex = sourceModel()->index(source_row, 0, source_parent);
  24. int childCount = currentIndex.model()->rowCount(currentIndex);
  25. if(childCount)
  26. return false;
  27. auto item = dynamic_cast<QStandardItemModel*>(sourceModel())->itemFromIndex(currentIndex);
  28. if(!item)
  29. return result;
  30. if(!filterAcceptsRowText(source_row, source_parent))
  31. return false;
  32. if(terrain == ETerrainId::ANY_TERRAIN)
  33. return result;
  34. auto data = item->data().toJsonObject();
  35. if(data.empty())
  36. return result;
  37. auto objIdJson = data["id"];
  38. if(objIdJson == QJsonValue::Undefined)
  39. return result;
  40. auto objId = data["id"].toInt();
  41. auto objSubId = data["subid"].toInt();
  42. auto templateId = data["template"].toInt();
  43. auto factory = LIBRARY->objtypeh->getHandlerFor(objId, objSubId);
  44. auto templ = factory->getTemplates()[templateId];
  45. result = result && templ->canBePlacedAt(terrain);
  46. //if we are here, just text filter will be applied
  47. return result;
  48. }
  49. bool ObjectBrowserProxyModel::filterAcceptsRowText(int source_row, const QModelIndex &source_parent) const
  50. {
  51. if(source_parent.isValid())
  52. {
  53. if(filterAcceptsRowText(source_parent.row(), source_parent.parent()))
  54. return true;
  55. }
  56. QModelIndex index = sourceModel()->index(source_row, 0 ,source_parent);
  57. if(!index.isValid())
  58. return false;
  59. auto item = dynamic_cast<QStandardItemModel*>(sourceModel())->itemFromIndex(index);
  60. if(!item)
  61. return false;
  62. auto data = item->data().toJsonObject();
  63. return (filter.isNull() || filter.isEmpty()
  64. || item->text().contains(filter, Qt::CaseInsensitive)
  65. || data["typeName"].toString().contains(filter, Qt::CaseInsensitive));
  66. }
  67. Qt::ItemFlags ObjectBrowserProxyModel::flags(const QModelIndex & index) const
  68. {
  69. Qt::ItemFlags defaultFlags = QSortFilterProxyModel::flags(index);
  70. if (index.isValid())
  71. return Qt::ItemIsDragEnabled | defaultFlags;
  72. return defaultFlags;
  73. }
  74. QMimeData * ObjectBrowserProxyModel::mimeData(const QModelIndexList & indexes) const
  75. {
  76. assert(indexes.size() == 1);
  77. auto * standardModel = qobject_cast<QStandardItemModel*>(sourceModel());
  78. assert(standardModel);
  79. QModelIndex index = indexes.front();
  80. if(!index.isValid())
  81. return nullptr;
  82. QMimeData * mimeData = new QMimeData;
  83. mimeData->setImageData(standardModel->itemFromIndex(mapToSource(index))->data());
  84. return mimeData;
  85. }
  86. ObjectBrowser::ObjectBrowser(QWidget * parent):
  87. QTreeView(parent)
  88. {
  89. setDropIndicatorShown(false);
  90. }
  91. void ObjectBrowser::startDrag(Qt::DropActions supportedActions)
  92. {
  93. logGlobal->info("Drag'n'drop: Start dragging object from ObjectBrowser");
  94. auto indexes = selectedIndexes();
  95. if(indexes.isEmpty())
  96. return;
  97. QMimeData * mimeData = model()->mimeData(indexes);
  98. if(!mimeData)
  99. return;
  100. auto *drag = new QDrag(this);
  101. drag->setMimeData(mimeData);
  102. drag->exec(supportedActions);
  103. }