20 #include <ctkXnatDataModel.h> 21 #include <ctkXnatExperiment.h> 22 #include <ctkXnatFile.h> 23 #include <ctkXnatProject.h> 24 #include <ctkXnatResource.h> 25 #include <ctkXnatResourceCatalogXmlParser.h> 26 #include <ctkXnatResourceFolder.h> 27 #include <ctkXnatScan.h> 28 #include <ctkXnatScanFolder.h> 29 #include <ctkXnatSubject.h> 38 const QModelIndex &start,
int role,
const QVariant &value,
int hits, Qt::MatchFlags
flags)
const 40 QModelIndexList result;
41 uint matchType = flags & 0x0F;
42 Qt::CaseSensitivity cs = flags & Qt::MatchCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
43 bool recurse = flags & Qt::MatchRecursive;
44 bool wrap = flags & Qt::MatchWrap;
45 bool allHits = (hits == -1);
47 QModelIndex p = parent(start);
48 int from = start.row();
52 for (
int i = 0; (wrap && i < 2) || (!wrap && i < 1); ++i)
54 for (
int r = from; (r < to) && (allHits || result.count() < hits); ++r)
56 QModelIndex idx = index(r, start.column(), p);
59 QVariant v =
data(idx, role);
61 if (matchType == Qt::MatchExactly)
69 text = value.toString();
70 QString t = v.toString();
74 if (!QRegExp(text, cs).exactMatch(t))
77 case Qt::MatchWildcard:
78 if (!QRegExp(text, cs, QRegExp::Wildcard).exactMatch(t))
81 case Qt::MatchStartsWith:
82 if (!t.startsWith(text, cs))
85 case Qt::MatchEndsWith:
86 if (!t.endsWith(text, cs))
89 case Qt::MatchFixedString:
90 if (t.compare(text, cs) != 0)
93 case Qt::MatchContains:
95 if (!t.contains(text, cs))
99 if (recurse && hasChildren(idx))
101 result +=
match(index(0, idx.column(), idx),
103 (text.isEmpty() ? value : text),
104 (allHits ? -1 : hits - result.count()),
119 ctkXnatTreeModel::fetchMore(index);
121 catch (
const ctkRuntimeException& e)
130 if (!index.isValid())
135 if (role == Qt::DecorationRole)
137 ctkXnatObject *xnatObject = this->xnatObject(index);
140 if (dynamic_cast<ctkXnatDataModel *>(xnatObject))
142 path =
":/xnat-module/xnat-server.png";
144 else if (dynamic_cast<ctkXnatProject *>(xnatObject))
146 path =
":/xnat-module/xnat-project.png";
148 else if (dynamic_cast<ctkXnatSubject *>(xnatObject))
150 path =
":/xnat-module/xnat-subject.png";
152 else if (dynamic_cast<ctkXnatExperiment *>(xnatObject))
154 path =
":/xnat-module/xnat-experiment.png";
156 else if (dynamic_cast<ctkXnatResourceFolder *>(xnatObject))
158 path =
":/xnat-module/xnat-folder.png";
160 else if (dynamic_cast<ctkXnatResource *>(xnatObject))
162 path =
":/xnat-module/xnat-resource.png";
164 else if (dynamic_cast<ctkXnatScanFolder *>(xnatObject))
166 path =
":/xnat-module/xnat-folder.png";
168 else if (dynamic_cast<ctkXnatScan *>(xnatObject))
170 path =
":/xnat-module/xnat-scan.png";
172 else if (dynamic_cast<ctkXnatFile *>(xnatObject))
174 path =
":/xnat-module/xnat-file.png";
178 return ctkXnatTreeModel::data(index, role);
182 const QMimeData *
data, Qt::DropAction action,
int ,
int ,
const QModelIndex &parent)
184 if (action == Qt::IgnoreAction)
188 bool returnVal(
false);
194 ctkXnatObject *parentXnatObj = this->xnatObject(parent);
202 return Qt::CopyAction;
207 Qt::ItemFlags defaultFlags = ctkXnatTreeModel::flags(index);
211 bool droppingAllowed =
dynamic_cast<ctkXnatSubject *
>(this->xnatObject(index)) !=
nullptr;
212 droppingAllowed |=
dynamic_cast<ctkXnatExperiment *
>(this->xnatObject(index)) !=
nullptr;
213 droppingAllowed |=
dynamic_cast<ctkXnatResource *
>(this->xnatObject(index)) !=
nullptr;
214 droppingAllowed |=
dynamic_cast<ctkXnatResourceFolder *
>(this->xnatObject(index)) !=
nullptr;
219 return Qt::ItemIsDropEnabled | defaultFlags;
230 ctkXnatObject *QmitkXnatTreeModel::InternalGetXnatObjectFromUrl(
const QString &xnatObjectType,
232 ctkXnatObject *parent)
235 int start = url.lastIndexOf(xnatObjectType);
239 start += xnatObjectType.length();
240 int length = url.indexOf(
"/", start);
244 QList<ctkXnatObject *> children = parent->children();
245 foreach (ctkXnatObject *child, children)
247 if (url.indexOf(child->resourceUri()) != -1)
257 QModelIndex index = this->index(0, 0, QModelIndex());
258 ctkXnatObject *currentXnatObject =
nullptr;
259 currentXnatObject = this->xnatObject(index);
260 if (currentXnatObject !=
nullptr)
263 ctkXnatObject *project =
nullptr;
264 project = this->InternalGetXnatObjectFromUrl(
"projects/", url, currentXnatObject);
267 ctkXnatObject *subject =
nullptr;
268 if (project !=
nullptr)
270 currentXnatObject = project;
271 subject = this->InternalGetXnatObjectFromUrl(
"subjects/", url, project);
275 ctkXnatObject *experiment =
nullptr;
276 if (subject !=
nullptr)
278 currentXnatObject = subject;
279 experiment = this->InternalGetXnatObjectFromUrl(
"experiments/", url, subject);
283 ctkXnatObject *scan =
nullptr;
284 if (experiment !=
nullptr)
286 currentXnatObject = experiment;
287 scan = this->InternalGetXnatObjectFromUrl(
"scans/", url, experiment);
293 QList<ctkXnatObject *> scans = scan->children();
294 foreach (ctkXnatObject *child, scans)
296 if (url.indexOf(child->resourceUri()) != -1)
303 currentXnatObject->fetch();
304 QList<ctkXnatObject *> bla = currentXnatObject->children();
305 foreach (ctkXnatObject *child, bla)
307 if (child->name() ==
"Resources")
void Error(const QModelIndex &idx)
ctkXnatObject * GetXnatObjectFromUrl(const QString &)
virtual Qt::DropActions supportedDropActions()
static QList< mitk::DataNode * > ToDataNodePtrList(const QByteArray &ba)
static const QString DataNodePtrs
QVariant data(const QModelIndex &index, int role) const override
void ResourceDropped(const QList< mitk::DataNode *> &, ctkXnatObject *, const QModelIndex &)
QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const override
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
void fetchMore(const QModelIndex &index) override
static bool HandleErrorMessage(const char *_errorMsg)
Qt::ItemFlags flags(const QModelIndex &index) const override