Krita Source Code Documentation
Loading...
Searching...
No Matches
KisResourceModel Class Reference

The KisResourceModel class provides the main access to resources. It is possible to filter the resources returned by the active status flag of the resources and the storages. More...

#include <KisResourceModel.h>

+ Inheritance diagram for KisResourceModel:

Classes

struct  Private
 

Public Member Functions

bool addResource (KoResourceSP resource, const QString &storageId=QString("")) override
 addResource adds the given resource to the database and storage. If the resource already exists in the given storage with md5, filename or name, the existing resource will be updated instead. If the existing resource was inactive, it will be active (undeleted).
 
bool exportResource (KoResourceSP resource, QIODevice *device) override
 exportResource exports a resource into a QIODevice
 
KoResourceSP importResource (const QString &filename, QIODevice *device, const bool allowOverwrite, const QString &storageId=QString("")) override
 importResource imports a resource from a QIODevice
 
KoResourceSP importResourceFile (const QString &filename, const bool allowOverwrite, const QString &storageId=QString("")) override
 importResourceFile
 
bool importWillOverwriteResource (const QString &fileName, const QString &storageLocation=QString()) const override
 importWillOverwriteResource checks is importing a resource with this filename will overwrite anything
 
QModelIndex indexForResource (KoResourceSP resource) const override
 indexFromResource
 
QModelIndex indexForResourceId (int resourceId) const override
 indexFromResource
 
 KisResourceModel (const QString &type, QObject *parent=0)
 
bool reloadResource (KoResourceSP resource) override
 reloadResource
 
bool renameResource (KoResourceSP resource, const QString &name) override
 renameResource name the given resource. The resource will have its name field reset, will be saved to the storage and there will be a new version created in the database.
 
KoResourceSP resourceForId (int id) const
 
KoResourceSP resourceForIndex (QModelIndex index=QModelIndex()) const override
 resourceForIndex returns a properly versioned and id'ed resource object
 
QVector< KoResourceSPresourcesForFilename (QString fileName) const
 
QVector< KoResourceSPresourcesForMD5 (const QString md5sum) const
 
QVector< KoResourceSPresourcesForName (QString name) const
 
bool setResourceActive (const QModelIndex &index, bool value) override
 setResourceActive changes 'active' state of the resource
 
void setResourceFilter (ResourceFilter filter) override
 
bool setResourceMetaData (KoResourceSP resource, QMap< QString, QVariant > metadata) override
 setResourceMetaData
 
void setStorageFilter (StorageFilter filter) override
 
void showOnlyUntaggedResources (bool showOnlyUntagged)
 
QVector< KisTagSPtagsForResource (int resourceId) const
 
bool updateResource (KoResourceSP resource) override
 updateResource creates a new version of the resource in the storage and in the database. This will also set the resource to active if it was inactive.
 
 ~KisResourceModel () override
 
- Public Member Functions inherited from KisAbstractResourceModel
bool setResourceInactive (const QModelIndex &index)
 
virtual ~KisAbstractResourceModel ()
 
- Public Member Functions inherited from KisAbstractResourceFilterInterface
virtual ~KisAbstractResourceFilterInterface ()
 

Protected Member Functions

bool filterAcceptsColumn (int source_column, const QModelIndex &source_parent) const override
 
bool filterAcceptsRow (int source_row, const QModelIndex &source_parent) const override
 
bool lessThan (const QModelIndex &source_left, const QModelIndex &source_right) const override
 

Private Member Functions

QVector< KoResourceSPfilterByColumn (const QString filter, KisAllResourcesModel::Columns column) const
 
bool filterResource (const QModelIndex &idx) const
 

Private Attributes

Private *const d
 

Additional Inherited Members

- Public Types inherited from KisAbstractResourceModel
enum  Columns {
  Id = 0 , StorageId , Name , Filename ,
  Tooltip , Thumbnail , Status , Location ,
  ResourceType , Tags , MD5 , LargeThumbnail ,
  Dirty , MetaData , ResourceActive , StorageActive ,
  BrokenStatus , BrokenStatusMessage
}
 The Columns enum indexes the columns in the model. To get the thumbnail for a particular resource, create the index with QModelIndex(row, Thumbnail). More...
 
- Public Types inherited from KisAbstractResourceFilterInterface
enum  ResourceFilter { ShowInactiveResources = 0 , ShowActiveResources , ShowAllResources }
 
enum  StorageFilter { ShowInactiveStorages = 0 , ShowActiveStorages , ShowAllStorages }
 

Detailed Description

The KisResourceModel class provides the main access to resources. It is possible to filter the resources returned by the active status flag of the resources and the storages.

Definition at line 368 of file KisResourceModel.h.

Constructor & Destructor Documentation

◆ KisResourceModel()

KisResourceModel::KisResourceModel ( const QString & type,
QObject * parent = 0 )

Definition at line 788 of file KisResourceModel.cpp.

789 : QSortFilterProxyModel(parent)
790 , d(new Private)
791{
792 setSourceModel(KisResourceModelProvider::resourceModel(type));
793}
static KisAllResourcesModel * resourceModel(const QString &resourceType)

References KisResourceModelProvider::resourceModel().

◆ ~KisResourceModel()

KisResourceModel::~KisResourceModel ( )
override

Definition at line 795 of file KisResourceModel.cpp.

796{
797 delete d;
798}

References d.

Member Function Documentation

◆ addResource()

bool KisResourceModel::addResource ( KoResourceSP resource,
const QString & storageId = QString("") )
overridevirtual

addResource adds the given resource to the database and storage. If the resource already exists in the given storage with md5, filename or name, the existing resource will be updated instead. If the existing resource was inactive, it will be active (undeleted).

