00001
00002 #include "mythprogressdialog.h"
00003 #include "mythlogging.h"
00004
00005 QEvent::Type ProgressUpdateEvent::kEventType =
00006 (QEvent::Type) QEvent::registerEventType();
00007
00008 MythUIBusyDialog::MythUIBusyDialog(const QString &message,
00009 MythScreenStack *parent, const char *name)
00010 : MythScreenType(parent, name, false)
00011 {
00012 if (!message.isEmpty())
00013 m_message = message;
00014 else
00015 m_message = tr("Please Wait...");
00016 m_origMessage = m_message;
00017 m_messageText = NULL;
00018 m_haveNewMessage = false;
00019 }
00020
00021 bool MythUIBusyDialog::Create(void)
00022 {
00023 if (!CopyWindowFromBase("MythBusyDialog", this))
00024 return false;
00025
00026 m_messageText = dynamic_cast<MythUIText *>(GetChild("message"));
00027
00028 if (m_messageText)
00029 m_messageText->SetText(m_message);
00030
00031 return true;
00032 }
00033
00034 void MythUIBusyDialog::SetMessage(const QString &message)
00035 {
00036 m_newMessageLock.lock();
00037 m_newMessage = message;
00038 m_haveNewMessage = true;
00039 m_newMessageLock.unlock();
00040 }
00041
00042 void MythUIBusyDialog::Reset(void)
00043 {
00044 SetMessage(m_origMessage);
00045 }
00046
00047 void MythUIBusyDialog::Pulse(void)
00048 {
00049 if (m_haveNewMessage && m_messageText)
00050 {
00051 m_newMessageLock.lock();
00052 m_message = m_newMessage;
00053 m_messageText->SetText(m_message);
00054 m_newMessageLock.unlock();
00055 }
00056
00057 MythUIType::Pulse();
00058 }
00059
00060 bool MythUIBusyDialog::keyPressEvent(QKeyEvent *event)
00061 {
00062 QStringList actions;
00063 bool handled = GetMythMainWindow()->TranslateKeyPress("qt", event, actions, false);
00064
00065 for (int i = 0; i < actions.size() && !handled; i++)
00066 {
00067 QString action = actions[i];
00068 handled = true;
00069
00070 if (action == "ESCAPE")
00071 {
00072
00073 }
00074 else
00075 handled = false;
00076 }
00077
00078 if (!handled && MythScreenType::keyPressEvent(event))
00079 handled = true;
00080
00081 return handled;
00082 }
00083
00084 MythUIBusyDialog *ShowBusyPopup(const QString &message)
00085 {
00086 QString LOC = "ShowBusyPopup('" + message + "') - ";
00087 MythUIBusyDialog *pop = NULL;
00088 static MythScreenStack *stk = NULL;
00089
00090
00091 if (!stk)
00092 {
00093 MythMainWindow *win = GetMythMainWindow();
00094
00095 if (win)
00096 stk = win->GetStack("popup stack");
00097 else
00098 {
00099 LOG(VB_GENERAL, LOG_ERR, LOC + "no main window?");
00100 return NULL;
00101 }
00102
00103 if (!stk)
00104 {
00105 LOG(VB_GENERAL, LOG_ERR, LOC + "no popup stack? "
00106 "Is there a MythThemeBase?");
00107 return NULL;
00108 }
00109 }
00110
00111 pop = new MythUIBusyDialog(message, stk, "showBusyPopup");
00112 if (pop->Create())
00113 stk->AddScreen(pop);
00114
00115 return pop;
00116 }
00117
00118
00119 MythUIProgressDialog::MythUIProgressDialog(const QString &message,
00120 MythScreenStack *parent, const char *name)
00121 : MythScreenType(parent, name, false)
00122 {
00123 m_count = m_total = 0;
00124 m_message = message;
00125 m_messageText = NULL;
00126 }
00127
00128 bool MythUIProgressDialog::Create(void)
00129 {
00130 if (!CopyWindowFromBase("MythProgressDialog", this))
00131 return false;
00132
00133 m_messageText = dynamic_cast<MythUIText *>(GetChild("message"));
00134 m_progressText = dynamic_cast<MythUIText *>(GetChild("progresstext"));
00135 m_progressBar = dynamic_cast<MythUIProgressBar *>(GetChild("progressbar"));
00136
00137 if (m_messageText)
00138 m_messageText->SetText(m_message);
00139
00140 return true;
00141 }
00142
00143 bool MythUIProgressDialog::keyPressEvent(QKeyEvent *event)
00144 {
00145 QStringList actions;
00146 bool handled = GetMythMainWindow()->TranslateKeyPress("qt", event, actions, false);
00147
00148 for (int i = 0; i < actions.size() && !handled; i++)
00149 {
00150 QString action = actions[i];
00151 handled = true;
00152
00153 if (action == "ESCAPE")
00154 {
00155
00156 }
00157 else
00158 handled = false;
00159 }
00160
00161 if (!handled && MythScreenType::keyPressEvent(event))
00162 handled = true;
00163
00164 return handled;
00165 }
00166
00167 void MythUIProgressDialog::customEvent(QEvent *event)
00168 {
00169 if (event->type() == ProgressUpdateEvent::kEventType)
00170 {
00171 ProgressUpdateEvent *pue = dynamic_cast<ProgressUpdateEvent*>(event);
00172
00173 if (!pue)
00174 {
00175 LOG(VB_GENERAL, LOG_ERR,
00176 "Error, event claims to be a progress update but fails "
00177 "to cast");
00178 return;
00179 }
00180
00181 QString message = pue->GetMessage();
00182 if (!message.isEmpty())
00183 m_message = message;
00184 uint total = pue->GetTotal();
00185 if (total > 0)
00186 m_total = total;
00187 m_count = pue->GetCount();
00188 UpdateProgress();
00189 }
00190 }
00191
00192 void MythUIProgressDialog::SetTotal(uint total)
00193 {
00194 m_total = total;
00195 UpdateProgress();
00196 }
00197
00198 void MythUIProgressDialog::SetProgress(uint count)
00199 {
00200 m_count = count;
00201 UpdateProgress();
00202 }
00203
00204 void MythUIProgressDialog::SetMessage(const QString &message)
00205 {
00206 m_message = message;
00207 UpdateProgress();
00208 }
00209
00210 void MythUIProgressDialog::UpdateProgress()
00211 {
00212 if (m_messageText)
00213 m_messageText->SetText(m_message);
00214
00215 if (m_total == 0)
00216 return;
00217
00218 if (m_count > m_total)
00219 {
00220 LOG(VB_GENERAL, LOG_ERR, QString("Progress count (%1) is higher "
00221 "than total (%2)")
00222 .arg(m_count) .arg(m_total));
00223 return;
00224 }
00225
00226 if (m_progressBar)
00227 {
00228 m_progressBar->SetTotal(m_total);
00229 m_progressBar->SetUsed(m_count);
00230 }
00231
00232 uint percentage = (uint)(((float)m_count/(float)m_total) * 100.0);
00233
00234 if (m_progressText)
00235 m_progressText->SetText(QString("%1%").arg(percentage));
00236 }