9
12
#include <QWaitCondition>
11
#include "playbackbox.h"
12
#include "playbackboxlistitem.h"
15
15
#include "oldsettings.h"
16
#include "NuppelVideoPlayer.h"
19
#include "mythcontext.h"
20
16
#include "mythdb.h"
21
17
#include "mythdbcon.h"
22
18
#include "mythverbose.h"
23
#include "NuppelVideoPlayer.h"
23
24
#include "recordinginfo.h"
24
#include "remoteutil.h"
25
25
#include "tvremoteutil.h"
26
26
#include "previewgenerator.h"
27
27
#include "playgroup.h"
28
#include "customedit.h"
30
#include "mythcontext.h"
31
#include "remoteutil.h"
31
35
#include "mythuihelper.h"
32
36
#include "mythuitext.h"
33
37
#include "mythuibutton.h"
39
43
#include "mythuicheckbox.h"
40
44
#include "mythuiprogressbar.h"
47
#include "playbackboxlistitem.h"
49
#include "customedit.h"
42
51
#define LOC QString("PlaybackBox: ")
43
52
#define LOC_ERR QString("PlaybackBox Error: ")
207
216
// Deal with QMap sorting. Positive recpriority values have a
208
217
// '+' prefix (QMap alphabetically sorts before '-'). Positive
209
// recpriority values are "inverted" by substracting them from
218
// recpriority values are "inverted" by subtracting them from
210
219
// 1000, so that high recpriorities are sorted first (QMap
211
220
// alphabetically). For example:
374
383
if (m_fillListTimer)
376
385
m_fillListTimer->disconnect(this);
377
m_fillListTimer->deleteLater();
378
386
m_fillListTimer = NULL;
381
389
if (m_freeSpaceTimer)
383
391
m_freeSpaceTimer->disconnect(this);
384
m_freeSpaceTimer->deleteLater();
385
392
m_freeSpaceTimer = NULL;
388
395
clearProgramCache();
391
delete m_currentItem;
397
delete m_currentItem;
393
399
// disconnect preview generators
394
400
QMutexLocker locker(&m_previewGeneratorLock);
592
598
QString rating = QString::number((int)((pginfo->stars * 10.0) + 0.5));
594
600
item->DisplayState(rating, "ratingstate");
596
602
QString oldimgfile = item->GetImage("preview");
597
QString imagefile = QString::null;
598
604
if (oldimgfile.isEmpty() || force_preview_reload)
599
605
imagefile = getPreviewImage(pginfo);
774
780
void PlaybackBox::updateUsage()
776
vector<FileSystemInfo> fsInfos;
777
if (m_freeSpaceNeedsUpdate && m_connected)
782
MythUIText *freereportText = dynamic_cast<MythUIText *>
783
(GetChild("freereport"));
784
MythUIProgressBar *usedProgress = dynamic_cast<MythUIProgressBar *>
785
(GetChild("usedbar"));
787
// If the theme doesn't have these widgets,
788
// don't waste time querying the backend...
789
if (!freereportText && !usedProgress)
792
if (m_freeSpaceNeedsUpdate || m_connected)
779
794
m_freeSpaceNeedsUpdate = false;
780
795
m_freeSpaceTotal = 0;
781
796
m_freeSpaceUsed = 0;
783
fsInfos = RemoteGetFreeSpace();
784
for (unsigned int i = 0; i < fsInfos.size(); i++)
798
vector<FileSystemInfo> fsInfos = RemoteGetFreeSpace();
799
for (unsigned int i = 0; i < fsInfos.size(); ++i)
786
801
if (fsInfos[i].directory == "TotalDiskSpace")
806
821
QString rep = tr(", %1 GB free").arg(size);
807
822
usestr = usestr + rep;
809
MythUIText *m_freeSpaceText = dynamic_cast<MythUIText *>
810
(GetChild("freereport"));
812
m_freeSpaceText->SetText(usestr);
825
freereportText->SetText(usestr);
814
MythUIProgressBar *m_freeSpaceProgress = dynamic_cast<MythUIProgressBar *>
815
(GetChild("usedbar"));
816
if (m_freeSpaceProgress)
818
m_freeSpaceProgress->SetUsed(m_freeSpaceUsed);
819
m_freeSpaceProgress->SetTotal(m_freeSpaceTotal);
829
usedProgress->SetTotal(m_freeSpaceTotal);
830
usedProgress->SetUsed(m_freeSpaceUsed);
899
910
ProgramList &progList = *pmit;
901
static const char *disp_flags[] = { "playlist", "watched", };
912
static const char *disp_flags[] = { "playlist", "watched", "preserve",
913
"cutlist", "autoexpire", "editing",
914
"bookmark", "inuse", "commflagged",
902
916
bool disp_flag_stat[sizeof(disp_flags)/sizeof(char*)];
918
QMap<AudioProps, QString> audioFlags;
919
audioFlags[AUD_DOLBY] = "dolby";
920
audioFlags[AUD_SURROUND] = "surround";
921
audioFlags[AUD_STEREO] = "stereo";
922
audioFlags[AUD_MONO] = "mono";
924
QMap<VideoProps, QString> videoFlags;
925
videoFlags[VID_1080] = "hd1080";
926
videoFlags[VID_720] = "hd720";
927
videoFlags[VID_HDTV] = "hdtv";
928
videoFlags[VID_WIDESCREEN] = "widescreen";
930
QMap<SubtitleTypes, QString> subtitleFlags;
931
subtitleFlags[SUB_SIGNED] = "deafsigned";
932
subtitleFlags[SUB_ONSCREEN] = "onscreensub";
933
subtitleFlags[SUB_NORMAL] = "subtitles";
934
subtitleFlags[SUB_HARDHEAR] = "cc";
904
936
ProgramList::iterator it = progList.begin();
905
for (; it != progList.end(); it++)
937
for (; it != progList.end(); ++it)
907
939
MythUIButtonListItem *item =
908
940
new PlaybackBoxListItem(this, m_recordingList, *it);
927
959
QString tempShortDate = ((*it)->recstartts).toString(m_formatShortDate);
928
960
QString tempLongDate = ((*it)->recstartts).toString(m_formatLongDate);
930
QString state = ((*it)->recstatus == rsRecording) ?
931
QString("running") : QString::null;
963
if ((*it)->recstatus == rsRecording)
933
966
if ((((*it)->recstatus != rsRecording) &&
934
967
((*it)->availableStatus != asAvailable) &&
955
988
disp_flag_stat[0] = !m_playList.filter((*it)->MakeUniqueKey()).empty();
956
989
disp_flag_stat[1] = (*it)->programflags & FL_WATCHED;
958
for (uint i = 0; i < sizeof(disp_flags) / sizeof(char*); i++)
990
disp_flag_stat[2] = (*it)->programflags & FL_PRESERVED;
991
disp_flag_stat[3] = (*it)->programflags & FL_CUTLIST;
992
disp_flag_stat[4] = (*it)->programflags & FL_AUTOEXP;
993
disp_flag_stat[5] = (*it)->programflags & FL_EDITING;
994
disp_flag_stat[6] = (*it)->programflags & FL_BOOKMARK;
995
disp_flag_stat[7] = (*it)->programflags & FL_INUSEPLAYING;
996
disp_flag_stat[8] = (*it)->programflags & FL_COMMFLAG;
997
disp_flag_stat[9] = (*it)->programflags & FL_TRANSCODED;
999
for (uint i = 0; i < sizeof(disp_flags) / sizeof(char*); ++i)
959
1000
item->DisplayState(disp_flag_stat[i]?"yes":"no", disp_flags[i]);
1002
QMap<AudioProps, QString>::iterator ait;
1003
for (ait = audioFlags.begin(); ait != audioFlags.end(); ++ait)
1005
if ((*it)->audioproperties & ait.key())
1006
item->DisplayState(ait.value(), "audioprops");
1009
QMap<VideoProps, QString>::iterator vit;
1010
for (vit = videoFlags.begin(); vit != videoFlags.end(); ++vit)
1012
if ((*it)->videoproperties & vit.key())
1013
item->DisplayState(vit.value(), "videoprops");
1016
QMap<SubtitleTypes, QString>::iterator sit;
1017
for (sit = subtitleFlags.begin(); sit != subtitleFlags.end(); ++sit)
1019
if ((*it)->subtitleType & sit.key())
1020
item->DisplayState(sit.value(), "subtitletypes");
961
1023
if (m_currentItem &&
962
1024
(m_currentItem->chanid == (*it)->chanid) &&
1044
1106
QMap<QString, QString> sortedList;
1045
1107
QMap<int, QString> searchRule;
1046
1108
QMap<int, int> recidEpisodes;
1049
1110
m_progCacheLock.lock();
1050
1111
if (!useCachedData || !m_progCache || m_progCache->empty())
1651
1714
showAvailablePopup(pginfo);
1654
ProgramInfo *pi = pginfo;
1659
1718
MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
1660
CustomEdit *ce = new CustomEdit(mainStack, pi);
1719
CustomEdit *ce = new CustomEdit(mainStack, pginfo);
1661
1720
if (ce->Create())
1662
1721
mainStack->AddScreen(ce);
1916
1975
QStringList entries = dir.entryList();
1918
1977
int regIndex = 0;
1919
titleIn.replace(" ", "(?:\\s|-|_|\\.)?");
1978
titleIn.replace(' ', "(?:\\s|-|_|\\.)?");
1920
1979
QString regs[] = {
1921
1980
QString("%1" // title
1922
1981
"(?:\\s|-|_|\\.)?" // optional separator
2260
2319
jobTitle = gContext->GetSetting("UserJobDesc1");
2262
2321
if (!isRunningUserJob1)
2263
m_popupMenu->AddButton(tr("Begin") + " " + jobTitle,
2322
m_popupMenu->AddButton(tr("Begin") + ' ' + jobTitle,
2264
2323
SLOT(doPlaylistBeginUserJob1()));
2266
m_popupMenu->AddButton(tr("Stop") + " " + jobTitle,
2325
m_popupMenu->AddButton(tr("Stop") + ' ' + jobTitle,
2267
2326
SLOT(stopPlaylistUserJob1()));
2273
2332
jobTitle = gContext->GetSetting("UserJobDesc2");
2275
2334
if (!isRunningUserJob2)
2276
m_popupMenu->AddButton(tr("Begin") + " " + jobTitle,
2335
m_popupMenu->AddButton(tr("Begin") + ' ' + jobTitle,
2277
2336
SLOT(doPlaylistBeginUserJob2()));
2279
m_popupMenu->AddButton(tr("Stop") + " " + jobTitle,
2338
m_popupMenu->AddButton(tr("Stop") + ' ' + jobTitle,
2280
2339
SLOT(stopPlaylistUserJob2()));
2286
2345
jobTitle = gContext->GetSetting("UserJobDesc3");
2288
2347
if (!isRunningUserJob3)
2289
m_popupMenu->AddButton(tr("Begin") + " " + jobTitle,
2348
m_popupMenu->AddButton(tr("Begin") + ' ' + jobTitle,
2290
2349
SLOT(doPlaylistBeginUserJob3()));
2292
m_popupMenu->AddButton(tr("Stop") + " " + jobTitle,
2351
m_popupMenu->AddButton(tr("Stop") + ' ' + jobTitle,
2293
2352
SLOT(stopPlaylistUserJob3()));
2361
2420
if (m_popupMenu)
2365
if (m_playList.size() > 1)
2366
label = tr("There are %1 items in the playlist.").arg(m_playList.size());
2368
label = tr("There is %1 item in the playlist.").arg(m_playList.size());
2371
label.append(tr("Actions affect all items in the playlist"));
2423
QString label = tr("There is %n item(s) in the playlist. Actions affect "
2424
"all items in the playlist", "", m_playList.size());
2373
2426
return createPopupMenu(label);
2478
2531
if (JobQueue::IsJobQueuedOrRunning(JOB_USERJOB1, pginfo->chanid,
2479
2532
pginfo->recstartts))
2480
m_popupMenu->AddButton(tr("Stop") + " " + jobTitle,
2533
m_popupMenu->AddButton(tr("Stop") + ' ' + jobTitle,
2481
2534
SLOT(doBeginUserJob1()));
2483
m_popupMenu->AddButton(tr("Begin") + " " + jobTitle,
2536
m_popupMenu->AddButton(tr("Begin") + ' ' + jobTitle,
2484
2537
SLOT(doBeginUserJob1()));
2492
2545
if (JobQueue::IsJobQueuedOrRunning(JOB_USERJOB2, pginfo->chanid,
2493
2546
pginfo->recstartts))
2494
m_popupMenu->AddButton(tr("Stop") + " " + jobTitle,
2547
m_popupMenu->AddButton(tr("Stop") + ' ' + jobTitle,
2495
2548
SLOT(doBeginUserJob2()));
2497
m_popupMenu->AddButton(tr("Begin") + " " + jobTitle,
2550
m_popupMenu->AddButton(tr("Begin") + ' ' + jobTitle,
2498
2551
SLOT(doBeginUserJob2()));
2506
2559
if (JobQueue::IsJobQueuedOrRunning(JOB_USERJOB3, pginfo->chanid,
2507
2560
pginfo->recstartts))
2508
m_popupMenu->AddButton(tr("Stop") + " " + jobTitle,
2561
m_popupMenu->AddButton(tr("Stop") + ' ' + jobTitle,
2509
2562
SLOT(doBeginUserJob3()));
2511
m_popupMenu->AddButton(tr("Begin") + " " + jobTitle,
2564
m_popupMenu->AddButton(tr("Begin") + ' ' + jobTitle,
2512
2565
SLOT(doBeginUserJob3()));
2520
2573
if (JobQueue::IsJobQueuedOrRunning(JOB_USERJOB4, pginfo->chanid,
2521
2574
pginfo->recstartts))
2522
m_popupMenu->AddButton(tr("Stop") + " " + jobTitle,
2575
m_popupMenu->AddButton(tr("Stop") + ' ' + jobTitle,
2523
2576
SLOT(doBeginUserJob4()));
2525
m_popupMenu->AddButton(tr("Begin") + " " + jobTitle,
2578
m_popupMenu->AddButton(tr("Begin") + ' ' + jobTitle,
2526
2579
SLOT(doBeginUserJob4()));
2935
2988
if ((key.isEmpty()) || (key.indexOf('_') < 0))
2938
keyParts = key.split("_");
2991
keyParts = key.split('_');
2940
2993
// ProgramInfo::MakeUniqueKey() has 2 parts separated by '_' characters
2941
2994
if (keyParts.size() == 2)
3244
3297
QStringList actions;
3245
3298
handled = GetMythMainWindow()->TranslateKeyPress("TV Frontend", event, actions);
3247
for (int i = 0; i < actions.size() && !handled; i++)
3300
for (int i = 0; i < actions.size() && !handled; ++i)
3249
3302
QString action = actions[i];
3250
3303
handled = true;
3370
3423
vector<ProgramInfo *>::iterator i = m_progCache->begin();
3371
for ( ; i != m_progCache->end(); i++)
3424
for ( ; i != m_progCache->end(); ++i)
3373
3426
if (((*i)->chanid == tokens[2]) &&
3374
3427
((*i)->recstartts.toString(Qt::ISODate) == tokens[3]))
3862
3915
displayGroups.sort();
3863
3916
QStringList::iterator it;
3864
for (it = displayGroups.begin(); it != displayGroups.end(); it++)
3917
for (it = displayGroups.begin(); it != displayGroups.end(); ++it)
3865
3918
displayNames.append(*it);
3866
for (it = groups.begin(); it != groups.end(); it++)
3919
for (it = groups.begin(); it != groups.end(); ++it)
3867
3920
groupNames.append(*it);
3869
3922
QString label = tr("Change Filter");
4576
4628
//////////////////////////////////////////
4578
4630
HelpPopup::HelpPopup(MythScreenStack *lparent)
4579
: MythScreenType(lparent, "helppopup")
4631
: MythScreenType(lparent, "helppopup"),