1 ///////////////////////////////////////////////////////////////////////////////
2 // LameXP - Audio Encoder Front-End
3 // Copyright (C) 2004-2019 LoRd_MuldeR <MuldeR2@GMX.de>
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version, but always including the *additional*
9 // restrictions defined in the "License.txt" file.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this program; if not, write to the Free Software Foundation, Inc.,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 // http://www.gnu.org/licenses/gpl-2.0.txt
21 ///////////////////////////////////////////////////////////////////////////////
23 #include "Dialog_SplashScreen.h"
26 #include "UIC_SplashScreen.h"
32 #include <MUtils/Global.h>
33 #include <MUtils/GUI.h>
34 #include <MUtils/Taskbar7.h>
43 #define OPACITY_DELTA 0.04
45 //Setup taskbar indicator
46 #define SET_TASKBAR_STATE(WIDGET,FLAG) do \
48 const int _oldFlag = (WIDGET)->m_taskBarFlag.fetchAndStoreOrdered((FLAG) ? 1 : 0); \
49 if(_oldFlag != ((FLAG) ? 1 : 0)) \
51 (WIDGET)->m_taskbar->setTaskbarState((FLAG) ? MUtils::Taskbar7::TASKBAR_STATE_INTERMEDIATE : MUtils::Taskbar7::TASKBAR_STATE_NONE); \
56 ////////////////////////////////////////////////////////////
58 ////////////////////////////////////////////////////////////
60 SplashScreen::SplashScreen(QWidget *parent)
62 QFrame(parent, Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint),
63 ui(new Ui::SplashScreen),
64 m_opacitySteps(qRound(1.0 / OPACITY_DELTA)),
65 m_taskbar(new MUtils::Taskbar7(this))
67 //Init the dialog, from the .ui file
71 setFixedSize(this->size());
74 m_loop.reset(new QEventLoop(this));
77 m_timer.reset(new QTimer(this));
78 m_timer->setInterval(FADE_DELAY);
79 m_timer->setSingleShot(false);
81 //Connect timer to slot
82 connect(m_timer.data(), SIGNAL(timeout()), this, SLOT(updateHandler()));
84 //Enable "sheet of glass" effect on splash screen
85 if(!MUtils::GUI::sheet_of_glass(this))
87 setStyleSheet("background-image: url(:/images/Background.jpg)");
91 m_working.reset(new QMovie(":/images/Loading4.gif"));
92 m_working->setCacheMode(QMovie::CacheAll);
93 ui->labelLoading->setMovie(m_working.data());
97 m_status = STATUS_FADE_IN;
101 ////////////////////////////////////////////////////////////
103 ////////////////////////////////////////////////////////////
105 SplashScreen::~SplashScreen(void)
115 ////////////////////////////////////////////////////////////
117 ////////////////////////////////////////////////////////////
119 void SplashScreen::showSplash(QThread *thread)
121 QScopedPointer<SplashScreen> splashScreen(new SplashScreen());
124 splashScreen->setWindowOpacity(OPACITY_DELTA);
125 splashScreen->show();
128 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
130 //Wait for window to show
131 QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
132 splashScreen->repaint(); MUtils::GUI::bring_to_front(splashScreen.data());
133 QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
135 //Connect thread signals
136 connect(thread, SIGNAL(terminated()), splashScreen.data(), SLOT(threadComplete()), Qt::QueuedConnection);
137 connect(thread, SIGNAL(finished()), splashScreen.data(), SLOT(threadComplete()), Qt::QueuedConnection);
140 SET_TASKBAR_STATE(splashScreen, true);
143 splashScreen->m_timer->start(FADE_DELAY);
144 QTimer::singleShot(8*60*1000, splashScreen->m_loop.data(), SLOT(quit()));
145 QTimer::singleShot(333, thread, SLOT(start()));
147 //Start event handling!
148 const int ret = splashScreen->m_loop->exec(QEventLoop::ExcludeUserInputEvents);
154 qFatal("Deadlock in initialization thread encountered!");
158 SET_TASKBAR_STATE(splashScreen, false);
161 QApplication::restoreOverrideCursor();
164 splashScreen->m_canClose.ref();
165 splashScreen->close();
168 ////////////////////////////////////////////////////////////
170 ////////////////////////////////////////////////////////////
172 void SplashScreen::updateHandler(void)
174 if(m_status == STATUS_FADE_IN)
176 if(m_fadeValue < m_opacitySteps)
178 setWindowOpacity(OPACITY_DELTA * static_cast<double>(++m_fadeValue));
179 SET_TASKBAR_STATE(this, true);
183 setWindowOpacity(1.0);
184 MUtils::GUI::bring_to_front(this);
186 m_status = STATUS_WAIT;
189 else if(m_status == STATUS_FADE_OUT)
193 setWindowOpacity(OPACITY_DELTA * static_cast<double>(--m_fadeValue));
194 SET_TASKBAR_STATE(this, true);
198 setWindowOpacity(0.0);
200 m_status = STATUS_DONE;
206 void SplashScreen::threadComplete(void)
208 m_status = STATUS_FADE_OUT;
209 if(!m_timer->isActive())
211 m_timer->start(FADE_DELAY);
213 MUtils::GUI::bring_to_front(this);
216 ////////////////////////////////////////////////////////////
218 ////////////////////////////////////////////////////////////
220 void SplashScreen::keyPressEvent(QKeyEvent *event)
225 void SplashScreen::keyReleaseEvent(QKeyEvent *event)
230 void SplashScreen::closeEvent(QCloseEvent *event)
232 if(!m_canClose) event->ignore();