Parameters
resourcethe resource itself
storageIdthe id of the storage (could be "memory" for temporary resources, the document's storage id for document storages or empty to save to the default resources folder
Returns
true if adding the resource succeeded.

Implements KisAbstractResourceModel.

Definition at line 896 of file KisResourceModel.cpp.

897{
898 KisAllResourcesModel *source = qobject_cast<KisAllResourcesModel*>(sourceModel());
899 bool updateInsteadOfAdd = false;
900 bool result = false;
901
902 // Check whether the resource already existed, in that case, we will update
903 // and possibly reactivate the resource
904 QSqlQuery q;
905
906 if (!q.prepare("SELECT resources.id\n"
907 ", resources.md5sum\n"
908 ", storages.location\n"
909 ", resource_types.name\n"
910 "FROM resources\n"
911 ", storages\n"
912 ", resource_types\n"
913 "WHERE resources.name = :name\n"
914 "AND resources.storage_id = storages.id\n"
915 "AND resources.resource_type_id = resource_types.id\n"
916 "AND resources.status = 0")) {
917 qWarning() << "Could not create KisResourceModel::addResource query" << q.lastError();
918 }
919
920 q.bindValue(":name", resource->name());
921
922 if (!q.exec()) {
923 qWarning() << "Could not execute KisResourceModel::addResource query" << q.lastError();
924 }
925
926 while (q.next()) {
927 int id = q.value(0).toInt();
928 QString md5sum = q.value(1).toString();
929 QString storageLocation = q.value(2).toString();
930 QString resourceType = q.value(3).toString();
931
932
933 QSqlQuery q2;
934
935 if (!q2.prepare("SELECT MAX(version)\n"
936 "FROM versioned_resources\n"
937 "WHERE resource_id = :id")) {
938 qWarning() << "Could not prepare versioned_resources query" << q.lastError();
939 }
940
941 q2.bindValue(":id", id);
942
943 if (!q2.exec()) {
944 qWarning() << "Could not execute versioned_resources query" << q.lastError();
945 }
946
947 if (!q2.first()) {
948 qWarning() << "No resource version found with id" << id;
949 }
950
951 q.first();
952
953 int version = q2.value(0).toInt();
954
955 if (resourceType == resource->resourceType().first) {
956 resource->setResourceId(id);
957 resource->setVersion(version);
958 resource->setMD5Sum(md5sum);
959 resource->setActive(true);
960 resource->setStorageLocation(storageLocation);
961 bool result = updateResource(resource);
962 updateInsteadOfAdd = result;
963 break;
964 }
965 }
966
967 if (!updateInsteadOfAdd) {
968 result = source->addResource(resource, storageId);
969 }
970
971 if (result) {
972 invalidate();
973 }
974
975 return result;
976}
QPointF q2
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
The KisAllresourcesModel class provides access to the cache database for a particular resource type....
bool updateResource(KoResourceSP resource) override
updateResource creates a new version of the resource in the storage and in the database....

References q2, source(), and updateResource().

◆ exportResource()

bool KisResourceModel::exportResource ( KoResourceSP resource,
QIODevice * device )
overridevirtual

exportResource exports a resource into a QIODevice

Exporting a resource as a binary blob is the only way to guarantee that its MD5 checksum is kept persistent. The underlying storage will just copy bytes into the device without doing any conversions

Parameters
resourcethe resource to be exported
devicedevice where the resource should be written to
Returns
true if export operation has been successful

Implements KisAbstractResourceModel.

Definition at line 886 of file KisResourceModel.cpp.

887{
888 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
889 bool res = false;
890 if (source) {
891 res = source->exportResource(resource, device);
892 }
893 return res;
894}

References source().

◆ filterAcceptsColumn()

bool KisResourceModel::filterAcceptsColumn ( int source_column,
const QModelIndex & source_parent ) const
overrideprotected

Definition at line 1014 of file KisResourceModel.cpp.

1015{
1016 return true;
1017}

◆ filterAcceptsRow()

bool KisResourceModel::filterAcceptsRow ( int source_row,
const QModelIndex & source_parent ) const
overrideprotected

Definition at line 1019 of file KisResourceModel.cpp.

1020{
1021 QModelIndex idx = sourceModel()->index(source_row, 0, source_parent);
1022
1023 if (idx.isValid()) {
1024 int id = idx.data(Qt::UserRole + KisAbstractResourceModel::Id).toInt();
1025
1027
1028 QString queryString = ("SELECT COUNT(*)\n"
1029 "FROM resources\n"
1030 ", storages\n"
1031 "WHERE resources.id IN (select resource_id FROM resource_tags WHERE active = 1)\n"
1032 "AND storages.id = resources.storage_id\n"
1033 "AND resources.id = :resource_id\n");
1034
1036 queryString.append("AND resources.status > 0\n");
1037 }
1038 else if (d->resourceFilter == ShowInactiveResources) {
1039 queryString.append("AND resources.status = 0\n");
1040 }
1041
1043 queryString.append("AND storages.active > 0\n");
1044 }
1045 else if (d->storageFilter == ShowInactiveStorages) {
1046 queryString.append("AND storages.active = 0\n");
1047 }
1048
1049 QSqlQuery q;
1050
1051 if (!q.prepare((queryString))) {
1052 qWarning() << "KisResourceModel: Could not prepare resource_tags query" << q.lastError();
1053 }
1054
1055 q.bindValue(":resource_id", id);
1056
1057 if (!q.exec()) {
1058 qWarning() << "KisResourceModel: Could not execute resource_tags query" << q.lastError() << q.boundValues();
1059 }
1060
1061 q.first();
1062 if (q.value(0).toInt() > 0) {
1063 return false;
1064 }
1065 }
1066 }
1067
1068 return filterResource(idx);
1069}
bool filterResource(const QModelIndex &idx) const

References d, filterResource(), KisAbstractResourceModel::Id, KisResourceModel::Private::resourceFilter, KisAbstractResourceFilterInterface::ShowActiveResources, KisAbstractResourceFilterInterface::ShowActiveStorages, KisAbstractResourceFilterInterface::ShowInactiveResources, KisAbstractResourceFilterInterface::ShowInactiveStorages, KisResourceModel::Private::showOnlyUntaggedResources, and KisResourceModel::Private::storageFilter.

◆ filterByColumn()

QVector< KoResourceSP > KisResourceModel::filterByColumn ( const QString filter,
KisAllResourcesModel::Columns column ) const
private

Definition at line 1079 of file KisResourceModel.cpp.

1080{
1081 QVector<KoResourceSP> resources;
1082 for (int i = 0; i < rowCount(); ++i) {
1083 QModelIndex idx = index(i, 0);
1084 if (idx.isValid() && data(idx, Qt::UserRole + column).toString() == filter) {
1085 resources << resourceForIndex(idx);
1086 }
1087 }
1088
1089 return resources;
1090}
KoResourceSP resourceForIndex(QModelIndex index=QModelIndex()) const override
resourceForIndex returns a properly versioned and id'ed resource object
QString toString(const QString &value)

References resourceForIndex().

◆ filterResource()

bool KisResourceModel::filterResource ( const QModelIndex & idx) const
private

Definition at line 1092 of file KisResourceModel.cpp.

1093{
1095 return true;
1096 }
1097
1098 ResourceFilter resourceActive = (ResourceFilter)sourceModel()->data(idx, Qt::UserRole + KisAbstractResourceModel::ResourceActive).toInt();
1099 StorageFilter storageActive = (StorageFilter)sourceModel()->data(idx, Qt::UserRole + KisAbstractResourceModel::StorageActive).toInt();
1100
1102 if (storageActive == d->storageFilter) {
1103 return true;
1104 }
1105 }
1106
1108 if (resourceActive == d->resourceFilter) {
1109 return true;
1110 }
1111 }
1112
1113 if ((storageActive == d->storageFilter) && (resourceActive == d->resourceFilter)) {
1114 return true;
1115 }
1116
1117 return false;
1118}
@ ResourceActive
Whether the current resource is active.
@ StorageActive
Whether the current resource's storage is active.

References d, KisAbstractResourceModel::ResourceActive, KisResourceModel::Private::resourceFilter, KisAbstractResourceFilterInterface::ShowAllResources, KisAbstractResourceFilterInterface::ShowAllStorages, KisAbstractResourceModel::StorageActive, and KisResourceModel::Private::storageFilter.

◆ importResource()

KoResourceSP KisResourceModel::importResource ( const QString & filename,
QIODevice * device,
const bool allowOverwrite,
const QString & storageId = QString("") )
overridevirtual

importResource imports a resource from a QIODevice

Importing a resource from a binary blob is the only way to guarantee that its MD5 checksum is kept persistent. The underlying storage will just copy bytes into its location.

Parameters
filenamefile name of the resource if preset. File name may be used for addressing the resource, so it is usually preferred to preserve it.
devicedevice where the resource should be read from
Returns
the loaded resource object

Implements KisAbstractResourceModel.

Definition at line 869 of file KisResourceModel.cpp.

870{
871 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
872 KoResourceSP res;
873 if (source) {
874 res = source->importResource(filename, device, allowOverwrite, storageId);
875 }
876 invalidate();
877 return res;
878}

References source().

◆ importResourceFile()

KoResourceSP KisResourceModel::importResourceFile ( const QString & filename,
const bool allowOverwrite,
const QString & storageId = QString("") )
overridevirtual

importResourceFile

Parameters
filename
Returns

Implements KisAbstractResourceModel.

Definition at line 858 of file KisResourceModel.cpp.

859{
860 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
861 KoResourceSP res;
862 if (source) {
863 res = source->importResourceFile(filename, allowOverwrite, storageId);
864 }
865 invalidate();
866 return res;
867}

References source().

◆ importWillOverwriteResource()

bool KisResourceModel::importWillOverwriteResource ( const QString & fileName,
const QString & storageLocation = QString() ) const
overridevirtual

importWillOverwriteResource checks is importing a resource with this filename will overwrite anything

If this function returns true, then importResource() is guaranteed to fail with 'allowOverwrite' set to false.

Parameters
filenamefile name of the resource if preset. File name may be used for addressing the resource, so it is usually preferred to preserve it.
Returns
true if the some existing will be overwritten while importing

Implements KisAbstractResourceModel.

Definition at line 880 of file KisResourceModel.cpp.

881{
882 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
883 return source && source->importWillOverwriteResource(fileName, storageLocation);
884}

References source().

◆ indexForResource()

QModelIndex KisResourceModel::indexForResource ( KoResourceSP resource) const
overridevirtual

indexFromResource

Parameters
resource
Returns

Implements KisAbstractResourceModel.

Definition at line 831 of file KisResourceModel.cpp.

832{
833 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
834 if (source) {
835 return mapFromSource(source->indexForResource(resource));
836 }
837 return QModelIndex();
838}

References source().

◆ indexForResourceId()

QModelIndex KisResourceModel::indexForResourceId ( int resourceId) const
overridevirtual

indexFromResource

Parameters
resourceIdresource id for which we want to get an index
Returns

Implements KisAbstractResourceModel.

Definition at line 840 of file KisResourceModel.cpp.

841{
842 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
843 if (source) {
844 return mapFromSource(source->indexForResourceId(resourceId));
845 }
846 return QModelIndex();
847}

References source().

◆ lessThan()

bool KisResourceModel::lessThan ( const QModelIndex & source_left,
const QModelIndex & source_right ) const
overrideprotected

Definition at line 1071 of file KisResourceModel.cpp.

1072{
1073 QString nameLeft = sourceModel()->data(source_left, Qt::UserRole + KisAbstractResourceModel::Name).toString();
1074 QString nameRight = sourceModel()->data(source_right, Qt::UserRole + KisAbstractResourceModel::Name).toString();
1075
1076 return nameLeft.toLower() < nameRight.toLower();
1077}

References KisAbstractResourceModel::Name.

◆ reloadResource()

bool KisResourceModel::reloadResource ( KoResourceSP resource)
overridevirtual

reloadResource

Parameters
resource
Returns

Implements KisAbstractResourceModel.

Definition at line 987 of file KisResourceModel.cpp.

988{
989 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
990 if (source) {
991 return source->reloadResource(resource);
992 }
993 return false;
994}

References source().

◆ renameResource()

bool KisResourceModel::renameResource ( KoResourceSP resource,
const QString & name )
overridevirtual

renameResource name the given resource. The resource will have its name field reset, will be saved to the storage and there will be a new version created in the database.

Parameters
resourceThe resource to rename
nameThe new name
Returns
true if the operation succeeded.

Implements KisAbstractResourceModel.

Definition at line 996 of file KisResourceModel.cpp.

997{
998 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
999 if (source) {
1000 return source->renameResource(resource, name);
1001 }
1002 return false;
1003}

References source().

◆ resourceForId()

KoResourceSP KisResourceModel::resourceForId ( int id) const

Definition at line 1121 of file KisResourceModel.cpp.

1122{
1123 KoResourceSP res = static_cast<KisAllResourcesModel*>(sourceModel())->resourceForId(id);
1124 QModelIndex idx = indexForResource(res);
1125 if (idx.isValid()) {
1126 return res;
1127 }
1128 return 0;
1129}
KoResourceSP resourceForId(int id) const
QModelIndex indexForResource(KoResourceSP resource) const override
indexFromResource

References indexForResource(), and resourceForId().

◆ resourceForIndex()

KoResourceSP KisResourceModel::resourceForIndex ( QModelIndex index = QModelIndex()) const
overridevirtual

resourceForIndex returns a properly versioned and id'ed resource object

Implements KisAbstractResourceModel.

Definition at line 822 of file KisResourceModel.cpp.

823{
824 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
825 if (source) {
826 return source->resourceForIndex(mapToSource(index));
827 }
828 return 0;
829}

References source().

◆ resourcesForFilename()

QVector< KoResourceSP > KisResourceModel::resourcesForFilename ( QString fileName) const

resourceForFilename returns the resources with the given filename that fit the current filters. Note that the filename does not include a path to the storage.

Returns
a resource if one is found, or 0 if none are found

Definition at line 1131 of file KisResourceModel.cpp.

1132{
1134
1135}
QVector< KoResourceSP > filterByColumn(const QString filter, KisAllResourcesModel::Columns column) const

References KisAbstractResourceModel::Filename, and filterByColumn().

