00001 #include "channelsettings.h"
00002 #include "cardutil.h"
00003
00004 QString ChannelDBStorage::whereClause(MSqlBindings &bindings)
00005 {
00006 QString fieldTag = (":WHERE" + id.getField().upper());
00007 QString query(id.getField() + " = " + fieldTag);
00008
00009 bindings.insert(fieldTag, id.getValue());
00010
00011 return query;
00012 }
00013
00014 QString ChannelDBStorage::setClause(MSqlBindings &bindings)
00015 {
00016 QString fieldTag = (":SET" + id.getField().upper());
00017 QString nameTag = (":SET" + setting->getName().upper());
00018
00019 QString query(id.getField() + " = " + fieldTag + ", " +
00020 setting->getName() + " = " + nameTag);
00021
00022 bindings.insert(fieldTag, id.getValue());
00023 bindings.insert(nameTag, setting->getValue());
00024
00025 return query;
00026 }
00027
00028
00029
00030
00031
00032 class Name : public LineEditSetting, public ChannelDBStorage
00033 {
00034 public:
00035 Name(const ChannelID &id) :
00036 LineEditSetting(this), ChannelDBStorage(this, id, "name")
00037 {
00038 setLabel(QObject::tr("Channel Name"));
00039 }
00040 };
00041
00042 class Channum : public LineEditSetting, public ChannelDBStorage
00043 {
00044 public:
00045 Channum(const ChannelID &id) :
00046 LineEditSetting(this), ChannelDBStorage(this, id, "channum")
00047 {
00048 setLabel(QObject::tr("Channel Number"));
00049 }
00050 };
00051
00052 class Source : public ComboBoxSetting, public ChannelDBStorage
00053 {
00054 public:
00055 Source(const ChannelID &id, uint _default_sourceid) :
00056 ComboBoxSetting(this), ChannelDBStorage(this, id, "sourceid"),
00057 default_sourceid(_default_sourceid)
00058 {
00059 setLabel(QObject::tr("Video Source"));
00060 }
00061
00062 void load(void)
00063 {
00064 fillSelections();
00065 ChannelDBStorage::load();
00066
00067 if (default_sourceid && !getValue().toUInt())
00068 {
00069 uint which = sourceid_to_index[default_sourceid];
00070 if (which)
00071 setValue(which);
00072 }
00073 }
00074
00075 void fillSelections(void)
00076 {
00077 addSelection(QObject::tr("[Not Selected]"), "0");
00078
00079 MSqlQuery query(MSqlQuery::InitCon());
00080 query.prepare("SELECT name, sourceid "
00081 "FROM videosource "
00082 "ORDER BY sourceid");
00083
00084 if (!query.exec() || !query.isActive())
00085 {
00086 MythContext::DBError("Source::fillSelections", query);
00087 }
00088 else
00089 {
00090 for (uint i = 1; query.next(); i++)
00091 {
00092 sourceid_to_index[query.value(1).toUInt()] = i;
00093 addSelection(query.value(0).toString(),
00094 query.value(1).toString());
00095 }
00096 }
00097
00098 sourceid_to_index[0] = 0;
00099 }
00100
00101 private:
00102 uint default_sourceid;
00103 QMap<uint,uint> sourceid_to_index;
00104 };
00105
00106 class Callsign : public LineEditSetting, public ChannelDBStorage
00107 {
00108 public:
00109 Callsign(const ChannelID &id) :
00110 LineEditSetting(this), ChannelDBStorage(this, id, "callsign")
00111 {
00112 setLabel(QObject::tr("Callsign"));
00113 }
00114 };
00115
00116 ChannelTVFormat::ChannelTVFormat(const ChannelID &id) :
00117 ComboBoxSetting(this), ChannelDBStorage(this, id, "tvformat")
00118 {
00119 setLabel(QObject::tr("TV Format"));
00120 setHelpText(
00121 QObject::tr(
00122 "If this channel uses a format other than TV "
00123 "Format in the General Backend Setup screen, set it here."));
00124
00125 addSelection(QObject::tr("Default"), "Default");
00126
00127 QStringList list = GetFormats();
00128 for (uint i = 0; i < list.size(); i++)
00129 addSelection(list[i]);
00130 }
00131
00132 QStringList ChannelTVFormat::GetFormats(void)
00133 {
00134 QStringList list;
00135
00136 list.push_back("NTSC");
00137 list.push_back("NTSC-JP");
00138 list.push_back("PAL");
00139 list.push_back("PAL-60");
00140 list.push_back("PAL-BG");
00141 list.push_back("PAL-DK");
00142 list.push_back("PAL-D");
00143 list.push_back("PAL-I");
00144 list.push_back("PAL-M");
00145 list.push_back("PAL-N");
00146 list.push_back("PAL-NC");
00147 list.push_back("SECAM");
00148 list.push_back("SECAM-D");
00149
00150 return list;
00151 }
00152
00153 class TimeOffset : public SpinBoxSetting, public ChannelDBStorage
00154 {
00155 public:
00156 TimeOffset(const ChannelID &id) :
00157 SpinBoxSetting(this, -1440, 1440, 1),
00158 ChannelDBStorage(this, id, "tmoffset")
00159 {
00160 setLabel(QObject::tr("DataDirect") + " " + QObject::tr("Time Offset"));
00161 setHelpText(QObject::tr("Offset (in minutes) to apply to the program "
00162 "guide data during import. This can be used when the "
00163 "listings for a particular channel are in a different "
00164 "time zone.") + " " +
00165 QObject::tr("(Works for DataDirect listings only.)"));
00166 }
00167 };
00168
00169 class Priority : public SpinBoxSetting, public ChannelDBStorage
00170 {
00171 public:
00172 Priority(const ChannelID &id) :
00173 SpinBoxSetting(this, -99, 99, 1),
00174 ChannelDBStorage(this, id, "recpriority")
00175 {
00176 setLabel(QObject::tr("Priority"));
00177 setHelpText(
00178 QObject::tr("Number of priority points to be added to any "
00179 "recording on this channel during scheduling.")+" "+
00180 QObject::tr("Use a positive number as the priority if you "
00181 "want this to be a preferred channel, a "
00182 "negative one to deprecate this channel."));
00183 }
00184 };
00185
00186 class Icon : public LineEditSetting, public ChannelDBStorage
00187 {
00188 public:
00189 Icon(const ChannelID &id) :
00190 LineEditSetting(this), ChannelDBStorage(this, id, "icon")
00191 {
00192 setLabel(QObject::tr("Icon"));
00193 setHelpText(QObject::tr("Image file to use as the icon for this "
00194 "channel on various MythTV displays."));
00195 }
00196 };
00197
00198 class VideoFilters : public LineEditSetting, public ChannelDBStorage
00199 {
00200 public:
00201 VideoFilters(const ChannelID &id) :
00202 LineEditSetting(this), ChannelDBStorage(this, id, "videofilters")
00203 {
00204 setLabel(QObject::tr("Video filters"));
00205 setHelpText(QObject::tr("Filters to be used when recording "
00206 "from this channel. Not used with "
00207 "hardware encoding cards."));
00208
00209 }
00210 };
00211
00212
00213 class OutputFilters : public LineEditSetting, public ChannelDBStorage
00214 {
00215 public:
00216 OutputFilters(const ChannelID &id) :
00217 LineEditSetting(this), ChannelDBStorage(this, id, "outputfilters")
00218 {
00219 setLabel(QObject::tr("Playback filters"));
00220 setHelpText(QObject::tr("Filters to be used when recordings "
00221 "from this channel are viewed. "
00222 "Start with a plus to append to the "
00223 "global playback filters."));
00224 }
00225 };
00226
00227
00228 class XmltvID : public LineEditSetting, public ChannelDBStorage
00229 {
00230 public:
00231 XmltvID(const ChannelID &id) :
00232 LineEditSetting(this), ChannelDBStorage(this, id, "xmltvid")
00233 {
00234 setLabel(QObject::tr("XMLTV ID"));
00235 setHelpText(QObject::tr(
00236 "ID used by listing services to get an exact "
00237 "correspondance between a channel in your line-up "
00238 "and a channel in their database. Normally this is "
00239 "set automatically when 'mythfilldatabase' is run."));
00240 }
00241 };
00242
00243 class CommMethod : public ComboBoxSetting, public ChannelDBStorage
00244 {
00245 public:
00246 CommMethod(const ChannelID &id) :
00247 ComboBoxSetting(this), ChannelDBStorage(this, id, "commmethod")
00248 {
00249 setLabel(QObject::tr("Commercial Flagging Method"));
00250 setHelpText(QObject::tr("Changes the method of "
00251 "commercial detection used for recordings on this channel or "
00252 "skips detection by marking the channel as Commercial Free."));
00253 addSelection(QObject::tr("Use Global Setting"), "-1");
00254
00255
00256 addSelection(QObject::tr("All Available Methods"), "255");
00257 addSelection(QObject::tr("Blank Frame Detection"), "1");
00258 addSelection(QObject::tr("Blank Frame + Scene Change"), "3");
00259 addSelection(QObject::tr("Scene Change Detection"), "2");
00260 addSelection(QObject::tr("Logo Detection"), "4");
00261 addSelection(QObject::tr("Experimental"), "511");
00262 addSelection(QObject::tr("Commercial Free"), "-2");
00263
00264 }
00265 };
00266
00267 class Visible : public CheckBoxSetting, public ChannelDBStorage
00268 {
00269 public:
00270 Visible(const ChannelID &id) :
00271 CheckBoxSetting(this), ChannelDBStorage(this, id, "visible")
00272 {
00273 setValue(true);
00274 setLabel(QObject::tr("Visible"));
00275 setHelpText(QObject::tr("If set, the channel will be visible in the "
00276 "EPG."));
00277 }
00278 };
00279
00280 class OnAirGuide : public CheckBoxSetting, public ChannelDBStorage
00281 {
00282 public:
00283 OnAirGuide(const ChannelID &id) :
00284 CheckBoxSetting(this), ChannelDBStorage(this, id, "useonairguide")
00285 {
00286 setLabel(QObject::tr("Use on air guide"));
00287 setHelpText(QObject::tr("If set the guide information will be taken "
00288 "from the On Air Channel guide."));
00289 }
00290 };
00291
00292
00293
00294
00295
00296 class Freqid : public LineEditSetting, public ChannelDBStorage
00297 {
00298 public:
00299 Freqid(const ChannelID &id) :
00300 LineEditSetting(this), ChannelDBStorage(this, id, "freqid")
00301 {
00302 setLabel(QObject::tr("Frequency")+" "+QObject::tr("or")+" "+
00303 QObject::tr("Channel"));
00304 setHelpText(QObject::tr(
00305 "Specify either the exact frequency in kHz or "
00306 "a valid channel for your 'TV Format'."));
00307 }
00308 };
00309
00310 class Finetune : public SliderSetting, public ChannelDBStorage
00311 {
00312 public:
00313 Finetune(const ChannelID& id)
00314 : SliderSetting(this, -300, 300, 1),
00315 ChannelDBStorage(this, id, "finetune")
00316 {
00317 setLabel(QObject::tr("Finetune")+" (kHz)");
00318 setHelpText(QObject::tr("Value to be added to your desired frequency "
00319 "in kHz, for 'fine tuning'."));
00320 }
00321 };
00322
00323 class Contrast : public SliderSetting, public ChannelDBStorage
00324 {
00325 public:
00326 Contrast(const ChannelID &id) :
00327 SliderSetting(this, 0, 65535, 655),
00328 ChannelDBStorage(this, id, "contrast")
00329 {
00330 setLabel(QObject::tr("Contrast"));
00331 }
00332 };
00333
00334 class Brightness : public SliderSetting, public ChannelDBStorage
00335 {
00336 public:
00337 Brightness(const ChannelID &id) :
00338 SliderSetting(this, 0, 65535, 655),
00339 ChannelDBStorage(this, id, "brightness")
00340 {
00341 setLabel(QObject::tr("Brightness"));
00342 }
00343 };
00344
00345 class Colour : public SliderSetting, public ChannelDBStorage
00346 {
00347 public:
00348 Colour(const ChannelID &id) :
00349 SliderSetting(this, 0, 65535, 655),
00350 ChannelDBStorage(this, id, "colour")
00351 {
00352 setLabel(QObject::tr("Color"));
00353 }
00354 };
00355
00356 class Hue : public SliderSetting, public ChannelDBStorage
00357 {
00358 public:
00359 Hue(const ChannelID &id) :
00360 SliderSetting(this, 0, 65535, 655), ChannelDBStorage(this, id, "hue")
00361 {
00362 setLabel(QObject::tr("Hue"));
00363 }
00364 };
00365
00366 ChannelOptionsCommon::ChannelOptionsCommon(const ChannelID &id,
00367 uint default_sourceid) :
00368 VerticalConfigurationGroup(false, true, false, false)
00369 {
00370 setLabel(QObject::tr("Channel Options - Common"));
00371 setUseLabel(false);
00372
00373 addChild(new Name(id));
00374
00375 Source *source = new Source(id, default_sourceid);
00376
00377 HorizontalConfigurationGroup *group1 =
00378 new HorizontalConfigurationGroup(false,false,true,true);
00379 HorizontalConfigurationGroup *bottomhoz =
00380 new HorizontalConfigurationGroup(false, true);
00381 VerticalConfigurationGroup *left =
00382 new VerticalConfigurationGroup(false, true);
00383 VerticalConfigurationGroup *right =
00384 new VerticalConfigurationGroup(false, true);
00385
00386
00387 left->addChild(new Channum(id));
00388 left->addChild(new Callsign(id));
00389 left->addChild(new Visible(id));
00390
00391 right->addChild(source);
00392 right->addChild(new ChannelTVFormat(id));
00393 right->addChild(new Priority(id));
00394
00395 group1->addChild(left);
00396 group1->addChild(right);
00397
00398 bottomhoz->addChild(onairguide = new OnAirGuide(id));
00399 bottomhoz->addChild(xmltvID = new XmltvID(id));
00400 bottomhoz->addChild(new TimeOffset(id));
00401
00402 addChild(group1);
00403 addChild(new CommMethod(id));
00404 addChild(new Icon(id));
00405 addChild(bottomhoz);
00406
00407 connect(onairguide, SIGNAL(valueChanged( bool)),
00408 this, SLOT( onAirGuideChanged(bool)));
00409 connect(source, SIGNAL(valueChanged( const QString&)),
00410 this, SLOT( sourceChanged(const QString&)));
00411 };
00412
00413 void ChannelOptionsCommon::load()
00414 {
00415 VerticalConfigurationGroup::load();
00416 }
00417
00418 void ChannelOptionsCommon::onAirGuideChanged(bool fValue)
00419 {
00420 (void)fValue;
00421 }
00422
00423 void ChannelOptionsCommon::sourceChanged(const QString& sourceid)
00424 {
00425 bool supports_eit = true;
00426 bool uses_eit_only = false;
00427
00428 MSqlQuery query(MSqlQuery::InitCon());
00429 query.prepare("SELECT cardtype "
00430 "FROM capturecard, videosource, cardinput "
00431 "WHERE cardinput.sourceid = videosource.sourceid AND "
00432 " cardinput.cardid = capturecard.cardid AND "
00433 " videosource.sourceid = :SOURCEID");
00434 query.bindValue(":SOURCEID", sourceid);
00435
00436 if (!query.exec() || !query.isActive())
00437 MythContext::DBError("sourceChanged -- supports eit", query);
00438 else
00439 {
00440 supports_eit = (query.size()) ? false : true;
00441 while (query.next())
00442 {
00443 supports_eit |= CardUtil::IsEITCapable(
00444 query.value(0).toString().upper());
00445 }
00446
00447 query.prepare("SELECT xmltvgrabber "
00448 "FROM videosource "
00449 "WHERE sourceid = :SOURCEID");
00450 query.bindValue(":SOURCEID", sourceid);
00451
00452 if (!query.exec() || !query.isActive())
00453 MythContext::DBError("sourceChanged -- eit only", query);
00454 else
00455 {
00456 uses_eit_only = (query.size()) ? true : false;
00457 while (query.next())
00458 {
00459 uses_eit_only &= (query.value(0).toString() == "eitonly");
00460 }
00461 }
00462 }
00463
00464 onairguide->setEnabled(supports_eit);
00465 xmltvID->setEnabled(!uses_eit_only);
00466 }
00467
00468 ChannelOptionsFilters::ChannelOptionsFilters(const ChannelID& id) :
00469 VerticalConfigurationGroup(false, true, false, false)
00470 {
00471 setLabel(QObject::tr("Channel Options - Filters"));
00472 setUseLabel(false);
00473
00474 addChild(new VideoFilters(id));
00475 addChild(new OutputFilters(id));
00476 }
00477
00478 ChannelOptionsV4L::ChannelOptionsV4L(const ChannelID& id) :
00479 VerticalConfigurationGroup(false, true, false, false)
00480 {
00481 setLabel(QObject::tr("Channel Options - Video 4 Linux"));
00482 setUseLabel(false);
00483
00484 addChild(new Freqid(id));
00485 addChild(new Finetune(id));
00486 addChild(new Contrast(id));
00487 addChild(new Brightness(id));
00488 addChild(new Colour(id));
00489 addChild(new Hue(id));
00490 };
00491
00492