• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • graphics API Reference
  • KDE Home
  • Contact Us
 

digikam

  • extragear
  • graphics
  • digikam
  • core
  • libs
  • database
  • item
  • scanner
itemscanner_history.cpp
Go to the documentation of this file.
1 /* ============================================================
2  *
3  * This file is a part of digiKam project
4  * https://www.digikam.org
5  *
6  * Date : 2007-09-19
7  * Description : Scanning a single item - history metadata helper.
8  *
9  * Copyright (C) 2007-2013 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10  * Copyright (C) 2013-2019 by Gilles Caulier <caulier dot gilles at gmail dot com>
11  *
12  * This program is free software; you can redistribute it
13  * and/or modify it under the terms of the GNU General
14  * Public License as published by the Free Software Foundation;
15  * either version 2, or (at your option)
16  * any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * ============================================================ */
24 
25 #include "itemscanner_p.h"
26 
27 namespace Digikam
28 {
29 
30 void ItemScanner::scanImageHistory()
31 {
34  d->commit.historyXml = d->metadata.getItemHistory();
35  d->commit.uuid = d->metadata.getItemUniqueId();
36 }
37 
38 void ItemScanner::commitImageHistory()
39 {
40  if (!d->commit.historyXml.isEmpty())
41  {
42  CoreDbAccess().db()->setItemHistory(d->scanInfo.id, d->commit.historyXml);
43  // Delay history resolution by setting this tag:
44  // Resolution depends on the presence of other images, possibly only when the scanning process has finished
45  CoreDbAccess().db()->addItemTag(d->scanInfo.id, TagsCache::instance()->
46  getOrCreateInternalTag(InternalTagName::needResolvingHistory()));
47  d->hasHistoryToResolve = true;
48  }
49 
50  if (!d->commit.uuid.isNull())
51  {
52  CoreDbAccess().db()->setImageUuid(d->scanInfo.id, d->commit.uuid);
53  }
54 }
55 
56 void ItemScanner::scanImageHistoryIfModified()
57 {
58  // If a file has a modified history, it must have a new UUID
59  QString previousUuid = CoreDbAccess().db()->getImageUuid(d->scanInfo.id);
60  QString currentUuid = d->metadata.getItemUniqueId();
61 
62  if (!currentUuid.isEmpty() && previousUuid != currentUuid)
63  {
64  scanImageHistory();
65  }
66 }
67 
68 bool ItemScanner::resolveImageHistory(qlonglong id, QList<qlonglong>* needTaggingIds)
69 {
70  ImageHistoryEntry history = CoreDbAccess().db()->getItemHistory(id);
71  return resolveImageHistory(id, history.history, needTaggingIds);
72 }
73 
74 bool ItemScanner::resolveImageHistory(qlonglong imageId, const QString& historyXml,
75  QList<qlonglong>* needTaggingIds)
76 {
79  if (historyXml.isNull())
80  {
81  return true; // "true" means nothing is left to resolve
82  }
83 
84  DImageHistory history = DImageHistory::fromXml(historyXml);
85 
86  if (history.isNull())
87  {
88  return true;
89  }
90 
91  ItemHistoryGraph graph;
92  graph.addScannedHistory(history, imageId);
93 
94  if (!graph.hasEdges())
95  {
96  return true;
97  }
98 
99  QPair<QList<qlonglong>, QList<qlonglong> > cloud = graph.relationCloudParallel();
100  CoreDbAccess().db()->addImageRelations(cloud.first, cloud.second, DatabaseRelation::DerivedFrom);
101 
102  int needResolvingTag = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::needResolvingHistory());
103  int needTaggingTag = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::needTaggingHistoryGraph());
104 
105  // remove the needResolvingHistory tag from all images in graph
106  CoreDbAccess().db()->removeTagsFromItems(graph.allImageIds(), QList<int>() << needResolvingTag);
107 
108  // mark a single image from the graph (sufficient for find the full relation cloud)
109  QList<ItemInfo> roots = graph.rootImages();
110 
111  if (!roots.isEmpty())
112  {
113  CoreDbAccess().db()->addItemTag(roots.first().id(), needTaggingTag);
114 
115  if (needTaggingIds)
116  {
117  *needTaggingIds << roots.first().id();
118  }
119  }
120 
121  return !graph.hasUnresolvedEntries();
122 }
123 
124 void ItemScanner::tagItemHistoryGraph(qlonglong id)
125 {
128  ItemInfo info(id);
129 
130  if (info.isNull())
131  {
132  return;
133  }
134  //qCDebug(DIGIKAM_DATABASE_LOG) << "tagItemHistoryGraph" << id;
135 
136  // Load relation cloud, history of info and of all leaves of the tree into the graph, fully resolved
137  ItemHistoryGraph graph = ItemHistoryGraph::fromInfo(info, ItemHistoryGraph::LoadAll, ItemHistoryGraph::NoProcessing);
138  qCDebug(DIGIKAM_DATABASE_LOG) << graph;
139 
140  int originalVersionTag = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::originalVersion());
141  int currentVersionTag = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::currentVersion());
142  int intermediateVersionTag = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::intermediateVersion());
143 
144  int needTaggingTag = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::needTaggingHistoryGraph());
145 
146  // Remove all relevant tags
147  CoreDbAccess().db()->removeTagsFromItems(graph.allImageIds(), QList<int>() << originalVersionTag
148  << currentVersionTag << intermediateVersionTag << needTaggingTag);
149 
150  if (!graph.hasEdges())
151  {
152  return;
153  }
154 
155  // get category info
156  QList<qlonglong> originals, intermediates, currents;
157  QHash<ItemInfo, HistoryImageId::Types> grpTypes = graph.categorize();
158  QHash<ItemInfo, HistoryImageId::Types>::const_iterator it;
159 
160  for (it = grpTypes.constBegin() ; it != grpTypes.constEnd() ; ++it)
161  {
162  qCDebug(DIGIKAM_DATABASE_LOG) << "Image" << it.key().id() << "type" << it.value();
163  HistoryImageId::Types types = it.value();
164 
165  if (types & HistoryImageId::Original)
166  {
167  originals << it.key().id();
168  }
169 
170  if (types & HistoryImageId::Intermediate)
171  {
172  intermediates << it.key().id();
173  }
174 
175  if (types & HistoryImageId::Current)
176  {
177  currents << it.key().id();
178  }
179  }
180 
181  if (!originals.isEmpty())
182  {
183  CoreDbAccess().db()->addTagsToItems(originals, QList<int>() << originalVersionTag);
184  }
185 
186  if (!intermediates.isEmpty())
187  {
188  CoreDbAccess().db()->addTagsToItems(intermediates, QList<int>() << intermediateVersionTag);
189  }
190 
191  if (!currents.isEmpty())
192  {
193  CoreDbAccess().db()->addTagsToItems(currents, QList<int>() << currentVersionTag);
194  }
195 }
196 
197 DImageHistory ItemScanner::resolvedImageHistory(const DImageHistory& history, bool mustBeAvailable)
198 {
199  DImageHistory h;
200 
201  foreach (const DImageHistory::Entry& e, history.entries())
202  {
203  // Copy entry, without referredImages
204  DImageHistory::Entry entry;
205  entry.action = e.action;
206 
207  // resolve referredImages
208  foreach (const HistoryImageId& id, e.referredImages)
209  {
210  QList<qlonglong> imageIds = resolveHistoryImageId(id);
211 
212  // append each image found in collection to referredImages
213  foreach (const qlonglong& imageId, imageIds)
214  {
215  ItemInfo info(imageId);
216 
217  if (info.isNull())
218  {
219  continue;
220  }
221 
222  if (mustBeAvailable)
223  {
224  CollectionLocation location = CollectionManager::instance()->locationForAlbumRootId(info.albumRootId());
225 
226  if (!location.isAvailable())
227  {
228  continue;
229  }
230  }
231 
232  HistoryImageId newId = info.historyImageId();
233  newId.setType(id.m_type);
234  entry.referredImages << newId;
235  }
236  }
237 
238  // add to history
239  h.entries() << entry;
240  }
241 
242  return h;
243 }
244 
245 bool ItemScanner::sameReferredImage(const HistoryImageId& id1, const HistoryImageId& id2)
246 {
247  if (!id1.isValid() || !id2.isValid())
248  {
249  return false;
250  }
251 
252  /*
253  * We give the UUID the power of equivalence that none of the other criteria has:
254  * For two images a,b with uuids x,y, where x and y not null,
255  * a (same image as) b <=> x == y
256  */
257  if (id1.hasUuid() && id2.hasUuid())
258  {
259  return id1.m_uuid == id2.m_uuid;
260  }
261 
262  if (id1.hasUniqueHashIdentifier() &&
263  id1.m_uniqueHash == id2.m_uniqueHash &&
264  id1.m_fileSize == id2.m_fileSize)
265  {
266  return true;
267  }
268 
269  if (id1.hasFileName() && id1.hasCreationDate() &&
270  id1.m_fileName == id2.m_fileName &&
271  id1.m_creationDate == id2.m_creationDate)
272  {
273  return true;
274  }
275 
276  if (id1.hasFileOnDisk() &&
277  id1.m_filePath == id2.m_filePath &&
278  id1.m_fileName == id2.m_fileName)
279  {
280  return true;
281  }
282 
283  return false;
284 }
285 
286 // Returns true if both have the same UUID, or at least one of the two has no UUID
287 // Returns false iff both have a UUID and the UUIDs differ
288 static bool uuidDoesNotDiffer(const HistoryImageId& referenceId, qlonglong id)
289 {
290  if (referenceId.hasUuid())
291  {
292  QString uuid = CoreDbAccess().db()->getImageUuid(id);
293 
294  if (!uuid.isEmpty())
295  {
296  return referenceId.m_uuid == uuid;
297  }
298  }
299 
300  return true;
301 }
302 
303 static QList<qlonglong> mergedIdLists(const HistoryImageId& referenceId,
304  const QList<qlonglong>& uuidList,
305  const QList<qlonglong>& candidates)
306 {
307  QList<qlonglong> results;
308  // uuidList are definite results
309  results = uuidList;
310 
311  // Add a candidate if it has the same UUID, or either reference or candidate have a UUID
312  // (other way round: do not add a candidate which positively has a different UUID)
313  foreach (const qlonglong& candidate, candidates)
314  {
315  if (results.contains(candidate))
316  {
317  continue; // already in list, skip
318  }
319 
320  if (uuidDoesNotDiffer(referenceId, candidate))
321  {
322  results << candidate;
323  }
324  }
325 
326  return results;
327 }
328 
329 QList<qlonglong> ItemScanner::resolveHistoryImageId(const HistoryImageId& historyId)
330 {
331  // first and foremost: UUID
332  QList<qlonglong> uuidList;
333 
334  if (historyId.hasUuid())
335  {
336  uuidList = CoreDbAccess().db()->getItemsForUuid(historyId.m_uuid);
337 
338  // If all images had a UUID, we would be finished and could return here with a result:
339 /*
340  if (!uuidList.isEmpty())
341  {
342  return uuidList;
343  }
344 */
345  // But as identical images may have no UUID yet, we need to continue
346  }
347 
348  // Second: uniqueHash + fileSize. Sufficient to assume that a file is identical, but subject to frequent change.
349  if (historyId.hasUniqueHashIdentifier() && CoreDbAccess().db()->isUniqueHashV2())
350  {
351  QList<ItemScanInfo> infos = CoreDbAccess().db()->getIdenticalFiles(historyId.m_uniqueHash, historyId.m_fileSize);
352 
353  if (!infos.isEmpty())
354  {
355  QList<qlonglong> ids;
356 
357  foreach (const ItemScanInfo& info, infos)
358  {
359  if (info.status != DatabaseItem::Status::Trashed && info.status != DatabaseItem::Status::Obsolete)
360  {
361  ids << info.id;
362  }
363  }
364 
365  return mergedIdLists(historyId, uuidList, ids);
366  }
367  }
368 
369  // As a third combination, we try file name and creation date. Susceptible to renaming,
370  // but not to metadata changes.
371  if (historyId.hasFileName() && historyId.hasCreationDate())
372  {
373  QList<qlonglong> ids = CoreDbAccess().db()->findByNameAndCreationDate(historyId.m_fileName, historyId.m_creationDate);
374 
375  if (!ids.isEmpty())
376  {
377  return mergedIdLists(historyId, uuidList, ids);
378  }
379  }
380 
381  // Another possibility: If the original UUID is given, we can find all relations for the image with this UUID,
382  // and make an assumption from this group of images. Currently not implemented.
383 
384  // resolve old-style by full file path
385  if (historyId.hasFileOnDisk())
386  {
387  QFileInfo file(historyId.filePath());
388 
389  if (file.exists())
390  {
391  CollectionLocation location = CollectionManager::instance()->locationForPath(historyId.path());
392 
393  if (!location.isNull())
394  {
395  QString album = CollectionManager::instance()->album(file.path());
396  QString name = file.fileName();
397  ItemShortInfo info = CoreDbAccess().db()->getItemShortInfo(location.id(), album, name);
398 
399  if (info.id)
400  {
401  return mergedIdLists(historyId, uuidList, QList<qlonglong>() << info.id);
402  }
403  }
404  }
405  }
406 
407  return uuidList;
408 }
409 
410 bool ItemScanner::hasHistoryToResolve() const
411 {
412  return d->hasHistoryToResolve;
413 }
414 
415 QString ItemScanner::uniqueHash() const
416 {
417  // the QByteArray is an ASCII hex string
418  if (d->scanInfo.category == DatabaseItem::Image)
419  {
420  if (CoreDbAccess().db()->isUniqueHashV2())
421  return QString::fromUtf8(d->img.getUniqueHashV2());
422  else
423  return QString::fromUtf8(d->img.getUniqueHash());
424  }
425  else
426  {
427  if (CoreDbAccess().db()->isUniqueHashV2())
428  return QString::fromUtf8(DImg::getUniqueHashV2(d->fileInfo.filePath()));
429  else
430  return QString::fromUtf8(DImg::getUniqueHash(d->fileInfo.filePath()));
431  }
432 }
433 
434 } // namespace Digikam
Digikam::ItemScanInfo
Definition: coredbalbuminfo.h:275
Digikam::HistoryImageId::m_fileSize
qlonglong m_fileSize
The file size of the referred file.
Definition: historyimageid.h:168
Digikam::DImg::getUniqueHash
QByteArray getUniqueHash() const
This methods return a 128-bit MD5 hex digest which is meant to uniquely identify the file...
Definition: dimg_metadata.cpp:31
Digikam::CollectionManager::instance
static CollectionManager * instance()
Definition: collectionmanager.cpp:34
Digikam::ItemScanner::resolvedImageHistory
static DImageHistory resolvedImageHistory(const DImageHistory &history, bool mustBeAvailable=false)
All referred images of the given history will be resolved.
Definition: itemscanner_history.cpp:197
Digikam::ItemHistoryGraph::hasUnresolvedEntries
bool hasUnresolvedEntries() const
Returns true if for any entry no ItemInfo could be located.
Definition: itemhistorygraph.cpp:677
Digikam::DImageHistory::Entry::action
FilterAction action
A DImageHistory is a list of entries.
Definition: dimagehistory.h:68
Digikam::ItemHistoryGraph::relationCloudParallel
QPair< QList< qlonglong >, QList< qlonglong > > relationCloudParallel() const
Definition: itemhistorygraph.cpp:742
Digikam::HistoryImageId::setType
void setType(HistoryImageId::Type type)
Definition: historyimageid.cpp:48
Digikam::ItemInfo::isNull
bool isNull() const
Returns if this objects contains valid data.
Definition: iteminfo.cpp:412
Digikam::DatabaseRelation::DerivedFrom
The subject is a derivative of the object.
Definition: coredbconstants.h:115
Digikam::HistoryImageId
Definition: historyimageid.h:41
Digikam::DImageHistory::Entry::referredImages
QList< HistoryImageId > referredImages
Definition: dimagehistory.h:69
Digikam::HistoryImageId::hasUuid
bool hasUuid() const
Definition: historyimageid.cpp:126
Digikam::DImg::getUniqueHashV2
QByteArray getUniqueHashV2() const
This methods return a 128-bit MD5 hex digest which is meant to uniquely identify the file...
Definition: dimg_metadata.cpp:70
Digikam::ItemScanner::resolveImageHistory
static bool resolveImageHistory(qlonglong id, QList< qlonglong > *needTaggingIds=nullptr)
Resolves the image history of the image id by filling the ImageRelations table for all contained refe...
Definition: itemscanner_history.cpp:68
Digikam::mergedIdLists
static QList< qlonglong > mergedIdLists(const HistoryImageId &referenceId, const QList< qlonglong > &uuidList, const QList< qlonglong > &candidates)
Definition: itemscanner_history.cpp:303
Digikam::HistoryImageId::m_fileName
QString m_fileName
The filename of the referred file.
Definition: historyimageid.h:160
Digikam::ItemScanner::tagItemHistoryGraph
static void tagItemHistoryGraph(qlonglong id)
Takes the history graph reachable from the given image, and assigns versioning tags to all entries ba...
Definition: itemscanner_history.cpp:124
Digikam::DatabaseItem::Trashed
Definition: coredbconstants.h:90
Digikam::HistoryImageId::hasFileName
bool hasFileName() const
Definition: historyimageid.cpp:116
Digikam::ItemHistoryGraph::rootImages
QList< ItemInfo > rootImages() const
Returns image infos / ids from all root vertices in this graph, i.e.
Definition: itemhistorygraph.cpp:783
QString::isNull
bool isNull() const
Digikam::uuidDoesNotDiffer
static bool uuidDoesNotDiffer(const HistoryImageId &referenceId, qlonglong id)
Definition: itemscanner_history.cpp:288
Digikam::CollectionManager::locationForAlbumRootId
CollectionLocation locationForAlbumRootId(int id)
Returns the location for the given album root id.
Definition: collectionmanager_location.cpp:644
Digikam::InternalTagName::needResolvingHistory
static QLatin1String needResolvingHistory()
Definition: coredbconstants.cpp:37
Digikam::ItemShortInfo::id
qlonglong id
Definition: coredbalbuminfo.h:266
Digikam::ItemScanner::hasHistoryToResolve
bool hasHistoryToResolve() const
Returns true if this file has been marked as needing history resolution at a later stage...
QString::fromUtf8
QString fromUtf8(const char *str, int size)
Digikam::ItemScanInfo::id
qlonglong id
Definition: coredbalbuminfo.h:295
Digikam::DImageHistory::Entry
Definition: dimagehistory.h:52
QHash::constEnd
const_iterator constEnd() const
QHash
Digikam::InternalTagName::currentVersion
static QLatin1String currentVersion()
Definition: coredbconstants.cpp:52
QList::isEmpty
bool isEmpty() const
Digikam::ItemScanner::commitImageHistory
void commitImageHistory()
Definition: itemscanner_history.cpp:38
Digikam::HistoryImageId::Original
The original file (typically created by a camera)
Definition: historyimageid.h:51
Digikam::CollectionManager::album
QString album(const QUrl &fileUrl)
Returns the album part of the given file path, i.e.
Definition: collectionmanager_album.cpp:125
Digikam::ItemShortInfo
Definition: coredbalbuminfo.h:248
QString::isEmpty
bool isEmpty() const
Digikam::ItemHistoryGraph::hasEdges
bool hasEdges() const
Returns if the graph contains any edges.
Definition: itemhistorygraph.cpp:491
Digikam::ItemHistoryGraph::LoadAll
Definition: itemhistorygraph.h:77
Digikam::HistoryImageId::Current
The "current" file.
Definition: historyimageid.h:74
Digikam::CoreDbAccess::db
CoreDB * db() const
Retrieve a pointer to the album database.
Definition: coredbaccess.cpp:146
QList::first
T & first()
QString
QList< qlonglong >
Digikam::HistoryImageId::m_filePath
QString m_filePath
The path of the referred file (NOTE: without file name!, including trailing slash) ...
Definition: historyimageid.h:164
Digikam::RedEye::location
std::vector< T > location(const std::vector< T > &shape, unsigned long idx)
requires
Definition: shapepredictor.h:109
QPair
Digikam::ImageHistoryEntry::history
QString history
Definition: coredbalbuminfo.h:378
QFileInfo
Digikam::ImageHistoryEntry
Definition: coredbalbuminfo.h:360
Digikam::ItemInfo
The ItemInfo class contains provides access to the database for a single image.
Definition: iteminfo.h:72
Digikam::HistoryImageId::hasFileOnDisk
bool hasFileOnDisk() const
Definition: historyimageid.cpp:111
QList::contains
bool contains(const T &value) const
Digikam::HistoryImageId::m_uniqueHash
QString m_uniqueHash
The uniqueHash of the referred file.
Definition: historyimageid.h:166
Digikam::ItemHistoryGraph::allImageIds
QList< qlonglong > allImageIds() const
Definition: itemhistorygraph.cpp:768
Digikam::CollectionLocation
Definition: collectionlocation.h:40
Digikam::ItemHistoryGraph::categorize
QHash< ItemInfo, HistoryImageId::Types > categorize() const
Attempts at a categorization of all images in the graph into the types defined by HistoryImageId...
Definition: itemhistorygraph.cpp:793
Digikam::DatabaseItem::Image
Definition: coredbconstants.h:98
Digikam::ItemScanInfo::status
DatabaseItem::Status status
Definition: coredbalbuminfo.h:298
QHash::const_iterator
Digikam::CollectionLocation::id
int id() const
The id uniquely identifying this collection.
Definition: collectionlocation.cpp:36
Digikam::HistoryImageId::isValid
bool isValid() const
A valid id needs at least a valid type and a UUID or a filename.
Definition: historyimageid.cpp:90
QHash::constBegin
const_iterator constBegin() const
Digikam::InternalTagName::intermediateVersion
static QLatin1String intermediateVersion()
Definition: coredbconstants.cpp:57
Digikam::ItemHistoryGraph::NoProcessing
Definition: itemhistorygraph.h:83
Digikam::InternalTagName::needTaggingHistoryGraph
static QLatin1String needTaggingHistoryGraph()
Definition: coredbconstants.cpp:42
Digikam::HistoryImageId::hasCreationDate
bool hasCreationDate() const
Definition: historyimageid.cpp:136
Digikam::HistoryImageId::m_uuid
QString m_uuid
A unique identifier for the referred file.
Definition: historyimageid.h:157
Digikam::CollectionManager::locationForPath
CollectionLocation locationForPath(const QString &filePath)
Definition: collectionmanager_location.cpp:695
Digikam::ItemScanner::uniqueHash
QString uniqueHash() const
Definition: itemscanner_history.cpp:415
Digikam::HistoryImageId::m_creationDate
QDateTime m_creationDate
The creationDate of the original image.
Definition: historyimageid.h:162
Digikam::ItemInfo::albumRootId
int albumRootId() const
The album root id.
Definition: iteminfo.cpp:481
Digikam::ItemScanner::sameReferredImage
static bool sameReferredImage(const HistoryImageId &id1, const HistoryImageId &id2)
Determines if the two ids refer to the same image.
Definition: itemscanner_history.cpp:245
Digikam::ItemScanner::scanImageHistoryIfModified
void scanImageHistoryIfModified()
Definition: itemscanner_history.cpp:56
Digikam::CoreDbAccess
The CoreDbAccess provides access to the database: Create an instance of this class on the stack to re...
Definition: coredbaccess.h:54
itemscanner_p.h
Digikam::ItemHistoryGraph::fromInfo
static ItemHistoryGraph fromInfo(const ItemInfo &info, HistoryLoadingMode loadingMode=LoadAll, ProcessingMode processingMode=PrepareForDisplay)
Convenience: Reads all available history for the given info from the database and returns the created...
Definition: itemhistorygraph.cpp:511
Digikam::InternalTagName::originalVersion
static QLatin1String originalVersion()
Definition: coredbconstants.cpp:47
Digikam::CollectionLocation::isAvailable
bool isAvailable() const
Definition: collectionlocation.h:118
Digikam::ItemScanner::resolveHistoryImageId
static QList< qlonglong > resolveHistoryImageId(const HistoryImageId &historyId)
Returns all image ids fulfilling the given image id.
Definition: itemscanner_history.cpp:329
Digikam::cimg_library::cimg::info
void info()
Print information about CImg environment variables.
Definition: CImg.h:5763
Digikam::HistoryImageId::filePath
QString filePath() const
If a file on disk is referenced: Returns the full file path (folder + filename)
Definition: historyimageid.cpp:106
Digikam::ItemInfo::historyImageId
HistoryImageId historyImageId() const
Constructs a HistoryImageId with all available information for this image.
Definition: iteminfo.cpp:1341
Digikam::HistoryImageId::hasUniqueHashIdentifier
bool hasUniqueHashIdentifier() const
Definition: historyimageid.cpp:146
Digikam::CollectionLocation::isNull
bool isNull() const
Definition: collectionlocation.h:123
Digikam::ItemHistoryGraph::addScannedHistory
void addScannedHistory(const DImageHistory &history, qlonglong historySubjectId)
This is very similar to addHistory.
Definition: itemhistorygraph.cpp:565
Digikam::DatabaseItem::Obsolete
Definition: coredbconstants.h:91
Digikam::ItemHistoryGraph
Definition: itemhistorygraph.h:45
Digikam::ItemScanner::scanImageHistory
void scanImageHistory()
Definition: itemscanner_history.cpp:30
Digikam::HistoryImageId::path
QString path() const
If a file on disk is referenced: Returns the path, without filename, with a trailing slash...
Definition: historyimageid.cpp:101
Digikam::HistoryImageId::Intermediate
A file created during the editing the history, between the original file and the current file...
Definition: historyimageid.h:57
This file is part of the KDE documentation.
Documentation copyright © 1996-2019 The KDE developers.
Generated on Thu Dec 12 2019 03:10:06 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

digikam

Skip menu "digikam"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages
-->

graphics API Reference

Skip menu "graphics API Reference"
  • digikam
  • KDiagram
  •     KChart
  •     KGantt
  • KPhotoAlbum
  •   AndroidRemoteControl
  • Krita
  •   libs
  •     KritaBasicFlakes
  •     brush
  •     KritaUndo2
  •     KritaFlake
  •     image
  •     KritaPlugin
  •     Krita
  •     KritaOdf
  •     KritaPigment
  •     KritaStore
  •     ui
  •     KritaWidgets
  •     KritaWidgetUtils
  •   plugins
  •     Assitants
  •     Extensions
  •     Filters
  •         KritaText
  •         KritaTextLayout
  •     Generators
  •     Formats
  •             src
  •     PaintOps
  •       libpaintop
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal