MythTV  0.26-pre
videofilter.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends