Go to the documentation of this file.
6 #if QT_VERSION >= QT_VERSION_CHECK(5,10,0)
7 #include <QRandomGenerator>
10 #define LOC QString("Galleryviews: ")
29 static constexpr qint64
BETA_CLIP { 24LL * 60 * 60 };
33 for (
int newid : newIds)
40 for (
int tmpint : all)
42 for (
int tmpint : qAsConst(*
this))
66 return m_active < 0 || m_active >=
m_sequence.size()
104 LOG(VB_FILE, LOG_DEBUG,
LOC + QString(
"Modified id %1").arg(
id));
223 for (
const QSharedPointer<ImageItem> & im : qAsConst(files))
230 Cache(im->m_id, im->m_parentId, im->m_url, im->m_thumbNails.at(0).second);
236 for (
const QSharedPointer<ImageItem> & im : qAsConst(files))
240 if (files.size() > 1)
246 std::mt19937(std::random_device()()));
250 #if QT_VERSION >= QT_VERSION_CHECK(5,10,0)
251 QVector<quint32> rands;
252 rands.resize(files.size());
253 QRandomGenerator::global()->fillRange(rands.data(), rands.size());
256 qsrand(QTime::currentTime().msec());
259 int range = files.size() - 1;
261 for (
int count = 0; count < files.size(); ++count)
263 #if QT_VERSION >= QT_VERSION_CHECK(5,10,0)
264 int rand = rands[count] % range;
267 int rand = qrand() % range;
270 index = (rand < index) ? rand : rand + 1;
277 double maxWeight = weights.last();
279 #if QT_VERSION >= QT_VERSION_CHECK(5,10,0)
280 auto *randgen = QRandomGenerator::global();
283 qsrand(QTime::currentTime().msec());
285 for (
int count = 0; count < files.size(); ++count)
287 #if QT_VERSION >= QT_VERSION_CHECK(5,10,0)
289 double randWeight = randgen->generateDouble() * maxWeight;
292 double randWeight = qrand() * maxWeight / RAND_MAX;
294 WeightList::iterator it =
295 std::upper_bound(weights.begin(), weights.end(), randWeight);
296 int index = std::distance(weights.begin(), it);
317 double totalWeight = 0;
318 QDateTime now = QDateTime::currentDateTime();
320 for (
int i = 0; i < files.size(); ++i)
325 if (im->m_date == 0s)
330 QDateTime curYearAnniversary =
331 QDateTime(QDate(now.date().year(),
332 timestamp.date().month(),
333 timestamp.date().day()),
336 bool isAnniversaryPast = curYearAnniversary < now;
338 QDateTime adjacentYearAnniversary =
339 QDateTime(QDate(now.date().year() +
340 (isAnniversaryPast ? 1 : -1),
341 timestamp.date().month(),
342 timestamp.date().day()),
345 double range = llabs(curYearAnniversary.secsTo(
351 QDateTime d1(isAnniversaryPast ? curYearAnniversary
352 : adjacentYearAnniversary);
353 QDateTime d2(isAnniversaryPast ? adjacentYearAnniversary
354 : curYearAnniversary);
355 weight = std::pow(llabs(now.secsTo(d1) +
BETA_CLIP) / range,
357 * std::pow(llabs(now.secsTo(d2) +
BETA_CLIP) / range,
360 totalWeight += weight;
361 weights[i] = totalWeight;
385 return !files.isEmpty();
394 LOG(VB_FILE, LOG_DEBUG,
LOC +
"Cleared File cache");
416 if (!
file.m_url.isEmpty())
419 if (!
file.m_thumbUrl.isEmpty())
420 urls <<
file.m_thumbUrl;
422 LOG(VB_FILE, LOG_DEBUG,
LOC + QString(
"Cleared %1 from file cache (%2)")
423 .arg(
id).arg(urls.join(
",")));
466 for (
const auto & thumb : qAsConst(
m_thumbs))
467 ids << QString::number(thumb.first);
468 return QString(
"Dir %1 (%2, %3) Thumbs %4 (%5) Parent %6")
530 for (
const ImagePtr & im : qAsConst(dirs))
548 for (
const QSharedPointer<ImageItem> & im : qAsConst(images))
549 ids.insert(im->m_id);
554 images.prepend(parent);
558 int activeId = selected ? selected->m_id : 0;
615 for (
const ImagePtr & im : qAsConst(images))
635 else if (userIm->IsFile())
637 thumbFiles.append(userIm);
641 thumbDirs.append(userIm);
645 for (
int i = 0; i < std::min(kMaxFolderThumbnails, static_cast<int>(thumbFiles.size())); ++i)
647 parent.
m_thumbNails.append(thumbFiles.at(i)->m_thumbNails.at(0));
652 if (thumbsNeeded > 0)
658 LOG(VB_GENERAL, LOG_NOTICE,
LOC +
659 "Directory thumbnails are more than 10 levels deep");
664 for (
const ImagePtr & im : qAsConst(thumbDirs))
673 if (!im->m_thumbNails.empty())
679 if (--thumbsNeeded == 0)
689 for (
const QSharedPointer<ImageItem> & im : qAsConst(thumbDirs))
691 if (i < im->m_thumbNails.size())
694 if (--thumbsNeeded == 0)
705 int scanned = (userIm || thumbsNeeded > 0)
710 Cache(parent, scanned);
817 bool hiddenMarked =
false;
818 bool unhiddenMarked =
false;
828 unhiddenMarked =
true;
830 if (hiddenMarked && unhiddenMarked)
836 hiddenMarked, unhiddenMarked};
895 LOG(VB_FILE, LOG_DEBUG,
LOC +
"Cleared Dir cache");
930 LOG(VB_FILE, LOG_DEBUG,
LOC + QString(
"Cleared %1 from dir cache").arg(dirId));
957 return !files.isEmpty();
QSharedPointer< ImageItemK > ImagePtrK
void Add(const ImageIdList &newIds)
static WeightList CalculateSeasonalWeights(ImageList &files)
This method calculates a weight for the item based on how closely it was taken to the current time of...
int GetImages(const ImageIdList &ids, ImageList &files, ImageList &dirs) const
Returns images (local or remote but not a combination)
ImagePtrK HasNext(int inc) const
Peeks at next image in view but does not advance iterator.
const double LEADING_BETA_SHAPE
Tuning parameter for seasonal weights, between 0 and 1, where lower numbers give greater weight to se...
QString GetPosition() const
Get positional status.
void GetImageTree(int id, ImageList &files) const
Return all files (local or remote) in the sub-trees of a dir.
bool LoadFromDb(int parentId) override
Populate view from database as images of a directory sub-tree. Default order of a tree is depth-first...
QHash< int, ImagePtrK > m_images
Image objects currently displayed.
int m_id
Uniquely identifies an image (file/dir).
QStringList ClearImage(int id, bool remove=false)
Clear file from UI cache and optionally from view.
Records info of displayed image files to enable clean-up of the UI image cache.
int GetDirectory(int id, ImagePtr &parent, ImageList &files, ImageList &dirs) const
Return images (local and/or remote) for a dir and its direct children.
const double DEFAULT_WEIGHT
Photos without an exif timestamp will default to the mode of the beta distribution.
const static int kMaxFolderThumbnails
Number of thumbnails to use for folders.
void Mark(int id, bool mark)
Mark/unmark an image/dir.
QList< ThumbPair > m_thumbs
void Rotate(int id)
Rotate view so that starting image is at front.
virtual bool LoadFromDb(int parentId)
Populate view with database images from a directory.
bool PopulateFromCache(ImageItem &dir, int required)
Retrieve cached dir, if available.
QString ToString(int id) const
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
A datastore of images for display by a screen.
@ kSeasonal
Biased random selection so that images are more likely to appear on anniversaries.
const double TRAILING_BETA_SHAPE
See LEADING_BETA_SHAPE.
void Populate(ImageList &files)
Fills view with Db images, re-ordering them as required.
QString GetPosition() const
Get positional status.
void Cache(ImageItemK &dir, int thumbCount)
Cache displayed dir.
void ClearCache()
Clears UI cache.
QHash< int, DirCacheEntry > m_dirCache
Caches displayed image dirs.
bool Select(int id, int fallback=0)
Selects first occurrence of an image.
ImagePtrK Prev(int inc)
Decrements iterator and returns previous image. Wraps at start.
bool Update(int id)
Updates view with images that have been updated.
void MarkAll()
Mark all images/dirs.
static constexpr qint64 BETA_CLIP
The edges of the distribution get clipped to avoid a singularity.
Records dir info for every displayed dir.
MBASE_PUBLIC QDateTime fromSecsSinceEpoch(int64_t seconds)
This function takes the number of seconds since the start of the epoch and returns a QDateTime with t...
QHash< int, FileCacheEntry > m_fileCache
Caches displayed image files.
DirectoryView(SlideOrderType order)
Constructs a view of images & directories that can be marked.
ImagePtrK HasPrev(int inc) const
Peeks at previous image in view but does not decrement iterator.
@ kShuffle
Each image appears exactly once, but in random order.
ImageListK GetAllNodes() const
Get all images/dirs in view.
void InvertMarked()
Mark all unmarked items, unmark all marked items.
QList< ImagePtrK > ImageListK
ImagePtrK GetSelected() const
Get current selection.
void SetDirectory(int newParent)
Manage markings on tree navigation.
void Clear(bool resetParent=true)
Reset view.
QVector< ImagePtr > ImageList
MarkedFiles m_prevMarked
Marked items in previous dir.
QList< ThumbPair > m_thumbNails
QString ToString(int id) const
int m_dirCount
Id & URLs of thumbnail(s). 1 for a file, 4 for dirs.
ImagePtrK Next(int inc)
Advance iterator and return next image, wrapping if necessary. Regenerates unordered views on wrap.
bool LoadFromDb(int parentId) override
Populate view from database as images/subdirs of a directory. View is ordered: Parent dir,...
MarkedFiles m_marked
Marked items in current dir/view.
Provides view datastores for Gallery screens.
void LoadDirThumbs(ImageItem &parent, int thumbsNeeded, int level=0)
Populate thumbs for a dir.
QSharedPointer< ImageItem > ImagePtr
Represents a picture, video or directory.
ImageIdList m_sequence
The sequence in which to display images.
int m_parentId
Id of parent dir.
MenuSubjects GetMenuSubjects()
Determine current selection, markings & various info to support menu display.
void Invert(const ImageIdList &all)
int GetChildren(int id, ImageList &files, ImageList &dirs) const
Return (local or remote) images that are direct children of a dir.
void PopulateThumbs(ImageItem &parent, int thumbsNeeded, const ImageList &files, const ImageList &dirs, int level=0)
Populate directory stats & thumbnails recursively from database as follows: Use user cover,...
SlideOrderType
Order of images in slideshow.
void ClearCache()
Clears UI cache.
void Clear(bool resetParent=true)
Resets view.
QStringList RemoveImage(int id, bool deleted=false)
Clear file/dir and all its ancestors from UI cache so that ancestor thumbnails are recalculated....
QVector< double > WeightList
Seasonal weightings for images in a view.
QPair< int, QString > ThumbPair
int m_userThumbnail
Id of thumbnail to use as cover (dirs only)
@ kOrdered
Ordered as per user setting GallerySortOrder.
void Cache(int id, int parent, const QString &url, const QString &thumb)
Cache image properties to optimize UI.
ImageIdList GetChildren() const
void ClearMarked()
Unmark all items.
@ kRandom
Random selection from view. An image may be absent or appear multiple times.
int m_fileCount
Number of child images (dirs only)
int m_active
Sequence index of current selected image.