MythTV master
galleryslideview.cpp
Go to the documentation of this file.
1// C++
2#include <utility>
3
4// MythTV
10
11// MythFrontend
12#include "galleryslideview.h"
13#include "galleryviews.h"
14
15#define LOC QString("Slideview: ")
16
17// EXIF tag 0x9286 UserComment can contain garbage
18static QString clean_comment(const QString &comment)
19{
20 QString result;
21 std::copy_if(comment.cbegin(), comment.cend(), std::back_inserter(result), [](QChar x) { return x.isPrint(); } );
22 return result;
23}
24
33 bool editsAllowed)
34 : MythScreenType(parent, name),
35 m_mgr(ImageManagerFe::getInstance()),
36 m_availableTransitions(GetMythPainter()->SupportsAnimation()),
37 m_transition(m_availableTransitions.Select(
38 gCoreContext->GetNumSetting("GalleryTransitionType",
40 m_infoList(*this),
41 m_slideShowTime(gCoreContext->GetDurSetting<std::chrono::milliseconds>("GallerySlideShowTime", 3s)),
42 m_showCaptions(gCoreContext->GetBoolSetting("GalleryShowSlideCaptions", true)),
43 m_editsAllowed(editsAllowed)
44{
45 // Detect when transitions finish. Queued signal to allow redraw/pulse to
46 // complete before handling event.
48 this, &GallerySlideView::TransitionComplete, Qt::QueuedConnection);
50 this, &GallerySlideView::TransitionComplete, Qt::QueuedConnection);
51
52 // Initialise slideshow timer
53 m_timer.setSingleShot(true);
54 m_timer.setInterval(m_slideShowTime);
55 connect(&m_timer, &QTimer::timeout,
56 this, qOverload<>(&GallerySlideView::ShowNextSlide));
57
58 // Initialise status delay timer
59 m_delay.setSingleShot(true);
60 m_delay.setInterval(gCoreContext->GetDurSetting<std::chrono::milliseconds>("GalleryStatusDelay", 0s));
62
64 LOG(VB_GUI, LOG_DEBUG, "Created Slideview");
65}
66
67
72{
73 delete m_view;
75 LOG(VB_GUI, LOG_DEBUG, "Deleted Slideview");
76}
77
78
84{
85 if (!LoadWindowFromXML("image-ui.xml", "slideshow", this))
86 return false;
87
88 // Get widgets from XML
89 bool err = false;
90 UIUtilE::Assign(this, m_uiImage, "image", &err);
91 UIUtilW::Assign(this, m_uiStatus, "status");
92 UIUtilW::Assign(this, m_uiSlideCount, "slidecount");
93 UIUtilW::Assign(this, m_uiCaptionText, "caption");
94 UIUtilW::Assign(this, m_uiHideCaptions, "hidecaptions");
95
96 if (err)
97 {
98 LOG(VB_GENERAL, LOG_ERR, LOC + "Cannot load screen 'Slideshow'");
99 return false;
100 }
101
102 // Initialise details list
103 if (!m_infoList.Create(true))
104 {
105 LOG(VB_GENERAL, LOG_ERR, LOC + "Cannot load 'Info buttonlist'");
106 return false;
107 }
108
109 // Create display buffer
111
113 m_uiHideCaptions->SetText(m_showCaptions ? "" : tr("Hide"));
114
117
118 // Detect when slides are available for display.
119 // Queue so that keypress events always complete before transition starts
121 this, &GallerySlideView::SlideAvailable, Qt::QueuedConnection);
122
123 return true;
124}
125
126
131{
132 // Update transition animations
135}
136
137
144{
145 if (GetFocusWidget()->keyPressEvent(event))
146 return true;
147
148 QStringList actions;
149 bool handled = GetMythMainWindow()->TranslateKeyPress("Images", event, actions);
150
151 for (int i = 0; i < actions.size() && !handled; i++)
152 {
153 const QString& action = actions[i];
154 handled = true;
155
156 if (action == "LEFT")
157 ShowPrevSlide(1);
158 else if (action == "RIGHT")
159 ShowNextSlide(1);
160 else if (action == "UP")
161 ShowPrevSlide(10);
162 else if (action == "DOWN")
163 ShowNextSlide(10);
164 else if (action == "INFO")
165 ShowInfo();
166 else if (action == "MENU")
167 MenuMain();
168 else if (action == "PLAY")
169 {
170 if (m_playing)
171 Stop();
172 else
173 Play();
174 }
175 else if (action == "SELECT")
176 {
177 PlayVideo();
178 }
179 else if (action == "STOP")
180 {
181 Stop();
182 }
183 else if (action == "ROTRIGHT")
184 {
186 }
187 else if (action == "ROTLEFT")
188 {
190 }
191 else if (action == "FLIPHORIZONTAL")
192 {
194 }
195 else if (action == "FLIPVERTICAL")
196 {
198 }
199 else if (action == "ZOOMIN")
200 {
201 Zoom(10);
202 }
203 else if (action == "ZOOMOUT")
204 {
205 Zoom(-10);
206 }
207 else if (action == "FULLSIZE")
208 {
209 Zoom();
210 }
211 else if (action == "SCROLLUP")
212 {
213 Pan(QPoint(0, 100));
214 }
215 else if (action == "SCROLLDOWN")
216 {
217 Pan(QPoint(0, -100));
218 }
219 else if (action == "SCROLLLEFT")
220 {
221 Pan(QPoint(-120, 0));
222 }
223 else if (action == "SCROLLRIGHT")
224 {
225 Pan(QPoint(120, 0));
226 }
227 else if (action == "RECENTER")
228 {
229 Pan();
230 }
231 else if (action == "ESCAPE" && !GetMythMainWindow()->IsExitingToMain())
232 {
233 // Exit info details, if shown
234 handled = m_infoList.Hide();
235 }
236 else
237 {
238 handled = false;
239 }
240 }
241
242 if (!handled)
243 handled = MythScreenType::keyPressEvent(event);
244
245 return handled;
246}
247
248
254{
255 if (event->type() == MythEvent::kMythEventMessage)
256 {
257 auto *me = dynamic_cast<MythEvent *>(event);
258 if (me == nullptr)
259 return;
260
261 const QString& message = me->Message();
262
263 QStringList extra = me->ExtraDataList();
264
265 if (message == "IMAGE_METADATA" && !extra.isEmpty())
266 {
267 int id = extra[0].toInt();
268 ImagePtrK selected = m_view->GetSelected();
269
270 if (selected && selected->m_id == id)
271 m_infoList.Display(*selected, extra.mid(1));
272 }
273 else if (message == "THUMB_AVAILABLE")
274 {
275 if (!extra.isEmpty() && m_view->Update(extra[0].toInt()))
276 ShowSlide(0);
277 }
278 }
279 else if (event->type() == DialogCompletionEvent::kEventType)
280 {
281 auto *dce = (DialogCompletionEvent *)(event);
282
283 QString resultid = dce->GetId();
284 int buttonnum = dce->GetResult();
285
286 if (resultid == "metadatamenu")
287 {
288 switch (buttonnum)
289 {
290 case 0: Transform(kRotateCW); break;
291 case 1: Transform(kRotateCCW); break;
292 case 2: Transform(kFlipHorizontal); break;
293 case 3: Transform(kFlipVertical); break;
294 case 4: Transform(kResetToExif); break;
295 case 5: Zoom(10); break;
296 case 6: Zoom(-10); break;
297 }
298 }
299 }
300}
301
302
307{
308 // Create the main menu that will contain the submenus above
309 auto *menu = new MythMenu(tr("Slideshow Options"), this, "mainmenu");
310
312 if (im && im->m_type == kVideoFile)
313 menu->AddItem(tr("Play Video"), qOverload<>(&GallerySlideView::PlayVideo));
314
315 if (m_playing)
316 menu->AddItem(tr("Stop"), &GallerySlideView::Stop);
317 else
318 menu->AddItem(tr("Start SlideShow"), qOverload<>(&GallerySlideView::Play));
319
320 if (gCoreContext->GetBoolSetting("GalleryRepeat", false))
321 menu->AddItem(tr("Turn Repeat Off"), &GallerySlideView::RepeatOff);
322 else
323 menu->AddItem(tr("Turn Repeat On"), qOverload<>(&GallerySlideView::RepeatOn));
324
326
328 {
329 if (m_showCaptions)
330 menu->AddItem(tr("Hide Captions"), &GallerySlideView::HideCaptions);
331 else
332 menu->AddItem(tr("Show Captions"), &GallerySlideView::ShowCaptions);
333 }
334
335 QString details;
336 switch (m_infoList.GetState())
337 {
338 case kBasicInfo: details = tr("More Details"); break;
339 case kFullInfo: details = tr("Less Details"); break;
340 default:
341 case kNoInfo: details = tr("Show Details"); break;
342 }
343 menu->AddItem(details, &GallerySlideView::ShowInfo);
344
345 if (m_infoList.GetState() != kNoInfo)
346 menu->AddItem(tr("Hide Details"), &GallerySlideView::HideInfo);
347
348 MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
349 auto *menuPopup = new MythDialogBox(menu, popupStack, "menuPopup");
350 if (menuPopup->Create())
351 popupStack->AddScreen(menuPopup);
352 else
353 delete menuPopup;
354}
355
356
362{
364 if (im && !m_playing)
365 {
366 auto *menu = new MythMenu(tr("Transform Options"),
367 this, "metadatamenu");
368 if (m_editsAllowed)
369 {
370 menu->AddItem(tr("Rotate CW"));
371 menu->AddItem(tr("Rotate CCW"));
372 menu->AddItem(tr("Flip Horizontal"));
373 menu->AddItem(tr("Flip Vertical"));
374 menu->AddItem(tr("Reset to Exif"));
375 }
376
378 menu->AddItem(tr("Zoom In"));
379
381 menu->AddItem(tr("Zoom Out"));
382
383 mainMenu.AddItem(tr("Transforms"), nullptr, menu);
384 }
385}
386
387
396void GallerySlideView::Start(ImageSlideShowType type, int parentId, int selectedId)
397{
399
400 if (type == kBrowseSlides)
401 {
402 // Browsing views a single ordered directory
403 m_view = new FlatView(kOrdered);
404
405 // Load db images
406 m_view->LoadFromDb(parentId);
407
408 // Display current selection, falling back to first
409 m_view->Select(selectedId);
410
411 // Display slide immediately
412 ShowSlide();
413 }
414 else
415 {
416 int orderInt = gCoreContext->GetNumSetting("GallerySlideOrder", kOrdered);
417
418 SlideOrderType order = (orderInt < kOrdered) || (orderInt > kSeasonal)
419 ? kOrdered
420 : static_cast<SlideOrderType>(orderInt);
421
422 // Recursive uses a view of a directory subtree; Normal views a single directory
423 m_view = (type == kRecursiveSlideShow) ? new TreeView(order)
424 : new FlatView(order);
425 // Load db images
426 m_view->LoadFromDb(parentId);
427
428 // Ordered views start from selected image
429 if (order == kOrdered)
430 // Adjust view so that slideshows show count rather than position
431 m_view->Rotate(selectedId);
432
433 // No transition for first image
434 Play(false);
435 }
436}
437
438
440{
442
443 // Stop further loads
445
446 // Update gallerythumbview selection
448 if (im)
449 emit ImageSelected(im->m_id);
450
452}
453
454
459{
460 m_playing = false;
461 m_timer.stop();
462 SetStatus(tr("Stopped"));
463}
464
465
470void GallerySlideView::Play(bool useTransition)
471{
472 // Start from next slide
473 ShowNextSlide(1, useTransition);
474
475 m_playing = true;
476 if (!m_suspended)
477 m_timer.start();
478 SetStatus(tr("Playing"), true);
479}
480
481
486{
487 m_timer.stop();
488 m_suspended = true;
489}
490
491
496{
497 m_suspended = false;
498 if (m_playing)
499 m_timer.start();
500}
501
502
508{
510 if (im && !m_playing)
511 {
512 ImageIdList list;
513 list.append(im->m_id);
514 QString err = m_mgr.ChangeOrientation(state, list);
515 if (!err.isEmpty())
516 ShowOkPopup(err);
517 }
518}
519
520
525void GallerySlideView::Zoom(int increment)
526{
527 if (!m_playing)
528 m_slides.GetCurrent().Zoom(increment);
529}
530
531
536void GallerySlideView::Pan(QPoint offset)
537{
538 if (!m_playing)
539 m_slides.GetCurrent().Pan(offset);
540}
541
542
547{
549}
550
551
556{
558}
559
560
565{
566 m_showCaptions = true;
568}
569
570
575{
576 m_showCaptions = false;
577 m_uiHideCaptions->SetText(tr("Hide"));
578}
579
580
586{
588 if (!im)
589 // Reached view limits
590 return;
591
592 LOG(VB_FILE, LOG_DEBUG, LOC + QString("Selected %1").arg(im->m_filePath));
593
594 // Suspend the timer until the transition has finished
595 Suspend();
596
597 // Load image from file
598 if (!m_slides.Load(im, direction))
599 // Image not yet available: show loading status
600 SetStatus(tr("Loading"), true);
601}
602
603
610{
611 // Transition speed = 0.5x for every slide waiting. Min = 1x, Max = Half buffer size
612 float speed = 0.5F + (count / 2.0F);
613
614 // Are we transitioning ?
615 if (m_transitioning)
616 {
617 // More slides waiting for display: accelerate current transition
618 LOG(VB_FILE, LOG_DEBUG, LOC + QString("Changing speed to %1").arg(speed));
619 m_transition.SetSpeed(speed);
620 return;
621 }
622
623 // We've been waiting for this slide: transition immediately
624 m_transitioning = true;
625
626 // Take next slide
627 Slide &next = m_slides.GetNext();
628
629 // Update loading status
630 ClearStatus(next);
631
632 // Update slide counts
633 if (m_uiSlideCount)
635
636 int direction = next.GetDirection();
637
638 // Use instant transition for start-up & updates (dir = 0)
639 // and browsing with transitions turned off
640 Transition &transition =
641 (direction != 0 &&
642 (m_playing || gCoreContext->GetBoolSetting("GalleryBrowseTransition", false)))
644
645 // Reset any zoom before starting transition
646 Zoom();
647 transition.Start(m_slides.GetCurrent(), next, direction >= 0, speed);
648}
649
650
658{
659 if (m_isDeleting)
660 return;
661
662 m_transitioning = false;
663
664 // Release old slide, which may start a new transition
666
667 // No further actions when skipping
668 // cppcheck-suppress knownConditionTrueFalse
669 if (m_transitioning)
670 return;
671
672 // Preload next slide, if any
674
675 // Populate display for new slide
677
678 // Update any file details information
679 m_infoList.Update(im);
680
681 if (im && m_uiCaptionText)
682 {
683 // show the date & comment
684 QStringList text;
685 text << ImageManagerFe::LongDateOf(im);
686
687 QString comment = clean_comment(im->m_comment);
688 if (!comment.isEmpty())
689 text << comment;
690
691 m_uiCaptionText->SetText(text.join(" - "));
692 }
693
694 // Start any video unless we're paused or browsing
695 if (im && im->m_type == kVideoFile)
696 {
697 if (m_playing)
698 PlayVideo();
699 else
700 SetStatus(tr("Video"));
701 }
702
703 // Resume slideshow timer
704 Release();
705}
706
707
712{
713 if (m_playing && m_view->HasPrev(inc) == nullptr)
714 {
715 // Prohibit back-wrapping during slideshow: it will cause premature end
716 //: Cannot go back beyond first slide of slideshow
717 SetStatus(tr("Start"));
718 }
719 else if (m_view->Prev(inc))
720 {
721 ShowSlide(-1);
722 }
723}
724
725
731void GallerySlideView::ShowNextSlide(int inc, bool useTransition)
732{
733 // Browsing always wraps; slideshows depend on repeat setting
734 if (m_playing && m_view->HasNext(inc) == nullptr
735 && !gCoreContext->GetBoolSetting("GalleryRepeat", false))
736 {
737 // Don't stop due to jumping past end
738 if (inc == 1)
739 {
740 Stop();
741 //: Slideshow has reached last slide
742 SetStatus(tr("End"));
743 }
744 }
745 else if (m_view->Next(inc))
746 {
747 ShowSlide(useTransition ? 1 : 0);
748 }
749 else
750 {
751 // No images
752 Stop();
755 if (m_uiSlideCount)
756 m_uiSlideCount->SetText("0/0");
757 if (m_uiCaptionText)
759 }
760}
762{
763 ShowNextSlide(1, true);
764}
765
766
771{
773 return;
774
776
777 if (im && im->m_type == kVideoFile)
778 GetMythMainWindow()->HandleMedia("Internal", im->m_url);
779}
780
781
787void GallerySlideView::SetStatus(QString msg, bool delay)
788{
789 m_statusText = std::move(msg);
790 if (m_uiStatus)
791 {
792 if (delay)
793 m_delay.start();
794 else
795 ShowStatus();
796 }
797}
798
799
801{
802 if (m_uiStatus)
804}
805
806
808{
809 if (m_uiStatus)
810 {
811 m_delay.stop();
812
813 if (slide.FailedLoad())
814 {
815 ImagePtrK im = slide.GetImageData();
816 SetStatus(tr("Failed to load %1").arg(im ? im->m_filePath : "?"));
817 }
818 else
819 {
820 m_uiStatus->Reset();
821 }
822 }
823}
824
826{
827 gCoreContext->SaveSetting("GalleryRepeat", on);
828}
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
Definition: mythdialogbox.h:41
static const Type kEventType
Definition: mythdialogbox.h:56
A datastore of images for display by a screen.
Definition: galleryviews.h:102
bool Update(int id)
Updates view with images that have been updated.
ImagePtrK Prev(int inc)
Decrements iterator and returns previous image. Wraps at start.
bool Select(int id, int fallback=0)
Selects first occurrence of an image.
ImagePtrK HasNext(int inc) const
Peeks at next image in view but does not advance iterator.
ImagePtrK Next(int inc)
Advance iterator and return next image, wrapping if necessary. Regenerates unordered views on wrap.
QString GetPosition() const
Get positional status.
ImagePtrK GetSelected() const
Get current selection.
virtual bool LoadFromDb(int parentId)
Populate view with database images from a directory.
ImagePtrK HasPrev(int inc) const
Peeks at previous image in view but does not decrement iterator.
void Rotate(int id)
Rotate view so that starting image is at front.
void ClearStatus(const Slide &slide)
QString m_statusText
Text to display as status.
MythUIText * m_uiSlideCount
QTimer m_timer
Slide duration timer.
static void RepeatOn()
MythUIText * m_uiHideCaptions
ImageManagerFe & m_mgr
Manages the images.
bool m_showCaptions
If true, captions are shown.
void ShowInfo()
Show exif info list.
void HideCaptions()
Hide text widgets.
~GallerySlideView() override
Destructor.
void PlayVideo()
Starts internal player for video.
void Release()
Unpause transition timer.
FlatView * m_view
List of images comprising the slideshow.
void customEvent(QEvent *event) override
Handle custom events.
void ImageSelected(int)
void HideInfo()
Hide exif info list.
SlideBuffer m_slides
A queue of slides used to display images.
bool Create() override
Initialises the graphical elements.
static void RepeatOff()
bool m_editsAllowed
True when edits are enabled.
bool m_transitioning
True when a transition is in progress.
void ShowCaptions()
Show text widgets.
TransitionNone m_updateTransition
Instant transition that is always used for start-up & image updates.
void Start(ImageSlideShowType type, int parentId, int selectedId=0)
Start slideshow.
void TransitionComplete()
Transition to new slide has finished.
QTimer m_delay
Status delay timer.
void SetStatus(QString msg, bool delay=false)
Displays status text (Loading, Paused etc.)
void Close() override
void Pan(QPoint offset=QPoint(0, 0))
Pan current slide.
MythUIText * m_uiCaptionText
void MenuTransforms(MythMenu &mainMenu)
Add Transforms submenu.
InfoList m_infoList
Image details overlay.
void MenuMain()
Shows the popup menu.
GallerySlideView(MythScreenStack *parent, const char *name, bool editsAllowed)
Constructor.
void Stop()
Stop a playing slideshow.
void Zoom(int increment=0)
Zoom current slide.
bool m_playing
True when slideshow is running.
void Pulse() override
Update transition.
void Suspend()
Pause transition timer temporarily.
bool m_suspended
True when transition is running or video playing.
MythUIImage * m_uiImage
void SlideAvailable(int count)
Start transition.
Transition & m_transition
Selected transition.
bool keyPressEvent(QKeyEvent *event) override
Handle keypresses.
void ShowPrevSlide(int inc=1)
Display the previous slide in the sequence.
std::chrono::milliseconds m_slideShowTime
Time to display a slide in a slideshow.
void Transform(ImageFileTransform state)
Action transform request.
MythUIText * m_uiStatus
void ShowSlide(int direction=0)
Display slide.
The image manager for use by Frontends.
Definition: imagemanager.h:456
QString ChangeOrientation(ImageFileTransform transform, const ImageIdList &ids)
Apply an orientation transform to images.
static QString LongDateOf(const ImagePtrK &im)
Return a timestamp/datestamp for an image or dir.
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
Definition: galleryinfo.h:34
bool Hide()
Remove infolist from display.
void Toggle(const ImagePtrK &im)
Toggle infolist state for an image. Focusable widgets toggle between Basic & Full info....
Definition: galleryinfo.cpp:86
bool Create(bool focusable)
Initialise buttonlist from XML.
Definition: galleryinfo.cpp:68
void SaveSetting(const QString &key, int newValue)
int GetNumSetting(const QString &key, int defaultval=0)
std::enable_if_t< std::chrono::__is_duration< T >::value, T > GetDurSetting(const QString &key, T defaultval=T::zero())
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.
Definition: mythevent.h:17
const QString & Message() const
Definition: mythevent.h:65
static const Type kMythEventMessage
Definition: mythevent.h:79
static void DisableScreensaver()
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)
bool HandleMedia(const QString &Handler, const QString &Mrl, const QString &Plot="", const QString &Title="", const QString &Subtitle="", const QString &Director="", int Season=0, int Episode=0, const QString &Inetref="", std::chrono::minutes LenMins=2h, const QString &Year="1895", const QString &Id="", bool UseBookmarks=false)
static void RestoreScreensaver()
void AddItem(const QString &title)
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)
virtual void Close()
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
Definition: mythuitext.cpp:65
virtual void SetText(const QString &text)
Definition: mythuitext.cpp:115
virtual void Pulse(void)
Pulse is called 70 times a second to trigger a single frame of an animation.
Definition: mythuitype.cpp:456
Slide & GetNext()
Definition: galleryslide.h:233
void ReleaseCurrent()
Move head slide to back of queue and flush waiting slides.
void Initialise(MythUIImage &image)
Construct buffer.
Slide & GetCurrent()
Definition: galleryslide.h:227
bool Load(const ImagePtrK &im, int direction)
Assign an image to next available slide, start loading and signal when done.
void Preload(const ImagePtrK &im)
Load an image in next available slide.
void SlideReady(int count)
Signals that buffer has (count) loaded slides awaiting display.
A specialised image for slideshows.
Definition: galleryslide.h:157
void Pan(QPoint offset)
Initiate pan.
bool FailedLoad() const
Definition: galleryslide.h:174
void Zoom(int percentage)
Initiate slide zoom.
bool CanZoomOut() const
Definition: galleryslide.h:171
int GetDirection() const
Definition: galleryslide.h:175
ImagePtrK GetImageData() const
Definition: galleryslide.h:165
void Clear()
Reset slide to unused state.
bool CanZoomIn() const
Definition: galleryslide.h:170
Base class of an animated transition that can be accelerated & reversed.
virtual void Start(Slide &from, Slide &to, bool forwards, float speed=1.0)
Start base transition.
void finished()
virtual void Pulse()=0
virtual void SetSpeed(float)
A datastore of images for display by a screen. Provides an ordered list of images (no dirs) from a di...
Definition: galleryviews.h:218
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
@ kNoInfo
Details not displayed.
Definition: galleryinfo.h:17
@ kBasicInfo
Shows just the most useful exif tags.
Definition: galleryinfo.h:18
@ kFullInfo
Shows all exif tags.
Definition: galleryinfo.h:19
#define LOC
static QString clean_comment(const QString &comment)
Slideshow screen.
ImageSlideShowType
Type of slide show.
@ kRecursiveSlideShow
@ kBrowseSlides
@ kBlendTransition
Provides view datastores for Gallery screens.
SlideOrderType
Order of images in slideshow.
Definition: galleryviews.h:24
@ kSeasonal
Biased random selection so that images are more likely to appear on anniversaries.
Definition: galleryviews.h:28
@ kOrdered
Ordered as per user setting GallerySortOrder.
Definition: galleryviews.h:25
ImageFileTransform
Image transformations.
Definition: imagemetadata.h:46
@ kFlipVertical
Reflect about horizontal axis.
Definition: imagemetadata.h:51
@ kRotateCCW
Rotate anti-clockwise.
Definition: imagemetadata.h:49
@ kFlipHorizontal
Reflect about vertical axis.
Definition: imagemetadata.h:50
@ kRotateCW
Rotate clockwise.
Definition: imagemetadata.h:48
@ kResetToExif
Reset to Exif value.
Definition: imagemetadata.h:47
QSharedPointer< ImageItemK > ImagePtrK
Definition: imagetypes.h:165
@ kVideoFile
A video.
Definition: imagetypes.h:40
QList< int > ImageIdList
Definition: imagetypes.h:60
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_)
Definition: mythlogging.h:39
MythPainter * GetMythPainter(void)
MythMainWindow * GetMythMainWindow(void)
static MythThemedMenu * menu
STL namespace.
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)
Definition: mythuiutils.h:27
VERBOSE_PREAMBLE Most true
Definition: verbosedefs.h:95