00001 #include <set>
00002
00003 #include "mythcontext.h"
00004
00005 #include "mythuibuttonlist.h"
00006 #include "mythuibutton.h"
00007 #include "mythuitext.h"
00008 #include "mythuitextedit.h"
00009 #include "globals.h"
00010 #include "dbaccess.h"
00011 #include "videometadatalistmanager.h"
00012 #include "videoutils.h"
00013
00014 #include "videolist.h"
00015 #include "videofilter.h"
00016
00017 enum GenreFilter {
00018 kGenreFilterAll = -1,
00019 kGenreFilterUnknown = 0
00020 };
00021
00022 enum CountryFilter {
00023 kCountryFilterAll = -1,
00024 kCountryFilterUnknown = 0
00025 };
00026
00027 enum CastFilter {
00028 kCastFilterAll = -1,
00029 kCastFilterUnknown = 0
00030 };
00031
00032 enum CategoryFilter {
00033 kCategoryFilterAll = -1,
00034 kCategoryFilterUnknown = 0
00035 };
00036
00037 enum YearFilter {
00038 kYearFilterAll = -1,
00039 kYearFilterUnknown = 0
00040 };
00041
00042 enum RuntimeFilter {
00043 kRuntimeFilterAll = -2,
00044 kRuntimeFilterUnknown = -1
00045 };
00046
00047 enum UserRatingFilter {
00048 kUserRatingFilterAll = -1
00049 };
00050
00051 enum BrowseFilter {
00052 kBrowseFilterAll = -1
00053 };
00054
00055 enum WatchedFilter {
00056 kWatchedFilterAll = -1
00057 };
00058
00059 enum InetRefFilter {
00060 kInetRefFilterAll = -1,
00061 kInetRefFilterUnknown = 0
00062 };
00063
00064 enum CoverFileFilter {
00065 kCoverFileFilterAll = -1,
00066 kCoverFileFilterNone = 0
00067 };
00068
00069 VideoFilterSettings::VideoFilterSettings(bool loaddefaultsettings,
00070 const QString& _prefix) :
00071 category(kCategoryFilterAll), genre(kGenreFilterAll),
00072 country(kCountryFilterAll), cast(kCastFilterAll),
00073 year(kYearFilterAll), runtime(kRuntimeFilterAll),
00074 userrating(kUserRatingFilterAll), browse(kBrowseFilterAll),
00075 watched(kWatchedFilterAll), m_inetref(kInetRefFilterAll),
00076 m_coverfile(kCoverFileFilterAll), orderby(kOrderByTitle),
00077 m_parental_level(ParentalLevel::plNone), textfilter(""),
00078 season(-1), episode(-1), insertdate(QDate()),
00079 re_season("(\\d+)[xX](\\d*)"), re_date("-(\\d+)([dmw])"),
00080 m_changed_state(0)
00081 {
00082 if (_prefix.isEmpty())
00083 prefix = "VideoDefault";
00084 else
00085 prefix = _prefix + "Default";
00086
00087
00088 if (loaddefaultsettings)
00089 {
00090 category = gCoreContext->GetNumSetting(QString("%1Category").arg(prefix),
00091 kCategoryFilterAll);
00092 genre = gCoreContext->GetNumSetting(QString("%1Genre").arg(prefix),
00093 kGenreFilterAll);
00094 country = gCoreContext->GetNumSetting(QString("%1Country").arg(prefix),
00095 kCountryFilterAll);
00096 cast = gCoreContext->GetNumSetting(QString("%1Cast").arg(prefix),
00097 kCastFilterAll);
00098 year = gCoreContext->GetNumSetting(QString("%1Year").arg(prefix),
00099 kYearFilterAll);
00100 runtime = gCoreContext->GetNumSetting(QString("%1Runtime").arg(prefix),
00101 kRuntimeFilterAll);
00102 userrating =
00103 gCoreContext->GetNumSetting(QString("%1Userrating").arg(prefix),
00104 kUserRatingFilterAll);
00105 browse = gCoreContext->GetNumSetting(QString("%1Browse").arg(prefix),
00106 kBrowseFilterAll);
00107 watched = gCoreContext->GetNumSetting(QString("%1Watched").arg(prefix),
00108 kWatchedFilterAll);
00109 m_inetref = gCoreContext->GetNumSetting(QString("%1InetRef").arg(prefix),
00110 kInetRefFilterAll);
00111 m_coverfile = gCoreContext->GetNumSetting(QString("%1CoverFile")
00112 .arg(prefix), kCoverFileFilterAll);
00113 orderby = (ordering)gCoreContext->GetNumSetting(QString("%1Orderby")
00114 .arg(prefix),
00115 kOrderByTitle);
00116 }
00117 }
00118
00119 VideoFilterSettings::VideoFilterSettings(const VideoFilterSettings &rhs) :
00120 m_changed_state(0)
00121 {
00122 *this = rhs;
00123 }
00124
00125 VideoFilterSettings &
00126 VideoFilterSettings::operator=(const VideoFilterSettings &rhs)
00127 {
00128 prefix = rhs.prefix;
00129
00130 if (category != rhs.category)
00131 {
00132 m_changed_state |= kFilterCategoryChanged;
00133 category = rhs.category;
00134 }
00135
00136 if (genre != rhs.genre)
00137 {
00138 m_changed_state |= kFilterGenreChanged;
00139 genre = rhs.genre;
00140 }
00141
00142 if (country != rhs.country)
00143 {
00144 m_changed_state |= kFilterCountryChanged;
00145 country = rhs.country;
00146 }
00147
00148 if (cast != rhs.cast)
00149 {
00150 m_changed_state |= kFilterCastChanged;
00151 cast = rhs.cast;
00152 }
00153
00154 if (year != rhs.year)
00155 {
00156 m_changed_state |= kFilterYearChanged;
00157 year = rhs.year;
00158 }
00159
00160 if (runtime != rhs.runtime)
00161 {
00162 m_changed_state |= kFilterRuntimeChanged;
00163 runtime = rhs.runtime;
00164 }
00165
00166 if (userrating != rhs.userrating)
00167 {
00168 m_changed_state |= kFilterUserRatingChanged;
00169 userrating = rhs.userrating;
00170 }
00171
00172 if (browse != rhs.browse)
00173 {
00174 m_changed_state |= kFilterBrowseChanged;
00175 browse = rhs.browse;
00176 }
00177
00178 if (watched != rhs.watched)
00179 {
00180 m_changed_state |= kFilterWatchedChanged;
00181 watched = rhs.watched;
00182 }
00183
00184 if (m_inetref != rhs.m_inetref)
00185 {
00186 m_changed_state |= kFilterInetRefChanged;
00187 m_inetref = rhs.m_inetref;
00188 }
00189
00190 if (m_coverfile != rhs.m_coverfile)
00191 {
00192 m_changed_state |= kFilterCoverFileChanged;
00193 m_coverfile = rhs.m_coverfile;
00194 }
00195
00196 if (orderby != rhs.orderby)
00197 {
00198 m_changed_state |= kSortOrderChanged;
00199 orderby = rhs.orderby;
00200 }
00201
00202 if (m_parental_level != rhs.m_parental_level)
00203 {
00204 m_changed_state |= kFilterParentalLevelChanged;
00205 m_parental_level = rhs.m_parental_level;
00206 }
00207
00208 if (textfilter != rhs.textfilter)
00209 {
00210 textfilter = rhs.textfilter;
00211 m_changed_state |= kFilterTextFilterChanged;
00212 }
00213 if (season != rhs.season || episode != rhs.episode)
00214 {
00215 season = rhs.season;
00216 episode = rhs.episode;
00217 m_changed_state |= kFilterTextFilterChanged;
00218 }
00219 if (insertdate != rhs.insertdate)
00220 {
00221 insertdate = rhs.insertdate;
00222 m_changed_state |= kFilterTextFilterChanged;
00223 }
00224
00225 return *this;
00226 }
00227
00228 void VideoFilterSettings::saveAsDefault()
00229 {
00230 gCoreContext->SaveSetting(QString("%1Category").arg(prefix), category);
00231 gCoreContext->SaveSetting(QString("%1Genre").arg(prefix), genre);
00232 gCoreContext->SaveSetting(QString("%1Cast").arg(prefix), cast);
00233 gCoreContext->SaveSetting(QString("%1Country").arg(prefix), country);
00234 gCoreContext->SaveSetting(QString("%1Year").arg(prefix), year);
00235 gCoreContext->SaveSetting(QString("%1Runtime").arg(prefix), runtime);
00236 gCoreContext->SaveSetting(QString("%1Userrating").arg(prefix), userrating);
00237 gCoreContext->SaveSetting(QString("%1Browse").arg(prefix), browse);
00238 gCoreContext->SaveSetting(QString("%1Watched").arg(prefix), watched);
00239 gCoreContext->SaveSetting(QString("%1InetRef").arg(prefix), m_inetref);
00240 gCoreContext->SaveSetting(QString("%1CoverFile").arg(prefix), m_coverfile);
00241 gCoreContext->SaveSetting(QString("%1Orderby").arg(prefix), orderby);
00242 gCoreContext->SaveSetting(QString("%1Filter").arg(prefix), textfilter);
00243 }
00244
00245 bool VideoFilterSettings::matches_filter(const VideoMetadata &mdata) const
00246 {
00247 bool matches = true;
00248
00249
00250 if (!textfilter.isEmpty())
00251 {
00252 matches = false;
00253 matches = (matches ||
00254 mdata.GetTitle().contains(textfilter, Qt::CaseInsensitive));
00255 matches = (matches ||
00256 mdata.GetSubtitle().contains(textfilter, Qt::CaseInsensitive));
00257 matches = (matches ||
00258 mdata.GetPlot().contains(textfilter, Qt::CaseInsensitive));
00259 }
00260
00261 if (matches && (season != -1))
00262 {
00263 matches = (season == mdata.GetSeason());
00264 matches = (matches && (episode == -1 || episode == mdata.GetEpisode()));
00265 }
00266 if (matches && insertdate.isValid())
00267 {
00268 matches = (mdata.GetInsertdate().isValid() &&
00269 mdata.GetInsertdate() >= insertdate);
00270 }
00271 if (matches && (genre != kGenreFilterAll))
00272 {
00273 matches = false;
00274
00275 const VideoMetadata::genre_list &gl = mdata.GetGenres();
00276 for (VideoMetadata::genre_list::const_iterator p = gl.begin();
00277 p != gl.end(); ++p)
00278 {
00279 if ((matches = (p->first == genre)))
00280 {
00281 break;
00282 }
00283 }
00284 }
00285
00286 if (matches && country != kCountryFilterAll)
00287 {
00288 matches = false;
00289
00290 const VideoMetadata::country_list &cl = mdata.GetCountries();
00291 for (VideoMetadata::country_list::const_iterator p = cl.begin();
00292 p != cl.end(); ++p)
00293 {
00294 if ((matches = (p->first == country)))
00295 {
00296 break;
00297 }
00298 }
00299 }
00300
00301 if (matches && cast != kCastFilterAll)
00302 {
00303 const VideoMetadata::cast_list &cl = mdata.GetCast();
00304
00305 if ((cast == kCastFilterUnknown) && (cl.size() == 0))
00306 {
00307 matches = true;
00308 }
00309 else
00310 {
00311 matches = false;
00312
00313 for (VideoMetadata::cast_list::const_iterator p = cl.begin();
00314 p != cl.end(); ++p)
00315 {
00316 if ((matches = (p->first == cast)))
00317 {
00318 break;
00319 }
00320 }
00321 }
00322 }
00323
00324 if (matches && category != kCategoryFilterAll)
00325 {
00326 matches = (category == mdata.GetCategoryID());
00327 }
00328
00329 if (matches && year != kYearFilterAll)
00330 {
00331 if (year == kYearFilterUnknown)
00332 {
00333 matches = ((mdata.GetYear() == 0) ||
00334 (mdata.GetYear() == VIDEO_YEAR_DEFAULT));
00335 }
00336 else
00337 {
00338 matches = (year == mdata.GetYear());
00339 }
00340 }
00341
00342 if (matches && runtime != kRuntimeFilterAll)
00343 {
00344 if (runtime == kRuntimeFilterUnknown)
00345 {
00346 matches = (mdata.GetLength() == 0);
00347 }
00348 else
00349 {
00350 matches = (runtime == (mdata.GetLength() / 30));
00351 }
00352 }
00353
00354 if (matches && userrating != kUserRatingFilterAll)
00355 {
00356 matches = (mdata.GetUserRating() >= userrating);
00357 }
00358
00359 if (matches && browse != kBrowseFilterAll)
00360 {
00361 matches = (mdata.GetBrowse() == browse);
00362 }
00363
00364 if (matches && watched != kWatchedFilterAll)
00365 {
00366 matches = (mdata.GetWatched() == watched);
00367 }
00368
00369 if (matches && m_inetref != kInetRefFilterAll)
00370 {
00371 matches = (mdata.GetInetRef() == VIDEO_INETREF_DEFAULT);
00372 }
00373
00374 if (matches && m_coverfile != kCoverFileFilterAll)
00375 {
00376 matches = (IsDefaultCoverFile(mdata.GetCoverFile()));
00377 }
00378
00379 if (matches && m_parental_level)
00380 {
00381 matches = ((mdata.GetShowLevel() != ParentalLevel::plNone) &&
00382 (mdata.GetShowLevel() <= m_parental_level));
00383 }
00384
00385 return matches;
00386 }
00387
00389 bool VideoFilterSettings::meta_less_than(const VideoMetadata &lhs,
00390 const VideoMetadata &rhs,
00391 bool sort_ignores_case) const
00392 {
00393 bool ret = false;
00394 switch (orderby)
00395 {
00396 case kOrderByTitle:
00397 {
00398 VideoMetadata::SortKey lhs_key;
00399 VideoMetadata::SortKey rhs_key;
00400 if (lhs.HasSortKey() && rhs.HasSortKey())
00401 {
00402 lhs_key = lhs.GetSortKey();
00403 rhs_key = rhs.GetSortKey();
00404 }
00405 else
00406 {
00407 lhs_key = VideoMetadata::GenerateDefaultSortKey(lhs,
00408 sort_ignores_case);
00409 rhs_key = VideoMetadata::GenerateDefaultSortKey(rhs,
00410 sort_ignores_case);
00411 }
00412 ret = lhs_key < rhs_key;
00413 break;
00414 }
00415 case kOrderBySeasonEp:
00416 {
00417 if ((lhs.GetSeason() == rhs.GetSeason())
00418 && (lhs.GetEpisode() == rhs.GetEpisode())
00419 && (lhs.GetSeason() == 0)
00420 && (rhs.GetSeason() == 0)
00421 && (lhs.GetEpisode() == 0)
00422 && (rhs.GetEpisode() == 0))
00423 {
00424 VideoMetadata::SortKey lhs_key;
00425 VideoMetadata::SortKey rhs_key;
00426 if (lhs.HasSortKey() && rhs.HasSortKey())
00427 {
00428 lhs_key = lhs.GetSortKey();
00429 rhs_key = rhs.GetSortKey();
00430 }
00431 else
00432 {
00433 lhs_key = VideoMetadata::GenerateDefaultSortKey(lhs,
00434 sort_ignores_case);
00435 rhs_key = VideoMetadata::GenerateDefaultSortKey(rhs,
00436 sort_ignores_case);
00437 }
00438 ret = lhs_key < rhs_key;
00439 }
00440 else if ((lhs.GetSeason() == rhs.GetSeason())
00441 && (lhs.GetTitle() == rhs.GetTitle()))
00442 ret = (lhs.GetEpisode() < rhs.GetEpisode());
00443 else
00444 ret = (lhs.GetSeason() < rhs.GetSeason());
00445 break;
00446 }
00447 case kOrderByYearDescending:
00448 {
00449 ret = (lhs.GetYear() > rhs.GetYear());
00450 break;
00451 }
00452 case kOrderByUserRatingDescending:
00453 {
00454 ret = (lhs.GetUserRating() > rhs.GetUserRating());
00455 break;
00456 }
00457 case kOrderByLength:
00458 {
00459 ret = (lhs.GetLength() < rhs.GetLength());
00460 break;
00461 }
00462 case kOrderByFilename:
00463 {
00464 QString lhsfn(sort_ignores_case ?
00465 lhs.GetFilename().toLower() : lhs.GetFilename());
00466 QString rhsfn(sort_ignores_case ?
00467 rhs.GetFilename().toLower() : rhs.GetFilename());
00468 ret = QString::localeAwareCompare(lhsfn, rhsfn) < 0;
00469 break;
00470 }
00471 case kOrderByID:
00472 {
00473 ret = (lhs.GetID() < rhs.GetID());
00474 break;
00475 }
00476 case kOrderByDateAddedDescending:
00477 {
00478 ret = (lhs.GetInsertdate() > rhs.GetInsertdate());
00479 break;
00480 }
00481 default:
00482 {
00483 LOG(VB_GENERAL, LOG_ERR, QString("Error: unknown sort type %1")
00484 .arg(orderby));
00485 }
00486 }
00487
00488 return ret;
00489 }
00490
00491 void VideoFilterSettings::setTextFilter(QString val)
00492 {
00493 m_changed_state |= kFilterTextFilterChanged;
00494 if (re_season.indexIn(val) != -1)
00495 {
00496 bool res;
00497 QStringList list = re_season.capturedTexts();
00498 season = list[1].toInt(&res);
00499 if (!res)
00500 season = -1;
00501 if (list.size() > 2) {
00502 episode = list[2].toInt(&res);
00503 if (!res)
00504 episode = -1;
00505 }
00506 else {
00507 episode = -1;
00508 }
00509
00510 textfilter = val;
00511 textfilter.replace(re_season, "");
00512 textfilter = textfilter.simplified ();
00513 }
00514 else
00515 {
00516 textfilter = val;
00517 season = -1;
00518 episode = -1;
00519 }
00520 if (re_date.indexIn(textfilter) != -1)
00521 {
00522 QStringList list = re_date.capturedTexts();
00523 int modnr = list[1].toInt();
00524 QDate testdate = QDate::currentDate();
00525 switch(list[2].at(0).toAscii())
00526 {
00527 case 'm': testdate = testdate.addMonths(-modnr);break;
00528 case 'd': testdate = testdate.addDays(-modnr);break;
00529 case 'w': testdate = testdate.addDays(-modnr * 7);break;
00530 }
00531 insertdate = testdate;
00532 textfilter.replace(re_date, "");
00533 textfilter = textfilter.simplified ();
00534 }
00535 else
00536 {
00537
00538 insertdate = QDate();
00539 }
00540 }
00541
00543
00545 VideoFilterDialog::VideoFilterDialog(MythScreenStack *lparent, QString lname,
00546 VideoList *video_list) : MythScreenType(lparent, lname),
00547 m_browseList(0), m_watchedList(0), m_orderbyList(0), m_yearList(0),
00548 m_userratingList(0), m_categoryList(0), m_countryList(0), m_genreList(0),
00549 m_castList(0), m_runtimeList(0), m_inetrefList(0), m_coverfileList(0),
00550 m_saveButton(0), m_doneButton(0), m_numvideosText(0), m_textfilter(0),
00551 m_videoList(*video_list)
00552 {
00553 m_fsp = new BasicFilterSettingsProxy<VideoList>(*video_list);
00554 m_settings = m_fsp->getSettings();
00555 }
00556
00557 VideoFilterDialog::~VideoFilterDialog()
00558 {
00559 delete m_fsp;
00560 }
00561
00562 bool VideoFilterDialog::Create()
00563 {
00564 if (!LoadWindowFromXML("video-ui.xml", "filter", this))
00565 return false;
00566
00567 bool err = false;
00568 UIUtilE::Assign(this, m_textfilter, "textfilter_input", &err);
00569 UIUtilE::Assign(this, m_yearList, "year_select", &err);
00570 UIUtilE::Assign(this, m_userratingList, "userrating_select", &err);
00571 UIUtilE::Assign(this, m_categoryList, "category_select", &err);
00572 UIUtilE::Assign(this, m_countryList, "country_select", &err);
00573 UIUtilE::Assign(this, m_genreList, "genre_select", &err);
00574 UIUtilE::Assign(this, m_castList, "cast_select", &err);
00575 UIUtilE::Assign(this, m_runtimeList, "runtime_select", &err);
00576 UIUtilE::Assign(this, m_browseList, "browse_select", &err);
00577 UIUtilE::Assign(this, m_watchedList, "watched_select", &err);
00578 UIUtilE::Assign(this, m_inetrefList, "inetref_select", &err);
00579 UIUtilE::Assign(this, m_coverfileList, "coverfile_select", &err);
00580 UIUtilE::Assign(this, m_orderbyList, "orderby_select", &err);
00581
00582 UIUtilE::Assign(this, m_doneButton, "done_button", &err);
00583 UIUtilE::Assign(this, m_saveButton, "save_button", &err);
00584
00585 UIUtilE::Assign(this, m_numvideosText, "numvideos_text", &err);
00586
00587 if (err)
00588 {
00589 LOG(VB_GENERAL, LOG_ERR, "Cannot load screen 'filter'");
00590 return false;
00591 }
00592
00593 BuildFocusList();
00594
00595 fillWidgets();
00596 update_numvideo();
00597
00598 connect(m_yearList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00599 SLOT(SetYear(MythUIButtonListItem*)));
00600 connect(m_userratingList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00601 SLOT(SetUserRating(MythUIButtonListItem*)));
00602 connect(m_categoryList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00603 SLOT(SetCategory(MythUIButtonListItem*)));
00604 connect(m_countryList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00605 SLOT(setCountry(MythUIButtonListItem*)));
00606 connect(m_genreList,SIGNAL(itemSelected(MythUIButtonListItem*)),
00607 SLOT(setGenre(MythUIButtonListItem*)));
00608 connect(m_castList,SIGNAL(itemSelected(MythUIButtonListItem*)),
00609 SLOT(SetCast(MythUIButtonListItem*)));
00610 connect(m_runtimeList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00611 SLOT(setRunTime(MythUIButtonListItem*)));
00612 connect(m_browseList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00613 SLOT(SetBrowse(MythUIButtonListItem*)));
00614 connect(m_watchedList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00615 SLOT(SetWatched(MythUIButtonListItem*)));
00616 connect(m_inetrefList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00617 SLOT(SetInetRef(MythUIButtonListItem*)));
00618 connect(m_coverfileList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00619 SLOT(SetCoverFile(MythUIButtonListItem*)));
00620 connect(m_orderbyList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00621 SLOT(setOrderby(MythUIButtonListItem*)));
00622 connect(m_textfilter, SIGNAL(valueChanged()),
00623 SLOT(setTextFilter()));
00624
00625 connect(m_saveButton, SIGNAL(Clicked()), SLOT(saveAsDefault()));
00626 connect(m_doneButton, SIGNAL(Clicked()), SLOT(saveAndExit()));
00627
00628 return true;
00629 }
00630
00631 void VideoFilterDialog::update_numvideo()
00632 {
00633 int video_count = m_videoList.TryFilter(m_settings);
00634
00635 if (video_count > 0)
00636 {
00637 m_numvideosText->SetText(tr("Result of this filter : %n video(s)", "",
00638 video_count));
00639 }
00640 else
00641 {
00642 m_numvideosText->SetText(
00643 QString(tr("Result of this filter : No Videos")));
00644 }
00645 }
00646
00647 void VideoFilterDialog::fillWidgets()
00648 {
00649 bool have_unknown_year = false;
00650 bool have_unknown_runtime = false;
00651
00652 typedef std::set<int> int_list;
00653 int_list years;
00654 int_list runtimes;
00655 int_list user_ratings;
00656
00657 const VideoMetadataListManager::metadata_list &mdl =
00658 m_videoList.getListCache().getList();
00659 for (VideoMetadataListManager::metadata_list::const_iterator p = mdl.begin();
00660 p != mdl.end(); ++p)
00661 {
00662 int year = (*p)->GetYear();
00663 if ((year == 0) || (year == VIDEO_YEAR_DEFAULT))
00664 have_unknown_year = true;
00665 else
00666 years.insert(year);
00667
00668 int runtime = (*p)->GetLength();
00669 if (runtime == 0)
00670 have_unknown_runtime = true;
00671 else
00672 runtimes.insert(runtime / 30);
00673
00674 user_ratings.insert(static_cast<int>((*p)->GetUserRating()));
00675 }
00676
00677
00678 new MythUIButtonListItem(m_categoryList, QObject::tr("All"),
00679 kCategoryFilterAll);
00680
00681 const VideoCategory::entry_list &vcl =
00682 VideoCategory::GetCategory().getList();
00683 for (VideoCategory::entry_list::const_iterator p = vcl.begin();
00684 p != vcl.end(); ++p)
00685 {
00686 new MythUIButtonListItem(m_categoryList, p->second, p->first);
00687 }
00688
00689 new MythUIButtonListItem(m_categoryList, VIDEO_CATEGORY_UNKNOWN,
00690 kCategoryFilterUnknown);
00691 m_categoryList->SetValueByData(m_settings.GetCategory());
00692
00693
00694 new MythUIButtonListItem(m_genreList, QObject::tr("All"), kGenreFilterAll);
00695
00696 const VideoGenre::entry_list &gl = VideoGenre::getGenre().getList();
00697 for (VideoGenre::entry_list::const_iterator p = gl.begin();
00698 p != gl.end(); ++p)
00699 {
00700 new MythUIButtonListItem(m_genreList, p->second, p->first);
00701 }
00702
00703 new MythUIButtonListItem(m_genreList, VIDEO_GENRE_UNKNOWN, kGenreFilterUnknown);
00704 m_genreList->SetValueByData(m_settings.getGenre());
00705
00706
00707 new MythUIButtonListItem(m_castList, QObject::tr("All"), kCastFilterAll);
00708
00709 const VideoCast::entry_list &cl = VideoCast::GetCast().getList();
00710 for (VideoCast::entry_list::const_iterator p = cl.begin();
00711 p != cl.end(); ++p)
00712 {
00713 new MythUIButtonListItem(m_castList, p->second, p->first);
00714 }
00715
00716 new MythUIButtonListItem(m_castList, VIDEO_CAST_UNKNOWN, kCastFilterUnknown);
00717 m_castList->SetValueByData(m_settings.GetCast());
00718
00719
00720 new MythUIButtonListItem(m_countryList, QObject::tr("All"), kCountryFilterAll);
00721
00722 const VideoCountry::entry_list &cnl = VideoCountry::getCountry().getList();
00723 for (VideoCountry::entry_list::const_iterator p = cnl.begin();
00724 p != cnl.end(); ++p)
00725 {
00726 new MythUIButtonListItem(m_countryList, p->second, p->first);
00727 }
00728
00729 new MythUIButtonListItem(m_countryList, VIDEO_COUNTRY_UNKNOWN,
00730 kCountryFilterUnknown);
00731 m_countryList->SetValueByData(m_settings.getCountry());
00732
00733
00734 new MythUIButtonListItem(m_yearList, QObject::tr("All"), kYearFilterAll);
00735
00736 for (int_list::const_reverse_iterator p = years.rbegin();
00737 p != years.rend(); ++p)
00738 {
00739 new MythUIButtonListItem(m_yearList, QString::number(*p), *p);
00740 }
00741
00742 if (have_unknown_year)
00743 new MythUIButtonListItem(m_yearList, VIDEO_YEAR_UNKNOWN,
00744 kYearFilterUnknown);
00745
00746 m_yearList->SetValueByData(m_settings.getYear());
00747
00748
00749 new MythUIButtonListItem(m_runtimeList, QObject::tr("All"), kRuntimeFilterAll);
00750
00751 if (have_unknown_runtime)
00752 new MythUIButtonListItem(m_runtimeList, VIDEO_RUNTIME_UNKNOWN,
00753 kRuntimeFilterUnknown);
00754
00755 for (int_list::const_iterator p = runtimes.begin();
00756 p != runtimes.end(); ++p)
00757 {
00758 QString s = QString("%1 %2 ~ %3 %4").arg(*p * 30).arg(tr("minutes"))
00759 .arg((*p + 1) * 30).arg(tr("minutes"));
00760 new MythUIButtonListItem(m_runtimeList, s, *p);
00761 }
00762
00763 m_runtimeList->SetValueByData(m_settings.getRuntime());
00764
00765
00766 new MythUIButtonListItem(m_userratingList, QObject::tr("All"),
00767 kUserRatingFilterAll);
00768
00769 for (int_list::const_reverse_iterator p = user_ratings.rbegin();
00770 p != user_ratings.rend(); ++p)
00771 {
00772 new MythUIButtonListItem(m_userratingList,
00773 QString(">= %1").arg(QString::number(*p)),
00774 *p);
00775 }
00776
00777 m_userratingList->SetValueByData(m_settings.GetUserRating());
00778
00779
00780 new MythUIButtonListItem(m_browseList, QObject::tr("All"), kBrowseFilterAll);
00781 new MythUIButtonListItem(m_browseList, QObject::tr("Yes"),
00782 qVariantFromValue(1));
00783 new MythUIButtonListItem(m_browseList, QObject::tr("No"),
00784 qVariantFromValue(0));
00785 m_browseList->SetValueByData(m_settings.GetBrowse());
00786
00787
00788 new MythUIButtonListItem(m_watchedList, QObject::tr("All"), kWatchedFilterAll);
00789 new MythUIButtonListItem(m_watchedList, QObject::tr("Yes"),
00790 qVariantFromValue(1));
00791 new MythUIButtonListItem(m_watchedList, QObject::tr("No"),
00792 qVariantFromValue(0));
00793 m_watchedList->SetValueByData(m_settings.GetWatched());
00794
00795
00796 new MythUIButtonListItem(m_inetrefList, QObject::tr("All"),
00797 kInetRefFilterAll);
00798 new MythUIButtonListItem(m_inetrefList, QObject::tr("Unknown"),
00799 kInetRefFilterUnknown);
00800 m_inetrefList->SetValueByData(m_settings.getInteRef());
00801
00802
00803 new MythUIButtonListItem(m_coverfileList, QObject::tr("All"),
00804 kCoverFileFilterAll);
00805 new MythUIButtonListItem(m_coverfileList, QObject::tr("None"),
00806 kCoverFileFilterNone);
00807 m_coverfileList->SetValueByData(m_settings.GetCoverFile());
00808
00809
00810 new MythUIButtonListItem(m_orderbyList, QObject::tr("Title"),
00811 VideoFilterSettings::kOrderByTitle);
00812 new MythUIButtonListItem(m_orderbyList, QObject::tr("Season/Episode"),
00813 VideoFilterSettings::kOrderBySeasonEp);
00814 new MythUIButtonListItem(m_orderbyList, QObject::tr("Year"),
00815 VideoFilterSettings::kOrderByYearDescending);
00816 new MythUIButtonListItem(m_orderbyList, QObject::tr("User Rating"),
00817 VideoFilterSettings::kOrderByUserRatingDescending);
00818 new MythUIButtonListItem(m_orderbyList, QObject::tr("Runtime"),
00819 VideoFilterSettings::kOrderByLength);
00820 new MythUIButtonListItem(m_orderbyList, QObject::tr("Filename"),
00821 VideoFilterSettings::kOrderByFilename);
00822 new MythUIButtonListItem(m_orderbyList, QObject::tr("Video ID"),
00823 VideoFilterSettings::kOrderByID);
00824 new MythUIButtonListItem(m_orderbyList, QObject::tr("Date Added"),
00825 VideoFilterSettings::kOrderByDateAddedDescending);
00826 m_orderbyList->SetValueByData(m_settings.getOrderby());
00827
00828
00829 m_textfilter->SetText(m_settings.getTextFilter());
00830 }
00831
00832 void VideoFilterDialog::saveAsDefault()
00833 {
00834 m_settings.saveAsDefault();
00835 saveAndExit();
00836 }
00837
00838 void VideoFilterDialog::saveAndExit()
00839 {
00840 m_fsp->setSettings(m_settings);
00841
00842 if (m_settings.getChangedState() > 0)
00843 emit filterChanged();
00844 Close();
00845 }
00846
00847 void VideoFilterDialog::SetYear(MythUIButtonListItem *item)
00848 {
00849 int new_year = item->GetData().toInt();
00850 m_settings.SetYear(new_year);
00851 update_numvideo();
00852 }
00853
00854 void VideoFilterDialog::SetUserRating(MythUIButtonListItem *item)
00855 {
00856 m_settings.SetUserRating(item->GetData().toInt());
00857 update_numvideo();
00858 }
00859
00860 void VideoFilterDialog::SetCategory(MythUIButtonListItem *item)
00861 {
00862 m_settings.SetCategory(item->GetData().toInt());
00863 update_numvideo();
00864 }
00865
00866 void VideoFilterDialog::setCountry(MythUIButtonListItem *item)
00867 {
00868 m_settings.setCountry(item->GetData().toInt());
00869 update_numvideo();
00870 }
00871
00872 void VideoFilterDialog::setGenre(MythUIButtonListItem *item)
00873 {
00874 m_settings.setGenre(item->GetData().toInt());
00875 update_numvideo();
00876 }
00877
00878 void VideoFilterDialog::SetCast(MythUIButtonListItem *item)
00879 {
00880 m_settings.SetCast(item->GetData().toInt());
00881 update_numvideo();
00882 }
00883
00884 void VideoFilterDialog::setRunTime(MythUIButtonListItem *item)
00885 {
00886 m_settings.setRuntime(item->GetData().toInt());
00887 update_numvideo();
00888 }
00889
00890 void VideoFilterDialog::SetBrowse(MythUIButtonListItem *item)
00891 {
00892 m_settings.SetBrowse(item->GetData().toInt());
00893 update_numvideo();
00894 }
00895
00896 void VideoFilterDialog::SetWatched(MythUIButtonListItem *item)
00897 {
00898 m_settings.SetWatched(item->GetData().toInt());
00899 update_numvideo();
00900 }
00901
00902 void VideoFilterDialog::SetInetRef(MythUIButtonListItem *item)
00903 {
00904 m_settings.SetInetRef(item->GetData().toInt());
00905 update_numvideo();
00906 }
00907
00908 void VideoFilterDialog::SetCoverFile(MythUIButtonListItem *item)
00909 {
00910 m_settings.SetCoverFile(item->GetData().toInt());
00911 update_numvideo();
00912 }
00913
00914 void VideoFilterDialog::setOrderby(MythUIButtonListItem *item)
00915 {
00916 m_settings
00917 .setOrderby((VideoFilterSettings::ordering)item->GetData().toInt());
00918 update_numvideo();
00919 }
00920
00921 void VideoFilterDialog::setTextFilter()
00922 {
00923 m_settings.setTextFilter(m_textfilter->GetText());
00924 update_numvideo();
00925 }