1 ///////////////////////////////////////////////////////////////////////////////
2 // LameXP - Audio Encoder Front-End
3 // Copyright (C) 2004-2017 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_WorkingBanner.h"
24 #include "UIC_WorkingBanner.h"
30 #include <MUtils/Global.h>
31 #include <MUtils/GUI.h>
32 #include <MUtils/Taskbar7.h>
38 #include <QFontMetrics>
40 #include <QWindowsVistaStyle>
45 /* It can happen that the QThread has just terminated and already emitted the 'terminated' signal, but did NOT change the 'isRunning' flag to FALSE yet. */
46 /* For this reason the macro will first check the 'isRunning' flag. If (and only if) the flag still returns TRUE, then we will wait() for at most 50 ms. */
47 /* If, after 50 ms, the wait() function returns with FALSE, then the thread probably is still running and we return TRUE. Otherwise we can return FALSE. */
48 #define THREAD_RUNNING(THRD) (((THRD)->isRunning()) ? (!((THRD)->wait(1))) : false)
51 static inline void SET_TEXT_COLOR(QWidget
*control
, const QColor
&color
)
53 QPalette pal
= control
->palette();
54 pal
.setColor(QPalette::WindowText
, color
);
55 pal
.setColor(QPalette::Text
, color
);
56 control
->setPalette(pal
);
59 /*Make widget translucent*/
60 static inline void MAKE_TRANSLUCENT(QWidget
*control
)
62 control
->setAttribute(Qt::WA_TranslucentBackground
);
63 control
->setAttribute(Qt::WA_NoSystemBackground
);
66 /*Update widget margins*/
67 static inline void UPDATE_MARGINS(QWidget
*control
, int l
= 0, int r
= 0, int t
= 0, int b
= 0)
69 if(QLayout
*layout
= control
->layout())
71 QMargins margins
= layout
->contentsMargins();
72 margins
.setLeft(margins
.left() + l
);
73 margins
.setRight(margins
.right() + r
);
74 margins
.setTop(margins
.top() + t
);
75 margins
.setBottom(margins
.bottom() + b
);
76 layout
->setContentsMargins(margins
);
80 ////////////////////////////////////////////////////////////
82 ////////////////////////////////////////////////////////////
84 WorkingBanner::WorkingBanner(QWidget
*parent
)
86 QDialog(parent
, Qt::CustomizeWindowHint
| Qt::WindowStaysOnTopHint
),
87 ui(new Ui::WorkingBanner()),
88 m_taskbar(new MUtils::Taskbar7(parent
)),
89 m_metrics(NULL
), m_working(NULL
), m_style(NULL
)
91 //Init the dialog, from the .ui file
95 //Enable the "sheet of glass" effect
96 if(MUtils::GUI::sheet_of_glass(this))
98 m_style
.reset(new QWindowsVistaStyle());
99 this->setStyle(m_style
.data());
100 ui
->progressBar
->setStyle(m_style
.data());
101 ui
->labelStatus
->setStyle(m_style
.data());
102 ui
->labelStatus
->setStyleSheet("background-color: #FFFFFF;");
106 UPDATE_MARGINS(this, 5);
107 m_working
.reset(new QMovie(":/images/Busy.gif"));
108 m_working
->setCacheMode(QMovie::CacheAll
);
109 ui
->labelWorking
->setMovie(m_working
.data());
113 this->setWindowOpacity(0.9);
116 setCursor(Qt::WaitCursor
);
119 ui
->labelStatus
->clear();
122 ////////////////////////////////////////////////////////////
124 ////////////////////////////////////////////////////////////
126 WorkingBanner::~WorkingBanner(void)
128 if(!m_working
.isNull())
136 ////////////////////////////////////////////////////////////
138 ////////////////////////////////////////////////////////////
140 void WorkingBanner::show(const QString
&text
)
145 setFixedSize(size());
149 ui
->progressBar
->setMinimum(0);
150 ui
->progressBar
->setMaximum(0);
151 ui
->progressBar
->setValue(-1);
154 void WorkingBanner::show(const QString
&text
, QThread
*thread
)
160 QEventLoop
*loop
= new QEventLoop(this);
161 connect(thread
, SIGNAL(finished()), loop
, SLOT(quit()));
162 connect(thread
, SIGNAL(terminated()), loop
, SLOT(quit()));
165 m_taskbar
->setOverlayIcon(&QIcon(":/icons/hourglass.png"));
166 m_taskbar
->setTaskbarState(MUtils::Taskbar7::TASKBAR_STATE_INTERMEDIATE
);
172 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor
));
174 //Loop while thread is still running
175 while(THREAD_RUNNING(thread
))
181 QApplication::restoreOverrideCursor();
184 m_taskbar
->setTaskbarState(MUtils::Taskbar7::TASKBAR_STATE_NONE
);
185 m_taskbar
->setOverlayIcon(NULL
);
194 void WorkingBanner::show(const QString
&text
, QEventLoop
*loop
)
200 m_taskbar
->setOverlayIcon(&QIcon(":/icons/hourglass.png"));
201 m_taskbar
->setTaskbarState(MUtils::Taskbar7::TASKBAR_STATE_INTERMEDIATE
);
204 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor
));
206 //Loop while thread is running
207 loop
->exec(QEventLoop::ExcludeUserInputEvents
);
210 QApplication::restoreOverrideCursor();
213 m_taskbar
->setTaskbarState(MUtils::Taskbar7::TASKBAR_STATE_NONE
);
214 m_taskbar
->setOverlayIcon(NULL
);
220 bool WorkingBanner::close(void)
224 return QDialog::close();
227 ////////////////////////////////////////////////////////////
229 ////////////////////////////////////////////////////////////
231 void WorkingBanner::keyPressEvent(QKeyEvent
*event
)
233 if(event
->key() == Qt::Key_Escape
)
235 qDebug("QT::KEY_ESCAPE pressed!");
238 else if(event
->key() == Qt::Key_M
)
240 QTimer::singleShot(0, parent(), SLOT(showMinimized()));
243 QDialog::keyPressEvent(event
);
246 void WorkingBanner::keyReleaseEvent(QKeyEvent
*event
)
248 QDialog::keyReleaseEvent(event
);
251 void WorkingBanner::closeEvent(QCloseEvent
*event
)
253 if(!m_canClose
) event
->ignore();
256 void WorkingBanner::showEvent(QShowEvent
*event
)
258 QDialog::showEvent(event
);
259 if(!event
->spontaneous())
266 QTimer::singleShot(25, this, SLOT(windowShown()));
269 void WorkingBanner::hideEvent(QHideEvent
*event
)
271 QDialog::hideEvent(event
);
272 if(!event
->spontaneous())
281 ////////////////////////////////////////////////////////////
283 ////////////////////////////////////////////////////////////
285 void WorkingBanner::windowShown(void)
287 MUtils::GUI::bring_to_front(this);
290 void WorkingBanner::setText(const QString
&text
)
292 if(m_metrics
.isNull())
294 m_metrics
.reset(new QFontMetrics(ui
->labelStatus
->font()));
297 if(m_metrics
->width(text
) <= ui
->labelStatus
->width() - 16)
299 ui
->labelStatus
->setText(text
);
303 QString choppedText
= text
.simplified().append("...");
304 while((m_metrics
->width(choppedText
) > ui
->labelStatus
->width() - 16) && (choppedText
.length() > 8))
307 choppedText
= choppedText
.trimmed();
308 choppedText
.append("...");
310 ui
->labelStatus
->setText(choppedText
);
314 void WorkingBanner::setProgressMax(unsigned int max
)
316 ui
->progressBar
->setMaximum(max
);
317 if(ui
->progressBar
->maximum() > ui
->progressBar
->minimum())
319 m_taskbar
->setTaskbarState(MUtils::Taskbar7::TASKBAR_STATE_NONE
);
320 m_taskbar
->setTaskbarProgress(ui
->progressBar
->value(), ui
->progressBar
->maximum());
324 m_taskbar
->setTaskbarState(MUtils::Taskbar7::TASKBAR_STATE_INTERMEDIATE
);
328 void WorkingBanner::setProgressVal(unsigned int val
)
330 ui
->progressBar
->setValue(val
);
331 if(ui
->progressBar
->maximum() > ui
->progressBar
->minimum())
333 m_taskbar
->setTaskbarProgress(ui
->progressBar
->value(), ui
->progressBar
->maximum());
337 ////////////////////////////////////////////////////////////
339 ////////////////////////////////////////////////////////////
342 void WorkingBanner::updateProgress(void)
344 if(m_progressMax > 0)
346 int newProgress = qRound(qBound(0.0, static_cast<double>(m_progressVal) / static_cast<double>(m_progressMax), 1.0) * 100.0);
347 if(m_progressInt != newProgress)
349 m_progressInt = newProgress;
350 m_progress->setText(QString::number(m_progressInt));
351 if(this->isVisible())
353 labelStatus->repaint();