QxtGlobalShortcut/examples/qxtflowview/fsimagemodel.cpp
2009-04-17 22:30:04 +03:00

158 lines
3.5 KiB
C++

#include "fsimagemodel.h"
#include <QFileInfo>
#include <QImage>
#include <QDebug>
#include <QThread>
struct FsImageModelImage
{
QFileInfo info;
QImage image;
};
FsImageModel::FsImageModel(QString path,QObject * parent ):QAbstractItemModel(parent)
{
dir = QDir::current();
if(!path.isEmpty())
dir = QDir(path);
connect(&watcher,SIGNAL(directoryChanged ( const QString & )),this,SLOT(directoryChanged ( const QString & )));
connect(&watcher,SIGNAL(fileChanged ( const QString & )),this,SLOT(fileChanged ( const QString & )));
watcher.addPath(dir.absolutePath());
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
QFileInfoList list = dir.entryInfoList();
for (int i = 0; i < list.size(); ++i)
{
FsImageModelImage * img= new FsImageModelImage;
img->info=list.at(i);
img->image.load(dir.absoluteFilePath(img->info.fileName()));
files.append(img);
watcher.addPath(dir.absoluteFilePath(img->info.fileName()));
}
}
FsImageModel::~FsImageModel()
{
qDeleteAll(files);
}
QModelIndex FsImageModel::index(int row, int column, const QModelIndex &parent) const
{
return createIndex ( row, column, files.at(row) );
}
QModelIndex FsImageModel::parent(const QModelIndex &index) const
{
return QModelIndex();
}
int FsImageModel::rowCount(const QModelIndex & parent ) const
{
if(parent.isValid())
return 0;
return files.count();
}
int FsImageModel::columnCount(const QModelIndex & parent ) const
{
return 1;
}
QVariant FsImageModel::data(const QModelIndex & index, int role ) const
{
FsImageModelImage* img=static_cast<FsImageModelImage*>(index.internalPointer());
if(role==Qt::DisplayRole)
return img->info.fileName();
if(role==Qt::DecorationRole)
return img->image;
return QVariant();
}
class Thread : public QThread
{
friend class FsImageModel;
};
void FsImageModel::directoryChanged ( const QString & path )
{
Q_ASSERT(path==dir.absolutePath());
QStringList org=watcher.files ();
QFileInfoList list = dir.entryInfoList();
for (int i = 0; i < list.size(); ++i)
{
QString path= dir.absoluteFilePath(list.at(i).fileName());
if(org.contains(path))
{
org.removeAll(path);
}
else
{
beginInsertRows (QModelIndex(),files.count(),files.count());
FsImageModelImage * img= new FsImageModelImage;
img->info=list.at(i);
int retry=100;
while(!img->image.load(path))
{
Thread::usleep(1000);
if(--retry<0)
{
break;
}
}; ///hax
files.append(img);
watcher.addPath(path);
endInsertRows ();
}
}
foreach(const QString &a, org)
fileChanged(a);
}
void FsImageModel::fileChanged ( const QString & path )
{
int i=0;
foreach(FsImageModelImage* img,files)
{
if(dir.absoluteFilePath(img->info.fileName())==path)
{
if(img->info.exists())
{
emit dataChanged ( index(i,0), index(i,0));
}
else
{
beginRemoveRows (QModelIndex(),i,i);
watcher.removePath(path);
delete files.at(i);
files.removeAt(i);
endRemoveRows ();
break;
}
break;
}
++i;
}
}