ChannelGroupConfig::ChannelGroupConfig(QString _name) : name(_name) { VerticalConfigurationGroup *cgroup; HorizontalConfigurationGroup *columns; DBChanList chanlist = ChannelUtil::GetChannels(0, true, "channum, callsign"); ChannelUtil::SortChannels(chanlist, "channum", true); DBChanList::iterator it = chanlist.begin(); int i,j = 0; int p = 1; int pages = (int)((float)chanlist.size() / 8.0 / 3.0 + 0.5); do { columns = new HorizontalConfigurationGroup(false,false,false,false); columns->setLabel(getName() + " " + QObject::tr("Channel Group - Page ") + QString("%1").arg(p) + QObject::tr("of") + QString("%1").arg(pages)); for (j = 0; ((j < 3) && (it < chanlist.end())); ++j) { cgroup = new VerticalConfigurationGroup(false,false,false,false); for (i = 0; ((i < 8) && (it < chanlist.end())); ++i) { cgroup->addChild(new ChannelCheckBox(*this, it->chanid, it->channum, it->name, _name)); ++it; } columns->addChild(cgroup); } ++p; addChild(columns); } while (it < chanlist.end()); }
bool ChannelBase::Init(QString &inputname, QString &startchannel, bool setchan) { bool ok; if (!setchan) ok = inputname.isEmpty() ? false : IsTunable(inputname, startchannel); else if (inputname.isEmpty()) ok = SetChannelByString(startchannel); else ok = SwitchToInput(inputname, startchannel); if (ok) return true; // try to find a valid channel if given start channel fails. QString msg1 = QString("Setting start channel '%1' failed, ") .arg(startchannel); QString msg2 = "and we failed to find any suitible channels on any input."; bool msg_error = true; QStringList inputs = GetConnectedInputs(); // Note we use qFind rather than std::find() for ulibc compat (#4507) QStringList::const_iterator start = qFind(inputs.begin(), inputs.end(), inputname); start = (start == inputs.end()) ? inputs.begin() : start; if (start != inputs.end()) { LOG(VB_CHANNEL, LOG_INFO, LOC + QString("Looking for startchannel '%1' on input '%2'") .arg(startchannel).arg(*start)); } // Attempt to find an input for the requested startchannel QStringList::const_iterator it = start; while (it != inputs.end()) { DBChanList channels = GetChannels(*it); DBChanList::const_iterator cit = channels.begin(); for (; cit != channels.end(); ++cit) { if ((*cit).channum == startchannel && IsTunable(*it, startchannel)) { inputname = *it; LOG(VB_CHANNEL, LOG_INFO, LOC + QString("Found startchannel '%1' on input '%2'") .arg(startchannel).arg(inputname)); return true; } } ++it; it = (it == inputs.end()) ? inputs.begin() : it; if (it == start) break; } it = start; while (it != inputs.end() && !ok) { uint mplexid_restriction = 0; DBChanList channels = GetChannels(*it); if (channels.size() && IsInputAvailable(GetInputByName(*it), mplexid_restriction)) { uint chanid = ChannelUtil::GetNextChannel( channels, channels[0].chanid, mplexid_restriction, CHANNEL_DIRECTION_UP); DBChanList::const_iterator cit = find(channels.begin(), channels.end(), chanid); if (chanid && cit != channels.end()) { if (!setchan) { ok = IsTunable(*it, (mplexid_restriction) ? (*cit).channum : startchannel); } else ok = SwitchToInput(*it, (*cit).channum); if (ok) { inputname = *it; if (mplexid_restriction) { startchannel = (*cit).channum; startchannel.detach(); } msg2 = QString("selected to '%1' on input '%2' instead.") .arg(startchannel).arg(inputname); msg_error = false; } } } ++it; it = (it == inputs.end()) ? inputs.begin() : it; if (it == start) break; } LOG(VB_GENERAL, ((msg_error) ? LOG_ERR : LOG_WARNING), LOC + msg1 + "\n\t\t\t" + msg2); return ok; }
bool ManualSchedule::Create(void) { if (!LoadWindowFromXML("schedule-ui.xml", "manualschedule", this)) return false; m_channelList = dynamic_cast<MythUIButtonList *>(GetChild("channel")); m_startdateList = dynamic_cast<MythUIButtonList *>(GetChild("startdate")); m_starthourSpin = dynamic_cast<MythUISpinBox *>(GetChild("starthour")); m_startminuteSpin = dynamic_cast<MythUISpinBox *>(GetChild("startminute")); m_durationSpin = dynamic_cast<MythUISpinBox *>(GetChild("duration")); m_titleEdit = dynamic_cast<MythUITextEdit *>(GetChild("title")); m_recordButton = dynamic_cast<MythUIButton *>(GetChild("next")); m_cancelButton = dynamic_cast<MythUIButton *>(GetChild("cancel")); if (!m_channelList || !m_startdateList || !m_starthourSpin || !m_startminuteSpin || !m_durationSpin || !m_titleEdit || !m_recordButton || !m_cancelButton) { LOG(VB_GENERAL, LOG_ERR, "ManualSchedule, theme is missing required elements"); return false; } QString chanorder = gCoreContext->GetSetting("ChannelOrdering", "channum"); DBChanList channels = ChannelUtil::GetChannels(0, false, "channum,callsign"); ChannelUtil::SortChannels(channels, chanorder); for (uint i = 0; i < channels.size(); i++) { QString chantext = channels[i].GetFormatted(DBChannel::kChannelLong); MythUIButtonListItem *item = new MythUIButtonListItem(m_channelList, chantext); InfoMap infomap; channels[i].ToMap(infomap); item->SetTextFromMap(infomap); m_chanids.push_back(channels[i].chanid); } for (uint index = 0; index <= 60; index++) { QString dinfo = MythDate::toString( m_nowDateTime.addDays(index), MythDate::kDateFull | MythDate::kSimplify); if (m_nowDateTime.addDays(index).toLocalTime().date().dayOfWeek() < 6) dinfo += QString(" (%1)").arg(tr("5 weekdays if daily")); else dinfo += QString(" (%1)").arg(tr("7 days per week if daily")); new MythUIButtonListItem(m_startdateList, dinfo); if (m_nowDateTime.addDays(index).toLocalTime().toString("MMdd") == m_startDateTime.toLocalTime().toString("MMdd")) m_startdateList->SetItemCurrent(m_startdateList->GetCount() - 1); } QTime thisTime = m_nowDateTime.toLocalTime().time(); thisTime = thisTime.addSecs((30 - (thisTime.minute() % 30)) * 60); if (thisTime < QTime(0,30)) m_startdateList->SetItemCurrent(m_startdateList->GetCurrentPos() + 1); m_starthourSpin->SetRange(0,23,1); m_starthourSpin->SetValue(thisTime.hour()); int minute_increment = gCoreContext->GetNumSetting("ManualScheduleMinuteIncrement", 5); m_startminuteSpin->SetRange(0, 60-minute_increment, minute_increment); m_startminuteSpin->SetValue((thisTime.minute()/5)*5); m_durationSpin->SetRange(5,360,5); m_durationSpin->SetValue(60); connectSignals(); connect(m_recordButton, SIGNAL(Clicked()), SLOT(recordClicked())); connect(m_cancelButton, SIGNAL(Clicked()), SLOT(Close())); m_titleEdit->SetMaxLength(128); BuildFocusList(); return true; }
void ProgLister::FillViewList(const QString &view) { m_viewList.clear(); m_viewTextList.clear(); if (m_type == plChannel) // list by channel { DBChanList channels = ChannelUtil::GetChannels( 0, true, "channum, chanid"); ChannelUtil::SortChannels(channels, m_channelOrdering, true); for (uint i = 0; i < channels.size(); ++i) { QString chantext = channels[i].GetFormatted(DBChannel::kChannelShort); m_viewList.push_back(QString::number(channels[i].chanid)); m_viewTextList.push_back(chantext); } if (!view.isEmpty()) m_curView = m_viewList.indexOf(view); } else if (m_type == plCategory) // list by category { QString startstr = m_startTime.toString("yyyy-MM-dd hh:mm:50"); MSqlQuery query(MSqlQuery::InitCon()); query.prepare("SELECT g1.genre, g2.genre " "FROM program " "JOIN programgenres g1 ON " " program.chanid = g1.chanid AND " " program.starttime = g1.starttime " "LEFT JOIN programgenres g2 ON " " g1.chanid = g2.chanid AND " " g1.starttime = g2.starttime " "WHERE program.endtime > :PGILSTART " "GROUP BY g1.genre, g2.genre;"); query.bindValue(":PGILSTART", startstr); m_useGenres = false; if (query.exec()) { QString lastGenre1; while (query.next()) { m_useGenres = true; QString genre1 = query.value(0).toString(); if (genre1.isEmpty()) continue; if (genre1 != lastGenre1) { m_viewList.push_back(genre1); m_viewTextList.push_back(genre1); lastGenre1 = genre1; } QString genre2 = query.value(1).toString(); if (genre2.isEmpty() || genre2 == genre1) continue; m_viewList.push_back(genre1 + ":/:" + genre2); m_viewTextList.push_back(" " + genre1 + " / " + genre2); } } if (!m_useGenres) { query.prepare("SELECT category " "FROM program " "WHERE program.endtime > :PGILSTART " "GROUP BY category"); query.bindValue(":PGILSTART", startstr); if (query.exec()) { while (query.next()) { QString category = query.value(0).toString(); if (category.isEmpty()) continue; category = query.value(0).toString(); m_viewList.push_back(category); m_viewTextList.push_back(category); } } } if (!view.isEmpty()) m_curView = m_viewList.indexOf(view); } else if (m_type == plTitleSearch || m_type == plKeywordSearch || m_type == plPeopleSearch || m_type == plPowerSearch) { MSqlQuery query(MSqlQuery::InitCon()); query.prepare("SELECT phrase FROM keyword " "WHERE searchtype = :SEARCHTYPE;"); query.bindValue(":SEARCHTYPE", m_searchType); if (query.exec()) { while (query.next()) { /* The keyword.phrase column uses utf8_bin collation, so * Qt uses QString::fromAscii() for toString(). Explicitly * convert the value using QString::fromUtf8() to prevent * corruption. */ QString phrase = QString::fromUtf8(query.value(0) .toByteArray().constData()); if (phrase.isEmpty()) continue; m_viewList.push_back(phrase); m_viewTextList.push_back(phrase); } } if (!view.isEmpty()) { m_curView = m_viewList.indexOf(view); if (m_curView < 0) { QString qphrase = view; MSqlQuery query(MSqlQuery::InitCon()); query.prepare("REPLACE INTO keyword (phrase, searchtype)" "VALUES(:VIEW, :SEARCHTYPE );"); query.bindValue(":VIEW", qphrase); query.bindValue(":SEARCHTYPE", m_searchType); if (!query.exec()) MythDB::DBError("ProgLister::FillViewList -- " "replace keyword", query); m_viewList.push_back(qphrase); m_viewTextList.push_back(qphrase); m_curView = m_viewList.size() - 1; } } else { m_curView = -1; } } else if (m_type == plTitle) { if (!view.isEmpty()) { m_viewList.push_back(view); m_viewTextList.push_back(view); m_curView = 0; } else { m_curView = -1; } } else if (m_type == plNewListings) { m_viewList.push_back("all"); m_viewTextList.push_back(tr("All")); m_viewList.push_back("premieres"); m_viewTextList.push_back(tr("Premieres")); m_viewList.push_back("movies"); m_viewTextList.push_back(tr("Movies")); m_viewList.push_back("series"); m_viewTextList.push_back(tr("Series")); m_viewList.push_back("specials"); m_viewTextList.push_back(tr("Specials")); if (!view.isEmpty()) m_curView = m_viewList.indexOf(view); } else if (m_type == plMovies) { m_viewList.push_back(">= 0.0"); m_viewTextList.push_back(tr("All")); m_viewList.push_back("= 0.0"); m_viewTextList.push_back(tr("Unrated")); m_viewList.push_back(QString("= 10.0")); m_viewTextList.push_back(tr("%n star(s)", "", 10)); for (int i = 9; i > 0; i--) { float stars = i / 10.0; m_viewList.push_back(QString(">= %1").arg(stars)); m_viewTextList.push_back(tr("%n star(s) and above", "", i)); } if (!view.isEmpty()) m_curView = m_viewList.indexOf(view); } else if (m_type == plTime) { m_curView = 0; m_viewList.push_back(MythDateTimeToString(m_searchTime, kDateTimeFull | kSimplify)); m_viewTextList.push_back(m_viewList[m_curView]); } else if (m_type == plSQLSearch) { m_curView = 0; m_viewList.push_back(view); m_viewTextList.push_back(tr("Power Recording Rule")); } else if (m_type == plRecordid) { m_curView = 0; MSqlQuery query(MSqlQuery::InitCon()); query.prepare("SELECT title FROM record " "WHERE recordid = :RECORDID"); query.bindValue(":RECORDID", view); if (query.exec() && query.next()) { QString title = query.value(0).toString(); title = query.value(0).toString(); m_viewList.push_back(view); m_viewTextList.push_back(title); } } else if (m_type == plStoredSearch) // stored searches { MSqlQuery query(MSqlQuery::InitCon()); query.prepare("SELECT rulename FROM customexample " "WHERE search > 0 ORDER BY rulename;"); if (query.exec()) { while (query.next()) { QString rulename = query.value(0).toString(); if (rulename.isEmpty() || rulename.trimmed().isEmpty()) continue; rulename = query.value(0).toString(); m_viewList.push_back(rulename); m_viewTextList.push_back(rulename); } } if (!view.isEmpty()) m_curView = m_viewList.indexOf(view); } else if (m_type == plPreviouslyRecorded) // previously recorded { m_viewList.push_back("sort by time"); m_viewTextList.push_back(tr("Time")); m_viewList.push_back("reverse time"); m_viewTextList.push_back(tr("Reverse Time")); m_viewList.push_back("sort by title"); m_viewTextList.push_back(tr("Title")); m_viewList.push_back("reverse title"); m_viewTextList.push_back(tr("Reverse Title")); if (!view.isEmpty()) m_curView = m_viewList.indexOf(view); } if (m_curView >= (int)m_viewList.size()) m_curView = m_viewList.size() - 1; }