Ticket #690: mythtv.playbackbox.diff

File mythtv.playbackbox.diff, 19.2 KB (added by Robert Tsai <rtsai1111>, 14 years ago)

sync to [10024]

  • programs/mythfrontend/playbackbox.cpp

     
    105105        return (dt1 > dt2 ? 1 : -1);
    106106}
    107107
     108static PlaybackBox::ViewMask viewMaskToggle(PlaybackBox::ViewMask mask,
     109        PlaybackBox::ViewMask toggle)
     110{
     111    // can only toggle a single bit at a time
     112    if ((mask & toggle))
     113        return (PlaybackBox::ViewMask)(mask & ~toggle);
     114    return (PlaybackBox::ViewMask)(mask | toggle);
     115}
     116
     117static QString sortTitle(QString title, PlaybackBox::ViewMask viewmask,
     118        PlaybackBox::ViewTitleSort titleSort, int recpriority)
     119{
     120    if (title == "")
     121        return title;
     122
     123    QRegExp prefixes = QObject::tr("^(The |A |An )");
     124    QString sTitle = title;
     125
     126    sTitle.remove(prefixes);
     127    if (viewmask == PlaybackBox::VIEW_TITLES &&
     128            titleSort == PlaybackBox::TitleSortRecPriority)
     129    {
     130        // Also incorporate recpriority (reverse numeric sort). In
     131        // case different episodes of a recording schedule somehow
     132        // have different recpriority values (e.g., manual fiddling
     133        // with database), the title will appear once for each
     134        // distinct recpriority value among its episodes.
     135        //
     136        // Take advantage of QMap sorting. Positive recpriority values
     137        // have a '+' prefix (sorts before '-'). Positive recpriority
     138        // values are "inverted" by substracting them from 1000, so
     139        // that high recpriorities are sorted first.
     140        //
     141        // For example (first column is sort key; second column is
     142        // recpriority):
     143        //
     144        //      +905     95
     145        //      +910     90
     146        //      +911     89
     147        //      +999      1
     148        //      -000      0
     149        //      -005     -5
     150        //      -010    -10
     151        //      -099    -99
     152
     153        QString sortprefix;
     154        if (recpriority > 0)
     155            sortprefix.sprintf("+%03u", 1000 - recpriority);
     156        else
     157            sortprefix.sprintf("-%03u", -recpriority);
     158
     159        sTitle = sortprefix + "-" + sTitle;
     160    }
     161    return sTitle;
     162}
     163
    108164PlaybackBox::PlaybackBox(BoxType ltype, MythMainWindow *parent,
    109165                         const char *name)
    110166    : MythDialog(parent, name),
     
    120176      groupDisplayName(tr("All Programs")),
    121177      recGroup("All Programs"),
    122178      recGroupPassword(""),             curGroupPassword(""),
     179      viewMask(VIEW_TITLES),
    123180      // Theme parsing
    124181      theme(new XMLParse()),
    125182      // Non-volatile drawing variables
     
    183240        drawTransPixmap = new QPixmap();
    184241
    185242    bool displayCat  = gContext->GetNumSetting("DisplayRecGroupIsCategory", 0);
    186     int  defaultView = gContext->GetNumSetting("DisplayGroupDefaultView", 0);
     243    ViewType defaultView = (ViewType)gContext->GetNumSetting(
     244            "DisplayGroupDefaultView", TitlesOnly);
    187245    int  initialFilt = gContext->GetNumSetting("QueryInitialFilter", 0);
    188246
    189247    progLists[""];
     
    348406    }
    349407}
    350408
    351 void PlaybackBox::setDefaultView(int defaultView)
     409void PlaybackBox::setDefaultView(ViewType defaultView)
    352410{
     411    int mask;
     412
    353413    switch (defaultView)
    354414    {
    355415        default:
    356         case TitlesOnly: titleView = true; useCategories = false;
    357                          useRecGroups = false; break;
    358         case TitlesCategories: titleView = true; useCategories = true;
    359                                useRecGroups = false; break;
    360         case TitlesCategoriesRecGroups: titleView = true; useCategories = true;
    361                                         useRecGroups = true; break;
    362         case TitlesRecGroups: titleView = true; useCategories = false;
    363                               useRecGroups = true; break;
    364         case Categories: titleView = false; useCategories = true;
    365                          useRecGroups = false; break;
    366         case CategoriesRecGroups: titleView = false; useCategories = true;
    367                                   useRecGroups = true; break;
    368         case RecGroups: titleView = false; useCategories = false;
    369                         useRecGroups = true; break;
     416        case TitlesOnly:
     417            mask = VIEW_TITLES;
     418            break;
     419        case TitlesCategories:
     420            mask = VIEW_TITLES |    VIEW_CATEGORIES;
     421            break;
     422        case TitlesCategoriesRecGroups:
     423            mask = VIEW_TITLES |    VIEW_CATEGORIES |   VIEW_RECGROUPS;
     424            break;
     425        case TitlesRecGroups:
     426            mask = VIEW_TITLES |                        VIEW_RECGROUPS;
     427            break;
     428        case Categories:
     429            mask =                  VIEW_CATEGORIES;
     430            break;
     431        case CategoriesRecGroups:
     432            mask =                  VIEW_CATEGORIES |   VIEW_RECGROUPS;
     433            break;
     434        case RecGroups:
     435            mask =                                      VIEW_RECGROUPS;
     436            break;
    370437    }
     438    viewMask = (PlaybackBox::ViewMask)mask;
    371439}
    372440
    373441/* blocks until playing has stopped */
     
    573641        tmp->fillRect(QRect(QPoint(0, 0), size()),
    574642                      QBrush(QColor(10, 10, 10), Dense4Pattern));
    575643    else if (transparentFlag == 1)
    576         tmp->drawPixmap(0, 0, *drawTransPixmap, 0, 0, (int)(800*wmult),
    577                         (int)(600*hmult));
     644    {
     645        int ww, hh;
     646
     647        if (d->IsWideMode())
     648        {
     649            ww = 1280;
     650            hh = 720;
     651        }
     652        else
     653        {
     654            ww = 800;
     655            hh = 600;
     656        }
     657        tmp->drawPixmap(0, 0, *drawTransPixmap, 0, 0, (int)(ww*wmult),
     658                        (int)(hh*hmult));
     659    }
    578660*/
    579661}
    580662void PlaybackBox::updateCurGroup(QPainter *p)
     
    11211203                    ((titleList[titleIndex] != tempInfo->title) &&
    11221204                     ((titleList[titleIndex] == tempInfo->recgroup) ||
    11231205                      (titleList[titleIndex] == tempInfo->category))) ||
    1124                     (!(titleView)))
     1206                    (!(viewMask & VIEW_TITLES)))
    11251207                    tempSubTitle = tempInfo->title;
    11261208                else
    11271209                    tempSubTitle = tempInfo->subtitle;
     
    11321214                        ((titleList[titleIndex] != tempInfo->title) &&
    11331215                         ((titleList[titleIndex] == tempInfo->recgroup) ||
    11341216                          (titleList[titleIndex] == tempInfo->category))) ||
    1135                         (!(titleView))))
     1217                        (!(viewMask & VIEW_TITLES))))
    11361218                {
    11371219                    tempSubTitle = tempSubTitle + " - \"" +
    11381220                        tempInfo->subtitle + "\"";
     
    13431425    QString oldprogramid;
    13441426    QDate oldoriginalAirDate;
    13451427    QDateTime oldstartts;
     1428    int oldrecpriority = 0;
    13461429    p = progLists[oldtitle].at(progIndex);
    13471430    if (p)
    13481431    {
     
    13501433        oldstartts = p->recstartts;
    13511434        oldprogramid = p->programid;
    13521435        oldoriginalAirDate = p->originalAirDate;
     1436        oldrecpriority = p->recpriority;
    13531437    }
    13541438
    13551439    QMap<QString, AvailableStatusType> asCache;
     
    13701454
    13711455    fillRecGroupPasswordCache();
    13721456
     1457    ViewTitleSort titleSort = (ViewTitleSort)gContext->GetNumSetting(
     1458            "DisplayGroupTitleSort", TitleSortAlphabetical);
     1459
    13731460    QMap<QString, QString> sortedList;
    1374     QRegExp prefixes = tr("^(The |A |An )");
    13751461    QString sTitle = "";
    13761462
    13771463    bool LiveTVInAllPrograms = gContext->GetNumSetting("LiveTVInAllPrograms",0);
     
    13941480                 (p->category == recGroup ) &&
    13951481                 ( !recGroupPwCache.contains(p->recgroup))))
    13961482            {
    1397                 if ((titleView) || (useCategories) || (useRecGroups))
     1483                if (viewMask != VIEW_NONE)
    13981484                    progLists[""].prepend(p);
    13991485
    14001486                asKey = p->MakeUniqueKey();
     
    14031489                else
    14041490                    p->availableStatus = asAvailable;
    14051491
    1406                 if (titleView) // Normal title view
     1492                if ((viewMask & VIEW_TITLES)) // Show titles
    14071493                {
    14081494                    progLists[p->title].prepend(p);
    1409                     sTitle = p->title;
    1410                     sTitle.remove(prefixes);
     1495                    sTitle = sortTitle(p->title, viewMask, titleSort,
     1496                            p->recpriority);
    14111497                    sTitle = sTitle.lower();
    14121498                    sortedList[sTitle] = p->title;
    14131499                }
    14141500
    1415                 if (useRecGroups && p->recgroup != "") // Show recording groups                 
     1501                if ((viewMask & VIEW_RECGROUPS) &&
     1502                    p->recgroup != "") // Show recording groups                 
    14161503                {
    14171504                    progLists[p->recgroup].prepend(p);
    14181505                    sortedList[p->recgroup.lower()] = p->recgroup;
    14191506
    1420                     // If another view is also used, unset autodelete as another group will do it.
    1421                     if ((useCategories) || (titleView))
     1507                    // If another view is also used, unset autodelete as
     1508                    // another group will do it.
     1509                    if ((viewMask & ~VIEW_RECGROUPS))
    14221510                        progLists[p->recgroup].setAutoDelete(false);
    14231511                }
    14241512
    1425                 if (useCategories && p->category != "") // Show categories
     1513                if ((viewMask & VIEW_CATEGORIES) &&
     1514                    p->category != "") // Show categories
    14261515                {
    14271516                    progLists[p->category].prepend(p);
    14281517                    sortedList[p->category.lower()] = p->category;
    1429                     // If another view is also used, unset autodelete as another group will do it
    1430                     if ((useRecGroups) || (titleView))
     1518                    // If another view is also used, unset autodelete as
     1519                    // another group will do it
     1520                    if ((viewMask & ~VIEW_CATEGORIES))
    14311521                        progLists[p->category].setAutoDelete(false);
    14321522                }
    14331523            }
     
    14481538        return 0;
    14491539    }
    14501540
    1451     titleList = sortedList.values();
    1452 
    14531541    QString episodeSort = gContext->GetSetting("PlayBoxEpisodeSort", "Date");
    14541542
    14551543    if (episodeSort == "OrigAirDate")
     
    14851573    // titles backwards until we find where we were or go past.  This
    14861574    // is somewhat inefficient, but it works.
    14871575
    1488     QString oldsTitle = oldtitle;
    1489     oldsTitle.remove(prefixes);
     1576    QStringList sTitleList = sortedList.keys();
     1577    titleList = sortedList.values();
     1578
     1579    QString oldsTitle = sortTitle(oldtitle, viewMask, titleSort,
     1580            oldrecpriority);
    14901581    oldsTitle = oldsTitle.lower();
    14911582    titleIndex = titleList.count() - 1;
    1492     for (int i = titleIndex; i >= 0; i--)
     1583    for (titleIndex = titleList.count() - 1; titleIndex >= 0; titleIndex--)
    14931584    {
    1494         sTitle = titleList[i];
    1495         sTitle.remove(prefixes);
     1585        sTitle = sTitleList[titleIndex];
    14961586        sTitle = sTitle.lower();
    14971587       
    14981588        if (oldsTitle > sTitle)
     1589        {
     1590            if (titleIndex + 1 < (int)titleList.count())
     1591                titleIndex++;
    14991592            break;
     1593        }
    15001594
    1501         titleIndex = i;
    1502 
    15031595        if (oldsTitle == sTitle)
    15041596            break;
    15051597    }
     
    22552347 
    22562348    if (inTitle)
    22572349    {
    2258         if (titleView)
     2350        if ((viewMask & VIEW_TITLES))
    22592351            popup->addButton(tr("Toggle playlist for this Category/Title"),
    22602352                             this, SLOT(togglePlayListTitle()));
    22612353        else
     
    32443336    if (expectingPopup)
    32453337        cancelPopup();
    32463338
    3247     if (titleView) titleView = false;
    3248     else titleView = true;
     3339    viewMask = viewMaskToggle(viewMask, VIEW_TITLES);
    32493340
    32503341    playList.clear();
    32513342    connected = FillList();     
     
    34943585        }
    34953586        else if (action == "TOGGLERECORD")
    34963587        {
    3497             if (titleView) titleView = false;
    3498             else titleView = true;
     3588            viewMask = viewMaskToggle(viewMask, VIEW_TITLES);
    34993589            connected = FillList();
    35003590            paintSkipUpdate = false;
    35013591            update(drawTotalBounds);
     
    40404130    int result = recGroupPopup->ExecPopup();
    40414131
    40424132    if (result == MythDialog::Accepted)
    4043         setDefaultView(recGroupComboBox->currentItem());
     4133        setDefaultView((ViewType)recGroupComboBox->currentItem());
    40444134
    40454135    delete recGroupComboBox;
    40464136
  • programs/mythfrontend/globalsettings.cpp

     
    1313#include "dbsettings.h"
    1414#include "langsettings.h"
    1515#include "mpeg/iso639.h"
     16#include "playbackbox.h"
    1617#include "globalsettings.h"
    1718#include "recordingprofile.h"
    1819#include "scheduledrecording.h"
     
    305306    HostComboBox *gc = new HostComboBox("DisplayGroupDefaultView");
    306307    gc->setLabel(QObject::tr("Default View"));
    307308
    308     gc->addSelection(QObject::tr("Show Titles only"), "0");
    309     gc->addSelection(QObject::tr("Show Titles and Categories"), "1");
    310     gc->addSelection(QObject::tr("Show Titles, Categories, and Recording Groups"), "2");
    311     gc->addSelection(QObject::tr("Show Titles and Recording Groups"), "3");
    312     gc->addSelection(QObject::tr("Show Categories only"), "4");
    313     gc->addSelection(QObject::tr("Show Categories and Recording Groups"), "5");
    314     gc->addSelection(QObject::tr("Show Recording Groups only"), "6");
     309    gc->addSelection(QObject::tr("Show Titles only"),
     310            QString::number(PlaybackBox::TitlesOnly));
     311    gc->addSelection(QObject::tr("Show Titles and Categories"),
     312            QString::number(PlaybackBox::TitlesCategories));
     313    gc->addSelection(QObject::tr(
     314                "Show Titles, Categories, and Recording Groups"),
     315            QString::number(PlaybackBox::TitlesCategoriesRecGroups));
     316    gc->addSelection(QObject::tr("Show Titles and Recording Groups"),
     317            QString::number(PlaybackBox::TitlesRecGroups));
     318    gc->addSelection(QObject::tr("Show Categories only"),
     319            QString::number(PlaybackBox::Categories));
     320    gc->addSelection(QObject::tr("Show Categories and Recording Groups"),
     321            QString::number(PlaybackBox::CategoriesRecGroups));
     322    gc->addSelection(QObject::tr("Show Recording Groups only"),
     323            QString::number(PlaybackBox::RecGroups));
    315324
    316325    gc->setHelpText(QObject::tr("Select what type of grouping to show on the Watch Recordings screen "
    317326                    "by default."));
     
    24432452    return gc;
    24442453}
    24452454
     2455class DefaultViewSettings: public VerticalConfigurationGroup,
     2456                           public TriggeredConfigurationGroup {
     2457public:
     2458    DefaultViewSettings():
     2459            VerticalConfigurationGroup(false, false, true, true),
     2460            TriggeredConfigurationGroup(false) {
     2461
     2462        HostComboBox *defaultView = DefaultView();
     2463        addChild(defaultView);
     2464        setTrigger(defaultView);
     2465
     2466        HostComboBox *titleSort = new HostComboBox("DisplayGroupTitleSort");
     2467        titleSort->setLabel(tr("Sort Titles"));
     2468        titleSort->addSelection(tr("Alphabetically"),
     2469                QString::number(PlaybackBox::TitleSortAlphabetical));
     2470        titleSort->addSelection(tr("By Recording Priority"),
     2471                QString::number(PlaybackBox::TitleSortRecPriority));
     2472
     2473        for (unsigned int ii = 0; ii < PlaybackBox::ViewTypes; ii++)
     2474        {
     2475            if (ii == PlaybackBox::TitlesOnly)
     2476                addTarget(QString::number(ii), titleSort);
     2477            else
     2478                addTarget(QString::number(ii),
     2479                        new VerticalConfigurationGroup(false, false));
     2480        }
     2481    }
     2482};
     2483
    24462484static HostCheckBox *PVR350OutputEnable()
    24472485{
    24482486    HostCheckBox *gc = new HostCheckBox("PVR350OutputEnable");
     
    32663304    pbox2->addChild(RememberRecGroup());
    32673305    pbox2->addChild(UseGroupNameAsAllPrograms());
    32683306    pbox2->addChild(LiveTVInAllPrograms());
    3269     pbox2->addChild(DefaultView());
     3307    pbox2->addChild(new DefaultViewSettings());
    32703308    addChild(pbox2);
    32713309
    32723310    addChild(new HwDecSettings());
     
    34993537    addChild(xboxset);
    35003538}
    35013539
     3540// 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
     
    4243        Delete,
    4344    } BoxType;
    4445
    45     typedef enum
    46     {
    47         TitlesOnly,
    48         TitlesCategories,
    49         TitlesCategoriesRecGroups,
    50         TitlesRecGroups,
    51         Categories,
    52         CategoriesRecGroups,
    53         RecGroups,
     46    // ViewType values cannot change; they are stored in the database.
     47    typedef enum {
     48        TitlesOnly = 0,
     49        TitlesCategories = 1,
     50        TitlesCategoriesRecGroups = 2,
     51        TitlesRecGroups = 3,
     52        Categories = 4,
     53        CategoriesRecGroups = 5,
     54        RecGroups = 6,
     55        ViewTypes,                  // placeholder value, not in database
    5456    } ViewType;
    5557
     58    // Sort function when TitlesOnly. Values are stored in database.
     59    typedef enum {
     60        TitleSortAlphabetical = 0,
     61        TitleSortRecPriority = 1,
     62        TitleSortMethods,           // placeholder value, not in database
     63    } ViewTitleSort;
     64
     65    typedef enum {
     66        VIEW_NONE       =  0x00,
     67        VIEW_TITLES     =  0x01,
     68        VIEW_CATEGORIES =  0x02,
     69        VIEW_RECGROUPS  =  0x04,
     70        VIEW_ALL        = ~0x00,
     71    } ViewMask;
     72
    5673    typedef enum
    5774    {
    5875        EndOfRecording,
     
    272289    void updateCurGroup(QPainter *p);
    273290    void updateGroupInfo(QPainter *p, QRect& pr, QPixmap& pix,
    274291                         QString cont_name = "group_info");
    275     void setDefaultView(int defaultView);
     292    void setDefaultView(ViewType defaultView);
    276293
    277294    // Settings ///////////////////////////////////////////////////////////////
    278295    /// If "Play"  this is a recording playback selection UI,
     
    304321    QString             recGroup;
    305322    QString             recGroupPassword;
    306323    QString             curGroupPassword;
     324    ViewMask            viewMask;
    307325
    308326    // Theme parsing variables
    309327    XMLParse           *theme;
  • programs/mythbackend/mainserver.cpp

     
    9811010                       "recorded.basename, recorded.progstart, "
    9821011                       "recorded.progend, recorded.stars, "
    9831012                       "recordedprogram.stereo, recordedprogram.hdtv, "
    984                        "recordedprogram.closecaptioned, transcoded "
     1013                       "recordedprogram.closecaptioned, transcoded, "
     1014                       "recorded.recpriority "
    9851015                       "FROM recorded "
    9861016                       "LEFT JOIN record ON recorded.recordid = record.recordid "
    9871017                       "LEFT JOIN channel ON recorded.chanid = channel.chanid "
     
    11001130            proginfo->recgroup = query.value(16).toString();
    11011131            proginfo->playgroup = query.value(27).toString();
    11021132
     1133            proginfo->recpriority = query.value(36).toInt();
     1134
    11031135            proginfo->recstatus = rsRecorded;
    11041136            if (proginfo->recendts > rectime)
    11051137            {