File: objectbrowser.cpp

package info (click to toggle)
vcmi 1.1.0%2Bdfsg-1
  • links: PTS, VCS
  • area: contrib
  • in suites: bookworm
  • size: 14,672 kB
  • sloc: cpp: 181,738; sh: 220; python: 178; ansic: 69; objc: 66; xml: 59; makefile: 34
file content (127 lines) | stat: -rw-r--r-- 3,373 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
 * objectbrowser.cpp, part of VCMI engine
 *
 * Authors: listed in file AUTHORS in main folder
 *
 * License: GNU General Public License v2.0 or later
 * Full text of license available in license.txt file, in main folder
 *
 */

#include "StdInc.h"
#include "objectbrowser.h"
#include "../lib/mapObjects/CObjectClassesHandler.h"

ObjectBrowserProxyModel::ObjectBrowserProxyModel(QObject *parent)
	: QSortFilterProxyModel{parent}, terrain(Terrain::ANY_TERRAIN)
{
}

bool ObjectBrowserProxyModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent) const
{
	bool result = QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);

	QModelIndex currentIndex = sourceModel()->index(source_row, 0, source_parent);
	int childCount = currentIndex.model()->rowCount(currentIndex);
	if(childCount)
		return false;

	auto item = dynamic_cast<QStandardItemModel*>(sourceModel())->itemFromIndex(currentIndex);
	if(!item)
		return result;

	if(!filterAcceptsRowText(source_row, source_parent))
		return false;

	if(terrain == Terrain::ANY_TERRAIN)
		return result;

	auto data = item->data().toJsonObject();
	if(data.empty())
		return result;

	auto objIdJson = data["id"];
	if(objIdJson == QJsonValue::Undefined)
		return result;

	auto objId = data["id"].toInt();
	auto objSubId = data["subid"].toInt();
	auto templateId = data["template"].toInt();

	auto factory = VLC->objtypeh->getHandlerFor(objId, objSubId);
	auto templ = factory->getTemplates()[templateId];

	result = result && templ->canBePlacedAt(terrain);

	//if we are here, just text filter will be applied
	return result;
}

bool ObjectBrowserProxyModel::filterAcceptsRowText(int source_row, const QModelIndex &source_parent) const
{
	if(source_parent.isValid())
	{
		if(filterAcceptsRowText(source_parent.row(), source_parent.parent()))
			return true;
	}

	QModelIndex index = sourceModel()->index(source_row, 0 ,source_parent);
	if(!index.isValid())
		return false;

	auto item = dynamic_cast<QStandardItemModel*>(sourceModel())->itemFromIndex(index);
	if(!item)
		return false;

	return (filter.isNull() || filter.isEmpty() || item->text().contains(filter, Qt::CaseInsensitive));
}

Qt::ItemFlags ObjectBrowserProxyModel::flags(const QModelIndex & index) const
{
	Qt::ItemFlags defaultFlags = QSortFilterProxyModel::flags(index);

	if (index.isValid())
		return Qt::ItemIsDragEnabled | defaultFlags;
	
	return defaultFlags;
}

QMimeData * ObjectBrowserProxyModel::mimeData(const QModelIndexList & indexes) const
{
	assert(indexes.size() == 1);
	
	auto * standardModel = qobject_cast<QStandardItemModel*>(sourceModel());
	assert(standardModel);
	
	QModelIndex index = indexes.front();
	
	if(!index.isValid())
		return nullptr;

	QMimeData * mimeData = new QMimeData;
	mimeData->setImageData(standardModel->itemFromIndex(mapToSource(index))->data());
	return mimeData;
}

ObjectBrowser::ObjectBrowser(QWidget * parent):
	QTreeView(parent)
{
	setDropIndicatorShown(false);
}

void ObjectBrowser::startDrag(Qt::DropActions supportedActions)
{
	logGlobal->info("Drag'n'drop: Start dragging object from ObjectBrowser");
	QDrag *drag = new QDrag(this);
	auto indexes = selectedIndexes();
	if(indexes.isEmpty())
		return;
	
	QMimeData * mimeData = model()->mimeData(indexes);
	if(!mimeData)
		return;
		
	drag->setMimeData(mimeData);

	Qt::DropAction dropAction = drag->exec(supportedActions);
}