MythTV  master
gallerytransitions.cpp
Go to the documentation of this file.
1 #include "gallerytransitions.h"
2 
3 #include <utility>
4 
7 
8 #define LOC QString("Transition: ")
9 
10 
11 Transition::Transition(const QString& name)
12  : m_duration(gCoreContext->GetDurSetting<std::chrono::milliseconds>("GalleryTransitionTime", 1s))
13 {
14  setObjectName(name);
15 }
16 
17 
25 {
26  // Guard against garbage
27  int value = (setting >= kNoTransition && setting < kLastTransSentinel)
28  ? setting : kNoTransition;
29 
30  // If chosen transition isn't viable for painter then use previous ones.
31  // First transition must always be useable by all painters
32  Transition *result = nullptr;
33  do
34  result = m_map.value(value--, nullptr);
35  while (value >= kNoTransition && !result);
36 
37  if (result)
38  return *result;
39 
40  LOG(VB_GENERAL, LOG_CRIT,
41  LOC + QString("No transitions found for setting %1").arg(setting));
42 
43  return m_immediate;
44 }
45 
46 
52 {
53  // Create all non-animated transitions to be used by Random
54  m_map.insert(kBlendTransition, new TransitionBlend());
55  m_map.insert(kSlideTransition, new TransitionSlide());
56 
57  // Create all animated transitions to be used by Random
58  if (includeAnimations)
59  {
60  m_map.insert(kTwistTransition, new TransitionTwist());
61  m_map.insert(kZoomTransition, new TransitionZoom());
62  m_map.insert(kSpinTransition, new TransitionSpin());
63  }
64 
65  // Create random set from those already defined
66  m_map.insert(kRandomTransition, new TransitionRandom(m_map.values()));
67 
68  // Create other transitions that aren't to be used by Random
69  m_map.insert(kNoTransition, new TransitionNone());
70 }
71 
72 
80 void Transition::Start(Slide &from, Slide &to,
81  bool forwards, float speed)
82 {
83  LOG(VB_FILE, LOG_DEBUG, LOC +
84  QString("Starting transition %1 -> %2 (forwards= %3, speed= %4)")
85  .arg(from.objectName(), to.objectName()).arg(forwards).arg(speed));
86 
87  m_old = &from;
88  m_new = &to;
89 
90  // When playing forwards next image replaces prev image
91  // When playing backwards prev image replaces next image
92  m_prev = forwards ? m_old : m_new;
93  m_next = forwards ? m_new : m_old;
94 
95  // Set up transition
96  Initialise();
97 
98  // Make new image visible
99  m_new->SetVisible(true);
100 }
101 
102 
107 {
108  // Hide old image before it is reset
109  m_old->SetVisible(false);
110 
111  // Undo transition effects
112  Finalise();
113 
114  LOG(VB_FILE, LOG_DEBUG, LOC +
115  QString("Finished transition to %1").arg(m_new->objectName()));
116 
117  emit finished();
118 }
119 
120 
129  bool forwards, float speed)
130 {
131  Transition::Start(from, to, forwards, speed);
132 
133  // Finish immediately
134  Finished();
135 }
136 
137 
144 GroupTransition::GroupTransition(GroupAnimation *animation, const QString& name)
145  : Transition(name), m_animation(animation)
146 {
147  // Complete transition when the group finishes
149 }
150 
151 
156 {
157  // Group owns animation
158  delete m_animation;
159 }
160 
161 
170  bool forwards, float speed)
171 {
172  // Clear previous transition
173  m_animation->Clear();
174 
175  Transition::Start(from, to, forwards, speed);
176 
177  // Start group
178  m_animation->Start(forwards, speed);
179 }
180 
181 
186 void GroupTransition::SetSpeed(float speed)
187 {
188  if (m_animation)
189  m_animation->SetSpeed(speed);
190 }
191 
192 
196 {
197  if (m_animation)
198  m_animation->Pulse();
199 }
200 
201 
206 {
207  // Fade out prev image
208  auto *oldPic = new Animation(m_prev, Animation::Alpha);
209  oldPic->Set(255, 0, m_duration, QEasingCurve::InOutQuad);
210  m_animation->Add(oldPic);
211 
212  // Fade in next image
213  auto *newPic = new Animation(m_next, Animation::Alpha);
214  newPic->Set(0, 255, m_duration, QEasingCurve::InOutQuad);
215  m_animation->Add(newPic);
216 
217  // Hide new image until it's needed
218  m_new->SetAlpha(0);
219 }
220 
221 
226 {
227  // Undo effects of the transition
228  m_old->SetAlpha(255);
229 }
230 
231 
236 {
237  // Reduce hzoom of left image to nothing
238  auto *oldPic = new Animation(m_prev, Animation::HorizontalZoom);
239  oldPic->Set(1.0, 0.0, m_duration / 2, QEasingCurve::InQuart);
240  m_animation->Add(oldPic);
241 
242  // Increase hzoom of right image from nothing to full
243  auto *newPic = new Animation(m_next, Animation::HorizontalZoom);
244  newPic->Set(0.0, 1.0, m_duration / 2, QEasingCurve::OutQuart);
245  m_animation->Add(newPic);
246 
247  // Hide new image until it's needed
249 }
250 
251 
256 {
257  // Undo effects of the transition
258  m_old->SetHorizontalZoom(1.0);
259 }
260 
261 
266 {
267  // Both images are same size
268  int width = m_old->GetArea().width();
269 
270  // Slide off to left
271  auto *oldPic = new Animation(m_prev, Animation::Position);
272  oldPic->Set(QPoint(0, 0), QPoint(-width, 0), m_duration, QEasingCurve::InOutQuart);
273  m_animation->Add(oldPic);
274 
275  // Slide in from right
276  auto *newPic = new Animation(m_next, Animation::Position);
277  newPic->Set(QPoint(width, 0), QPoint(0, 0), m_duration, QEasingCurve::InOutQuart);
278  m_animation->Add(newPic);
279 
280  // Hide new image until it's needed
281  m_new->SetPosition(width, 0);
282 }
283 
284 
289 {
290  // Undo effects of the transition
291  m_old->SetPosition(0,0);
292 }
293 
294 
299 {
300  // Both images are same size
301  int width = m_old->GetArea().width();
302 
303  // Zoom away to left
304  auto *oldZoom = new Animation(m_prev, Animation::Zoom);
305  oldZoom->Set(1.0, 0.0, m_duration, QEasingCurve::OutQuad);
306  m_animation->Add(oldZoom);
307 
308  auto *oldMove = new Animation(m_prev, Animation::Position);
309  oldMove->Set(QPoint(0, 0), QPoint(-width / 2, 0), m_duration,
310  QEasingCurve::InQuad);
311  m_animation->Add(oldMove);
312 
313  // Zoom in from right
314  auto *newZoom = new Animation(m_next, Animation::Zoom);
315  newZoom->Set(0.0, 1.0, m_duration, QEasingCurve::InQuad);
316  m_animation->Add(newZoom);
317 
318  auto *newMove = new Animation(m_next, Animation::Position);
319  newMove->Set(QPoint(width / 2, 0), QPoint(0, 0), m_duration,
320  QEasingCurve::OutQuad);
321  m_animation->Add(newMove);
322 
323  // Hide new image until it's needed
324  m_new->SetZoom(0.0);
325 }
326 
327 
333 {
334  // Undo effects of the transition
335  m_old->SetZoom(1.0);
336  m_old->SetPosition(0, 0);
337 }
338 
339 
344 {
345  // Set up blend
347 
348  // Add simultaneous spin
349  auto *an = new Animation(m_prev, Animation::Angle);
350  an->Set(0.0, 360.1, m_duration, QEasingCurve::InOutQuad);
351  m_animation->Add(an);
352 
353  an = new Animation(m_next, Animation::Angle);
354  an->Set(0.0, 360.1, m_duration, QEasingCurve::InOutQuad);
355  m_animation->Add(an);
356 
357  // Zoom prev away, then back
358  auto *seq = new SequentialAnimation();
359  m_animation->Add(seq);
360 
361  an = new Animation(m_prev, Animation::Zoom);
362  an->Set(1.0, 0.5, m_duration / 2, QEasingCurve::InOutQuad);
363  seq->Add(an);
364 
365  an = new Animation(m_prev, Animation::Zoom);
366  an->Set(0.5, 1.0, m_duration / 2, QEasingCurve::InOutQuad);
367  seq->Add(an);
368 
369  // Zoom next away, then back
370  seq = new SequentialAnimation();
371  m_animation->Add(seq);
372 
373  an = new Animation(m_next, Animation::Zoom);
374  an->Set(1.0, 0.5, m_duration / 2, QEasingCurve::InOutQuad);
375  seq->Add(an);
376 
377  an = new Animation(m_next, Animation::Zoom);
378  an->Set(0.5, 1.0, m_duration / 2, QEasingCurve::InOutQuad);
379  seq->Add(an);
380 }
381 
382 
388 {
389  // Undo blend
391 
392  // Undo effects of the transition
393  m_old->SetZoom(1.0);
394  m_old->SetAngle(0.0);
395 }
396 
397 
405 void TransitionRandom::Start(Slide &from, Slide &to, bool forwards, float speed)
406 {
407  // Select a random peer.
408  int rand = MythRandom(0, m_peers.size() - 1);
409  m_current = m_peers[rand];
410  // Invoke peer
412  m_current->Start(from, to, forwards, speed);
413 }
414 
415 
420 {
421  // Clean up
422  disconnect(m_current, nullptr, nullptr, nullptr);
423  m_current = nullptr;
424  emit finished();
425 }
426 
427 
Slide
A specialised image for slideshows.
Definition: galleryslide.h:156
Slide::SetZoom
void SetZoom(float zoom)
Sets slide zoom.
Definition: galleryslide.cpp:477
Transition::Finished
virtual void Finished()
Transition has completed.
Definition: gallerytransitions.cpp:106
TransitionTwist::Initialise
void Initialise() override
Set up Twist transition.
Definition: gallerytransitions.cpp:235
GroupTransition::GroupTransition
GroupTransition(GroupAnimation *animation, const QString &name)
Create group transition.
Definition: gallerytransitions.cpp:144
mythrandom.h
Animation::HorizontalZoom
@ HorizontalZoom
Definition: galleryslide.h:58
TransitionRandom::m_current
Transition * m_current
Selected transition.
Definition: gallerytransitions.h:179
TransitionZoom::Finalise
void Finalise() override
Reset Zoom transition.
Definition: gallerytransitions.cpp:332
kTwistTransition
@ kTwistTransition
Definition: gallerytransitions.h:19
TransitionRandom::m_peers
QList< Transition * > m_peers
Set of distinct transitions.
Definition: gallerytransitions.h:177
TransitionSpin::Finalise
void Finalise() override
Reset Spin transition.
Definition: gallerytransitions.cpp:387
Transition::Finalise
virtual void Finalise()
Definition: gallerytransitions.h:39
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
Transition::m_new
Slide * m_new
The new image that will replace the current one (whatever the transition direction)
Definition: gallerytransitions.h:55
Transition
Base class of an animated transition that can be accelerated & reversed.
Definition: gallerytransitions.h:28
TransitionSlide::Initialise
void Initialise() override
Set up Slide transition.
Definition: gallerytransitions.cpp:265
GroupTransition::m_animation
GroupAnimation * m_animation
Definition: gallerytransitions.h:97
Animation::Angle
@ Angle
Definition: galleryslide.h:58
TransitionBlend::Finalise
void Finalise() override
Reset Blend transition.
Definition: gallerytransitions.cpp:225
MythUIType::GetArea
virtual MythRect GetArea(void) const
If the object has a minimum area defined, return it, other wise return the default area.
Definition: mythuitype.cpp:886
TransitionZoom
Zooms from right, then away to left.
Definition: gallerytransitions.h:135
gallerytransitions.h
Provides transitions for slideshows.
MythUIType::SetAlpha
void SetAlpha(int newalpha)
Definition: mythuitype.cpp:947
TransitionTwist::Finalise
void Finalise() override
Reset Twist transition.
Definition: gallerytransitions.cpp:255
Transition::Transition
Transition(const QString &name)
Definition: gallerytransitions.cpp:11
TransitionSlide::Finalise
void Finalise() override
Reset Slide transition.
Definition: gallerytransitions.cpp:288
kSpinTransition
@ kSpinTransition
Definition: gallerytransitions.h:22
GroupAnimation
Abstract class for groups of animations.
Definition: galleryslide.h:90
GroupTransition::~GroupTransition
~GroupTransition() override
Destroy group transition.
Definition: gallerytransitions.cpp:155
Transition::Start
virtual void Start(Slide &from, Slide &to, bool forwards, float speed=1.0)
Start base transition.
Definition: gallerytransitions.cpp:80
MythUIType::SetPosition
void SetPosition(int x, int y)
Convenience method, calls SetPosition(const MythPoint&) Override that instead to change functionality...
Definition: mythuitype.cpp:534
TransitionNone::Start
void Start(Slide &from, Slide &to, bool forwards, float speed=1.0) override
Switch images.
Definition: gallerytransitions.cpp:128
GroupAnimation::Start
void Start(bool forwards, float speed=1.0) override
Initialise & start base animation.
Definition: galleryslide.h:96
TransitionRandom::Finished
void Finished() override
Invoked when peer transition completes.
Definition: gallerytransitions.cpp:419
kBlendTransition
@ kBlendTransition
Definition: gallerytransitions.h:18
TransitionNone
Switches images instantly with no effects.
Definition: gallerytransitions.h:73
TransitionRandom
Invokes random transitions.
Definition: gallerytransitions.h:156
TransitionBlend::Initialise
void Initialise() override
Set up Blend transition.
Definition: gallerytransitions.cpp:205
TransitionSpin
Images blend whilst rotating.
Definition: gallerytransitions.h:146
TransitionRandom::Start
void Start(Slide &from, Slide &to, bool forwards, float speed=1.0) override
Starts a random transition from a set of its peer transitions,.
Definition: gallerytransitions.cpp:405
LOC
#define LOC
Definition: gallerytransitions.cpp:8
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition: mythcorecontext.cpp:55
GroupTransition::Pulse
void Pulse() override
Update group transition.
Definition: gallerytransitions.cpp:195
kLastTransSentinel
@ kLastTransSentinel
Definition: gallerytransitions.h:23
TransitionSlide
Slide on from right, then off to left.
Definition: gallerytransitions.h:124
Transition::m_duration
std::chrono::milliseconds m_duration
Seconds transition will last.
Definition: gallerytransitions.h:49
TransitionTwist
Image twists into the next.
Definition: gallerytransitions.h:113
SequentialAnimation
A group of animations to be played sequentially.
Definition: galleryslide.h:110
Animation::Zoom
@ Zoom
Definition: galleryslide.h:58
Animation
A single animation controlling alpha, zoom, rotation and position.
Definition: galleryslide.h:54
GroupAnimation::Pulse
void Pulse() override=0
Animation::Position
@ Position
Definition: galleryslide.h:58
Transition::m_next
Slide * m_next
The image occurring later in the slideshow sequence.
Definition: gallerytransitions.h:65
TransitionSpin::Initialise
void Initialise() override
Set up Spin transition.
Definition: gallerytransitions.cpp:343
mythcorecontext.h
GroupAnimation::SetSpeed
void SetSpeed(float speed) override
Definition: galleryslide.h:98
TransitionRegistry::m_immediate
TransitionNone m_immediate
A transition that updates instantly.
Definition: gallerytransitions.h:193
std
Definition: mythchrono.h:23
kZoomTransition
@ kZoomTransition
Definition: gallerytransitions.h:21
GroupAnimation::Add
virtual void Add(AbstractAnimation *child)
Add child animation to group.
Definition: galleryslide.cpp:126
GroupTransition::Start
void Start(Slide &from, Slide &to, bool forwards, float speed=1.0) override
Start group transition.
Definition: gallerytransitions.cpp:169
MythUIType::SetVisible
virtual void SetVisible(bool visible)
Definition: mythuitype.cpp:1110
TransitionRegistry::TransitionRegistry
TransitionRegistry(bool includeAnimations)
Constructor.
Definition: gallerytransitions.cpp:51
TransitionRegistry::Select
Transition & Select(int setting)
Returns the requested transition or an alternative if it is not suitable for the painter.
Definition: gallerytransitions.cpp:24
GroupTransition::SetSpeed
void SetSpeed(float speed) override
Change transition speed.
Definition: gallerytransitions.cpp:186
kNoTransition
@ kNoTransition
Definition: gallerytransitions.h:16
MythUIType::SetHorizontalZoom
void SetHorizontalZoom(float zoom)
Definition: mythuitype.cpp:972
GroupAnimation::Clear
void Clear() override
Delete all child animations.
Definition: galleryslide.cpp:137
Transition::finished
void finished()
kSlideTransition
@ kSlideTransition
Definition: gallerytransitions.h:20
Transition::m_prev
Slide * m_prev
The image occurring earlier in the slideshow sequence.
Definition: gallerytransitions.h:63
MythUIType::SetAngle
void SetAngle(float angle)
Definition: mythuitype.cpp:984
Transition::m_old
Slide * m_old
The image currently displayed, which will be replaced (whatever the transition direction)
Definition: gallerytransitions.h:52
kRandomTransition
@ kRandomTransition
Definition: gallerytransitions.h:17
TransitionZoom::Initialise
void Initialise() override
Set up Zoom transition.
Definition: gallerytransitions.cpp:298
MythRandomStd::MythRandom
uint32_t MythRandom()
generate 32 random bits
Definition: mythrandom.h:20
Animation::Alpha
@ Alpha
Definition: galleryslide.h:58
AbstractAnimation::finished
void finished()
Signals animation has finished.
TransitionRegistry::m_map
TransitionMap m_map
All possible transitions.
Definition: gallerytransitions.h:197
TransitionBlend
Image blends into the next by fading.
Definition: gallerytransitions.h:102
Transition::Initialise
virtual void Initialise()
Definition: gallerytransitions.h:38