Ticket #2909: 2909-v1.patch
File 2909-v1.patch, 21.5 KB (added by , 17 years ago) |
---|
-
libs/libmythtv/scanwizardhelpers.h
50 50 class STPane; 51 51 class DVBUtilsImportPane; 52 52 53 /// Max range of the ScanProgressPopup progress bar54 #define PROGRESS_MAX 100055 56 53 class ScanSignalMeter: public ProgressSetting, public TransientStorage 57 54 { 58 55 public: … … 63 60 { 64 61 Q_OBJECT 65 62 66 protected: 63 friend class QObject; // quiet OSX gcc warning 64 65 public: 66 ScanProgressPopup(bool lock, bool strength, bool snr); 67 virtual void deleteLater(void); 68 69 virtual int exec(void); 70 71 void SetStatusSignalToNoise(int value); 72 void SetStatusSignalStrength(int value); 73 void SetStatusLock(int value); 74 void SetScanProgress(double value) 75 { progressBar->setValue((uint)(value * 65535));} 76 77 void SetStatusText(const QString &value); 78 void SetStatusTitleText(const QString &value); 79 80 private slots: 81 void Done(void); 82 83 private: 84 ~ScanProgressPopup(); 85 86 bool done; 87 QWaitCondition wait; 88 67 89 ScanSignalMeter *ss; 68 90 ScanSignalMeter *sn; 69 91 ScanSignalMeter *progressBar; 70 92 71 93 TransLabelSetting *sl; 72 94 TransLabelSetting *sta; 73 74 public:75 ScanProgressPopup(ScanWizardScanner *parent, bool signalmonitors = true);76 ~ScanProgressPopup();77 void exec(ScanWizardScanner *parent);78 void signalToNoise(int value);79 void signalStrength(int value);80 void dvbLock(int value);81 void status(const QString& value);82 83 void progress(int value) { progressBar->setValue(value);}84 void incrementProgress() { progress(progressBar->getValue().toInt()+1);}85 95 }; 86 96 87 97 class ScannerEvent : public QCustomEvent … … 91 101 public: 92 102 enum TYPE 93 103 { 94 ServiceScanComplete, 95 Update, 96 TableLoaded, 97 ServicePct, 98 DVBSNR, 99 DVBSignalStrength, 100 DVBLock, 104 ScanComplete, 105 ScanShutdown, 106 AppendTextToLog, 107 SetStatusText, 108 SetStatusTitleText, 109 SetPercentComplete, 110 SetStatusSignalToNoise, 111 SetStatusSignalStrength, 112 SetStatusSignalLock, 101 113 }; 102 114 103 115 ScannerEvent(TYPE t) : QCustomEvent(t + QEvent::User) { ; } -
libs/libmythtv/scanwizardscanner.cpp
95 95 96 96 ScanWizardScanner::ScanWizardScanner(void) 97 97 : VerticalConfigurationGroup(false, true, false, false), 98 log(new LogList()), 99 channel(NULL), popupProgress(NULL), 100 scanner(NULL), analogScanner(NULL), 101 freeboxScanner(NULL), 102 frequency(0), modulation("8vsb") 98 log(new LogList()), channel(NULL), popupProgress(NULL), 99 scanner(NULL), freeboxScanner(NULL), nVideoSource(0) 103 100 { 104 101 init_statics(); 105 102 … … 107 104 addChild(log); 108 105 } 109 106 107 ScanWizardScanner::~ScanWizardScanner() 108 { 109 Teardown(); 110 111 QMutexLocker locker(&popupLock); 112 StopPopup(); 113 } 114 110 115 void ScanWizardScanner::Teardown() 111 116 { 112 117 // Join the thread and close the channel … … 130 135 freeboxScanner = NULL; 131 136 } 132 137 #endif 133 134 if (popupProgress)135 {136 delete popupProgress; // TODO we should use deleteLater...137 popupProgress = NULL;138 }139 138 } 140 139 141 140 void ScanWizardScanner::customEvent(QCustomEvent *e) 142 141 { 143 142 ScannerEvent *scanEvent = (ScannerEvent*) e; 144 if ((popupProgress == NULL) && 145 (scanEvent->eventType() != ScannerEvent::Update))143 144 switch (scanEvent->eventType()) 146 145 { 147 return; 146 case ScannerEvent::ScanComplete: 147 { 148 QMutexLocker locker(&popupLock); 149 if (popupProgress) 150 { 151 popupProgress->SetScanProgress(1.0); 152 popupProgress->accept(); 153 } 154 } 155 break; 156 157 case ScannerEvent::ScanShutdown: 158 { 159 Teardown(); 160 } 161 break; 162 163 case ScannerEvent::AppendTextToLog: 164 { 165 log->updateText(scanEvent->strValue()); 166 } 167 break; 168 169 default: 170 break; 148 171 } 149 172 173 QMutexLocker locker(&popupLock); 174 if (!popupProgress) 175 return; 176 150 177 switch (scanEvent->eventType()) 151 178 { 152 case ScannerEvent::ServiceScanComplete: 153 popupProgress->progress(PROGRESS_MAX); 154 Teardown(); 179 case ScannerEvent::SetStatusText: 180 popupProgress->SetStatusText(scanEvent->strValue()); 155 181 break; 156 case ScannerEvent:: Update:157 log->updateText(scanEvent->strValue());182 case ScannerEvent::SetStatusTitleText: 183 popupProgress->SetStatusTitleText(scanEvent->strValue()); 158 184 break; 159 case ScannerEvent:: TableLoaded:160 popupProgress-> incrementProgress();185 case ScannerEvent::SetPercentComplete: 186 popupProgress->SetScanProgress(scanEvent->intValue() * 0.01); 161 187 break; 162 case ScannerEvent::ServicePct: 163 popupProgress->progress( 164 (scanEvent->intValue() * PROGRESS_MAX) / 100); 188 case ScannerEvent::SetStatusSignalLock: 189 popupProgress->SetStatusLock(scanEvent->intValue()); 165 190 break; 166 case ScannerEvent:: DVBLock:167 popupProgress-> dvbLock(scanEvent->intValue());191 case ScannerEvent::SetStatusSignalToNoise: 192 popupProgress->SetStatusSignalToNoise(scanEvent->intValue()); 168 193 break; 169 case ScannerEvent:: DVBSNR:170 popupProgress-> signalToNoise(scanEvent->intValue());194 case ScannerEvent::SetStatusSignalStrength: 195 popupProgress->SetStatusSignalStrength(scanEvent->intValue()); 171 196 break; 172 case ScannerEvent::DVBSignalStrength: 173 popupProgress->signalStrength(scanEvent->intValue()); 197 default: 174 198 break; 175 199 } 176 200 } 177 201 178 202 void ScanWizardScanner::scanComplete() 179 203 { 180 ScannerEvent::TYPE se = ScannerEvent::S erviceScanComplete;204 ScannerEvent::TYPE se = ScannerEvent::ScanComplete; 181 205 QApplication::postEvent(this, new ScannerEvent(se)); 182 206 } 183 207 184 208 void ScanWizardScanner::transportScanComplete() 185 209 { 186 210 scanner->ScanServicesSourceID(nVideoSource); 187 ScannerEvent* e = new ScannerEvent(ScannerEvent::Se rvicePct);211 ScannerEvent* e = new ScannerEvent(ScannerEvent::SetPercentComplete); 188 212 e->intValue(TRANSPORT_PCT); 189 213 QApplication::postEvent(this, e); 190 214 } 191 215 192 216 void ScanWizardScanner::serviceScanPctComplete(int pct) 193 217 { 194 ScannerEvent* e = new ScannerEvent(ScannerEvent::Se rvicePct);218 ScannerEvent* e = new ScannerEvent(ScannerEvent::SetPercentComplete); 195 219 int tmp = TRANSPORT_PCT + ((100 - TRANSPORT_PCT) * pct)/100; 196 220 e->intValue(tmp); 197 221 QApplication::postEvent(this, e); … … 201 225 { 202 226 if (str.isEmpty()) 203 227 return; 204 ScannerEvent* e = new ScannerEvent(ScannerEvent:: Update);228 ScannerEvent* e = new ScannerEvent(ScannerEvent::AppendTextToLog); 205 229 e->strValue(str); 206 230 QApplication::postEvent(this, e); 207 231 } 208 232 209 233 void ScanWizardScanner::updateStatusText(const QString &str) 210 234 { 211 if (str.isEmpty()) 212 return; 213 if (popupProgress) 214 popupProgress->status(tr("Scanning")+" "+str); 235 QString msg = tr("Scanning"); 236 if (!str.isEmpty()) 237 msg = QString("%1 %2").arg(msg).arg(str); 238 239 ScannerEvent* e = new ScannerEvent(ScannerEvent::SetStatusText); 240 e->strValue(msg); 241 QApplication::postEvent(this, e); 215 242 } 216 243 217 244 void ScanWizardScanner::dvbLock(const SignalMonitorValue &val) … … 231 258 232 259 void ScanWizardScanner::dvbLock(int locked) 233 260 { 234 ScannerEvent* e = new ScannerEvent(ScannerEvent:: DVBLock);261 ScannerEvent* e = new ScannerEvent(ScannerEvent::SetStatusSignalLock); 235 262 e->intValue(locked); 236 263 QApplication::postEvent(this, e); 237 264 } 238 265 239 266 void ScanWizardScanner::dvbSNR(int i) 240 267 { 241 ScannerEvent* e = new ScannerEvent(ScannerEvent:: DVBSNR);268 ScannerEvent* e = new ScannerEvent(ScannerEvent::SetStatusSignalToNoise); 242 269 e->intValue(i); 243 270 QApplication::postEvent(this, e); 244 271 } 245 272 246 273 void ScanWizardScanner::dvbSignalStrength(int i) 247 274 { 248 ScannerEvent* e = new ScannerEvent(ScannerEvent:: DVBSignalStrength);275 ScannerEvent* e = new ScannerEvent(ScannerEvent::SetStatusSignalStrength); 249 276 e->intValue(i); 250 277 QApplication::postEvent(this, e); 251 278 } … … 283 310 } 284 311 285 312 scanner->StartScanner(); 313 updateStatusText(""); 286 314 287 popupProgress->status(tr("Scanning"));288 popupProgress->progress( (TUNED_PCT * PROGRESS_MAX) / 100 );289 290 315 bool ok = false; 291 316 292 317 if (do_delete_channels && (ScanTypeSetting::TransportScan == scantype)) … … 354 379 ok = scanner->ScanServicesSourceID(sourceid); 355 380 if (ok) 356 381 { 357 post_event(this, ScannerEvent::ServicePct, 358 TRANSPORT_PCT); 382 serviceScanPctComplete(0); 359 383 } 360 384 else 361 385 { … … 390 414 } 391 415 if (ok) 392 416 { 393 post_event(this, ScannerEvent::ServicePct, 394 TRANSPORT_PCT); 417 serviceScanPctComplete(0); 395 418 } 396 419 else 397 420 { … … 570 593 } 571 594 #endif // USING_DVB 572 595 573 popupProgress = new ScanProgressPopup(this); 574 popupProgress->progress(0); 575 popupProgress->exec(this); 596 MonitorProgress(monitor, monitor, dvbm); 576 597 } 577 598 578 599 void ScanWizardScanner::ImportM3U(uint cardid, const QString &inputname, … … 581 602 #ifdef USING_IPTV 582 603 //Create an analog scan object 583 604 freeboxScanner = new IPTVChannelFetcher(cardid, inputname, sourceid); 584 popupProgress = new ScanProgressPopup(this, false);585 605 586 606 connect(freeboxScanner, SIGNAL(ServiceScanComplete(void)), 587 607 this, SLOT( scanComplete(void))); … … 590 610 connect(freeboxScanner, SIGNAL(ServiceScanPercentComplete(int)), 591 611 this, SLOT( serviceScanPctComplete(int))); 592 612 593 popupProgress->progress(0); 594 popupProgress->exec(this); 613 MonitorProgress(false, false, false); 595 614 596 615 if (!freeboxScanner->Scan()) 597 616 { 598 617 MythPopupBox::showOkPopup(gContext->GetMainWindow(), 599 618 tr("ScanWizard"), 600 619 tr("Error starting scan")); 601 Teardown();602 620 } 603 621 #endif // USING_IPTV 604 622 } 623 624 void *spawn_popup(void *tmp) 625 { 626 ((ScanWizardScanner*)(tmp))->RunPopup(); 627 return NULL; 628 } 629 630 void ScanWizardScanner::RunPopup(void) 631 { 632 int ret = popupProgress->exec(); 633 634 popupLock.lock(); 635 popupProgress->deleteLater(); 636 popupProgress = NULL; 637 popupLock.unlock(); 638 639 post_event(this, ScannerEvent::ScanShutdown, ret); 640 } 641 642 void ScanWizardScanner::StopPopup(void) 643 { 644 if (popupProgress) 645 { 646 popupProgress->reject(); 647 popupLock.unlock(); 648 pthread_join(popup_thread, NULL); 649 popupLock.lock(); 650 } 651 } 652 653 void ScanWizardScanner::MonitorProgress(bool lock, bool strength, bool snr) 654 { 655 QMutexLocker locker(&popupLock); 656 StopPopup(); 657 popupProgress = new ScanProgressPopup(lock, strength, snr); 658 if (pthread_create(&popup_thread, NULL, spawn_popup, this) != 0) 659 { 660 popupProgress->deleteLater(); 661 popupProgress = NULL; 662 } 663 } -
libs/libmythtv/scanwizardscanner.h
58 58 { 59 59 Q_OBJECT 60 60 61 friend void *spawn_popup(void*); 62 61 63 public: 62 64 ScanWizardScanner(void); 63 65 virtual void deleteLater(void) … … 96 98 void serviceScanPctComplete(int pct); 97 99 98 100 protected: 99 ~ScanWizardScanner() { Teardown(); }101 ~ScanWizardScanner(); 100 102 void Teardown(void); 101 103 102 104 void PreScanCommon(int scantype, uint parent_cardid, uint child_cardid, … … 108 110 void dvbSignalStrength(int); 109 111 void customEvent(QCustomEvent *e); 110 112 113 void MonitorProgress(bool lock, bool strength, bool snr); 114 void RunPopup(void); 115 void StopPopup(void); 116 111 117 public: 112 118 static QString kTitle; 113 119 114 120 private: 115 121 LogList *log; 116 122 ChannelBase *channel; 117 ScanProgressPopup *popupProgress;118 123 119 SIScan *scanner; 120 AnalogScan *analogScanner; 124 ScanProgressPopup *popupProgress; 125 pthread_t popup_thread; 126 mutable QMutex popupLock; 127 128 SIScan *scanner; 121 129 IPTVChannelFetcher *freeboxScanner; 122 130 123 131 uint nVideoSource; 124 132 125 // tranport info126 uint frequency;127 QString modulation;128 129 133 // dvb-utils imported channels 130 134 DTVChannelList channels; 131 135 }; -
libs/libmythtv/scanwizardhelpers.cpp
78 78 return QString("(%1)").arg(cardTypes); 79 79 } 80 80 81 ScanProgressPopup::ScanProgressPopup( 82 ScanWizardScanner *parent, bool signalmonitors) :83 ConfigurationPopupDialog()81 ScanProgressPopup::ScanProgressPopup(bool lock, bool strength, bool snr) : 82 ConfigurationPopupDialog(), 83 done(false), ss(NULL), sn(NULL), progressBar(NULL), sl(NULL), sta(NULL) 84 84 { 85 85 setLabel(tr("Scan Progress")); 86 86 87 if (signalmonitors) 87 addChild(sta = new TransLabelSetting()); 88 sta->setLabel(tr("Status")); 89 sta->setValue(tr("Tuning")); 90 91 if (lock) 88 92 { 89 VerticalConfigurationGroup *box = new VerticalConfigurationGroup(); 90 box->addChild(sta = new TransLabelSetting()); 91 box->addChild(sl = new TransLabelSetting()); 92 sta->setLabel(tr("Status")); 93 sta->setValue(tr("Tuning")); 93 addChild(sl = new TransLabelSetting()); 94 94 sl->setValue(" " 95 95 " "); 96 box->setUseFrame(false);97 addChild(box);98 96 } 99 97 100 addChild(progressBar = new ScanSignalMeter(PROGRESS_MAX)); 101 progressBar->setValue(0); 102 progressBar->setLabel(tr("Scan")); 98 if (strength) 99 { 100 addChild(ss = new ScanSignalMeter(65535)); 101 ss->setLabel(tr("Signal Strength")); 102 } 103 103 104 if (s ignalmonitors)104 if (snr) 105 105 { 106 addChild(ss = new ScanSignalMeter(65535));107 106 addChild(sn = new ScanSignalMeter(65535)); 108 ss->setLabel(tr("Signal Strength"));109 107 sn->setLabel(tr("Signal/Noise")); 110 108 } 111 109 110 addChild(progressBar = new ScanSignalMeter(65535)); 111 progressBar->setValue(0); 112 progressBar->setLabel(tr("Scan")); 113 114 112 115 TransButtonSetting *cancel = new TransButtonSetting(); 113 116 cancel->setLabel(tr("Cancel")); 114 117 addChild(cancel); 115 118 116 119 connect(cancel, SIGNAL(pressed(void)), 117 parent, SLOT( CancelScan(void)));120 this, SLOT( reject(void))); 118 121 119 122 //Seem to need to do this as the constructor doesn't seem enough 120 123 setUseLabel(false); … … 126 129 VERBOSE(VB_IMPORTANT, "~ScanProgressPopup()"); 127 130 } 128 131 129 void ScanProgressPopup:: signalToNoise(int value)132 void ScanProgressPopup::SetStatusSignalToNoise(int value) 130 133 { 131 sn->setValue(value); 134 if (sn) 135 sn->setValue(value); 132 136 } 133 137 134 void ScanProgressPopup:: signalStrength(int value)138 void ScanProgressPopup::SetStatusSignalStrength(int value) 135 139 { 136 ss->setValue(value); 140 if (ss) 141 ss->setValue(value); 137 142 } 138 143 139 void ScanProgressPopup:: dvbLock(int value)144 void ScanProgressPopup::SetStatusLock(int value) 140 145 { 141 sl->setValue((value) ? tr("Locked") : tr("No Lock")); 146 if (sl) 147 sl->setValue((value) ? tr("Locked") : tr("No Lock")); 142 148 } 143 149 144 void ScanProgressPopup:: status(const QString&value)150 void ScanProgressPopup::SetStatusText(const QString &value) 145 151 { 146 sta->setValue(value); 152 if (sta) 153 sta->setValue(value); 147 154 } 148 155 149 void ScanProgressPopup:: exec(ScanWizardScanner *parent)156 void ScanProgressPopup::SetStatusTitleText(const QString &value) 150 157 { 151 dialog = (ConfigPopupDialogWidget*) 152 dialogWidget(gContext->GetMainWindow(), "ScanProgressPopup"); 153 connect(dialog, SIGNAL(popupDone(void)), 154 parent, SLOT( CancelScan(void))); 155 dialog->ShowPopup(this); 158 QString msg = tr("Scan Progress") + QString(" %1").arg(value); 159 setLabel(msg); 156 160 } 157 161 162 void ScanProgressPopup::deleteLater(void) 163 { 164 disconnect(); 165 if (dialog) 166 { 167 dialog->deleteLater(); 168 dialog = NULL; 169 } 170 ConfigurationPopupDialog::deleteLater(); 171 } 172 173 int ScanProgressPopup::exec(void) 174 { 175 if (!dialog) 176 { 177 dialog = (ConfigPopupDialogWidget*) 178 dialogWidget(gContext->GetMainWindow(), 179 "ConfigurationPopupDialog"); 180 } 181 dialog->setResult(0); 182 183 done = false; 184 dialog->ShowPopup(this, SLOT(Done(void))); 185 186 while (!done) 187 wait.wait(100); 188 189 return dialog->result(); 190 } 191 192 void ScanProgressPopup::Done(void) 193 { 194 done = true; 195 wait.wakeAll(); 196 } 197 158 198 void MultiplexSetting::load(void) 159 199 { 160 200 clearSelections(); -
libs/libmyth/settings.cpp
1547 1547 } 1548 1548 } 1549 1549 1550 void ConfigurationPopupDialog::deleteLater(void) 1551 { 1552 disconnect(); 1553 if (dialog) 1554 { 1555 dialog->disconnect(); 1556 dialog->deleteLater(); 1557 dialog = NULL; 1558 label = NULL; 1559 } 1560 VerticalConfigurationGroup::deleteLater(); 1561 } 1562 1550 1563 MythDialog* ConfigurationPopupDialog::dialogWidget(MythMainWindow* parent, 1551 1564 const char* widgetName) 1552 1565 { … … 1559 1572 box->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, 1560 1573 QSizePolicy::Maximum)); 1561 1574 1562 QLabel*label = new QLabel(box);1575 label = new QLabel(box); 1563 1576 label->setText(getLabel()); 1564 1577 label->setBackgroundOrigin(QWidget::WindowOrigin); 1565 1578 label->setAlignment(Qt::AlignHCenter); … … 1576 1589 return dialog; 1577 1590 } 1578 1591 1592 void ConfigurationPopupDialog::setLabel(QString str) 1593 { 1594 VerticalConfigurationGroup::setLabel(str); 1595 if (label) 1596 label->setText(str); 1597 } 1598 1579 1599 int ConfigurationPopupDialog::exec(bool saveOnAccept) 1580 1600 { 1581 1601 storage->load(); 1582 1583 1602 dialog = (ConfigPopupDialogWidget*) 1584 1603 dialogWidget(gContext->GetMainWindow(), "ConfigurationPopupDialog"); 1585 1604 dialog->ShowPopup(this); … … 1588 1607 1589 1608 if ((QDialog::Accepted == ret) && saveOnAccept) 1590 1609 storage->save(); 1591 1592 1610 return ret; 1593 1611 } 1594 1612 -
libs/libmyth/mythdialogs.cpp
447 447 MythDialog::keyPressEvent(e); 448 448 } 449 449 450 void MythPopupBox::accept(void) 451 { 452 MythDialog::done(Accepted); 453 emit popupDone(); 454 } 455 456 void MythPopupBox::reject(void) 457 { 458 MythDialog::done(Rejected); 459 emit popupDone(); 460 } 461 450 462 int MythPopupBox::ExecPopup(QObject *target, const char *slot) 451 463 { 452 464 if (!target) -
libs/libmyth/mythcontext.h
201 201 202 202 /// Update this whenever the plug-in API changes. 203 203 /// Including changes in the libmythtv class methods used by plug-ins. 204 #define MYTH_BINARY_VERSION "0.20.2007011 1-1"204 #define MYTH_BINARY_VERSION "0.20.20070112-1" 205 205 206 206 /** \brief Increment this whenever the MythTV network protocol changes. 207 207 * -
libs/libmyth/settings.h
1075 1075 1076 1076 public: 1077 1077 ConfigurationPopupDialog() : 1078 VerticalConfigurationGroup(), dialog(NULL) { }1078 VerticalConfigurationGroup(), dialog(NULL), label(NULL) { } 1079 1079 1080 virtual void deleteLater(void); 1081 1080 1082 virtual MythDialog *dialogWidget( 1081 1083 MythMainWindow *parent, const char* widgetName); 1082 1084 1083 1085 int exec(bool saveOnAccept = true); 1084 1086 1087 virtual void setLabel(QString str); 1088 1085 1089 public slots: 1086 1090 void accept(void) { if (dialog) dialog->accept(); } 1087 1091 void reject(void) { if (dialog) dialog->reject(); } … … 1091 1095 1092 1096 protected: 1093 1097 /// You need to call deleteLater to delete QObject 1094 virtual ~ConfigurationPopupDialog() { dialog->deleteLater();}1098 virtual ~ConfigurationPopupDialog() { } 1095 1099 1096 1100 protected: 1097 ConfigPopupDialogWidget* dialog; 1101 ConfigPopupDialogWidget *dialog; 1102 QLabel *label; 1098 1103 }; 1099 1104 1100 1105 /////////////////////////////////////////////////////////////////////////////// -
libs/libmyth/mythdialogs.h
70 70 71 71 virtual bool onMediaEvent(MythMediaDevice * mediadevice); 72 72 73 void setResult(int r) { rescode = r; } 74 73 75 signals: 74 76 void menuButtonPressed(); 75 77 … … 82 84 virtual void reject(); 83 85 84 86 protected: 85 void setResult(int r) { rescode = r; }86 87 void keyPressEvent(QKeyEvent *e); 87 88 88 89 float wmult, hmult; … … 139 140 140 141 static bool showGetTextPopup(MythMainWindow *parent, QString title, 141 142 QString message, QString& text); 143 144 virtual void accept(void); 145 virtual void reject(void); 146 142 147 signals: 143 148 void popupDone(); 144 149