00001
00002
00003 #ifndef PLAYBACKBOX_H_
00004 #define PLAYBACKBOX_H_
00005
00006
00007 #include <stdint.h>
00008
00009
00010 #include <vector>
00011 #include <deque>
00012 using namespace std;
00013
00014 #include <QStringList>
00015 #include <QDateTime>
00016 #include <QObject>
00017 #include <QMutex>
00018 #include <QMap>
00019 #include <QSet>
00020
00021 #include "jobqueue.h"
00022 #include "tv_play.h"
00023
00024 #include "mythscreentype.h"
00025
00026
00027 #include "schedulecommon.h"
00028 #include "programinfocache.h"
00029 #include "playbackboxhelper.h"
00030
00031 class QKeyEvent;
00032 class QEvent;
00033 class QTimer;
00034
00035 class MythPlayer;
00036 class RingBuffer;
00037 class ProgramInfo;
00038
00039 class MythUIButtonList;
00040 class MythUIButtonListItem;
00041 class MythUIImage;
00042 class MythUIText;
00043 class MythUITextEdit;
00044 class MythUIButton;
00045 class MythDialogBox;
00046 class MythMenu;
00047
00048 typedef QMap<QString,ProgramList> ProgramMap;
00049 typedef QMap<QString,QString> Str2StrMap;
00050
00051 enum {
00052 kArtworkFanTimeout = 300,
00053 kArtworkBannerTimeout = 50,
00054 kArtworkCoverTimeout = 50,
00055 };
00056
00057 class PlaybackBox : public ScheduleCommon
00058 {
00059 Q_OBJECT
00060 friend class PlaybackBoxListItem;
00061
00062 public:
00063 typedef enum
00064 {
00065 kPlayBox,
00066 kDeleteBox,
00067 } BoxType;
00068
00069
00070 typedef enum {
00071 TitlesOnly = 0,
00072 TitlesCategories = 1,
00073 TitlesCategoriesRecGroups = 2,
00074 TitlesRecGroups = 3,
00075 Categories = 4,
00076 CategoriesRecGroups = 5,
00077 RecGroups = 6,
00078 ViewTypes,
00079 } ViewType;
00080
00081
00082 typedef enum {
00083 TitleSortAlphabetical = 0,
00084 TitleSortRecPriority = 1,
00085 TitleSortMethods,
00086 } ViewTitleSort;
00087
00088 typedef enum {
00089 VIEW_NONE = 0x0000,
00090 VIEW_TITLES = 0x0001,
00091 VIEW_CATEGORIES = 0x0002,
00092 VIEW_RECGROUPS = 0x0004,
00093 VIEW_WATCHLIST = 0x0008,
00094 VIEW_SEARCHES = 0x0010,
00095 VIEW_LIVETVGRP = 0x0020,
00096
00097 VIEW_WATCHED = 0x8000
00098 } ViewMask;
00099
00100 typedef enum
00101 {
00102 kDeleteRecording,
00103 kStopRecording,
00104 kForceDeleteRecording,
00105 } DeletePopupType;
00106
00107 typedef enum
00108 {
00109 kNoFlags = 0x00,
00110 kForgetHistory = 0x01,
00111 kForce = 0x02,
00112 kIgnore = 0x04,
00113 kAllRemaining = 0x08,
00114 } DeleteFlags;
00115
00116 typedef enum
00117 {
00118 kNvpToPlay,
00119 kNvpToStop,
00120 kDone
00121 } killStateType;
00122
00123 PlaybackBox(MythScreenStack *parent, QString name, BoxType ltype,
00124 TV *player = NULL, bool showTV = false);
00125 ~PlaybackBox(void);
00126
00127 bool Create(void);
00128 virtual void Load(void);
00129 virtual void Init(void);
00130 bool keyPressEvent(QKeyEvent *);
00131 void customEvent(QEvent *event);
00132
00133 void setInitialRecGroup(QString initialGroup) { m_recGroup = initialGroup; }
00134 static void * RunPlaybackBox(void *player, bool);
00135
00136 public slots:
00137 void displayRecGroup(const QString &newRecGroup = "");
00138 void groupSelectorClosed(void);
00139
00140 protected slots:
00141 void updateRecList(MythUIButtonListItem *);
00142 void ItemSelected(MythUIButtonListItem *item)
00143 { UpdateUIListItem(item, true); }
00144 void ItemVisible(MythUIButtonListItem *item);
00145 void ItemLoaded(MythUIButtonListItem *item);
00146 void selected(MythUIButtonListItem *item);
00147 void PlayFromBookmark(MythUIButtonListItem *item = NULL);
00148 void PlayFromBeginning(MythUIButtonListItem *item = NULL);
00149 void deleteSelected(MythUIButtonListItem *item);
00150
00151 void SwitchList(void);
00152
00153 void ShowGroupPopup(void);
00154 void customEdit();
00155 void upcoming();
00156 void upcomingScheduled();
00157 void details();
00158 void StopSelected(void);
00159 void showMetadataEditor();
00160 void showGroupFilter();
00161 void showRecGroupPasswordChanger();
00162 MythMenu* createPlayFromMenu();
00163 MythMenu* createRecordingMenu();
00164 MythMenu* createJobMenu();
00165 MythMenu* createTranscodingProfilesMenu();
00166 MythMenu* createStorageMenu();
00167 MythMenu* createPlaylistMenu();
00168 MythMenu* createPlaylistStorageMenu();
00169 MythMenu* createPlaylistJobMenu();
00170 void changeProfileAndTranscode(int id);
00171 void showProgramDetails();
00172 void showIconHelp();
00173 void ShowRecGroupChangerUsePlaylist(void) { ShowRecGroupChanger(true); }
00174 void ShowPlayGroupChangerUsePlaylist(void) { ShowPlayGroupChanger(true); }
00175 void ShowRecGroupChanger(bool use_playlist = false);
00176 void ShowPlayGroupChanger(bool use_playlist = false);
00177
00178 void popupClosed(QString which, int reason);
00179
00180 void doPlayListRandom();
00181
00182 void askStop();
00183
00184 void doEditScheduled();
00185 void doAllowRerecord();
00186
00187 void askDelete();
00188 void Undelete(void);
00189 void Delete(DeleteFlags = kNoFlags);
00190 void DeleteForgetHistory(void) { Delete(kForgetHistory); }
00191 void DeleteForce(void) { Delete(kForce); }
00192 void DeleteIgnore(void) { Delete(kIgnore); }
00193 void DeleteForceAllRemaining(void)
00194 { Delete((DeleteFlags)((int)kForce |(int)kAllRemaining)); }
00195 void DeleteIgnoreAllRemaining(void)
00196 { Delete((DeleteFlags)((int)kIgnore|(int)kAllRemaining)); }
00197
00198 void toggleWatched();
00199 void toggleAutoExpire();
00200 void togglePreserveEpisode();
00201
00202 void toggleView(ViewMask itemMask, bool setOn);
00203 void toggleTitleView(bool setOn) { toggleView(VIEW_TITLES, setOn); }
00204 void toggleCategoryView(bool setOn) { toggleView(VIEW_CATEGORIES, setOn); }
00205 void toggleRecGroupView(bool setOn) { toggleView(VIEW_RECGROUPS, setOn); }
00206 void toggleWatchListView(bool setOn) { toggleView(VIEW_WATCHLIST, setOn); }
00207 void toggleSearchView(bool setOn) { toggleView(VIEW_SEARCHES, setOn); }
00208 void toggleLiveTVView(bool setOn) { toggleView(VIEW_LIVETVGRP, setOn); }
00209 void toggleWatchedView(bool setOn) { toggleView(VIEW_WATCHED, setOn); }
00210
00211 void setGroupFilter(const QString &newRecGroup);
00212 void setRecGroup(QString newRecGroup);
00213 void setPlayGroup(QString newPlayGroup);
00214
00215 void saveRecMetadata(const QString &newTitle, const QString &newSubtitle,
00216 const QString &newDescription, const QString &newInetref,
00217 uint season, uint episode);
00218
00219 void SetRecGroupPassword(const QString &newPasswd);
00220
00221 void doJobQueueJob(int jobType, int jobFlags = 0);
00222 void doPlaylistJobQueueJob(int jobType, int jobFlags = 0);
00223 void stopPlaylistJobQueueJob(int jobType);
00224 void doBeginFlagging();
00225 void doBeginLookup();
00226 void doBeginTranscoding() { doJobQueueJob(JOB_TRANSCODE,
00227 JOB_USE_CUTLIST); }
00228 void doBeginUserJob1() { doJobQueueJob(JOB_USERJOB1); }
00229 void doBeginUserJob2() { doJobQueueJob(JOB_USERJOB2); }
00230 void doBeginUserJob3() { doJobQueueJob(JOB_USERJOB3); }
00231 void doBeginUserJob4() { doJobQueueJob(JOB_USERJOB4); }
00232 void doPlaylistBeginTranscoding() { doPlaylistJobQueueJob(JOB_TRANSCODE,
00233 JOB_USE_CUTLIST); }
00234 void stopPlaylistTranscoding() { stopPlaylistJobQueueJob(JOB_TRANSCODE);}
00235 void doPlaylistBeginFlagging() { doPlaylistJobQueueJob(JOB_COMMFLAG); }
00236 void stopPlaylistFlagging() { stopPlaylistJobQueueJob(JOB_COMMFLAG); }
00237 void doPlaylistBeginLookup() { doPlaylistJobQueueJob(JOB_METADATA); }
00238 void stopPlaylistLookup() { stopPlaylistJobQueueJob(JOB_METADATA); }
00239 void doPlaylistBeginUserJob1() { doPlaylistJobQueueJob(JOB_USERJOB1); }
00240 void stopPlaylistUserJob1() { stopPlaylistJobQueueJob(JOB_USERJOB1); }
00241 void doPlaylistBeginUserJob2() { doPlaylistJobQueueJob(JOB_USERJOB2); }
00242 void stopPlaylistUserJob2() { stopPlaylistJobQueueJob(JOB_USERJOB2); }
00243 void doPlaylistBeginUserJob3() { doPlaylistJobQueueJob(JOB_USERJOB3); }
00244 void stopPlaylistUserJob3() { stopPlaylistJobQueueJob(JOB_USERJOB3); }
00245 void doPlaylistBeginUserJob4() { doPlaylistJobQueueJob(JOB_USERJOB4); }
00246 void stopPlaylistUserJob4() { stopPlaylistJobQueueJob(JOB_USERJOB4); }
00247 void doClearPlaylist();
00248 void PlaylistDeleteForgetHistory(void) { PlaylistDelete(true); }
00249 void PlaylistDelete(bool forgetHistory = false);
00250 void doPlaylistExpireSetting(bool turnOn);
00251 void doPlaylistExpireSetOn() { doPlaylistExpireSetting(true); }
00252 void doPlaylistExpireSetOff() { doPlaylistExpireSetting(false); }
00253 void doPlaylistWatchedSetting(bool turnOn);
00254 void doPlaylistWatchedSetOn() { doPlaylistWatchedSetting(true); }
00255 void doPlaylistWatchedSetOff() { doPlaylistWatchedSetting(false); }
00256 void togglePlayListTitle(void);
00257 void togglePlayListItem(void);
00258 void playSelectedPlaylist(bool random);
00259 void doPlayList(void);
00260 void showViewChanger(void);
00261 void saveViewChanges(void);
00262
00263 void checkPassword(const QString &password);
00264
00265 void fanartLoad(void);
00266 void bannerLoad(void);
00267 void coverartLoad(void);
00268
00269 private:
00270 bool UpdateUILists(void);
00271 void UpdateUIGroupList(const QStringList &groupPreferences);
00272 void UpdateUIRecGroupList(void);
00273
00274 void UpdateProgressBar(void);
00275
00276 void PlayX(const ProgramInfo &rec,
00277 bool ignoreBookmark,
00278 bool underNetworkControl);
00279
00280 bool Play(const ProgramInfo &rec,
00281 bool inPlaylist,
00282 bool ignoreBookmark,
00283 bool underNetworkControl);
00284
00285 ProgramInfo *CurrentItem(void);
00286
00287 void togglePlayListItem(ProgramInfo *pginfo);
00288 void randomizePlayList(void);
00289
00290 void processNetworkControlCommands(void);
00291 void processNetworkControlCommand(const QString &command);
00292
00293 ProgramInfo *FindProgramInUILists(const ProgramInfo&);
00294 ProgramInfo *FindProgramInUILists(const QString &key);
00295 ProgramInfo *FindProgramInUILists(
00296 uint chanid, const QDateTime &recstartts,
00297 QString recgroup = "NotLiveTV");
00298
00299 void RemoveProgram(uint chanid, const QDateTime &recstartts,
00300 bool forgetHistory, bool forceMetadataDelete);
00301 void ShowDeletePopup(DeletePopupType);
00302 void ShowAvailabilityPopup(const ProgramInfo&);
00303 void ShowActionPopup(const ProgramInfo&);
00304
00305 QString getRecGroupPassword(const QString &recGroup);
00306 void fillRecGroupPasswordCache(void);
00307
00308 bool IsUsageUIVisible(void) const;
00309
00310 void updateIcons(const ProgramInfo *pginfo = NULL);
00311 void UpdateUsageUI(void);
00312 void updateGroupInfo(const QString &groupname, const QString &grouplabel);
00313
00314 void SetItemIcons(MythUIButtonListItem *item, ProgramInfo* pginfo);
00315 void UpdateUIListItem(
00316 ProgramInfo *ProgramInfo_pointer_from_FindProgramInUILists,
00317 bool force_preview_reload);
00318 void UpdateUIListItem(MythUIButtonListItem *item, bool is_sel,
00319 bool force_preview_reload = true);
00320
00321 void HandlePreviewEvent(const QStringList &list);
00322 void HandleRecordingRemoveEvent(uint chanid, const QDateTime &recstartts);
00323 void HandleRecordingAddEvent(const ProgramInfo &evinfo);
00324 void HandleUpdateProgramInfoEvent(const ProgramInfo &evinfo);
00325 void HandleUpdateProgramInfoFileSizeEvent(
00326 uint chanid, const QDateTime &recstartts, uint64_t filesize);
00327
00328 void ScheduleUpdateUIList(void);
00329 void ShowMenu(void);
00330 bool CreatePopupMenu(const QString &title);
00331 void DisplayPopupMenu(void);
00332
00333
00334 bool CreatePopupMenuPlaylist(void);
00335
00336 QString CreateProgramInfoString(const ProgramInfo &program) const;
00337
00338
00339 QRegExp m_prefixes;
00340 QRegExp m_titleChaff;
00341
00342 MythUIButtonList *m_recgroupList;
00343 MythUIButtonList *m_groupList;
00344 MythUIButtonList *m_recordingList;
00345
00346 MythUIText *m_noRecordingsText;
00347
00348 MythUIImage *m_previewImage;
00349
00350 QString m_artHostOverride;
00351 MythUIImage *m_artImage[3];
00352 QTimer *m_artTimer[3];
00353
00354 InfoMap m_currentMap;
00355
00356
00359 BoxType m_type;
00361 bool m_titleView;
00363 bool m_useCategories;
00365 bool m_useRecGroups;
00367 bool m_watchListStart;
00369 bool m_watchListAutoExpire;
00371 int m_watchListMaxAge;
00373 int m_watchListBlackOut;
00375 bool m_groupnameAsAllProg;
00377 int m_allOrder;
00379 int m_listOrder;
00380
00381
00382 QString m_groupDisplayName;
00383 QString m_recGroup;
00384 QString m_curGroupPassword;
00385 QString m_newRecGroup;
00386 QString m_watchGroupName;
00387 QString m_watchGroupLabel;
00388 ViewMask m_viewMask;
00389
00390
00391
00392 MythDialogBox *m_menuDialog;
00393 MythMenu *m_popupMenu;
00394 MythScreenStack *m_popupStack;
00395
00396 bool m_doToggleMenu;
00397
00398
00399 QMap<QString,QString> m_recGroupType;
00400 QMap<QString,QString> m_recGroupPwCache;
00401
00402
00403
00404 QStringList m_titleList;
00405 ProgramMap m_progLists;
00406 int m_progsInDB;
00407 bool m_isFilling;
00408
00409 QStringList m_recGroups;
00410 mutable QMutex m_recGroupsLock;
00411 int m_recGroupIdx;
00412
00413
00415 QStringList m_delList;
00417 QString m_currentGroup;
00418
00419
00420 QStringList m_playList;
00421 bool m_op_on_playlist;
00422 QStringList m_playListPlay;
00423
00424 ProgramInfoCache m_programInfoCache;
00425
00427 bool m_playingSomething;
00428
00430 bool m_needUpdate;
00431
00432
00433 bool m_haveGroupInfoSet;
00434
00435
00436 mutable QMutex m_ncLock;
00437 deque<QString> m_networkControlCommands;
00438
00439
00440 TV *m_player;
00441 QStringList m_player_selected_new_show;
00443 PlaybackBoxHelper m_helper;
00445 QSet<QString> m_preview_tokens;
00446 };
00447
00448 class GroupSelector : public MythScreenType
00449 {
00450 Q_OBJECT
00451
00452 public:
00453 GroupSelector(MythScreenStack *lparent, const QString &label,
00454 const QStringList &list, const QStringList &data,
00455 const QString &selected);
00456
00457 bool Create(void);
00458
00459 signals:
00460 void result(QString);
00461
00462 protected slots:
00463 void AcceptItem(MythUIButtonListItem *item);
00464
00465 private:
00466 void loadGroups(void);
00467
00468 QString m_label;
00469 QStringList m_List;
00470 QStringList m_Data;
00471 QString m_selected;
00472 };
00473
00474 class ChangeView : public MythScreenType
00475 {
00476 Q_OBJECT
00477
00478 public:
00479 ChangeView(MythScreenStack *lparent, MythScreenType *parentScreen,
00480 int viewMask);
00481
00482 bool Create(void);
00483
00484 signals:
00485 void save();
00486
00487 protected slots:
00488 void SaveChanges(void);
00489
00490 private:
00491 MythScreenType *m_parentScreen;
00492 int m_viewMask;
00493 };
00494
00495 class PasswordChange : public MythScreenType
00496 {
00497 Q_OBJECT
00498
00499 public:
00500 PasswordChange(MythScreenStack *lparent, QString oldpassword);
00501
00502 bool Create(void);
00503
00504 signals:
00505 void result(const QString &);
00506
00507 protected slots:
00508 void OldPasswordChanged(void);
00509 void SendResult(void);
00510
00511 private:
00512 MythUITextEdit *m_oldPasswordEdit;
00513 MythUITextEdit *m_newPasswordEdit;
00514 MythUIButton *m_okButton;
00515
00516 QString m_oldPassword;
00517 };
00518
00519 class RecMetadataEdit : public MythScreenType
00520 {
00521 Q_OBJECT
00522
00523 public:
00524 RecMetadataEdit(MythScreenStack *lparent, ProgramInfo *pginfo);
00525
00526 bool Create(void);
00527
00528 signals:
00529 void result(const QString &, const QString &, const QString &,
00530 const QString &, uint, uint);
00531
00532 protected slots:
00533 void SaveChanges(void);
00534
00535 private:
00536 MythUITextEdit *m_titleEdit;
00537 MythUITextEdit *m_subtitleEdit;
00538 MythUITextEdit *m_descriptionEdit;
00539 MythUITextEdit *m_inetrefEdit;
00540 MythUISpinBox *m_seasonSpin;
00541 MythUISpinBox *m_episodeSpin;
00542
00543 ProgramInfo *m_progInfo;
00544 };
00545
00546 class HelpPopup : public MythScreenType
00547 {
00548 Q_OBJECT
00549
00550 public:
00551 HelpPopup(MythScreenStack *lparent);
00552
00553 bool Create(void);
00554
00555 private:
00556 void addItem(const QString &state, const QString &text);
00557
00558 MythUIButtonList *m_iconList;
00559 };
00560
00561 #endif
00562