новые иконки в OpenBoard
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.
OpenBoard/src/board/UBLibraryController.cpp

719 lines
25 KiB

#include "UBLibraryController.h"
#include "frameworks/UBFileSystemUtils.h"
#include "frameworks/UBPlatformUtils.h"
#include "frameworks/UBDesktopServices.h"
#include "core/UBApplication.h"
#include "core/UBPersistenceManager.h"
#include "core/UBSettings.h"
#include "core/UBSetting.h"
#include "core/UBApplicationController.h"
#include "domain/UBAbstractWidget.h"
#include "domain/UBGraphicsScene.h"
#include "domain/UBGraphicsSvgItem.h"
#include "domain/UBGraphicsPixmapItem.h"
#include "domain/UBGraphicsVideoItem.h"
#include "domain/UBGraphicsWidgetItem.h"
#include "tools/UBToolsManager.h"
#include "board/UBBoardView.h"
#include "UBBoardController.h"
#include "gui/UBThumbnailWidget.h"
static quint32 magicNumber = 0xACDCAFE0;
static QString favoriteVirtualPath = "$favorite$";
UBLibraryController::UBLibraryController(QWidget *pParentWidget, UBBoardController *pBoardController) :
QObject(pParentWidget),
mParentWidget(pParentWidget),
mBoardController(pBoardController),
mLastItemOffsetIndex(0)
{
readFavoriteList();
mAudioStandardDirectoryPath = QUrl::fromLocalFile(UBDesktopServices::storageLocation(QDesktopServices::MusicLocation));
userPath(mAudioStandardDirectoryPath);
mVideoStandardDirectoryPath = QUrl::fromLocalFile(UBDesktopServices::storageLocation(QDesktopServices::MoviesLocation));
userPath(mVideoStandardDirectoryPath);
mPicturesStandardDirectoryPath = QUrl::fromLocalFile(UBDesktopServices::storageLocation(QDesktopServices::PicturesLocation));
userPath(mPicturesStandardDirectoryPath);
mInteractiveUserDirectoryPath = QUrl::fromLocalFile(UBSettings::settings()->uniboardInteractiveUserDirectory());
createInternalWidgetItems();
}
bool UBLibraryController::canItemsOnElementBeDeleted(UBLibElement *pElement)
{
return !pElement->path().toLocalFile().startsWith(UBSettings::settings()->uniboardShapeLibraryDirectory());
}
void UBLibraryController::createInternalWidgetItems()
{
QStringList toolUris = UBToolsManager::manager()->allToolIDs();
foreach(QString toolUri, toolUris)
{
UBToolsManager::UBToolDescriptor tool = UBToolsManager::manager()->toolByID(toolUri);
UBLibElement *newTool = new UBLibElement(eUBLibElementType_InteractiveItem, QUrl(tool.id), tool.label);
QImage toolImage = tool.icon.toImage();
newTool->setThumbnail(&toolImage);
newTool->setInformation(tool.label + " " + tool.version);
mInternalLibElements << newTool;
}
}
void UBLibraryController::createNewFolder(QString name, UBLibElement *parentElem)
{
Q_ASSERT(parentElem);
Q_ASSERT(parentElem->type() == eUBLibElementType_Folder);
QUrl qsPath = QUrl::fromLocalFile(parentElem->path().toLocalFile() + "/" + name);
createDirectory(qsPath);
}
void UBLibraryController::createDirectory(QUrl& pDirPath)
{
if(!QFileInfo(pDirPath.toLocalFile()).exists())
QDir().mkpath(pDirPath.toLocalFile());
}
void UBLibraryController::routeItem(QString& pItem, QString pMiddleDirectory)
{
QFileInfo itemToRoute(pItem);
QString mimetype = UBFileSystemUtils::mimeTypeFromFileName(itemToRoute.fileName());
QString destination("");
if(mimetype.contains("audio"))
destination = mAudioStandardDirectoryPath.toLocalFile();
else if (mimetype.contains("video"))
destination = mVideoStandardDirectoryPath.toLocalFile();
else if (mimetype.contains("image"))
destination = mPicturesStandardDirectoryPath.toLocalFile();
else if (mimetype.contains("application"))
destination = UBSettings::settings()->uniboardInteractiveUserDirectory();
else{
return;
}
if(!destination.isEmpty()){
if(!pMiddleDirectory.isEmpty()){
destination = destination + "/" + pMiddleDirectory;
QUrl url = QUrl::fromLocalFile(destination);
createDirectory(url);
}
destination = UBFileSystemUtils::normalizeFilePath(destination + "/" + itemToRoute.fileName());
QFile::copy(pItem, destination);
}
}
void UBLibraryController::importImageOnLibrary(QImage& pImage)
{
if(!pImage.isNull()){
QDateTime now = QDateTime::currentDateTime();
QString filePath = mPicturesStandardDirectoryPath.toLocalFile() + "/ImportedImage-" + now.toString("dd-MM-yyyy hh-mm-ss") + ".png";
filePath = UBFileSystemUtils::normalizeFilePath(filePath);
pImage.save(filePath);
UBApplication::showMessage(tr("Added 1 Image to Library"));
}
}
void UBLibraryController::importItemOnLibrary(QString& pItemString)
{
pItemString.replace("\r","");
pItemString.replace("\n","");
QFileInfo itemToImport(pItemString);
bool isZip = false;
if(itemToImport.isDir() || (isZip = UBFileSystemUtils::isAZipFile(pItemString))){
if(pItemString.contains(".wgt",Qt::CaseInsensitive) || pItemString.contains(".wdgt",Qt::CaseInsensitive)){
QString destination = UBSettings::settings()->uniboardInteractiveUserDirectory() + "/" + itemToImport.fileName();
if(isZip)
UBFileSystemUtils::expandZipToDir(pItemString,destination);
else{
if(pItemString.endsWith("/")) pItemString.chop(1);
UBFileSystemUtils::copyDir(pItemString, destination + QFileInfo(pItemString).fileName() + "/");
}
return;
}
QStringList allFiles = UBFileSystemUtils::allFiles(pItemString);
QString pathBeforeCurrentDir = pItemString;
pathBeforeCurrentDir.replace(UBFileSystemUtils::lastPathComponent(pathBeforeCurrentDir), "");
if(pathBeforeCurrentDir.endsWith("//"))
pathBeforeCurrentDir.chop(1);
foreach(QString eachFile, allFiles){
QString intermediateDirectory = eachFile;
intermediateDirectory = intermediateDirectory.remove(pathBeforeCurrentDir);
intermediateDirectory = intermediateDirectory.remove(QFileInfo(eachFile).fileName());
routeItem(eachFile,intermediateDirectory);
}
}
else{
routeItem(pItemString);
}
}
void UBLibraryController::userPath(QUrl& pPath)
{
pPath = QUrl::fromLocalFile(pPath.toLocalFile() + "/Sankore");
createDirectory(pPath);
}
QList<UBLibElement*> UBLibraryController::rootCategoriesList()
{
QList<UBLibElement*> categories;
UBLibElement* element = new UBLibElement(eUBLibElementType_Folder, mAudioStandardDirectoryPath, tr("Audios", "Audio category element"));
QImage* categoryImage = new QImage(":images/libpalette/AudiosCategory.svg");
element->setThumbnail(categoryImage);
element->setMoveable(false);
categories << element;
element = new UBLibElement(eUBLibElementType_Folder, mVideoStandardDirectoryPath, tr("Movies", "Movies category element"));
categoryImage = new QImage(":images/libpalette/MoviesCategory.svg");
element->setThumbnail(categoryImage);
element->setMoveable(false);
categories << element;
element = new UBLibElement(eUBLibElementType_Folder, mPicturesStandardDirectoryPath, tr("Pictures", "Pictures category element"));
categoryImage = new QImage(":images/libpalette/PicturesCategory.svg");
element->setThumbnail(categoryImage);
element->setMoveable(false);
categories << element;
QString path = UBSettings::settings()->uniboardShapeLibraryDirectory();
categoryImage = new QImage(":images/libpalette/ShapesCategory.svg");
element = new UBLibElement(eUBLibElementType_Folder, QUrl::fromLocalFile(path), tr("Shapes", "Shapes category element"));
element->setThumbnail(categoryImage);
element->setMoveable(false);
categories << element;
categoryImage = new QImage(":images/libpalette/ApplicationsCategory.svg");
element = new UBLibElement(eUBLibElementType_Folder, mInteractiveUserDirectoryPath, tr("Applications", "Applications category element"));
element->setThumbnail(categoryImage);
element->setMoveable(false);
categories << element;
categoryImage = new QImage(":images/libpalette/FavoritesCategory.svg");
element = new UBLibElement(eUBLibElementType_VirtualFolder, favoriteVirtualPath, tr("Favorite", "Favorite category element"));
element->setThumbnail(categoryImage);
element->setMoveable(false);
categories << element;
categoryImage = new QImage(":images/libpalette/InteractivesCategory.svg");
mInteractiveCategoryPath = QUrl::fromLocalFile(UBSettings::settings()->uniboardGipLibraryDirectory());
element = new UBLibElement(eUBLibElementType_Folder, mInteractiveCategoryPath, tr("Interactives", "Interactives category element"));
element->setThumbnail(categoryImage);
element->setMoveable(false);
categories << element;
categories << UBLibElement::trashElement();
return categories;
}
QImage* UBLibraryController::createThumbnail(UBLibElement* pElement)
{
QString thumbnailPath = UBFileSystemUtils::thumbnailPath(pElement->path().toLocalFile());
QString mimetype = UBFileSystemUtils::mimeTypeFromFileName(pElement->path().toLocalFile());
UBApplication::showMessage(tr("Creating image thumbnail for %1.").arg(pElement->name()));
if (mimetype.contains("audio"))
thumbnailPath = ":images/libpalette/soundIcon.svg";
else if (mimetype.contains("video"))
thumbnailPath = ":images/libpalette/movieIcon.svg";
else {
if (pElement->extension().startsWith("svg", Qt::CaseInsensitive) || pElement->extension().startsWith("svgz", Qt::CaseInsensitive)) {
thumbnailPath = pElement->path().toLocalFile();
UBThumbnailSvg(pElement->path().toLocalFile());
}
else {
QPixmap pix(pElement->path().toLocalFile());
if (!pix.isNull()) {
pix = pix.scaledToWidth(qMin(UBSettings::maxThumbnailWidth, pix.width()), Qt::SmoothTransformation);
pix.save(thumbnailPath);
UBThumbnailPixmap pixmap(pix);
UBPlatformUtils::hideFile(thumbnailPath);
}
else{
thumbnailPath = ":images/libpalette/notFound.png";
}
}
}
return new QImage(thumbnailPath);
}
QImage* UBLibraryController::thumbnailForFile(UBLibElement* pElement)
{
QString thumbnailPath = UBFileSystemUtils::thumbnailPath(pElement->path().toLocalFile());
if (!thumbnailPath.length())
qWarning() << "thumbnailForFile impossible to create thumbnail path for the element " + pElement->path().toLocalFile();
if (QFileInfo(thumbnailPath).exists())
return new QImage(thumbnailPath);
else
return createThumbnail(pElement);
}
QList<UBLibElement*> UBLibraryController::addVirtualElementsForItemPath(const QString& pPath)
{
QList<UBLibElement*> content;
if (pPath == mInteractiveUserDirectoryPath.toLocalFile()){
content << listElementsInPath(UBSettings::settings()->uniboardInteractiveLibraryDirectory());
content << listElementsInPath(UBSettings::settings()->uniboardInteractiveFavoritesDirectory());
content << mInternalLibElements;
}
else if (pPath == mPicturesStandardDirectoryPath.toLocalFile()){
QUrl path = QUrl::fromLocalFile(UBSettings::settings()->uniboardImageLibraryDirectory());
userPath(path);
content << listElementsInPath(path.toLocalFile());
}
return content;
}
QList<UBLibElement*> UBLibraryController::listElementsInPath(const QString& pPath)
{
QList<UBLibElement*> content;
QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(pPath);
QFileInfoList::iterator fileInfo;
for (fileInfo = fileInfoList.begin(); fileInfo != fileInfoList.end(); fileInfo += 1) {
eUBLibElementType fileType = fileInfo->isDir() ? eUBLibElementType_Folder : eUBLibElementType_Item;
QString fileName = fileInfo->fileName();
if (UBFileSystemUtils::mimeTypeFromFileName(fileName).contains("application")) {
fileType = eUBLibElementType_InteractiveItem;
}
// This is necessary because of the w3c widget directory (xxxx.wgt).
QString itemName = (fileType != eUBLibElementType_Item) ? fileName : fileInfo->completeBaseName();
UBLibElement *element = new UBLibElement(fileType, QUrl::fromLocalFile(fileInfo->absoluteFilePath()), itemName);
if (fileType == eUBLibElementType_Folder) {
QImage* directoryImage = new QImage(":images/libpalette/folder.svg");
element->setThumbnail(directoryImage);
}
else if (fileType == eUBLibElementType_Item) {
if (element->path().toLocalFile().contains(".thumbnail."))
continue;
element->setThumbnail(thumbnailForFile(element));
}
content << element;
}
content << addVirtualElementsForItemPath(pPath);
return content;
}
QList<UBLibElement*> UBLibraryController::listElementsInVirtualForlder(UBLibElement* pElement)
{
Q_UNUSED(pElement);
return mFavoriteList;
}
void UBLibraryController::moveContent(QList<UBLibElement*> sourceList, UBLibElement *pDestination)
{
if (pDestination->type() != eUBLibElementType_Folder)
qWarning() << "moveContent the destination element isn't a directory";
foreach (UBLibElement* eachSource, sourceList) {
if (!eachSource || pDestination->path().toLocalFile() == eachSource->path().toLocalFile() || eachSource->type() == eUBLibElementType_VirtualFolder)
continue;
if (QFileInfo(eachSource->path().toLocalFile()).isDir())
UBFileSystemUtils::moveDir(eachSource->path().toLocalFile(), pDestination->path().toLocalFile() + "/" + eachSource->name());
else {
QFile(eachSource->path().toLocalFile()).copy(pDestination->path().toLocalFile() + "/" + eachSource->name() + "." + eachSource->extension());
QFile::remove(eachSource->path().toLocalFile());
QString thumbnailPath = UBFileSystemUtils::thumbnailPath(eachSource->path().toLocalFile());
if (thumbnailPath.length() && QFileInfo(thumbnailPath).exists()) {
QString thumbnailFileName = UBFileSystemUtils::lastPathComponent(thumbnailPath);
QFile(thumbnailPath).copy(pDestination->path().toLocalFile() + "/" + thumbnailFileName);
QFile::remove(thumbnailPath);
}
}
}
}
void UBLibraryController::trashElements(QList<UBLibElement*> trashList)
{
moveContent(trashList, UBLibElement::trashElement());
removeFromFavorite(trashList);
}
void UBLibraryController::emptyElementsOnTrash( QList<UBLibElement*> elementsList)
{
foreach(UBLibElement* eachElement, elementsList) {
if (eachElement->type() == eUBLibElementType_Folder)
UBFileSystemUtils::deleteDir(eachElement->path().toLocalFile());
else
QFile::remove(eachElement->path().toLocalFile());
}
}
QList<UBLibElement*> UBLibraryController::getContent(UBLibElement *element)
{
QList<UBLibElement*> elementsList;
switch (element->type()) {
case eUBLibElementType_Category: {
elementsList = rootCategoriesList();
break;
}
case eUBLibElementType_VirtualFolder: {
elementsList = listElementsInVirtualForlder(element);
break;
}
case eUBLibElementType_Folder: {
elementsList = listElementsInPath(element->path().toLocalFile());
break;
}
case eUBLibElementType_Item: {
qWarning() << "You are browsing a file";
break;
}
default:
// We should never come here...
Q_ASSERT(false);
break;
}
return elementsList;
}
UBLibraryController::~UBLibraryController()
{
//NOOP
}
void UBLibraryController::setItemAsBackground(UBLibElement* image)
{
if (!activeScene()){
qDebug() << "No active scene";
return;
}
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(image->path().toLocalFile());
if(mimeType == "image/svg+xml"){
QUrl url(QUrl::fromLocalFile(image->path().toLocalFile()));
QGraphicsSvgItem* boardItem = activeScene()->addSvg(url, QPointF(0, 0));
activeScene()->setAsBackgroundObject(boardItem, true, true);
}
else{
QPixmap pix(image->path().toLocalFile());
UBGraphicsPixmapItem* boardItem = activeScene()->addPixmap(pix, QPointF(0, 0));
activeScene()->setAsBackgroundObject(boardItem, true);
}
}
void UBLibraryController::addItemToPage(UBLibElement* item)
{
QList<QUrl> list;
list << QUrl::fromLocalFile(item->path().toLocalFile());
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(item->path().toLocalFile());
if (mimeType.contains("image")){
addImagesToCurrentPage(list);
}
else if (mimeType.contains("audio")){
addAudiosToCurrentPage(list);
}
else if (mimeType.contains("video")){
addVideosToCurrentPage(list);
}
else if (mimeType.contains("application")){
addInteractivesToCurrentPage(list);
}
else if (mimeType.isEmpty() && item->type() == eUBLibElementType_InteractiveItem){
// Those conditions allow us to detect internal app like
// mask, ruler, compass and protractor
list.clear();
list << item->path().toString().replace("file:","");
addInteractivesToCurrentPage(list);
}
else{
UBApplication::showMessage(tr("Adding to page failed for item %1.").arg(item->name()));
}
}
void UBLibraryController::removeBackground()
{
if (activeScene())
activeScene()->setAsBackgroundObject(0);
}
UBGraphicsScene* UBLibraryController::activeScene()
{
if (mBoardController->activeDocument())
return mBoardController->activeScene();
return 0;
}
void UBLibraryController::persistFavoriteList()
{
QFile file(UBSettings::libraryPaletteFavoriteListFilePath());
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
//magic number
out << magicNumber;
out << (quint32)mFavoriteList.count();
foreach(UBLibElement* eachElement, mFavoriteList)
{
out << (quint32)eachElement->type();
out << eachElement->path();
out << eachElement->information();
out << eachElement->name();
out << eachElement->extension();
}
file.close();
}
void UBLibraryController::readFavoriteList()
{
QFile file(UBSettings::libraryPaletteFavoriteListFilePath());
file.open(QIODevice::ReadOnly);
QDataStream in(&file); // read the data serialized from the file
quint32 magicNumber;
quint32 numberOfElements;
in >> magicNumber >> numberOfElements;
for(quint32 i = 0; i < numberOfElements; i += 1){
quint32 type;
QString path;
QString info;
QString name;
QString extension;
in >> type >> path >> info >> name >> extension;
UBLibElement* eachElement = new UBLibElement((eUBLibElementType)type, path, name);
eachElement->setInformation(info);
eachElement->setExtension(extension);
eachElement->setThumbnail(thumbnailForFile(eachElement));
mFavoriteList << eachElement;
}
file.close();
persistFavoriteList();
}
UBLibElement* UBLibraryController::isOnFavoriteList(UBLibElement * element)
{
foreach(UBLibElement* eachElement, mFavoriteList)
if(eachElement->path() == element->path())
return eachElement;
return 0;
}
void UBLibraryController::addToFavorite(QList<UBLibElement*> elementList)
{
foreach(UBLibElement* eachElement, elementList){
if(!isOnFavoriteList(eachElement))
mFavoriteList << eachElement;
}
persistFavoriteList();
}
void UBLibraryController::removeFromFavorite(QList<UBLibElement*> elementList)
{
foreach(UBLibElement* eachElement, elementList){
UBLibElement* elementToRemove = isOnFavoriteList(eachElement);
if(elementToRemove)
mFavoriteList.removeOne(elementToRemove);
}
persistFavoriteList();
}
QRectF UBLibraryController::visibleSceneRect() {
QRectF visibleSceneRect(0, 0, 0, 0);
if (activeScene() && mBoardController && mBoardController->controlView()) {
QPointF topLeftCorner = mBoardController->controlGeometry().topLeft();
QPointF bottomRightCorner =
mBoardController->controlGeometry().bottomRight();
QPointF sceneTopLeft = mBoardController->controlView()->mapToScene(
topLeftCorner.toPoint());
QPointF sceneBottomRight = mBoardController->controlView()->mapToScene(
bottomRightCorner.toPoint());
visibleSceneRect.setTopLeft(sceneTopLeft);
visibleSceneRect.setBottomRight(sceneBottomRight);
}
return visibleSceneRect;
}
void UBLibraryController::addImagesToCurrentPage(const QList<QUrl>& images) {
QPointF pos = visibleSceneRect().topLeft();
foreach(const QUrl url, images)
{
mLastItemOffsetIndex++;
mLastItemOffsetIndex = qMin(mLastItemOffsetIndex, 5);
QGraphicsItem* itemInScene = 0;
if (activeScene()) {
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(
url.toString());
//TODO UB 4.x move this logic to the scene ..
if (mimeType == "image/svg+xml") {
itemInScene = activeScene()->addSvg(url, pos);
} else {
itemInScene = activeScene()->addPixmap(QPixmap(
url.toLocalFile()), pos);
}
}
if (itemInScene) {
itemInScene = activeScene()->scaleToFitDocumentSize(itemInScene, false, UBSettings::objectInControlViewMargin);
itemInScene->setPos(QPoint(pos.x() + 50 * mLastItemOffsetIndex, pos.y() + 50 * mLastItemOffsetIndex));
}
}
}
void UBLibraryController::addVideosToCurrentPage(const QList<QUrl>& videos) {
QPointF pos = visibleSceneRect().topLeft();
foreach(const QUrl url, videos)
{
mLastItemOffsetIndex++;
mLastItemOffsetIndex = qMin(mLastItemOffsetIndex, 5);
UBGraphicsVideoItem* itemInScene = UBApplication::boardController->addVideo(url, false, pos);
itemInScene->setPos(QPoint(pos.x() + 50 * mLastItemOffsetIndex, pos.y() + 50 * mLastItemOffsetIndex));
}
}
void UBLibraryController::addAudiosToCurrentPage(const QList<QUrl>& sounds) {
QPointF topLeftPos = visibleSceneRect().topLeft();
QPointF pos = topLeftPos;
foreach(const QUrl url, sounds)
{
mLastItemOffsetIndex++;
mLastItemOffsetIndex = qMin(mLastItemOffsetIndex, 5);
pos = QPointF(topLeftPos.x() + 50 * mLastItemOffsetIndex,
topLeftPos.y() + 50 * mLastItemOffsetIndex);
UBApplication::boardController->addAudio(url, false, pos);
}
}
void UBLibraryController::addInteractivesToCurrentPage(
const QList<QUrl>& widgets) {
foreach(const QUrl url, widgets)
{
mBoardController->downloadURL(url, QPointF(0, 0));
}
}
QString UBLibraryController::favoritePath()
{
return favoriteVirtualPath;
}
UBLibElement::UBLibElement() {
mType = eUBLibElementType_Category;
mName = QObject::tr("/Home", "Category list label on navigation tool bar");
mbMoveable = false;
}
UBLibElement::UBLibElement(eUBLibElementType type, const QUrl &path, const QString &name)
{
mType = type;
mPath = path;
mName = name;
mInfo = "";
mbMoveable = true;
if (type == eUBLibElementType_Folder)
mThumbnail = QImage(":images/libpalette/folder.svg");
if (type == eUBLibElementType_InteractiveItem)
mThumbnail = QImage(UBAbstractWidget::iconFilePath(path));
if (type == eUBLibElementType_Item)
mExtension = QFileInfo(path.toLocalFile()).completeSuffix();
if(type == eUBLibElementType_VirtualFolder || type == eUBLibElementType_Category)
mbMoveable = false;
}
UBLibElement::~UBLibElement()
{
//NOOP
}
UBChainedLibElement::UBChainedLibElement(UBLibElement *pElem, UBChainedLibElement *pNextElem)
{
mpElem = pElem;
mpNextElem = pNextElem;
}
UBChainedLibElement::~UBChainedLibElement()
{
if (NULL != mpNextElem) {
delete mpNextElem;
mpNextElem = NULL;
}
}
void UBChainedLibElement::setNextElement(UBChainedLibElement *nextElem)
{
mpNextElem = nextElem;
}
UBLibElement* UBLibElement::trashElement()
{
static UBLibElement *trashElement;
if (trashElement)
return trashElement;
trashElement = new UBLibElement(eUBLibElementType_Folder, UBSettings::trashLibraryPaletteDirPath(), QObject::tr("Trash", "Pictures category element"));
QImage *categoryImage = new QImage(":images/libpalette/TrashCategory.svg");
trashElement->setThumbnail(categoryImage);
trashElement->setMoveable(false);
return trashElement;
}