Ticket #690: mythtv.watch_recordings.diff

File mythtv.watch_recordings.diff, 17.9 KB (added by rtsai1111, 14 years ago)
  • programs/mythfrontend/playbackbox.cpp

     
    9898        return (dt1 > dt2 ? 1 : -1);
    9999}
    100100
     101static PlaybackBox::ViewMask viewMaskToggle(PlaybackBox::ViewMask mask,
     102        PlaybackBox::ViewMask toggle)
     103{
     104    // only works for single-bit toggle values
     105    if ((mask & toggle))
     106        return (PlaybackBox::ViewMask)(mask & ~toggle);
     107    return (PlaybackBox::ViewMask)(mask | toggle);
     108}
     109
     110static QString sortTitle(QString title, PlaybackBox::ViewMask viewmask,
     111        PlaybackBox::ViewTitleSort titleSort, int recpriority)
     112{
     113    if (title == "")
     114        return title;
     115
     116    QRegExp prefixes = QObject::tr("^(The |A |An )");
     117    QString sTitle = title;
     118
     119    sTitle.remove(prefixes);
     120    if (viewmask == PlaybackBox::VIEW_TITLES &&
     121            titleSort == PlaybackBox::TitleSortRecPriority)
     122    {
     123        // Also incorporate recpriority (reverse numeric sort).
     124        //
     125        // Take advantage of QMap sorting. Positive recpriority values have a
     126        // '+' prefix (sorts before '-'). Positive recpriority values are
     127        // "inverted" by substracting them from 1000, so that high
     128        // recpriorities are sorted first.
     129        //
     130        // For example (first column is sort key; second column is
     131        // recpriority):
     132        //
     133        //      +905     95
     134        //      +910     90
     135        //      +911     89
     136        //      +999      1
     137        //      -000      0
     138        //      -005     -5
     139        //      -010    -10
     140        //      -099    -99
     141
     142        QString sortprefix;
     143        if (recpriority > 0)
     144            sortprefix.sprintf("+%03u", 1000 - recpriority);
     145        else
     146            sortprefix.sprintf("-%03u", -recpriority);
     147
     148        sTitle = sortprefix + "-" + sTitle;
     149    }
     150    return sTitle;
     151}
     152
    101153PlaybackBox::PlaybackBox(BoxType ltype, MythMainWindow *parent,
    102154                         const char *name)
    103155           : MythDialog(parent, name)
     
    146198
    147199    recGroupPopup = NULL;
    148200
    149     // titleView controls showing titles in group list
    150     titleView = true;
     201    viewMask = VIEW_TITLES;
    151202
    152     // useCategories controls showing categories in group list
    153     useCategories = false;
    154 
    155     // useRecGroups controls showing of recording groups in group list
    156     useRecGroups = false;
    157 
    158203    if (gContext->GetNumSetting("UseArrowAccels", 1))
    159204        arrowAccel = true;
    160205    else
     
    185230    else
    186231        recGroupType[recGroup] = "recgroup";
    187232
    188     setDefaultView(gContext->GetNumSetting("DisplayGroupDefaultView", 0));
     233    setDefaultView((ViewType)gContext->GetNumSetting("DisplayGroupDefaultView",
     234                TitlesOnly));
    189235
    190236    fullRect = QRect(0, 0, size().width(), size().height());
    191237    listRect = QRect(0, 0, 0, 0);
     
    313359    }
    314360}
    315361
    316 void PlaybackBox::setDefaultView(int defaultView)
     362void PlaybackBox::setDefaultView(ViewType defaultView)
    317363{
     364    int mask;
     365
    318366    switch (defaultView)
    319367    {
    320368        default:
    321         case TitlesOnly: titleView = true; useCategories = false;
    322                          useRecGroups = false; break;
    323         case TitlesCategories: titleView = true; useCategories = true;
    324                                useRecGroups = false; break;
    325         case TitlesCategoriesRecGroups: titleView = true; useCategories = true;
    326                                         useRecGroups = true; break;
    327         case TitlesRecGroups: titleView = true; useCategories = false;
    328                               useRecGroups = true; break;
    329         case Categories: titleView = false; useCategories = true;
    330                          useRecGroups = false; break;
    331         case CategoriesRecGroups: titleView = false; useCategories = true;
    332                                   useRecGroups = true; break;
    333         case RecGroups: titleView = false; useCategories = false;
    334                         useRecGroups = true; break;
     369        case TitlesOnly:
     370            mask = VIEW_TITLES;
     371            break;
     372        case TitlesCategories:
     373            mask = VIEW_TITLES |    VIEW_CATEGORIES;
     374            break;
     375        case TitlesCategoriesRecGroups:
     376            mask = VIEW_TITLES |    VIEW_CATEGORIES |   VIEW_RECGROUPS;
     377            break;
     378        case TitlesRecGroups:
     379            mask = VIEW_TITLES |                        VIEW_RECGROUPS;
     380            break;
     381        case Categories:
     382            mask =                  VIEW_CATEGORIES;
     383            break;
     384        case CategoriesRecGroups:
     385            mask =                  VIEW_CATEGORIES |   VIEW_RECGROUPS;
     386            break;
     387        case RecGroups:
     388            mask =                                      VIEW_RECGROUPS;
     389            break;
    335390    }
     391    viewMask = (PlaybackBox::ViewMask)mask;
    336392}
    337393
    338394/* blocks until playing has stopped */
     
    11331189
    11341190                tempInfo = plist->at(skip+cnt);
    11351191
    1136                 if ((titleList[titleIndex] == "") || (!(titleView)))
     1192                if (titleList[titleIndex] == "" || !(viewMask & VIEW_TITLES))
    11371193                    tempSubTitle = tempInfo->title;
    11381194                else
    11391195                    tempSubTitle = tempInfo->subtitle;
    11401196                if (tempSubTitle.stripWhiteSpace().length() == 0)
    11411197                    tempSubTitle = tempInfo->title;
    11421198                if ((tempInfo->subtitle).stripWhiteSpace().length() > 0
    1143                     && ((titleList[titleIndex] == "") || (!(titleView))))
     1199                    && (titleList[titleIndex] == ""
     1200                        || !(viewMask & VIEW_TITLES)))
    11441201                {
    11451202                    tempSubTitle = tempSubTitle + " - \"" +
    11461203                        tempInfo->subtitle + "\"";
     
    13511408    QString oldprogramid;
    13521409    QDate oldoriginalAirDate;
    13531410    QDateTime oldstartts;
     1411    int oldrecpriority = 0;
    13541412    p = progLists[oldtitle].at(progIndex);
    13551413    if (p)
    13561414    {
     
    13581416        oldstartts = p->recstartts;
    13591417        oldprogramid = p->programid;
    13601418        oldoriginalAirDate = p->originalAirDate;
     1419        oldrecpriority = p->recpriority;
    13611420    }
    13621421
    13631422    QMap<QString, AvailableStatusType> asCache;
     
    13771436
    13781437    fillRecGroupPasswordCache();
    13791438
     1439    ViewTitleSort titleSort = (ViewTitleSort)gContext->GetNumSetting(
     1440            "DisplayGroupTitleSort", TitleSortAlphabetical);
     1441
    13801442    QMap<QString, QString> sortedList;
    1381     QRegExp prefixes = tr("^(The |A |An )");
    13821443    QString sTitle = "";
    13831444
    13841445    vector<ProgramInfo *> *infoList;
     
    13971458                 (p->category == recGroup ) &&
    13981459                 ( !recGroupPwCache.contains(p->recgroup))))
    13991460            {
    1400                 if ((titleView) || (useCategories) || (useRecGroups))
     1461                if (viewMask != VIEW_NONE)
    14011462                    progLists[""].prepend(p);
    14021463
    14031464                asKey = p->MakeUniqueKey();
     
    14061467                else
    14071468                    p->availableStatus = asAvailable;
    14081469
    1409                 if (titleView) // Normal title view
     1470                if ((viewMask & VIEW_TITLES)) // Show titles
    14101471                {
    14111472                    progLists[p->title].prepend(p);
    1412                     sTitle = p->title;
    1413                     sTitle.remove(prefixes);
     1473                    sTitle = sortTitle(p->title, viewMask, titleSort,
     1474                            p->recpriority);
    14141475                    sortedList[sTitle] = p->title;
    14151476                }
    14161477
    1417                 if (useRecGroups) // Show recording groups                 
     1478                if ((viewMask & VIEW_RECGROUPS)) // Show recording groups                 
    14181479                {
    14191480                    progLists[p->recgroup].prepend(p);
    14201481                    sortedList[p->recgroup] = p->recgroup;
    14211482
    1422                     // If another view is also used, unset autodelete as another group will do it.
    1423                     if ((useCategories) || (titleView))
     1483                    // If another view is also used, unset autodelete as
     1484                    // another group will do it.
     1485                    if ((viewMask & ~VIEW_RECGROUPS))
    14241486                        progLists[p->recgroup].setAutoDelete(false);
    14251487                }
    14261488
    1427                 if (useCategories) // Show categories
     1489                if ((viewMask & VIEW_CATEGORIES)) // Show categories
    14281490                {
    14291491                    progLists[p->category].prepend(p);
    14301492                    sortedList[p->category] = p->category;
    1431                     // If another view is also used, unset autodelete as another group will do it
    1432                     if ((useRecGroups) || (titleView))
     1493                    // If another view is also used, unset autodelete as
     1494                    // another group will do it
     1495                    if ((viewMask & ~VIEW_CATEGORIES))
    14331496                        progLists[p->category].setAutoDelete(false);
    14341497                }
    14351498            }
     
    14501513        return 0;
    14511514    }
    14521515
    1453     titleList = sortedList.values();
    1454 
    14551516    QString episodeSort = gContext->GetSetting("PlayBoxEpisodeSort", "Date");
    14561517
    14571518    if (episodeSort == "OrigAirDate")
     
    14871548    // titles backwards until we find where we were or go past.  This
    14881549    // is somewhat inefficient, but it works.
    14891550
    1490     QString oldsTitle = oldtitle;
    1491     oldsTitle.remove(prefixes);
     1551    QStringList sTitleList = sortedList.keys();
     1552    titleList = sortedList.values();
     1553
     1554    QString oldsTitle = sortTitle(oldtitle, viewMask, titleSort,
     1555            oldrecpriority);
    14921556    titleIndex = titleList.count() - 1;
    1493     for (int i = titleIndex; i >= 0; i--)
     1557    for (titleIndex = titleList.count() - 1; titleIndex >= 0; titleIndex--)
    14941558    {
    1495         sTitle = titleList[i];
    1496         sTitle.remove(prefixes);
     1559        sTitle = sTitleList[titleIndex];
    14971560       
    14981561        if (oldsTitle > sTitle)
     1562        {
     1563            if (titleIndex + 1 < (int)titleList.count())
     1564                titleIndex++;
    14991565            break;
     1566        }
    15001567
    1501         titleIndex = i;
    1502 
    15031568        if (oldsTitle == sTitle)
    15041569            break;
    15051570    }
     
    22192284 
    22202285    if (inTitle)
    22212286    {
    2222         if (titleView)
     2287        if ((viewMask & VIEW_TITLES))
    22232288            popup->addButton(tr("Toggle playlist for this Category/Title"),
    22242289                             this, SLOT(togglePlayListTitle()));
    22252290        else
     
    31053170    if (expectingPopup)
    31063171        cancelPopup();
    31073172
    3108     if (titleView) titleView = false;
    3109     else titleView = true;
     3173    viewMask = viewMaskToggle(viewMask, VIEW_TITLES);
    31103174
    31113175    playList.clear();
    31123176    connected = FillList();     
     
    32523316        }
    32533317        else if (action == "TOGGLERECORD")
    32543318        {
    3255             if (titleView) titleView = false;
    3256             else titleView = true;
     3319            viewMask = viewMaskToggle(viewMask, VIEW_TITLES);
    32573320            connected = FillList();
    32583321            skipUpdate = false;
    32593322            update(fullRect);
     
    37603823    int result = recGroupPopup->ExecPopup();
    37613824
    37623825    if (result == MythDialog::Accepted)
    3763         setDefaultView(recGroupComboBox->currentItem());
     3826        setDefaultView((ViewType)recGroupComboBox->currentItem());
    37643827
    37653828    delete recGroupComboBox;
    37663829
     
    43244387    else
    43254388        recGroupOkButton->setEnabled(false);
    43264389}
     4390
     4391// vim:set sw=4 ts=4 expandtab:
  • 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"
     
    288289    HostComboBox *gc = new HostComboBox("DisplayGroupDefaultView");
    289290    gc->setLabel(QObject::tr("Default View"));
    290291
    291     gc->addSelection(QObject::tr("Show Titles only"), "0");
    292     gc->addSelection(QObject::tr("Show Titles and Categories"), "1");
    293     gc->addSelection(QObject::tr("Show Titles, Categories, and Recording Groups"), "2");
    294     gc->addSelection(QObject::tr("Show Titles and Recording Groups"), "3");
    295     gc->addSelection(QObject::tr("Show Categories only"), "4");
    296     gc->addSelection(QObject::tr("Show Categories and Recording Groups"), "5");
    297     gc->addSelection(QObject::tr("Show Recording Groups only"), "6");
     292    gc->addSelection(QObject::tr("Show Titles only"),
     293            QString::number(PlaybackBox::TitlesOnly));
     294    gc->addSelection(QObject::tr("Show Titles and Categories"),
     295            QString::number(PlaybackBox::TitlesCategories));
     296    gc->addSelection(QObject::tr(
     297                "Show Titles, Categories, and Recording Groups"),
     298            QString::number(PlaybackBox::TitlesCategoriesRecGroups));
     299    gc->addSelection(QObject::tr("Show Titles and Recording Groups"),
     300            QString::number(PlaybackBox::TitlesRecGroups));
     301    gc->addSelection(QObject::tr("Show Categories only"),
     302            QString::number(PlaybackBox::Categories));
     303    gc->addSelection(QObject::tr("Show Categories and Recording Groups"),
     304            QString::number(PlaybackBox::CategoriesRecGroups));
     305    gc->addSelection(QObject::tr("Show Recording Groups only"),
     306            QString::number(PlaybackBox::RecGroups));
    298307
    299308    gc->setHelpText(QObject::tr("Select what type of grouping to show on the Watch Recordings screen "
    300309                    "by default."));
     
    22172226    return gc;
    22182227}
    22192228
     2229class DefaultViewSettings: public VerticalConfigurationGroup,
     2230                           public TriggeredConfigurationGroup {
     2231public:
     2232    DefaultViewSettings():
     2233            VerticalConfigurationGroup(false, false, true, true),
     2234            TriggeredConfigurationGroup(false) {
     2235
     2236        HostComboBox *defaultView = DefaultView();
     2237        addChild(defaultView);
     2238        setTrigger(defaultView);
     2239
     2240        HostComboBox *titleSort = new HostComboBox("DisplayGroupTitleSort");
     2241        titleSort->setLabel(tr("Sort Titles"));
     2242        titleSort->addSelection(tr("Alphabetically"),
     2243                QString::number(PlaybackBox::TitleSortAlphabetical));
     2244        titleSort->addSelection(tr("By Recording Priority"),
     2245                QString::number(PlaybackBox::TitleSortRecPriority));
     2246
     2247        for (unsigned int ii = 0; ii < PlaybackBox::ViewTypes; ii++)
     2248        {
     2249            if (ii == PlaybackBox::TitlesOnly)
     2250                addTarget(QString::number(ii), titleSort);
     2251            else
     2252                addTarget(QString::number(ii),
     2253                        new VerticalConfigurationGroup(false, false));
     2254        }
     2255    }
     2256};
     2257
    22202258static HostCheckBox *PVR350OutputEnable()
    22212259{
    22222260    HostCheckBox *gc = new HostCheckBox("PVR350OutputEnable");
     
    30173055    pbox2->addChild(QueryInitialFilter());
    30183056    pbox2->addChild(RememberRecGroup());
    30193057    pbox2->addChild(UseGroupNameAsAllPrograms());
    3020     pbox2->addChild(DefaultView());
     3058    pbox2->addChild(new DefaultViewSettings());
    30213059    addChild(pbox2);
    30223060
    30233061    addChild(new HwDecSettings());
     
    32443282    addChild(xboxset);
    32453283}
    32463284
     3285// 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
     
    3233    Q_OBJECT
    3334  public:
    3435    typedef enum { Play, Delete } BoxType;
    35     typedef enum { TitlesOnly, TitlesCategories, TitlesCategoriesRecGroups,
    36                    TitlesRecGroups, Categories, CategoriesRecGroups, RecGroups} ViewType;
    3736
     37    // ViewType values cannot change; they are stored in the database.
     38    typedef enum {
     39        TitlesOnly = 0,
     40        TitlesCategories = 1,
     41        TitlesCategoriesRecGroups = 2,
     42        TitlesRecGroups = 3,
     43        Categories = 4,
     44        CategoriesRecGroups = 5,
     45        RecGroups = 6,
     46        ViewTypes,                  // placeholder value, not in database
     47    } ViewType;
    3848
     49    // Sort function when TitlesOnly. Values are stored in database.
     50    typedef enum {
     51        TitleSortAlphabetical = 0,
     52        TitleSortRecPriority = 1,
     53        TitleSortMethods,           // placeholder value, not in database
     54    } ViewTitleSort;
     55
     56    typedef enum {
     57        VIEW_NONE       =  0x00,
     58        VIEW_TITLES     =  0x01,
     59        VIEW_CATEGORIES =  0x02,
     60        VIEW_RECGROUPS  =  0x04,
     61        VIEW_ALL        = ~0x00,
     62    } ViewMask;
     63
    3964    PlaybackBox(BoxType ltype, MythMainWindow *parent, const char *name = 0);
    4065   ~PlaybackBox(void);
    4166   
     
    322347    int listOrder;
    323348
    324349    bool playingSomething;
    325     bool titleView;
    326350
    327     bool useRecGroups;
    328     bool useCategories;
    329     void setDefaultView(int defaultView);
     351    ViewMask viewMask;
     352    void setDefaultView(ViewType defaultView);
    330353
    331354    yuv2rgb_fun    conv_yuv2rgba;
    332355    unsigned char *conv_rgba_buf;
  • programs/mythbackend/mainserver.cpp

     
    957957                       "recorded.lastmodified, recorded.findid, "
    958958                       "recorded.originalairdate, recorded.timestretch, "
    959959                       "recorded.basename, recorded.progstart, "
    960                        "recorded.progend "
     960                       "recorded.progend, recorded.recpriority "
    961961                       "FROM recorded "
    962962                       "LEFT JOIN record ON recorded.recordid = record.recordid "
    963963                       "LEFT JOIN channel ON recorded.chanid = channel.chanid "
     
    10691069
    10701070            proginfo->recgroup = query.value(16).toString();
    10711071
     1072            proginfo->recpriority = query.value(31).toInt();
     1073
    10721074            proginfo->recstatus = rsRecorded;
    10731075            if (proginfo->recendts > rectime)
    10741076            {
     
    39553957    recording.setAttribute( "preRollSeconds", gContext->GetNumSetting("RecordPreRoll", 0));
    39563958}
    39573959
     3960// vim:set sw=4 ts=4 expandtab: