25#define LOC QString("Thumbview: ")
31 std::copy_if(comment.cbegin(), comment.cend(), std::back_inserter(result), [](QChar x) { return x.isPrint(); } );
49 LOG(VB_GENERAL, LOG_INFO, QString(
"Executing \"%1\"").arg(cmd));
53 LOG(VB_GENERAL, LOG_INFO, QString(
" ...with result %1").arg(
m_result));
87 auto add_size = [](
int t,
const ImagePtrK & im){
return t + im->m_size; };
88 int total = std::accumulate(keys.cbegin(), keys.cend(), 0, add_size);
91 for (
auto it =
m_files.constKeyValueBegin();
92 it !=
m_files.constKeyValueEnd(); it++)
95 QString newPath = it->second;
99 QString message = QString(
"%1 %2\n%3")
100 .arg(
action, QFileInfo(im->m_url).fileName(),
104 QApplication::postEvent(
m_dialog, pue);
107 LOG(VB_FILE, LOG_INFO, QString(
"%2 %3 -> %4")
108 .arg(
action, im->m_url, newPath));
118 LOG(VB_GENERAL, LOG_ERR,
119 QString(
"%1: Failed to copy/move %2 -> %3")
123 progressSize += im->m_size;
131 QApplication::postEvent(
m_dialog, pue);
154 std::this_thread::sleep_for(1ms);
155 QCoreApplication::processEvents();
173 m_editsAllowed(
gCoreContext->GetSetting(
"GalleryPassword").isEmpty())
186 LOG(VB_GUI, LOG_DEBUG,
LOC +
"Exiting Gallery");
196 LOG(VB_GUI, LOG_DEBUG,
LOC +
"Closing Gallery");
221 QString name = QString(
"images%1").arg(zoom++);
226 widget->SetVisible(
false);
228 name = QString(
"images%1").arg(zoom++);
234 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Screen 'Gallery' is missing 'images0'");
237 LOG(VB_GUI, LOG_DEBUG,
LOC + QString(
"Screen 'Gallery' found %1 zoom levels")
243 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Cannot load 'Info buttonlist'");
283 for (
int i = 0; i < actions.size() && !handled; i++)
285 const QString&
action = actions[i];
290 else if (
action ==
"INFO")
292 else if (
action ==
"ZOOMIN")
294 else if (
action ==
"ZOOMOUT")
296 else if (
action ==
"ROTRIGHT")
298 else if (
action ==
"ROTLEFT")
300 else if (
action ==
"FLIPHORIZONTAL")
302 else if (
action ==
"FLIPVERTICAL")
304 else if (
action ==
"COVER")
321 else if (
action ==
"PLAY")
325 else if (
action ==
"RECURSIVESHOW")
328 if (im && im->IsDirectory())
331 else if (
action ==
"MARK")
374 auto *me =
dynamic_cast<MythEvent *
>(event);
378 const QString& mesg = me->
Message();
379 QStringList extra = me->ExtraDataList();
382 QStringList token = mesg.split(
' ');
386 if (token[0] ==
"IMAGE_METADATA")
388 int id = extra[0].toInt();
391 if (selected && selected->m_id ==
id)
394 else if (token[0] ==
"THUMB_AVAILABLE")
396 int id = extra[0].toInt();
402 QList<ThumbLocation> affected =
m_pendingMap.values(
id);
405 if (affected.isEmpty())
408 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
409 QString(
"Rx %1 : %2").arg(token[0], extra.join(
",")));
415 for (
const ThumbLocation & location : std::as_const(affected))
418 int index = location.second;
428 else if (token[0] ==
"IMAGE_DB_CHANGED")
431 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
432 QString(
"Rx %1 : %2").arg(token[0], extra.join(
",")));
434 if (!extra.isEmpty())
436 QStringList idDeleted =
437 extra[0].split(
",", Qt::SkipEmptyParts);
440 if (extra.size() >= 2)
442 QStringList idChanged =
443 extra[1].split(
",", Qt::SkipEmptyParts);
450 else if (token[0] ==
"IMAGE_DEVICE_CHANGED")
453 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
454 QString(
"Rx %1 : %2").arg(token[0], extra.join(
",")));
461 for (
const QString & url : std::as_const(extra))
467 else if (token[0] ==
"IMAGE_SCAN_STATUS" && extra.size() == 3)
477 QString resultid = dce->GetId();
478 int buttonnum = dce->GetResult();
480 if (resultid ==
"FileRename")
482 QString newName = dce->GetResultText();
491 else if (resultid ==
"MakeDir")
496 QString name = dce->GetResultText();
497 QString err = name.contains(
"/")
505 else if (resultid ==
"SlideOrderMenu")
511 case 0: slideOrder =
kOrdered;
break;
512 case 1: slideOrder =
kShuffle;
break;
513 case 2: slideOrder =
kRandom;
break;
517 LOG(VB_FILE, LOG_DEBUG,
LOC + QString(
"Order %1").arg(slideOrder));
519 else if (resultid ==
"ImageCaptionMenu")
533 else if (resultid ==
"DirCaptionMenu")
546 else if (resultid ==
"Password")
548 QString password = dce->GetResultText();
551 else if (buttonnum == 1)
561 else if (resultid ==
"ConfirmDeleteMarked")
584 for (
const QString &
id : std::as_const(ids))
592 for (
const QString & url : std::as_const(urls))
594 LOG(VB_FILE, LOG_DEBUG,
LOC +
595 QString(
"Clearing image cache of '%1'").arg(url));
611 if (message.size() == 4 && message[0] ==
"OK")
655 "Scan storage group using menu,\n"
656 "or insert/mount local media.\n"));
675 for (
const ImagePtrK & im : std::as_const(nodes))
683 QVariant::fromValue(im));
685 item->setCheckable(
true);
697 item->DisplayState(
"upfolder",
"parenttype");
699 else if (im == selected)
725 if (im->m_dirCount > 0)
728 .arg(im->m_fileCount).arg(im->m_dirCount),
733 item->
SetText(QString::number(im->m_fileCount),
"childcount");
736 item->
DisplayState(im->IsDevice() ?
"device" :
"subfolder",
"buttontype");
752 QString hideState = (im->m_isHidden) ?
"hidden" :
"visible";
758 im->IsFile() ?
"GalleryImageCaption"
759 :
"GalleryDirCaption");
781 if (im->m_thumbNails.size() == 1)
793 for (
int index = 0; index < im->m_thumbNails.size(); ++index)
797 thumbMap.insert(QString(
"thumbimage%1").arg(index), url);
799 if (!thumbMap.isEmpty())
804 if (!request.isEmpty())
823 ThumbPair thumb(im->m_thumbNails.at(index));
824 int id = thumb.first;
851 if (im->m_thumbNails.size() == 1)
858 default: button->
SetImage(url,
"folderimage");
break;
864 button->
SetImage(url, QString(
"thumbimage%1").arg(index));
885 LOG(VB_GUI, LOG_DEBUG,
LOC + QString(
"Scan Finished %1 %2/%3")
886 .arg(scanner).arg(
current).arg(total));
927 LOG(VB_GUI, LOG_DEBUG,
LOC + QString(
"Scan Started %1 %2/%3")
928 .arg(scanner).arg(
current).arg(total));
940 currentAgg +=
scan.first;
941 totalAgg +=
scan.second;
998 if (im->IsFile() || im->IsDevice())
1002 if (!comment.isEmpty())
1019 case kPicOnly : text = tr(
"Pictures");
break;
1020 case kVideoOnly : text = tr(
"Videos");
break;
1041 auto *
menu =
new MythMenu(tr(
"Gallery Options"),
this,
"mainmenu");
1070 if (popup->Create())
1123 if (
menu->IsEmpty())
1142 if (files.isEmpty())
1144 if (files.isEmpty())
1147 QString title = tr(
"%L1 marked").arg(files.size());
1178 mainMenu->
AddItem(tr(
"Transforms"),
nullptr,
menu);
1190 mainMenu->
AddItem(tr(
"Transforms"),
nullptr,
menu);
1222 menu =
new MythMenu(selected->m_baseName,
this,
"actionmenu");
1227 if (selected->m_isHidden)
1236 else if (selected->m_userThumbnail)
1243 if (selected->IsDirectory()
1253 if (selected->IsDevice() && selected->IsLocal())
1256 if (
menu->IsEmpty())
1274 case kShuffle : ordering = tr(
"Shuffled");
break;
1275 case kRandom : ordering = tr(
"Random");
break;
1276 case kSeasonal : ordering = tr(
"Seasonal");
break;
1278 case kOrdered : ordering = tr(
"Ordered");
break;
1281 auto *
menu =
new MythMenu(tr(
"Slideshow") +
" (" + ordering +
")",
1282 this,
"SlideshowMenu");
1298 auto *orderMenu =
new MythMenu(tr(
"Slideshow Order"),
this,
"SlideOrderMenu");
1300 orderMenu->AddItem(tr(
"Ordered"),
nullptr,
nullptr, order ==
kOrdered);
1301 orderMenu->AddItem(tr(
"Shuffled"),
nullptr,
nullptr, order ==
kShuffle);
1302 orderMenu->AddItem(tr(
"Random"),
nullptr,
nullptr, order ==
kRandom);
1303 orderMenu->AddItem(tr(
"Seasonal"),
nullptr,
nullptr, order ==
kSeasonal);
1305 menu->AddItem(tr(
"Change Order"),
nullptr, orderMenu);
1312 mainMenu->
AddItem(tr(
"Slideshow"),
nullptr,
menu);
1322 auto *
menu =
new MythMenu(tr(
"Show Options"),
this,
"showmenu");
1337 auto *captionMenu =
new MythMenu(tr(
"Image Captions"),
this,
1338 "ImageCaptionMenu");
1342 captionMenu->AddItem(tr(
"Comment"),
nullptr,
nullptr,
show ==
kUserCaption);
1343 captionMenu->AddItem(tr(
"None"),
nullptr,
nullptr,
show ==
kNoCaption);
1345 menu->AddItem(tr(
"Image Captions"),
nullptr, captionMenu);
1348 captionMenu =
new MythMenu(tr(
"Directory Captions"),
this,
"DirCaptionMenu");
1352 captionMenu->AddItem(tr(
"None"),
nullptr,
nullptr,
show ==
kNoCaption);
1354 menu->AddItem(tr(
"Directory Captions"),
nullptr, captionMenu);
1370 ? tr(
"Show Details") : tr(
"Hide Details");
1446 if (slide->Create())
1454 if (selected->IsDirectory())
1457 slide->Start(mode, selected->m_id);
1462 slide->Start(mode, selected->m_parentId, selected->m_id);
1480 LOG(VB_GUI, LOG_DEBUG,
LOC +
1481 QString(
"Going up from %1").arg(im->m_filePath));
1501 LOG(VB_GUI, LOG_DEBUG,
LOC +
1502 QString(
"Going down to %1").arg(im->m_filePath));
1566 ids.append(im->m_id);
1647 ShowDialog(tr(
"Do you want to delete all marked files ?"),
1648 "ConfirmDeleteMarked");
1731 if (popup->Create())
1733 popup->SetReturnEvent(
this, event);
1751 QString msg = tr(
"Enter a new name:");
1754 if (popup->Create())
1756 popup->SetReturnEvent(
this,
"FileRename");
1781 QString msg = tr(
"Enter password:");
1783 if (popup->Create())
1785 popup->SetReturnEvent(
this,
"Password");
1895 tr(
"Enter name of new directory"),
1897 if (popup->Create())
1899 popup->SetReturnEvent(
this,
"MakeDir");
1933 if (!destDir || destDir->IsFile())
1938 if (markedIds.isEmpty())
1941 if (markedIds.isEmpty())
1953 if (dirs.isEmpty() && files.isEmpty())
1961 ImagePtrK aChild = dirs.isEmpty() ? files[0] : dirs[0];
1964 int basePathSize = aChild->m_filePath.size() - aChild->m_baseName.size();
1969 for (
const ImagePtr & im : std::as_const(files))
1973 im->m_filePath.mid(basePathSize));
1976 destDir->IsLocal()));
1999 if (!failed.isEmpty())
2000 ShowOkPopup(tr(
"Failed to copy %L1/%Ln file(s)",
nullptr, transfers.size())
2001 .arg(failed.size()));
2004 for (
const ImagePtrK & im : std::as_const(failed))
2005 transfers.remove(im);
2010 QStringList dirPaths;
2011 for (
const ImagePtr & im : std::as_const(dirs))
2013 QString relPath = im->m_filePath.mid(basePathSize);
2015 dirPaths << relPath;
2022 newImages.append(im);
2026 if (!dirPaths.isEmpty())
2029 if (!newImages.isEmpty())
2039 for (
const ImagePtrK & im : std::as_const(newImages))
2061 if (!destDir || destDir->IsFile())
2066 if (markedIds.isEmpty())
2069 if (markedIds.isEmpty())
2094 if (!dirs.isEmpty())
2096 if (!files.isEmpty())
2104 int basePathSize = aChild->m_filePath.size() - aChild->m_baseName.size();
2105 QString parentPath = aChild->m_filePath.left(basePathSize);
2109 for (
const QSharedPointer<ImageItem> & im : std::as_const(images))
2113 im->m_filePath.mid(basePathSize));
2139 if (!failed.isEmpty())
2140 ShowOkPopup(tr(
"Failed to move %L1/%Ln file(s)",
nullptr, transfers.size())
2141 .arg(failed.size()));
2144 for (
const ImagePtrK & im : std::as_const(failed))
2145 transfers.remove(im);
2147 if (!transfers.isEmpty())
2152 for (
const ImagePtrK & im : std::as_const(moved))
2169 ShowOkPopup(tr(
"Failed to create temporary directory."));
2175 cmd.replace(
"%TMPDIR%", path);
2179 ShowBusyPopup(tr(
"Running Import command.\nPlease wait..."));
2194 LOG(VB_GENERAL, LOG_ERR,
LOC + err);
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
static const Type kEventType
A datastore of images for display by a screen. Provides an ordered list of dirs & images from a singl...
ImagePtrK GetParent() const
QString GetPosition() const
Get positional status.
void ClearMarked()
Unmark all items.
void Clear(bool resetParent=true)
Resets view.
MenuSubjects GetMenuSubjects()
Determine current selection, markings & various info to support menu display.
bool IsMarked(int id) const
void MarkAll()
Mark all images/dirs.
bool LoadFromDb(int parentId) override
Populate view from database as images/subdirs of a directory. View is ordered: Parent dir,...
void ClearCache()
Clears UI cache.
QStringList RemoveImage(int id, bool deleted=false)
Clear file/dir and all its ancestors from UI cache so that ancestor thumbnails are recalculated....
void InvertMarked()
Mark all unmarked items, unmark all marked items.
void Mark(int id, bool mark)
Mark/unmark an image/dir.
bool Select(int id, int fallback=0)
Selects first occurrence of an image.
ImagePtrK GetSelected() const
Get current selection.
ImageListK GetAllNodes() const
Get all images/dirs in view.
QString GetCachedThumbUrl(int id) const
void ShowDialog(const QString &msg, const QString &event="")
Show a confirmation dialog.
void ShowSettings()
Show configuration screen.
bool Create() override
Initialises and shows the graphical elements.
DirectoryView * m_view
List of images comprising the view.
static void UpdateThumbnail(MythUIButtonListItem *button, const ImagePtrK &im, const QString &url, int index)
Update the buttonlist item with a thumbnail.
void DirSelectDown()
Goes one directory level down.
void DoScanAction(bool start)
Action scan request.
void DoMarkAll(bool mark=true)
Mark or unmark all items.
void SelectImage(int id)
Select item if it is displayed.
MythUIText * m_crumbsText
~GalleryThumbView() override
Destructor.
MythUIText * m_typeFilterText
QPair< int, int > IntPair
bool m_editsAllowed
Edit privileges.
void DoMarkItem(bool mark)
Mark or unmark a single item.
void DoShowHidden(bool show=true)
Show or hide hidden files.
void MenuMain()
Shows the main menu when the MENU button was pressed.
void MenuTransform(MythMenu *mainMenu)
Add a Transform submenu.
void Start()
Start Thumbnail screen.
bool keyPressEvent(QKeyEvent *event) override
Handle keypresses.
void MenuSlideshow(MythMenu *mainMenu)
Add a Slideshow submenu.
void ZoomOut()
Use larger buttonlist widgets.
void LoadData(int parent)
Loads & displays images from database.
MythUIProgressBar * m_scanProgressBar
MythScreenStack & m_popupStack
void ResetUiSelection()
Clears all text widgets for selected item.
void TransformItem(ImageFileTransform tran=kRotateCW)
Apply transform to an image.
QPair< MythUIButtonListItem *, int > ThumbLocation
void FlipHorizontalMarked()
void DoSetCover(bool reset=false)
Set or reset thumbnails to use for a directory cover.
void DoHideMarked(bool hide=true)
Hide or unhide marked items.
MythUIText * m_hideFilterText
void customEvent(QEvent *event) override
Handle custom events.
void Move()
Move marked images to selected dir. If no marked files, use previously marked files....
void Close() override
Exit Gallery.
void RemoveImages(const QStringList &ids, bool deleted=true)
Cleanup UI & image caches when a device is removed.
void DoHideItem(bool hide=true)
Hide or unhide item.
void ZoomIn()
Use smaller buttonlist widgets.
void MakeDir()
Show dialog to input new directory name.
QHash< QString, IntPair > m_scanProgress
Last scan updates received from scanners.
void MenuMarked(MythMenu *mainMenu)
Adds a Marking submenu.
void SetUiSelection(MythUIButtonListItem *item)
Updates text widgets for selected item.
void Eject()
Remove local device (or Import) from Gallery.
void TransformMarked(ImageFileTransform tran=kRotateCW)
Apply transform to marked images.
void MenuPaste(MythMenu *mainMenu)
Add a Paste submenu.
ImageManagerFe & m_mgr
Manages the images.
MythUIText * m_captionText
void DeleteItem()
Confirm user deletion of an item.
QSet< QString > m_scanActive
Scanners currently scanning.
GalleryThumbView(MythScreenStack *parent, const char *name)
Constructor.
void Import()
Executes user 'Import command'.
bool DirSelectUp()
Goes up one directory level.
static void DoRepeat(int on)
MenuSubjects m_menuState
Current selection/marked files when menu is invoked.
void MenuAction(MythMenu *mainMenu)
Add a Action submenu.
void ShowPassword()
Displays dialog to accept password.
void BuildImageList()
Displays all images in current view.
QMultiHash< int, ThumbLocation > m_pendingMap
Buttons waiting for thumbnails to be created.
MythUIText * m_scanProgressText
void MarkInvertAll()
Invert all marked items.
void RecursiveSlideshow()
void DoShowType(int type)
Show/hide pictures or videos.
MythUIButtonList * m_imageList
void ItemClicked(MythUIButtonListItem *item)
Action item click.
void StartSlideshow(ImageSlideShowType mode)
Start slideshow screen.
MythUIText * m_positionText
InfoList m_infoList
Image details overlay.
void DeleteMarked()
Confirm user deletion of marked files.
void UpdateImageItem(MythUIButtonListItem *item)
Initialises a single buttonlist item.
QSet< int > m_thumbExists
Images where thumbnails are known to exist.
void FlipVerticalMarked()
void SelectZoomWidget(int change)
Change buttonlist to use a different size.
QList< MythUIButtonList * > m_zoomWidgets
Theme buttonlist widgets implementing zoom levels.
void ShowRenameInput()
Show dialog to allow input.
void UpdateScanProgress(const QString &scanner, int current, int total)
Update progressbar with scan status.
QString CheckThumbnail(MythUIButtonListItem *item, const ImagePtrK &im, ImageIdList &request, int index)
Verify thumbnail is known to exist.
void ShowDetails()
Shows exif info/details about an item.
void MenuShow(MythMenu *mainMenu)
Add a Show submenu.
static QString FormatSize(int sizeKib)
void GetDescendants(const ImageIdList &ids, ImageList &files, ImageList &dirs) const
Return all (local or remote) images that are direct children of a dir.
bool GetVisibility() const
void SetType(int showType)
void SetVisibility(bool showHidden)
void SetSortOrder(int order, int dirOrder)
int GetImages(const ImageIdList &ids, ImageList &files, ImageList &dirs) const
Returns images (local or remote but not a combination)
static bool IsLocalId(int id)
Determine image type (local/remote) from its id. Root/Gallery is remote.
The image manager for use by Frontends.
QString ShortDateOf(const ImagePtrK &im) const
Return a short datestamp for thumbnail captions.
QString ChangeOrientation(ImageFileTransform transform, const ImageIdList &ids)
Apply an orientation transform to images.
QString CreateImages(int destId, const ImageListK &images)
Copies database images (but not the files themselves).
QString MoveDbImages(const ImagePtrK &destDir, ImageListK &images, const QString &srcPath)
Moves database images (but not the files themselves).
QString CrumbName(ImageItemK &im, bool getPath=false) const
Return a displayable name (with optional path) for an image.
static QString LongDateOf(const ImagePtrK &im)
Return a timestamp/datestamp for an image or dir.
static QString ConstructPath(const QString &path, const QString &name)
Assembles a canonical file path without corrupting its absolute/relative nature.
static QStringList ScanQuery()
Returns storage group scanner status.
QString DeleteFiles(const ImageIdList &ids)
Delete images.
QString MakeDir(int parent, const QStringList &names, bool rescan=true)
Create directories.
QString SetCover(int parent, int cover)
Set image to use as a cover thumbnail(s)
QString HideFiles(bool hidden, const ImageIdList &ids)
Hide/unhide images.
void CloseDevices(int devId=DEVICE_INVALID, bool eject=false)
static QString IgnoreDirs(const QString &excludes)
Set directories to ignore during scans of the storage group.
void CreateThumbnails(const ImageIdList &ids, bool forFolder)
Create thumbnails or verify that they already exist.
QString ScanImagesAction(bool start, bool local=false)
Handle scanner start/stop commands.
void SetDateFormat(const QString &format)
QString BuildTransferUrl(const QString &path, bool local) const
Generate Myth URL for a local or remote path.
QString RenameFile(const ImagePtrK &im, const QString &name)
Rename an image.
bool DetectLocalDevices()
Detect and scan local devices.
void Display(ImageItemK &im, const QStringList &tagStrings)
Build list of metadata tags.
void Update(const ImagePtrK &im)
Populates available exif details for the current image/dir.
InfoVisibleState GetState() const
bool Hide()
Remove infolist from display.
void Toggle(const ImagePtrK &im)
Toggle infolist state for an image. Focusable widgets toggle between Basic & Full info....
bool Create(bool focusable)
Initialise buttonlist from XML.
This is a wrapper around QThread that does several additional things.
void RunProlog(void)
Sets up a thread, call this if you reimplement run().
bool isFinished(void) const
void start(QThread::Priority p=QThread::InheritPriority)
Tell MThread to start running the thread in the near future.
void RunEpilog(void)
Cleans up a thread's resources, call this if you reimplement run().
QString objectName(void) const
Dialog asking for user confirmation.
void SaveBoolSetting(const QString &key, bool newValue)
QString GetHostName(void)
void SaveSetting(const QString &key, int newValue)
QString GetSetting(const QString &key, const QString &defaultval="")
int GetNumSetting(const QString &key, int defaultval=0)
bool GetBoolSetting(const QString &key, bool defaultval=false)
Basic menu dialog, message and a list of options.
This class is used as a container for messages.
const QString & Message() const
static const Type kMythEventMessage
MythScreenStack * GetMainStack()
bool TranslateKeyPress(const QString &Context, QKeyEvent *Event, QStringList &Actions, bool AllowJumps=true)
Get a list of actions for a keypress in the given context.
MythScreenStack * GetStack(const QString &Stackname)
void addListener(QObject *listener)
Add a listener to the observable.
void removeListener(QObject *listener)
Remove a listener to the observable.
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
Screen in which all other widgets are contained and rendered.
void BuildFocusList(void)
MythUIType * GetFocusWidget(void) const
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
bool SetFocusWidget(MythUIType *widget=nullptr)
Dialog prompting the user to enter a text string.
void SetVisible(bool visible) override
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
virtual void SetText(const QString &text)
void RemoveFromCacheByFile(const QString &File)
virtual void SetVisible(bool visible)
MythUIType * GetChild(const QString &name) const
Get a named child of this UIType.
static bool CopyFile(const QString &src, const QString &dst, bool overwrite=false, bool verify=false)
static bool MoveFile(const QString &src, const QString &dst, bool overwrite=false)
Worker thread for running import.
void run() override
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
ShellThread(QString cmd, QString path)
int GetResult(void) const
Worker thread for copying/moving files.
bool m_move
Copy if false, Move if true.
MythUIProgressDialog * m_dialog
Images for which copy/move failed.
QSet< ImagePtrK > ImageSet
TransferThread(TransferMap files, bool move, MythUIProgressDialog *dialog)
void run() override
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
Q_DECLARE_TR_FUNCTIONS(FileTransferWorker)
QMap< ImagePtrK, QString > TransferMap
TransferMap m_files
Maps source filepath to destination filepath.
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
Provides Gallery configuration screens.
@ kNoInfo
Details not displayed.
ImageSlideShowType
Type of slide show.
static void WaitUntilDone(MThread &worker)
Runs a worker thread and waits for it to finish.
static QString clean_comment(const QString &comment)
Implements Gallery Thumbnail screen.
ImageCaptionType
Type of captions to display.
@ kUserCaption
Exif comments.
SlideOrderType
Order of images in slideshow.
@ kSeasonal
Biased random selection so that images are more likely to appear on anniversaries.
@ kShuffle
Each image appears exactly once, but in random order.
@ kRandom
Random selection from view. An image may be absent or appear multiple times.
@ kOrdered
Ordered as per user setting GallerySortOrder.
@ kVideoOnly
Hide pictures.
@ kPicAndVideo
Show Pictures & Videos.
QVector< ImagePtr > ImageList
QList< ImagePtrK > ImageListK
QSharedPointer< ImageItemK > ImagePtrK
QPair< int, QString > ThumbPair
static constexpr int GALLERY_DB_ID
static constexpr int PHOTO_DB_ID
@ kDevice
Storage Group and local mounted media.
@ kCloneDir
A device sub dir comprised from multiple SG dirs.
@ kDirectory
A device sub directory.
QSharedPointer< ImageItem > ImagePtr
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
MythConfirmationDialog * ShowOkPopup(const QString &message, bool showCancel)
Non-blocking version of MythPopupBox::showOkPopup()
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
MythMainWindow * GetMythMainWindow(void)
MythUIBusyDialog * ShowBusyPopup(const QString &message)
uint myth_system(const QString &command, uint flags, std::chrono::seconds timeout)
static MythThemedMenu * menu
QHash< QString, QString > InfoMap
MythUIHelper * GetMythUI()
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
MBASE_PUBLIC long long copy(QFile &dst, QFile &src, uint block_size=0)
Copies src file to dst file.
def scan(profile, smoonURL, gate)
static void show(uint8_t *buf, int length)
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)