◆ resourcesForMD5()

QVector< KoResourceSP > KisResourceModel::resourcesForMD5 ( const QString md5sum) const

◆ resourcesForName()

QVector< KoResourceSP > KisResourceModel::resourcesForName ( QString name) const

resourceForName returns the resources with the given name that fit the current filters.

Returns
a resource if one is found, or 0 if none are found

Definition at line 1137 of file KisResourceModel.cpp.

1138{
1140}

References filterByColumn(), and KisAbstractResourceModel::Name.

◆ setResourceActive()

bool KisResourceModel::setResourceActive ( const QModelIndex & index,
bool value )
overridevirtual

setResourceActive changes 'active' state of the resource

Parameters
indexthe index of the resource
valuenew 'active' state of the resource
Returns
true if the new state has been assigned successfully

Implements KisAbstractResourceModel.

Definition at line 849 of file KisResourceModel.cpp.

850{
851 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
852 if (source) {
853 return source->setResourceActive(mapToSource(index), value);
854 }
855 return false;
856}
float value(const T *src, size_t ch)

References source(), and value().

◆ setResourceFilter()

void KisResourceModel::setResourceFilter ( ResourceFilter filter)
overridevirtual

Select status of the resources that should be shown

Implements KisAbstractResourceFilterInterface.

Definition at line 800 of file KisResourceModel.cpp.

801{
802 if (d->resourceFilter != filter) {
803 d->resourceFilter = filter;
804 invalidateFilter();
805 }
806}

References d, and KisResourceModel::Private::resourceFilter.

◆ setResourceMetaData()

bool KisResourceModel::setResourceMetaData ( KoResourceSP resource,
QMap< QString, QVariant > metadata )
overridevirtual

setResourceMetaData

Parameters
metadata
Returns

Implements KisAbstractResourceModel.

Definition at line 1005 of file KisResourceModel.cpp.

1006{
1007 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
1008 if (source) {
1009 return source->setResourceMetaData(resource, metadata);
1010 }
1011 return false;
1012}

References source().

◆ setStorageFilter()

void KisResourceModel::setStorageFilter ( StorageFilter filter)
overridevirtual

Select status of the storages that should be shown

Implements KisAbstractResourceFilterInterface.

Definition at line 808 of file KisResourceModel.cpp.

809{
810 if (d->storageFilter != filter) {
811 d->storageFilter = filter;
812 invalidateFilter();
813 }
814}

References d, and KisResourceModel::Private::storageFilter.

◆ showOnlyUntaggedResources()

void KisResourceModel::showOnlyUntaggedResources ( bool showOnlyUntagged)

Definition at line 816 of file KisResourceModel.cpp.

817{
818 d->showOnlyUntaggedResources = showOnlyUntagged;
819 invalidateFilter();
820}

References d, and KisResourceModel::Private::showOnlyUntaggedResources.

◆ tagsForResource()

QVector< KisTagSP > KisResourceModel::tagsForResource ( int resourceId) const

Definition at line 1147 of file KisResourceModel.cpp.

1148{
1149 return static_cast<KisAllResourcesModel*>(sourceModel())->tagsForResource(resourceId);
1150}
QVector< KisTagSP > tagsForResource(int resourceId) const

References tagsForResource().

◆ updateResource()

bool KisResourceModel::updateResource ( KoResourceSP resource)
overridevirtual

updateResource creates a new version of the resource in the storage and in the database. This will also set the resource to active if it was inactive.

Note: if the storage does not support versioning, updating the resource will fail.

Parameters
resource
Returns
true if the resource was successful updated,

Implements KisAbstractResourceModel.

Definition at line 978 of file KisResourceModel.cpp.

979{
980 KisAbstractResourceModel *source = dynamic_cast<KisAbstractResourceModel*>(sourceModel());
981 if (source) {
982 return source->updateResource(resource);
983 }
984 return false;
985}

References source().

Member Data Documentation

◆ d

Private* const KisResourceModel::d
private

Definition at line 433 of file KisResourceModel.h.


The documentation for this class was generated from the following files: