Ticket #6093: playback-box-fast-v1.patch

File playback-box-fast-v1.patch, 10.5 KB (added by danielk, 12 years ago)

proof-of-concept patch

  • programs/mythfrontend/playbackbox.cpp

     
    605605    SetTextFromMap(this, infoMap);
    606606    m_currentMap = infoMap;
    607607
     608    static const char *disp_flags[] =
     609    {
     610        "transcoding",
     611        "commflagging",
     612    };
     613    const bool disp_flag_stat[] =
     614    {
     615        !JobQueue::IsJobQueuedOrRunning(
     616            JOB_TRANSCODE, pginfo->chanid, pginfo->recstartts),
     617        !JobQueue::IsJobQueuedOrRunning(
     618            JOB_COMMFLAG, pginfo->chanid, pginfo->recstartts),
     619    };
     620
     621    for (uint i = 0; i < sizeof(disp_flags) / sizeof(char*); i++)
     622        item->DisplayState(disp_flag_stat[i]?"yes":"no", disp_flags[i]);
     623
    608624    if (m_previewImage)
    609625    {
    610626        m_previewImage->SetVisible(true);
    611627        QString imagefile = getPreviewImage(pginfo);
     628        item->SetImage(imagefile, "preview");
    612629        m_previewImage->SetFilename(imagefile);
    613630        m_previewImage->Load();
    614631    }
     
    818835    }
    819836}
    820837
    821 void PlaybackBox::updateRecList(MythUIButtonListItem *item)
     838void PlaybackBox::updateRecList(MythUIButtonListItem *sel_item)
    822839{
    823     if (!item)
     840    if (!sel_item)
    824841        return;
    825842
    826     QString groupname = item->GetData().toString();
     843    QString groupname = sel_item->GetData().toString();
    827844
    828845    updateGroupInfo(groupname);
    829846
    830     if (m_currentGroup == groupname)
    831     {
    832         if (!m_needUpdate)
    833             return;
    834     }
     847    if ((m_currentGroup == groupname) && !m_needUpdate)
     848        return;
    835849
    836850    m_needUpdate = false;
    837851
     
    843857    if (groupname == "default")
    844858        groupname = "";
    845859
    846     ProgramList *progList = NULL;
    847     progList = &m_progLists[groupname];
    848 
    849     if (!progList)
     860    ProgramMap::iterator pmit = m_progLists.find(groupname);
     861    if (pmit == m_progLists.end())
    850862        return;
    851863
    852     QString tempSubTitle;
    853     QString tempShortDate;
    854     QString tempLongDate;
    855     QString tempTime;
    856     QString tempSize;
     864    ProgramList &progList = *pmit;
    857865
    858     QString match;
     866    LCD    *lcddev   = LCD::Get();
     867    QString lcdTitle = "Recordings";
     868    if (lcddev && GetFocusWidget() != m_groupList)
     869        lcdTitle = " <<" + groupname;
    859870
    860     LCD *lcddev = LCD::Get();
    861     QString lcdTitle;
    862871    QList<LCDMenuItem> lcdItems;
    863872
    864     if (lcddev)
     873    static const char *disp_flags[] =
    865874    {
    866         if (GetFocusWidget() == m_groupList)
    867             lcdTitle = "Recordings";
    868         else
    869             lcdTitle = " <<" + groupname;
    870     }
     875        "playlist",
     876        "watched",
     877    };
     878    bool disp_flag_stat[sizeof(disp_flags)/sizeof(char*)];
    871879
    872     if (!progList->isEmpty())
     880    ProgramList::iterator it = progList.begin();
     881    for (; it != progList.end(); it++)
    873882    {
    874         ProgramInfo *progInfo;
    875         ProgramList::iterator it;
    876         for (it = progList->begin(); it != progList->end(); it++)
    877         {
    878             progInfo = *it;
     883        MythUIButtonListItem *item = new MythUIButtonListItem(
     884            m_recordingList, "", qVariantFromValue(*it));
    879885
    880             item = new MythUIButtonListItem(m_recordingList, "",
    881                                                 qVariantFromValue(progInfo));
    882 
    883             if (groupname != progInfo->title)
     886        QString tempSubTitle;
     887        if (groupname != (*it)->title)
     888        {
     889            tempSubTitle = (*it)->title;
     890            if (!(*it)->subtitle.trimmed().isEmpty())
    884891            {
    885                 tempSubTitle = progInfo->title;
    886                 if (!progInfo->subtitle.trimmed().isEmpty())
    887                     tempSubTitle = QString("%1 - \"%2\"")
    888                                     .arg(tempSubTitle).arg(progInfo->subtitle);
     892                tempSubTitle = QString("%1 - \"%2\"")
     893                    .arg(tempSubTitle).arg((*it)->subtitle);
    889894            }
    890             else
    891             {
    892                 tempSubTitle = progInfo->subtitle;
    893                 if (tempSubTitle.trimmed().isEmpty())
    894                     tempSubTitle = progInfo->title;
    895             }
     895        }
     896        else
     897        {
     898            tempSubTitle = (*it)->subtitle;
     899            if (tempSubTitle.trimmed().isEmpty())
     900                tempSubTitle = (*it)->title;
     901        }
    896902
    897             tempShortDate = (progInfo->recstartts).toString(m_formatShortDate);
    898             tempLongDate = (progInfo->recstartts).toString(m_formatLongDate);
    899             tempTime = (progInfo->recstartts).toString(m_formatTime);
     903        QString tempShortDate = ((*it)->recstartts).toString(m_formatShortDate);
     904        QString tempLongDate  = ((*it)->recstartts).toString(m_formatLongDate);
     905        QString tempTime      = ((*it)->recstartts).toString(m_formatTime);
     906        QString tempSize      = tr("%1 GB")
     907            .arg((*it)->filesize * (1.0/(1024.0*1024.0*1024.0)), 0, 'f', 2);
    900908
    901             long long size = progInfo->filesize;
    902             tempSize.sprintf("%0.2f GB", size / 1024.0 / 1024.0 / 1024.0);
     909        QString state = ((*it)->recstatus == rsRecording) ?
     910            QString("running") : QString::null;
    903911
    904             QString state;
     912        if ((((*it)->recstatus != rsRecording) &&
     913             ((*it)->availableStatus != asAvailable) &&
     914             ((*it)->availableStatus != asNotYetAvailable)) ||
     915            (m_player && m_player->IsSameProgram(0, *it)))
     916        {
     917            state = "disabled";
     918        }
    905919
    906             if (progInfo->recstatus == rsRecording)
    907                 state = "running";
     920        if (lcddev && !(GetFocusWidget() == m_groupList))
     921        {
     922            QString lcdSubTitle = tempSubTitle;
     923            QString lcdStr = QString("%1 %2")
     924                .arg(lcdSubTitle.replace('"', "'")).arg(tempShortDate);
     925            LCDMenuItem lcdItem(m_currentItem == *it, NOTCHECKABLE, lcdStr);
     926            lcdItems.push_back(lcdItem);
     927        }
    908928
    909             if (((progInfo->recstatus != rsRecording) &&
    910                     (progInfo->availableStatus != asAvailable) &&
    911                     (progInfo->availableStatus != asNotYetAvailable)) ||
    912                 (m_player && m_player->IsSameProgram(0, progInfo)))
    913                 state = "disabled";
     929        item->SetText(tempSubTitle,       "titlesubtitle", state);
     930        item->SetText((*it)->title,       "title",         state);
     931        item->SetText((*it)->subtitle,    "subtitle",      state);
     932        item->SetText((*it)->description, "description",   state);
     933        item->SetText(tempLongDate,       "longdate",      state);
     934        item->SetText(tempShortDate,      "shortdate",     state);
     935        item->SetText(tempTime,           "time",          state);
     936        item->SetText(tempSize,           "size",          state);
    914937
    915             if (lcddev && !(GetFocusWidget() == m_groupList))
    916             {
    917                 QString lcdSubTitle = tempSubTitle;
    918                 lcdItems.append(LCDMenuItem(m_currentItem == progInfo,
    919                                 NOTCHECKABLE, QString("%1 %2")
    920                                             .arg(lcdSubTitle.replace('"', "'"))
    921                                             .arg(tempShortDate)));
    922             }
     938        item->DisplayState(state, "status");
    923939
    924             QString imagefile = getPreviewImage(progInfo);
    925             item->SetImage(imagefile, "preview");
     940        disp_flag_stat[0] = !m_playList.filter((*it)->MakeUniqueKey()).empty();
     941        disp_flag_stat[1] = (*it)->programflags & FL_WATCHED;
    926942
    927             item->SetText(tempSubTitle, "titlesubtitle", state);
    928             item->SetText(progInfo->title, "title", state);
    929             item->SetText(progInfo->subtitle, "subtitle", state);
    930             item->SetText(progInfo->description, "description", state);
    931             item->SetText(tempLongDate, "longdate", state);
    932             item->SetText(tempShortDate, "shortdate", state);
    933             item->SetText(tempTime, "time", state);
    934             item->SetText(tempSize, "size", state);
     943        for (uint i = 0; i < sizeof(disp_flags) / sizeof(char*); i++)
     944            item->DisplayState(disp_flag_stat[i]?"yes":"no", disp_flags[i]);
    935945
    936             item->DisplayState(state, "status");
    937 
    938             if (m_playList.filter(progInfo->MakeUniqueKey()).size())
    939                 item->DisplayState("yes", "playlist");
    940             else
    941                 item->DisplayState("no", "playlist");
    942 
    943             if (progInfo->programflags & FL_WATCHED)
    944                 item->DisplayState("yes", "watched");
    945             else
    946                 item->DisplayState("no", "watched");
    947 
    948             if (!JobQueue::IsJobQueuedOrRunning(JOB_TRANSCODE,
    949                                        progInfo->chanid, progInfo->recstartts))
    950                 item->DisplayState("yes", "transcoding");
    951             else
    952                 item->DisplayState("no", "transcoding");
    953 
    954             if (!JobQueue::IsJobQueuedOrRunning(JOB_COMMFLAG,
    955                                        progInfo->chanid, progInfo->recstartts))
    956                 item->DisplayState("yes", "commflagging");
    957             else
    958                 item->DisplayState("no", "commflagging");
    959 
    960 
    961              //item->DisplayState("", "expiry");
    962 
    963             if (m_currentItem &&
    964                 (m_currentItem->chanid == progInfo->chanid) &&
    965                 (m_currentItem->recstartts == progInfo->recstartts))
    966                     m_recordingList->SetItemCurrent(item);
     946        if (m_currentItem &&
     947            (m_currentItem->chanid     == (*it)->chanid) &&
     948            (m_currentItem->recstartts == (*it)->recstartts))
     949        {
     950            m_recordingList->SetItemCurrent(item);
    967951        }
    968952    }
    969953
    970954    if (lcddev && !lcdItems.isEmpty())
    971955        lcddev->switchToMenu(lcdItems, lcdTitle);
    972956
    973     if (m_noRecordingsText && !progList->isEmpty())
     957    if (m_noRecordingsText)
    974958    {
    975         m_progCacheLock.lock();
    976         if (m_progCache && !m_progCache->empty())
    977             m_noRecordingsText->SetText(tr(
    978                 "There are no recordings in your current view"));
     959        if (!progList.isEmpty())
     960            m_noRecordingsText->SetVisible(false);
    979961        else
    980             m_noRecordingsText->SetText(tr(
    981                 "There are no recordings available"));
    982         m_progCacheLock.unlock();
     962        {
     963            QMutexLocker locker(&m_progCacheLock);
     964            QString txt = (m_progCache && !m_progCache->empty()) ?
     965                tr("There are no recordings in your current view") :
     966                tr("There are no recordings available");
     967            m_noRecordingsText->SetText(txt);
     968            m_noRecordingsText->SetVisible(true);
     969        }
    983970    }
    984 
    985     m_noRecordingsText->SetVisible(progList->isEmpty());
    986971}
    987972
    988973void PlaybackBox::listChanged(void)