Ticket #1876: addTransitionLength.txt

File addTransitionLength.txt, 11.2 KB (added by mdobossy@…, 13 years ago)

MythGallery, OpenGL Transition Length Patch

Line 
1Index: mythgallery/glsingleview.cpp
2===================================================================
3--- mythgallery/glsingleview.cpp        (revision 10014)
4+++ mythgallery/glsingleview.cpp        (working copy)
5@@ -25,12 +25,14 @@
6 using namespace std;
7 
8 #include <qtimer.h>
9+#include <qdatetime.h>
10 #include <qimage.h>
11 #include <qlayout.h>
12 #include <qsize.h>
13 #include <qfileinfo.h>
14 #include <qdir.h>
15 #include <qpainter.h>
16+#include <qobject.h>
17 
18 #include <mythtv/mythcontext.h>
19 #include <mythtv/lcddevice.h>
20@@ -131,7 +133,7 @@
21     QString transType = gContext->GetSetting("SlideshowOpenGLTransition");
22     if (!transType.isEmpty() && m_effectMap.contains(transType))
23         m_effectMethod = m_effectMap[transType];
24-
25+    m_transTimeout = gContext->GetNumSetting("SlideshowOpenGLTransitionLength", 0);
26     if (!m_effectMethod || transType == QString("random (gl)"))
27     {
28         m_effectMethod = getRandomEffect();
29@@ -156,6 +158,7 @@
30     // ---------------------------------------------------------------
31 
32     m_timer = new QTimer(this);
33+    m_time = new QTime();
34     connect(m_timer, SIGNAL(timeout()),
35             SLOT(slotTimeOut()));
36 
37@@ -217,6 +220,7 @@
38 
39     m_timer->stop();
40     delete m_timer;
41+    delete m_time;
42 
43     if (m_texItem[0].tex)
44         glDeleteTextures(1, &m_texItem[0].tex);
45@@ -294,9 +298,7 @@
46         (this->*m_effectMethod)();
47     }
48     else
49-    {
50         paintTexture();
51-    }
52 
53     if (glGetError())
54         VERBOSE(VB_GENERAL, LOC_ERR + "OpenGL error detected");
55@@ -780,7 +782,7 @@
56 
57 void GLSingleView::effectBlend(void)
58 {
59-    if (m_i > 100)
60+    if (m_time->elapsed() > 1000.0*m_transTimeout)
61     {
62         paintTexture();
63         m_effectRunning = false;
64@@ -790,6 +792,7 @@
65 
66     int a = (m_curr == 0) ? 1 : 0;
67     int b =  m_curr;
68+    float t = 1.0f * (float)m_time->elapsed() / (1000.0f * m_transTimeout);
69 
70     TexItem& ta = m_texItem[a];
71     TexItem& tb = m_texItem[b];
72@@ -819,7 +822,7 @@
73 
74     glBegin(GL_QUADS);
75     {
76-        glColor4f(0.0f, 0.0f, 0.0f, 1.0f / (100.0f) * (float)m_i);
77+        glColor4f(0.0f, 0.0f, 0.0f, 1.0f * t);
78         glVertex3f(-1.0f, -1.0f, 0.0f);
79         glVertex3f(+1.0f, -1.0f, 0.0f);
80         glVertex3f(+1.0f, +1.0f, 0.0f);
81@@ -835,7 +838,7 @@
82 
83     glBegin(GL_QUADS);
84     {
85-        glColor4f(1.0f, 1.0f, 1.0f, 1.0f / (100.0f) * (float)m_i);
86+        glColor4f(1.0f, 1.0f, 1.0f, 1.0f * t);
87         glTexCoord2f(0.0f, 0.0f);
88         glVertex3f(-tb.cx, -tb.cy, 0.0f);
89 
90@@ -855,14 +858,13 @@
91 
92 void GLSingleView::effectZoomBlend(void)
93 {
94-    if (m_i > 100)
95+    if (m_time->elapsed() > 1000.0f * m_transTimeout)
96     {
97         paintTexture();
98         m_effectRunning = false;
99         m_tmout = -1;
100         return;
101     }
102-
103     int a = (m_curr == 0) ? 1 : 0;
104     int b =  m_curr;
105     float zf = 0.75f;
106@@ -873,7 +875,7 @@
107     glMatrixMode(GL_TEXTURE);
108     glLoadIdentity();
109     glRotatef(ta.angle, 0.0f, 0.0f, 1.0f);
110-    float t = 1.0f / (100.00f) * (float)m_i;
111+    float t = 1.0f * (float)m_time->elapsed() / (1000.0f * m_transTimeout);
112     glBindTexture(GL_TEXTURE_2D, ta.tex);
113 
114     glBegin(GL_QUADS);
115@@ -901,7 +903,7 @@
116 
117     glBegin(GL_QUADS);
118     {
119-        glColor4f(1.0f, 1.0f, 1.0f, 1.0f / (100.0f) * (float) m_i);
120+        glColor4f(1.0f, 1.0f, 1.0f, 0.0f + t);
121         glTexCoord2f(0.0f, 0.0f);
122         glVertex3f(-tb.cx, -tb.cy, 0.0f);
123 
124@@ -921,7 +923,7 @@
125 
126 void GLSingleView::effectRotate(void)
127 {
128-    if (m_i > 100)
129+    if (m_time->elapsed() > 1000.0f * m_transTimeout)
130     {
131         paintTexture();
132         m_effectRunning = false;
133@@ -934,6 +936,7 @@
134 
135     int a = (m_curr == 0) ? 1 : 0;
136     int b =  m_curr;
137+    float t = 1.0f * (float)m_time->elapsed() / (1000.0f * m_transTimeout);
138 
139     TexItem& ta = m_texItem[a];
140     TexItem& tb = m_texItem[b];
141@@ -962,10 +965,10 @@
142 
143     glMatrixMode(GL_MODELVIEW);
144     glLoadIdentity();
145-    float rotate = 360.0f/100.0f*(float)m_i;
146+    float rotate = 360.0f * t;
147     glRotatef(((m_dir == 0) ? -1 : 1) * rotate,
148               0.0f, 0.0f, 1.0f);
149-    float scale = 1.0f/100.0f*(100.0f-(float)(m_i));
150+    float scale = 1.0f * (1.0f - t);
151     glScalef(scale, scale, 1.0f);
152 
153     glMatrixMode(GL_TEXTURE);
154@@ -996,7 +999,7 @@
155 
156 void GLSingleView::effectBend(void)
157 {
158-    if (m_i > 100)
159+    if (m_time->elapsed() > 1000.0f * m_transTimeout)
160     {
161         paintTexture();
162         m_effectRunning = false;
163@@ -1009,6 +1012,7 @@
164 
165     int a = (m_curr == 0) ? 1 : 0;
166     int b =  m_curr;
167+    float t = 1.0f * (float)m_time->elapsed() / (1000.0f * m_transTimeout);
168 
169     TexItem& ta = m_texItem[a];
170     TexItem& tb = m_texItem[b];
171@@ -1037,7 +1041,7 @@
172 
173     glMatrixMode(GL_MODELVIEW);
174     glLoadIdentity();
175-    glRotatef(90.0f/100.0f*(float)m_i,
176+    glRotatef(90.0f * t,
177               (m_dir == 0) ? 1.0f : 0.0f,
178               (m_dir == 1) ? 1.0f : 0.0f,
179               0.0f);
180@@ -1069,7 +1073,7 @@
181 
182 void GLSingleView::effectFade(void)
183 {
184-    if (m_i > 100)
185+    if (m_time->elapsed() > 1000.0f * m_transTimeout)
186     {
187         paintTexture();
188         m_effectRunning = false;
189@@ -1079,13 +1083,15 @@
190 
191     int a;
192     float opacity;
193-    if (m_i <= 50)
194+    float t = 1.0f * (float)m_time->elapsed() / (1000.0f * m_transTimeout);
195+
196+    if (m_time->elapsed() < 1000.0f * m_transTimeout * 0.5f)
197     {
198         a =  (m_curr == 0) ? 1 : 0;
199-        opacity = 1.0f - 1.0f/50.0f*(float)(m_i);
200+        opacity = 1.0f - (2.0f * t);
201     }
202     else {
203-        opacity = 1.0f/50.0f*(float)(m_i-50.0f);
204+        opacity = 2.0f * (t - 0.5);
205         a = m_curr;
206     }
207 
208@@ -1120,7 +1126,7 @@
209 
210 void GLSingleView::effectInOut(void)
211 {
212-    if (m_i > 100)
213+    if (m_time->elapsed() > 1000.0f * m_transTimeout)
214     {
215         paintTexture();
216         m_effectRunning = false;
217@@ -1135,7 +1141,8 @@
218 
219     int a;
220     bool out;
221-    if (m_i <= 50)
222+    float tt = 1.0f * (float)m_time->elapsed() / (1000.0f * m_transTimeout);
223+    if (m_time->elapsed() <= 1000.0f * m_transTimeout * 0.5f)
224     {
225         a   = (m_curr == 0) ? 1 : 0;
226         out = 1;
227@@ -1151,8 +1158,8 @@
228     glMatrixMode(GL_MODELVIEW);
229     glLoadIdentity();
230     float t = (out) ?
231-        1.0f / 50.0f * (50.0f - m_i) :
232-        1.0f / 50.0f * (m_i - 50.0f);
233+        1.0f / 0.5f * (0.5f - tt) :
234+        1.0f / 0.5f * (tt - 0.5f);
235 
236     glScalef(t, t, 1.0f);
237     t = 1.0f - t;
238@@ -1190,7 +1197,7 @@
239 
240 void GLSingleView::effectSlide(void)
241 {
242-    if (m_i > 100)
243+    if (m_time->elapsed() > 1000.0f * m_transTimeout)
244     {
245         paintTexture();
246         m_effectRunning = false;
247@@ -1203,6 +1210,7 @@
248 
249     int a = (m_curr == 0) ? 1 : 0;
250     int b =  m_curr;
251+    float t = 1.0f * (float)m_time->elapsed() / (1000.0f * m_transTimeout);
252 
253     TexItem& ta = m_texItem[a];
254     TexItem& tb = m_texItem[b];
255@@ -1231,7 +1239,7 @@
256 
257     glMatrixMode(GL_MODELVIEW);
258     glLoadIdentity();
259-    float trans = 2.0f/100.0f*(float)m_i;
260+    float trans = 2.0f * t;
261     glTranslatef((m_dir % 2 == 0) ? ((m_dir == 2)? 1 : -1) * trans : 0.0f,
262                  (m_dir % 2 == 1) ? ((m_dir == 1)? 1 : -1) * trans : 0.0f,
263                  0.0f);
264@@ -1265,7 +1273,7 @@
265 
266 void GLSingleView::effectFlutter(void)
267 {
268-    if (m_i > 100)
269+    if (m_time->elapsed() > 1000.0f * m_transTimeout)
270     {
271         paintTexture();
272         m_effectRunning = false;
273@@ -1275,6 +1283,7 @@
274 
275     int a = (m_curr == 0) ? 1 : 0;
276     int b =  m_curr;
277+    float t = 1.0f * (float)m_time->elapsed() / (1000.0f * m_transTimeout);
278 
279     TexItem& ta = m_texItem[a];
280     TexItem& tb = m_texItem[b];
281@@ -1318,11 +1327,11 @@
282 
283     glMatrixMode(GL_MODELVIEW);
284     glLoadIdentity();
285-    float rotate = 60.0f/100.0f*(float)m_i;
286+    float rotate = 60.0f*t;
287     glRotatef(rotate, 1.0f, 0.0f, 0.0f);
288-    float scale = 1.0f/100.0f*(100.0f-(float)m_i);
289+    float scale = 1.0f*(1-t);
290     glScalef(scale, scale, scale);
291-    glTranslatef(1.0f/100.0f*(float)m_i, 1.0f/100.0f*(float)m_i, 0.0f);
292+    glTranslatef(1.0f*t, 1.0f*t, 0.0f);
293 
294     glMatrixMode(GL_TEXTURE);
295     glLoadIdentity();
296@@ -1386,10 +1395,10 @@
297 
298 void GLSingleView::effectCube(void)
299 {
300-    int tot = 200;
301-    int rotStart = 50;
302+    float tot = 1000.0f * m_transTimeout;
303+    float rotStart = 250.0f * m_transTimeout;
304 
305-    if (m_i > tot)
306+    if (m_time->elapsed() > 1000.0f * m_transTimeout)
307     {
308         paintTexture();
309         m_effectRunning = false;
310@@ -1435,7 +1444,7 @@
311     glLoadIdentity();
312 
313     float trans = 5.0f *
314-        (float) ((m_i <= tot / 2) ? m_i : tot - m_i) / (float)tot;
315+        (float) (((float)m_time->elapsed() <= tot / 2) ? (float)m_time->elapsed() : tot - (float)m_time->elapsed()) / (float)tot;
316 
317     glTranslatef(0.0f, 0.0f, -znear - 1.0f - trans);
318 
319@@ -1547,10 +1556,10 @@
320     }
321     glEnd();
322 
323-    if (m_i >= rotStart && m_i < (tot-rotStart))
324+    if ((float)m_time->elapsed() >= rotStart && (float)m_time->elapsed() < (tot-rotStart))
325     {
326-        xrot += 360.0f / (float)(tot - 2 * rotStart);
327-        yrot += 180.0f / (float)(tot - 2 * rotStart);
328+        xrot = 360.0f * ((float)m_time->elapsed() - ( rotStart))/(tot - 2 * rotStart);
329+        yrot = 180.0f * ((float)m_time->elapsed() - ( rotStart))/(tot - 2 * rotStart);
330     }
331 
332     m_i++;
333@@ -1602,7 +1611,9 @@
334                 m_tmout = 10;
335                 m_effectRunning = true;
336                 m_i = 0;
337+               m_disp = 0;
338             }
339+           m_time->restart();
340         }
341     }
342 
343Index: mythgallery/glsingleview.h
344===================================================================
345--- mythgallery/glsingleview.h  (revision 10014)
346+++ mythgallery/glsingleview.h  (working copy)
347@@ -30,6 +30,7 @@
348 
349 class QImage;
350 class QTimer;
351+class QTime;
352 
353 class GLSingleView;
354 
355@@ -94,12 +95,14 @@
356     float         m_sx, m_sy;
357 
358     QTimer       *m_timer;
359+    QTime       *m_time;
360     int           m_tmout;
361     int           m_delay;
362+    float        m_transTimeout;
363     bool          m_effectRunning;
364     bool          m_running;
365     int           m_slideShow;
366-
367+    int                  m_disp;
368     GLuint        m_texInfo;
369     bool          m_showInfo;
370     int           m_maxTexDim;
371Index: mythgallery/gallerysettings.cpp
372===================================================================
373--- mythgallery/gallerysettings.cpp     (revision 10014)
374+++ mythgallery/gallerysettings.cpp     (working copy)
375@@ -92,6 +92,17 @@
376     return gc;
377 };
378 
379+static HostSpinBox *SlideshowOpenGLTransitionLength()
380+{
381+    HostSpinBox *gc = new HostSpinBox("SlideshowOpenGLTransitionLength", 1, 10, 1);
382+    gc->setLabel(QObject::tr("Durration of OpenGL Transition (seconds)"));
383+    gc->setValue(2);
384+    gc->setHelpText(QObject::tr("This is the durration of the OpenGL transition "
385+                    "selected above, in seconds."));
386+    return gc;
387+};
388+
389+
390 #endif /* OPENGL_SUPPORT */
391 
392 static HostComboBox *SlideshowTransition()
393@@ -129,7 +140,6 @@
394                     "picture in single view mode."));
395     return gc;
396 };
397-
398 static HostSpinBox *SlideshowDelay()
399 {
400     HostSpinBox *gc = new HostSpinBox("SlideshowDelay", 1, 600, 1);
401@@ -172,6 +182,7 @@
402     
403         ConfigurationGroup* openGLConfig = new VerticalConfigurationGroup(false);
404         openGLConfig->addChild(SlideshowOpenGLTransition());
405+        openGLConfig->addChild(SlideshowOpenGLTransitionLength());
406         addTarget("1", openGLConfig);
407 
408         ConfigurationGroup* regularConfig = new VerticalConfigurationGroup(false);