/
playbackbox.h
553 lines (442 loc) · 17.1 KB
/
playbackbox.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
// -*- Mode: c++ -*-
// vim:set sw=4 ts=4 expandtab:
#ifndef PLAYBACKBOX_H_
#define PLAYBACKBOX_H_
// ANSI C headers
#include <stdint.h> // for [u]int[32,64]_t
// C++ headers
#include <vector>
#include <deque>
using namespace std;
#include <QStringList>
#include <QDateTime>
#include <QObject>
#include <QMutex>
#include <QMap>
#include <QSet>
#include "jobqueue.h"
#include "tv_play.h"
#include "mythscreentype.h"
// mythfrontend
#include "schedulecommon.h"
#include "programinfocache.h"
#include "playbackboxhelper.h"
class QKeyEvent;
class QEvent;
class QTimer;
class MythPlayer;
class RingBuffer;
class ProgramInfo;
class MythUIButtonList;
class MythUIButtonListItem;
class MythUIImage;
class MythUIText;
class MythUITextEdit;
class MythUIButton;
class MythDialogBox;
typedef QMap<QString,ProgramList> ProgramMap;
typedef QMap<QString,QString> Str2StrMap;
enum {
kArtworkFanTimeout = 0,//300,
kArtworkBannerTimeout = 0,//50,
kArtworkCoverTimeout = 0,//50,
};
class PlaybackBox : public ScheduleCommon
{
Q_OBJECT
friend class PlaybackBoxListItem;
public:
typedef enum
{
kPlayBox,
kDeleteBox,
} BoxType;
// ViewType values cannot change; they are stored in the database.
typedef enum {
TitlesOnly = 0,
TitlesCategories = 1,
TitlesCategoriesRecGroups = 2,
TitlesRecGroups = 3,
Categories = 4,
CategoriesRecGroups = 5,
RecGroups = 6,
ViewTypes, // placeholder value, not in database
} ViewType;
// Sort function when TitlesOnly. Values are stored in database.
typedef enum {
TitleSortAlphabetical = 0,
TitleSortRecPriority = 1,
TitleSortMethods, // placeholder value, not in database
} ViewTitleSort;
typedef enum {
VIEW_NONE = 0x0000,
VIEW_TITLES = 0x0001,
VIEW_CATEGORIES = 0x0002,
VIEW_RECGROUPS = 0x0004,
VIEW_WATCHLIST = 0x0008,
VIEW_SEARCHES = 0x0010,
VIEW_LIVETVGRP = 0x0020,
// insert new entries above here
VIEW_WATCHED = 0x8000
} ViewMask;
typedef enum
{
kDeleteRecording,
kStopRecording,
kForceDeleteRecording,
} DeletePopupType;
typedef enum
{
kNoFlags = 0x00,
kForgetHistory = 0x01,
kForce = 0x02,
kIgnore = 0x04,
kAllRemaining = 0x08,
} DeleteFlags;
typedef enum
{
kNvpToPlay,
kNvpToStop,
kDone
} killStateType;
PlaybackBox(MythScreenStack *parent, QString name, BoxType ltype,
TV *player = NULL, bool showTV = false);
~PlaybackBox(void);
bool Create(void);
virtual void Load(void);
virtual void Init(void);
bool keyPressEvent(QKeyEvent *);
void customEvent(QEvent *event);
void setInitialRecGroup(QString initialGroup) { m_recGroup = initialGroup; }
static void * RunPlaybackBox(void *player, bool);
public slots:
void displayRecGroup(const QString &newRecGroup = "");
void groupSelectorClosed(void);
protected slots:
void updateRecList(MythUIButtonListItem *);
void ItemSelected(MythUIButtonListItem *item)
{ UpdateUIListItem(item, true); }
void ItemVisible(MythUIButtonListItem *item);
void selected(MythUIButtonListItem *item);
void PlayFromBookmark(MythUIButtonListItem *item = NULL);
void PlayFromBeginning(MythUIButtonListItem *item = NULL);
void deleteSelected(MythUIButtonListItem *item);
void SwitchList(void);
void ShowGroupPopup(void);
void customEdit();
void upcoming();
void details();
void StopSelected(void);
void showMetadataEditor();
void showGroupFilter();
void showRecGroupPasswordChanger();
void showPlayFromPopup();
void showRecordingPopup();
void showJobPopup();
void showTranscodingProfiles();
void changeProfileAndTranscode(int id);
void showStoragePopup();
void showPlaylistPopup();
void showPlaylistStoragePopup();
void showPlaylistJobPopup();
void showProgramDetails();
void showIconHelp();
void ShowRecGroupChangerUsePlaylist(void) { ShowRecGroupChanger(true); }
void ShowPlayGroupChangerUsePlaylist(void) { ShowPlayGroupChanger(true); }
void ShowRecGroupChanger(bool use_playlist = false);
void ShowPlayGroupChanger(bool use_playlist = false);
void popupClosed(QString which, int reason);
void doPlayListRandom();
void askStop();
void doEditScheduled();
void doAllowRerecord();
void askDelete();
void Undelete(void);
void Delete(DeleteFlags = kNoFlags);
void DeleteForgetHistory(void) { Delete(kForgetHistory); }
void DeleteForce(void) { Delete(kForce); }
void DeleteIgnore(void) { Delete(kIgnore); }
void DeleteForceAllRemaining(void)
{ Delete((DeleteFlags)((int)kForce |(int)kAllRemaining)); }
void DeleteIgnoreAllRemaining(void)
{ Delete((DeleteFlags)((int)kIgnore|(int)kAllRemaining)); }
void toggleWatched();
void toggleAutoExpire();
void togglePreserveEpisode();
void toggleView(ViewMask itemMask, bool setOn);
void toggleTitleView(bool setOn) { toggleView(VIEW_TITLES, setOn); }
void toggleCategoryView(bool setOn) { toggleView(VIEW_CATEGORIES, setOn); }
void toggleRecGroupView(bool setOn) { toggleView(VIEW_RECGROUPS, setOn); }
void toggleWatchListView(bool setOn) { toggleView(VIEW_WATCHLIST, setOn); }
void toggleSearchView(bool setOn) { toggleView(VIEW_SEARCHES, setOn); }
void toggleLiveTVView(bool setOn) { toggleView(VIEW_LIVETVGRP, setOn); }
void toggleWatchedView(bool setOn) { toggleView(VIEW_WATCHED, setOn); }
void setGroupFilter(const QString &newRecGroup);
void setRecGroup(QString newRecGroup);
void setPlayGroup(QString newPlayGroup);
void saveRecMetadata(const QString &newTitle, const QString &newSubtitle);
void SetRecGroupPassword(const QString &newPasswd);
void doJobQueueJob(int jobType, int jobFlags = 0);
void doPlaylistJobQueueJob(int jobType, int jobFlags = 0);
void stopPlaylistJobQueueJob(int jobType);
void doBeginFlagging();
void doBeginTranscoding() { doJobQueueJob(JOB_TRANSCODE,
JOB_USE_CUTLIST); }
void doBeginUserJob1() { doJobQueueJob(JOB_USERJOB1); }
void doBeginUserJob2() { doJobQueueJob(JOB_USERJOB2); }
void doBeginUserJob3() { doJobQueueJob(JOB_USERJOB3); }
void doBeginUserJob4() { doJobQueueJob(JOB_USERJOB4); }
void doPlaylistBeginTranscoding() { doPlaylistJobQueueJob(JOB_TRANSCODE,
JOB_USE_CUTLIST); }
void stopPlaylistTranscoding() { stopPlaylistJobQueueJob(JOB_TRANSCODE);}
void doPlaylistBeginFlagging() { doPlaylistJobQueueJob(JOB_COMMFLAG); }
void stopPlaylistFlagging() { stopPlaylistJobQueueJob(JOB_COMMFLAG); }
void doPlaylistBeginUserJob1() { doPlaylistJobQueueJob(JOB_USERJOB1); }
void stopPlaylistUserJob1() { stopPlaylistJobQueueJob(JOB_USERJOB1); }
void doPlaylistBeginUserJob2() { doPlaylistJobQueueJob(JOB_USERJOB2); }
void stopPlaylistUserJob2() { stopPlaylistJobQueueJob(JOB_USERJOB2); }
void doPlaylistBeginUserJob3() { doPlaylistJobQueueJob(JOB_USERJOB3); }
void stopPlaylistUserJob3() { stopPlaylistJobQueueJob(JOB_USERJOB3); }
void doPlaylistBeginUserJob4() { doPlaylistJobQueueJob(JOB_USERJOB4); }
void stopPlaylistUserJob4() { stopPlaylistJobQueueJob(JOB_USERJOB4); }
void doClearPlaylist();
void PlaylistDeleteForgetHistory(void) { PlaylistDelete(true); }
void PlaylistDelete(bool forgetHistory = false);
void doPlaylistExpireSetting(bool turnOn);
void doPlaylistExpireSetOn() { doPlaylistExpireSetting(true); }
void doPlaylistExpireSetOff() { doPlaylistExpireSetting(false); }
void doPlaylistWatchedSetting(bool turnOn);
void doPlaylistWatchedSetOn() { doPlaylistWatchedSetting(true); }
void doPlaylistWatchedSetOff() { doPlaylistWatchedSetting(false); }
void togglePlayListTitle(void);
void togglePlayListItem(void);
void playSelectedPlaylist(bool random);
void doPlayList(void);
void showViewChanger(void);
void saveViewChanges(void);
void checkPassword(const QString &password);
void fanartLoad(void);
void bannerLoad(void);
void coverartLoad(void);
private:
bool UpdateUILists(void);
void UpdateUIGroupList(const QStringList &groupPreferences);
void UpdateUIRecGroupList(void);
void UpdateProgressBar(void);
QString cutDown(const QString &, QFont *, int);
void PlayX(const ProgramInfo &rec,
bool ignoreBookmark,
bool underNetworkControl);
bool Play(const ProgramInfo &rec,
bool inPlaylist,
bool ignoreBookmark,
bool underNetworkControl);
ProgramInfo *CurrentItem(void);
void togglePlayListItem(ProgramInfo *pginfo);
void randomizePlayList(void);
void processNetworkControlCommands(void);
void processNetworkControlCommand(const QString &command);
ProgramInfo *FindProgramInUILists(const ProgramInfo&);
ProgramInfo *FindProgramInUILists(const QString &key);
ProgramInfo *FindProgramInUILists(
uint chanid, const QDateTime &recstartts,
QString recgroup = "NotLiveTV");
void RemoveProgram(uint chanid, const QDateTime &recstartts,
bool forgetHistory, bool forceMetadataDelete);
void ShowDeletePopup(DeletePopupType);
void ShowAvailabilityPopup(const ProgramInfo&);
void ShowActionPopup(const ProgramInfo&);
QString getRecGroupPassword(const QString &recGroup);
void fillRecGroupPasswordCache(void);
bool IsUsageUIVisible(void) const;
void updateIcons(const ProgramInfo *pginfo = NULL);
void UpdateUsageUI(void);
void updateGroupInfo(const QString &groupname, const QString &grouplabel);
void SetItemIcons(MythUIButtonListItem *item, ProgramInfo* pginfo);
void UpdateUIListItem(
ProgramInfo *ProgramInfo_pointer_from_FindProgramInUILists,
bool force_preview_reload);
void UpdateUIListItem(MythUIButtonListItem *item, bool is_sel,
bool force_preview_reload = true);
void HandlePreviewEvent(const QStringList &list);
void HandleRecordingRemoveEvent(uint chanid, const QDateTime &recstartts);
void HandleRecordingAddEvent(const ProgramInfo &evinfo);
void HandleUpdateProgramInfoEvent(const ProgramInfo &evinfo);
void HandleUpdateProgramInfoFileSizeEvent(
uint chanid, const QDateTime &recstartts, uint64_t filesize);
void ScheduleUpdateUIList(void);
bool CreatePopupMenu(const QString &title);
bool CreatePopupMenu(const QString &title, const ProgramInfo &pginfo)
{ return CreatePopupMenu(title + CreateProgramInfoString(pginfo)); }
bool CreatePopupMenuPlaylist(void);
QString CreateProgramInfoString(const ProgramInfo &program) const;
private:
QRegExp m_prefixes; ///< prefixes to be ignored when sorting
QRegExp m_titleChaff; ///< stuff to remove for search rules
MythUIButtonList *m_recgroupList;
MythUIButtonList *m_groupList;
MythUIButtonList *m_recordingList;
MythUIText *m_noRecordingsText;
MythUIImage *m_previewImage;
QString m_artHostOverride;
MythUIImage *m_artImage[3];
QTimer *m_artTimer[3];
InfoMap m_currentMap;
// Settings ///////////////////////////////////////////////////////////////
/// If "Play" this is a recording playback selection UI,
/// if "Delete this is a recording deletion selection UI.
BoxType m_type;
// date/time formats from DB
QString m_formatShortDate;
QString m_formatLongDate;
QString m_formatTime;
/// titleView controls showing titles in group list
bool m_titleView;
/// useCategories controls showing categories in group list
bool m_useCategories;
/// useRecGroups controls showing of recording groups in group list
bool m_useRecGroups;
/// use the Watch List as the initial view
bool m_watchListStart;
/// exclude recording not marked for auto-expire from the Watch List
bool m_watchListAutoExpire;
/// add 1 to the Watch List scord up to this many days
int m_watchListMaxAge;
/// adjust exclusion of a title from the Watch List after a delete
int m_watchListBlackOut;
/// contains "DispRecGroupAsAllProg" setting
bool m_groupnameAsAllProg;
/// allOrder controls the ordering of the "All Programs" list
int m_allOrder;
/// listOrder controls the ordering of the recordings in the list
int m_listOrder;
// Recording Group settings
QString m_groupDisplayName;
QString m_recGroup;
QString m_curGroupPassword;
QString m_newRecGroup;
QString m_watchGroupName;
QString m_watchGroupLabel;
ViewMask m_viewMask;
// Popup support //////////////////////////////////////////////////////////
// General popup support
MythDialogBox *m_popupMenu;
MythScreenStack *m_popupStack;
bool m_doToggleMenu;
// Recording Group popup support
QMap<QString,QString> m_recGroupType;
QMap<QString,QString> m_recGroupPwCache;
// State Variables ////////////////////////////////////////////////////////
// Main Recording List support
QStringList m_titleList; ///< list of pages
ProgramMap m_progLists; ///< lists of programs by page
int m_progsInDB; ///< total number of recordings in DB
bool m_isFilling;
QStringList m_recGroups;
mutable QMutex m_recGroupsLock;
int m_recGroupIdx;
// Other state
/// Program[s] currently selected for deletion
QStringList m_delList;
/// Group currently selected
QString m_currentGroup;
// Play List support
QStringList m_playList; ///< list of selected items "play list"
bool m_op_on_playlist;
QStringList m_playListPlay; ///< list of items being played.
ProgramInfoCache m_programInfoCache;
/// playingSomething is set to true iff a full screen recording is playing
bool m_playingSomething;
/// Does the recording list need to be refilled
bool m_needUpdate;
// Selection state variables
bool m_haveGroupInfoSet;
// Network Control Variables //////////////////////////////////////////////
mutable QMutex m_ncLock;
deque<QString> m_networkControlCommands;
// Other
TV *m_player;
QStringList m_player_selected_new_show;
/// Main helper thread
PlaybackBoxHelper m_helper;
/// Outstanding preview image requests
QSet<QString> m_preview_tokens;
};
class GroupSelector : public MythScreenType
{
Q_OBJECT
public:
GroupSelector(MythScreenStack *lparent, const QString &label,
const QStringList &list, const QStringList &data,
const QString &selected);
bool Create(void);
signals:
void result(QString);
protected slots:
void AcceptItem(MythUIButtonListItem *item);
private:
void loadGroups(void);
QString m_label;
QStringList m_List;
QStringList m_Data;
QString m_selected;
};
class ChangeView : public MythScreenType
{
Q_OBJECT
public:
ChangeView(MythScreenStack *lparent, MythScreenType *parentScreen,
int viewMask);
bool Create(void);
signals:
void save();
protected slots:
void SaveChanges(void);
private:
MythScreenType *m_parentScreen;
int m_viewMask;
};
class PasswordChange : public MythScreenType
{
Q_OBJECT
public:
PasswordChange(MythScreenStack *lparent, QString oldpassword);
bool Create(void);
signals:
void result(const QString &);
protected slots:
void OldPasswordChanged(void);
void SendResult(void);
private:
MythUITextEdit *m_oldPasswordEdit;
MythUITextEdit *m_newPasswordEdit;
MythUIButton *m_okButton;
QString m_oldPassword;
};
class RecMetadataEdit : public MythScreenType
{
Q_OBJECT
public:
RecMetadataEdit(MythScreenStack *lparent, ProgramInfo *pginfo);
bool Create(void);
signals:
void result(const QString &, const QString &);
protected slots:
void SaveChanges(void);
private:
MythUITextEdit *m_titleEdit;
MythUITextEdit *m_subtitleEdit;
ProgramInfo *m_progInfo;
};
class HelpPopup : public MythScreenType
{
Q_OBJECT
public:
HelpPopup(MythScreenStack *lparent);
bool Create(void);
private:
void addItem(const QString &state, const QString &text);
MythUIButtonList *m_iconList;
};
#endif
/* vim: set expandtab tabstop=4 shiftwidth=4: */