QString DirViewItem::fullName() const { QString fn = m_name; DirViewItem *item = parent(); while (item && item->type() != DirViewItem::Type_Root) { fn.prepend("/"); fn.prepend(item->name()); item = item->parent(); } return fn; }
DirViewItemRoot * MPDParseUtils::parseDirViewItems(const QByteArray * const data) { QList<QByteArray> lines = data->split('\n'); DirViewItemRoot * rootItem = new DirViewItemRoot(""); DirViewItem * currentDir = rootItem; QStringList currentDirList; int amountOfLines = lines.size(); for (int i = 0; i < amountOfLines; i++) { QString line(lines.at(i)); if (line.startsWith("file: ")) { line.remove(0, 6); QStringList parts = line.split("/"); if (currentDir->type() == DirViewItem::Type_Root) static_cast<DirViewItemRoot *>(currentDir)->insertFile(parts.at(parts.size()-1)); else static_cast<DirViewItemDir *>(currentDir)->insertFile(parts.at(parts.size()-1)); } else if (line.startsWith("directory: ")) { line.remove(0, 11); QStringList parts = line.split("/"); /* Check how much matches */ int depth = 0; for (int j = 0; j < currentDirList.size() && j < parts.size(); j++) { if (currentDirList.at(j) != parts.at(j)) break; depth++; } for (int j = currentDirList.size(); j > depth; j--) { currentDir = currentDir->parent(); } if (currentDir->type() == DirViewItem::Type_Root) currentDir = static_cast<DirViewItemRoot *>(currentDir)->createDirectory(parts.at(parts.size()-1)); else currentDir = static_cast<DirViewItemDir *>(currentDir)->createDirectory(parts.at(parts.size()-1)); currentDirList = parts; } } return rootItem; }
bool DirViewProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { if (!filterEnabled) { return true; } if (!isChildOfRoot(sourceParent)) { return true; } const QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); DirViewItem *item = static_cast<DirViewItem *>(index.internalPointer()); QModelIndex idx=index.parent(); QStringList strings; // Traverse back up tree, so we get parent strings... while (idx.isValid()) { DirViewItem *i = static_cast<DirViewItem *>(idx.internalPointer()); if (DirViewItem::Type_Dir!=i->type()) { break; } strings << i->data(); idx=idx.parent(); } if (DirViewItem::Type_Dir==item->type()) { // Check *all* children... if (filterAcceptsDirViewItem(item, strings)) { return true; } } else { strings << item->data(); return matchesFilter(strings); } return false; }