Ticket #690: mythtv.watch_recordings.4.diff

File mythtv.watch_recordings.4.diff, 18.5 KB (added by Robert Tsai <rtsai1111>, 14 years ago)

update to r8854

  • programs/mythfrontend/playbackbox.cpp

     
    104104        return (dt1 > dt2 ? 1 : -1);
    105105}
    106106
     107static PlaybackBox::ViewMask viewMaskToggle(PlaybackBox::ViewMask mask,
     108        PlaybackBox::ViewMask toggle)
     109{
     110    // can only toggle a single bit at a time
     111    if ((mask & toggle))
     112        return (PlaybackBox::ViewMask)(mask & ~toggle);
     113    return (PlaybackBox::ViewMask)(mask | toggle);
     114}
     115
     116static QString sortTitle(QString title, PlaybackBox::ViewMask viewmask,
     117        PlaybackBox::ViewTitleSort titleSort, int recpriority)
     118{
     119    if (title == "")
     120        return title;
     121
     122    QRegExp prefixes = QObject::tr("^(The |A |An )");
     123    QString sTitle = title;
     124
     125    sTitle.remove(prefixes);
     126    if (viewmask == PlaybackBox::VIEW_TITLES &&
     127            titleSort == PlaybackBox::TitleSortRecPriority)
     128    {
     129        // Also incorporate recpriority (reverse numeric sort). In
     130        // case different episodes of a recording schedule somehow
     131        // have different recpriority values (e.g., manual fiddling
     132        // with database), the title will appear once for each
     133        // distinct recpriority value among its episodes.
     134        //
     135        // Take advantage of QMap sorting. Positive recpriority values
     136        // have a '+' prefix (sorts before '-'). Positive recpriority
     137        // values are "inverted" by substracting them from 1000, so
     138        // that high recpriorities are sorted first.
     139        //
     140        // For example (first column is sort key; second column is
     141        // recpriority):
     142        //
     143        //      +905     95
     144        //      +910     90
     145        //      +911     89
     146        //      +999      1
     147        //      -000      0
     148        //      -005     -5
     149        //      -010    -10
     150        //      -099    -99
     151
     152        QString sortprefix;
     153        if (recpriority > 0)
     154            sortprefix.sprintf("+%03u", 1000 - recpriority);
     155        else
     156            sortprefix.sprintf("-%03u", -recpriority);
     157
     158        sTitle = sortprefix + "-" + sTitle;
     159    }
     160    return sTitle;
     161}
     162
    107163PlaybackBox::PlaybackBox(BoxType ltype, MythMainWindow *parent,
    108164                         const char *name)
    109165    : MythDialog(parent, name),
     
    119175      groupDisplayName(tr("All Programs")),
    120176      recGroup("All Programs"),
    121177      recGroupPassword(""),             curGroupPassword(""),
     178      viewMask(VIEW_TITLES),
    122179      // Theme parsing
    123180      theme(new XMLParse()),
    124181      // Non-volatile drawing variables
     
    180237        drawTransPixmap = new QPixmap();
    181238
    182239    bool displayCat  = gContext->GetNumSetting("DisplayRecGroupIsCategory", 0);
    183     int  defaultView = gContext->GetNumSetting("DisplayGroupDefaultView", 0);
     240    ViewType defaultView = (ViewType)gContext->GetNumSetting(
     241            "DisplayGroupDefaultView", TitlesOnly);
    184242    int  initialFilt = gContext->GetNumSetting("QueryInitialFilter", 0);
    185243
    186244    progLists[""];
     
    343401    }
    344402}
    345403
    346 void PlaybackBox::setDefaultView(int defaultView)
     404void PlaybackBox::setDefaultView(ViewType defaultView)
    347405{
     406    int mask;
     407
    348408    switch (defaultView)
    349409    {
    350410        default:
    351         case TitlesOnly: titleView = true; useCategories = false;
    352                          useRecGroups = false; break;
    353         case TitlesCategories: titleView = true; useCategories = true;
    354                                useRecGroups = false; break;
    355         case TitlesCategoriesRecGroups: titleView = true; useCategories = true;
    356                                         useRecGroups = true; break;
    357         case TitlesRecGroups: titleView = true; useCategories = false;
    358                               useRecGroups = true; break;
    359         case Categories: titleView = false; useCategories = true;
    360                          useRecGroups = false; break;
    361         case CategoriesRecGroups: titleView = false; useCategories = true;
    362                                   useRecGroups = true; break;
    363         case RecGroups: titleView = false; useCategories = false;
    364                         useRecGroups = true; break;
     411        case TitlesOnly:
     412            mask = VIEW_TITLES;
     413            break;
     414        case TitlesCategories:
     415            mask = VIEW_TITLES |    VIEW_CATEGORIES;
     416            break;
     417        case TitlesCategoriesRecGroups:
     418            mask = VIEW_TITLES |    VIEW_CATEGORIES |   VIEW_RECGROUPS;
     419            break;
     420        case TitlesRecGroups:
     421            mask = VIEW_TITLES |                        VIEW_RECGROUPS;
     422            break;
     423        case Categories:
     424            mask =                  VIEW_CATEGORIES;
     425            break;
     426        case CategoriesRecGroups:
     427            mask =                  VIEW_CATEGORIES |   VIEW_RECGROUPS;
     428            break;
     429        case RecGroups:
     430            mask =                                      VIEW_RECGROUPS;
     431            break;
    365432    }
     433    viewMask = (PlaybackBox::ViewMask)mask;
    366434}
    367435
    368436/* blocks until playing has stopped */
     
    11391207                    ((titleList[titleIndex] != tempInfo->title) &&
    11401208                     ((titleList[titleIndex] == tempInfo->recgroup) ||
    11411209                      (titleList[titleIndex] == tempInfo->category))) ||
    1142                     (!(titleView)))
     1210                    (!(viewMask & VIEW_TITLES)))
    11431211                    tempSubTitle = tempInfo->title;
    11441212                else
    11451213                    tempSubTitle = tempInfo->subtitle;
     
    11501218                        ((titleList[titleIndex] != tempInfo->title) &&
    11511219                         ((titleList[titleIndex] == tempInfo->recgroup) ||
    11521220                          (titleList[titleIndex] == tempInfo->category))) ||
    1153                         (!(titleView))))
     1221                        (!(viewMask & VIEW_TITLES))))
    11541222                {
    11551223                    tempSubTitle = tempSubTitle + " - \"" +
    11561224                        tempInfo->subtitle + "\"";
     
    13611429    QString oldprogramid;
    13621430    QDate oldoriginalAirDate;
    13631431    QDateTime oldstartts;
     1432    int oldrecpriority = 0;
    13641433    p = progLists[oldtitle].at(progIndex);
    13651434    if (p)
    13661435    {
     
    13681437        oldstartts = p->recstartts;
    13691438        oldprogramid = p->programid;
    13701439        oldoriginalAirDate = p->originalAirDate;
     1440        oldrecpriority = p->recpriority;
    13711441    }
    13721442
    13731443    QMap<QString, AvailableStatusType> asCache;
     
    13871457
    13881458    fillRecGroupPasswordCache();
    13891459
     1460    ViewTitleSort titleSort = (ViewTitleSort)gContext->GetNumSetting(
     1461            "DisplayGroupTitleSort", TitleSortAlphabetical);
     1462
    13901463    QMap<QString, QString> sortedList;
    1391     QRegExp prefixes = tr("^(The |A |An )");
    13921464    QString sTitle = "";
    13931465
    13941466    bool LiveTVInAllPrograms = gContext->GetNumSetting("LiveTVInAllPrograms",0);
     
    14101482                 (p->category == recGroup ) &&
    14111483                 ( !recGroupPwCache.contains(p->recgroup))))
    14121484            {
    1413                 if ((titleView) || (useCategories) || (useRecGroups))
     1485                if (viewMask != VIEW_NONE)
    14141486                    progLists[""].prepend(p);
    14151487
    14161488                asKey = p->MakeUniqueKey();
     
    14191491                else
    14201492                    p->availableStatus = asAvailable;
    14211493
    1422                 if (titleView) // Normal title view
     1494                if ((viewMask & VIEW_TITLES)) // Show titles
    14231495                {
    14241496                    progLists[p->title].prepend(p);
    1425                     sTitle = p->title;
    1426                     sTitle.remove(prefixes);
     1497                    sTitle = sortTitle(p->title, viewMask, titleSort,
     1498                            p->recpriority);
    14271499                    sTitle = sTitle.lower();
    14281500                    sortedList[sTitle] = p->title;
    14291501                }
    14301502
    1431                 if (useRecGroups && p->recgroup != "") // Show recording groups                 
     1503                if ((viewMask & VIEW_RECGROUPS) &&
     1504                    p->recgroup != "") // Show recording groups                 
    14321505                {
    14331506                    progLists[p->recgroup].prepend(p);
    14341507                    sortedList[p->recgroup.lower()] = p->recgroup;
    14351508
    1436                     // If another view is also used, unset autodelete as another group will do it.
    1437                     if ((useCategories) || (titleView))
     1509                    // If another view is also used, unset autodelete as
     1510                    // another group will do it.
     1511                    if ((viewMask & ~VIEW_RECGROUPS))
    14381512                        progLists[p->recgroup].setAutoDelete(false);
    14391513                }
    14401514
    1441                 if (useCategories && p->category != "") // Show categories
     1515                if ((viewMask & VIEW_CATEGORIES) &&
     1516                    p->category != "") // Show categories
    14421517                {
    14431518                    progLists[p->category].prepend(p);
    14441519                    sortedList[p->category.lower()] = p->category;
    1445                     // If another view is also used, unset autodelete as another group will do it
    1446                     if ((useRecGroups) || (titleView))
     1520                    // If another view is also used, unset autodelete as
     1521                    // another group will do it
     1522                    if ((viewMask & ~VIEW_CATEGORIES))
    14471523                        progLists[p->category].setAutoDelete(false);
    14481524                }
    14491525            }
     
    14641540        return 0;
    14651541    }
    14661542
    1467     titleList = sortedList.values();
    1468 
    14691543    QString episodeSort = gContext->GetSetting("PlayBoxEpisodeSort", "Date");
    14701544
    14711545    if (episodeSort == "OrigAirDate")
     
    15011575    // titles backwards until we find where we were or go past.  This
    15021576    // is somewhat inefficient, but it works.
    15031577
    1504     QString oldsTitle = oldtitle;
    1505     oldsTitle.remove(prefixes);
     1578    QStringList sTitleList = sortedList.keys();
     1579    titleList = sortedList.values();
     1580
     1581    QString oldsTitle = sortTitle(oldtitle, viewMask, titleSort,
     1582            oldrecpriority);
    15061583    oldsTitle = oldsTitle.lower();
    15071584    titleIndex = titleList.count() - 1;
    1508     for (int i = titleIndex; i >= 0; i--)
     1585    for (titleIndex = titleList.count() - 1; titleIndex >= 0; titleIndex--)
    15091586    {
    1510         sTitle = titleList[i];
    1511         sTitle.remove(prefixes);
     1587        sTitle = sTitleList[titleIndex];
    15121588        sTitle = sTitle.lower();
    15131589       
    15141590        if (oldsTitle > sTitle)
     1591        {
     1592            if (titleIndex + 1 < (int)titleList.count())
     1593                titleIndex++;
    15151594            break;
     1595        }
    15161596
    1517         titleIndex = i;
    1518 
    15191597        if (oldsTitle == sTitle)
    15201598            break;
    15211599    }
     
    22522330 
    22532331    if (inTitle)
    22542332    {
    2255         if (titleView)
     2333        if ((viewMask & VIEW_TITLES))
    22562334            popup->addButton(tr("Toggle playlist for this Category/Title"),
    22572335                             this, SLOT(togglePlayListTitle()));
    22582336        else
     
    31743252    if (expectingPopup)
    31753253        cancelPopup();
    31763254
    3177     if (titleView) titleView = false;
    3178     else titleView = true;
     3255    viewMask = viewMaskToggle(viewMask, VIEW_TITLES);
    31793256
    31803257    playList.clear();
    31813258    connected = FillList();     
     
    34243501        }
    34253502        else if (action == "TOGGLERECORD")
    34263503        {
    3427             if (titleView) titleView = false;
    3428             else titleView = true;
     3504            viewMask = viewMaskToggle(viewMask, VIEW_TITLES);
    34293505            connected = FillList();
    34303506            paintSkipUpdate = false;
    34313507            update(drawTotalBounds);
     
    39844060    int result = recGroupPopup->ExecPopup();
    39854061
    39864062    if (result == MythDialog::Accepted)
    3987         setDefaultView(recGroupComboBox->currentItem());
     4063        setDefaultView((ViewType)recGroupComboBox->currentItem());
    39884064
    39894065    delete recGroupComboBox;
    39904066
  • programs/mythfrontend/globalsettings.cpp

     
    44#include "dbsettings.h"
    55#include "langsettings.h"
    66#include "mpeg/iso639.h"
     7#include "playbackbox.h"
    78#include "globalsettings.h"
    89#include "recordingprofile.h"
    910#include "scheduledrecording.h"
     
    302303    HostComboBox *gc = new HostComboBox("DisplayGroupDefaultView");
    303304    gc->setLabel(QObject::tr("Default View"));
    304305
    305     gc->addSelection(QObject::tr("Show Titles only"), "0");
    306     gc->addSelection(QObject::tr("Show Titles and Categories"), "1");
    307     gc->addSelection(QObject::tr("Show Titles, Categories, and Recording Groups"), "2");
    308     gc->addSelection(QObject::tr("Show Titles and Recording Groups"), "3");
    309     gc->addSelection(QObject::tr("Show Categories only"), "4");
    310     gc->addSelection(QObject::tr("Show Categories and Recording Groups"), "5");
    311     gc->addSelection(QObject::tr("Show Recording Groups only"), "6");
     306    gc->addSelection(QObject::tr("Show Titles only"),
     307            QString::number(PlaybackBox::TitlesOnly));
     308    gc->addSelection(QObject::tr("Show Titles and Categories"),
     309            QString::number(PlaybackBox::TitlesCategories));
     310    gc->addSelection(QObject::tr(
     311                "Show Titles, Categories, and Recording Groups"),
     312            QString::number(PlaybackBox::TitlesCategoriesRecGroups));
     313    gc->addSelection(QObject::tr("Show Titles and Recording Groups"),
     314            QString::number(PlaybackBox::TitlesRecGroups));
     315    gc->addSelection(QObject::tr("Show Categories only"),
     316            QString::number(PlaybackBox::Categories));
     317    gc->addSelection(QObject::tr("Show Categories and Recording Groups"),
     318            QString::number(PlaybackBox::CategoriesRecGroups));
     319    gc->addSelection(QObject::tr("Show Recording Groups only"),
     320            QString::number(PlaybackBox::RecGroups));
    312321
    313322    gc->setHelpText(QObject::tr("Select what type of grouping to show on the Watch Recordings screen "
    314323                    "by default."));
     
    22692280    return gc;
    22702281}
    22712282
     2283class DefaultViewSettings: public VerticalConfigurationGroup,
     2284                           public TriggeredConfigurationGroup {
     2285public:
     2286    DefaultViewSettings():
     2287            VerticalConfigurationGroup(false, false, true, true),
     2288            TriggeredConfigurationGroup(false) {
     2289
     2290        HostComboBox *defaultView = DefaultView();
     2291        addChild(defaultView);
     2292        setTrigger(defaultView);
     2293
     2294        HostComboBox *titleSort = new HostComboBox("DisplayGroupTitleSort");
     2295        titleSort->setLabel(tr("Sort Titles"));
     2296        titleSort->addSelection(tr("Alphabetically"),
     2297                QString::number(PlaybackBox::TitleSortAlphabetical));
     2298        titleSort->addSelection(tr("By Recording Priority"),
     2299                QString::number(PlaybackBox::TitleSortRecPriority));
     2300
     2301        for (unsigned int ii = 0; ii < PlaybackBox::ViewTypes; ii++)
     2302        {
     2303            if (ii == PlaybackBox::TitlesOnly)
     2304                addTarget(QString::number(ii), titleSort);
     2305            else
     2306                addTarget(QString::number(ii),
     2307                        new VerticalConfigurationGroup(false, false));
     2308        }
     2309    }
     2310};
     2311
    22722312static HostCheckBox *PVR350OutputEnable()
    22732313{
    22742314    HostCheckBox *gc = new HostCheckBox("PVR350OutputEnable");
     
    30853125    pbox2->addChild(RememberRecGroup());
    30863126    pbox2->addChild(UseGroupNameAsAllPrograms());
    30873127    pbox2->addChild(LiveTVInAllPrograms());
    3088     pbox2->addChild(DefaultView());
     3128    pbox2->addChild(new DefaultViewSettings());
    30893129    addChild(pbox2);
    30903130
    30913131    addChild(new HwDecSettings());
     
    33103350    addChild(xboxset);
    33113351}
    33123352
     3353// vim:set sw=4 ts=4 expandtab:
  • programs/mythfrontend/playbackbox.h

     
    11// -*- Mode: c++ -*-
     2// vim:set sw=4 ts=4 expandtab:
    23#ifndef PLAYBACKBOX_H_
    34#define PLAYBACKBOX_H_
    45
     
    4142        Delete,
    4243    } BoxType;
    4344
    44     typedef enum
    45     {
    46         TitlesOnly,
    47         TitlesCategories,
    48         TitlesCategoriesRecGroups,
    49         TitlesRecGroups,
    50         Categories,
    51         CategoriesRecGroups,
    52         RecGroups,
     45    // ViewType values cannot change; they are stored in the database.
     46    typedef enum {
     47        TitlesOnly = 0,
     48        TitlesCategories = 1,
     49        TitlesCategoriesRecGroups = 2,
     50        TitlesRecGroups = 3,
     51        Categories = 4,
     52        CategoriesRecGroups = 5,
     53        RecGroups = 6,
     54        ViewTypes,                  // placeholder value, not in database
    5355    } ViewType;
    5456
     57    // Sort function when TitlesOnly. Values are stored in database.
     58    typedef enum {
     59        TitleSortAlphabetical = 0,
     60        TitleSortRecPriority = 1,
     61        TitleSortMethods,           // placeholder value, not in database
     62    } ViewTitleSort;
     63
     64    typedef enum {
     65        VIEW_NONE       =  0x00,
     66        VIEW_TITLES     =  0x01,
     67        VIEW_CATEGORIES =  0x02,
     68        VIEW_RECGROUPS  =  0x04,
     69        VIEW_ALL        = ~0x00,
     70    } ViewMask;
     71
    5572    typedef enum
    5673    {
    5774        EndOfRecording,
     
    260277    void updateCurGroup(QPainter *p);
    261278    void updateGroupInfo(QPainter *p, QRect& pr, QPixmap& pix,
    262279                         QString cont_name = "group_info");
    263     void setDefaultView(int defaultView);
     280    void setDefaultView(ViewType defaultView);
    264281
    265282    // Settings ///////////////////////////////////////////////////////////////
    266283    /// If "Play"  this is a recording playback selection UI,
     
    292309    QString             recGroup;
    293310    QString             recGroupPassword;
    294311    QString             curGroupPassword;
     312    ViewMask            viewMask;
    295313
    296314    // Theme parsing variables
    297315    XMLParse           *theme;
  • programs/mythbackend/mainserver.cpp

     
    958958                       "recorded.lastmodified, recorded.findid, "
    959959                       "recorded.originalairdate, recorded.playgroup, "
    960960                       "recorded.basename, recorded.progstart, "
    961                        "recorded.progend, recorded.stars "
     961                       "recorded.progend, recorded.stars, recorded.recpriority "
    962962                       "FROM recorded "
    963963                       "LEFT JOIN record ON recorded.recordid = record.recordid "
    964964                       "LEFT JOIN channel ON recorded.chanid = channel.chanid "
     
    10701070            proginfo->recgroup = query.value(16).toString();
    10711071            proginfo->playgroup = query.value(27).toString();
    10721072
     1073            proginfo->recpriority = query.value(32).toInt();
     1074
    10731075            proginfo->recstatus = rsRecorded;
    10741076            if (proginfo->recendts > rectime)
    10751077            {