00001
00002
00003 #include "mythconfigdialogs.h"
00004 #include "mythwizard.h"
00005
00006 #include <qhbox.h>
00007
00008 static void clear_widgets(vector<Configurable*> &children,
00009 vector<QWidget*> &childwidget)
00010 {
00011 for (uint i = 0; (i < childwidget.size()) && (i < children.size()); i++)
00012 {
00013 if (children[i] && childwidget[i])
00014 children[i]->widgetInvalid(childwidget[i]);
00015 }
00016 childwidget.clear();
00017 }
00018
00019 void ConfigPopupDialogWidget::keyPressEvent(QKeyEvent* e)
00020 {
00021 switch (e->key())
00022 {
00023 case Key_Escape:
00024 reject();
00025 emit popupDone(MythDialog::Rejected);
00026 break;
00027 default:
00028 MythDialog::keyPressEvent(e);
00029 }
00030 }
00031
00032 void ConfigurationPopupDialog::deleteLater(void)
00033 {
00034 disconnect();
00035 if (dialog)
00036 {
00037 dialog->disconnect();
00038 dialog->deleteLater();
00039 dialog = NULL;
00040 label = NULL;
00041 }
00042 VerticalConfigurationGroup::deleteLater();
00043 }
00044
00045 MythDialog* ConfigurationPopupDialog::dialogWidget(MythMainWindow* parent,
00046 const char* widgetName)
00047 {
00048 dialog = new ConfigPopupDialogWidget(parent, widgetName);
00049 dialog->setBackgroundOrigin(QWidget::WindowOrigin);
00050
00051 if (getLabel() != "")
00052 {
00053 QHBox* box = new QHBox(dialog);
00054 box->setBackgroundOrigin(QWidget::WindowOrigin);
00055 box->setSizePolicy(QSizePolicy(QSizePolicy::Minimum,
00056 QSizePolicy::Maximum));
00057
00058 label = new QLabel(box);
00059 label->setText(getLabel());
00060 label->setBackgroundOrigin(QWidget::WindowOrigin);
00061 label->setAlignment(Qt::AlignHCenter);
00062 label->setSizePolicy(QSizePolicy(QSizePolicy::Minimum,
00063 QSizePolicy::Maximum));
00064
00065 dialog->addWidget(box);
00066 }
00067
00068 QWidget *widget = configWidget(NULL, dialog, "ConfigurationPopup");
00069 dialog->addWidget(widget);
00070 widget->setFocus();
00071
00072 return dialog;
00073 }
00074
00075 void ConfigurationPopupDialog::setLabel(QString str)
00076 {
00077 VerticalConfigurationGroup::setLabel(str);
00078 if (label)
00079 label->setText(str);
00080 }
00081
00082 DialogCode ConfigurationPopupDialog::exec(bool saveOnAccept)
00083 {
00084 storage->load();
00085
00086 dialog = (ConfigPopupDialogWidget*)
00087 dialogWidget(gContext->GetMainWindow(), "ConfigurationPopupDialog");
00088 dialog->ShowPopup(this);
00089
00090 DialogCode ret = dialog->exec();
00091
00092 if ((QDialog::Accepted == ret) && saveOnAccept)
00093 storage->save();
00094
00095 return ret;
00096 }
00097
00098 void ConfigurationDialogWidget::keyPressEvent(QKeyEvent* e)
00099 {
00100 bool handled = false;
00101 QStringList actions;
00102
00103 if (gContext->GetMainWindow()->TranslateKeyPress("qt", e, actions))
00104 {
00105 for (unsigned int i = 0; i < actions.size() && !handled; i++)
00106 {
00107 const QString &action = actions[i];
00108 handled = true;
00109
00110 if (action == "SELECT")
00111 accept();
00112 else if (action == "ESCAPE")
00113 reject();
00114 else if (action == "EDIT")
00115 emit editButtonPressed();
00116 else if (action == "DELETE")
00117 emit deleteButtonPressed();
00118 else
00119 handled = false;
00120 }
00121 }
00122
00123 if (!handled)
00124 MythDialog::keyPressEvent(e);
00125 }
00126
00127 ConfigurationDialog::~ConfigurationDialog()
00128 {
00129 clear_widgets(cfgChildren, childwidget);
00130 cfgGrp->deleteLater();
00131 }
00132
00133 MythDialog* ConfigurationDialog::dialogWidget(MythMainWindow *parent,
00134 const char *widgetName)
00135 {
00136 dialog = new ConfigurationDialogWidget(parent, widgetName);
00137
00138 float wmult = 0, hmult = 0;
00139
00140 gContext->GetScreenSettings(wmult, hmult);
00141
00142 QVBoxLayout *layout = new QVBoxLayout(dialog, (int)(20 * hmult));
00143
00144 ChildList::iterator it = cfgChildren.begin();
00145 childwidget.clear();
00146 childwidget.resize(cfgChildren.size());
00147 for (uint i = 0; it != cfgChildren.end(); ++it, ++i)
00148 {
00149 if ((*it)->isVisible())
00150 {
00151 childwidget[i] = (*it)->configWidget(cfgGrp, dialog);
00152 layout->addWidget(childwidget[i]);
00153 }
00154 }
00155
00156 return dialog;
00157 }
00158
00159 DialogCode ConfigurationDialog::exec(bool saveOnAccept, bool doLoad)
00160 {
00161 if (doLoad)
00162 load();
00163
00164 MythDialog *dialog = dialogWidget(
00165 gContext->GetMainWindow(), "Configuration Dialog");
00166
00167 dialog->Show();
00168
00169 DialogCode ret = dialog->exec();
00170
00171 if ((QDialog::Accepted == ret) && saveOnAccept)
00172 save();
00173
00174 clear_widgets(cfgChildren, childwidget);
00175
00176 dialog->deleteLater();
00177 dialog = NULL;
00178
00179 return ret;
00180 }
00181
00182 void ConfigurationDialog::addChild(Configurable *child)
00183 {
00184 cfgChildren.push_back(child);
00185 cfgGrp->addChild(child);
00186 }
00187
00188 void ConfigurationDialog::setLabel(const QString &label)
00189 {
00190 if (label.isEmpty())
00191 {
00192 cfgGrp->setUseLabel(false);
00193 cfgGrp->setLabel("");
00194 }
00195 else
00196 {
00197 cfgGrp->setLabel(QDeepCopy<QString>(label));
00198 cfgGrp->setUseLabel(true);
00199 cfgGrp->setUseFrame(true);
00200 }
00201 }
00202
00203 MythDialog *ConfigurationWizard::dialogWidget(MythMainWindow *parent,
00204 const char *widgetName)
00205 {
00206 MythWizard *wizard = new MythWizard(parent, widgetName);
00207 dialog = wizard;
00208
00209 QObject::connect(cfgGrp, SIGNAL(changeHelpText(QString)),
00210 wizard, SLOT( setHelpText( QString)));
00211
00212 QWidget *child = NULL;
00213 ChildList::iterator it = cfgChildren.begin();
00214 for (; it != cfgChildren.end(); ++it)
00215 {
00216 if (!(*it)->isVisible())
00217 continue;
00218
00219 child = (*it)->configWidget(cfgGrp, parent);
00220 wizard->addPage(child, (*it)->getLabel());
00221 }
00222
00223 if (child)
00224 wizard->setFinishEnabled(child, true);
00225
00226 return wizard;
00227 }
00228
00229 JumpConfigurationWizard::~JumpConfigurationWizard()
00230 {
00231 clear_widgets(cfgChildren, childwidget);
00232 }
00233
00234 void JumpConfigurationWizard::deleteLater(void)
00235 {
00236 clear_widgets(cfgChildren, childwidget);
00237 QObject::deleteLater();
00238 }
00239
00240 MythDialog *JumpConfigurationWizard::dialogWidget(MythMainWindow *parent,
00241 const char *widgetName)
00242 {
00243 MythJumpWizard *wizard = new MythJumpWizard(parent, widgetName);
00244 dialog = wizard;
00245
00246 QObject::connect(cfgGrp, SIGNAL(changeHelpText(QString)),
00247 wizard, SLOT( setHelpText( QString)));
00248
00249 childwidget.clear();
00250 QStringList labels, helptext;
00251 for (uint i = 0; i < cfgChildren.size(); i++)
00252 {
00253 if (cfgChildren[i]->isVisible())
00254 {
00255 childwidget.push_back(
00256 cfgChildren[i]->configWidget(cfgGrp, parent));
00257 labels.push_back(cfgChildren[i]->getLabel());
00258 helptext.push_back(cfgChildren[i]->getHelpText());
00259 }
00260 }
00261
00262 JumpPane *jumppane = new JumpPane(labels, helptext);
00263 QWidget *widget = jumppane->configWidget(cfgGrp, parent, "JumpCfgWiz");
00264 wizard->addPage(widget, "");
00265 wizard->setFinishEnabled(widget, true);
00266 connect(jumppane, SIGNAL(pressed( QString)),
00267 this, SLOT( showPage(QString)));
00268
00269 for (uint i = 0; i < childwidget.size(); i++)
00270 {
00271 wizard->addPage(childwidget[i], labels[i]);
00272 wizard->setFinishEnabled(childwidget[i], true);
00273 }
00274
00275 return wizard;
00276 }
00277
00278 void JumpConfigurationWizard::showPage(QString page)
00279 {
00280 uint pagenum = page.toUInt();
00281 if (pagenum >= childwidget.size() || !dialog)
00282 return;
00283 ((MythJumpWizard*)(dialog))->showPage(childwidget[pagenum]);
00284 }