You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libfm-qt-packaging/src/foldermodelitem.cpp

147 lines
4.5 KiB

/*
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include "foldermodelitem.h"
#include <QDateTime>
#include <QPainter>
#include "utilities.h"
#include "core/userinfocache.h"
namespace Fm {
FolderModelItem::FolderModelItem(const std::shared_ptr<const Fm::FileInfo>& _info):
info{_info} {
thumbnails.reserve(2);
}
FolderModelItem::FolderModelItem(const FolderModelItem& other):
info{other.info},
thumbnails{other.thumbnails} {
}
FolderModelItem::~FolderModelItem() {
}
QString FolderModelItem::ownerName() const {
QString name;
auto user = Fm::UserInfoCache::globalInstance()->userFromId(info->uid());
if(user) {
name = user->name();
}
return name;
}
QString FolderModelItem::ownerGroup() const {
auto group = Fm::UserInfoCache::globalInstance()->groupFromId(info->gid());
return group ? group->name() : QString();
}
const QString &FolderModelItem::displayMtime() const {
if(dispMtime_.isEmpty()) {
auto mtime = QDateTime::fromMSecsSinceEpoch(info->mtime() * 1000);
dispMtime_ = mtime.toString(Qt::SystemLocaleShortDate);
}
return dispMtime_;
}
const QString& FolderModelItem::displaySize() const {
if(!info->isDir()) {
// FIXME: choose IEC or SI units
dispSize_ = Fm::formatFileSize(info->size(), false);
}
return dispSize_;
}
bool FolderModelItem::isCut() const {
return !cutFilesHashSet_.expired() || info->isCut();
}
void FolderModelItem::bindCutFiles(const std::shared_ptr<const HashSet>& cutFilesHashSet) {
cutFilesHashSet_ = cutFilesHashSet;
}
// find thumbnail of the specified size
// The returned thumbnail item is temporary and short-lived
// If you need to use the struct later, copy it to your own struct to keep it.
FolderModelItem::Thumbnail* FolderModelItem::findThumbnail(int size, bool transparent) {
QVector<Thumbnail>::iterator it;
Thumbnail* transThumb = nullptr;
for(it = thumbnails.begin(); it != thumbnails.end(); ++it) {
if(it->size == size) {
if(it->status != ThumbnailLoaded) {
return it;
}
else { // it->status == ThumbnailLoaded
if(it->transparent == false && transparent == true
&& size < 48 /* (dirty) needed only for 'compact' and 'details list' view */ ) {
transThumb = it; // save thumb to add transparency later
}
else {
return it; // an image of the same size and transparency is found
}
}
}
}
if(transThumb) {
QImage image(transThumb->image);
if(!image.hasAlphaChannel()) {
image = image.convertToFormat(QImage::Format_ARGB32);
}
// add transparency to image
QPainter p;
p.begin(&image);
p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
p.fillRect(image.rect(), QColor(0, 0, 0, 115 /* alpha 45% */));
p.end();
// add image to thumbnails
Thumbnail thumbnail;
thumbnail.status = ThumbnailLoaded;
thumbnail.image = image;
thumbnail.size = size;
thumbnail.transparent = true;
thumbnails.append(thumbnail);
}
else if(it == thumbnails.end()) {
Thumbnail thumbnail;
thumbnail.status = ThumbnailNotChecked;
thumbnail.size = size;
thumbnail.transparent = false;
thumbnails.append(thumbnail);
}
return &thumbnails.back();
}
// remove cached thumbnail of the specified size
void FolderModelItem::removeThumbnail(int size) {
QVector<Thumbnail>::iterator it;
for(it = thumbnails.begin(); it != thumbnails.end(); ++it) {
if(it->size == size) { // an image of the same size is found
thumbnails.erase(it);
break;
}
}
}
} // namespace Fm