From 7bda040f35c6be15dbf1ba007de28849a0803cae Mon Sep 17 00:00:00 2001 From: Arno Date: Sat, 16 Mar 2013 16:13:05 +0100 Subject: First shot at SmDirModel Gotta take a break here. Hopefully this will end up in a custom QFilesystemModel, but I'm hitting so many bugs on the way. Some things haven't worked for ages, I guess. Anyway, the watcher doesn't do anythying right now, still fixing bugs... --- smdirmodel.cpp | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 smdirmodel.cpp (limited to 'smdirmodel.cpp') diff --git a/smdirmodel.cpp b/smdirmodel.cpp new file mode 100644 index 0000000..0a0578b --- /dev/null +++ b/smdirmodel.cpp @@ -0,0 +1,127 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include +#include +#include + +#include + +#include "smdirmodel.h" +#include "smdirwatcher.h" +#include "smtreeitem.h" +#include "helper.h" + +SmDirModel::SmDirModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mHeaders(headers){ + mWatch = new SmDirWatcher(this); +} + +SmDirModel::~SmDirModel(){ + delete mWatch; +} + +QVariant SmDirModel::data(const QModelIndex &index, int role) const{ + if(!index.isValid()){ + return QVariant(); + } + SmTreeItem *i = itemAt(index); + switch (role){ + case NameRole: + return i->data(Name); + case SizeRole: + return i->data(Size); + case TypeRole: + return i->data(Type); + case CreatedRole: + return i->data(Created); + case Md5sumRole: + return i->data(Md5sum); + case DurationRole: + return i->data(Duration); + case BitrateRole: + return i->data(Bitrate); + case FullPathRole: + return i->data(FullPath); + default: + return SmTreeModel::data(index, role); + } +} + +bool SmDirModel::setData(const QModelIndex &index, const QVariant &value, int role){ + if(!index.isValid()){ + return false; + } + if(role == Qt::EditRole && index.column() == Name){ + QString newName = value.toString(); + if(newName.contains(QDir::separator())){ + return false; + } + SmTreeItem *i = itemAt(index); + QString old = i->data(FullPath).toString(); + QString dir = fileInfo(index).absolutePath(); + QString newPath = QString("%1/%2").arg(dir).arg(newName); + QFile::rename(old, newPath); + return true; + } + return false; +} + +bool SmDirModel::isDir(const QModelIndex &idx) const { + if(!idx.isValid()){ + return false; + } + SmTreeItem *i = itemAt(idx); + QFileInfo fi(i->data(FullPath).toString()); + return fi.isDir(); +} + +QFileInfo SmDirModel::fileInfo(const QModelIndex &idx) const { + if(!idx.isValid()){ + return QFileInfo(); + } + SmTreeItem *i = itemAt(idx); + return QFileInfo(i->data(FullPath).toString()); +} + +void SmDirModel::setDir(const QString &dir){ + QFileInfo fi(dir); + if(!fi.isDir()){ + return; + } + mCur = dir; + populate(); + mWatch->setDir(dir); +} + +void SmDirModel::populate(){ + SmTreeItem *root = new SmTreeItem(mHeaders.size()); + QDir d = QDir(mCur); + foreach(QFileInfo fi, d.entryInfoList()){ + if(fi.fileName() == "."){ + continue; + } + QList data = fileData(fi); + SmTreeItem *n = new SmTreeItem(data, root); + root->appendChild(n); + } + setRoot(root); +} + +const QList SmDirModel::fileData(const QFileInfo &fi) const{ + QList data; + data << fi.fileName() << fi.size(); + QString mime = Helper::mimeType(fi.absoluteFilePath()); + data << mime; + data << fi.lastModified(); + QList si = QList() << QVariant() << QVariant(); + if(mime.startsWith("video")){ + si = Helper::duration(fi.absoluteFilePath()); + } + data << Helper::md5Sum(fi.absoluteFilePath()); + data << si << fi.absoluteFilePath(); + return data; +} -- cgit v1.2.3-70-g09d2