|
MythTV
0.26-pre
|
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 // do nothing yet 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 //textfilter 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 //search for season with optionally episode nr. 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 //clear \dX\d from string for string-search in plot/title/subtitle 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 //reset testdate 00538 insertdate = QDate(); 00539 } 00540 } 00541 00543 // VideoFilterDialog 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 // Category 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 // Genre 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 // Cast 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 // Country 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 // Year 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 // Runtime 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 // User Rating 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 // Browsable 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 // Watched 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 // Inet Reference 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 // Coverfile 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 // Order by 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 // Text Filter 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 }
1.7.6.1