objectbrowser.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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/mapObjects/CObjectClassesHandler.h"
  13. ObjectBrowserProxyModel::ObjectBrowserProxyModel(QObject *parent)
  14. : QSortFilterProxyModel{parent}, terrain(Terrain::ANY_TERRAIN)
  15. {
  16. }
  17. bool ObjectBrowserProxyModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent) const
  18. {
  19. bool result = QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
  20. QModelIndex currentIndex = sourceModel()->index(source_row, 0, source_parent);
  21. int childCount = currentIndex.model()->rowCount(currentIndex);
  22. if(childCount)
  23. return false;
  24. auto item = dynamic_cast<QStandardItemModel*>(sourceModel())->itemFromIndex(currentIndex);
  25. if(!item)
  26. return result;
  27. if(!filterAcceptsRowText(source_row, source_parent))
  28. return false;
  29. if(terrain == Terrain::ANY_TERRAIN)
  30. return result;
  31. auto data = item->data().toJsonObject();
  32. if(data.empty())
  33. return result;
  34. auto objIdJson = data["id"];
  35. if(objIdJson == QJsonValue::Undefined)
  36. return result;
  37. auto objId = data["id"].toInt();
  38. auto objSubId = data["subid"].toInt();
  39. auto templateId = data["template"].toInt();
  40. auto factory = VLC->objtypeh->getHandlerFor(objId, objSubId);
  41. auto templ = factory->getTemplates()[templateId];
  42. result = result && templ->canBePlacedAt(terrain);
  43. //if we are here, just text filter will be applied
  44. return result;
  45. }
  46. bool ObjectBrowserProxyModel::filterAcceptsRowText(int source_row, const QModelIndex &source_parent) const
  47. {
  48. if(source_parent.isValid())
  49. {
  50. if(filterAcceptsRowText(source_parent.row(), source_parent.parent()))
  51. return true;
  52. }
  53. QModelIndex index = sourceModel()->index(source_row, 0 ,source_parent);
  54. if(!index.isValid())
  55. return false;
  56. auto item = dynamic_cast<QStandardItemModel*>(sourceModel())->itemFromIndex(index);
  57. if(!item)
  58. return false;
  59. return (filter.isNull() || filter.isEmpty() || item->text().contains(filter, Qt::CaseInsensitive));
  60. }
  61. Qt::ItemFlags ObjectBrowserProxyModel::flags(const QModelIndex & index) const
  62. {
  63. Qt::ItemFlags defaultFlags = QSortFilterProxyModel::flags(index);
  64. if (index.isValid())
  65. return Qt::ItemIsDragEnabled | defaultFlags;
  66. return defaultFlags;
  67. }
  68. QStringList ObjectBrowserProxyModel::mimeTypes() const
  69. {
  70. QStringList types;
  71. types << "application/vcmi.object";
  72. return types;
  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. QByteArray encodedData;
  81. QDataStream stream(&encodedData, QIODevice::WriteOnly);
  82. if(!index.isValid())
  83. return nullptr;
  84. auto text = standardModel->itemFromIndex(mapToSource(index))->data();
  85. stream << text;
  86. QMimeData * mimeData = new QMimeData;
  87. mimeData->setData("application/vcmi.object", encodedData);
  88. return mimeData;
  89. }
  90. ObjectBrowser::ObjectBrowser(QWidget * parent):
  91. QTreeView(parent)
  92. {
  93. setDropIndicatorShown(false);
  94. }
  95. void ObjectBrowser::startDrag(Qt::DropActions supportedActions)
  96. {
  97. QDrag *drag = new QDrag(this);
  98. auto indexes = selectedIndexes();
  99. if(indexes.isEmpty())
  100. return;
  101. QMimeData * mimeData = model()->mimeData(indexes);
  102. if(!mimeData)
  103. return;
  104. drag->setMimeData(mimeData);
  105. Qt::DropAction dropAction = drag->exec();
  106. }