MythTV  master
channelsettings.cpp
Go to the documentation of this file.
1 // Qt headers
2 #include <QWidget>
3 #include <QFile>
4 #include <QCoreApplication>
5 
6 // MythTV headers
7 #include "channelsettings.h"
8 #include "channelutil.h"
9 #include "programinfo.h" // for COMM_DETECT*, GetPreferredSkipTypeCombinations()
10 #include "mpegtables.h"
11 #include "mythdirs.h"
12 #include "cardutil.h"
13 
14 
16 {
17  QString fieldTag = (":WHERE" + m_id.getField().toUpper());
18  QString query(m_id.getField() + " = " + fieldTag);
19 
20  bindings.insert(fieldTag, m_id.getValue());
21 
22  return query;
23 }
24 
26 {
27  QString fieldTag = (":SET" + m_id.getField().toUpper());
28  QString nameTag = (":SET" + GetColumnName().toUpper());
29 
30  QString query(m_id.getField() + " = " + fieldTag + ", " +
31  GetColumnName() + " = " + nameTag);
32 
33  bindings.insert(fieldTag, m_id.getValue());
34  bindings.insert(nameTag, m_user->GetDBValue());
35 
36  return query;
37 }
38 
39 /*****************************************************************************
40  Channel Options - Common
41  *****************************************************************************/
42 
44 {
45  public:
46  explicit Name(const ChannelID &id) :
47  MythUITextEditSetting(new ChannelDBStorage(this, id, "name"))
48  {
49  setLabel(QCoreApplication::translate("(Common)", "Channel Name"));
50  }
51 };
52 
54 {
55  public:
56  explicit Channum(const ChannelID &id) :
57  MythUITextEditSetting(new ChannelDBStorage(this, id, "channum"))
58  {
59  setLabel(QCoreApplication::translate("(Common)", "Channel Number"));
60  setHelpText(QCoreApplication::translate("(Common)",
61  "This is the number by which the channel is known to MythTV."));
62  }
63 };
64 
66 {
67  public:
68  Source(const ChannelID &id, uint _default_sourceid) :
69  MythUIComboBoxSetting(new ChannelDBStorage(this, id, "sourceid")),
70  default_sourceid(_default_sourceid)
71  {
72  setLabel(QCoreApplication::translate("(Common)", "Video Source"));
73  }
74 
75  void Load(void) override // StandardSetting
76  {
79 
80  if (default_sourceid && (getValue().toUInt() == 0U))
81  {
83  if (which)
84  setValue(which);
85  }
86  }
87 
88  void fillSelections(void)
89  {
90  addSelection(QCoreApplication::translate("(ChannelSettings)",
91  "[Not Selected]"), "0");
92 
94  query.prepare("SELECT name, sourceid "
95  "FROM videosource "
96  "ORDER BY sourceid");
97 
98  if (!query.exec() || !query.isActive())
99  {
100  MythDB::DBError("Source::fillSelections", query);
101  }
102  else
103  {
104  for (uint i = 1; query.next(); i++)
105  {
106  sourceid_to_index[query.value(1).toUInt()] = i;
107  addSelection(query.value(0).toString(),
108  query.value(1).toString());
109  }
110  }
111 
112  sourceid_to_index[0] = 0; // Not selected entry.
113  }
114 
115  private:
117  QMap<uint,uint> sourceid_to_index;
118 };
119 
121 {
122  public:
123  explicit Callsign(const ChannelID &id) :
124  MythUITextEditSetting(new ChannelDBStorage(this, id, "callsign"))
125  {
126  setLabel(QCoreApplication::translate("(Common)", "Callsign"));
127  }
128 };
129 
131  MythUIComboBoxSetting(new ChannelDBStorage(this, id, "tvformat"))
132 {
133  setLabel(QCoreApplication::translate("(ChannelSettings)", "TV Format"));
134  setHelpText(QCoreApplication::translate("(ChannelSettings)",
135  "If this channel uses a format other than TV Format in the General "
136  "Backend Setup screen, set it here."));
137 
138  addSelection(QCoreApplication::translate("(Common)", "Default"), "Default");
139 
140  QStringList list = GetFormats();
141  for (int i = 0; i < list.size(); i++)
142  addSelection(list[i]);
143 }
144 
146 {
147  QStringList list;
148 
149  list.push_back("NTSC");
150  list.push_back("NTSC-JP");
151  list.push_back("PAL");
152  list.push_back("PAL-60");
153  list.push_back("PAL-BG");
154  list.push_back("PAL-DK");
155  list.push_back("PAL-D");
156  list.push_back("PAL-I");
157  list.push_back("PAL-M");
158  list.push_back("PAL-N");
159  list.push_back("PAL-NC");
160  list.push_back("SECAM");
161  list.push_back("SECAM-D");
162  list.push_back("SECAM-DK");
163 
164  return list;
165 }
166 
168 {
169  public:
170  explicit TimeOffset(const ChannelID &id) :
171  MythUISpinBoxSetting(new ChannelDBStorage(this, id, "tmoffset"),
172  -1440, 1440, 1)
173  {
174  setLabel(QCoreApplication::translate("(ChannelSettings)",
175  "DataDirect Time Offset"));
176 
177  setHelpText(QCoreApplication::translate("(ChannelSettings)",
178  "Offset (in minutes) to apply to the program guide data during "
179  "import. This can be used when the listings for a particular "
180  "channel are in a different time zone."));
181  }
182 };
183 
185 {
186  public:
187  explicit Priority(const ChannelID &id) :
188  MythUISpinBoxSetting(new ChannelDBStorage(this, id, "recpriority"),
189  -99, 99, 1)
190  {
191  setLabel(QCoreApplication::translate("(ChannelSettings)", "Priority"));
192 
193  setHelpText(QCoreApplication::translate("(ChannelSettings)",
194  "Number of priority points to be added to any recording on this "
195  "channel during scheduling. Use a positive number as the priority "
196  "if you want this to be a preferred channel, a negative one to "
197  "depreciate this channel."));
198  }
199 };
200 
202 {
203  public:
204  explicit Icon(const ChannelID &id) :
205  MythUITextEditSetting(new ChannelDBStorage(this, id, "icon"))
206  {
207  setLabel(QCoreApplication::translate("(ChannelSettings)", "Icon"));
208 
209  setHelpText(QCoreApplication::translate("(ChannelSettings)",
210  "Image file to use as the icon for this channel on various MythTV "
211  "displays."));
212  }
213 };
214 
216 {
217  public:
218  explicit VideoFilters(const ChannelID &id) :
219  MythUITextEditSetting(new ChannelDBStorage(this, id, "videofilters"))
220  {
221  setLabel(QCoreApplication::translate("(ChannelSettings)",
222  "Video filters"));
223 
224  setHelpText(QCoreApplication::translate("(ChannelSettings)",
225  "Filters to be used when recording from this channel. Not used "
226  "with hardware encoding cards."));
227 
228  }
229 };
230 
231 
233 {
234  public:
235  explicit OutputFilters(const ChannelID &id) :
236  MythUITextEditSetting(new ChannelDBStorage(this, id, "outputfilters"))
237  {
238  setLabel(QCoreApplication::translate("(ChannelSettings)",
239  "Playback filters"));
240 
241  setHelpText(QCoreApplication::translate("(ChannelSettings)",
242  "Filters to be used when recordings from this channel are viewed. "
243  "Start with a plus to append to the global playback filters."));
244  }
245 };
246 
248 {
249  public:
250  XmltvID(const ChannelID &id, const QString &_sourceName) :
251  MythUIComboBoxSetting(new ChannelDBStorage(this, id, "xmltvid"), true),
252  sourceName(_sourceName)
253  {
254  setLabel(QCoreApplication::translate("(Common)", "XMLTV ID"));
255 
256  setHelpText(QCoreApplication::translate("(ChannelSettings)",
257  "ID used by listing services to get an exact correspondence "
258  "between a channel in your line-up and a channel in their "
259  "database. Normally this is set automatically when "
260  "'mythfilldatabase' is run."));
261  }
262 
263  void Load(void) override // StandardSetting
264  {
265  fillSelections();
267  }
268 
269  void fillSelections(void)
270  {
271  clearSelections();
272 
273  QString xmltvFile = GetConfDir() + '/' + sourceName + ".xmltv";
274 
275  if (QFile::exists(xmltvFile))
276  {
277  QFile file(xmltvFile);
278  if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
279  return;
280 
281  QStringList idList;
282 
283  while (!file.atEnd())
284  {
285  QByteArray line = file.readLine();
286 
287  if (line.startsWith("channel="))
288  {
289  QString id = line.mid(8, -1).trimmed();
290  idList.append(id);
291  }
292  }
293 
294  idList.sort();
295 
296  for (int x = 0; x < idList.size(); x++)
297  addSelection(idList.at(x), idList.at(x));
298  }
299  }
300 
301  private:
302  QString sourceName;
303 };
304 
306 {
307  public:
308  explicit ServiceID(const ChannelID &id)
309  : MythUISpinBoxSetting(new ChannelDBStorage(this, id, "serviceid"),
310  -1, UINT16_MAX, 1, 1, "NULL")
311  {
312  setLabel(QCoreApplication::translate("(ChannelSettings)", "ServiceID"));
313 
314  setHelpText(QCoreApplication::translate("(ChannelSettings)",
315  "Service ID (Program Number) of desired channel within the transport stream. "
316  "If there is only one channel, then setting this to anything will still find it."));
317  }
318 
319  void Load(void) override // StandardSetting
320  {
322 
323  if (getValue().isNull())
324  setValue("-1");
325  }
326 
327  QString getValue(void) const override // StandardSetting
328  {
329  if (StandardSetting::getValue().toInt() == -1)
330  return QString();
331  return StandardSetting::getValue();
332  }
333 };
334 
336 {
337  public:
338  explicit CommMethod(const ChannelID &id) :
339  MythUIComboBoxSetting(new ChannelDBStorage(this, id, "commmethod"))
340  {
341  setLabel(QCoreApplication::translate("(ChannelSettings)",
342  "Commercial Detection Method"));
343 
344  setHelpText(QCoreApplication::translate("(ChannelSettings)",
345  "Changes the method of commercial detection used for recordings on "
346  "this channel or skips detection by marking the channel as "
347  "Commercial Free."));
348 
349  deque<int> tmp = GetPreferredSkipTypeCombinations();
350  tmp.push_front(COMM_DETECT_UNINIT);
351  tmp.push_back(COMM_DETECT_COMMFREE);
352 
353  for (size_t i = 0; i < tmp.size(); i++)
354  addSelection(SkipTypeToString(tmp[i]), QString::number(tmp[i]));
355  }
356 };
357 
359 {
360  public:
361  explicit Visible(const ChannelID &id) :
362  MythUICheckBoxSetting(new ChannelDBStorage(this, id, "visible"))
363  {
364  setValue(true);
365 
366  setLabel(QCoreApplication::translate("(ChannelSettings)", "Visible"));
367 
368  setHelpText(QCoreApplication::translate("(ChannelSettings)",
369  "If enabled, the channel will be visible in the EPG."));
370  }
371 };
372 
374 {
375  public:
376  explicit OnAirGuide(const ChannelID &id) :
377  MythUICheckBoxSetting(new ChannelDBStorage(this, id, "useonairguide"))
378  {
379  setLabel(QCoreApplication::translate("(ChannelSettings)",
380  "Use on air guide"));
381 
382  setHelpText(QCoreApplication::translate("(ChannelSettings)",
383  "If enabled, guide information for this channel will be updated "
384  "using 'Over-the-Air' program listings."));
385  }
386 };
387 
388 /*****************************************************************************
389  Channel Options - Video 4 Linux
390  *****************************************************************************/
391 
393 {
394  public:
395  explicit Freqid(const ChannelID &id) :
396  MythUITextEditSetting(new ChannelDBStorage(this, id, "freqid"))
397  {
398  setLabel(QCoreApplication::translate("(ChannelSettings)",
399  "Freq/Channel"));
400  setHelpText(QCoreApplication::translate("(ChannelSettings)",
401  "Depending on the tuner type, specify either the exact "
402  "frequency (in kHz) or a valid channel "
403  "number that will be understood by your tuners."));
404  }
405 };
406 
408 {
409  public:
410  explicit Finetune(const ChannelID& id)
411  : MythUISpinBoxSetting(new ChannelDBStorage(this, id, "finetune"),
412  -300, 300, 1)
413  {
414  setLabel(QCoreApplication::translate("(ChannelSettings)",
415  "Finetune (kHz)"));
416 
417  setHelpText(QCoreApplication::translate("(ChannelSettings)",
418  "Value to be added to your desired frequency (in kHz) for "
419  "'fine tuning'."));
420 
421  setValue("0");
422  }
423 };
424 
426 {
427  public:
428  explicit Contrast(const ChannelID &id) :
429  MythUISpinBoxSetting(new ChannelDBStorage(this, id, "contrast"),
430  0, 65535, 655)
431  {
432  setLabel(QCoreApplication::translate("(Common)", "Contrast"));
433  }
434 };
435 
437 {
438  public:
439  explicit Brightness(const ChannelID &id) :
440  MythUISpinBoxSetting(new ChannelDBStorage(this, id, "brightness"),
441  0, 65535, 655)
442  {
443  setLabel(QCoreApplication::translate("(Common)", "Brightness"));
444  }
445 };
446 
448 {
449  public:
450  explicit Colour(const ChannelID &id) :
451  MythUISpinBoxSetting(new ChannelDBStorage(this, id, "colour"),
452  0, 65535, 655)
453  {
454  setLabel(QCoreApplication::translate("(Common)", "Color"));
455  }
456 };
457 
458 class Hue : public MythUISpinBoxSetting
459 {
460  public:
461  explicit Hue(const ChannelID &id) :
462  MythUISpinBoxSetting(new ChannelDBStorage(this, id, "hue"),
463  0, 65535, 655)
464  {
465  setLabel(QCoreApplication::translate("(Common)", "Hue"));
466  }
467 };
468 
470  uint default_sourceid, bool add_freqid)
471 {
472  setLabel(QCoreApplication::translate("(ChannelSettings)",
473  "Channel Options - Common"));
474  addChild(new Name(id));
475 
476  Source *source = new Source(id, default_sourceid);
477 
478  Channum *channum = new Channum(id);
479  addChild(channum);
480  if (add_freqid)
481  {
482  m_freqid = new Freqid(id);
484  }
485  else
486  m_freqid = nullptr;
487  addChild(new Callsign(id));
488 
489 
490 
491  addChild(new Visible(id));
492  addChild(new ServiceID(id));
493 
494  addChild(source);
495  addChild(new ChannelTVFormat(id));
496  addChild(new Priority(id));
497 
498  addChild(m_onairguide = new OnAirGuide(id));
499  addChild(m_xmltvID = new XmltvID(id, source->getValueLabel()));
500  addChild(new TimeOffset(id));
501 
502  addChild(new CommMethod(id));
503  addChild(new Icon(id));
504 
505  connect(m_onairguide, SIGNAL(valueChanged( bool)),
506  this, SLOT( onAirGuideChanged(bool)));
507  connect(source, SIGNAL(valueChanged( const QString&)),
508  this, SLOT( sourceChanged(const QString&)));
509 };
510 
512 {
513  (void)fValue;
514 }
515 
516 void ChannelOptionsCommon::sourceChanged(const QString& sourceid)
517 {
518  bool supports_eit = true;
519  bool uses_eit_only = false;
520 
521  MSqlQuery query(MSqlQuery::InitCon());
522  query.prepare("SELECT cardtype "
523  "FROM capturecard, videosource "
524  "WHERE capturecard.sourceid = videosource.sourceid AND "
525  " videosource.sourceid = :SOURCEID");
526  query.bindValue(":SOURCEID", sourceid);
527 
528  if (!query.exec() || !query.isActive())
529  MythDB::DBError("sourceChanged -- supports eit", query);
530  else
531  {
532  supports_eit = (query.size() == 0);
533  while (query.next())
534  {
535  supports_eit |= CardUtil::IsEITCapable(
536  query.value(0).toString().toUpper());
537  }
538 
539  query.prepare("SELECT xmltvgrabber "
540  "FROM videosource "
541  "WHERE sourceid = :SOURCEID");
542  query.bindValue(":SOURCEID", sourceid);
543 
544  if (!query.exec() || !query.isActive())
545  MythDB::DBError("sourceChanged -- eit only", query);
546  else
547  {
548  uses_eit_only = (query.size() != 0);
549  while (query.next())
550  {
551  uses_eit_only &= (query.value(0).toString() == "eitonly");
552  }
553  }
554  }
555 
556  m_onairguide->setEnabled(supports_eit);
557  m_xmltvID->setEnabled(!uses_eit_only);
558  m_xmltvID->Load();
559 }
560 
562 {
563  setLabel(QCoreApplication::translate("(ChannelSettings)",
564  "Channel Options - Filters"));
565 
566  addChild(new VideoFilters(id));
567  addChild(new OutputFilters(id));
568 }
569 
571 {
572  setLabel(QCoreApplication::translate("(ChannelSettings)",
573  "Channel Options - Video4Linux"));
574 
575  addChild(new Freqid(id));
576  addChild(new Finetune(id));
577  addChild(new Contrast(id));
578  addChild(new Brightness(id));
579  addChild(new Colour(id));
580  addChild(new Hue(id));
581 };
582 
583 /*****************************************************************************
584  Channel Options - Video 4 Linux
585  *****************************************************************************/
586 
588  m_cid(id)
589 {
590  setLabel(QCoreApplication::translate("(ChannelSettings)",
591  "Channel Options - Raw Transport Stream"));
592 
593  const uint mx = kMaxPIDs;
594  m_pids.resize(mx);
595  m_sids.resize(mx);
596  m_pcrs.resize(mx);
597 
598  for (uint i = 0; i < mx; i++)
599  {
600  addChild((m_pids[i] = new TransTextEditSetting()));
601  m_pids[i]->setLabel("PID");
603  m_sids[i]->setLabel(" StreamID");
604  for (uint j = 0x101; j <= 0x1ff; j++)
605  {
606  QString desc = StreamID::GetDescription(j&0xff);
607  if (!desc.isEmpty())
608  m_sids[i]->addSelection(
609  QString("%1 (0x%2)")
610  .arg(desc).arg(j&0xff,2,16,QLatin1Char('0')),
611  QString::number(j), false);
612  }
613  for (uint j = 0x101; j <= 0x1ff; j++)
614  {
615  QString desc = StreamID::GetDescription(j&0xff);
616  if (desc.isEmpty())
617  m_sids[i]->addSelection(
618  QString("0x%1").arg(j&0xff,2,16,QLatin1Char('0')),
619  QString::number(j), false);
620  }
621 /* we don't allow tables right now, PAT & PMT generated on the fly
622  for (uint j = 0; j <= 0xff; j++)
623  {
624  QString desc = TableID::GetDescription(j);
625  if (!desc.isEmpty())
626  {
627  m_sids[i]->addSelection(
628  QString("%1 (0x%2)").arg(j,0,16,QLatin1Char('0')),
629  QString::number(j),
630  false);
631  }
632  }
633 */
635  m_pcrs[i]->setLabel(" Is PCR");
636  }
637 };
638 
640 {
641  uint chanid = m_cid.getValue().toUInt();
642 
643  pid_cache_t pid_cache;
644  if (!ChannelUtil::GetCachedPids(chanid, pid_cache))
645  return;
646 
647  pid_cache_t::const_iterator it = pid_cache.begin();
648  for (uint i = 0; i < kMaxPIDs && it != pid_cache.end(); )
649  {
650  if (!(it->IsPermanent()))
651  {
652  ++it;
653  continue;
654  }
655 
656  m_pids[i]->setValue(QString("0x%1")
657  .arg(it->GetPID(),2,16,QLatin1Char('0')));
658  m_sids[i]->setValue(QString::number(it->GetComposite()&0x1ff));
659  m_pcrs[i]->setValue(it->IsPCRPID());
660 
661  ++it;
662  ++i;
663  }
664 }
665 
667 {
668  uint chanid = m_cid.getValue().toUInt();
669 
670  pid_cache_t pid_cache;
671  for (uint i = 0; i < kMaxPIDs; i++)
672  {
673  bool ok;
674  uint pid = m_pids[i]->getValue().toUInt(&ok, 0);
675  if (!ok || (m_sids[i]->getValue().toUInt() == 0U))
676  continue;
677 
678  pid_cache.push_back(
680  pid, m_sids[i]->getValue().toUInt() | 0x10000 |
681  (m_pcrs[i]->getValue().toUInt() ? 0x200 : 0x0)));
682  }
683 
684  ChannelUtil::SaveCachedPids(chanid, pid_cache, true /* delete_all */);
685 }
686 
687 /* vim: set expandtab tabstop=4 shiftwidth=4: */
QString sourceName
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:782
QString getValueLabel(void) const
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Definition: mythdbcon.cpp:863
void Save(void) override
#define Brightness
Definition: synaesthesia.h:12
VERBOSE_PREAMBLE Most true
Definition: verbosedefs.h:91
QString GetColumnName(void) const
Definition: mythstorage.h:43
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:125
static bool GetCachedPids(uint chanid, pid_cache_t &pid_cache)
Returns cached MPEG PIDs when given a Channel ID.
virtual void Load(void)
void addSelection(const QString &label, QString value=QString(), bool select=false)
const QString & getField(void) const
void fillSelections(void)
virtual void setHelpText(const QString &str)
vector< pid_cache_item_t > pid_cache_t
Definition: channelutil.h:43
ChannelOptionsRawTS(const ChannelID &id)
int size(void) const
Definition: mythdbcon.h:203
static QStringList GetFormats(void)
OutputFilters(const ChannelID &id)
void Load(void) override
QString SkipTypeToString(int flags)
unsigned int uint
Definition: compat.h:140
CommMethod(const ChannelID &id)
OnAirGuide * m_onairguide
virtual QString GetDBValue(void) const =0
static const uint kMaxPIDs
Contrast(const ChannelID &id)
Channum(const ChannelID &id)
static guint32 * tmp
Definition: goom_core.c:35
ChannelTVFormat(const ChannelID &id)
const ChannelID & m_cid
std::vector< TransTextEditSetting * > m_pids
Finetune(const ChannelID &id)
static QString GetDescription(uint stream_id)
int id
Definition: filldata.h:28
ChannelOptionsFilters(const ChannelID &id)
virtual QString getValue(void) const
Name(const ChannelID &id)
QString GetConfDir(void)
Definition: mythdirs.cpp:224
QVariant value(int i) const
Definition: mythdbcon.h:198
std::vector< TransMythUIComboBoxSetting * > m_sids
ServiceID(const ChannelID &id)
Source(const ChannelID &id, uint _default_sourceid)
void setValue(int value) override
XmltvID(const ChannelID &id, const QString &_sourceName)
virtual void setLabel(QString str)
Colour(const ChannelID &id)
static bool IsEITCapable(const QString &rawtype)
Definition: cardutil.h:156
QString GetSetClause(MSqlBindings &bindings) const override
QMap< uint, uint > sourceid_to_index
StorageUser * m_user
Definition: mythstorage.h:46
TimeOffset(const ChannelID &id)
bool isActive(void) const
Definition: mythdbcon.h:204
OnAirGuide(const ChannelID &id)
virtual void setEnabled(bool enabled)
static MSqlQueryInfo InitCon(ConnectionReuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:535
VideoFilters(const ChannelID &id)
virtual void addChild(StandardSetting *child)
void Load(void) override
QString GetWhereClause(MSqlBindings &bindings) const override
QString getValue(void) const override
deque< int > GetPreferredSkipTypeCombinations(void)
uint default_sourceid
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:807
Priority(const ChannelID &id)
static int x0
Definition: mythsocket.cpp:59
static QString Source(const QNetworkRequest &request)
Definition: netstream.cpp:141
Visible(const ChannelID &id)
static bool SaveCachedPids(uint chanid, const pid_cache_t &_pid_cache, bool delete_all=false)
Saves PIDs for PSIP tables to database.
Freqid(const ChannelID &id)
const ChannelID & m_id
Callsign(const ChannelID &id)
std::vector< TransMythUICheckBoxSetting * > m_pcrs
void setValue(const QString &) override
QMap< QString, QVariant > MSqlBindings
typedef for a map of string -> string bindings for generic queries.
Definition: mythdbcon.h:98
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:603
void sourceChanged(const QString &)
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:179
ChannelOptionsV4L(const ChannelID &id)
void Load(void) override
Brightness(const ChannelID &id)
virtual void setValue(const QString &newValue)
Hue(const ChannelID &id)
void Load(void) override
Icon(const ChannelID &id)
void fillSelections(void)
ChannelOptionsCommon(const ChannelID &id, uint default_sourceid, bool add_freqid)
void valueChanged(const QString &)