25#define LOC QString("Thumbview: ")
31 std::ranges::copy_if(std::as_const(comment), std::back_inserter(result),
32 [](QChar x) {
return x.isPrint(); } );
50 LOG(VB_GENERAL, LOG_INFO, QString(
"Executing \"%1\"").arg(cmd));
54 LOG(VB_GENERAL, LOG_INFO, QString(
" ...with result %1").arg(
m_result));
88 auto add_size = [](
int t,
const ImagePtrK & im){
return t + im->m_size; };
89 int total = std::accumulate(keys.cbegin(), keys.cend(), 0, add_size);
92 for (
auto it =
m_files.constKeyValueBegin();
93 it !=
m_files.constKeyValueEnd(); it++)
96 QString newPath = it->second;
100 QString message = QString(
"%1 %2\n%3")
101 .arg(
action, QFileInfo(im->m_url).fileName(),
105 QApplication::postEvent(
m_dialog, pue);
108 LOG(VB_FILE, LOG_INFO, QString(
"%2 %3 -> %4")
109 .arg(
action, im->m_url, newPath));
119 LOG(VB_GENERAL, LOG_ERR,
120 QString(
"%1: Failed to copy/move %2 -> %3")
124 progressSize += im->m_size;
132 QApplication::postEvent(
m_dialog, pue);
155 std::this_thread::sleep_for(1ms);
156 QCoreApplication::processEvents();
174 m_editsAllowed(
gCoreContext->GetSetting(
"GalleryPassword").isEmpty())
187 LOG(VB_GUI, LOG_DEBUG,
LOC +
"Exiting Gallery");
197 LOG(VB_GUI, LOG_DEBUG,
LOC +
"Closing Gallery");
222 QString name = QString(
"images%1").arg(zoom++);
227 widget->SetVisible(
false);
229 name = QString(
"images%1").arg(zoom++);
235 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Screen 'Gallery' is missing 'images0'");
238 LOG(VB_GUI, LOG_DEBUG,
LOC + QString(
"Screen 'Gallery' found %1 zoom levels")
244 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Cannot load 'Info buttonlist'");
284 for (
int i = 0; i < actions.size() && !handled; i++)
286 const QString&
action = actions[i];
291 else if (
action ==
"INFO")
293 else if (
action ==
"ZOOMIN")
295 else if (
action ==
"ZOOMOUT")
297 else if (
action ==
"ROTRIGHT")
299 else if (
action ==
"ROTLEFT")
301 else if (
action ==
"FLIPHORIZONTAL")
303 else if (
action ==
"FLIPVERTICAL")
305 else if (
action ==
"COVER")
322 else if (
action ==
"PLAY")
326 else if (
action ==
"RECURSIVESHOW")
329 if (im && im->IsDirectory())
332 else if (
action ==
"MARK")
375 auto *me =
dynamic_cast<MythEvent *
>(event);
379 const QString& mesg = me->
Message();
380 QStringList extra = me->ExtraDataList();
383 QStringList token = mesg.split(
' ');
387 if (token[0] ==
"IMAGE_METADATA")
389 int id = extra[0].toInt();
392 if (selected && selected->m_id ==
id)
395 else if (token[0] ==
"THUMB_AVAILABLE")
397 int id = extra[0].toInt();
403 QList<ThumbLocation> affected =
m_pendingMap.values(
id);
406 if (affected.isEmpty())
409 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
410 QString(
"Rx %1 : %2").arg(token[0], extra.join(
",")));
416 for (
const ThumbLocation & location : std::as_const(affected))
419 int index = location.second;
429 else if (token[0] ==
"IMAGE_DB_CHANGED")
432 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
433 QString(
"Rx %1 : %2").arg(token[0], extra.join(
",")));
435 if (!extra.isEmpty())
437 QStringList idDeleted =
438 extra[0].split(
",", Qt::SkipEmptyParts);
441 if (extra.size() >= 2)
443 QStringList idChanged =
444 extra[1].split(
",", Qt::SkipEmptyParts);
451 else if (token[0] ==
"IMAGE_DEVICE_CHANGED")
454 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
455 QString(
"Rx %1 : %2").arg(token[0], extra.join(
",")));
462 for (
const QString & url : std::as_const(extra))
468 else if (token[0] ==
"IMAGE_SCAN_STATUS" && extra.size() == 3)
478 QString resultid = dce->GetId();
479 int buttonnum = dce->GetResult();
481 if (resultid ==
"FileRename")
483 QString newName = dce->GetResultText();
492 else if (resultid ==
"MakeDir")
497 QString name = dce->GetResultText();
498 QString err = name.contains(
"/")
506 else if (resultid ==
"SlideOrderMenu")
512 case 0: slideOrder =
kOrdered;
break;
513 case 1: slideOrder =
kShuffle;
break;
514 case 2: slideOrder =
kRandom;
break;
518 LOG(VB_FILE, LOG_DEBUG,
LOC + QString(
"Order %1").arg(slideOrder));
520 else if (resultid ==
"ImageCaptionMenu")
534 else if (resultid ==
"DirCaptionMenu")
547 else if (resultid ==
"Password")
549 QString password = dce->GetResultText();
552 else if (buttonnum == 1)
562 else if (resultid ==
"ConfirmDeleteMarked")
585 for (
const QString &
id : std::as_const(ids))
593 for (
const QString & url : std::as_const(urls))
595 LOG(VB_FILE, LOG_DEBUG,
LOC +
596 QString(
"Clearing image cache of '%1'").arg(url));
612 if (message.size() == 4 && message[0] ==
"OK")
656 "Scan storage group using menu,\n"
657 "or insert/mount local media.\n"));
676 for (
const ImagePtrK & im : std::as_const(nodes))
684 QVariant::fromValue(im));
686 item->setCheckable(
true);
698 item->DisplayState(
"upfolder",
"parenttype");
700 else if (im == selected)
726 if (im->m_dirCount > 0)
729 .arg(im->m_fileCount).arg(im->m_dirCount),
734 item->
SetText(QString::number(im->m_fileCount),
"childcount");
737 item->
DisplayState(im->IsDevice() ?
"device" :
"subfolder",
"buttontype");
753 QString hideState = (im->m_isHidden) ?
"hidden" :
"visible";
759 im->IsFile() ?
"GalleryImageCaption"
760 :
"GalleryDirCaption");
782 if (im->m_thumbNails.size() == 1)
794 for (
int index = 0; index < im->m_thumbNails.size(); ++index)
798 thumbMap.insert(QString(
"thumbimage%1").arg(index), url);
800 if (!thumbMap.isEmpty())
805 if (!request.isEmpty())
824 ThumbPair thumb(im->m_thumbNails.at(index));
825 int id = thumb.first;
852 if (im->m_thumbNails.size() == 1)
859 default: button->
SetImage(url,
"folderimage");
break;
865 button->
SetImage(url, QString(
"thumbimage%1").arg(index));
886 LOG(VB_GUI, LOG_DEBUG,
LOC + QString(
"Scan Finished %1 %2/%3")
887 .arg(scanner).arg(
current).arg(total));
928 LOG(VB_GUI, LOG_DEBUG,
LOC + QString(
"Scan Started %1 %2/%3")
929 .arg(scanner).arg(
current).arg(total));
941 currentAgg +=
scan.first;
942 totalAgg +=
scan.second;
999 if (im->IsFile() || im->IsDevice())
1003 if (!comment.isEmpty())
1020 case kPicOnly : text = tr(
"Pictures");
break;
1021 case kVideoOnly : text = tr(
"Videos");
break;
1042 auto *
menu =
new MythMenu(tr(
"Gallery Options"),
this,
"mainmenu");
1071 if (popup->Create())
1124 if (
menu->IsEmpty())
1143 if (files.isEmpty())
1145 if (files.isEmpty())
1148 QString title = tr(
"%L1 marked").arg(files.size());
1179 mainMenu->
AddItem(tr(
"Transforms"),
nullptr,
menu);
1191 mainMenu->
AddItem(tr(
"Transforms"),
nullptr,
menu);
1223 menu =
new MythMenu(selected->m_baseName,
this,
"actionmenu");
1228 if (selected->m_isHidden)
1237 else if (selected->m_userThumbnail)
1244 if (selected->IsDirectory()
1254 if (selected->IsDevice() && selected->IsLocal())
1257 if (
menu->IsEmpty())
1275 case kShuffle : ordering = tr(
"Shuffled");
break;
1276 case kRandom : ordering = tr(
"Random");
break;
1277 case kSeasonal : ordering = tr(
"Seasonal");
break;
1279 case kOrdered : ordering = tr(
"Ordered");
break;
1282 auto *
menu =
new MythMenu(tr(
"Slideshow") +
" (" + ordering +
")",
1283 this,
"SlideshowMenu");
1299 auto *orderMenu =
new MythMenu(tr(
"Slideshow Order"),
this,
"SlideOrderMenu");
1301 orderMenu->AddItem(tr(
"Ordered"),
nullptr,
nullptr, order ==
kOrdered);
1302 orderMenu->AddItem(tr(
"Shuffled"),
nullptr,
nullptr, order ==
kShuffle);
1303 orderMenu->AddItem(tr(
"Random"),
nullptr,
nullptr, order ==
kRandom);
1304 orderMenu->AddItem(tr(
"Seasonal"),
nullptr,
nullptr, order ==
kSeasonal);
1306 menu->AddItem(tr(
"Change Order"),
nullptr, orderMenu);
1313 mainMenu->
AddItem(tr(
"Slideshow"),
nullptr,
menu);
1323 auto *
menu =
new MythMenu(tr(
"Show Options"),
this,
"showmenu");
1338 auto *captionMenu =
new MythMenu(tr(
"Image Captions"),
this,
1339 "ImageCaptionMenu");
1343 captionMenu->AddItem(tr(
"Comment"),
nullptr,
nullptr,
show ==
kUserCaption);
1344 captionMenu->AddItem(tr(
"None"),
nullptr,
nullptr,
show ==
kNoCaption);
1346 menu->AddItem(tr(
"Image Captions"),
nullptr, captionMenu);
1349 captionMenu =
new MythMenu(tr(
"Directory Captions"),
this,
"DirCaptionMenu");
1353 captionMenu->AddItem(tr(
"None"),
nullptr,
nullptr,
show ==
kNoCaption);
1355 menu->AddItem(tr(
"Directory Captions"),
nullptr, captionMenu);
1371 ? tr(
"Show Details") : tr(
"Hide Details");
1447 if (slide->Create())
1455 if (selected->IsDirectory())
1458 slide->Start(mode, selected->m_id);
1463 slide->Start(mode, selected->m_parentId, selected->m_id);
1481 LOG(VB_GUI, LOG_DEBUG,
LOC +
1482 QString(
"Going up from %1").arg(im->m_filePath));
1502 LOG(VB_GUI, LOG_DEBUG,
LOC +
1503 QString(
"Going down to %1").arg(im->m_filePath));
1567 ids.append(im->m_id);
1648 ShowDialog(tr(
"Do you want to delete all marked files ?"),
1649 "ConfirmDeleteMarked");
1732 if (popup->Create())
1734 popup->SetReturnEvent(
this, event);
1752 QString msg = tr(
"Enter a new name:");
1755 if (popup->Create())
1757 popup->SetReturnEvent(
this,
"FileRename");
1782 QString msg = tr(
"Enter password:");
1784 if (popup->Create())
1786 popup->SetReturnEvent(
this,
"Password");
1896 tr(
"Enter name of new directory"),
1898 if (popup->Create())
1900 popup->SetReturnEvent(
this,
"MakeDir");
1934 if (!destDir || destDir->IsFile())
1939 if (markedIds.isEmpty())
1942 if (markedIds.isEmpty())
1954 if (dirs.isEmpty() && files.isEmpty())
1962 ImagePtrK aChild = dirs.isEmpty() ? files[0] : dirs[0];
1965 int basePathSize = aChild->m_filePath.size() - aChild->m_baseName.size();
1970 for (
const ImagePtr & im : std::as_const(files))
1974 im->m_filePath.mid(basePathSize));
1977 destDir->IsLocal()));
2000 if (!failed.isEmpty())
2001 ShowOkPopup(tr(
"Failed to copy %L1/%Ln file(s)",
nullptr, transfers.size())
2002 .arg(failed.size()));
2005 for (
const ImagePtrK & im : std::as_const(failed))
2006 transfers.remove(im);
2011 QStringList dirPaths;
2012 for (
const ImagePtr & im : std::as_const(dirs))
2014 QString relPath = im->m_filePath.mid(basePathSize);
2016 dirPaths << relPath;
2023 newImages.append(im);
2027 if (!dirPaths.isEmpty())
2030 if (!newImages.isEmpty())
2040 for (
const ImagePtrK & im : std::as_const(newImages))
2062 if (!destDir || destDir->IsFile())
2067 if (markedIds.isEmpty())
2070 if (markedIds.isEmpty())
2095 if (!dirs.isEmpty())
2097 if (!files.isEmpty())
2105 int basePathSize = aChild->m_filePath.size() - aChild->m_baseName.size();
2106 QString parentPath = aChild->m_filePath.left(basePathSize);
2110 for (
const QSharedPointer<ImageItem> & im : std::as_const(images))
2114 im->m_filePath.mid(basePathSize));
2140 if (!failed.isEmpty())
2141 ShowOkPopup(tr(
"Failed to move %L1/%Ln file(s)",
nullptr, transfers.size())
2142 .arg(failed.size()));
2145 for (
const ImagePtrK & im : std::as_const(failed))
2146 transfers.remove(im);
2148 if (!transfers.isEmpty())
2153 for (
const ImagePtrK & im : std::as_const(moved))
2170 ShowOkPopup(tr(
"Failed to create temporary directory."));
2176 cmd.replace(
"%TMPDIR%", path);
2180 ShowBusyPopup(tr(
"Running Import command.\nPlease wait..."));
2195 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)