Compare commits

...

231 Commits

Author SHA1 Message Date
kamel5 5ef383453f Version 1.3.6 2022-06-25 13:30:04 +02:00
kamel5 5638c408c1 Better fit channel logo in search result 2022-06-25 13:29:18 +02:00
kamel5 519a87a471 Adapt epgsearch "allow empty" in searchtimer edit 2022-06-25 13:12:24 +02:00
kamel5 a87a1db7c2 Remove SetHeader and SetFooter 2022-06-25 13:00:13 +02:00
kamel5 00ea3fb5ff Rename isDummy() to IsDummy() 2022-06-18 17:03:15 +02:00
kamel5 93af9304c8 Cosmetic change in osdmanager.* 2022-06-18 17:03:15 +02:00
kamel5 d8663ff309 Cosmetic change in geometrymanager.c 2022-06-18 17:03:15 +02:00
kamel5 8e26759d4e Rename GetTimerValue() to GetTimer() 2022-06-18 17:03:15 +02:00
kamel5 5923c9c0ed Rename setActive() to SetActive() 2022-06-18 17:03:15 +02:00
kamel5 6174461af6 Rename isActive() to IsActive() 2022-06-18 17:03:15 +02:00
kamel5 018a8946b7 Rename GetEventValue() to GetEvent() 2022-06-18 17:03:15 +02:00
kamel5 c3dbae705a Rename GetActive() to GetNumActive() 2022-06-18 17:03:15 +02:00
kamel5 0289731158 Refactor cRecMenuTimeline 2022-06-18 17:03:15 +02:00
kamel5 1f1498a734 Refactor cRecMenuAskFolder 2022-06-18 17:03:15 +02:00
kamel5 e707ec7d4f Refactor cRecMenuFavorites 2022-06-18 17:03:15 +02:00
kamel5 bb7d03c7ed Refactor cRecMenuRecordingSearchNotFound 2022-06-18 17:03:15 +02:00
kamel5 b804b63353 Refactor cRecMenuRecordingSearchResults 2022-06-18 17:03:15 +02:00
kamel5 a7e0aacdf1 Refactor cRecMenuRecordingSearch 2022-06-18 17:03:15 +02:00
kamel5 37a31d0768 Refactor cRecMenuSearchConfirmTimer 2022-06-18 17:03:15 +02:00
kamel5 380e84afcd Refactor cRecMenuSearchNothingFound 2022-06-18 17:03:15 +02:00
kamel5 412a78a112 Refactor cRecMenuSearchResults 2022-06-18 17:03:15 +02:00
kamel5 5cc50e465d Refactor cRecMenuSearch 2022-06-18 17:03:15 +02:00
kamel5 a3dc78f70a Refactor cRecMenuSwitchTimerDelete 2022-06-18 17:03:15 +02:00
kamel5 403af35519 Refactor cRecMenuSwitchTimerConfirm 2022-06-18 17:03:15 +02:00
kamel5 97c8bc23fd Refactor cRecMenuSwitchTimer 2022-06-18 17:03:15 +02:00
kamel5 95fd68a6be Refactor cRecMenuSearchTimerNothingFound 2022-06-18 17:03:15 +02:00
kamel5 66659a865d Refactor cRecMenuSearchTimerResults 2022-06-18 17:03:15 +02:00
kamel5 4f95cffdb2 Refactor cRecMenuSearchTimerTemplatesCreate 2022-06-18 17:03:15 +02:00
kamel5 7f7a16498c Refactor cRecMenuSearchTimerCreateConfirm 2022-06-18 17:03:15 +02:00
kamel5 f900446195 Refactor cRecMenuSearchTimerDeleteConfirm 2022-06-18 17:03:15 +02:00
kamel5 d24bbefe4c Refactor cRecMenuSearchTimerEdit 2022-06-18 17:03:15 +02:00
kamel5 54ce728fa5 Refactor cRecMenuSearchTimers 2022-06-18 17:03:15 +02:00
kamel5 a4cc2a4fa8 Refactor cRecMenuSearchTimerTemplates 2022-06-18 17:03:15 +02:00
kamel5 30fc49af0c Refactor cRecMenuSearchTimer 2022-06-18 17:03:15 +02:00
kamel5 cf9250e50b Refactor cRecMenuConfirmSeriesTimer 2022-06-18 17:03:15 +02:00
kamel5 2531526a4d Refactor cRecMenuSeriesTimer 2022-06-18 17:03:15 +02:00
kamel5 37db3b185c Refactor cRecMenuEditTimer 2022-06-18 17:03:15 +02:00
kamel5 e4ef6c4ee5 Refactor cRecMenuConfirmRerunUsed 2022-06-18 17:03:15 +02:00
kamel5 51b1896c6d Refactor cRecMenuNoRerunsFound 2022-06-18 17:03:15 +02:00
kamel5 ec7d45f960 Refactor cRecMenuRerunResults 2022-06-18 17:03:15 +02:00
kamel5 0837137ea8 Refactor cRecMenuNoTimerConflict 2022-06-18 17:03:15 +02:00
kamel5 33196207d0 Refactor cRecMenuTimerConflict 2022-06-18 17:03:15 +02:00
kamel5 73e331f97f Refactor cRecMenuTimerConflicts 2022-06-18 17:03:15 +02:00
kamel5 56cab4a666 Refactor cRecMenuAskDeleteTimer 2022-06-18 17:03:15 +02:00
kamel5 a4294b1f54 Refactor cRecMenuConfirmDeleteTimer 2022-06-18 17:03:15 +02:00
kamel5 ce690366f8 Refactor cRecMenuConfirmTimer 2022-06-18 17:03:02 +02:00
kamel5 9565eda1aa Fix typo 2022-06-18 16:10:07 +02:00
kamel5 637617bd12 Fix a segfault
In the function "cDetailView::InitiateView" there was a
segfault when the "call->type = tNone".
2022-06-18 12:38:50 +02:00
kamel5 eb259fb961 Fixed possible segfault when showing scrollbar in search result lists
A segfault is possible if numSteps is greater than height in
"cRecMenu::createScrollbar()".
2022-04-29 12:18:36 +02:00
kamel5 e2d67769dc Changed the size and location of the channel logos to better fit in place
This leads to a better positioning of the channel logos if they are
displayed in the EPG grid
2022-04-29 12:08:51 +02:00
kamel5 936db4a087 Display errors in search recordings 2021-12-15 15:20:34 +01:00
kamel5 6af3193b02 In menu "Search Recordins" get ChannelName from 'RecInfo'
Alternatively fallback via 'ChannelID' from the active channel list.
2021-12-15 14:48:39 +01:00
kamel5 2d46769a3e Eliminate "Warnung: ISO-C++17 erlaubt Speicherklassenangabe »register« nicht [-Wregister]" 2021-12-15 14:42:41 +01:00
kamel5 6663910058 Version 1.3.5 2021-05-22 11:43:26 +02:00
kamel5 896a4abf75 Update iceblue theme 2021-05-22 11:41:31 +02:00
kamel5 4e062c0a8d Fix for VDR-2.5.4 2021-05-22 11:40:58 +02:00
kamel5 2f497adf01 Version 1.3.4 2021-01-11 11:36:25 +01:00
kamel5 decfb2d39d Coemetic changes 2021-01-11 11:33:16 +01:00
kamel5 5f4ea6b30d gcc11fix 2021-01-11 11:19:01 +01:00
kamel5 435a74d9cf Version 1.3.3 2020-08-06 19:05:42 +02:00
kamel5 fc47c35bea Version 1.3.2 2020-08-06 12:47:03 +02:00
kamel5 4d80c6900d Optional deactivation of the timer confirmation messages 2020-08-06 12:47:03 +02:00
kamel5 78d6e980ee Wrap title in detailview header 2020-08-06 12:47:03 +02:00
kamel5 69356e9c43 Add "Timer On/Off" to recmenu 2020-08-06 12:46:59 +02:00
kamel5 bf3a8a430b Center some channel logos 2020-08-02 19:50:55 +02:00
kamel5 52c41ff5af Fixed display groupname in cChannelGroupGrid::DrawHorizontal 2020-07-25 13:35:03 +02:00
kamel5 5870b1ae4c Version 1.3.1 2020-03-11 15:08:32 +01:00
kamel5 69b851c9ed Fixed a segfault 2020-03-11 14:59:03 +01:00
kamel5 8335ab0e41 Fixes for <VDR-2.3.1 compatibility 2020-03-07 16:55:49 +01:00
kamel5 240cbe87e0 Version 1.3.0 2020-03-06 14:03:36 +01:00
kamel5 ee68d2eb2f Fixed messages in DisplayTimerConflict 2020-03-06 14:01:47 +01:00
kamel5 eb3a4113be Fixed horizontal alignment in timeline 2020-03-06 14:01:47 +01:00
kamel5 7ec89bf12b Fixed stopIndex in cRecMenu::JumpBegin 2020-03-06 14:01:47 +01:00
kamel5 f653594c4a Fixes for <VDR-2.3.1 compatibility 2020-03-04 15:26:27 +01:00
kamel5 8129d116fb Show numTimersToday in timeline 2020-03-02 13:33:58 +01:00
kamel5 874f5cd9d5 Fixed a problem in DisplayTimerConflict 2020-03-02 12:47:04 +01:00
kamel5 9044e092f8 Version 1.2.17 2020-02-17 16:08:14 +01:00
kamel5 b96f800240 Add episode to manual timer 2020-02-17 16:05:43 +01:00
kamel5 5d9ed1439a Fixed a remote timer problem 2020-02-17 15:51:51 +01:00
kamel5 66a0c15aea Final fix for utf8 CutText 2020-02-17 15:51:47 +01:00
kamel5 8db88c2556 Version 1.2.16 2020-01-10 11:11:55 +01:00
kamel5 509b64d78f RecMenu "Timer Timeline" displays now sorted active timer 2020-01-10 11:05:28 +01:00
kamel5 15b7074b4e Separate "displayTime" for horizontal and vertical view 2020-01-09 14:30:05 +01:00
kamel5 3fee6ab13f Optimize display "REC" sign in epgview 2020-01-09 14:29:47 +01:00
kamel5 ffd3e2c79f Refactor CutText in horizontal epgview 2020-01-09 14:29:30 +01:00
kamel5 c77f74321f Refactor Timeline 2020-01-06 15:14:45 +01:00
kamel5 efe06b8e98 Fixed a possible deadlook in cEPGView::cEPGView 2020-01-06 15:14:45 +01:00
kamel5 6540e21444 Optimize TimeJump 2020-01-06 15:14:45 +01:00
kamel5 2e4a43133e Fixed a error in DeleteTimerConflictMenu 2020-01-06 15:14:45 +01:00
kamel5 bcf2ce757c Fixed a timer changed message 2020-01-06 15:14:42 +01:00
kamel5 263a734a0d Version 1.2.15 2019-11-03 13:46:13 +01:00
kamel5 7300fdf91c Workaround for HWAccelerated OSD 2019-11-03 13:08:07 +01:00
kamel5 89e9086943 Version 1.2.14 2019-10-19 16:41:09 +02:00
kamel5 e236d9e571 Optimize cTimeLine::drawClock 2019-10-19 15:10:20 +02:00
kamel5 8794891599 Fixed a error while changing a Theme 2019-10-19 15:10:13 +02:00
kamel5 cd62a9bd6b Diplay the current TimeBase throughout the whole timeline 2019-10-19 15:10:06 +02:00
kamel5 3f0bd75011 Can switch off and optimize diplay time in epggrid "displayMode == Vertical" 2019-10-19 15:09:59 +02:00
kamel5 a711aed160 Version 1.2.13 2019-10-14 18:16:28 +02:00
kamel5 cdb5a46145 Revert "Diplay the current TimeBase throughout the whole timeline"
This reverts commit b707292 because of a segfault.
2019-10-14 16:51:52 +02:00
kamel5 fc784f34e5 Version 1.2.12 2019-10-14 12:58:40 +02:00
kamel5 b707292485 Diplay the current TimeBase throughout the whole timeline 2019-10-14 12:58:35 +02:00
kamel5 587fbe1f44 Fixed updating current TimeBase 2019-10-13 13:46:29 +02:00
kamel5 9173d14b10 Fixed updating current time 2019-10-13 13:46:23 +02:00
kamel5 3386c05e91 Version 1.2.11 2019-09-07 17:32:20 +02:00
kamel5 a1eaf7a865 Optical change in cMenuSetupImageCache 2019-09-07 17:24:01 +02:00
kamel5 41eb32389d Fixed a possible deadlock in detailview 2019-09-07 17:23:32 +02:00
kamel5 f4369c0772 Fix a segfault with graphicsmagick > 1.3.31 2019-09-05 17:08:12 +02:00
kamel5 0203cb3f01 Version 1.2.10 2019-07-20 11:53:04 +02:00
kamel5 152662d519 Rework cRecMenuItemDayChooser 2019-07-19 15:59:44 +02:00
kamel5 b17fd9b7aa Rework cRecMenuItemDay 2019-07-19 11:38:07 +02:00
kamel5 fb165b2b43 Rework cRecMenuItemTime 2019-07-19 11:38:07 +02:00
kamel5 e31070cd76 Rework cRecMenuItemText 2019-07-19 11:38:07 +02:00
kamel5 15ce11db5f Rework cRecMenuItemBool 2019-07-19 11:38:07 +02:00
kamel5 0d3dd79585 Rework cRecMenuItemInt 2019-07-19 11:38:07 +02:00
kamel5 7f8ac2a2a8 Rework cRecMenuItemSelect 2019-07-19 11:38:07 +02:00
kamel5 31f72f2ad8 Rework cRecMenuItemChannelChooser 2019-07-19 11:38:04 +02:00
kamel5 a1aa300259 Rework indent & refresh 2019-07-18 16:53:27 +02:00
kamel5 b7970e5723 Fixed cRecMenuItemSelectDirectory::DrawValue 2019-07-18 13:38:53 +02:00
kamel5 3f9327b8e4 Simplify cRecMenuSearchTimerEdit::GetSearchTimer 2019-07-14 14:22:26 +02:00
kamel5 bff9d78ff3 Rename grid.* to gridelement.* 2019-07-11 15:11:26 +02:00
kamel5 d21b1496f0 Change cGrid to cGridElement 2019-07-11 15:06:07 +02:00
kamel5 5ff172c987 Rename timer.* to timemanager.* 2019-07-11 14:40:41 +02:00
kamel5 6b3eda282f Change cMyTime to cTimeManager 2019-07-11 14:34:31 +02:00
kamel5 107f3f945f lastValidChannel 2019-07-11 14:19:44 +02:00
kamel5 45a2d6bee0 Cosmetic changes in channelgroups.c 2019-07-11 13:40:00 +02:00
kamel5 700543b394 GetLastValidChannel 2019-07-11 13:20:23 +02:00
kamel5 1df9641621 Rename channelcolumn.* to channelepg.* 2019-07-11 12:07:35 +02:00
kamel5 3ed46bd881 Rename channelcolumn to channelepg 2019-07-11 12:06:18 +02:00
kamel5 81759f95cb Change cTvguideConfig to cTVGuideConfig 2019-07-11 11:44:46 +02:00
kamel5 0766d67980 Change tvguideConfig to Config 2019-07-11 11:44:39 +02:00
kamel5 3513f82a8c Change tmpTvguideConfig to tmpConfig 2019-07-11 11:13:51 +02:00
kamel5 7a79059414 Change files to unix 2019-07-11 11:07:13 +02:00
kamel5 ceadc0bbfe Rework recmenuview.c 2019-07-10 18:54:44 +02:00
kamel5 e09279ca32 set ff=unix recmenuview.* 2019-07-10 18:54:29 +02:00
kamel5 27e9004629 Rename recmenumanager.* to recmenuview.* 2019-07-10 17:41:35 +02:00
kamel5 194aa06a4e Update remotetimers.h 2019-07-10 17:41:35 +02:00
kamel5 f046493a00 Cosmetic changes 2019-07-10 17:41:35 +02:00
kamel5 fd7b1b9ab7 Rework cRecManager::UserDefinedTime 2019-07-10 17:41:30 +02:00
kamel5 c4e25b899c Rework cRecManager::WhatsOnNow 2019-07-10 17:41:25 +02:00
kamel5 059936c6d7 Rework cRecManager::DeleteTimer 2019-07-10 17:41:16 +02:00
kamel5 549d42b487 Rework cRecManager::createLocalTimer 2019-07-10 17:41:00 +02:00
kamel5 ad1f0ba0d6 Fixed a compiler error for VDR < 2.3.0 and Cosmetic changes 2019-07-06 13:44:55 +02:00
kamel5 69711400fa Version 1.2.9 2019-07-05 15:09:33 +02:00
kamel5 463b6369d2 Fixed dayOfWeek error in RecMenuSearchTimerEdit 2019-07-05 14:51:21 +02:00
kamel5 0b37464dd0 Change SetStartChannel() and SetStopChannel() 2019-07-04 13:16:13 +02:00
kamel5 cf171d8732 Cosmetic Changes 2019-07-04 12:38:47 +02:00
kamel5 d666b8701e Change locking in cTVGuideSearchTimer::cTVGuideSearchTimer 2019-07-03 12:54:57 +02:00
kamel5 6139016102 Change some default values for searchtimer 2019-07-03 12:39:58 +02:00
kamel5 1c99501776 Correct plugin options in README and CommandLineHelp 2019-06-20 15:40:53 +02:00
kamel5 b484f6cfc1 Version 1.2.8 2019-06-20 13:45:13 +02:00
kamel5 c04ca30792 Remove some debugging 2019-06-19 13:28:22 +02:00
kamel5 ba9c04a4bc Delete rmsSearchTimerEditAdvanced 2019-06-19 13:24:27 +02:00
kamel5 cb2c604d71 Update i18n 2019-06-17 16:17:11 +02:00
kamel5 b8b95f61ed Add more options to cRecMenuSearchTimerEdit 2019-06-17 16:11:09 +02:00
kamel5 507ecc60f6 Eliminate all currentMenuItems 2019-06-17 14:39:11 +02:00
kamel5 ef4ff3d115 Some refatoring to searchTimer 2019-06-17 14:38:17 +02:00
kamel5 1c591b5408 Eliminate InitMenuItems in cRecMenuSearchTimerEdit 2019-06-17 14:38:09 +02:00
kamel5 5b1e174316 Move some inits to cRecMenuSearchTimerEdit::cRecMenuSearchTimerEdit 2019-06-17 14:36:03 +02:00
kamel5 1a2da2da0a Eliminate AddSubMenu in cRecMenuSearchTimerEdit 2019-06-17 14:36:03 +02:00
kamel5 b83ad6df81 Add some parameter to cTVGuideSearchTimer 2019-06-17 14:36:03 +02:00
kamel5 0a931b97dc Cosmetic changes 2019-06-17 14:36:03 +02:00
kamel5 3cce1d2ead Delete advancedOptions in cRecMenuSearchTimerEdit 2019-06-17 14:35:53 +02:00
kamel5 f6a7ae497c Some changes to RecMenuItems 2019-06-16 14:50:15 +02:00
kamel5 803b28aad9 Cosmetic changes in searchtimer.c 2019-06-16 14:49:59 +02:00
kamel5 d5f46dacc6 Add some Modes to searchtimer.* 2019-06-16 14:23:44 +02:00
kamel5 763f9d4e52 Changes in recmenu.c 2019-06-16 14:01:22 +02:00
kamel5 82e404a74e Add cRecManager::GetSearchExtCats and cRecManager::GetBlacklists 2019-06-16 13:45:47 +02:00
kamel5 872a0618f8 Cosmetic changes 2019-06-16 13:36:05 +02:00
kamel5 d0c1519463 Version 1.2.7 2019-06-02 11:14:37 +02:00
kamel5 c081bc5ca1 Correct a compiler error 2019-05-04 12:59:14 +02:00
kamel5 8b1651401c Optical changes in favorites and searchtimer menu 2019-04-26 11:15:08 +02:00
kamel5 5df21a4707 Eliminate a "invalid lock sequence report" in tvguideosd.c 2019-04-23 13:44:44 +02:00
kamel5 e7753834bc Version 1.2.6 2019-04-14 13:58:22 +02:00
kamel5 d1e5e240ec Change channel icon size in cRecMenuSearchTimerEdit 2019-04-14 13:58:15 +02:00
kamel5 6e83787437 Channelgroup in cRecMenuSearchTimerEdit 2019-04-14 13:58:07 +02:00
kamel5 333a3d397f Add .gitignore 2019-04-14 13:58:01 +02:00
kamel5 80acee49e1 Changes for Rec Icon in DrawHeader 2019-04-10 16:59:22 +02:00
kamel5 6095fb4dbc Update services/epgsearch.h 2019-04-09 16:20:50 +02:00
kamel5 e01a63b29e Optimizations in setup menu 2019-04-09 15:08:16 +02:00
kamel5 0975e97519 Different setup parameter for displayTime in horizontal and vertical mode 2019-04-09 15:06:39 +02:00
kamel5 929d8db9ba Optical changes in displaymode vertical 2019-04-09 14:50:42 +02:00
kamel5 56250e3af8 Update services/epgsearch.h 2019-04-07 18:27:53 +02:00
kamel5 d825d700eb Correct an error in setup page 2019-04-07 15:58:55 +02:00
kamel5 ae206f4768 Eliminate a compiler warning in searchtimer.c 2019-04-07 12:59:55 +02:00
kamel5 c7f0131d52 Some cosmetic changes 2019-04-07 12:57:22 +02:00
kamel5 52d887d854 Some changes for VDR < 2.3.0 2019-04-07 12:57:14 +02:00
kamel5 6f7042d41f Correct an error with the recording sign in grid 2019-04-07 12:56:53 +02:00
kamel5 9009f4f385 A german DESCRIPTION 2019-04-07 12:55:44 +02:00
kamel5 b70112ae50 Version 1.2.5 2019-04-05 13:23:09 +02:00
kamel5 9df447454c Add switchMode to setup menu 2019-04-05 13:20:17 +02:00
kamel5 8ae5d34bef Inactive timer in DrawHeader 2019-04-03 14:00:05 +02:00
kamel5 7d44c8f91f Correct Warnung: Variable »ti« gesetzt 2019-04-01 17:05:07 +02:00
kamel5 e399518900 Some changes for VDR < 2.3.0 2019-04-01 17:04:23 +02:00
kamel5 dfb2c2b031 Eliminate a seqfault in cRecManager::DeleteSearchTimer 2019-04-01 17:00:44 +02:00
kamel5 060089548a Fixed a "invalid lock sequence report" in "cRecManager::PerformSearchTimerSearch" 2019-04-01 17:00:16 +02:00
kamel5 56014ea736 Correct x position in EPG grid view 2019-03-28 18:21:32 +01:00
kamel5 f56219c93c Correct x position in cRecMenuItemEvent::Draw 2019-03-28 18:21:32 +01:00
kamel5 7ca598f64e Compile again with VDR < 2.3.0 2019-03-28 18:20:20 +01:00
kamel5 4474b5f5b5 Version 1.2.4 2019-03-23 16:41:50 +01:00
kamel5 d5ecea55a6 Update "services/epgsearch.h" 2019-03-23 15:55:42 +01:00
kamel5 3a940d061c Center channel logos in favorite view 2019-03-23 15:44:46 +01:00
kamel5 10f6d90f16 Eliminate some warnings 2019-03-23 15:42:41 +01:00
kamel5 168973331c Fixed a "invalid lock sequence report" 2019-03-23 12:35:25 +01:00
kamel5 ff599e4cda Add "switchMinsBefore" to setup menu 2019-03-22 15:06:14 +01:00
kamel5 f7e5ac3208 Some cosmetic changes 2019-03-22 13:21:18 +01:00
kamel5 a8ca6f19da Set ff=unix for some files 2019-03-22 13:17:22 +01:00
kamel5 68af1b2086 Correct a switchtimer error 2019-03-20 16:12:54 +01:00
kamel5 d9b8af10e7 Makefile change from imagemagick to graphicsmagick 2019-02-28 14:10:27 +01:00
kamel5 9f98eddc41 Add italian translation 2019-02-28 13:45:22 +01:00
kamel5 431e99d1d4 Support for new SVDRPPeering 2019-02-04 12:02:46 +01:00
kamel5 415e433c73 Version 1.2.3 2019-01-27 12:22:47 +01:00
kamel5 0f092903e8 Clock in timeline if displaymode horizontal 2019-01-27 11:55:31 +01:00
kamel5 e62ea368e8 Change in cEpgGrid::SetTimer 2019-01-27 11:50:59 +01:00
kamel5 c1fe8a8dfd Center channel logos in EPG grid view 2019-01-27 11:42:29 +01:00
kamel5 d0969687ea Center channel logos in EPG detail view 2019-01-27 11:42:24 +01:00
kamel5 b086cf85dc Changes for locking in cChannelColumn::SetTimers() 2019-01-27 11:41:49 +01:00
kamel5 b054fa2c12 Updated hasTimer 2019-01-27 11:40:33 +01:00
kamel5 aa26a69ef8 Changes in cRecManager::DeleteTimer 2019-01-27 11:39:34 +01:00
kamel5 91488f0f60 Changes in cRecManager::SaveTimer 2019-01-27 11:39:15 +01:00
kamel5 39dfe767fc Changes for LOCKING 2019-01-27 11:38:58 +01:00
kamel5 8f1f2dea33 Correct view of vdr's switchtimer 2019-01-27 11:38:27 +01:00
kamel5 f592012442 Eliminate deadlock in "EditTimer" 2019-01-27 11:34:31 +01:00
kamel5 c6d01ba60b Eliminate deadlock in "DeleteTimer" 2019-01-27 11:34:22 +01:00
kamel5 d5b3844dcc Show vdr's switchtimer 2019-01-27 11:33:48 +01:00
kamel5 2ed3344bb9 Some changes for LOCKING 2019-01-27 11:32:20 +01:00
kamel5 82fb45a088 Cosmetic changes 2019-01-27 11:31:16 +01:00
kamel5 e476e0e8c0 Show inactive timer 2019-01-27 11:30:14 +01:00
kamel5 881c95a61c New Makefile style 2019-01-27 11:30:07 +01:00
kamel5 bf2937d86c Cosmetic changes / SwitchTimer& operator / std:min,std:max 2019-01-27 11:30:01 +01:00
kamel5 6ae27238af Reinsert old tvscraper compatibility 2019-01-27 11:29:55 +01:00
kamel5 cbc6f44264 Compile under VDR 2.3.1 2019-01-27 11:29:38 +01:00
79 changed files with 13297 additions and 10356 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
*.o
*.so
po/*.mo
po/*.pot
.dependencies

163
HISTORY
View File

@ -138,3 +138,166 @@ Version 1.2.2
- added scraper2vdr support - added scraper2vdr support
- introduced tabbed EPG detail view - introduced tabbed EPG detail view
Version 1.2.3
- Compile under VDR 2.3.1+
- Reinsert old tvscraper compatibility
- New Makefile style
- Show inactive timer in EPG grid
- Center channel logos in EPG
- Clock in timeline if displaymode horizontal
Version 1.2.4
- Add Support for new SVDRPPeering
- Add italian translation
- Use graphicsmagick instead of imagemagick
- Correct a switchtimer error
- Add "switchMinsBefore" to setup menu
- Eliminate some warnings
- Center channel logos in favorite view
- Update "services/epgsearch.h"
Version 1.2.5
- Compile again with VDR < 2.3.0
- Correct some x positions in EPG grid
- Fixed a "invalid lock sequence report" in "cRecManager::PerformSearchTimerSearch"
- Eliminate a seqfault in "cRecManager::DeleteSearchTimer"
- Show Inactive timer in DrawHeader
- Add "switchMode" to setup menu
Version 1.2.6
- Some changes for VDR < 2.3.0
- Changes for Rec Icon in DrawHeader and Grid
- Eliminate a compiler warning in searchtimer.c
- Correct an error in setup page
- Optical changes in displaymode vertical
- Different setup parameter for displayTime in horizontal and vertical mode
- Optimizations in setup menu
- Add .gitignore
- Channelgroup in cRecMenuSearchTimerEdit
(Create and modify of channelgroups isn't yet possible, should be done in epgsearch)
- Change channel icon size in cRecMenuSearchTimerEdit
Version 1.2.7
- Eliminate a "invalid lock sequence report" in tvguideosd.c
- Optical changes in favorites and searchtimer menu
- Changes in README
Version 1.2.8
- Some refactoring
- Update i18n
- Add almost all search timer options to cRecMenuSearchTimerEdit,
only one is missing: "Use content descriptor"
(Create and modify of channelgroups and blacklists isn't possible,
because the epgsearch service interface doesn't support that,
should be done in epgsearch)
Version 1.2.9
- Correct plugin options in README and CommandLineHelp
- Change locking in cTVGuideSearchTimer::cTVGuideSearchTimer
- Fixed a dayOfWeek error in RecMenuSearchTimerEdit
Version 1.2.10
- Update remotetimers.h
- Simplify cRecMenuSearchTimerEdit::GetSearchTimer
- Fixed cRecMenuItemSelectDirectory::DrawValue
- Some rework
Version 1.2.11
- Fixed a segfault with graphicsmagick > 1.3.31
- Fixed a possible deadlock in detailview
- Optical changes in cMenuSetupImageCache
Version 1.2.12
- Fixed updating current time
- Fixed updating current TimeBase
- Diplay the current TimeBase throughout the whole timeline
Version 1.2.13
- Revert "Diplay the current TimeBase throughout the whole timeline"
Version 1.2.14
- Diplay the current TimeBase throughout the whole timeline
- Can switch off and optimize diplay time in epggrid "displayMode == Vertical"
- Fixed a error while changing a Theme
Version 1.2.15
- Workaround for HWAccelerated OSD
Version 1.2.16
- Fixed a timer changed message
- Extend keys kFastRew, kFastFwd, kPrev, kNext for TimeJump
(if you use the numeric keys for "Jump to specific channel",
you can now use the keys kFastRew, kFastFwd, kPrev, kNext for TimeJump.
Note: if you use the permashift-plugin then the key kFastRew doesnt work for TimeJump)
- Fixed a possible deadlook in cEPGView::cEPGView
- Refactor Timeline
- Refactor CutText in horizontal epgview
- Optimize display "REC" sign in epgview
- Separate "displayTime" for horizontal and vertical view
- RecMenu "Timer Timeline" displays now sorted active timer
Version 1.2.17
- Final fix for utf8 CutText
- Fixed a remote timer problem
- Add episode to manual timer
Version 1.3.0
- last version with <VDR-2.3.1 compatibility
- Fixed a possible seqfault in DisplayTimerConflict
- Show numTimersToday in timeline
- Fixed stopIndex in cRecMenu::JumpBegin
- Fixed horizontal alignment in timeline
- Fixed messages in DisplayTimerConflict
Version 1.3.1
- Fixes for <VDR-2.3.1 compatibility
- Fixed a segfault while starting tvguide
Version 1.3.2
- Fixed display groupname in cChannelGroupGrid::DrawHorizontal
- Center some channel logos
- Add "Timer On/Off" to recmenu
- Wrap title in detailview header
- Optional deactivation of the timer confirmation messages
Version 1.3.3
- Bugfix
Version 1.3.4
- Fix for gcc11
Version 1.3.5
- Fix for VDR-2.5.4
- Update iceblue theme
Version 1.3.6
- Fix segfault when tvscraper returns "call->type = tNone"
- In menu "Search Recordins" get ChannelName from 'RecInfo'
- Display errors in search recordings
- Fixed possible segfault when showing scrollbar in search result lists
- Adapt epgsearch "allow empty" for searchtimer
- some rework
- optical optimization

View File

@ -4,7 +4,8 @@
# $Id$ # $Id$
# External image lib to use: imagemagick, graphicsmagick # External image lib to use: imagemagick, graphicsmagick
IMAGELIB = imagemagick #IMAGELIB = imagemagick
IMAGELIB = graphicsmagick
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
@ -59,7 +60,7 @@ endif
### The object files (add further files here): ### The object files (add further files here):
OBJS = $(PLUGIN).o channelcolumn.o channelgroup.o channelgroups.o channeljump.o config.o detailview.o dummygrid.o epggrid.o fontmanager.o footer.o geometrymanager.o grid.o headergrid.o imagecache.o imageloader.o imagemagickwrapper.o imagescaler.o osdmanager.o recmanager.o recmenu.o recmenuitem.o recmenumanager.o recmenus.o searchtimer.o setup.o statusheader.o styledpixmap.o switchtimer.o timeline.o timer.o timerconflict.o tools.o tvguideosd.o view.o OBJS = $(PLUGIN).o channelepg.o channelgroup.o channelgroups.o channeljump.o config.o detailview.o dummygrid.o epggrid.o fontmanager.o footer.o geometrymanager.o gridelement.o headergrid.o imagecache.o imageloader.o imagemagickwrapper.o imagescaler.o osdmanager.o recmanager.o recmenu.o recmenuitem.o recmenuview.o recmenus.o searchtimer.o setup.o statusheader.o styledpixmap.o switchtimer.o timeline.o timemanager.o timerconflict.o tools.o tvguideosd.o view.o
### The main target: ### The main target:
@ -68,7 +69,8 @@ all: $(SOFILE) i18n
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $< @echo CC $@
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies: ### Dependencies:
@ -88,17 +90,21 @@ I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU
I18Npot = $(PODIR)/$(PLUGIN).pot I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po %.mo: %.po
msgfmt -c -o $@ $< @echo MO $@
$(Q)msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c) $(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^` @echo GT $@
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
%.po: $(I18Npot) %.po: $(I18Npot)
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $< @echo PO $@
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@ @touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
install -D -m644 $< $@ @echo IN $@
$(Q)install -D -m644 $< $@
.PHONY: i18n .PHONY: i18n
i18n: $(I18Nmo) $(I18Npot) i18n: $(I18Nmo) $(I18Npot)
@ -108,10 +114,12 @@ install-i18n: $(I18Nmsgs)
### Targets: ### Targets:
$(SOFILE): $(OBJS) $(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) $(LIBS) -o $@ @echo LD $@
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) $(LIBS) -o $@
install-lib: $(SOFILE) install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) @echo IN $@
$(Q)install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
install-themes: install-themes:
@mkdir -p $(DESTDIR)$(VDRCONFDIR)/themes @mkdir -p $(DESTDIR)$(VDRCONFDIR)/themes

16
README
View File

@ -1,10 +1,14 @@
This is a "plugin" for the Video Disk Recorder (VDR). This is a "plugin" for the Video Disk Recorder (VDR).
Written by: Louis Braun <louis DOT braun AT gmx DOT de> TVGuide on GitLab: https://gitlab.com/kamel5/tvguide
Project's homepage: http://projects.vdr-developer.org/projects/plg-tvguide Original Written by: Louis Braun <louis DOT braun AT gmx DOT de>
Latest version available at: http://projects.vdr-developer.org/projects/plg-tvguide/files Original Project's homepage: http://projects.vdr-developer.org/projects/plg-tvguide
Latest version available at: https://gitlab.com/kamel5/tvguide
Original version available at: http://projects.vdr-developer.org/projects/plg-tvguide/files
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -40,13 +44,13 @@ After "normal" Plugin installation you have to care about the paths for the
used Icons, the channel logos and epg images. The following paths can be set used Icons, the channel logos and epg images. The following paths can be set
at startup: at startup:
-l path, --logodir=path -l path, --logopath=path
Path to the logos (Default: <ResourceDirectory>/plugins/tvguide/channellogos/). Path to the logos (Default: <ResourceDirectory>/plugins/tvguide/channellogos/).
-e path, --epgimages=path -e path, --epgimages=path
Path to the epgimages (Default: <CacheDirectory>/plugins/tvguide/epgimages/). Path to the epgimages (Default: <CacheDirectory>/plugins/tvguide/epgimages/).
-i path, --icons=path -i path, --iconpath=path
Path to the icons directory (Default: <ResourceDirectory>/plugins/tvguide/epgimages/). Path to the icons directory (Default: <ResourceDirectory>/plugins/tvguide/epgimages/).
<ResourceDirectory> and <CacheDirectory> is taken from your VDR configuration <ResourceDirectory> and <CacheDirectory> is taken from your VDR configuration
@ -274,4 +278,4 @@ Setup Options
- Maximal number of logos to cache - Maximal number of logos to cache
- Number of logos to cache at start: number of logos to pre cache at plugin startup - Number of logos to cache at start: number of logos to pre cache at plugin startup
(a too large number causes a slower VDR start) (a too large number causes a slower VDR start)
- Information about image cache sizes - Information about image cache sizes

View File

@ -1,62 +0,0 @@
#ifndef __TVGUIDE_CHANNELCOLUMN_H
#define __TVGUIDE_CHANNELCOLUMN_H
#include <vdr/tools.h>
#include "grid.h"
#include "epggrid.h"
#include "headergrid.h"
#include "switchtimer.h"
class cGrid;
class cEpgGrid;
class cHeaderGrid;
// --- cChannelColumn -------------------------------------------------------------
class cChannelColumn : public cListObject, public cStyledPixmap {
private:
cMyTime *myTime;
int num;
const cChannel *channel;
cHeaderGrid *header;
cList<cGrid> grids;
cSchedulesLock *schedulesLock;
const cSchedules *schedules;
bool hasTimer;
bool hasSwitchTimer;
cGrid *addEpgGrid(const cEvent *event, cGrid *firstGrid, bool color);
cGrid *addDummyGrid(time_t start, time_t end, cGrid *firstGrid, bool color);
public:
cChannelColumn(int num, const cChannel *channel, cMyTime *myTime);
virtual ~cChannelColumn(void);
void createHeader();
void drawHeader();
bool readGrids();
void drawGrids();
int getX();
int getY();
int Start() { return myTime->GetStart(); };
int Stop() { return myTime->GetEnd(); };
const char* Name() { return channel->Name(); };
const cChannel * getChannel() {return channel;}
cGrid * getActive();
cGrid * getNext(cGrid *activeGrid);
cGrid * getPrev(cGrid *activeGrid);
cGrid * getNeighbor(cGrid *activeGrid);
bool isFirst(cGrid *grid);
void AddNewGridsAtStart();
void AddNewGridsAtEnd();
void ClearOutdatedStart();
void ClearOutdatedEnd();
int GetNum() {return num;};
void SetNum(int num) {this->num = num;};
void setTimer() {hasTimer = channel->HasTimer();};
bool HasTimer() { return hasTimer; };
void setSwitchTimer() {hasSwitchTimer = SwitchTimers.ChannelInSwitchList(channel);};
bool HasSwitchTimer() { return hasSwitchTimer; };
void SetTimers();
void clearGrids();
void dumpGrids();
};
#endif //__TVGUIDE_CHANNELCOLUMN_H

View File

@ -1,53 +1,67 @@
#include "channelcolumn.h" #include "channelepg.h"
#include "dummygrid.h" #include "dummygrid.h"
cChannelColumn::cChannelColumn(int num, const cChannel *channel, cMyTime *myTime) { cChannelEpg::cChannelEpg(int num, const cChannel *channel, cTimeManager *timeManager) {
this->channel = channel; this->channel = channel;
this->num = num; this->num = num;
this->myTime = myTime; this->timeManager = timeManager;
#if VDRVERSNUM < 20301
hasTimer = channel->HasTimer(); hasTimer = channel->HasTimer();
#endif
hasSwitchTimer = SwitchTimers.ChannelInSwitchList(channel); hasSwitchTimer = SwitchTimers.ChannelInSwitchList(channel);
#if VDRVERSNUM < 20301
schedulesLock = new cSchedulesLock(false, 100); schedulesLock = new cSchedulesLock(false, 100);
#endif
header = NULL; header = NULL;
} }
cChannelColumn::~cChannelColumn(void) { cChannelEpg::~cChannelEpg(void) {
if (header) if (header)
delete header; delete header;
grids.Clear(); grids.Clear();
#if VDRVERSNUM < 20301
delete schedulesLock; delete schedulesLock;
#endif
} }
void cChannelColumn::clearGrids() { void cChannelEpg::clearGrids() {
grids.Clear(); grids.Clear();
} }
void cChannelColumn::createHeader() { void cChannelEpg::createHeader() {
header = new cHeaderGrid(); header = new cHeaderGrid();
header->createBackground(num); header->createBackground(num);
header->drawChannel(channel); header->drawChannel(channel);
} }
void cChannelColumn::drawHeader() { void cChannelEpg::drawHeader() {
header->setPosition(num); header->setPosition(num);
} }
bool cChannelColumn::readGrids() { bool cChannelEpg::readGrids() {
#if VDRVERSNUM >= 20301
const cSchedules* schedules;
{
LOCK_SCHEDULES_READ;
schedules = Schedules;
}
#else
schedules = cSchedules::Schedules(*schedulesLock); schedules = cSchedules::Schedules(*schedulesLock);
#endif
const cSchedule *Schedule = NULL; const cSchedule *Schedule = NULL;
Schedule = schedules->GetSchedule(channel); Schedule = schedules->GetSchedule(channel);
if (!Schedule) { if (!Schedule) {
addDummyGrid(myTime->GetStart(), myTime->GetEnd(), NULL, false); addDummyGrid(timeManager->GetStart(), timeManager->GetEnd(), NULL, false);
return true; return true;
} }
bool eventFound = false; bool eventFound = false;
bool dummyAtStart = false; bool dummyAtStart = false;
const cEvent *startEvent = Schedule->GetEventAround(myTime->GetStart()); const cEvent *startEvent = Schedule->GetEventAround(timeManager->GetStart());
if (startEvent != NULL) { if (startEvent != NULL) {
eventFound = true; eventFound = true;
} else { } else {
for (int i=1; i<6; i++) { for (int i=1; i<6; i++) {
startEvent = Schedule->GetEventAround(myTime->GetStart()+i*5*60); startEvent = Schedule->GetEventAround(timeManager->GetStart()+i*5*60);
if (startEvent) { if (startEvent) {
eventFound = true; eventFound = true;
dummyAtStart = true; dummyAtStart = true;
@ -58,20 +72,20 @@ bool cChannelColumn::readGrids() {
if (eventFound) { if (eventFound) {
bool col = true; bool col = true;
if (dummyAtStart) { if (dummyAtStart) {
addDummyGrid(myTime->GetStart(), startEvent->StartTime(), NULL, col); addDummyGrid(timeManager->GetStart(), startEvent->StartTime(), NULL, col);
col = !col; col = !col;
} }
bool dummyNeeded = true; bool dummyNeeded = true;
bool toFarInFuture = false; bool toFarInFuture = false;
time_t endLast = myTime->GetStart(); time_t endLast = timeManager->GetStart();
const cEvent *event = startEvent; const cEvent *event = startEvent;
const cEvent *eventLast = NULL; const cEvent *eventLast = NULL;
for (; event; event = Schedule->Events()->Next(event)) { for (; event; event = Schedule->Events()->Next(event)) {
if (endLast < event->StartTime()) { if (endLast < event->StartTime()) {
//gap, dummy needed //gap, dummy needed
time_t endTime = event->StartTime(); time_t endTime = event->StartTime();
if (endTime > myTime->GetEnd()) { if (endTime > timeManager->GetEnd()) {
endTime = myTime->GetEnd(); endTime = timeManager->GetEnd();
toFarInFuture = true; toFarInFuture = true;
} }
addDummyGrid(endLast, endTime, NULL, col); addDummyGrid(endLast, endTime, NULL, col);
@ -83,74 +97,76 @@ bool cChannelColumn::readGrids() {
addEpgGrid(event, NULL, col); addEpgGrid(event, NULL, col);
col = !col; col = !col;
endLast = event->EndTime(); endLast = event->EndTime();
if (event->EndTime() > myTime->GetEnd()) { if (event->EndTime() > timeManager->GetEnd()) {
dummyNeeded = false; dummyNeeded = false;
break; break;
} }
eventLast = event; eventLast = event;
} }
if (dummyNeeded) { if (dummyNeeded) {
addDummyGrid(eventLast->EndTime(), myTime->GetEnd(), NULL, col); addDummyGrid(eventLast->EndTime(), timeManager->GetEnd(), NULL, col);
} }
return true; return true;
} else { } else {
addDummyGrid(myTime->GetStart(), myTime->GetEnd(), NULL, false); addDummyGrid(timeManager->GetStart(), timeManager->GetEnd(), NULL, false);
return true; return true;
} }
return false; return false;
} }
void cChannelColumn::drawGrids() { void cChannelEpg::drawGrids() {
for (cGrid *grid = grids.First(); grid; grid = grids.Next(grid)) { for (cGridElement *grid = grids.First(); grid; grid = grids.Next(grid)) {
grid->SetViewportHeight(); grid->SetViewportHeight();
grid->PositionPixmap(); grid->PositionPixmap();
grid->Draw(); grid->Draw();
} }
} }
int cChannelColumn::getX() { int cChannelEpg::getX() {
return geoManager.timeLineWidth + num*geoManager.colWidth; return geoManager.timeLineWidth + num*geoManager.colWidth;
} }
int cChannelColumn::getY() { int cChannelEpg::getY() {
return geoManager.statusHeaderHeight + geoManager.timeLineHeight + num*geoManager.rowHeight; return geoManager.statusHeaderHeight + geoManager.timeLineHeight + num*geoManager.rowHeight;
} }
cGrid * cChannelColumn::getActive() { cGridElement *cChannelEpg::getActive(bool last) {
cMyTime t; cTimeManager t;
t.Now(); t.Now();
for (cGrid *grid = grids.First(); grid; grid = grids.Next(grid)) { if (last)
return grids.Last();
for (cGridElement *grid = grids.First(); grid; grid = grids.Next(grid)) {
if (grid->Match(t.Get())) if (grid->Match(t.Get()))
return grid; return grid;
} }
return grids.First(); return grids.First();
} }
cGrid * cChannelColumn::getNext(cGrid *activeGrid) { cGridElement *cChannelEpg::getNext(cGridElement *activeGrid) {
if (activeGrid == NULL) if (activeGrid == NULL)
return NULL; return NULL;
cGrid *next = grids.Next(activeGrid); cGridElement *next = grids.Next(activeGrid);
if (next) if (next)
return next; return next;
return NULL; return NULL;
} }
cGrid * cChannelColumn::getPrev(cGrid *activeGrid) { cGridElement *cChannelEpg::getPrev(cGridElement *activeGrid) {
if (activeGrid == NULL) if (activeGrid == NULL)
return NULL; return NULL;
cGrid *prev = grids.Prev(activeGrid); cGridElement *prev = grids.Prev(activeGrid);
if (prev) if (prev)
return prev; return prev;
return NULL; return NULL;
} }
cGrid * cChannelColumn::getNeighbor(cGrid *activeGrid) { cGridElement *cChannelEpg::getNeighbor(cGridElement *activeGrid) {
if (!activeGrid) if (!activeGrid)
return NULL; return NULL;
cGrid *neighbor = NULL; cGridElement *neighbor = NULL;
int overlap = 0; int overlap = 0;
int overlapNew = 0; int overlapNew = 0;
cGrid *grid = NULL; cGridElement *grid = NULL;
grid = grids.First(); grid = grids.First();
if (grid) { if (grid) {
for (; grid; grid = grids.Next(grid)) { for (; grid; grid = grids.Next(grid)) {
@ -170,29 +186,37 @@ cGrid * cChannelColumn::getNeighbor(cGrid *activeGrid) {
return neighbor; return neighbor;
} }
bool cChannelColumn::isFirst(cGrid *grid) { bool cChannelEpg::isFirst(cGridElement *grid) {
if (grid == grids.First()) if (grid == grids.First())
return true; return true;
return false; return false;
} }
void cChannelColumn::AddNewGridsAtStart() { void cChannelEpg::AddNewGridsAtStart() {
cGrid *firstGrid = NULL; cGridElement *firstGrid = NULL;
firstGrid = grids.First(); firstGrid = grids.First();
if (firstGrid == NULL) if (firstGrid == NULL)
return; return;
//if first event is long enough, nothing to do. //if first event is long enough, nothing to do.
if (firstGrid->StartTime() <= myTime->GetStart()) { if (firstGrid->StartTime() <= timeManager->GetStart()) {
return; return;
} }
//if not, i have to add new ones to the list //if not, i have to add new ones to the list
#if VDRVERSNUM >= 20301
const cSchedules* schedules;
{
LOCK_SCHEDULES_READ;
schedules = Schedules;
}
#else
schedules = cSchedules::Schedules(*schedulesLock); schedules = cSchedules::Schedules(*schedulesLock);
#endif
const cSchedule *Schedule = NULL; const cSchedule *Schedule = NULL;
Schedule = schedules->GetSchedule(channel); Schedule = schedules->GetSchedule(channel);
if (!Schedule) { if (!Schedule) {
if (firstGrid->isDummy()) { if (firstGrid->IsDummy()) {
firstGrid->SetStartTime(myTime->GetStart()); firstGrid->SetStartTime(timeManager->GetStart());
firstGrid->SetEndTime(myTime->GetEnd()); firstGrid->SetEndTime(timeManager->GetEnd());
} }
return; return;
} }
@ -201,46 +225,54 @@ void cChannelColumn::AddNewGridsAtStart() {
for (const cEvent *event = Schedule->GetEventAround(firstGrid->StartTime()-60); event; event = Schedule->Events()->Prev(event)) { for (const cEvent *event = Schedule->GetEventAround(firstGrid->StartTime()-60); event; event = Schedule->Events()->Prev(event)) {
if (!event) if (!event)
break; break;
if (event->EndTime() < myTime->GetStart()) { if (event->EndTime() < timeManager->GetStart()) {
break; break;
} }
cGrid *grid = addEpgGrid(event, firstGrid, col); cGridElement *grid = addEpgGrid(event, firstGrid, col);
col = !col; col = !col;
firstGrid = grid; firstGrid = grid;
if (event->StartTime() <= myTime->GetStart()) { if (event->StartTime() <= timeManager->GetStart()) {
dummyNeeded = false; dummyNeeded = false;
break; break;
} }
} }
if (dummyNeeded) { if (dummyNeeded) {
firstGrid = grids.First(); firstGrid = grids.First();
if (firstGrid->isDummy()) { if (firstGrid->IsDummy()) {
firstGrid->SetStartTime(myTime->GetStart()); firstGrid->SetStartTime(timeManager->GetStart());
if (firstGrid->EndTime() >= myTime->GetEnd()) if (firstGrid->EndTime() >= timeManager->GetEnd())
firstGrid->SetEndTime(myTime->GetEnd()); firstGrid->SetEndTime(timeManager->GetEnd());
} else { } else {
addDummyGrid(myTime->GetStart(), firstGrid->StartTime(), firstGrid, col); addDummyGrid(timeManager->GetStart(), firstGrid->StartTime(), firstGrid, col);
} }
} }
} }
void cChannelColumn::AddNewGridsAtEnd() { void cChannelEpg::AddNewGridsAtEnd() {
cGrid *lastGrid = NULL; cGridElement *lastGrid = NULL;
lastGrid = grids.Last(); lastGrid = grids.Last();
if (lastGrid == NULL) if (lastGrid == NULL)
return; return;
//if last event is long enough, nothing to do. //if last event is long enough, nothing to do.
if (lastGrid->EndTime() >= myTime->GetEnd()) { if (lastGrid->EndTime() >= timeManager->GetEnd()) {
return; return;
} }
//if not, i have to add new ones to the list //if not, i have to add new ones to the list
#if VDRVERSNUM >= 20301
const cSchedules* schedules;
{
LOCK_SCHEDULES_READ;
schedules = Schedules;
}
#else
schedules = cSchedules::Schedules(*schedulesLock); schedules = cSchedules::Schedules(*schedulesLock);
#endif
const cSchedule *Schedule = NULL; const cSchedule *Schedule = NULL;
Schedule = schedules->GetSchedule(channel); Schedule = schedules->GetSchedule(channel);
if (!Schedule) { if (!Schedule) {
if (lastGrid->isDummy()) { if (lastGrid->IsDummy()) {
lastGrid->SetStartTime(myTime->GetStart()); lastGrid->SetStartTime(timeManager->GetStart());
lastGrid->SetEndTime(myTime->GetEnd()); lastGrid->SetEndTime(timeManager->GetEnd());
} }
return; return;
} }
@ -249,45 +281,45 @@ void cChannelColumn::AddNewGridsAtEnd() {
for (const cEvent *event = Schedule->GetEventAround(lastGrid->EndTime()+60); event; event = Schedule->Events()->Next(event)) { for (const cEvent *event = Schedule->GetEventAround(lastGrid->EndTime()+60); event; event = Schedule->Events()->Next(event)) {
if (!event) if (!event)
break; break;
if (event->StartTime() > myTime->GetEnd()) { if (event->StartTime() > timeManager->GetEnd()) {
break; break;
} }
addEpgGrid(event, NULL, col); addEpgGrid(event, NULL, col);
col = !col; col = !col;
if (event->EndTime() > myTime->GetEnd()) { if (event->EndTime() > timeManager->GetEnd()) {
dummyNeeded = false; dummyNeeded = false;
break; break;
} }
} }
if (dummyNeeded) { if (dummyNeeded) {
lastGrid = grids.Last(); lastGrid = grids.Last();
if (lastGrid->isDummy()) { if (lastGrid->IsDummy()) {
lastGrid->SetEndTime(myTime->GetEnd()); lastGrid->SetEndTime(timeManager->GetEnd());
if (lastGrid->StartTime() <= myTime->GetStart()) if (lastGrid->StartTime() <= timeManager->GetStart())
lastGrid->SetStartTime(myTime->GetStart()); lastGrid->SetStartTime(timeManager->GetStart());
} else { } else {
addDummyGrid(lastGrid->EndTime(), myTime->GetEnd(), NULL, col); addDummyGrid(lastGrid->EndTime(), timeManager->GetEnd(), NULL, col);
} }
} }
} }
void cChannelColumn::ClearOutdatedStart() { void cChannelEpg::ClearOutdatedStart() {
cGrid *firstGrid = NULL; cGridElement *firstGrid = NULL;
while (true) { while (true) {
firstGrid = grids.First(); firstGrid = grids.First();
if (!firstGrid) if (!firstGrid)
break; break;
if (firstGrid->EndTime() <= myTime->GetStart()) { if (firstGrid->EndTime() <= timeManager->GetStart()) {
grids.Del(firstGrid); grids.Del(firstGrid);
firstGrid = NULL; firstGrid = NULL;
} else { } else {
if (firstGrid->isDummy()) { if (firstGrid->IsDummy()) {
firstGrid->SetStartTime(myTime->GetStart()); firstGrid->SetStartTime(timeManager->GetStart());
cGrid *next = getNext(firstGrid); cGridElement *next = getNext(firstGrid);
if (next) { if (next) {
firstGrid->SetEndTime(next->StartTime()); firstGrid->SetEndTime(next->StartTime());
} else { } else {
firstGrid->SetEndTime(myTime->GetEnd()); firstGrid->SetEndTime(timeManager->GetEnd());
} }
} }
break; break;
@ -295,23 +327,23 @@ void cChannelColumn::ClearOutdatedStart() {
} }
} }
void cChannelColumn::ClearOutdatedEnd() { void cChannelEpg::ClearOutdatedEnd() {
cGrid *lastGrid = NULL; cGridElement *lastGrid = NULL;
while (true) { while (true) {
lastGrid = grids.Last(); lastGrid = grids.Last();
if (!lastGrid) if (!lastGrid)
break; break;
if (lastGrid->StartTime() >= myTime->GetEnd()) { if (lastGrid->StartTime() >= timeManager->GetEnd()) {
grids.Del(lastGrid); grids.Del(lastGrid);
lastGrid = NULL; lastGrid = NULL;
} else { } else {
if (lastGrid->isDummy()) { if (lastGrid->IsDummy()) {
lastGrid->SetEndTime(myTime->GetEnd()); lastGrid->SetEndTime(timeManager->GetEnd());
cGrid *prev = getPrev(lastGrid); cGridElement *prev = getPrev(lastGrid);
if (prev) { if (prev) {
lastGrid->SetStartTime(prev->EndTime()); lastGrid->SetStartTime(prev->EndTime());
} else { } else {
lastGrid->SetStartTime(myTime->GetStart()); lastGrid->SetStartTime(timeManager->GetStart());
} }
} }
break; break;
@ -319,8 +351,8 @@ void cChannelColumn::ClearOutdatedEnd() {
} }
} }
cGrid *cChannelColumn::addEpgGrid(const cEvent *event, cGrid *firstGrid, bool color) { cGridElement *cChannelEpg::addEpgGrid(const cEvent *event, cGridElement *firstGrid, bool color) {
cGrid *grid = new cEpgGrid(this, event); cGridElement *grid = new cEpgGrid(this, event);
grid->setText(); grid->setText();
grid->SetColor(color); grid->SetColor(color);
if (!firstGrid) if (!firstGrid)
@ -330,8 +362,8 @@ cGrid *cChannelColumn::addEpgGrid(const cEvent *event, cGrid *firstGrid, bool co
return grid; return grid;
} }
cGrid *cChannelColumn::addDummyGrid(time_t start, time_t end, cGrid *firstGrid, bool color) { cGridElement *cChannelEpg::addDummyGrid(time_t start, time_t end, cGridElement *firstGrid, bool color) {
cGrid *dummy = new cDummyGrid(this, start, end); cGridElement *dummy = new cDummyGrid(this, start, end);
dummy->setText(); dummy->setText();
dummy->SetColor(color); dummy->SetColor(color);
if (!firstGrid) if (!firstGrid)
@ -341,13 +373,15 @@ cGrid *cChannelColumn::addDummyGrid(time_t start, time_t end, cGrid *firstGrid,
return dummy; return dummy;
} }
void cChannelColumn::SetTimers() { void cChannelEpg::SetTimers() {
#if VDRVERSNUM < 20301
hasTimer = channel->HasTimer(); hasTimer = channel->HasTimer();
#endif
hasSwitchTimer = SwitchTimers.ChannelInSwitchList(channel); hasSwitchTimer = SwitchTimers.ChannelInSwitchList(channel);
for (cGrid *grid = grids.First(); grid; grid = grids.Next(grid)) { for (cGridElement *grid = grids.First(); grid; grid = grids.Next(grid)) {
bool gridHadTimer = grid->HasTimer(); bool gridHadTimer = grid->HasTimer();
grid->SetTimer(); grid->SetTimer();
if (gridHadTimer != grid->HasTimer()) if (gridHadTimer || gridHadTimer != grid->HasTimer())
grid->SetDirty(); grid->SetDirty();
bool gridHadSwitchTimer = grid->HasSwitchTimer(); bool gridHadSwitchTimer = grid->HasSwitchTimer();
grid->SetSwitchTimer(); grid->SetSwitchTimer();
@ -357,11 +391,11 @@ void cChannelColumn::SetTimers() {
} }
} }
void cChannelColumn::dumpGrids() { void cChannelEpg::dumpGrids() {
esyslog("tvguide: ------Channel %s %d: %d entires ---------", channel->Name(), num, grids.Count()); esyslog("tvguide: ------Channel %s %d: %d entires ---------", channel->Name(), num, grids.Count());
int i=1; int i=1;
for (cGrid *grid = grids.First(); grid; grid = grids.Next(grid)) { for (cGridElement *grid = grids.First(); grid; grid = grids.Next(grid)) {
esyslog("tvguide: grid %d: start: %s, stop: %s", i, *cMyTime::printTime(grid->StartTime()), *cMyTime::printTime(grid->EndTime())); esyslog("tvguide: grid %d: start: %s, stop: %s", i, *cTimeManager::printTime(grid->StartTime()), *cTimeManager::printTime(grid->EndTime()));
i++; i++;
} }
} }

69
channelepg.h Normal file
View File

@ -0,0 +1,69 @@
#ifndef __TVGUIDE_CHANNELEPG_H
#define __TVGUIDE_CHANNELEPG_H
#include <vdr/tools.h>
#include "gridelement.h"
#include "epggrid.h"
#include "headergrid.h"
#include "switchtimer.h"
class cGridElement;
class cEpgGrid;
class cHeaderGrid;
// --- cChannelEpg -------------------------------------------------------------
class cChannelEpg : public cListObject, public cStyledPixmap {
private:
cTimeManager *timeManager;
int num;
const cChannel *channel;
cHeaderGrid *header;
cList<cGridElement> grids;
#if VDRVERSNUM >= 20301
#else
cSchedulesLock *schedulesLock;
#endif
const cSchedules *schedules;
bool hasTimer;
bool hasSwitchTimer;
cGridElement *addEpgGrid(const cEvent *event, cGridElement *firstGrid, bool color);
cGridElement *addDummyGrid(time_t start, time_t end, cGridElement *firstGrid, bool color);
public:
cChannelEpg(int num, const cChannel *channel, cTimeManager *timeManager);
virtual ~cChannelEpg(void);
void createHeader();
void drawHeader();
bool readGrids();
void drawGrids();
int getX();
int getY();
int Start() { return timeManager->GetStart(); };
int Stop() { return timeManager->GetEnd(); };
const char* Name() { return channel->Name(); };
const cChannel *getChannel() {return channel;}
cGridElement *getActive(bool last = false);
cGridElement *getNext(cGridElement *activeGrid);
cGridElement *getPrev(cGridElement *activeGrid);
cGridElement *getNeighbor(cGridElement *activeGrid);
bool isFirst(cGridElement *grid);
void AddNewGridsAtStart();
void AddNewGridsAtEnd();
void ClearOutdatedStart();
void ClearOutdatedEnd();
int GetNum() {return num;};
void SetNum(int num) {this->num = num;};
#if VDRVERSNUM >= 20301
void setTimer();
#else
void setTimer() {hasTimer = channel->HasTimer();};
#endif
bool HasTimer() { return hasTimer; };
void setSwitchTimer() {hasSwitchTimer = SwitchTimers.ChannelInSwitchList(channel);};
bool HasSwitchTimer() { return hasSwitchTimer; };
void SetTimers();
void clearGrids();
void dumpGrids();
};
#endif //__TVGUIDE_CHANNELEPG_H

View File

@ -1,98 +1,97 @@
#include <algorithm> #include <algorithm>
#include "channelgroup.h" #include "channelgroup.h"
#include "tools.h" #include "tools.h"
cChannelGroup::cChannelGroup(const char *name) { cChannelGroup::cChannelGroup(const char *name) {
channelStart = 0; channelStart = 0;
channelStop = 0; channelStop = 0;
this->name = name; this->name = name;
} }
cChannelGroup::~cChannelGroup(void) { cChannelGroup::~cChannelGroup(void) {
} }
void cChannelGroup::Dump(void) { void cChannelGroup::Dump(void) {
esyslog("tvguide: Group %s, startChannel %d, stopChannel %d", name, channelStart, channelStop); esyslog("tvguide: Group %s, startChannel %d, stopChannel %d", name, channelStart, channelStop);
} }
// --- cChannelGroupGrid ------------------------------------------------------------- // --- cChannelGroupGrid -------------------------------------------------------------
cChannelGroupGrid::cChannelGroupGrid(const char *name) { cChannelGroupGrid::cChannelGroupGrid(const char *name) {
this->name = name; this->name = name;
} }
cChannelGroupGrid::~cChannelGroupGrid(void) { cChannelGroupGrid::~cChannelGroupGrid(void) {
} }
void cChannelGroupGrid::SetBackground() { void cChannelGroupGrid::SetBackground() {
if (isColor1) { if (isColor1) {
color = theme.Color(clrGrid1); color = theme.Color(clrGrid1);
colorBlending = theme.Color(clrGrid1Blending); colorBlending = theme.Color(clrGrid1Blending);
} else { } else {
color = theme.Color(clrGrid2); color = theme.Color(clrGrid2);
colorBlending = theme.Color(clrGrid2Blending); colorBlending = theme.Color(clrGrid2Blending);
} }
} }
void cChannelGroupGrid::SetGeometry(int start, int end) { void cChannelGroupGrid::SetGeometry(int start, int end) {
int x, y, width, height; int x, y, width, height;
if (tvguideConfig.displayMode == eVertical) { if (config.displayMode == eVertical) {
x = geoManager.timeLineWidth + start*geoManager.colWidth; x = geoManager.timeLineWidth + start*geoManager.colWidth;
y = geoManager.statusHeaderHeight; y = geoManager.statusHeaderHeight;
width = (end - start + 1) * geoManager.colWidth; width = (end - start + 1) * geoManager.colWidth;
height = geoManager.channelGroupsHeight; height = geoManager.channelGroupsHeight;
} else if (tvguideConfig.displayMode == eHorizontal) { } else if (config.displayMode == eHorizontal) {
x = 0; x = 0;
y = geoManager.statusHeaderHeight + geoManager.timeLineHeight + start*geoManager.rowHeight; y = geoManager.statusHeaderHeight + geoManager.timeLineHeight + start*geoManager.rowHeight;
width = geoManager.channelGroupsWidth; width = geoManager.channelGroupsWidth;
height = (end - start + 1) * geoManager.rowHeight; height = (end - start + 1) * geoManager.rowHeight;
} }
pixmap = osdManager.requestPixmap(1, cRect(x, y, width, height)); pixmap = osdManager.CreatePixmap(1, cRect(x, y, width, height));
} }
void cChannelGroupGrid::Draw(void) { void cChannelGroupGrid::Draw(void) {
if (tvguideConfig.style == eStyleGraphical) { if (config.style == eStyleGraphical) {
drawBackgroundGraphical(bgChannelGroup); drawBackgroundGraphical(bgChannelGroup);
} else { } else {
drawBackground(); drawBackground();
drawBorder(); drawBorder();
} }
tColor colorText = theme.Color(clrFont); tColor colorText = theme.Color(clrFont);
tColor colorTextBack = (tvguideConfig.style == eStyleFlat)?color:clrTransparent; tColor colorTextBack = (config.style == eStyleFlat)?color:clrTransparent;
if (tvguideConfig.displayMode == eVertical) { if (config.displayMode == eVertical) {
DrawVertical(colorText, colorTextBack); DrawVertical(colorText, colorTextBack);
} else if (tvguideConfig.displayMode == eHorizontal) { } else if (config.displayMode == eHorizontal) {
DrawHorizontal(colorText, colorTextBack); DrawHorizontal(colorText, colorTextBack);
} }
} }
void cChannelGroupGrid::DrawVertical(tColor colorText, tColor colorTextBack) { void cChannelGroupGrid::DrawVertical(tColor colorText, tColor colorTextBack) {
int textY = (Height() - fontManager.FontChannelGroups->Height()) / 2; int textY = (Height() - fontManager.FontChannelGroups->Height()) / 2;
cString text = CutText(name, Width() - 4, fontManager.FontChannelGroups).c_str(); cString text = cString::sprintf("%s", CutText(name, Width() - 4, fontManager.FontChannelGroups).c_str());
int textWidth = fontManager.FontChannelGroups->Width(*text); int textWidth = fontManager.FontChannelGroups->Width(*text);
int x = (Width() - textWidth) / 2; int x = (Width() - textWidth) / 2;
pixmap->DrawText(cPoint(x, textY), *text, colorText, colorTextBack, fontManager.FontChannelGroups); pixmap->DrawText(cPoint(x, textY), *text, colorText, colorTextBack, fontManager.FontChannelGroups);
} }
void cChannelGroupGrid::DrawHorizontal(tColor colorText, tColor colorTextBack) { void cChannelGroupGrid::DrawHorizontal(tColor colorText, tColor colorTextBack) {
std::string nameUpper = name; std::string groupName = name;
std::transform(nameUpper.begin(), nameUpper.end(),nameUpper.begin(), ::toupper); int numChars = groupName.length();
int numChars = nameUpper.length(); int charHeight = fontManager.FontChannelGroupsHorizontal->Height();
int charHeight = fontManager.FontChannelGroupsHorizontal->Height(); int textHeight = numChars * charHeight;
int textHeight = numChars * charHeight; int y = 5;
int y = 5; if ((textHeight + 5) < Height()) {
if ((textHeight +5) < Height()) { y = (Height() - textHeight) / 2;
y = (Height() - textHeight) / 2; }
} for (int i = 0; i < numChars; i++) {
for (int i=0; i < numChars; i++) { if (((y + 2 * charHeight) > Height()) && ((i + 1) < numChars)) {
if (((y + 2*charHeight) > Height()) && ((i+1)<numChars)) { int x = (Width() - fontManager.FontChannelGroupsHorizontal->Width("...")) / 2;
int x = (Width() - fontManager.FontChannelGroupsHorizontal->Width("...")) / 2; pixmap->DrawText(cPoint(x, y), "...", colorText, colorTextBack, fontManager.FontChannelGroupsHorizontal);
pixmap->DrawText(cPoint(x, y), "...", colorText, colorTextBack, fontManager.FontChannelGroupsHorizontal); break;
break; }
} cString currentChar = cString::sprintf("%s", utf8_substr(groupName.c_str(), i, 1).c_str());
cString currentChar = cString::sprintf("%c", nameUpper.at(i)); int x = (Width() - fontManager.FontChannelGroupsHorizontal->Width(*currentChar)) / 2;
int x = (Width() - fontManager.FontChannelGroupsHorizontal->Width(*currentChar)) / 2; pixmap->DrawText(cPoint(x, y), *currentChar, colorText, colorTextBack, fontManager.FontChannelGroupsHorizontal);
pixmap->DrawText(cPoint(x, y), *currentChar, colorText, colorTextBack, fontManager.FontChannelGroupsHorizontal); y += fontManager.FontChannelGroupsHorizontal->Height();
y += fontManager.FontChannelGroupsHorizontal->Height(); }
} }
}

View File

@ -1,44 +1,44 @@
#ifndef __TVGUIDE_CHANNELGROUP_H #ifndef __TVGUIDE_CHANNELGROUP_H
#define __TVGUIDE_CHANNELGROUP_H #define __TVGUIDE_CHANNELGROUP_H
#include <vdr/tools.h> #include <vdr/tools.h>
#include "styledpixmap.h" #include "styledpixmap.h"
// --- cChannelGroup ------------------------------------------------------------- // --- cChannelGroup -------------------------------------------------------------
class cChannelGroup { class cChannelGroup {
private: private:
int channelStart; int channelStart;
int channelStop; int channelStop;
const char *name; const char *name;
public: public:
cChannelGroup(const char *name); cChannelGroup(const char *name);
virtual ~cChannelGroup(void); virtual ~cChannelGroup(void);
void SetChannelStart(int start) { channelStart = start; }; void SetChannelStart(int start) { channelStart = start; };
int StartChannel(void) { return channelStart; }; int StartChannel(void) { return channelStart; };
void SetChannelStop(int stop) { channelStop = stop; }; void SetChannelStop(int stop) { channelStop = stop; };
int StopChannel(void) { return channelStop; }; int StopChannel(void) { return channelStop; };
const char* GetName(void) { return name; }; const char* GetName(void) { return name; };
void Dump(void); void Dump(void);
}; };
// --- cChannelGroupGrid ------------------------------------------------------------- // --- cChannelGroupGrid -------------------------------------------------------------
class cChannelGroupGrid : public cListObject, public cStyledPixmap { class cChannelGroupGrid : public cListObject, public cStyledPixmap {
private: private:
const char *name; const char *name;
bool isColor1; bool isColor1;
void DrawHorizontal(tColor colorText, tColor colorTextBack); void DrawHorizontal(tColor colorText, tColor colorTextBack);
void DrawVertical(tColor colorText, tColor colorTextBack); void DrawVertical(tColor colorText, tColor colorTextBack);
public: public:
cChannelGroupGrid(const char *name); cChannelGroupGrid(const char *name);
virtual ~cChannelGroupGrid(void); virtual ~cChannelGroupGrid(void);
void SetColor(bool color) {isColor1 = color;}; void SetColor(bool color) {isColor1 = color;};
void SetBackground(void); void SetBackground(void);
void SetGeometry(int start, int end); void SetGeometry(int start, int end);
void Draw(void); void Draw(void);
}; };
#endif //__TVGUIDE_CHANNELGROUP_H #endif //__TVGUIDE_CHANNELGROUP_H

View File

@ -1,4 +1,5 @@
#include <vector> #include <vector>
#include "config.h"
#include "channelgroups.h" #include "channelgroups.h"
cChannelGroups::cChannelGroups(void) { cChannelGroups::cChannelGroups(void) {
@ -10,19 +11,25 @@ cChannelGroups::~cChannelGroups(void) {
void cChannelGroups::ReadChannelGroups(void) { void cChannelGroups::ReadChannelGroups(void) {
bool setStart = false; bool setStart = false;
int lastChannelNumber = 0; int lastChannelNumber = 0;
const cChannel *first = Channels.First(); #if VDRVERSNUM >= 20301
LOCK_CHANNELS_READ;
const cChannels *channels = Channels;
#else
const cChannels *channels = &Channels;
#endif
const cChannel *first = channels->First();
if (!first->GroupSep()) { if (!first->GroupSep()) {
channelGroups.push_back(cChannelGroup(tr("Main Program"))); channelGroups.push_back(cChannelGroup(tr("Main Program")));
setStart = true; setStart = true;
} }
for (const cChannel *channel = Channels.First(); channel; channel = Channels.Next(channel)) { for (const cChannel *channel = channels->First(); channel; channel = channels->Next(channel)) {
if (setStart && (channelGroups.size() > 0)) { if (setStart && (channelGroups.size() > 0)) {
channelGroups[channelGroups.size()-1].SetChannelStart(channel->Number()); channelGroups[channelGroups.size() - 1].SetChannelStart(channel->Number());
setStart = false; setStart = false;
} }
if (channel->GroupSep()) { if (channel->GroupSep()) {
if (channelGroups.size() > 0) { if (channelGroups.size() > 0) {
channelGroups[channelGroups.size()-1].SetChannelStop(lastChannelNumber); channelGroups[channelGroups.size() - 1].SetChannelStop(lastChannelNumber);
} }
channelGroups.push_back(cChannelGroup(channel->Name())); channelGroups.push_back(cChannelGroup(channel->Name()));
setStart = true; setStart = true;
@ -31,8 +38,8 @@ void cChannelGroups::ReadChannelGroups(void) {
} }
} }
if (channelGroups.size() > 0) { if (channelGroups.size() > 0) {
channelGroups[channelGroups.size()-1].SetChannelStop(lastChannelNumber); channelGroups[channelGroups.size() - 1].SetChannelStop(lastChannelNumber);
if ((tvguideConfig.hideLastGroup)&&(channelGroups.size() > 1)) { if ((config.hideLastGroup) && (channelGroups.size() > 1)) {
channelGroups.pop_back(); channelGroups.pop_back();
} }
} }
@ -60,7 +67,7 @@ const char* cChannelGroups::GetPrev(int group) {
const char* cChannelGroups::GetNext(int group) { const char* cChannelGroups::GetNext(int group) {
if (group > -1) { if (group > -1) {
if ((group+1) < channelGroups.size()) if ((group+1) < (int)channelGroups.size())
return channelGroups[group+1].GetName(); return channelGroups[group+1].GetName();
} }
return ""; return "";
@ -80,14 +87,14 @@ int cChannelGroups::GetNextGroupChannelNumber(const cChannel *channel) {
int currentGroup = GetGroup(channel); int currentGroup = GetGroup(channel);
if (currentGroup == -1) if (currentGroup == -1)
return 0; return 0;
if ((currentGroup+1) < channelGroups.size()) { if ((currentGroup+1) < (int)channelGroups.size()) {
return channelGroups[currentGroup+1].StartChannel(); return channelGroups[currentGroup+1].StartChannel();
} }
return 0; return 0;
} }
bool cChannelGroups::IsInLastGroup(const cChannel *channel) { bool cChannelGroups::IsInLastGroup(const cChannel *channel) {
if (!tvguideConfig.hideLastGroup) if (!config.hideLastGroup)
return false; return false;
if (channelGroups.size() > 0) { if (channelGroups.size() > 0) {
if (channel->Number() > channelGroups[channelGroups.size()-1].StopChannel()) { if (channel->Number() > channelGroups[channelGroups.size()-1].StopChannel()) {
@ -103,7 +110,12 @@ void cChannelGroups::DrawChannelGroups(const cChannel *start, const cChannel *st
int groupLast = group; int groupLast = group;
int line = 0; int line = 0;
int lineStart = 0; int lineStart = 0;
#if VDRVERSNUM >= 20301
LOCK_CHANNELS_READ;
for (const cChannel *channel = Channels->Next(start); channel; channel = Channels->Next(channel)) {
#else
for (const cChannel *channel = Channels.Next(start); channel; channel = Channels.Next(channel)) { for (const cChannel *channel = Channels.Next(start); channel; channel = Channels.Next(channel)) {
#endif
if (channel->GroupSep()) if (channel->GroupSep())
continue; continue;
group = GetGroup(channel); group = GetGroup(channel);
@ -131,9 +143,15 @@ void cChannelGroups::CreateGroupGrid(const char *name, int number, int start, in
} }
int cChannelGroups::GetLastValidChannel(void) { int cChannelGroups::GetLastValidChannel(void) {
if (channelGroups.size() > 0) if (config.hideLastGroup && channelGroups.size() > 0) {
return channelGroups[channelGroups.size()-1].StopChannel(); return channelGroups[channelGroups.size() - 1].StopChannel();
return 0; }
#if VDRVERSNUM >= 20301
LOCK_CHANNELS_READ;
return Channels->MaxNumber();
#else
return Channels.MaxNumber();
#endif
} }
void cChannelGroups::DumpGroups(void) { void cChannelGroups::DumpGroups(void) {

View File

@ -3,6 +3,7 @@
#include <vector> #include <vector>
#include <vdr/channels.h> #include <vdr/channels.h>
#include "config.h"
#include "channelgroup.h" #include "channelgroup.h"
// --- cChannelGroups ------------------------------------------------------------- // --- cChannelGroups -------------------------------------------------------------

View File

@ -1,90 +1,86 @@
#include <vdr/channels.h> #include <vdr/channels.h>
#include "config.h" #include "config.h"
#include "geometrymanager.h" #include "geometrymanager.h"
#include "osdmanager.h" #include "osdmanager.h"
#include "fontmanager.h" #include "fontmanager.h"
#include "channelgroups.h" #include "channelgroups.h"
#include "channeljump.h" #include "channeljump.h"
cChannelJump::cChannelJump(cChannelGroups *channelGroups) { cChannelJump::cChannelJump(cChannelGroups *channelGroups, int lastValidChannel) {
this->channelGroups = channelGroups; this->channelGroups = channelGroups;
pixmapText = NULL; pixmapText = NULL;
channel = 0; channel = 0;
if (!tvguideConfig.hideLastGroup) { maxChannels = lastValidChannel;
maxChannels = Channels.MaxNumber(); timeout = Setup.ChannelEntryTimeout;
} else { startTime = 0;
maxChannels = channelGroups->GetLastValidChannel(); SetPixmaps();
} Draw();
timeout = Setup.ChannelEntryTimeout; }
startTime = cTimeMs::Now();
SetPixmaps(); cChannelJump::~cChannelJump(void) {
Draw(); osdManager.DestroyPixmap(pixmapBack);
} osdManager.DestroyPixmap(pixmapText);
}
cChannelJump::~cChannelJump(void) {
osdManager.releasePixmap(pixmapBack); void cChannelJump::SetPixmaps(void) {
osdManager.releasePixmap(pixmapText); int x = (geoManager.osdWidth - geoManager.channelJumpWidth)/2;
} int y = (geoManager.osdHeight - geoManager.channelJumpHeight)/2;
void cChannelJump::SetPixmaps(void) { pixmapBack = osdManager.CreatePixmap(4, cRect(x, y, geoManager.channelJumpWidth, geoManager.channelJumpHeight));
int x = (geoManager.osdWidth - geoManager.channelJumpWidth)/2; pixmap = osdManager.CreatePixmap(5, cRect(x, y, geoManager.channelJumpWidth, geoManager.channelJumpHeight));
int y = (geoManager.osdHeight - geoManager.channelJumpHeight)/2; pixmapText = osdManager.CreatePixmap(6, cRect(x, y, geoManager.channelJumpWidth, geoManager.channelJumpHeight));
}
pixmapBack = osdManager.requestPixmap(4, cRect(x, y, geoManager.channelJumpWidth, geoManager.channelJumpHeight));
pixmap = osdManager.requestPixmap(5, cRect(x, y, geoManager.channelJumpWidth, geoManager.channelJumpHeight)); void cChannelJump::Draw(void) {
pixmapText = osdManager.requestPixmap(6, cRect(x, y, geoManager.channelJumpWidth, geoManager.channelJumpHeight)); if (config.style == eStyleGraphical) {
} drawBackgroundGraphical(bgChannelJump);
} else {
void cChannelJump::Draw(void) { pixmap->Fill(theme.Color(clrBackground));
if (tvguideConfig.style == eStyleGraphical) { drawBorder();
drawBackgroundGraphical(bgChannelJump); }
} else { pixmapBack->Fill(clrTransparent);
pixmap->Fill(theme.Color(clrBackground)); pixmapBack->DrawRectangle(cRect(5, Height()/2, Width()-10, Height()-3), theme.Color(clrBackground));
drawBorder(); }
}
pixmapBack->Fill(clrTransparent); void cChannelJump::DrawText(void) {
pixmapBack->DrawRectangle(cRect(5, Height()/2, Width()-10, Height()-3), theme.Color(clrBackground)); pixmapText->Fill(clrTransparent);
}
cString header = cString::sprintf("%s:", tr("Channel"));
void cChannelJump::DrawText(void) {
pixmapText->Fill(clrTransparent); const cFont *font = fontManager.FontMessageBox;
const cFont *fontHeader = fontManager.FontMessageBoxLarge;
cString header = cString::sprintf("%s:", tr("Channel"));
int xHeader = (Width() - fontHeader->Width(*header)) / 2;
const cFont *font = fontManager.FontMessageBox; int yHeader = (Height()/2 - fontHeader->Height()) / 2;
const cFont *fontHeader = fontManager.FontMessageBoxLarge; pixmapText->DrawText(cPoint(xHeader, yHeader), *header, theme.Color(clrFont), clrTransparent, fontHeader);
int xHeader = (Width() - fontHeader->Width(*header)) / 2; cString strChannel = BuildChannelString();
int yHeader = (Height()/2 - fontHeader->Height()) / 2; int xChannel = (Width() - font->Width(*strChannel)) / 2;
pixmapText->DrawText(cPoint(xHeader, yHeader), *header, theme.Color(clrFont), clrTransparent, fontHeader); int yChannel = Height()/2 + (Height()/2 - font->Height()) / 2;
pixmapText->DrawText(cPoint(xChannel, yChannel), *strChannel, theme.Color(clrFont), clrTransparent, font);
cString strChannel = BuildChannelString();
int xChannel = (Width() - font->Width(*strChannel)) / 2; }
int yChannel = Height()/2 + (Height()/2 - font->Height()) / 2;
pixmapText->DrawText(cPoint(xChannel, yChannel), *strChannel, theme.Color(clrFont), clrTransparent, font); void cChannelJump::Set(int num) {
startTime = cTimeMs::Now();
} if (channel == 0) {
channel = num;
void cChannelJump::Set(int num) { return;
startTime = cTimeMs::Now(); }
if (channel == 0) { int newChannel = channel * 10 + num;
channel = num; if (newChannel <= maxChannels)
return; channel = newChannel;
} }
int newChannel = channel * 10 + num;
if (newChannel <= maxChannels) cString cChannelJump::BuildChannelString(void) {
channel = newChannel; if (channel*10 <= maxChannels)
} return cString::sprintf("%d-", channel);
else
cString cChannelJump::BuildChannelString(void) { return cString::sprintf("%d", channel);
if (channel*10 <= maxChannels) }
return cString::sprintf("%d-", channel);
else bool cChannelJump::TimeOut(void) {
return cString::sprintf("%d", channel); if ((cTimeMs::Now() - startTime) > timeout)
} return true;
return false;
bool cChannelJump::TimeOut(void) { }
if ((cTimeMs::Now() - startTime) > timeout)
return true;
return false;
}

View File

@ -1,29 +1,29 @@
#ifndef __TVGUIDE_CHANNELJUMP_H #ifndef __TVGUIDE_CHANNELJUMP_H
#define __TVGUIDE_CHANNELJUMP_H #define __TVGUIDE_CHANNELJUMP_H
#include "styledpixmap.h" #include "styledpixmap.h"
// --- cChannelJump ------------------------------------------------------------- // --- cChannelJump -------------------------------------------------------------
class cChannelJump : public cStyledPixmap { class cChannelJump : public cStyledPixmap {
private: private:
int channel; int channel;
cChannelGroups *channelGroups; cChannelGroups *channelGroups;
int maxChannels; int maxChannels;
int startTime; long unsigned int startTime;
int timeout; long unsigned int timeout;
cPixmap *pixmapBack; cPixmap *pixmapBack;
cPixmap *pixmapText; cPixmap *pixmapText;
void SetPixmaps(void); void SetPixmaps(void);
void Draw(void); void Draw(void);
cString BuildChannelString(void); cString BuildChannelString(void);
public: public:
cChannelJump(cChannelGroups *channelGroups); cChannelJump(cChannelGroups *channelGroups, int lastValidChannel);
virtual ~cChannelJump(void); virtual ~cChannelJump(void);
void Set(int num); void Set(int num);
void DrawText(void); void DrawText(void);
bool TimeOut(void); bool TimeOut(void);
int GetChannel(void) { return channel; }; int GetChannel(void) { return channel; };
}; };
#endif //__TVGUIDE_CHANNELJUMP_H #endif //__TVGUIDE_CHANNELJUMP_H

687
config.c
View File

@ -1,334 +1,353 @@
#include <string> #include <string>
#include "config.h" #include "config.h"
cTvguideConfig::cTvguideConfig() { cTVGuideConfig::cTVGuideConfig() {
debugImageLoading = 0; useHWAccel = false;
showMainMenuEntry = 1; debugImageLoading = 0;
replaceOriginalSchedule = 0; showMainMenuEntry = 1;
displayMode = eHorizontal; replaceOriginalSchedule = 0;
showTimeInGrid = 1; displayMode = eHorizontal;
channelCols = 5; showTimeInGrid = 1;
channelRows = 10; channelCols = 5;
displayTime = 160; channelRows = 10;
displayStatusHeader = 1; displayTime = 180;
displayChannelGroups = 1; displayHorizontalTime = 180;
displayTimeBase = 1; displayStatusHeader = 1;
headerHeightPercent = 20; displayChannelGroups = 1;
channelGroupsPercent = 5; displayTimeBase = 1;
epgViewBorder = 50; headerHeightPercent = 20;
scaleVideo = 1; channelGroupsPercent = 5;
decorateVideo = 1; epgViewBorder = 50;
timeLineWidthPercent = 8; scaleVideo = 1;
timeLineHeightPercent = 4; decorateVideo = 1;
displayChannelName = 1; timeLineWidthPercent = 8;
channelHeaderWidthPercent = 20; timeLineHeightPercent = 4;
channelHeaderHeightPercent = 15; displayChannelName = 1;
footerHeightPercent = 7; channelHeaderWidthPercent = 20;
stepMinutes = 30; channelHeaderHeightPercent = 15;
bigStepHours = 3; footerHeightPercent = 7;
hugeStepHours = 24; stepMinutes = 30;
channelJumpMode = eNumJump; bigStepHours = 3;
jumpChannels = 0; bigStepHoursHorizontal = 3;
blueKeyMode = 2; hugeStepHours = 24;
closeOnSwitch = 1; hugeStepHoursHorizontal = 24;
numkeyMode = 0; channelJumpMode = eNumJump;
useRemoteTimers = 0; jumpChannels = 0;
hideLastGroup = 0; blueKeyMode = 2;
hideChannelLogos = 0; addSubtitleToTimer = 1;
logoWidthRatio = 13; timerMessage = 1;
logoHeightRatio = 10; closeOnSwitch = 1;
logoExtension = 0; numkeyMode = 0;
hideEpgImages = 0; useRemoteTimers = 0;
epgImageWidth = 315; hideLastGroup = 0;
epgImageHeight = 240; hideChannelLogos = 0;
numAdditionalEPGPictures = 9; logoWidthRatio = 13;
epgImageWidthLarge = 525; logoHeightRatio = 10;
epgImageHeightLarge = 400; logoExtension = 0;
detailedViewScrollStep = 5; hideEpgImages = 0;
instRecFolderMode = eFolderRoot; epgImageWidth = 315;
instRecFixedFolder = ""; epgImageHeight = 240;
favWhatsOnNow = 1; numAdditionalEPGPictures = 9;
favWhatsOnNext = 1; epgImageWidthLarge = 525;
favUseTime1 = 0; epgImageHeightLarge = 400;
favUseTime2 = 0; detailedViewScrollStep = 5;
favUseTime3 = 0; instRecFolderMode = eFolderRoot;
favUseTime4 = 0; instRecFixedFolder = "";
favTime1 = 0; favWhatsOnNow = 1;
favTime2 = 0; favWhatsOnNext = 1;
favTime3 = 0; favUseTime1 = 0;
favTime4 = 0; favUseTime2 = 0;
descUser1 = ""; favUseTime3 = 0;
descUser2 = ""; favUseTime4 = 0;
descUser3 = ""; favTime1 = 0;
descUser4 = ""; favTime2 = 0;
favLimitChannels = 0; favTime3 = 0;
favStartChannel = 0; favTime4 = 0;
favStopChannel = 0; descUser1 = "";
fontIndex = 0; descUser2 = "";
fontNameDefault = "VDRSymbols Sans:Book"; descUser3 = "";
FontButtonDelta = 0; descUser4 = "";
FontDetailViewDelta = 0; favLimitChannels = 0;
FontDetailViewSmallDelta = 0; favStartChannel = 0;
FontDetailHeaderDelta = 0; favStopChannel = 0;
FontMessageBoxDelta = 0; switchMode = 0;
FontMessageBoxLargeDelta = 0; switchMinsBefore = 2;
FontStatusHeaderDelta = 0; fontIndex = 0;
FontStatusHeaderLargeDelta = 0; fontNameDefault = "VDRSymbols Sans:Book";
FontChannelHeaderDelta = 0; FontButtonDelta = 0;
FontChannelGroupsDelta = 0; FontDetailViewDelta = 0;
FontGridDelta = 0; FontDetailViewSmallDelta = 0;
FontGridSmallDelta = 0; FontDetailHeaderDelta = 0;
FontTimeLineWeekdayDelta = 0; FontMessageBoxDelta = 0;
FontTimeLineDateDelta = 0; FontMessageBoxLargeDelta = 0;
FontTimeLineTimeDelta = 0; FontStatusHeaderDelta = 0;
FontChannelHeaderHorizontalDelta = 0; FontStatusHeaderLargeDelta = 0;
FontChannelGroupsHorizontalDelta = 0; FontChannelHeaderDelta = 0;
FontGridHorizontalDelta = 0; FontChannelGroupsDelta = 0;
FontGridHorizontalSmallDelta = 0; FontGridDelta = 0;
FontTimeLineDateHorizontalDelta = 0; FontGridSmallDelta = 0;
FontTimeLineTimeHorizontalDelta = 0; FontTimeLineWeekdayDelta = 0;
FontRecMenuItemDelta = 0; FontTimeLineDateDelta = 0;
FontRecMenuItemSmallDelta = 0; FontTimeLineTimeDelta = 0;
FontRecMenuItemLargeDelta = 0; FontChannelHeaderHorizontalDelta = 0;
timeFormat = 1; FontChannelGroupsHorizontalDelta = 0;
useNopacityTheme = 1; FontGridHorizontalDelta = 0;
themeIndex = -1; FontGridHorizontalSmallDelta = 0;
themeIndexCurrent = -1; FontTimeLineDateHorizontalDelta = 0;
themeName = ""; FontTimeLineTimeHorizontalDelta = 0;
nOpacityTheme = ""; FontRecMenuItemDelta = 0;
style = eStyleBlendingDefault; FontRecMenuItemSmallDelta = 0;
roundedCorners = 0; FontRecMenuItemLargeDelta = 0;
displayRerunsDetailEPGView = 1; timeFormat = 1;
numReruns = 5; useNopacityTheme = 1;
useSubtitleRerun = 1; useNopacityThemeCurrent = -1;
numLogosInitial = 30; themeIndex = -1;
numLogosMax = 50; themeIndexCurrent = -1;
limitLogoCache = 1; themeName = "";
logoPathSet = false; nOpacityTheme = "";
imagesPathSet = false; style = eStyleBlendingDefault;
iconsPathSet = false; roundedCorners = 0;
} displayRerunsDetailEPGView = 1;
numReruns = 5;
cTvguideConfig::~cTvguideConfig() { useSubtitleRerun = 1;
} numLogosInitial = 30;
numLogosMax = 50;
void cTvguideConfig::setDynamicValues() { limitLogoCache = 1;
numGrids = (displayMode == eVertical)?channelCols:channelRows; logoPathSet = false;
jumpChannels = numGrids; imagesPathSet = false;
} iconsPathSet = false;
}
bool cTvguideConfig::LoadTheme() {
//is correct theme already loaded? cTVGuideConfig::~cTVGuideConfig() {
if (nOpacityTheme.size() == 0) }
nOpacityTheme = Setup.OSDTheme;
if ((themeIndex > -1) && (themeIndex == themeIndexCurrent)) { void cTVGuideConfig::setDynamicValues() {
if (!nOpacityTheme.compare(Setup.OSDTheme)) { numGrids = (displayMode == eVertical)?channelCols:channelRows;
return false; jumpChannels = numGrids;
} else { }
nOpacityTheme = Setup.OSDTheme;
} bool cTVGuideConfig::LoadTheme() {
} //is correct theme already loaded?
//Load available Themes if (nOpacityTheme.size() == 0)
cThemes themes; nOpacityTheme = Setup.OSDTheme;
themes.Load(*cString("tvguide")); if ((themeIndex > -1) && (themeIndex == themeIndexCurrent) && (useNopacityTheme == useNopacityThemeCurrent)) {
int numThemesAvailable = themes.NumThemes(); if (!nOpacityTheme.compare(Setup.OSDTheme)) {
return false;
//Check for nOpacity Theme } else {
if (useNopacityTheme) { nOpacityTheme = Setup.OSDTheme;
std::string nOpacity = "nOpacity"; }
std::string currentSkin = Setup.OSDSkin; }
std::string currentSkinTheme = Setup.OSDTheme; esyslog("tvguide: loading new Theme");
if (!currentSkin.compare(nOpacity)) { //Load available Themes
for (int curThemeIndex = 0; curThemeIndex < numThemesAvailable; curThemeIndex++) { cThemes themes;
std::string curThemeName = themes.Name(curThemeIndex); themes.Load(*cString("tvguide"));
if (!curThemeName.compare(currentSkinTheme)) { int numThemesAvailable = themes.NumThemes();
themeIndex = curThemeIndex;
break; //Check for nOpacity Theme
} if (useNopacityTheme) {
} std::string nOpacity = "nOpacity";
} std::string currentSkin = Setup.OSDSkin;
} std::string currentSkinTheme = Setup.OSDTheme;
if (!currentSkin.compare(nOpacity)) {
if (themeIndex == -1) { for (int curThemeIndex = 0; curThemeIndex < numThemesAvailable; curThemeIndex++) {
for (int curThemeIndex = 0; curThemeIndex < numThemesAvailable; curThemeIndex++) { std::string curThemeName = themes.Name(curThemeIndex);
std::string curThemeName = themes.Name(curThemeIndex); if (!curThemeName.compare(currentSkinTheme)) {
if (!curThemeName.compare("default")) { themeIndex = curThemeIndex;
themeIndex = curThemeIndex; break;
break; }
} }
} }
}
}
if (themeIndex == -1) {
if (themeIndex == -1) for (int curThemeIndex = 0; curThemeIndex < numThemesAvailable; curThemeIndex++) {
themeIndex = 0; std::string curThemeName = themes.Name(curThemeIndex);
if (!curThemeName.compare("default")) {
themeIndexCurrent = themeIndex; themeIndex = curThemeIndex;
break;
const char *themePath = themes.FileName(themeIndex); }
if (access(themePath, F_OK) == 0) { }
::theme.Load(themePath);
themeName = themes.Name(themeIndex); }
}
esyslog("tvguide: set Theme to %s", *themeName); if (themeIndex == -1)
return true; themeIndex = 0;
}
themeIndexCurrent = themeIndex;
useNopacityThemeCurrent = useNopacityTheme;
void cTvguideConfig::SetStyle(void) {
if (theme.Color(clrStyle) == CLR_STYLE_FLAT) { const char *themePath = themes.FileName(themeIndex);
style = eStyleFlat; if (access(themePath, F_OK) == 0) {
esyslog("tvguide: set flat style"); ::theme.Load(themePath);
} else if (theme.Color(clrStyle) == CLR_STYLE_BLENDING_DEFAULT) { themeName = themes.Name(themeIndex);
style = eStyleBlendingDefault; }
esyslog("tvguide: set blending style"); esyslog("tvguide: set Theme to %s", *themeName);
} else if (theme.Color(clrStyle) == CLR_STYLE_GRAPHICAL) { return true;
style = eStyleGraphical; }
esyslog("tvguide: set graphical style");
} else {
style = eStyleBlendingMagick; void cTVGuideConfig::SetStyle(void) {
esyslog("tvguide: set magick blending style"); if (theme.Color(clrStyle) == CLR_STYLE_FLAT) {
} style = eStyleFlat;
esyslog("tvguide: set flat style");
} } else if (theme.Color(clrStyle) == CLR_STYLE_BLENDING_DEFAULT) {
style = eStyleBlendingDefault;
void cTvguideConfig::SetLogoPath(cString path) { esyslog("tvguide: set blending style");
logoPath = checkSlashAtEnd(*path); } else if (theme.Color(clrStyle) == CLR_STYLE_GRAPHICAL) {
logoPathSet = true; style = eStyleGraphical;
esyslog("tvguide: Logo Path set to %s", *logoPath); esyslog("tvguide: set graphical style");
} } else {
style = eStyleBlendingMagick;
void cTvguideConfig::SetImagesPath(cString path) { esyslog("tvguide: set magick blending style");
epgImagePath = checkSlashAtEnd(*path); }
imagesPathSet = true;
esyslog("tvguide: EPG Image Path set to %s", *epgImagePath); }
}
void cTVGuideConfig::SetLogoPath(cString path) {
void cTvguideConfig::SetIconsPath(cString path) { logoPath = checkSlashAtEnd(*path);
iconPath = checkSlashAtEnd(*path); logoPathSet = true;
iconsPathSet = true; esyslog("tvguide: Logo Path set to %s", *logoPath);
esyslog("tvguide: Icon Path set to %s", *iconPath); }
}
void cTVGuideConfig::SetImagesPath(cString path) {
void cTvguideConfig::SetDefaultPathes(void) { epgImagePath = checkSlashAtEnd(*path);
logoPathDefault = cString::sprintf("%s/logos/", cPlugin::ResourceDirectory(PLUGIN_NAME_I18N)); imagesPathSet = true;
iconPathDefault = cString::sprintf("%s/icons/", cPlugin::ResourceDirectory(PLUGIN_NAME_I18N)); esyslog("tvguide: EPG Image Path set to %s", *epgImagePath);
epgImagePathDefault = cString::sprintf("%s/epgimages/", cPlugin::CacheDirectory(PLUGIN_NAME_I18N)); }
if (!logoPathSet) { void cTVGuideConfig::SetIconsPath(cString path) {
logoPath = logoPathDefault; iconPath = checkSlashAtEnd(*path);
} iconsPathSet = true;
if (!imagesPathSet) { esyslog("tvguide: Icon Path set to %s", *iconPath);
epgImagePath = epgImagePathDefault; }
}
if (!iconsPathSet) { void cTVGuideConfig::SetDefaultPathes(void) {
iconPath = iconPathDefault; logoPathDefault = cString::sprintf("%s/logos/", cPlugin::ResourceDirectory(PLUGIN_NAME_I18N));
} iconPathDefault = cString::sprintf("%s/icons/", cPlugin::ResourceDirectory(PLUGIN_NAME_I18N));
} epgImagePathDefault = cString::sprintf("%s/epgimages/", cPlugin::CacheDirectory(PLUGIN_NAME_I18N));
cString cTvguideConfig::checkSlashAtEnd(std::string path) { if (!logoPathSet) {
try { logoPath = logoPathDefault;
if (!(path.at(path.size()-1) == '/')) }
return cString::sprintf("%s/", path.c_str()); if (!imagesPathSet) {
} catch (...) {return path.c_str();} epgImagePath = epgImagePathDefault;
return path.c_str(); }
} if (!iconsPathSet) {
iconPath = iconPathDefault;
bool cTvguideConfig::SetupParse(const char *Name, const char *Value) { }
if (strcmp(Name, "timeFormat") == 0) timeFormat = atoi(Value); }
else if (strcmp(Name, "debugImageLoading") == 0) debugImageLoading = atoi(Value);
else if (strcmp(Name, "showMainMenuEntry") == 0) showMainMenuEntry = atoi(Value); cString cTVGuideConfig::checkSlashAtEnd(std::string path) {
else if (strcmp(Name, "replaceOriginalSchedule") == 0) replaceOriginalSchedule = atoi(Value); try {
else if (strcmp(Name, "useNopacityTheme") == 0) useNopacityTheme = atoi(Value); if (!(path.at(path.size()-1) == '/'))
else if (strcmp(Name, "themeIndex") == 0) themeIndex = atoi(Value); return cString::sprintf("%s/", path.c_str());
else if (strcmp(Name, "displayMode") == 0) displayMode = atoi(Value); } catch (...) {return path.c_str();}
else if (strcmp(Name, "showTimeInGrid") == 0) showTimeInGrid = atoi(Value); return path.c_str();
else if (strcmp(Name, "displayStatusHeader") == 0) displayStatusHeader = atoi(Value); }
else if (strcmp(Name, "displayChannelGroups") == 0) displayChannelGroups = atoi(Value);
else if (strcmp(Name, "displayTimeBase") == 0) displayTimeBase = atoi(Value); bool cTVGuideConfig::SetupParse(const char *Name, const char *Value) {
else if (strcmp(Name, "headerHeightPercent") == 0) headerHeightPercent = atoi(Value); if (strcmp(Name, "timeFormat") == 0) timeFormat = atoi(Value);
else if (strcmp(Name, "channelGroupsPercent") == 0) channelGroupsPercent = atoi(Value); else if (strcmp(Name, "debugImageLoading") == 0) debugImageLoading = atoi(Value);
else if (strcmp(Name, "epgViewBorder") == 0) epgViewBorder = atoi(Value); else if (strcmp(Name, "useHWAccel") == 0) useHWAccel = atoi(Value);
else if (strcmp(Name, "scaleVideo") == 0) scaleVideo = atoi(Value); else if (strcmp(Name, "showMainMenuEntry") == 0) showMainMenuEntry = atoi(Value);
else if (strcmp(Name, "decorateVideo") == 0) decorateVideo = atoi(Value); else if (strcmp(Name, "replaceOriginalSchedule") == 0) replaceOriginalSchedule = atoi(Value);
else if (strcmp(Name, "roundedCorners") == 0) roundedCorners = atoi(Value); else if (strcmp(Name, "useNopacityTheme") == 0) useNopacityTheme = atoi(Value);
else if (strcmp(Name, "channelCols") == 0) channelCols = atoi(Value); else if (strcmp(Name, "themeIndex") == 0) themeIndex = atoi(Value);
else if (strcmp(Name, "channelRows") == 0) channelRows = atoi(Value); else if (strcmp(Name, "displayMode") == 0) displayMode = atoi(Value);
else if (strcmp(Name, "displayTime") == 0) displayTime = atoi(Value); else if (strcmp(Name, "showTimeInGrid") == 0) showTimeInGrid = atoi(Value);
else if (strcmp(Name, "hideChannelLogos") == 0) hideChannelLogos = atoi(Value); else if (strcmp(Name, "displayStatusHeader") == 0) displayStatusHeader = atoi(Value);
else if (strcmp(Name, "logoExtension") == 0) logoExtension = atoi(Value); else if (strcmp(Name, "displayChannelGroups") == 0) displayChannelGroups = atoi(Value);
else if (strcmp(Name, "logoWidthRatio") == 0) logoWidthRatio = atoi(Value); else if (strcmp(Name, "displayTimeBase") == 0) displayTimeBase = atoi(Value);
else if (strcmp(Name, "logoHeightRatio") == 0) logoHeightRatio = atoi(Value); else if (strcmp(Name, "headerHeightPercent") == 0) headerHeightPercent = atoi(Value);
else if (strcmp(Name, "bigStepHours") == 0) bigStepHours = atoi(Value); else if (strcmp(Name, "channelGroupsPercent") == 0) channelGroupsPercent = atoi(Value);
else if (strcmp(Name, "hugeStepHours") == 0) hugeStepHours = atoi(Value); else if (strcmp(Name, "epgViewBorder") == 0) epgViewBorder = atoi(Value);
else if (strcmp(Name, "channelJumpMode") == 0) channelJumpMode = atoi(Value); else if (strcmp(Name, "scaleVideo") == 0) scaleVideo = atoi(Value);
else if (strcmp(Name, "blueKeyMode") == 0) blueKeyMode = atoi(Value); else if (strcmp(Name, "decorateVideo") == 0) decorateVideo = atoi(Value);
else if (strcmp(Name, "numkeyMode") == 0) numkeyMode = atoi(Value); else if (strcmp(Name, "roundedCorners") == 0) roundedCorners = atoi(Value);
else if (strcmp(Name, "closeOnSwitch") == 0) closeOnSwitch = atoi(Value); else if (strcmp(Name, "channelCols") == 0) channelCols = atoi(Value);
else if (strcmp(Name, "useRemoteTimers") == 0) useRemoteTimers = atoi(Value); else if (strcmp(Name, "channelRows") == 0) channelRows = atoi(Value);
else if (strcmp(Name, "hideLastGroup") == 0) hideLastGroup = atoi(Value); else if (strcmp(Name, "displayTime") == 0) displayTime = atoi(Value);
else if (strcmp(Name, "hideEpgImages") == 0) hideEpgImages = atoi(Value); else if (strcmp(Name, "displayHorizontalTime") == 0) displayHorizontalTime = atoi(Value);
else if (strcmp(Name, "epgImageWidth") == 0) epgImageWidth = atoi(Value); else if (strcmp(Name, "hideChannelLogos") == 0) hideChannelLogos = atoi(Value);
else if (strcmp(Name, "epgImageHeight") == 0) epgImageHeight = atoi(Value); else if (strcmp(Name, "logoExtension") == 0) logoExtension = atoi(Value);
else if (strcmp(Name, "numAdditionalEPGPictures") == 0) numAdditionalEPGPictures = atoi(Value); else if (strcmp(Name, "logoWidthRatio") == 0) logoWidthRatio = atoi(Value);
else if (strcmp(Name, "epgImageWidthLarge") == 0) epgImageWidthLarge = atoi(Value); else if (strcmp(Name, "logoHeightRatio") == 0) logoHeightRatio = atoi(Value);
else if (strcmp(Name, "epgImageHeightLarge") == 0) epgImageHeightLarge = atoi(Value); else if (strcmp(Name, "bigStepHours") == 0) bigStepHours = atoi(Value);
else if (strcmp(Name, "detailedViewScrollStep") == 0) detailedViewScrollStep = atoi(Value); else if (strcmp(Name, "bigStepHoursHorizontal") == 0) bigStepHoursHorizontal = atoi(Value);
else if (strcmp(Name, "timeLineWidthPercent") == 0) timeLineWidthPercent = atoi(Value); else if (strcmp(Name, "hugeStepHours") == 0) hugeStepHours = atoi(Value);
else if (strcmp(Name, "timeLineHeightPercent") == 0) timeLineHeightPercent = atoi(Value); else if (strcmp(Name, "hugeStepHoursHorizontal") == 0) hugeStepHoursHorizontal = atoi(Value);
else if (strcmp(Name, "displayChannelName") == 0) displayChannelName = atoi(Value); else if (strcmp(Name, "channelJumpMode") == 0) channelJumpMode = atoi(Value);
else if (strcmp(Name, "channelHeaderWidthPercent") == 0) channelHeaderWidthPercent = atoi(Value); else if (strcmp(Name, "blueKeyMode") == 0) blueKeyMode = atoi(Value);
else if (strcmp(Name, "channelHeaderHeightPercent") == 0) channelHeaderHeightPercent = atoi(Value); else if (strcmp(Name, "numkeyMode") == 0) numkeyMode = atoi(Value);
else if (strcmp(Name, "footerHeightPercent") == 0) footerHeightPercent = atoi(Value); else if (strcmp(Name, "closeOnSwitch") == 0) closeOnSwitch = atoi(Value);
else if (strcmp(Name, "instRecFolderMode") == 0) instRecFolderMode = atoi(Value); else if (strcmp(Name, "useRemoteTimers") == 0) useRemoteTimers = atoi(Value);
else if (strcmp(Name, "instRecFixedFolder") == 0) instRecFixedFolder = Value; else if (strcmp(Name, "hideLastGroup") == 0) hideLastGroup = atoi(Value);
else if (strcmp(Name, "favWhatsOnNow") == 0) favWhatsOnNow = atoi(Value); else if (strcmp(Name, "hideEpgImages") == 0) hideEpgImages = atoi(Value);
else if (strcmp(Name, "favWhatsOnNext") == 0) favWhatsOnNext = atoi(Value); else if (strcmp(Name, "epgImageWidth") == 0) epgImageWidth = atoi(Value);
else if (strcmp(Name, "favUseTime1") == 0) favUseTime1 = atoi(Value); else if (strcmp(Name, "epgImageHeight") == 0) epgImageHeight = atoi(Value);
else if (strcmp(Name, "favUseTime2") == 0) favUseTime2 = atoi(Value); else if (strcmp(Name, "numAdditionalEPGPictures") == 0) numAdditionalEPGPictures = atoi(Value);
else if (strcmp(Name, "favUseTime3") == 0) favUseTime3 = atoi(Value); else if (strcmp(Name, "epgImageWidthLarge") == 0) epgImageWidthLarge = atoi(Value);
else if (strcmp(Name, "favUseTime4") == 0) favUseTime4 = atoi(Value); else if (strcmp(Name, "epgImageHeightLarge") == 0) epgImageHeightLarge = atoi(Value);
else if (strcmp(Name, "favTime1") == 0) favTime1 = atoi(Value); else if (strcmp(Name, "detailedViewScrollStep") == 0) detailedViewScrollStep = atoi(Value);
else if (strcmp(Name, "favTime2") == 0) favTime2 = atoi(Value); else if (strcmp(Name, "timeLineWidthPercent") == 0) timeLineWidthPercent = atoi(Value);
else if (strcmp(Name, "favTime3") == 0) favTime3 = atoi(Value); else if (strcmp(Name, "timeLineHeightPercent") == 0) timeLineHeightPercent = atoi(Value);
else if (strcmp(Name, "favTime4") == 0) favTime4 = atoi(Value); else if (strcmp(Name, "displayChannelName") == 0) displayChannelName = atoi(Value);
else if (strcmp(Name, "descUser1") == 0) descUser1 = Value; else if (strcmp(Name, "channelHeaderWidthPercent") == 0) channelHeaderWidthPercent = atoi(Value);
else if (strcmp(Name, "descUser2") == 0) descUser2 = Value; else if (strcmp(Name, "channelHeaderHeightPercent") == 0) channelHeaderHeightPercent = atoi(Value);
else if (strcmp(Name, "descUser3") == 0) descUser3 = Value; else if (strcmp(Name, "footerHeightPercent") == 0) footerHeightPercent = atoi(Value);
else if (strcmp(Name, "descUser4") == 0) descUser4 = Value; else if (strcmp(Name, "instRecFolderMode") == 0) instRecFolderMode = atoi(Value);
else if (strcmp(Name, "favLimitChannels") == 0) favLimitChannels = atoi(Value); else if (strcmp(Name, "instRecFixedFolder") == 0) instRecFixedFolder = Value;
else if (strcmp(Name, "favStartChannel") == 0) favStartChannel = atoi(Value); else if (strcmp(Name, "addSubtitleToTimer") == 0) addSubtitleToTimer = atoi(Value);
else if (strcmp(Name, "favStopChannel") == 0) favStopChannel = atoi(Value); else if (strcmp(Name, "timerMessage") == 0) timerMessage = atoi(Value);
else if (strcmp(Name, "fontIndex") == 0) fontIndex = atoi(Value); else if (strcmp(Name, "favWhatsOnNow") == 0) favWhatsOnNow = atoi(Value);
else if (strcmp(Name, "FontButtonDelta") == 0) FontButtonDelta = atoi(Value); else if (strcmp(Name, "favWhatsOnNext") == 0) favWhatsOnNext = atoi(Value);
else if (strcmp(Name, "FontDetailViewDelta") == 0) FontDetailViewDelta = atoi(Value); else if (strcmp(Name, "favUseTime1") == 0) favUseTime1 = atoi(Value);
else if (strcmp(Name, "FontDetailHeaderDelta") == 0) FontDetailHeaderDelta = atoi(Value); else if (strcmp(Name, "favUseTime2") == 0) favUseTime2 = atoi(Value);
else if (strcmp(Name, "FontMessageBoxDelta") == 0) FontMessageBoxDelta = atoi(Value); else if (strcmp(Name, "favUseTime3") == 0) favUseTime3 = atoi(Value);
else if (strcmp(Name, "FontMessageBoxLargeDelta") == 0) FontMessageBoxLargeDelta = atoi(Value); else if (strcmp(Name, "favUseTime4") == 0) favUseTime4 = atoi(Value);
else if (strcmp(Name, "FontStatusHeaderDelta") == 0) FontStatusHeaderDelta = atoi(Value); else if (strcmp(Name, "favTime1") == 0) favTime1 = atoi(Value);
else if (strcmp(Name, "FontStatusHeaderLargeDelta") == 0) FontStatusHeaderLargeDelta = atoi(Value); else if (strcmp(Name, "favTime2") == 0) favTime2 = atoi(Value);
else if (strcmp(Name, "FontChannelHeaderDelta") == 0) FontChannelHeaderDelta = atoi(Value); else if (strcmp(Name, "favTime3") == 0) favTime3 = atoi(Value);
else if (strcmp(Name, "FontChannelGroupsDelta") == 0) FontChannelGroupsDelta = atoi(Value); else if (strcmp(Name, "favTime4") == 0) favTime4 = atoi(Value);
else if (strcmp(Name, "FontGridDelta") == 0) FontGridDelta = atoi(Value); else if (strcmp(Name, "descUser1") == 0) descUser1 = Value;
else if (strcmp(Name, "FontGridSmallDelta") == 0) FontGridSmallDelta = atoi(Value); else if (strcmp(Name, "descUser2") == 0) descUser2 = Value;
else if (strcmp(Name, "FontTimeLineWeekdayDelta") == 0) FontTimeLineWeekdayDelta = atoi(Value); else if (strcmp(Name, "descUser3") == 0) descUser3 = Value;
else if (strcmp(Name, "FontTimeLineDateDelta") == 0) FontTimeLineDateDelta = atoi(Value); else if (strcmp(Name, "descUser4") == 0) descUser4 = Value;
else if (strcmp(Name, "FontTimeLineTimeDelta") == 0) FontTimeLineTimeDelta = atoi(Value); else if (strcmp(Name, "favLimitChannels") == 0) favLimitChannels = atoi(Value);
else if (strcmp(Name, "FontChannelHeaderHorizontalDelta") == 0) FontChannelHeaderHorizontalDelta = atoi(Value); else if (strcmp(Name, "favStartChannel") == 0) favStartChannel = atoi(Value);
else if (strcmp(Name, "FontChannelGroupsHorizontalDelta") == 0) FontChannelGroupsHorizontalDelta = atoi(Value); else if (strcmp(Name, "favStopChannel") == 0) favStopChannel = atoi(Value);
else if (strcmp(Name, "FontGridHorizontalDelta") == 0) FontGridHorizontalDelta = atoi(Value); else if (strcmp(Name, "switchMode") == 0) switchMode = atoi(Value);
else if (strcmp(Name, "FontGridHorizontalSmallDelta") == 0) FontGridHorizontalSmallDelta = atoi(Value); else if (strcmp(Name, "switchMinsBefore") == 0) switchMinsBefore = atoi(Value);
else if (strcmp(Name, "FontTimeLineDateHorizontalDelta") == 0) FontTimeLineDateHorizontalDelta = atoi(Value); else if (strcmp(Name, "fontIndex") == 0) fontIndex = atoi(Value);
else if (strcmp(Name, "FontTimeLineTimeHorizontalDelta") == 0) FontTimeLineTimeHorizontalDelta = atoi(Value); else if (strcmp(Name, "FontButtonDelta") == 0) FontButtonDelta = atoi(Value);
else if (strcmp(Name, "FontRecMenuItemDelta") == 0) FontRecMenuItemDelta = atoi(Value); else if (strcmp(Name, "FontDetailViewDelta") == 0) FontDetailViewDelta = atoi(Value);
else if (strcmp(Name, "FontRecMenuItemSmallDelta") == 0) FontRecMenuItemSmallDelta = atoi(Value); else if (strcmp(Name, "FontDetailHeaderDelta") == 0) FontDetailHeaderDelta = atoi(Value);
else if (strcmp(Name, "FontRecMenuItemLargeDelta") == 0) FontRecMenuItemLargeDelta = atoi(Value); else if (strcmp(Name, "FontMessageBoxDelta") == 0) FontMessageBoxDelta = atoi(Value);
else if (strcmp(Name, "displayRerunsDetailEPGView") == 0) displayRerunsDetailEPGView = atoi(Value); else if (strcmp(Name, "FontMessageBoxLargeDelta") == 0) FontMessageBoxLargeDelta = atoi(Value);
else if (strcmp(Name, "numReruns") == 0) numReruns = atoi(Value); else if (strcmp(Name, "FontStatusHeaderDelta") == 0) FontStatusHeaderDelta = atoi(Value);
else if (strcmp(Name, "useSubtitleRerun") == 0) useSubtitleRerun = atoi(Value); else if (strcmp(Name, "FontStatusHeaderLargeDelta") == 0) FontStatusHeaderLargeDelta = atoi(Value);
else if (strcmp(Name, "numLogosInitial") == 0) numLogosInitial = atoi(Value); else if (strcmp(Name, "FontChannelHeaderDelta") == 0) FontChannelHeaderDelta = atoi(Value);
else if (strcmp(Name, "numLogosMax") == 0) numLogosMax = atoi(Value); else if (strcmp(Name, "FontChannelGroupsDelta") == 0) FontChannelGroupsDelta = atoi(Value);
else if (strcmp(Name, "limitLogoCache") == 0) limitLogoCache = atoi(Value); else if (strcmp(Name, "FontGridDelta") == 0) FontGridDelta = atoi(Value);
else return false; else if (strcmp(Name, "FontGridSmallDelta") == 0) FontGridSmallDelta = atoi(Value);
return true; else if (strcmp(Name, "FontTimeLineWeekdayDelta") == 0) FontTimeLineWeekdayDelta = atoi(Value);
} else if (strcmp(Name, "FontTimeLineDateDelta") == 0) FontTimeLineDateDelta = atoi(Value);
else if (strcmp(Name, "FontTimeLineTimeDelta") == 0) FontTimeLineTimeDelta = atoi(Value);
else if (strcmp(Name, "FontChannelHeaderHorizontalDelta") == 0) FontChannelHeaderHorizontalDelta = atoi(Value);
else if (strcmp(Name, "FontChannelGroupsHorizontalDelta") == 0) FontChannelGroupsHorizontalDelta = atoi(Value);
else if (strcmp(Name, "FontGridHorizontalDelta") == 0) FontGridHorizontalDelta = atoi(Value);
else if (strcmp(Name, "FontGridHorizontalSmallDelta") == 0) FontGridHorizontalSmallDelta = atoi(Value);
else if (strcmp(Name, "FontTimeLineDateHorizontalDelta") == 0) FontTimeLineDateHorizontalDelta = atoi(Value);
else if (strcmp(Name, "FontTimeLineTimeHorizontalDelta") == 0) FontTimeLineTimeHorizontalDelta = atoi(Value);
else if (strcmp(Name, "FontRecMenuItemDelta") == 0) FontRecMenuItemDelta = atoi(Value);
else if (strcmp(Name, "FontRecMenuItemSmallDelta") == 0) FontRecMenuItemSmallDelta = atoi(Value);
else if (strcmp(Name, "FontRecMenuItemLargeDelta") == 0) FontRecMenuItemLargeDelta = atoi(Value);
else if (strcmp(Name, "displayRerunsDetailEPGView") == 0) displayRerunsDetailEPGView = atoi(Value);
else if (strcmp(Name, "numReruns") == 0) numReruns = atoi(Value);
else if (strcmp(Name, "useSubtitleRerun") == 0) useSubtitleRerun = atoi(Value);
else if (strcmp(Name, "numLogosInitial") == 0) numLogosInitial = atoi(Value);
else if (strcmp(Name, "numLogosMax") == 0) numLogosMax = atoi(Value);
else if (strcmp(Name, "limitLogoCache") == 0) limitLogoCache = atoi(Value);
else return false;
return true;
}

525
config.h
View File

@ -1,255 +1,270 @@
#ifndef __TVGUIDE_CONFIG_H #ifndef __TVGUIDE_CONFIG_H
#define __TVGUIDE_CONFIG_H #define __TVGUIDE_CONFIG_H
#include <vdr/themes.h> #include <vdr/themes.h>
#include <vdr/plugin.h> #include <vdr/plugin.h>
#include "osdmanager.h" #include "osdmanager.h"
#include "geometrymanager.h" #include "geometrymanager.h"
#include "fontmanager.h" #include "fontmanager.h"
#include "imagecache.h" #include "imagecache.h"
enum { enum eTimeFormat {
e12Hours, e12Hours,
e24Hours e24Hours
}; };
enum { enum {
eVertical, eVertical,
eHorizontal eHorizontal
}; };
enum { enum {
eNumJump, eNumJump,
eGroupJump eGroupJump
}; };
enum { enum {
eStyleGraphical, eStyleGraphical,
eStyleBlendingMagick, eStyleBlendingMagick,
eStyleBlendingDefault, eStyleBlendingDefault,
eStyleFlat eStyleFlat
}; };
enum eBlueKeyMode { enum eBlueKeyMode {
eBlueKeySwitch = 0, eBlueKeySwitch = 0,
eBlueKeyEPG, eBlueKeyEPG,
eBlueKeyFavorites eBlueKeyFavorites
}; };
enum eInstRecFolderMode { enum eInstRecFolderMode {
eFolderRoot = 0, eFolderRoot = 0,
eFolderSelect, eFolderSelect,
eFolderFixed eFolderFixed
}; };
class cTvguideConfig { typedef enum {
private: addSubtitleNever = 0,
cString checkSlashAtEnd(std::string path); addSubtitleSmart,
public: addSubtitleAlways
cTvguideConfig(); } addSubtitleToTimerMode;
~cTvguideConfig();
int debugImageLoading; class cTVGuideConfig {
int showMainMenuEntry; private:
int replaceOriginalSchedule; cString checkSlashAtEnd(std::string path);
int displayMode; public:
int showTimeInGrid; cTVGuideConfig();
int channelCols; ~cTVGuideConfig();
int channelRows; int useHWAccel;
int numGrids; int debugImageLoading;
int displayTime; int showMainMenuEntry;
int displayStatusHeader; int replaceOriginalSchedule;
int displayChannelGroups; int displayMode;
int displayTimeBase; int showTimeInGrid;
int headerHeightPercent; int channelCols;
int channelGroupsPercent; int channelRows;
int epgViewBorder; int numGrids;
int scaleVideo; int displayTime;
int decorateVideo; int displayHorizontalTime;
int timeLineWidthPercent; int displayStatusHeader;
int timeLineHeightPercent; int displayChannelGroups;
int displayChannelName; int displayTimeBase;
int channelHeaderWidthPercent; int headerHeightPercent;
int channelHeaderHeightPercent; int channelGroupsPercent;
int footerHeightPercent; int epgViewBorder;
int stepMinutes; int scaleVideo;
int bigStepHours; int decorateVideo;
int hugeStepHours; int timeLineWidthPercent;
int channelJumpMode; int timeLineHeightPercent;
int jumpChannels; int displayChannelName;
int blueKeyMode; int channelHeaderWidthPercent;
int closeOnSwitch; int channelHeaderHeightPercent;
int numkeyMode; int footerHeightPercent;
int useRemoteTimers; int stepMinutes;
int hideLastGroup; int bigStepHours;
int hideChannelLogos; int bigStepHoursHorizontal;
int logoWidthRatio; int hugeStepHours;
int logoHeightRatio; int hugeStepHoursHorizontal;
cString logoPath; int channelJumpMode;
int logoExtension; int jumpChannels;
int hideEpgImages; int blueKeyMode;
int epgImageWidth; int timerMessage;
int epgImageHeight; int addSubtitleToTimer;
int numAdditionalEPGPictures; int closeOnSwitch;
int epgImageWidthLarge; int numkeyMode;
int epgImageHeightLarge; int useRemoteTimers;
int detailedViewScrollStep; int hideLastGroup;
cString epgImagePath; int hideChannelLogos;
cString iconPath; int logoWidthRatio;
cString logoPathDefault; int logoHeightRatio;
cString iconPathDefault; cString logoPath;
cString epgImagePathDefault; int logoExtension;
int instRecFolderMode; int hideEpgImages;
std::string instRecFixedFolder; int epgImageWidth;
int favWhatsOnNow; int epgImageHeight;
int favWhatsOnNext; int numAdditionalEPGPictures;
int favUseTime1; int epgImageWidthLarge;
int favUseTime2; int epgImageHeightLarge;
int favUseTime3; int detailedViewScrollStep;
int favUseTime4; cString epgImagePath;
int favTime1; cString iconPath;
int favTime2; cString logoPathDefault;
int favTime3; cString iconPathDefault;
int favTime4; cString epgImagePathDefault;
std::string descUser1; int instRecFolderMode;
std::string descUser2; std::string instRecFixedFolder;
std::string descUser3; int favWhatsOnNow;
std::string descUser4; int favWhatsOnNext;
int favLimitChannels; int favUseTime1;
int favStartChannel; int favUseTime2;
int favStopChannel; int favUseTime3;
int fontIndex; int favUseTime4;
const char *fontNameDefault; int favTime1;
int FontButtonDelta; int favTime2;
int FontDetailViewDelta; int favTime3;
int FontDetailViewSmallDelta; int favTime4;
int FontDetailHeaderDelta; std::string descUser1;
int FontMessageBoxDelta; std::string descUser2;
int FontMessageBoxLargeDelta; std::string descUser3;
int FontStatusHeaderDelta; std::string descUser4;
int FontStatusHeaderLargeDelta; int favLimitChannels;
int FontChannelHeaderDelta; int favStartChannel;
int FontChannelGroupsDelta; int favStopChannel;
int FontGridDelta; int switchMode;
int FontGridSmallDelta; int switchMinsBefore;
int FontTimeLineWeekdayDelta; int fontIndex;
int FontTimeLineDateDelta; const char *fontNameDefault;
int FontTimeLineTimeDelta; int FontButtonDelta;
int FontChannelHeaderHorizontalDelta; int FontDetailViewDelta;
int FontChannelGroupsHorizontalDelta; int FontDetailViewSmallDelta;
int FontGridHorizontalDelta; int FontDetailHeaderDelta;
int FontGridHorizontalSmallDelta; int FontMessageBoxDelta;
int FontTimeLineDateHorizontalDelta; int FontMessageBoxLargeDelta;
int FontTimeLineTimeHorizontalDelta; int FontStatusHeaderDelta;
int FontRecMenuItemDelta; int FontStatusHeaderLargeDelta;
int FontRecMenuItemSmallDelta; int FontChannelHeaderDelta;
int FontRecMenuItemLargeDelta; int FontChannelGroupsDelta;
int timeFormat; int FontGridDelta;
int useNopacityTheme; int FontGridSmallDelta;
int themeIndex; int FontTimeLineWeekdayDelta;
int themeIndexCurrent; int FontTimeLineDateDelta;
cString themeName; int FontTimeLineTimeDelta;
std::string nOpacityTheme; int FontChannelHeaderHorizontalDelta;
int style; int FontChannelGroupsHorizontalDelta;
int roundedCorners; int FontGridHorizontalDelta;
int displayRerunsDetailEPGView; int FontGridHorizontalSmallDelta;
int numReruns; int FontTimeLineDateHorizontalDelta;
int useSubtitleRerun; int FontTimeLineTimeHorizontalDelta;
int numLogosInitial; int FontRecMenuItemDelta;
int numLogosMax; int FontRecMenuItemSmallDelta;
int limitLogoCache; int FontRecMenuItemLargeDelta;
bool logoPathSet; int timeFormat;
bool imagesPathSet; int useNopacityTheme;
bool iconsPathSet; int useNopacityThemeCurrent;
bool LoadTheme(); int themeIndex;
void SetStyle(void); int themeIndexCurrent;
void setDynamicValues(void); cString themeName;
void SetLogoPath(cString path); std::string nOpacityTheme;
void SetImagesPath(cString path); int style;
void SetIconsPath(cString path); int roundedCorners;
void SetDefaultPathes(void); int displayRerunsDetailEPGView;
bool SetupParse(const char *Name, const char *Value); int numReruns;
}; int useSubtitleRerun;
int numLogosInitial;
#ifdef DEFINE_CONFIG int numLogosMax;
cTvguideConfig tvguideConfig; int limitLogoCache;
cOsdManager osdManager; bool logoPathSet;
cGeometryManager geoManager; bool imagesPathSet;
cFontManager fontManager; bool iconsPathSet;
cImageCache imgCache; bool LoadTheme();
cTheme theme; void SetStyle(void);
cPlugin* pRemoteTimers = NULL; void setDynamicValues(void);
#else void SetLogoPath(cString path);
extern cTvguideConfig tvguideConfig; void SetImagesPath(cString path);
extern cOsdManager osdManager; void SetIconsPath(cString path);
extern cGeometryManager geoManager; void SetDefaultPathes(void);
extern cFontManager fontManager; bool SetupParse(const char *Name, const char *Value);
extern cImageCache imgCache; };
extern cTheme theme;
extern cPlugin* pRemoteTimers; #ifdef DEFINE_CONFIG
#endif cTVGuideConfig config;
cOsdManager osdManager;
cGeometryManager geoManager;
// --- Theme ------------------------------------------------------------- cFontManager fontManager;
//Style SETUP cImageCache imgCache;
#define CLR_STYLE_BLENDING_MAGICK 0xFFFFFFFF cTheme theme;
#define CLR_STYLE_BLENDING_DEFAULT 0xAAAAAAAA cPlugin* pRemoteTimers = NULL;
#define CLR_STYLE_GRAPHICAL 0x66666666 #else
#define CLR_STYLE_FLAT 0x00000000 extern cTVGuideConfig config;
extern cOsdManager osdManager;
THEME_CLR(theme, clrStyle, CLR_STYLE_BLENDING_DEFAULT); extern cGeometryManager geoManager;
THEME_CLR(theme, clrBackgroundOSD, 0xB012273f); extern cFontManager fontManager;
THEME_CLR(theme, clrBackground, 0xFF12273f); extern cImageCache imgCache;
THEME_CLR(theme, clrGrid1, 0x00000000); extern cTheme theme;
THEME_CLR(theme, clrGrid1Blending, 0x00000000); extern cPlugin* pRemoteTimers;
THEME_CLR(theme, clrGrid2, 0x00000000); #endif
THEME_CLR(theme, clrGrid2Blending, 0x00000000);
THEME_CLR(theme, clrHighlight, 0xAA3A3A55);
THEME_CLR(theme, clrHighlightBlending, 0xDD000000); // --- Theme -------------------------------------------------------------
THEME_CLR(theme, clrGridFontBack, clrTransparent); //Style SETUP
THEME_CLR(theme, clrGridActiveFontBack, 0xFFAFD533); #define CLR_STYLE_BLENDING_MAGICK 0xFFFFFFFF
THEME_CLR(theme, clrFont, clrWhite); #define CLR_STYLE_BLENDING_DEFAULT 0xAAAAAAAA
THEME_CLR(theme, clrFontActive, 0xFF363636); #define CLR_STYLE_GRAPHICAL 0x66666666
THEME_CLR(theme, clrFontHeader, 0xFF363636); #define CLR_STYLE_FLAT 0x00000000
THEME_CLR(theme, clrFontButtons, clrWhite);
THEME_CLR(theme, clrStatusHeader, 0x00000000); THEME_CLR(theme, clrStyle, CLR_STYLE_BLENDING_DEFAULT);
THEME_CLR(theme, clrStatusHeaderBlending, 0x00000000); THEME_CLR(theme, clrBackgroundOSD, 0xB012273f);
THEME_CLR(theme, clrHeader, 0x00000000); THEME_CLR(theme, clrBackground, 0xFF12273f);
THEME_CLR(theme, clrHeaderBlending, 0x00000000); THEME_CLR(theme, clrGrid1, 0x00000000);
THEME_CLR(theme, clrBorder, 0x00000000); THEME_CLR(theme, clrGrid1Blending, 0x00000000);
THEME_CLR(theme, clrTimeline1, clrWhite); THEME_CLR(theme, clrGrid2, 0x00000000);
THEME_CLR(theme, clrTimeline1Blending, 0xFF828282); THEME_CLR(theme, clrGrid2Blending, 0x00000000);
THEME_CLR(theme, clrTimeline2, clrBlack); THEME_CLR(theme, clrHighlight, 0xAA3A3A55);
THEME_CLR(theme, clrTimeline2Blending, 0xFF3F3F3F); THEME_CLR(theme, clrHighlightBlending, 0xDD000000);
THEME_CLR(theme, clrTimeBase, 0xA0FF0000); THEME_CLR(theme, clrGridFontBack, clrTransparent);
THEME_CLR(theme, clrTabInactive, 0xA01F3D7A); THEME_CLR(theme, clrGridActiveFontBack, 0xFFAFD533);
THEME_CLR(theme, clrButtonRed, 0xFFFF0000); THEME_CLR(theme, clrFont, clrWhite);
THEME_CLR(theme, clrButtonRedBorder, 0x00000000); THEME_CLR(theme, clrFontActive, 0xFF363636);
THEME_CLR(theme, clrButtonGreen, 0x00000000); THEME_CLR(theme, clrFontHeader, 0xFF363636);
THEME_CLR(theme, clrButtonGreenBorder, 0x00000000); THEME_CLR(theme, clrFontButtons, clrWhite);
THEME_CLR(theme, clrButtonYellow, 0x00000000); THEME_CLR(theme, clrStatusHeader, 0x00000000);
THEME_CLR(theme, clrButtonYellowBorder, 0x00000000); THEME_CLR(theme, clrStatusHeaderBlending, 0x00000000);
THEME_CLR(theme, clrButtonBlue, 0x00000000); THEME_CLR(theme, clrHeader, 0x00000000);
THEME_CLR(theme, clrButtonBlueBorder, 0x00000000); THEME_CLR(theme, clrHeaderBlending, 0x00000000);
THEME_CLR(theme, clrButtonBlend, 0xDD000000); THEME_CLR(theme, clrBorder, 0x00000000);
THEME_CLR(theme, clrRecMenuBackground, 0xAA000000); THEME_CLR(theme, clrTimeline1, clrWhite);
THEME_CLR(theme, clrRecMenuTimerConflictBackground, 0xFFCCCCCC); THEME_CLR(theme, clrTimeline1Blending, 0xFF828282);
THEME_CLR(theme, clrRecMenuTimerConflictBar, 0xFF222222); THEME_CLR(theme, clrTimeline2, clrBlack);
THEME_CLR(theme, clrRecMenuTimerConflictOverlap, 0xAAFF0000); THEME_CLR(theme, clrTimeline2Blending, 0xFF3F3F3F);
THEME_CLR(theme, clrRecMenuDayActive, 0xFF00FF00); THEME_CLR(theme, clrTimeBase, 0xA0FF0000);
THEME_CLR(theme, clrRecMenuDayInactive, 0xFFFF0000); THEME_CLR(theme, clrTabInactive, 0xA01F3D7A);
THEME_CLR(theme, clrRecMenuDayHighlight, 0x44FFFFFF); THEME_CLR(theme, clrButtonRed, 0xFFFF0000);
THEME_CLR(theme, clrRecMenuTextBack, 0xFF000000); THEME_CLR(theme, clrButtonRedBorder, 0x00000000);
THEME_CLR(theme, clrRecMenuTextActiveBack, 0xFF939376); THEME_CLR(theme, clrButtonGreen, 0x00000000);
THEME_CLR(theme, clrRecMenuKeyboardBack, 0xFF000000); THEME_CLR(theme, clrButtonGreenBorder, 0x00000000);
THEME_CLR(theme, clrRecMenuKeyboardBorder, clrWhite); THEME_CLR(theme, clrButtonYellow, 0x00000000);
THEME_CLR(theme, clrRecMenuKeyboardHigh, 0x40BB0000); THEME_CLR(theme, clrButtonYellowBorder, 0x00000000);
THEME_CLR(theme, clrButtonRedKeyboard, 0xFFBB0000); THEME_CLR(theme, clrButtonBlue, 0x00000000);
THEME_CLR(theme, clrButtonGreenKeyboard, 0xFF00BB00); THEME_CLR(theme, clrButtonBlueBorder, 0x00000000);
THEME_CLR(theme, clrButtonYellowKeyboard, 0xFFBBBB00); THEME_CLR(theme, clrButtonBlend, 0xDD000000);
THEME_CLR(theme, clrRecMenuTimelineTimer, 0xB012273f); THEME_CLR(theme, clrRecMenuBackground, 0xAA000000);
THEME_CLR(theme, clrRecMenuTimelineBack, 0xFF828282); THEME_CLR(theme, clrRecMenuTimerConflictBackground, 0xFFCCCCCC);
THEME_CLR(theme, clrRecMenuTimelineActive, 0xFF3F3F3F); THEME_CLR(theme, clrRecMenuTimerConflictBar, 0xFF222222);
THEME_CLR(theme, clrRecMenuTimelineConflict, 0x30FF0000); THEME_CLR(theme, clrRecMenuTimerConflictOverlap, 0xAAFF0000);
THEME_CLR(theme, clrRecMenuTimelineConflictOverlap, 0x90FF0000); THEME_CLR(theme, clrRecMenuDayActive, 0xFF00FF00);
#endif //__TVGUIDE_CONFIG_H THEME_CLR(theme, clrRecMenuDayInactive, 0xFFFF0000);
THEME_CLR(theme, clrRecMenuDayHighlight, 0x44FFFFFF);
THEME_CLR(theme, clrRecMenuTextBack, 0xFF000000);
THEME_CLR(theme, clrRecMenuTextActiveBack, 0xFF939376);
THEME_CLR(theme, clrRecMenuKeyboardBack, 0xFF000000);
THEME_CLR(theme, clrRecMenuKeyboardBorder, clrWhite);
THEME_CLR(theme, clrRecMenuKeyboardHigh, 0x40BB0000);
THEME_CLR(theme, clrButtonRedKeyboard, 0xFFBB0000);
THEME_CLR(theme, clrButtonGreenKeyboard, 0xFF00BB00);
THEME_CLR(theme, clrButtonYellowKeyboard, 0xFFBBBB00);
THEME_CLR(theme, clrRecMenuTimelineTimer, 0xB012273f);
THEME_CLR(theme, clrRecMenuTimelineBack, 0xFF828282);
THEME_CLR(theme, clrRecMenuTimelineActive, 0xFF3F3F3F);
THEME_CLR(theme, clrRecMenuTimelineConflict, 0x30FF0000);
THEME_CLR(theme, clrRecMenuTimelineConflictOverlap, 0x90FF0000);
#endif //__TVGUIDE_CONFIG_H

View File

@ -1,32 +1,39 @@
#include "detailview.h" #include "detailview.h"
cDetailView::cDetailView(const cEvent *event, cFooter *footer) { cDetailView::cDetailView(const cEvent *event, cFooter *footer) : cThread("DetailView") {
this->event = event; this->event = event;
this->footer = footer; this->footer = footer;
} }
cDetailView::~cDetailView(void){ cDetailView::~cDetailView(void){
Cancel(-1); Cancel(3);
while (Active()) while (Active())
cCondWait::SleepMs(10); cCondWait::SleepMs(10);
#if VDRVERSNUM >= 20301
LOCK_CHANNELS_READ;
footer->LeaveDetailedViewMode(Channels->GetByChannelID(event->ChannelID()));
#else
footer->LeaveDetailedViewMode(Channels.GetByChannelID(event->ChannelID())); footer->LeaveDetailedViewMode(Channels.GetByChannelID(event->ChannelID()));
#endif
if (view) if (view)
delete view; delete view;
} }
void cDetailView::InitiateView(void) { void cDetailView::InitiateView(void) {
static cPlugin *pScraper2Vdr = cPluginManager::GetPlugin("scraper2vdr"); static cPlugin *pScraper = GetScraperPlugin();
ScraperGetEventType call; ScraperGetEventType call;
if (!event) if (!event)
return; return;
call.event = event; call.event = event;
if (!pScraper2Vdr) { if (!pScraper) {
view = new cEPGView(); view = new cEPGView();
} else if (pScraper2Vdr->Service("GetEventType", &call)) { } else if (pScraper->Service("GetEventType", &call)) {
if (call.type == tMovie) { if (call.type == tMovie) {
view = new cMovieView(call.movieId); view = new cMovieView(call.movieId);
} else if (call.type == tSeries) { } else if (call.type == tSeries) {
view = new cSeriesView(call.seriesId, call.episodeId); view = new cSeriesView(call.seriesId, call.episodeId);
} else {
view = new cEPGView();
} }
} else { } else {
view = new cEPGView(); view = new cEPGView();
@ -42,7 +49,12 @@ void cDetailView::InitiateView(void) {
dateTime = cString::sprintf("%s %s - %s (%d %s)", *event->GetDateString(), *event->GetTimeString(), *event->GetEndTimeString(), event->Duration()/60, tr("min")); dateTime = cString::sprintf("%s %s - %s (%d %s)", *event->GetDateString(), *event->GetTimeString(), *event->GetEndTimeString(), event->Duration()/60, tr("min"));
} }
view->SetDateTime(*dateTime); view->SetDateTime(*dateTime);
#if VDRVERSNUM >= 20301
LOCK_CHANNELS_READ;
view->SetChannel(Channels->GetByChannelID(event->ChannelID(), true));
#else
view->SetChannel(Channels.GetByChannelID(event->ChannelID(), true)); view->SetChannel(Channels.GetByChannelID(event->ChannelID(), true));
#endif
view->SetEventID(event->EventID()); view->SetEventID(event->EventID());
view->SetEvent(event); view->SetEvent(event);
} }
@ -64,8 +76,8 @@ std::string cDetailView::LoadReruns(void) {
Epgsearch_searchresults_v1_0 data; Epgsearch_searchresults_v1_0 data;
std::string strQuery = event->Title(); std::string strQuery = event->Title();
if (tvguideConfig.displayRerunsDetailEPGView > 0) { if (config.displayRerunsDetailEPGView > 0) {
if (tvguideConfig.useSubtitleRerun == 2 && !isempty(event->ShortText())) { if (config.useSubtitleRerun == 2 && !isempty(event->ShortText())) {
strQuery += "~"; strQuery += "~";
strQuery += event->ShortText(); strQuery += event->ShortText();
} }
@ -85,12 +97,17 @@ std::string cDetailView::LoadReruns(void) {
if (list && (list->Count() > 1)) { if (list && (list->Count() > 1)) {
foundRerun = true; foundRerun = true;
int i = 0; int i = 0;
for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = list->First(); r && i < tvguideConfig.numReruns; r = list->Next(r)) { for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = list->First(); r && i < config.numReruns; r = list->Next(r)) {
if ((event->ChannelID() == r->event->ChannelID()) && (event->StartTime() == r->event->StartTime())) if ((event->ChannelID() == r->event->ChannelID()) && (event->StartTime() == r->event->StartTime()))
continue; continue;
i++; i++;
sstrReruns << *DayDateTime(r->event->StartTime()); sstrReruns << *DayDateTime(r->event->StartTime());
#if VDRVERSNUM >= 20301
LOCK_CHANNELS_READ;
const cChannel *channel = Channels->GetByChannelID(r->event->ChannelID(), true, true);
#else
cChannel *channel = Channels.GetByChannelID(r->event->ChannelID(), true, true); cChannel *channel = Channels.GetByChannelID(r->event->ChannelID(), true, true);
#endif
if (channel) { if (channel) {
sstrReruns << ", " << trVDR("Channel") << " " << channel->Number() << ":"; sstrReruns << ", " << trVDR("Channel") << " " << channel->Number() << ":";
sstrReruns << " " << channel->ShortName(true); sstrReruns << " " << channel->ShortName(true);
@ -132,14 +149,14 @@ eOSState cDetailView::ProcessKey(eKeys Key) {
bool scrolled = view->KeyUp(); bool scrolled = view->KeyUp();
if (scrolled) { if (scrolled) {
view->DrawScrollbar(); view->DrawScrollbar();
osdManager.flush(); osdManager.Flush();
} }
break; } break; }
case kDown: { case kDown: {
bool scrolled = view->KeyDown(); bool scrolled = view->KeyDown();
if (scrolled) { if (scrolled) {
view->DrawScrollbar(); view->DrawScrollbar();
osdManager.flush(); osdManager.Flush();
} }
break; } break; }
case kLeft: case kLeft:
@ -156,4 +173,4 @@ eOSState cDetailView::ProcessKey(eKeys Key) {
break; break;
} }
return state; return state;
} }

View File

@ -25,4 +25,4 @@ public:
eOSState ProcessKey(eKeys Key); eOSState ProcessKey(eKeys Key);
}; };
#endif //__TVGUIDE_DETAILVIEW_H #endif //__TVGUIDE_DETAILVIEW_H

View File

@ -1,6 +1,6 @@
#include "dummygrid.h" #include "dummygrid.h"
cDummyGrid::cDummyGrid(cChannelColumn *c, time_t start, time_t end) : cGrid(c) { cDummyGrid::cDummyGrid(cChannelEpg *c, time_t start, time_t end) : cGridElement(c) {
this->start = start; this->start = start;
this->end = end; this->end = end;
strText = tr("No EPG Information available"); strText = tr("No EPG Information available");
@ -27,31 +27,31 @@ void cDummyGrid::SetViewportHeight() {
void cDummyGrid::PositionPixmap() { void cDummyGrid::PositionPixmap() {
int x0, y0; int x0, y0;
if (tvguideConfig.displayMode == eVertical) { if (config.displayMode == eVertical) {
x0 = column->getX(); x0 = column->getX();
y0 = geoManager.statusHeaderHeight + geoManager.channelHeaderHeight + geoManager.channelGroupsHeight; y0 = geoManager.statusHeaderHeight + geoManager.channelHeaderHeight + geoManager.channelGroupsHeight;
if ( column->Start() < StartTime() ) { if ( column->Start() < StartTime() ) {
y0 += (StartTime() - column->Start())/60*geoManager.minutePixel; y0 += (StartTime() - column->Start())/60*geoManager.minutePixel;
} }
if (!pixmap) { if (!pixmap) {
pixmap = osdManager.requestPixmap(-1, cRect(x0, y0, geoManager.colWidth, viewportHeight)); pixmap = osdManager.CreatePixmap(-1, cRect(x0, y0, geoManager.colWidth, viewportHeight));
} else if (dirty) { } else if (dirty) {
osdManager.releasePixmap(pixmap); osdManager.DestroyPixmap(pixmap);
pixmap = osdManager.requestPixmap(-1, cRect(x0, y0, geoManager.colWidth, viewportHeight)); pixmap = osdManager.CreatePixmap(-1, cRect(x0, y0, geoManager.colWidth, viewportHeight));
} else { } else {
pixmap->SetViewPort(cRect(x0, y0, geoManager.colWidth, viewportHeight)); pixmap->SetViewPort(cRect(x0, y0, geoManager.colWidth, viewportHeight));
} }
} else if (tvguideConfig.displayMode == eHorizontal) { } else if (config.displayMode == eHorizontal) {
x0 = geoManager.channelHeaderWidth + geoManager.channelGroupsWidth; x0 = geoManager.channelHeaderWidth + geoManager.channelGroupsWidth;
y0 = column->getY(); y0 = column->getY();
if ( column->Start() < StartTime() ) { if ( column->Start() < StartTime() ) {
x0 += (StartTime() - column->Start())/60*geoManager.minutePixel; x0 += (StartTime() - column->Start())/60*geoManager.minutePixel;
} }
if (!pixmap) { if (!pixmap) {
pixmap = osdManager.requestPixmap(-1, cRect(x0, y0, viewportHeight, geoManager.rowHeight)); pixmap = osdManager.CreatePixmap(-1, cRect(x0, y0, viewportHeight, geoManager.rowHeight));
} else if (dirty) { } else if (dirty) {
osdManager.releasePixmap(pixmap); osdManager.DestroyPixmap(pixmap);
pixmap = osdManager.requestPixmap(-1, cRect(x0, y0, viewportHeight, geoManager.rowHeight)); pixmap = osdManager.CreatePixmap(-1, cRect(x0, y0, viewportHeight, geoManager.rowHeight));
} else { } else {
pixmap->SetViewPort(cRect(x0, y0, viewportHeight, geoManager.rowHeight)); pixmap->SetViewPort(cRect(x0, y0, viewportHeight, geoManager.rowHeight));
} }
@ -59,7 +59,7 @@ void cDummyGrid::PositionPixmap() {
} }
void cDummyGrid::setText() { void cDummyGrid::setText() {
if (tvguideConfig.displayMode == eVertical) { if (config.displayMode == eVertical) {
text->Set(*strText, fontManager.FontGrid, geoManager.colWidth-2*borderWidth); text->Set(*strText, fontManager.FontGrid, geoManager.colWidth-2*borderWidth);
} }
} }
@ -67,13 +67,13 @@ void cDummyGrid::setText() {
void cDummyGrid::drawText() { void cDummyGrid::drawText() {
tColor colorText = (active)?theme.Color(clrFontActive):theme.Color(clrFont); tColor colorText = (active)?theme.Color(clrFontActive):theme.Color(clrFont);
tColor colorTextBack; tColor colorTextBack;
if (tvguideConfig.style == eStyleFlat) if (config.style == eStyleFlat)
colorTextBack = color; colorTextBack = color;
else if (tvguideConfig.style == eStyleGraphical) else if (config.style == eStyleGraphical)
colorTextBack = (active)?theme.Color(clrGridActiveFontBack):theme.Color(clrGridFontBack); colorTextBack = (active)?theme.Color(clrGridActiveFontBack):theme.Color(clrGridFontBack);
else else
colorTextBack = clrTransparent; colorTextBack = clrTransparent;
if (tvguideConfig.displayMode == eVertical) { if (config.displayMode == eVertical) {
if (Height()/geoManager.minutePixel < 6) if (Height()/geoManager.minutePixel < 6)
return; return;
int textHeight = fontManager.FontGrid->Height(); int textHeight = fontManager.FontGrid->Height();
@ -82,7 +82,7 @@ void cDummyGrid::drawText() {
pixmap->DrawText(cPoint(borderWidth, borderWidth + i*textHeight), text->GetLine(i), colorText, colorTextBack, fontManager.FontGrid); pixmap->DrawText(cPoint(borderWidth, borderWidth + i*textHeight), text->GetLine(i), colorText, colorTextBack, fontManager.FontGrid);
} }
} else if (tvguideConfig.displayMode == eHorizontal) { } else if (config.displayMode == eHorizontal) {
if (Width()/geoManager.minutePixel < 10) { if (Width()/geoManager.minutePixel < 10) {
int titleY = (geoManager.rowHeight - fontManager.FontGridHorizontal->Height())/2; int titleY = (geoManager.rowHeight - fontManager.FontGridHorizontal->Height())/2;
pixmap->DrawText(cPoint(borderWidth - 2, titleY), "...", colorText, colorTextBack, fontManager.FontGridHorizontal); pixmap->DrawText(cPoint(borderWidth - 2, titleY), "...", colorText, colorTextBack, fontManager.FontGridHorizontal);
@ -103,9 +103,9 @@ cString cDummyGrid::getTimeString(void) {
void cDummyGrid::debug() { void cDummyGrid::debug() {
esyslog("tvguide dummygrid: %s: %s, %s, viewportHeight: %d px, Duration: %ld min, active: %d", esyslog("tvguide dummygrid: %s: %s, %s, viewportHeight: %d px, Duration: %ld min, active: %d",
column->Name(), column->Name(),
*cMyTime::printTime(start), *cTimeManager::printTime(start),
*cMyTime::printTime(end), *cTimeManager::printTime(end),
viewportHeight, viewportHeight,
Duration()/60, Duration()/60,
active); active);
} }

View File

@ -1,12 +1,12 @@
#ifndef __TVGUIDE_DUMMYGRID_H #ifndef __TVGUIDE_DUMMYGRID_H
#define __TVGUIDE_DUMMYGRID_H #define __TVGUIDE_DUMMYGRID_H
#include "grid.h" #include "gridelement.h"
#include "channelcolumn.h" #include "channelepg.h"
// --- cDummyGrid ------------------------------------------------------------- // --- cDummyGrid -------------------------------------------------------------
class cDummyGrid : public cGrid { class cDummyGrid : public cGridElement {
private: private:
time_t start; time_t start;
time_t end; time_t end;
@ -14,7 +14,7 @@ private:
void drawText(); void drawText();
time_t Duration(void); time_t Duration(void);
public: public:
cDummyGrid(cChannelColumn *c, time_t start, time_t end); cDummyGrid(cChannelEpg *c, time_t start, time_t end);
virtual ~cDummyGrid(void); virtual ~cDummyGrid(void);
void SetViewportHeight(); void SetViewportHeight();
void PositionPixmap(); void PositionPixmap();
@ -24,11 +24,11 @@ public:
time_t EndTime() { return end; }; time_t EndTime() { return end; };
void SetStartTime(time_t start) { this->start = start; }; void SetStartTime(time_t start) { this->start = start; };
void SetEndTime(time_t end) { this->end = end; }; void SetEndTime(time_t end) { this->end = end; };
int calcOverlap(cGrid *neighbor); int calcOverlap(cGridElement *neighbor);
void setTimer() {}; void setTimer() {};
cString getText(void); cString getText(void);
cString getTimeString(void); cString getTimeString(void);
void debug(); void debug();
}; };
#endif //__TVGUIDE_DUMMYGRID_H #endif //__TVGUIDE_DUMMYGRID_H

366
epggrid.c
View File

@ -1,169 +1,197 @@
#include "services/remotetimers.h" #include "services/remotetimers.h"
#include "channelcolumn.h" #include "channelepg.h"
#include "tools.h" #include "tools.h"
#include "epggrid.h" #include "epggrid.h"
cEpgGrid::cEpgGrid(cChannelColumn *c, const cEvent *event) : cGrid(c) { cEpgGrid::cEpgGrid(cChannelEpg *c, const cEvent *event) : cGridElement(c) {
this->event = event; this->event = event;
extText = new cTextWrapper(); extText = new cTextWrapper();
hasTimer = false; hasTimer = false;
SetTimer(); SetTimer();
hasSwitchTimer = false; hasSwitchTimer = false;
SetSwitchTimer(); SetSwitchTimer();
dummy = false; dummy = false;
} }
cEpgGrid::~cEpgGrid(void) { cEpgGrid::~cEpgGrid(void) {
delete extText; delete extText;
} }
void cEpgGrid::SetViewportHeight() { void cEpgGrid::SetViewportHeight() {
int viewportHeightOld = viewportHeight; int viewportHeightOld = viewportHeight;
if ( column->Start() > StartTime() ) { if ( column->Start() > StartTime() ) {
viewportHeight = (min((int)EndTime(), column->Stop()) - column->Start()) /60; viewportHeight = (std::min((int)EndTime(), column->Stop()) - column->Start()) / 60;
} else if ( column->Stop() < EndTime() ) { } else if ( column->Stop() < EndTime() ) {
viewportHeight = (column->Stop() - StartTime()) /60; viewportHeight = (column->Stop() - StartTime()) / 60;
if (viewportHeight < 0) viewportHeight = 0; if (viewportHeight < 0) viewportHeight = 0;
} else { } else {
viewportHeight = Duration() / 60; viewportHeight = Duration() / 60;
} }
viewportHeight *= geoManager.minutePixel; viewportHeight *= geoManager.minutePixel;
if (viewportHeight != viewportHeightOld) if (viewportHeight != viewportHeightOld)
dirty = true; dirty = true;
} }
void cEpgGrid::PositionPixmap() { void cEpgGrid::PositionPixmap() {
int x0, y0; if (config.displayMode == eVertical) {
if (tvguideConfig.displayMode == eVertical) { int x0 = column->getX();
int x0 = column->getX(); int y0 = geoManager.statusHeaderHeight + geoManager.channelHeaderHeight + geoManager.channelGroupsHeight;
int y0 = geoManager.statusHeaderHeight + geoManager.channelHeaderHeight + geoManager.channelGroupsHeight; if ( column->Start() < StartTime() ) {
if ( column->Start() < StartTime() ) { y0 += (StartTime() - column->Start()) / 60 * geoManager.minutePixel;
y0 += (StartTime() - column->Start())/60*geoManager.minutePixel; }
} if (!pixmap) {
if (!pixmap) { pixmap = osdManager.CreatePixmap(-1, cRect(x0, y0, geoManager.colWidth, viewportHeight),
pixmap = osdManager.requestPixmap(-1, cRect(x0, y0, geoManager.colWidth, viewportHeight), cRect(0, 0, geoManager.colWidth, Duration() / 60 * geoManager.minutePixel));
cRect(0, 0, geoManager.colWidth, Duration()/60*geoManager.minutePixel)); } else {
} else { pixmap->SetViewPort(cRect(x0, y0, geoManager.colWidth, viewportHeight));
pixmap->SetViewPort(cRect(x0, y0, geoManager.colWidth, viewportHeight)); }
} } else if (config.displayMode == eHorizontal) {
} else if (tvguideConfig.displayMode == eHorizontal) { int x0 = geoManager.channelHeaderWidth + geoManager.channelGroupsWidth;
int x0 = geoManager.channelHeaderWidth + geoManager.channelGroupsWidth; int y0 = column->getY();
int y0 = column->getY(); if ( column->Start() < StartTime() ) {
if ( column->Start() < StartTime() ) { x0 += (StartTime() - column->Start()) / 60 * geoManager.minutePixel;
x0 += (StartTime() - column->Start())/60*geoManager.minutePixel; }
} if (!pixmap) {
if (!pixmap) { pixmap = osdManager.CreatePixmap(-1, cRect(x0, y0, viewportHeight, geoManager.rowHeight),
pixmap = osdManager.requestPixmap(-1, cRect(x0, y0, viewportHeight, geoManager.rowHeight), cRect(0, 0, Duration() / 60 * geoManager.minutePixel, geoManager.rowHeight));
cRect(0, 0, Duration()/60*geoManager.minutePixel, geoManager.rowHeight)); } else {
} else { pixmap->SetViewPort(cRect(x0, y0, viewportHeight, geoManager.rowHeight ));
pixmap->SetViewPort(cRect(x0, y0, viewportHeight, geoManager.rowHeight )); }
} }
}
}
}
void cEpgGrid::SetTimer() {
void cEpgGrid::SetTimer() { hasTimer = false;
if (tvguideConfig.useRemoteTimers && pRemoteTimers) { if (config.useRemoteTimers && pRemoteTimers) {
RemoteTimers_Event_v1_0 rt; RemoteTimers_Event_v1_0 rt;
rt.event = event; rt.event = event;
if (pRemoteTimers->Service("RemoteTimers::GetTimerByEvent-v1.0", &rt)) if (pRemoteTimers->Service("RemoteTimers::GetTimerByEvent-v1.0", &rt))
hasTimer = true; hasTimer = true;
else #if VDRVERSNUM >= 20301
hasTimer = false; } else {
} else if (column->HasTimer()) { eTimerMatch TimerMatch = tmNone;
hasTimer = event->HasTimer(); LOCK_TIMERS_READ;
} else { const cTimers *timers = Timers;
hasTimer = false; if (timers->GetMatch(event, &TimerMatch) && (TimerMatch == tmFull))
} hasTimer = true;
} #else
} else if (column->HasTimer()) {
void cEpgGrid::SetSwitchTimer() { hasTimer = event->HasTimer();
if (column->HasSwitchTimer()) { #endif
hasSwitchTimer = SwitchTimers.EventInSwitchList(event); }
} else { }
hasSwitchTimer = false;
} void cEpgGrid::SetSwitchTimer() {
} if (column->HasSwitchTimer()) {
hasSwitchTimer = SwitchTimers.EventInSwitchList(event);
void cEpgGrid::setText() { } else {
if (tvguideConfig.displayMode == eVertical) { hasSwitchTimer = false;
cString strText; }
strText = cString::sprintf("%s - %s:\n%s", *(event->GetTimeString()), *(event->GetEndTimeString()), event->Title()); }
text->Set(*(strText), fontManager.FontGrid, geoManager.colWidth-2*borderWidth);
extText->Set(event->ShortText(), fontManager.FontGridSmall, geoManager.colWidth-2*borderWidth); void cEpgGrid::setText() {
} else if (tvguideConfig.displayMode == eHorizontal) { if (config.displayMode == eVertical) {
timeString = cString::sprintf("%s - %s", *(event->GetTimeString()), *(event->GetEndTimeString())); text->Set(event->Title(), fontManager.FontGrid, geoManager.colWidth - 2 * borderWidth);
} extText->Set(event->ShortText(), fontManager.FontGridSmall, geoManager.colWidth - 2 * borderWidth);
} }
if (config.showTimeInGrid) {
void cEpgGrid::drawText() { timeString = cString::sprintf("%s - %s:", *(event->GetTimeString()), *(event->GetEndTimeString()));
tColor colorText = (active)?theme.Color(clrFontActive):theme.Color(clrFont); }
tColor colorTextBack; }
if (tvguideConfig.style == eStyleFlat)
colorTextBack = color; void cEpgGrid::drawText() {
else if (tvguideConfig.style == eStyleGraphical) tColor colorText = (active) ? theme.Color(clrFontActive) : theme.Color(clrFont);
colorTextBack = (active)?theme.Color(clrGridActiveFontBack):theme.Color(clrGridFontBack); tColor colorTextBack;
else if (config.style == eStyleFlat)
colorTextBack = clrTransparent; colorTextBack = color;
if (tvguideConfig.displayMode == eVertical) { else if (config.style == eStyleGraphical)
if (Height()/geoManager.minutePixel < 6) colorTextBack = (active) ? theme.Color(clrGridActiveFontBack) : theme.Color(clrGridFontBack);
return; else
int textHeight = fontManager.FontGrid->Height(); colorTextBack = clrTransparent;
int textLines = text->Lines(); if (config.displayMode == eVertical) {
for (int i=0; i<textLines; i++) { if (Height() / geoManager.minutePixel < 6)
pixmap->DrawText(cPoint(borderWidth, borderWidth + i*textHeight), text->GetLine(i), colorText, colorTextBack, fontManager.FontGrid); return;
} int textHeight = fontManager.FontGrid->Height();
int extTextLines = extText->Lines(); int textHeightSmall = fontManager.FontGridSmall->Height();
int offset = (textLines+1)*textHeight - 0.5*textHeight; int textLines = text->Lines();
textHeight = fontManager.FontGridSmall->Height(); int titleY = borderWidth;
if ((Height()-textHeight-10) > offset) { if (config.showTimeInGrid) { // mit Zeitangabe im Grid
for (int i=0; i<extTextLines; i++) { pixmap->DrawText(cPoint(borderWidth, borderWidth), *timeString, colorText, colorTextBack, fontManager.FontGridSmall);
pixmap->DrawText(cPoint(borderWidth, borderWidth + offset + i*textHeight), extText->GetLine(i), colorText, colorTextBack, fontManager.FontGridSmall); titleY += textHeightSmall;
} }
} for (int i = 0; i < textLines; i++) {
} else if (tvguideConfig.displayMode == eHorizontal) { pixmap->DrawText(cPoint(borderWidth, titleY + i * textHeight), text->GetLine(i), colorText, colorTextBack, fontManager.FontGrid);
if (Width()/geoManager.minutePixel < 10) { }
int titleY = (geoManager.rowHeight - fontManager.FontGridHorizontal->Height())/2; int extTextLines = extText->Lines();
pixmap->DrawText(cPoint(borderWidth - 2, titleY), "...", colorText, colorTextBack, fontManager.FontGridHorizontal); int offset = titleY + (textLines + 0.5) * textHeight;
return; if ((Height() - textHeightSmall - 10) > offset) {
} for (int i = 0; i < extTextLines; i++) {
cString strTitle = CutText(event->Title(), viewportHeight, fontManager.FontGridHorizontal).c_str(); pixmap->DrawText(cPoint(borderWidth, offset + i * textHeightSmall), extText->GetLine(i), colorText, colorTextBack, fontManager.FontGridSmall);
int titleY = 0; }
if (tvguideConfig.showTimeInGrid) { }
pixmap->DrawText(cPoint(borderWidth, borderWidth), *timeString, colorText, colorTextBack, fontManager.FontGridHorizontalSmall); } else if (config.displayMode == eHorizontal) {
titleY = fontManager.FontGridHorizontalSmall->Height() + (geoManager.rowHeight - fontManager.FontGridHorizontalSmall->Height() - fontManager.FontGridHorizontal->Height())/2; cString strTitle = CutText(event->Title(), viewportHeight - borderWidth, fontManager.FontGridHorizontal).c_str();
} else { int titleY = 0;
titleY = (geoManager.rowHeight - fontManager.FontGridHorizontal->Height())/2; if (config.showTimeInGrid) { // mit Zeitangabe im Grid
} pixmap->DrawText(cPoint(borderWidth, borderWidth), *timeString, colorText, colorTextBack, fontManager.FontGridHorizontalSmall);
pixmap->DrawText(cPoint(borderWidth, titleY), *strTitle, colorText, colorTextBack, fontManager.FontGridHorizontal); titleY = fontManager.FontGridHorizontalSmall->Height() + (geoManager.rowHeight - fontManager.FontGridHorizontalSmall->Height() - fontManager.FontGridHorizontal->Height()) / 2;
} } else {
if (hasSwitchTimer) titleY = (geoManager.rowHeight - fontManager.FontGridHorizontal->Height()) / 2;
drawIcon("Switch", theme.Color(clrButtonYellow)); }
if (hasTimer) pixmap->DrawText(cPoint(borderWidth, titleY), *strTitle, colorText, colorTextBack, fontManager.FontGridHorizontal);
drawIcon("REC", theme.Color(clrButtonRed)); }
} if (hasSwitchTimer)
drawIcon("Switch", theme.Color(clrButtonYellow));
void cEpgGrid::drawIcon(cString iconText, tColor color) { if (hasTimer) {
const cTimer *timer = NULL;
const cFont *font = (tvguideConfig.displayMode == eVertical) #if VDRVERSNUM >= 20301
?fontManager.FontGrid {
:fontManager.FontGridHorizontalSmall; LOCK_TIMERS_READ;
int textWidth = font->Width(*iconText)+2*borderWidth; timer = Timers->GetMatch(event);
int textHeight = font->Height()+10; }
pixmap->DrawRectangle( cRect(Width() - textWidth - borderWidth, Height() - textHeight - borderWidth, textWidth, textHeight), color); #else
pixmap->DrawText(cPoint(Width() - textWidth, Height() - textHeight - borderWidth/2), *iconText, theme.Color(clrFont), color, font); timer = Timers.GetMatch(event);
} #endif
if (timer)
cString cEpgGrid::getTimeString(void) { #ifdef SWITCHONLYPATCH
return cString::sprintf("%s - %s", *(event->GetTimeString()), *(event->GetEndTimeString())); if (timer->HasFlags(tfSwitchOnly))
} drawIcon("Switch", theme.Color(clrButtonYellow));
else if (timer->HasFlags(tfActive))
void cEpgGrid::debug() { #else /* SWITCHONLY */
esyslog("tvguide epggrid: %s: %s, %s, viewportHeight: %d px, Duration: %d min, active: %d", if (timer->HasFlags(tfActive))
column->Name(), #endif /* SWITCHONLY */
*(event->GetTimeString()), drawIcon("REC", theme.Color(clrButtonRed));
event->Title(), else
viewportHeight, drawIcon("REC", theme.Color(clrButtonGreen));
event->Duration()/60, }
active); }
}
void cEpgGrid::drawIcon(cString iconText, tColor color) {
const cFont *font = (config.displayMode == eVertical) ? fontManager.FontGrid : fontManager.FontGridHorizontalSmall;
int textWidth = font->Width(*iconText) + 2 * borderWidth;
int textHeight = font->Height() + 10;
if ((config.displayMode == eHorizontal) && ((Width() - 2 * textWidth) < 0))
pixmap->DrawEllipse( cRect(Width() - textHeight / 2 - borderWidth, Height() - textHeight - borderWidth, textHeight / 2, textHeight / 2), color);
else if ((config.displayMode == eVertical) && ((Height() - 2 * textHeight) < 0))
pixmap->DrawEllipse( cRect(Width() - textHeight / 2 - borderWidth, borderWidth, textHeight / 2, textHeight / 2), color);
else {
pixmap->DrawEllipse( cRect(Width() - textWidth - borderWidth, Height() - textHeight - borderWidth, textWidth, textHeight), color);
pixmap->DrawText(cPoint(Width() - textWidth, Height() - textHeight - borderWidth / 2), *iconText, theme.Color(clrFont), clrTransparent, font);
}
}
cString cEpgGrid::getTimeString(void) {
return cString::sprintf("%s - %s", *(event->GetTimeString()), *(event->GetEndTimeString()));
}
void cEpgGrid::debug() {
esyslog("tvguide epggrid: %s: %s, %s, viewportHeight: %d px, Duration: %d min, active: %d",
column->Name(),
*(event->GetTimeString()),
event->Title(),
viewportHeight,
event->Duration()/60,
active);
}

View File

@ -1,32 +1,33 @@
#ifndef __TVGUIDE_EPGGRID_H #ifndef __TVGUIDE_EPGGRID_H
#define __TVGUIDE_EPGGRID_H #define __TVGUIDE_EPGGRID_H
#include <vdr/epg.h> #include <vdr/epg.h>
#include "grid.h" #include "gridelement.h"
// --- cEpgGrid ------------------------------------------------------------- // --- cEpgGrid -------------------------------------------------------------
class cEpgGrid : public cGrid { class cEpgGrid : public cGridElement {
private: private:
const cEvent *event; const cTimer *timer;
cTextWrapper *extText; const cEvent *event;
cString timeString; cTextWrapper *extText;
void drawText(); cString timeString;
void drawIcon(cString iconText, tColor color); void drawText();
time_t Duration(void) { return event->Duration(); }; void drawIcon(cString iconText, tColor color);
public: time_t Duration(void) { return event->Duration(); };
cEpgGrid(cChannelColumn *c, const cEvent *event); public:
virtual ~cEpgGrid(void); cEpgGrid(cChannelEpg *c, const cEvent *event);
void SetViewportHeight(); virtual ~cEpgGrid(void);
void PositionPixmap(); void SetViewportHeight();
void setText(void); void PositionPixmap();
const cEvent *GetEvent() {return event;}; void setText(void);
time_t StartTime() { return event->StartTime(); }; const cEvent *GetEvent() {return event;};
time_t EndTime() { return event->EndTime(); }; time_t StartTime() { return event->StartTime(); };
void SetTimer(); time_t EndTime() { return event->EndTime(); };
void SetSwitchTimer(); void SetTimer();
cString getTimeString(void); void SetSwitchTimer();
void debug(); cString getTimeString(void);
}; void debug();
};
#endif //__TVGUIDE_EPGGRID_H
#endif //__TVGUIDE_EPGGRID_H

View File

@ -1,96 +1,96 @@
#include "geometrymanager.h" #include "geometrymanager.h"
#include "config.h" #include "config.h"
#include "fontmanager.h" #include "fontmanager.h"
cFontManager::cFontManager() { cFontManager::cFontManager() {
} }
cFontManager::~cFontManager() { cFontManager::~cFontManager() {
DeleteFonts(); DeleteFonts();
} }
void cFontManager::SetFonts() { void cFontManager::SetFonts() {
InitialiseFontType(); InitialiseFontType();
//Common Fonts //Common Fonts
FontButton = CreateFont(geoManager.footerHeight/3 + 4 + tvguideConfig.FontButtonDelta); FontButton = CreateFont(geoManager.footerHeight/3 + 4 + config.FontButtonDelta);
FontDetailView = CreateFont(geoManager.osdHeight/30 + tvguideConfig.FontDetailViewDelta); FontDetailView = CreateFont(geoManager.osdHeight/30 + config.FontDetailViewDelta);
FontDetailViewSmall = CreateFont(geoManager.osdHeight/40 + tvguideConfig.FontDetailViewSmallDelta); FontDetailViewSmall = CreateFont(geoManager.osdHeight/40 + config.FontDetailViewSmallDelta);
FontDetailHeader = CreateFont(geoManager.osdHeight/27 + tvguideConfig.FontDetailHeaderDelta); FontDetailHeader = CreateFont(geoManager.osdHeight/27 + config.FontDetailHeaderDelta);
FontDetailHeaderLarge = CreateFont(geoManager.osdHeight/20 + tvguideConfig.FontDetailHeaderDelta); FontDetailHeaderLarge = CreateFont(geoManager.osdHeight/20 + config.FontDetailHeaderDelta);
FontMessageBox = CreateFont(geoManager.osdHeight/33 + tvguideConfig.FontMessageBoxDelta); FontMessageBox = CreateFont(geoManager.osdHeight/33 + config.FontMessageBoxDelta);
FontMessageBoxLarge = CreateFont(geoManager.osdHeight/30 + tvguideConfig.FontMessageBoxLargeDelta); FontMessageBoxLarge = CreateFont(geoManager.osdHeight/30 + config.FontMessageBoxLargeDelta);
FontStatusHeader = CreateFont(geoManager.statusHeaderHeight/6 - 4 + tvguideConfig.FontStatusHeaderDelta); FontStatusHeader = CreateFont(geoManager.statusHeaderHeight/6 - 4 + config.FontStatusHeaderDelta);
FontStatusHeaderLarge = CreateFont(geoManager.statusHeaderHeight/5 + tvguideConfig.FontStatusHeaderLargeDelta); FontStatusHeaderLarge = CreateFont(geoManager.statusHeaderHeight/5 + config.FontStatusHeaderLargeDelta);
//Fonts for vertical Display //Fonts for vertical Display
FontChannelHeader = CreateFont(geoManager.colWidth/10 + tvguideConfig.FontChannelHeaderDelta); FontChannelHeader = CreateFont(geoManager.colWidth/10 + config.FontChannelHeaderDelta);
FontChannelGroups = CreateFont(geoManager.colWidth/8 + tvguideConfig.FontChannelGroupsDelta); FontChannelGroups = CreateFont(geoManager.colWidth/8 + config.FontChannelGroupsDelta);
FontGrid = CreateFont(geoManager.colWidth/12 + tvguideConfig.FontGridDelta); FontGrid = CreateFont(geoManager.colWidth/12 + config.FontGridDelta);
FontGridSmall = CreateFont(geoManager.colWidth/12 + tvguideConfig.FontGridSmallDelta); FontGridSmall = CreateFont(geoManager.colWidth/12 + config.FontGridSmallDelta);
FontTimeLineWeekday = CreateFont(geoManager.timeLineWidth/3 + tvguideConfig.FontTimeLineWeekdayDelta); FontTimeLineWeekday = CreateFont(geoManager.timeLineWidth/3 + config.FontTimeLineWeekdayDelta);
FontTimeLineDate = CreateFont(geoManager.timeLineWidth/4 + tvguideConfig.FontTimeLineDateDelta); FontTimeLineDate = CreateFont(geoManager.timeLineWidth/4 + config.FontTimeLineDateDelta);
FontTimeLineTime = CreateFont(geoManager.timeLineWidth/4 + tvguideConfig.FontTimeLineTimeDelta); FontTimeLineTime = CreateFont(geoManager.timeLineWidth/4 + config.FontTimeLineTimeDelta);
//Fonts for horizontal Display //Fonts for horizontal Display
FontChannelHeaderHorizontal = CreateFont(geoManager.rowHeight/3 + tvguideConfig.FontChannelHeaderHorizontalDelta); FontChannelHeaderHorizontal = CreateFont(geoManager.rowHeight/3 + config.FontChannelHeaderHorizontalDelta);
FontChannelGroupsHorizontal = CreateFont(geoManager.rowHeight/3 + 5 + tvguideConfig.FontChannelGroupsHorizontalDelta); FontChannelGroupsHorizontal = CreateFont(geoManager.rowHeight/3 + 5 + config.FontChannelGroupsHorizontalDelta);
FontGridHorizontal = CreateFont(geoManager.rowHeight/3 + 5 + tvguideConfig.FontGridHorizontalDelta); FontGridHorizontal = CreateFont(geoManager.rowHeight/3 + 5 + config.FontGridHorizontalDelta);
FontGridHorizontalSmall = CreateFont(geoManager.rowHeight/4 + tvguideConfig.FontGridHorizontalSmallDelta); FontGridHorizontalSmall = CreateFont(geoManager.rowHeight/4 + config.FontGridHorizontalSmallDelta);
FontTimeLineDateHorizontal = CreateFont(geoManager.timeLineHeight/2 + 5 + tvguideConfig.FontTimeLineDateHorizontalDelta); FontTimeLineDateHorizontal = CreateFont(geoManager.timeLineHeight/2 + 5 + config.FontTimeLineDateHorizontalDelta);
FontTimeLineTimeHorizontal = CreateFont(geoManager.timeLineHeight/2 + tvguideConfig.FontTimeLineTimeHorizontalDelta); FontTimeLineTimeHorizontal = CreateFont(geoManager.timeLineHeight/2 + config.FontTimeLineTimeHorizontalDelta);
//Fonts for RecMenu //Fonts for RecMenu
FontRecMenuItem = CreateFont(geoManager.osdHeight/30 + tvguideConfig.FontRecMenuItemDelta); FontRecMenuItem = CreateFont(geoManager.osdHeight/30 + config.FontRecMenuItemDelta);
FontRecMenuItemSmall = CreateFont(geoManager.osdHeight/40 + tvguideConfig.FontRecMenuItemSmallDelta); FontRecMenuItemSmall = CreateFont(geoManager.osdHeight/40 + config.FontRecMenuItemSmallDelta);
FontRecMenuItemLarge = CreateFont(geoManager.osdHeight/25 + tvguideConfig.FontRecMenuItemLargeDelta); FontRecMenuItemLarge = CreateFont(geoManager.osdHeight/25 + config.FontRecMenuItemLargeDelta);
} }
void cFontManager::DeleteFonts() { void cFontManager::DeleteFonts() {
delete FontButton; delete FontButton;
delete FontDetailView; delete FontDetailView;
delete FontDetailViewSmall; delete FontDetailViewSmall;
delete FontDetailHeader; delete FontDetailHeader;
delete FontDetailHeaderLarge; delete FontDetailHeaderLarge;
delete FontMessageBox; delete FontMessageBox;
delete FontMessageBoxLarge; delete FontMessageBoxLarge;
delete FontStatusHeader; delete FontStatusHeader;
delete FontStatusHeaderLarge; delete FontStatusHeaderLarge;
delete FontChannelHeader; delete FontChannelHeader;
delete FontChannelGroups; delete FontChannelGroups;
delete FontGrid; delete FontGrid;
delete FontGridSmall; delete FontGridSmall;
delete FontTimeLineWeekday; delete FontTimeLineWeekday;
delete FontTimeLineDate; delete FontTimeLineDate;
delete FontTimeLineTime; delete FontTimeLineTime;
delete FontChannelHeaderHorizontal; delete FontChannelHeaderHorizontal;
delete FontChannelGroupsHorizontal; delete FontChannelGroupsHorizontal;
delete FontGridHorizontal; delete FontGridHorizontal;
delete FontGridHorizontalSmall; delete FontGridHorizontalSmall;
delete FontTimeLineDateHorizontal; delete FontTimeLineDateHorizontal;
delete FontTimeLineTimeHorizontal; delete FontTimeLineTimeHorizontal;
delete FontRecMenuItem; delete FontRecMenuItem;
delete FontRecMenuItemSmall; delete FontRecMenuItemSmall;
delete FontRecMenuItemLarge; delete FontRecMenuItemLarge;
} }
void cFontManager::InitialiseFontType(void) { void cFontManager::InitialiseFontType(void) {
if (tvguideConfig.fontIndex == 0) { if (config.fontIndex == 0) {
fontName = tvguideConfig.fontNameDefault; fontName = config.fontNameDefault;
} else { } else {
cStringList availableFonts; cStringList availableFonts;
cFont::GetAvailableFontNames(&availableFonts); cFont::GetAvailableFontNames(&availableFonts);
if (availableFonts[tvguideConfig.fontIndex-1]) { if (availableFonts[config.fontIndex-1]) {
fontName = availableFonts[tvguideConfig.fontIndex-1]; fontName = availableFonts[config.fontIndex-1];
} else } else
fontName = tvguideConfig.fontNameDefault; fontName = config.fontNameDefault;
} }
cFont *test = NULL; cFont *test = NULL;
test = cFont::CreateFont(*fontName, 30); test = cFont::CreateFont(*fontName, 30);
if (!test) { if (!test) {
fontName = DefaultFontSml; fontName = DefaultFontSml;
} }
delete test; delete test;
esyslog("tvguide: Set Font to %s", *fontName); esyslog("tvguide: Set Font to %s", *fontName);
} }
cFont *cFontManager::CreateFont(int size) { cFont *cFontManager::CreateFont(int size) {
return cFont::CreateFont(*fontName, size); return cFont::CreateFont(*fontName, size);
} }

View File

@ -1,41 +1,41 @@
#ifndef __TVGUIDE_FONTMANAGER_H #ifndef __TVGUIDE_FONTMANAGER_H
#define __TVGUIDE_FONTMANAGER_H #define __TVGUIDE_FONTMANAGER_H
#include <vdr/skins.h> #include <vdr/skins.h>
class cFontManager { class cFontManager {
cString fontName; cString fontName;
void InitialiseFontType(void); void InitialiseFontType(void);
cFont *CreateFont(int size); cFont *CreateFont(int size);
public: public:
cFontManager(); cFontManager();
~cFontManager(); ~cFontManager();
void SetFonts(void); void SetFonts(void);
void DeleteFonts(void); void DeleteFonts(void);
cFont *FontChannelHeader; cFont *FontChannelHeader;
cFont *FontChannelHeaderHorizontal; cFont *FontChannelHeaderHorizontal;
cFont *FontChannelGroups; cFont *FontChannelGroups;
cFont *FontChannelGroupsHorizontal; cFont *FontChannelGroupsHorizontal;
cFont *FontStatusHeader; cFont *FontStatusHeader;
cFont *FontStatusHeaderLarge; cFont *FontStatusHeaderLarge;
cFont *FontGrid; cFont *FontGrid;
cFont *FontGridSmall; cFont *FontGridSmall;
cFont *FontGridHorizontal; cFont *FontGridHorizontal;
cFont *FontGridHorizontalSmall; cFont *FontGridHorizontalSmall;
cFont *FontTimeLineWeekday; cFont *FontTimeLineWeekday;
cFont *FontTimeLineDate; cFont *FontTimeLineDate;
cFont *FontTimeLineDateHorizontal; cFont *FontTimeLineDateHorizontal;
cFont *FontTimeLineTime; cFont *FontTimeLineTime;
cFont *FontTimeLineTimeHorizontal; cFont *FontTimeLineTimeHorizontal;
cFont *FontButton; cFont *FontButton;
cFont *FontDetailView; cFont *FontDetailView;
cFont *FontDetailViewSmall; cFont *FontDetailViewSmall;
cFont *FontDetailHeader; cFont *FontDetailHeader;
cFont *FontDetailHeaderLarge; cFont *FontDetailHeaderLarge;
cFont *FontMessageBox; cFont *FontMessageBox;
cFont *FontMessageBoxLarge; cFont *FontMessageBoxLarge;
cFont *FontRecMenuItem; cFont *FontRecMenuItem;
cFont *FontRecMenuItemSmall; cFont *FontRecMenuItemSmall;
cFont *FontRecMenuItemLarge; cFont *FontRecMenuItemLarge;
}; };
#endif //__TVGUIDE_FONTMANAGER_H #endif //__TVGUIDE_FONTMANAGER_H

334
footer.c
View File

@ -1,167 +1,167 @@
#include <string> #include <string>
#include "imageloader.h" #include "imageloader.h"
#include "tools.h" #include "tools.h"
#include "footer.h" #include "footer.h"
cFooter::cFooter(cChannelGroups *channelGroups) { cFooter::cFooter(cChannelGroups *channelGroups) {
this->channelGroups = channelGroups; this->channelGroups = channelGroups;
currentGroup = -1; currentGroup = -1;
buttonY = (geoManager.footerHeight - geoManager.buttonHeight)/2; buttonY = (geoManager.footerHeight - geoManager.buttonHeight)/2;
SetButtonPositions(); SetButtonPositions();
footer = osdManager.requestPixmap(2, cRect( 0, footer = osdManager.CreatePixmap(2, cRect( 0,
geoManager.footerY, geoManager.footerY,
geoManager.osdWidth, geoManager.osdWidth,
geoManager.footerHeight), geoManager.footerHeight),
cRect::Null); cRect::Null);
footer->Fill(clrTransparent); footer->Fill(clrTransparent);
} }
cFooter::~cFooter(void) { cFooter::~cFooter(void) {
osdManager.releasePixmap(footer); osdManager.DestroyPixmap(footer);
} }
void cFooter::drawRedButton() { void cFooter::drawRedButton() {
cString text(tr("Search & Rec")); cString text(tr("Search & Rec"));
DrawButton(*text, theme.Color(clrButtonRed), theme.Color(clrButtonRedBorder), oeButtonRed, positionButtons[0]); DrawButton(*text, theme.Color(clrButtonRed), theme.Color(clrButtonRedBorder), oeButtonRed, positionButtons[0]);
} }
void cFooter::drawGreenButton() { void cFooter::drawGreenButton() {
cString text = cString::sprintf("%d %s", tvguideConfig.jumpChannels, tr("Channels back")); cString text = cString::sprintf("%d %s", config.jumpChannels, tr("Channels back"));
DrawButton(*text, theme.Color(clrButtonGreen), theme.Color(clrButtonGreenBorder), oeButtonGreen, positionButtons[1]); DrawButton(*text, theme.Color(clrButtonGreen), theme.Color(clrButtonGreenBorder), oeButtonGreen, positionButtons[1]);
} }
void cFooter::drawGreenButton(const char *text) { void cFooter::drawGreenButton(const char *text) {
std::string cuttedText = CutText(text, geoManager.buttonWidth-6, fontManager.FontButton); std::string cuttedText = CutText(text, geoManager.buttonWidth-6, fontManager.FontButton);
DrawButton(cuttedText.c_str(), theme.Color(clrButtonGreen), theme.Color(clrButtonGreenBorder), oeButtonGreen, positionButtons[1]); DrawButton(cuttedText.c_str(), theme.Color(clrButtonGreen), theme.Color(clrButtonGreenBorder), oeButtonGreen, positionButtons[1]);
} }
void cFooter::drawYellowButton() { void cFooter::drawYellowButton() {
cString text = cString::sprintf("%d %s", tvguideConfig.jumpChannels, tr("Channels forward")); cString text = cString::sprintf("%d %s", config.jumpChannels, tr("Channels forward"));
DrawButton(*text, theme.Color(clrButtonYellow), theme.Color(clrButtonYellowBorder), oeButtonYellow, positionButtons[2]); DrawButton(*text, theme.Color(clrButtonYellow), theme.Color(clrButtonYellowBorder), oeButtonYellow, positionButtons[2]);
} }
void cFooter::drawYellowButton(const char *text) { void cFooter::drawYellowButton(const char *text) {
std::string cuttedText = CutText(text, geoManager.buttonWidth-6, fontManager.FontButton); std::string cuttedText = CutText(text, geoManager.buttonWidth-6, fontManager.FontButton);
DrawButton(cuttedText.c_str(), theme.Color(clrButtonYellow), theme.Color(clrButtonYellowBorder), oeButtonYellow, positionButtons[2]); DrawButton(cuttedText.c_str(), theme.Color(clrButtonYellow), theme.Color(clrButtonYellowBorder), oeButtonYellow, positionButtons[2]);
} }
void cFooter::drawBlueButton(bool detailedEPG) { void cFooter::drawBlueButton(bool detailedEPG) {
cString text; cString text;
if (tvguideConfig.blueKeyMode == eBlueKeySwitch) if (config.blueKeyMode == eBlueKeySwitch)
text = tr("Switch to Channel"); text = tr("Switch to Channel");
else if (tvguideConfig.blueKeyMode == eBlueKeyEPG) { else if (config.blueKeyMode == eBlueKeyEPG) {
if (!detailedEPG) if (!detailedEPG)
text = tr("Detailed EPG"); text = tr("Detailed EPG");
else else
text = tr("Close detailed EPG"); text = tr("Close detailed EPG");
} else if (tvguideConfig.blueKeyMode == eBlueKeyFavorites) { } else if (config.blueKeyMode == eBlueKeyFavorites) {
if (!detailedEPG) if (!detailedEPG)
text = tr("Favorites"); text = tr("Favorites");
else else
text = tr("Switch to Channel"); text = tr("Switch to Channel");
} }
DrawButton(*text, theme.Color(clrButtonBlue), theme.Color(clrButtonBlueBorder), oeButtonBlue, positionButtons[3]); DrawButton(*text, theme.Color(clrButtonBlue), theme.Color(clrButtonBlueBorder), oeButtonBlue, positionButtons[3]);
} }
void cFooter::UpdateGroupButtons(const cChannel *channel, bool force) { void cFooter::UpdateGroupButtons(const cChannel *channel, bool force) {
if (!channel) if (!channel)
return; return;
int group = channelGroups->GetGroup(channel); int group = channelGroups->GetGroup(channel);
if ((group != currentGroup) || force) { if ((group != currentGroup) || force) {
currentGroup = group; currentGroup = group;
drawGreenButton(channelGroups->GetPrev(group)); drawGreenButton(channelGroups->GetPrev(group));
drawYellowButton(channelGroups->GetNext(group)); drawYellowButton(channelGroups->GetNext(group));
} }
} }
void cFooter::SetDetailedViewMode(bool fromRecMenu) { void cFooter::SetDetailedViewMode(bool fromRecMenu) {
ClearButton(positionButtons[1]); ClearButton(positionButtons[1]);
ClearButton(positionButtons[2]); ClearButton(positionButtons[2]);
if (fromRecMenu) { if (fromRecMenu) {
ClearButton(positionButtons[0]); ClearButton(positionButtons[0]);
ClearButton(positionButtons[3]); ClearButton(positionButtons[3]);
} else if (tvguideConfig.blueKeyMode != eBlueKeySwitch) { } else if (config.blueKeyMode != eBlueKeySwitch) {
ClearButton(positionButtons[3]); ClearButton(positionButtons[3]);
drawBlueButton(true); drawBlueButton(true);
} }
} }
void cFooter::LeaveDetailedViewMode(const cChannel *channel) { void cFooter::LeaveDetailedViewMode(const cChannel *channel) {
drawRedButton(); drawRedButton();
drawBlueButton(); drawBlueButton();
if (tvguideConfig.channelJumpMode == eNumJump) { if (config.channelJumpMode == eNumJump) {
drawGreenButton(); drawGreenButton();
drawYellowButton(); drawYellowButton();
} else { } else {
UpdateGroupButtons(channel, true); UpdateGroupButtons(channel, true);
} }
} }
void cFooter::SetButtonPositions(void) { void cFooter::SetButtonPositions(void) {
for (int i=0; i < 4; i++) { for (int i=0; i < 4; i++) {
positionButtons[i] = -1; positionButtons[i] = -1;
} }
/* /*
red button = 0 red button = 0
green button = 1 green button = 1
yellow button = 2 yellow button = 2
blue button = 3 blue button = 3
*/ */
for (int button=0; button<4; button++) { for (int button=0; button<4; button++) {
if (Setup.ColorKey0 == button) { if (Setup.ColorKey0 == button) {
positionButtons[button] = 0; positionButtons[button] = 0;
continue; continue;
} }
if (Setup.ColorKey1 == button) { if (Setup.ColorKey1 == button) {
positionButtons[button] = 1; positionButtons[button] = 1;
continue; continue;
} }
if (Setup.ColorKey2 == button) { if (Setup.ColorKey2 == button) {
positionButtons[button] = 2; positionButtons[button] = 2;
continue; continue;
} }
if (Setup.ColorKey3 == button) { if (Setup.ColorKey3 == button) {
positionButtons[button] = 3; positionButtons[button] = 3;
continue; continue;
} }
} }
} }
void cFooter::DrawButton(const char *text, tColor color, tColor borderColor, eOsdElementType buttonType, int num) { void cFooter::DrawButton(const char *text, tColor color, tColor borderColor, eOsdElementType buttonType, int num) {
tColor colorTextBack = (tvguideConfig.style == eStyleFlat)?color:clrTransparent; tColor colorTextBack = (config.style == eStyleFlat)?color:clrTransparent;
int left = num * geoManager.buttonWidth + (2 * num + 1) * geoManager.buttonBorder; int left = num * geoManager.buttonWidth + (2 * num + 1) * geoManager.buttonBorder;
if ((tvguideConfig.style == eStyleBlendingMagick) || (tvguideConfig.style == eStyleBlendingDefault)) { if ((config.style == eStyleBlendingMagick) || (config.style == eStyleBlendingDefault)) {
cImageLoader imgLoader; cImageLoader imgLoader;
imgLoader.DrawBackground(theme.Color(clrButtonBlend), color, geoManager.buttonWidth-4, geoManager.buttonHeight-4); imgLoader.DrawBackground(theme.Color(clrButtonBlend), color, geoManager.buttonWidth-4, geoManager.buttonHeight-4);
footer->DrawRectangle(cRect(left, buttonY, geoManager.buttonWidth, geoManager.buttonHeight), borderColor); footer->DrawRectangle(cRect(left, buttonY, geoManager.buttonWidth, geoManager.buttonHeight), borderColor);
footer->DrawImage(cPoint(left+2, buttonY+2), imgLoader.GetImage()); footer->DrawImage(cPoint(left+2, buttonY+2), imgLoader.GetImage());
if (tvguideConfig.roundedCorners) { if (config.roundedCorners) {
int borderRadius = 12; int borderRadius = 12;
int borderWidth = 2; int borderWidth = 2;
DrawRoundedCorners(footer, left, buttonY, geoManager.buttonWidth, geoManager.buttonHeight, borderRadius, borderWidth, borderColor); DrawRoundedCorners(footer, left, buttonY, geoManager.buttonWidth, geoManager.buttonHeight, borderRadius, borderWidth, borderColor);
} }
} else if (tvguideConfig.style == eStyleGraphical) { } else if (config.style == eStyleGraphical) {
cImage *button = imgCache.GetOsdElement(buttonType); cImage *button = imgCache.GetOsdElement(buttonType);
if (button) { if (button) {
footer->DrawImage(cPoint(left, buttonY), *button); footer->DrawImage(cPoint(left, buttonY), *button);
} }
} else { } else {
footer->DrawRectangle(cRect(left, buttonY, geoManager.buttonWidth, geoManager.buttonHeight), borderColor); footer->DrawRectangle(cRect(left, buttonY, geoManager.buttonWidth, geoManager.buttonHeight), borderColor);
footer->DrawRectangle(cRect(left+1, buttonY+1, geoManager.buttonWidth-2, geoManager.buttonHeight-2), color); footer->DrawRectangle(cRect(left+1, buttonY+1, geoManager.buttonWidth-2, geoManager.buttonHeight-2), color);
if (tvguideConfig.roundedCorners) { if (config.roundedCorners) {
int borderRadius = 12; int borderRadius = 12;
int borderWidth = 1; int borderWidth = 1;
DrawRoundedCorners(footer, left, buttonY, geoManager.buttonWidth, geoManager.buttonHeight, borderRadius, borderWidth, borderColor); DrawRoundedCorners(footer, left, buttonY, geoManager.buttonWidth, geoManager.buttonHeight, borderRadius, borderWidth, borderColor);
} }
} }
int textWidth = fontManager.FontButton->Width(text); int textWidth = fontManager.FontButton->Width(text);
int textHeight = fontManager.FontButton->Height(); int textHeight = fontManager.FontButton->Height();
footer->DrawText(cPoint(left + (geoManager.buttonWidth-textWidth)/2, buttonY + (geoManager.buttonHeight-textHeight)/2), text, theme.Color(clrFontButtons), colorTextBack, fontManager.FontButton); footer->DrawText(cPoint(left + (geoManager.buttonWidth-textWidth)/2, buttonY + (geoManager.buttonHeight-textHeight)/2), text, theme.Color(clrFontButtons), colorTextBack, fontManager.FontButton);
} }
void cFooter::ClearButton(int num) { void cFooter::ClearButton(int num) {
int left = num * geoManager.buttonWidth + (2 * num + 1) * geoManager.buttonBorder; int left = num * geoManager.buttonWidth + (2 * num + 1) * geoManager.buttonBorder;
footer->DrawRectangle(cRect(left, buttonY, geoManager.buttonWidth, geoManager.buttonHeight), clrTransparent); footer->DrawRectangle(cRect(left, buttonY, geoManager.buttonWidth, geoManager.buttonHeight), clrTransparent);
} }

View File

@ -30,4 +30,4 @@ public:
void LeaveDetailedViewMode(const cChannel *channel); void LeaveDetailedViewMode(const cChannel *channel);
}; };
#endif //__TVGUIDE_FOOTER_H #endif //__TVGUIDE_FOOTER_H

View File

@ -1,74 +1,76 @@
#include <vdr/osd.h> #include <vdr/osd.h>
#include "config.h" #include "config.h"
#include "geometrymanager.h" #include "geometrymanager.h"
cGeometryManager::cGeometryManager() { cGeometryManager::cGeometryManager() {
osdWidth = 0; osdWidth = 0;
osdHeight = 0; osdHeight = 0;
} }
cGeometryManager::~cGeometryManager() { cGeometryManager::~cGeometryManager() {
} }
bool cGeometryManager::SetGeometry(int osdWidth, int osdHeight, bool force) { bool cGeometryManager::SetGeometry(int osdWidth, int osdHeight, bool force) {
if (!force && (this->osdWidth == osdWidth) && (this->osdHeight == osdHeight)) { if (!force && (this->osdWidth == osdWidth) && (this->osdHeight == osdHeight)) {
esyslog("tvgudie: GeoManager SetGeometry nothing to change"); esyslog("tvgudie: GeoManager SetGeometry nothing to change");
return false; return false;
} }
this->osdWidth = osdWidth; this->osdWidth = osdWidth;
this->osdHeight = osdHeight; this->osdHeight = osdHeight;
esyslog("tvguide: Set OSD to %d x %d px", osdWidth, osdHeight); esyslog("tvguide: Set OSD to %d x %d px", osdWidth, osdHeight);
statusHeaderHeight = (tvguideConfig.displayStatusHeader)?(tvguideConfig.headerHeightPercent * osdHeight / 100):0; statusHeaderHeight = (config.displayStatusHeader) ? (config.headerHeightPercent * osdHeight / 100) : 0;
tvFrameWidth = statusHeaderHeight * 16 / 9; tvFrameWidth = statusHeaderHeight * 16 / 9;
headerContentWidth = (tvguideConfig.scaleVideo)?(osdWidth - tvFrameWidth):osdWidth; headerContentWidth = (config.scaleVideo) ? (osdWidth - tvFrameWidth):osdWidth;
channelGroupsWidth = (tvguideConfig.displayChannelGroups)?(tvguideConfig.channelGroupsPercent * osdWidth / 100):0; channelGroupsWidth = (config.displayChannelGroups) ? (config.channelGroupsPercent * osdWidth / 100) : 0;
channelGroupsHeight = (tvguideConfig.displayChannelGroups)?(tvguideConfig.channelGroupsPercent * osdHeight / 100):0; channelGroupsHeight = (config.displayChannelGroups) ? (config.channelGroupsPercent * osdHeight / 100) : 0;
channelHeaderWidth = tvguideConfig.channelHeaderWidthPercent * osdWidth / 100; channelHeaderWidth = config.channelHeaderWidthPercent * osdWidth / 100;
channelHeaderHeight = tvguideConfig.channelHeaderHeightPercent * osdHeight / 100; channelHeaderHeight = config.channelHeaderHeightPercent * osdHeight / 100;
timeLineWidth = tvguideConfig.timeLineWidthPercent * osdWidth / 100; timeLineWidth = config.timeLineWidthPercent * osdWidth / 100;
timeLineHeight = tvguideConfig.timeLineHeightPercent * osdHeight / 100; timeLineHeight = config.timeLineHeightPercent * osdHeight / 100;
clockWidth = tvFrameWidth / 3; footerHeight = config.footerHeightPercent * osdHeight / 100;
clockHeight = timeLineHeight; footerY = osdHeight - footerHeight;
footerHeight = tvguideConfig.footerHeightPercent * osdHeight / 100;
footerY = osdHeight - footerHeight; if (config.displayMode == eVertical) {
colWidth = (osdWidth - timeLineWidth) / config.channelCols;
if (tvguideConfig.displayMode == eVertical) { rowHeight = 0;
colWidth = (osdWidth - timeLineWidth) / tvguideConfig.channelCols; minutePixel = (double)(osdHeight - statusHeaderHeight - channelGroupsHeight - channelHeaderHeight - footerHeight) / (double)config.displayTime;
rowHeight = 0; channelLogoWidth = colWidth;
minutePixel = (osdHeight - statusHeaderHeight - channelGroupsHeight - channelHeaderHeight - footerHeight) / tvguideConfig.displayTime; channelLogoHeight = channelHeaderHeight;
channelLogoWidth = colWidth; logoWidth = channelLogoWidth / 2 - 15;
channelLogoHeight = channelHeaderHeight; logoHeight = logoWidth * config.logoHeightRatio / config.logoWidthRatio;
logoWidth = channelLogoWidth/2 - 15; timeLineGridWidth = timeLineWidth;
logoHeight = logoWidth * tvguideConfig.logoHeightRatio / tvguideConfig.logoWidthRatio; timeLineGridHeight = minutePixel * 30;
timeLineGridWidth = timeLineWidth; dateVieverWidth = timeLineWidth;
timeLineGridHeight = minutePixel*30; dateVieverHeight = (channelHeaderHeight + channelGroupsHeight) * 2 / 3;
dateVieverWidth = timeLineWidth; clockWidth = dateVieverWidth;
dateVieverHeight = channelHeaderHeight + channelGroupsHeight; clockHeight = (channelHeaderHeight + channelGroupsHeight) - dateVieverHeight;
} else if (tvguideConfig.displayMode == eHorizontal) { } else if (config.displayMode == eHorizontal) {
colWidth = 0; colWidth = 0;
rowHeight = (osdHeight - statusHeaderHeight - timeLineHeight - footerHeight) / tvguideConfig.channelRows; rowHeight = (osdHeight - statusHeaderHeight - timeLineHeight - footerHeight) / config.channelRows;
minutePixel = (osdWidth - channelHeaderWidth - channelGroupsWidth) / tvguideConfig.displayTime; minutePixel = (double)(osdWidth - channelHeaderWidth - channelGroupsWidth) / (double)config.displayHorizontalTime;
channelLogoWidth = channelHeaderWidth; channelLogoWidth = channelHeaderWidth;
channelLogoHeight = rowHeight; channelLogoHeight = rowHeight;
logoWidth = channelLogoHeight * tvguideConfig.logoWidthRatio / tvguideConfig.logoHeightRatio; logoWidth = channelLogoHeight * config.logoWidthRatio / config.logoHeightRatio;
logoHeight = channelLogoHeight; logoHeight = channelLogoHeight;
timeLineGridWidth = geoManager.minutePixel*30; timeLineGridWidth = geoManager.minutePixel * 30;
timeLineGridHeight = geoManager.timeLineHeight; timeLineGridHeight = geoManager.timeLineHeight;
dateVieverWidth = channelHeaderWidth + channelGroupsWidth; dateVieverWidth = (channelHeaderWidth + channelGroupsWidth) * 3 / 5;
dateVieverHeight = timeLineHeight; dateVieverHeight = timeLineHeight;
} clockWidth = (channelHeaderWidth + channelGroupsWidth) - dateVieverWidth;
buttonBorder = footerHeight / 6; clockHeight = timeLineHeight;
buttonWidth = osdWidth / 4 - 2 * buttonBorder; }
buttonHeight = footerHeight - 3 * buttonBorder; buttonBorder = footerHeight / 6;
buttonWidth = osdWidth / 4 - 2 * buttonBorder;
epgViewHeaderHeight = tvguideConfig.headerHeightPercent * osdHeight / 100; buttonHeight = footerHeight - 3 * buttonBorder;
borderRecMenus = 10; epgViewHeaderHeight = config.headerHeightPercent * osdHeight / 100;
channelJumpWidth = osdWidth * 30 / 100; borderRecMenus = 10;
channelJumpHeight = osdHeight * 20 / 100;
channelJumpWidth = osdWidth * 30 / 100;
return true; channelJumpHeight = osdHeight * 20 / 100;
}
return true;
}

View File

@ -1,54 +1,54 @@
#ifndef __TVGUIDE_GEOMETRYMANAGER_H #ifndef __TVGUIDE_GEOMETRYMANAGER_H
#define __TVGUIDE_GEOMETRYMANAGER_H #define __TVGUIDE_GEOMETRYMANAGER_H
class cGeometryManager { class cGeometryManager {
private: private:
public: public:
cGeometryManager(void); cGeometryManager(void);
~cGeometryManager(); ~cGeometryManager();
bool SetGeometry(int osdWidth, int osdHeight, bool force = false); bool SetGeometry(int osdWidth, int osdHeight, bool force = false);
//Common //Common
int osdWidth; int osdWidth;
int osdHeight; int osdHeight;
int statusHeaderHeight; int statusHeaderHeight;
int tvFrameWidth; int tvFrameWidth;
int headerContentWidth; int headerContentWidth;
//ChannelGroups //ChannelGroups
int channelGroupsWidth; int channelGroupsWidth;
int channelGroupsHeight; int channelGroupsHeight;
//ContentHeader //ContentHeader
int channelHeaderWidth; int channelHeaderWidth;
int channelHeaderHeight; int channelHeaderHeight;
int logoWidth; int logoWidth;
int logoHeight; int logoHeight;
//Content //Content
int colWidth; int colWidth;
int rowHeight; int rowHeight;
int minutePixel; double minutePixel;
int channelLogoWidth; int channelLogoWidth;
int channelLogoHeight; int channelLogoHeight;
//Timeline //Timeline
int timeLineWidth; int timeLineWidth;
int timeLineHeight; int timeLineHeight;
int timeLineGridWidth; int timeLineGridWidth;
int timeLineGridHeight; int timeLineGridHeight;
int dateVieverWidth; int dateVieverWidth;
int dateVieverHeight; int dateVieverHeight;
int clockWidth; int clockWidth;
int clockHeight; int clockHeight;
//Footer //Footer
int footerY; int footerY;
int footerHeight; int footerHeight;
int buttonWidth; int buttonWidth;
int buttonHeight; int buttonHeight;
int buttonBorder; int buttonBorder;
//Detailed EPG View //Detailed EPG View
int epgViewHeaderHeight; int epgViewHeaderHeight;
//Recording Menus //Recording Menus
int borderRecMenus; int borderRecMenus;
//Channel Jump //Channel Jump
int channelJumpWidth; int channelJumpWidth;
int channelJumpHeight; int channelJumpHeight;
}; };
#endif //__TVGUIDE_GEOMETRYMANAGER_H #endif //__TVGUIDE_GEOMETRYMANAGER_H

58
grid.h
View File

@ -1,58 +0,0 @@
#ifndef __TVGUIDE_GRID_H
#define __TVGUIDE_GRID_H
#include <vdr/tools.h>
#include "styledpixmap.h"
class cChannelColumn;
// --- cEpgGrid -------------------------------------------------------------
class cGrid : public cListObject, public cStyledPixmap {
protected:
cTextWrapper *text;
int viewportHeight;
int borderWidth;
void setBackground();
bool isColor1;
bool active;
bool dirty;
bool hasTimer;
bool hasSwitchTimer;
bool intersects(cGrid *neighbor);
virtual time_t Duration(void) {};
virtual void drawText(void) {};
bool dummy;
public:
cGrid(cChannelColumn *c);
virtual ~cGrid(void);
cChannelColumn *column;
virtual void SetViewportHeight() {};
virtual void PositionPixmap() {};
virtual void setText(void) {};
void Draw();
void SetDirty() {dirty = true;};
void SetActive() {dirty = true; active = true;};
void SetInActive() {dirty = true; active = false;};
void SetColor(bool color) {isColor1 = color;};
bool IsColor1() {return isColor1;};
bool isFirst(void);
virtual const cEvent *GetEvent() {};
bool Match(time_t t);
virtual time_t StartTime() {};
virtual time_t EndTime() {};
virtual void SetStartTime(time_t start) {};
virtual void SetEndTime(time_t end) {};
int calcOverlap(cGrid *neighbor);
virtual void SetTimer() {};
virtual void SetSwitchTimer() {};
virtual cString getText(void) { return cString("");};
virtual cString getTimeString(void) { return cString("");};
bool Active(void) { return active; };
bool HasTimer() {return hasTimer;};
bool HasSwitchTimer() {return hasSwitchTimer;};
bool isDummy() { return dummy; };
virtual void debug() {};
};
#endif //__TVGUIDE_GRID_H

View File

@ -1,82 +1,82 @@
#include "channelcolumn.h" #include "channelepg.h"
#include "grid.h" #include "gridelement.h"
cGrid::cGrid(cChannelColumn *c) { cGridElement::cGridElement(cChannelEpg *c) {
this->column = c; this->column = c;
text = new cTextWrapper(); text = new cTextWrapper();
dirty = true; dirty = true;
active = false; active = false;
viewportHeight = 0; viewportHeight = 0;
borderWidth = 10; borderWidth = 10;
} }
cGrid::~cGrid(void) { cGridElement::~cGridElement(void) {
delete text; delete text;
} }
void cGrid::setBackground() { void cGridElement::setBackground() {
if (active) { if (active) {
color = theme.Color(clrHighlight); color = theme.Color(clrHighlight);
colorBlending = theme.Color(clrHighlightBlending); colorBlending = theme.Color(clrHighlightBlending);
} else { } else {
if (isColor1) { if (isColor1) {
color = theme.Color(clrGrid1); color = theme.Color(clrGrid1);
colorBlending = theme.Color(clrGrid1Blending); colorBlending = theme.Color(clrGrid1Blending);
} else { } else {
color = theme.Color(clrGrid2); color = theme.Color(clrGrid2);
colorBlending = theme.Color(clrGrid2Blending); colorBlending = theme.Color(clrGrid2Blending);
} }
} }
} }
void cGrid::Draw() { void cGridElement::Draw() {
if (!pixmap) { if (!pixmap) {
return; return;
} }
if (dirty) { if (dirty) {
if (tvguideConfig.style == eStyleGraphical) { if (config.style == eStyleGraphical) {
drawBackgroundGraphical(bgGrid, active); drawBackgroundGraphical(bgGrid, active);
drawText(); drawText();
} else { } else {
setBackground(); setBackground();
drawBackground(); drawBackground();
drawText(); drawText();
drawBorder(); drawBorder();
} }
pixmap->SetLayer(1); pixmap->SetLayer(1);
dirty = false; dirty = false;
} }
} }
bool cGrid::isFirst(void) { bool cGridElement::isFirst(void) {
if (column->isFirst(this)) if (column->isFirst(this))
return true; return true;
return false; return false;
} }
bool cGrid::Match(time_t t) { bool cGridElement::Match(time_t t) {
if ((StartTime() < t) && (EndTime() > t)) if ((StartTime() < t) && (EndTime() > t))
return true; return true;
else else
return false; return false;
} }
int cGrid::calcOverlap(cGrid *neighbor) { int cGridElement::calcOverlap(cGridElement *neighbor) {
int overlap = 0; int overlap = 0;
if (intersects(neighbor)) { if (intersects(neighbor)) {
if ((StartTime() <= neighbor->StartTime()) && (EndTime() <= neighbor->EndTime())) { if ((StartTime() <= neighbor->StartTime()) && (EndTime() <= neighbor->EndTime())) {
overlap = EndTime() - neighbor->StartTime(); overlap = EndTime() - neighbor->StartTime();
} else if ((StartTime() >= neighbor->StartTime()) && (EndTime() >= neighbor->EndTime())) { } else if ((StartTime() >= neighbor->StartTime()) && (EndTime() >= neighbor->EndTime())) {
overlap = neighbor->EndTime() - StartTime(); overlap = neighbor->EndTime() - StartTime();
} else if ((StartTime() >= neighbor->StartTime()) && (EndTime() <= neighbor->EndTime())) { } else if ((StartTime() >= neighbor->StartTime()) && (EndTime() <= neighbor->EndTime())) {
overlap = Duration(); overlap = Duration();
} else if ((StartTime() <= neighbor->StartTime()) && (EndTime() >= neighbor->EndTime())) { } else if ((StartTime() <= neighbor->StartTime()) && (EndTime() >= neighbor->EndTime())) {
overlap = neighbor->EndTime() - neighbor->StartTime(); overlap = neighbor->EndTime() - neighbor->StartTime();
} }
} }
return overlap; return overlap;
} }
bool cGrid::intersects(cGrid *neighbor) { bool cGridElement::intersects(cGridElement *neighbor) {
return ! ( (neighbor->EndTime() <= StartTime()) || (neighbor->StartTime() >= EndTime()) ); return ! ( (neighbor->EndTime() <= StartTime()) || (neighbor->StartTime() >= EndTime()) );
} }

58
gridelement.h Normal file
View File

@ -0,0 +1,58 @@
#ifndef __TVGUIDE_GRID_H
#define __TVGUIDE_GRID_H
#include <vdr/tools.h>
#include "styledpixmap.h"
class cChannelEpg;
// --- cEpgGrid -------------------------------------------------------------
class cGridElement : public cListObject, public cStyledPixmap {
protected:
cTextWrapper *text;
int viewportHeight;
int borderWidth;
void setBackground();
bool isColor1;
bool active;
bool dirty;
bool hasTimer;
bool hasSwitchTimer;
bool intersects(cGridElement *neighbor);
virtual time_t Duration(void) { return 0; };
virtual void drawText(void) {};
bool dummy;
public:
cGridElement(cChannelEpg *c);
virtual ~cGridElement(void);
cChannelEpg *column;
virtual void SetViewportHeight(void) {};
virtual void PositionPixmap(void) {};
virtual void setText(void) {};
void Draw(void);
void SetDirty(void) {dirty = true;};
void SetActive(void) {dirty = true; active = true;};
void SetInActive(void) {dirty = true; active = false;};
void SetColor(bool color) {isColor1 = color;};
bool IsColor1(void) {return isColor1;};
bool isFirst(void);
virtual const cEvent *GetEvent(void) { return NULL; };
bool Match(time_t t);
virtual time_t StartTime(void) { return 0; };
virtual time_t EndTime(void) { return 0; };
virtual void SetStartTime(time_t start) {};
virtual void SetEndTime(time_t end) {};
int calcOverlap(cGridElement *neighbor);
virtual void SetTimer(void) {};
virtual void SetSwitchTimer(void) {};
virtual cString getText(void) { return cString("");};
virtual cString getTimeString(void) { return cString("");};
bool Active(void) { return active; };
bool HasTimer(void) {return hasTimer;};
bool HasSwitchTimer(void) {return hasSwitchTimer;};
bool IsDummy(void) { return dummy; };
virtual void debug() {};
};
#endif //__TVGUIDE_GRID_H

View File

@ -1,128 +1,136 @@
#include "imageloader.h" #include "imageloader.h"
#include "tools.h" #include "tools.h"
#include "headergrid.h" #include "headergrid.h"
cHeaderGrid::cHeaderGrid(void) : cGrid(NULL) { cHeaderGrid::cHeaderGrid(void) : cGridElement(NULL) {
pixmap = NULL; pixmap = NULL;
pixmapLogo = NULL; pixmapLogo = NULL;
} }
cHeaderGrid::~cHeaderGrid(void) { cHeaderGrid::~cHeaderGrid(void) {
osdManager.releasePixmap(pixmapLogo); osdManager.DestroyPixmap(pixmapLogo);
} }
void cHeaderGrid::createBackground(int num) { void cHeaderGrid::createBackground(int num) {
color = theme.Color(clrHeader); color = theme.Color(clrHeader);
colorBlending = theme.Color(clrHeaderBlending); colorBlending = theme.Color(clrHeaderBlending);
int x, y; int x, y;
if (tvguideConfig.displayMode == eVertical) { if (config.displayMode == eVertical) {
x = geoManager.timeLineWidth + num*geoManager.colWidth; x = geoManager.timeLineWidth + num*geoManager.colWidth;
y = geoManager.statusHeaderHeight + geoManager.channelGroupsHeight; y = geoManager.statusHeaderHeight + geoManager.channelGroupsHeight;
} else if (tvguideConfig.displayMode == eHorizontal) { } else if (config.displayMode == eHorizontal) {
x = geoManager.channelGroupsWidth; x = geoManager.channelGroupsWidth;
y = geoManager.statusHeaderHeight + geoManager.timeLineHeight + num*geoManager.rowHeight; y = geoManager.statusHeaderHeight + geoManager.timeLineHeight + num*geoManager.rowHeight;
} }
pixmap = osdManager.requestPixmap(1, cRect(x, y, geoManager.channelLogoWidth, geoManager.channelLogoHeight)); pixmap = osdManager.CreatePixmap(1, cRect(x, y, geoManager.channelLogoWidth, geoManager.channelLogoHeight));
pixmapLogo = osdManager.requestPixmap(2, cRect(x, y, geoManager.channelLogoWidth, geoManager.channelLogoHeight)); pixmapLogo = osdManager.CreatePixmap(2, cRect(x, y, geoManager.channelLogoWidth, geoManager.channelLogoHeight));
if ((!pixmap) || (!pixmapLogo)){ if ((!pixmap) || (!pixmapLogo)){
return; return;
} }
pixmapLogo->Fill(clrTransparent); pixmapLogo->Fill(clrTransparent);
if (tvguideConfig.style == eStyleGraphical) { if (config.style == eStyleGraphical) {
drawBackgroundGraphical(bgChannelHeader); drawBackgroundGraphical(bgChannelHeader);
} else { } else {
drawBackground(); drawBackground();
drawBorder(); drawBorder();
} }
} }
void cHeaderGrid::drawChannel(const cChannel *channel) { void cHeaderGrid::drawChannel(const cChannel *channel) {
if (tvguideConfig.displayMode == eVertical) { if (config.displayMode == eVertical) {
drawChannelVertical(channel); drawChannelVertical(channel);
} else if (tvguideConfig.displayMode == eHorizontal) { } else if (config.displayMode == eHorizontal) {
drawChannelHorizontal(channel); drawChannelHorizontal(channel);
} }
} }
void cHeaderGrid::drawChannelHorizontal(const cChannel *channel) { // Draw Channel horizontal view
int logoWidth = geoManager.logoWidth;
int logoX = tvguideConfig.displayChannelName?2:(Width()-logoWidth)/2; void cHeaderGrid::drawChannelHorizontal(const cChannel *channel) {
int textX = 5; int logoWidth = geoManager.logoWidth;
int textY = (Height() - fontManager.FontChannelHeaderHorizontal->Height())/2; int logoX = config.displayChannelName ? 5 : (Width() - logoWidth) / 2;
bool logoFound = false; int textX = 5;
if (!tvguideConfig.hideChannelLogos) { int textY = (Height() - fontManager.FontChannelHeaderHorizontal->Height()) / 2;
cImage *logo = imgCache.GetLogo(channel); bool logoFound = false;
if (logo) { if (!config.hideChannelLogos) {
pixmapLogo->DrawImage(cPoint(logoX, 0), *logo); cImage *logo = imgCache.GetLogo(channel);
logoFound = true; if (logo) {
} const int logoheight = logo->Height();
} const int logowidth = logo->Width();
bool drawText = false; pixmapLogo->DrawImage(cPoint(logoX + ((logoWidth - logowidth) / 2), (Height() - logoheight) / 2), *logo);
int textWidthMax = Width() - 10; logoFound = true;
if (!logoFound) { }
drawText = true; }
} else if (tvguideConfig.displayChannelName) { bool drawText = false;
drawText = true; int textWidthMax = Width() - 10;
textX += logoWidth; if (!logoFound) {
textWidthMax -= logoWidth; drawText = true;
} }
if (drawText) { if (config.displayChannelName) {
tColor colorTextBack = (tvguideConfig.style == eStyleFlat)?color:clrTransparent; drawText = true;
cString strChannel = cString::sprintf("%d %s", channel->Number(), channel->Name()); textX += logoWidth + 5;
strChannel = CutText(*strChannel, textWidthMax, fontManager.FontChannelHeaderHorizontal).c_str(); textWidthMax -= textX;
pixmap->DrawText(cPoint(textX, textY), *strChannel, theme.Color(clrFontHeader), colorTextBack, fontManager.FontChannelHeaderHorizontal); }
} if (drawText) {
} tColor colorTextBack = (config.style == eStyleFlat)?color:clrTransparent;
cString strChannel = cString::sprintf("%d %s", channel->Number(), channel->Name());
void cHeaderGrid::drawChannelVertical(const cChannel *channel) { strChannel = CutText(*strChannel, textWidthMax, fontManager.FontChannelHeaderHorizontal).c_str();
int logoWidth = geoManager.logoWidth; pixmap->DrawText(cPoint(textX, textY), *strChannel, theme.Color(clrFontHeader), colorTextBack, fontManager.FontChannelHeaderHorizontal);
int logoHeight = geoManager.logoHeight; }
cTextWrapper tw; }
cString headerText = cString::sprintf("%d - %s", channel->Number(), channel->Name());
tw.Set(*headerText, fontManager.FontChannelHeader, geoManager.colWidth - 8); // Draw Channel vertical view
int lines = tw.Lines();
int lineHeight = fontManager.FontChannelHeader->Height(); void cHeaderGrid::drawChannelVertical(const cChannel *channel) {
int yStart = (geoManager.channelHeaderHeight - lines*lineHeight)/2 + 8; int logoHeight = geoManager.logoHeight;
bool logoFound = false; cTextWrapper tw;
if (!tvguideConfig.hideChannelLogos) { cString headerText = cString::sprintf("%d - %s", channel->Number(), channel->Name());
cImage *logo = imgCache.GetLogo(channel); tw.Set(*headerText, fontManager.FontChannelHeader, geoManager.colWidth - 8);
if (logo) { int lines = tw.Lines();
pixmapLogo->DrawImage(cPoint((Width() - logoWidth)/2, 4), *logo); int lineHeight = fontManager.FontChannelHeader->Height();
logoFound = true; int yStart = (geoManager.channelHeaderHeight - lines * lineHeight) / 2 + 8;
} bool logoFound = false;
} if (!config.hideChannelLogos) {
bool drawText = false; cImage *logo = imgCache.GetLogo(channel);
if (!logoFound) { if (logo) {
drawText = true; const int logoheight = logo->Height();
} else if (tvguideConfig.displayChannelName) { const int logowidth = logo->Width();
drawText = true; pixmapLogo->DrawImage(cPoint((Width() - logowidth) / 2, (logoHeight - logoheight) / 2), *logo);
yStart = logoHeight; logoFound = true;
} }
if (!drawText) }
return; bool drawText = false;
tColor colorTextBack = (tvguideConfig.style == eStyleFlat)?color:clrTransparent; if (!logoFound) {
for (int i=0; i<lines; i++) { drawText = true;
int textWidth = fontManager.FontChannelHeader->Width(tw.GetLine(i)); } else if (config.displayChannelName) {
int xText = (geoManager.colWidth - textWidth) / 2; drawText = true;
if (xText < 0) yStart = logoHeight;
xText = 0; }
pixmap->DrawText(cPoint(xText, yStart + i*lineHeight), tw.GetLine(i), theme.Color(clrFontHeader), colorTextBack, fontManager.FontChannelHeader); if (!drawText)
} return;
} tColor colorTextBack = (config.style == eStyleFlat)?color:clrTransparent;
for (int i = 0; i < lines; i++) {
void cHeaderGrid::setPosition(int num) { int textWidth = fontManager.FontChannelHeader->Width(tw.GetLine(i));
int x, y, width, height; int xText = (geoManager.colWidth - textWidth) / 2;
if (tvguideConfig.displayMode == eVertical) { if (xText < 0)
x = geoManager.timeLineWidth + num*geoManager.colWidth; xText = 0;
y = geoManager.statusHeaderHeight + geoManager.channelGroupsHeight; pixmap->DrawText(cPoint(xText, yStart + i * lineHeight), tw.GetLine(i), theme.Color(clrFontHeader), colorTextBack, fontManager.FontChannelHeader);
width = geoManager.colWidth; }
height = geoManager.channelHeaderHeight; }
} else if (tvguideConfig.displayMode == eHorizontal) {
x = geoManager.channelGroupsWidth; void cHeaderGrid::setPosition(int num) {
y = geoManager.statusHeaderHeight + geoManager.timeLineHeight + num*geoManager.rowHeight; int x, y, width, height;
width = geoManager.channelHeaderWidth; if (config.displayMode == eVertical) {
height = geoManager.rowHeight; x = geoManager.timeLineWidth + num*geoManager.colWidth;
} y = geoManager.statusHeaderHeight + geoManager.channelGroupsHeight;
pixmap->SetViewPort(cRect(x, y, width, height)); width = geoManager.colWidth;
pixmapLogo->SetViewPort(cRect(x, y, width, height)); height = geoManager.channelHeaderHeight;
} } else if (config.displayMode == eHorizontal) {
x = geoManager.channelGroupsWidth;
y = geoManager.statusHeaderHeight + geoManager.timeLineHeight + num*geoManager.rowHeight;
width = geoManager.channelHeaderWidth;
height = geoManager.rowHeight;
}
pixmap->SetViewPort(cRect(x, y, width, height));
pixmapLogo->SetViewPort(cRect(x, y, width, height));
}

View File

@ -1,21 +1,21 @@
#ifndef __TVGUIDE_HEADERGRID_H #ifndef __TVGUIDE_HEADERGRID_H
#define __TVGUIDE_HEADERGRID_H #define __TVGUIDE_HEADERGRID_H
#include "grid.h" #include "gridelement.h"
// --- cHeaderGrid ------------------------------------------------------------- // --- cHeaderGrid -------------------------------------------------------------
class cHeaderGrid : public cGrid { class cHeaderGrid : public cGridElement {
private: private:
cPixmap *pixmapLogo; cPixmap *pixmapLogo;
void drawChannelHorizontal(const cChannel *channel); void drawChannelHorizontal(const cChannel *channel);
void drawChannelVertical(const cChannel *channel); void drawChannelVertical(const cChannel *channel);
public: public:
cHeaderGrid(void); cHeaderGrid(void);
virtual ~cHeaderGrid(void); virtual ~cHeaderGrid(void);
void createBackground(int num); void createBackground(int num);
void drawChannel(const cChannel *channel); void drawChannel(const cChannel *channel);
void setPosition(int num); void setPosition(int num);
}; };
#endif //__TVGUIDE_HEADERGRID_H #endif //__TVGUIDE_HEADERGRID_H

File diff suppressed because it is too large Load Diff

View File

@ -1,92 +1,92 @@
#ifndef __TVGUIDE_IMAGECACHE_H #ifndef __TVGUIDE_IMAGECACHE_H
#define __TVGUIDE_IMAGECACHE_H #define __TVGUIDE_IMAGECACHE_H
#define X_DISPLAY_MISSING #define X_DISPLAY_MISSING
#include <map> #include <map>
#include <vector> #include <vector>
#include "imagemagickwrapper.h" #include "imagemagickwrapper.h"
enum eCacheType { enum eCacheType {
ctOsdElement = 0, ctOsdElement = 0,
ctGrid, ctGrid,
ctLogo, ctLogo,
ctChannelGroup, ctChannelGroup,
ctIcon, ctIcon,
}; };
enum eOsdElementType { enum eOsdElementType {
oeNone = -1, oeNone = -1,
oeStatusHeaderContentFull, oeStatusHeaderContentFull,
oeStatusHeaderContentWindowed, oeStatusHeaderContentWindowed,
oeStatusHeaderTVFrame, oeStatusHeaderTVFrame,
oeButtonRed, oeButtonRed,
oeButtonGreen, oeButtonGreen,
oeButtonYellow, oeButtonYellow,
oeButtonBlue, oeButtonBlue,
oeLogoBack, oeLogoBack,
oeTimeline1, oeTimeline1,
oeTimeline2, oeTimeline2,
oeDateViewer, oeDateViewer,
oeClock, oeClock,
oeChannelJump, oeChannelJump,
}; };
class cImageCache : public cImageMagickWrapper { class cImageCache : public cImageMagickWrapper {
public: public:
cImageCache(); cImageCache();
~cImageCache(); ~cImageCache();
void CreateCache(void); void CreateCache(void);
cImage *GetOsdElement(eOsdElementType type); cImage *GetOsdElement(eOsdElementType type);
cImage *GetGrid(int width, int height, bool active); cImage *GetGrid(int width, int height, bool active);
cImage *GetChannelGroup(int width, int height); cImage *GetChannelGroup(int width, int height);
cImage *GetLogo(const cChannel *channel); cImage *GetLogo(const cChannel *channel);
cImage *GetIcon(std::string name, int width, int height); cImage *GetIcon(std::string name, int width, int height);
std::string GetCacheSize(eCacheType type); std::string GetCacheSize(eCacheType type);
void Clear(void); void Clear(void);
private: private:
cImage *tempStaticLogo; cImage *tempStaticLogo;
Image bufferGrid; Image bufferGrid;
Image bufferGridActive; Image bufferGridActive;
bool gridsAvailable; bool gridsAvailable;
int cornerWidth; int cornerWidth;
int cornerHeight; int cornerHeight;
cImage *imgLeft; cImage *imgLeft;
cImage *imgLeftActive; cImage *imgLeftActive;
cImage *imgRight; cImage *imgRight;
cImage *imgRightActive; cImage *imgRightActive;
cImage *imgHead; cImage *imgHead;
cImage *imgHeadActive; cImage *imgHeadActive;
cImage *imgBottom; cImage *imgBottom;
cImage *imgBottomActive; cImage *imgBottomActive;
cImage *imgChannelgroupHead; cImage *imgChannelgroupHead;
cImage *imgChannelgroupBottom; cImage *imgChannelgroupBottom;
cImage *groupsHead; cImage *groupsHead;
cImage *groupsBottom; cImage *groupsBottom;
cImage *groupsLeft; cImage *groupsLeft;
cImage *groupsRight; cImage *groupsRight;
std::map<eOsdElementType, cImage*> osdElementCache; std::map<eOsdElementType, cImage*> osdElementCache;
std::map<std::string, cImage*> gridCache; std::map<std::string, cImage*> gridCache;
std::map<std::string, cImage*> groupsCache; std::map<std::string, cImage*> groupsCache;
std::map<std::string, cImage*> logoCache; std::map<std::string, cImage*> logoCache;
std::map<std::string, cImage*> iconCache; std::map<std::string, cImage*> iconCache;
void CreateOsdIconCache(void); void CreateOsdIconCache(void);
void PrepareGridIconCache(void); void PrepareGridIconCache(void);
void CreateGridIconCache(void); void CreateGridIconCache(void);
void CreateChannelGroupCache(void); void CreateChannelGroupCache(void);
void CreateLogoCache(void); void CreateLogoCache(void);
bool LoadIcon(std::string name); bool LoadIcon(std::string name);
void InsertIntoOsdElementCache(eOsdElementType type, int width=0, int height=0); void InsertIntoOsdElementCache(eOsdElementType type, int width=0, int height=0);
void InsertIntoGridCache(std::string name, int width, int height, bool active); void InsertIntoGridCache(std::string name, int width, int height, bool active);
cImage *CreateGrid(int width, int height, bool active); cImage *CreateGrid(int width, int height, bool active);
void AddCornersHorizontal(cImage *img, bool active); void AddCornersHorizontal(cImage *img, bool active);
void AddCornersVertical(cImage *img, bool active); void AddCornersVertical(cImage *img, bool active);
void InsertIntoGroupsCacheHorizontal(int size); void InsertIntoGroupsCacheHorizontal(int size);
void InsertIntoGroupsCacheVertical(int size); void InsertIntoGroupsCacheVertical(int size);
void AddCornersGroupHorizontal(cImage *img); void AddCornersGroupHorizontal(cImage *img);
void AddCornersGroupVertical(cImage *img); void AddCornersGroupVertical(cImage *img);
bool LoadLogo(const cChannel *channel); bool LoadLogo(const cChannel *channel);
void InsertIntoLogoCache(std::string channelID); void InsertIntoLogoCache(std::string channelID);
}; };
#endif //__TVGUIDE_IMAGECACHE_H #endif //__TVGUIDE_IMAGECACHE_H

View File

@ -11,7 +11,6 @@
using namespace Magick; using namespace Magick;
cImageLoader::cImageLoader() { cImageLoader::cImageLoader() {
InitializeMagick(NULL);
} }
cImageLoader::~cImageLoader() { cImageLoader::~cImageLoader() {
@ -23,22 +22,22 @@ bool cImageLoader::LoadLogo(const cChannel *channel, int width, int height) {
std::string channelID = StrToLowerCase(*(channel->GetChannelID().ToString())); std::string channelID = StrToLowerCase(*(channel->GetChannelID().ToString()));
std::string logoLower = StrToLowerCase(channel->Name()); std::string logoLower = StrToLowerCase(channel->Name());
cString extension; cString extension;
if (tvguideConfig.logoExtension == 0) { if (config.logoExtension == 0) {
extension = "png"; extension = "png";
} else if (tvguideConfig.logoExtension == 1) { } else if (config.logoExtension == 1) {
extension = "jpg"; extension = "jpg";
} }
bool success = false; bool success = false;
if (tvguideConfig.logoPathSet) { if (config.logoPathSet) {
success = LoadImage(channelID.c_str(), *tvguideConfig.logoPath, *extension); success = LoadImage(channelID.c_str(), *config.logoPath, *extension);
if (!success) { if (!success) {
success = LoadImage(logoLower.c_str(), *tvguideConfig.logoPath, *extension); success = LoadImage(logoLower.c_str(), *config.logoPath, *extension);
} }
} }
if (!success) if (!success)
success = LoadImage(channelID.c_str(), *tvguideConfig.logoPathDefault, *extension); success = LoadImage(channelID.c_str(), *config.logoPathDefault, *extension);
if (!success) if (!success)
success = LoadImage(logoLower.c_str(), *tvguideConfig.logoPathDefault, *extension); success = LoadImage(logoLower.c_str(), *config.logoPathDefault, *extension);
if (success) if (success)
buffer.sample(Geometry(width, height)); buffer.sample(Geometry(width, height));
return success; return success;
@ -48,9 +47,9 @@ bool cImageLoader::LoadEPGImage(int eventID, int width, int height) {
if ((width == 0)||(height==0)) if ((width == 0)||(height==0))
return false; return false;
bool success = false; bool success = false;
success = LoadImage(*cString::sprintf("%d", eventID), *tvguideConfig.epgImagePath, "jpg"); success = LoadImage(*cString::sprintf("%d", eventID), *config.epgImagePath, "jpg");
if (!success) if (!success)
success = LoadImage(*cString::sprintf("%d_0", eventID), *tvguideConfig.epgImagePath, "jpg"); success = LoadImage(*cString::sprintf("%d_0", eventID), *config.epgImagePath, "jpg");
if (!success) if (!success)
return false; return false;
buffer.sample( Geometry(width, height)); buffer.sample( Geometry(width, height));
@ -58,12 +57,12 @@ bool cImageLoader::LoadEPGImage(int eventID, int width, int height) {
} }
bool cImageLoader::LoadAdditionalEPGImage(cString name) { bool cImageLoader::LoadAdditionalEPGImage(cString name) {
int width = tvguideConfig.epgImageWidthLarge; int width = config.epgImageWidthLarge;
int height = tvguideConfig.epgImageHeightLarge; int height = config.epgImageHeightLarge;
if ((width == 0)||(height==0)) if ((width == 0)||(height==0))
return false; return false;
bool success = false; bool success = false;
success = LoadImage(*name, *tvguideConfig.epgImagePath, "jpg"); success = LoadImage(*name, *config.epgImagePath, "jpg");
if (!success) if (!success)
return false; return false;
if (height != 0 || width != 0) { if (height != 0 || width != 0) {
@ -84,19 +83,19 @@ bool cImageLoader::LoadIcon(const char *cIcon, int size) {
if (size==0) if (size==0)
return false; return false;
bool success = false; bool success = false;
if (tvguideConfig.iconsPathSet) { if (config.iconsPathSet) {
cString iconPathTheme = cString::sprintf("%s%s/recmenuicons/", *tvguideConfig.iconPath, *tvguideConfig.themeName); cString iconPathTheme = cString::sprintf("%s%s/recmenuicons/", *config.iconPath, *config.themeName);
success = LoadImage(cIcon, *iconPathTheme, "png"); success = LoadImage(cIcon, *iconPathTheme, "png");
if (!success) { if (!success) {
cString iconPath = cString::sprintf("%srecmenuicons/", *tvguideConfig.iconPath); cString iconPath = cString::sprintf("%srecmenuicons/", *config.iconPath);
success = LoadImage(cIcon, *iconPath, "png"); success = LoadImage(cIcon, *iconPath, "png");
} }
} }
if (!success) { if (!success) {
cString iconPathTheme = cString::sprintf("%s%s/recmenuicons/", *tvguideConfig.iconPathDefault, *tvguideConfig.themeName); cString iconPathTheme = cString::sprintf("%s%s/recmenuicons/", *config.iconPathDefault, *config.themeName);
success = LoadImage(cIcon, *iconPathTheme, "png"); success = LoadImage(cIcon, *iconPathTheme, "png");
if (!success) { if (!success) {
cString iconPath = cString::sprintf("%srecmenuicons/", *tvguideConfig.iconPathDefault); cString iconPath = cString::sprintf("%srecmenuicons/", *config.iconPathDefault);
success = LoadImage(cIcon, *iconPath, "png"); success = LoadImage(cIcon, *iconPath, "png");
} }
} }
@ -110,20 +109,20 @@ bool cImageLoader::LoadOsdElement(cString name, int width, int height) {
if ((width == 0)||(height==0)) if ((width == 0)||(height==0))
return false; return false;
bool success = false; bool success = false;
if (tvguideConfig.iconsPathSet) { if (config.iconsPathSet) {
cString path = cString::sprintf("%s%s%s", *tvguideConfig.iconPath, *tvguideConfig.themeName, "/osdElements/"); cString path = cString::sprintf("%s%s%s", *config.iconPath, *config.themeName, "/osdElements/");
success = LoadImage(*name, *path, "png"); success = LoadImage(*name, *path, "png");
if (!success) { if (!success) {
path = cString::sprintf("%s%s", *tvguideConfig.iconPath, "/osdElements/"); path = cString::sprintf("%s%s", *config.iconPath, "/osdElements/");
success = LoadImage(*name, *path, "png"); success = LoadImage(*name, *path, "png");
} }
} }
if (!success) { if (!success) {
cString path = cString::sprintf("%s%s%s", *tvguideConfig.iconPathDefault, *tvguideConfig.themeName, "/osdElements/"); cString path = cString::sprintf("%s%s%s", *config.iconPathDefault, *config.themeName, "/osdElements/");
success = LoadImage(*name, *path, "png"); success = LoadImage(*name, *path, "png");
} }
if (!success) { if (!success) {
cString path = cString::sprintf("%s%s", *tvguideConfig.iconPathDefault, "/osdElements/"); cString path = cString::sprintf("%s%s", *config.iconPathDefault, "/osdElements/");
success = LoadImage(*name, *path, "png"); success = LoadImage(*name, *path, "png");
} }
if (!success) if (!success)
@ -173,7 +172,7 @@ void cImageLoader::CreateGradient(tColor back, tColor blend, int width, int heig
for (int x = 0; x < width; x++) { for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) { for (int y = 0; y < height; y++) {
PixelPacket *pixel = pixels + y * width + x; PixelPacket *pixel = pixels + y * width + x;
int opacity = (maxw / width * x + maxh - maxh / height * y) / 2; unsigned int opacity = (maxw / width * x + maxh - maxh / height * y) / 2;
pixel->opacity = (opacity <= MaxRGB) ? opacity : MaxRGB; pixel->opacity = (opacity <= MaxRGB) ? opacity : MaxRGB;
} }
} }
@ -183,4 +182,4 @@ void cImageLoader::CreateGradient(tColor back, tColor blend, int width, int heig
imgback.composite(imgblend, 0, 0, OverCompositeOp); imgback.composite(imgblend, 0, 0, OverCompositeOp);
buffer = imgback; buffer = imgback;
} }

View File

@ -5,7 +5,6 @@
#include "imagescaler.h" #include "imagescaler.h"
cImageMagickWrapper::cImageMagickWrapper() { cImageMagickWrapper::cImageMagickWrapper() {
InitializeMagick(NULL);
} }
cImageMagickWrapper::~cImageMagickWrapper() { cImageMagickWrapper::~cImageMagickWrapper() {
@ -77,21 +76,21 @@ bool cImageMagickWrapper::LoadImage(std::string FileName, std::string Path, std:
std::stringstream sstrImgFile; std::stringstream sstrImgFile;
sstrImgFile << Path << FileName << "." << Extension; sstrImgFile << Path << FileName << "." << Extension;
std::string imgFile = sstrImgFile.str(); std::string imgFile = sstrImgFile.str();
if (tvguideConfig.debugImageLoading) if (config.debugImageLoading)
esyslog("tvguide: trying to load: %s", imgFile.c_str()); esyslog("tvguide: trying to load: %s", imgFile.c_str());
buffer.read(imgFile.c_str()); buffer.read(imgFile.c_str());
if (tvguideConfig.debugImageLoading) if (config.debugImageLoading)
esyslog("tvguide: %s sucessfully loaded", imgFile.c_str()); esyslog("tvguide: %s sucessfully loaded", imgFile.c_str());
} catch( Magick::Warning &warning ) { } catch( Magick::Warning &warning ) {
if (tvguideConfig.debugImageLoading) if (config.debugImageLoading)
esyslog("tvguide: Magick Warning: %s", warning.what()); esyslog("tvguide: Magick Warning: %s", warning.what());
return true; return true;
} catch( Magick::Error &error ) { } catch( Magick::Error &error ) {
if (tvguideConfig.debugImageLoading) if (config.debugImageLoading)
esyslog("tvguide: Magick Error: %s", error.what()); esyslog("tvguide: Magick Error: %s", error.what());
return false; return false;
} catch(...) { } catch(...) {
if (tvguideConfig.debugImageLoading) if (config.debugImageLoading)
esyslog("tvguide: an unknown Magick error occured during image loading"); esyslog("tvguide: an unknown Magick error occured during image loading");
return false; return false;
} }
@ -102,21 +101,21 @@ bool cImageMagickWrapper::LoadImage(const char *fullpath) {
if ((fullpath == NULL) || (strlen(fullpath) < 5)) if ((fullpath == NULL) || (strlen(fullpath) < 5))
return false; return false;
try { try {
if (tvguideConfig.debugImageLoading) if (config.debugImageLoading)
esyslog("tvguide: trying to load: %s", fullpath); esyslog("tvguide: trying to load: %s", fullpath);
buffer.read(fullpath); buffer.read(fullpath);
if (tvguideConfig.debugImageLoading) if (config.debugImageLoading)
esyslog("tvguide: %s sucessfully loaded", fullpath); esyslog("tvguide: %s sucessfully loaded", fullpath);
} catch( Magick::Warning &warning ) { } catch( Magick::Warning &warning ) {
if (tvguideConfig.debugImageLoading) if (config.debugImageLoading)
esyslog("tvguide: Magick Warning: %s", warning.what()); esyslog("tvguide: Magick Warning: %s", warning.what());
return true; return true;
} catch( Magick::Error &error ) { } catch( Magick::Error &error ) {
if (tvguideConfig.debugImageLoading) if (config.debugImageLoading)
esyslog("tvguide: Magick Error: %s", error.what()); esyslog("tvguide: Magick Error: %s", error.what());
return false; return false;
} catch(...) { } catch(...) {
if (tvguideConfig.debugImageLoading) if (config.debugImageLoading)
esyslog("tvguide: an unknown Magick error occured during image loading"); esyslog("tvguide: an unknown Magick error occured during image loading");
return false; return false;
} }
@ -145,7 +144,7 @@ void cImageMagickWrapper::CreateGradient(tColor back, tColor blend, int width, i
for (int x = 0; x < width; x++) { for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) { for (int y = 0; y < height; y++) {
PixelPacket *pixel = pixels + y * width + x; PixelPacket *pixel = pixels + y * width + x;
int opacity = (maxw / width * x + maxh - maxh / height * y) / 2; unsigned int opacity = (maxw / width * x + maxh - maxh / height * y) / 2;
pixel->opacity = (opacity <= MaxRGB) ? opacity : MaxRGB; pixel->opacity = (opacity <= MaxRGB) ? opacity : MaxRGB;
} }
} }
@ -159,4 +158,4 @@ void cImageMagickWrapper::CreateGradient(tColor back, tColor blend, int width, i
void cImageMagickWrapper::CreateBackground(tColor back, tColor blend, int width, int height) { void cImageMagickWrapper::CreateBackground(tColor back, tColor blend, int width, int height) {
CreateGradient(back, blend, width, height, 0.8, 0.8); CreateGradient(back, blend, width, height, 0.8, 0.8);
} }

View File

@ -1,38 +1,62 @@
#include "config.h" #include "config.h"
#include "osdmanager.h" #include "osdmanager.h"
cOsdManager::cOsdManager(void) { cOsdManager::cOsdManager(void) {
} osd = NULL;
}
bool cOsdManager::setOsd() {
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop()); void cOsdManager::Lock(void) {
if (osd) { mutex.Lock();
tArea Area = { 0, 0, cOsd::OsdWidth(), cOsd::OsdHeight(), 32 }; }
if (osd->SetAreas(&Area, 1) == oeOk) {
return true; void cOsdManager::Unlock(void) {
} mutex.Unlock();
} }
return false;
} bool cOsdManager::CreateOsd(void) {
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
void cOsdManager::setBackground() { if (osd) {
tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 };
if (tvguideConfig.displayStatusHeader && tvguideConfig.scaleVideo) { if (osd->SetAreas(&Area, 1) == oeOk) {
int widthStatus = cOsd::OsdWidth() - geoManager.statusHeaderHeight * 16 / 9; return true;
osd->DrawRectangle(0, 0, widthStatus, geoManager.statusHeaderHeight, theme.Color(clrBackgroundOSD)); }
osd->DrawRectangle(0, geoManager.statusHeaderHeight, Width(), Height(), theme.Color(clrBackgroundOSD)); }
} return false;
else }
osd->DrawRectangle(0, 0, Width(), Height(), theme.Color(clrBackgroundOSD));
void cOsdManager::DeleteOsd(void) {
} Lock();
delete osd;
cPixmap *cOsdManager::requestPixmap(int Layer, const cRect &ViewPort, const cRect &DrawPort) { osd = NULL;
return osd->CreatePixmap(Layer, ViewPort, DrawPort); Unlock();
} }
void cOsdManager::releasePixmap(cPixmap *pixmap) { void cOsdManager::SetBackground(void) {
if (!pixmap)
return; if (config.displayStatusHeader && config.scaleVideo) {
osd->DestroyPixmap(pixmap); int widthStatus = cOsd::OsdWidth() - geoManager.statusHeaderHeight * 16 / 9;
} osd->DrawRectangle(0, 0, widthStatus, geoManager.statusHeaderHeight, theme.Color(clrBackgroundOSD));
osd->DrawRectangle(0, geoManager.statusHeaderHeight, Width(), Height(), theme.Color(clrBackgroundOSD));
}
else
osd->DrawRectangle(0, 0, Width(), Height(), theme.Color(clrBackgroundOSD));
}
cPixmap *cOsdManager::CreatePixmap(int Layer, const cRect &ViewPort, const cRect &DrawPort) {
if (osd)
return osd->CreatePixmap(Layer, ViewPort, DrawPort);
return NULL;
}
void cOsdManager::DestroyPixmap(cPixmap *pixmap) {
if (!osd || !pixmap)
return;
osd->DestroyPixmap(pixmap);
}
void cOsdManager::Flush(void) {
if (osd) {
osd->Flush();
}
}

View File

@ -1,23 +1,26 @@
#ifndef __TVGUIDE_OSDMANAGER_H #ifndef __TVGUIDE_OSDMANAGER_H
#define __TVGUIDE_OSDMANAGER_H #define __TVGUIDE_OSDMANAGER_H
#include <vdr/osd.h> #include <vdr/osd.h>
class cOsdManager { class cOsdManager {
private: private:
cOsd *osd; cOsd *osd;
public: cMutex mutex;
cOsdManager(void); public:
bool setOsd(); cOsdManager(void);
void setBackground(); void Lock(void);
void flush() {osd->Flush();}; void Unlock(void);
cPixmap *requestPixmap(int Layer, const cRect &ViewPort, const cRect &DrawPort = cRect::Null); bool CreateOsd(void);
void releasePixmap(cPixmap *pixmap); void DeleteOsd(void);
void deleteOsd() {delete osd;}; void SetBackground(void);
int Width() { return osd->Width(); }; cPixmap *CreatePixmap(int Layer, const cRect &ViewPort, const cRect &DrawPort = cRect::Null);
int Height() { return osd->Height(); }; void DestroyPixmap(cPixmap *pixmap);
int Top() { return osd->Top(); }; void Flush(void);
int Left() { return osd->Left(); }; int Width(void) { return osd->Width(); };
}; int Height(void) { return osd->Height(); };
int Top(void) { return osd->Top(); };
#endif //__TVGUIDE_OSDMANAGER_H int Left(void) { return osd->Left(); };
};
#endif //__TVGUIDE_OSDMANAGER_H

View File

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-tvguide 0.0.1\n" "Project-Id-Version: vdr-tvguide 0.0.1\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 17:24+0200\n" "POT-Creation-Date: 2022-04-29 16:05+0200\n"
"PO-Revision-Date: 2013-09-21 17:49+0200\n" "PO-Revision-Date: 2013-09-21 17:49+0200\n"
"Last-Translator: My friend <Sampep> Thanks David <Gabychan> <gbonich@gmail.com>\n" "Last-Translator: My friend <Sampep> Thanks David <Gabychan> <gbonich@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@ -25,7 +25,7 @@ msgid "min"
msgstr "min" msgstr "min"
msgid "Reruns of " msgid "Reruns of "
msgstr "" msgstr "Reemissions "
msgid "No reruns found" msgid "No reruns found"
msgstr "" msgstr ""
@ -57,6 +57,9 @@ msgstr ""
msgid "images" msgid "images"
msgstr "" msgstr ""
msgid "tvguide: RemoteTimerModifications failed"
msgstr ""
msgid "root video folder" msgid "root video folder"
msgstr "Directori principal per a vídeo" msgstr "Directori principal per a vídeo"
@ -72,6 +75,15 @@ msgstr "tots els canals"
msgid "unknown channel" msgid "unknown channel"
msgstr "canal desconegut" msgstr "canal desconegut"
msgid "with"
msgstr ""
msgid "errors"
msgstr ""
msgid "error"
msgstr ""
msgid "Duration" msgid "Duration"
msgstr "Durada" msgstr "Durada"
@ -99,21 +111,18 @@ msgstr ""
msgid "recordings done" msgid "recordings done"
msgstr "" msgstr ""
msgid "What's on now"
msgstr ""
msgid "What's on next"
msgstr ""
msgid "Instant Record" msgid "Instant Record"
msgstr "Enregistra a l'instant" msgstr "Enregistra a l'instant"
msgid "Delete Timer" msgid "Timer On/Off"
msgstr "Esborra temporitzador" msgstr "Temporitzador On/Off"
msgid "Edit Timer" msgid "Edit Timer"
msgstr "Edita temporitzador" msgstr "Edita temporitzador"
msgid "Delete Timer"
msgstr "Esborra temporitzador"
msgid "Timer Timeline" msgid "Timer Timeline"
msgstr "" msgstr ""
@ -144,6 +153,9 @@ msgstr "Cerca a les gravacions"
msgid "Set Folder for" msgid "Set Folder for"
msgstr "Programa carpeta per" msgstr "Programa carpeta per"
msgid "Timer changed"
msgstr ""
msgid "Timer created" msgid "Timer created"
msgstr "Temporitzador creat" msgstr "Temporitzador creat"
@ -168,14 +180,14 @@ msgstr "Sí"
msgid "No" msgid "No"
msgstr "No" msgstr "No"
msgid "One" msgid "Timer Conflicts"
msgstr "Un" msgstr "Conflicte al temporitzador"
msgid "detected" msgid "detected"
msgstr "detectat" msgstr "detectat"
msgid "Timer Conflicts" msgid "Ignore Conflicts"
msgstr "Conflicte al temporitzador" msgstr "Ignora conflictes"
msgid "Show conflict" msgid "Show conflict"
msgstr "Mostra conflicte" msgstr "Mostra conflicte"
@ -183,9 +195,6 @@ msgstr "Mostra conflicte"
msgid "timers involved" msgid "timers involved"
msgstr "temporitzadors involucrats" msgstr "temporitzadors involucrats"
msgid "Ignore Conflicts"
msgstr "Ignora conflictes"
msgid "Ignore Conflict" msgid "Ignore Conflict"
msgstr "Ignora conflicte" msgstr "Ignora conflicte"
@ -216,6 +225,12 @@ msgstr ""
msgid "replaced by rerun" msgid "replaced by rerun"
msgstr "" msgstr ""
msgid "Save"
msgstr "Desa"
msgid "Cancel"
msgstr "Cancel·la"
msgid "Timer Active" msgid "Timer Active"
msgstr "Temporitzador actiu" msgstr "Temporitzador actiu"
@ -240,14 +255,11 @@ msgstr ""
msgid "New Folder" msgid "New Folder"
msgstr "" msgstr ""
msgid "Save" msgid "Create Series Timer based on:"
msgstr "Desa" msgstr "Programa enregistrament de Sèries segons:"
msgid "Cancel" msgid "Create Timer"
msgstr "Cancel·la" msgstr "Crea temporitzador"
msgid "Create Series Timer based on"
msgstr "Programa enregistrament de Sèries segons"
msgid "Series Timer start time" msgid "Series Timer start time"
msgstr "Inici temporitzador Sèries" msgstr "Inici temporitzador Sèries"
@ -261,9 +273,6 @@ msgstr "Dies a enregistrar"
msgid "Day to start" msgid "Day to start"
msgstr "Dia d'inici" msgstr "Dia d'inici"
msgid "Create Timer"
msgstr "Crea temporitzador"
msgid "Series Timer created" msgid "Series Timer created"
msgstr "Sèrie programada" msgstr "Sèrie programada"
@ -273,17 +282,17 @@ msgstr "Inici"
msgid "Stop" msgid "Stop"
msgstr "Final" msgstr "Final"
msgid "Configure Search Timer based on" msgid "Configure Search Timer based on:"
msgstr "Configura cerca de temporitzadors segons" msgstr "Configura cerca de temporitzadors segons:"
msgid "Search Expression:"
msgstr "Cerca expressió:"
msgid "Continue" msgid "Continue"
msgstr "Continua" msgstr "Continua"
msgid "Configure Search Timer for Search String" msgid "Search Expression:"
msgstr "Configura cerca de temporitzadors amb text" msgstr "Cerca expressió:"
msgid "Configure Search Timer for Search String:"
msgstr "Configura cerca de temporitzadors amb text:"
msgid "Manually configure Options" msgid "Manually configure Options"
msgstr "Opcions de configuració manual" msgstr "Opcions de configuració manual"
@ -303,79 +312,106 @@ msgstr ""
msgid "Save Search Timer" msgid "Save Search Timer"
msgstr "" msgstr ""
msgid "Search String" msgid "Search term"
msgstr "" msgstr ""
msgid "Active" msgid "Active"
msgstr "" msgstr ""
msgid "Search Mode" msgid "Search mode"
msgstr "Mode de cerca" msgstr ""
msgid "Use Title" msgid "Tolerance"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Use title"
msgstr "Utilitza títol" msgstr "Utilitza títol"
msgid "Use Subtitle" msgid "Use subtitle"
msgstr "Utilitza subtítol" msgstr "Utilitza subtítol"
msgid "Use Description" msgid "Use description"
msgstr "Utilitza descripció" msgstr "Utilitza descripció"
msgid "Limit Channels" msgid "Use channel"
msgstr "Canals restringits" msgstr "Canals restringits"
msgid "Use Time" msgid "from channel"
msgstr "Utilitza temps"
msgid "Display advanced Options"
msgstr ""
msgid "Limit Days of the Week"
msgstr ""
msgid "Time margin for start in minutes"
msgstr ""
msgid "Time margin for stop in minutes"
msgstr ""
msgid "Series Recording"
msgstr ""
msgid "Folder"
msgstr ""
msgid "Use VPS"
msgstr ""
msgid "Avoid Repeats"
msgstr ""
msgid "Use in Favorites"
msgstr ""
msgid "Hide advanced Options"
msgstr ""
msgid "Display Results for Search Timer"
msgstr "Mostra resultats de la cerca"
msgid "Start Channel"
msgstr "Inicia canal" msgstr "Inicia canal"
msgid "Stop Channel" msgid "to channel"
msgstr "Atura canal" msgstr "Atura canal"
msgid "Channel group"
msgstr ""
msgid "Use time"
msgstr "Utilitza temps"
msgid "Start after" msgid "Start after"
msgstr "Comença després" msgstr "Comença després"
msgid "Start before" msgid "Start before"
msgstr "Comença abans" msgstr "Comença abans"
msgid "Select Days" msgid "Use duration"
msgstr "Utilitza Durada"
msgid "Min. duration"
msgstr "" msgstr ""
msgid "Number of allowed repeats" msgid "Max. duration"
msgstr ""
msgid "Use day of week"
msgstr ""
msgid "Day of week"
msgstr ""
msgid "Use in Favorites"
msgstr ""
msgid "Use as search timer"
msgstr ""
msgid "Action"
msgstr ""
msgid "Switch ... minutes before start"
msgstr ""
msgid "Unmute sound"
msgstr ""
msgid "Ask ... minutes before start"
msgstr ""
msgid "Series Recording"
msgstr ""
msgid "Directory"
msgstr ""
msgid "Delete recordings after ... days"
msgstr ""
msgid "Keep ... recordings"
msgstr ""
msgid "Pause when ... recordings exist"
msgstr ""
msgid "Avoid Repeats"
msgstr ""
msgid "Allowed repeats"
msgstr ""
msgid "Only repeats within ... days"
msgstr "" msgstr ""
msgid "Compare Title" msgid "Compare Title"
@ -387,6 +423,33 @@ msgstr ""
msgid "Compare Description" msgid "Compare Description"
msgstr "" msgstr ""
msgid "Min. match in %"
msgstr ""
msgid "Compare date"
msgstr ""
msgid "Time margin for start in minutes"
msgstr ""
msgid "Time margin for stop in minutes"
msgstr ""
msgid "Use VPS"
msgstr ""
msgid "Auto delete"
msgstr ""
msgid "after ... recordings"
msgstr ""
msgid "after ... days after first rec."
msgstr ""
msgid "Display Results for Search Timer"
msgstr "Mostra resultats de la cerca"
msgid "Really delete Search Timer" msgid "Really delete Search Timer"
msgstr "" msgstr ""
@ -396,7 +459,7 @@ msgstr ""
msgid "Delete Search Timer and created Timers" msgid "Delete Search Timer and created Timers"
msgstr "" msgstr ""
msgid "Search Timer sucessfully created." msgid "Search Timer sucessfully created"
msgstr "S'ha creat cerca de temporitzador" msgstr "S'ha creat cerca de temporitzador"
msgid "Search Timer update initialised" msgid "Search Timer update initialised"
@ -420,12 +483,12 @@ msgstr "Utilitza una altra plantilla"
msgid "search results for Favorite" msgid "search results for Favorite"
msgstr "" msgstr ""
msgid "search result for Favorite"
msgstr ""
msgid "search results for Search Timer" msgid "search results for Search Timer"
msgstr "cerca resultats per temporitzador" msgstr "cerca resultats per temporitzador"
msgid "search result for Favorite"
msgstr ""
msgid "search result for Search Timer" msgid "search result for Search Timer"
msgstr "cerca resultat per temporitzador" msgstr "cerca resultat per temporitzador"
@ -435,8 +498,8 @@ msgstr "No s'ha trobat la cadena de text"
msgid "Configure Options for Switchtimer" msgid "Configure Options for Switchtimer"
msgstr "Opcions de configuració de canvi de temporitzador" msgstr "Opcions de configuració de canvi de temporitzador"
msgid "Minutes before switching" msgid "Create"
msgstr "Minuts abans del canvi" msgstr "Crea"
msgid "switch" msgid "switch"
msgstr "canvia" msgstr "canvia"
@ -447,12 +510,12 @@ msgstr "només anunci"
msgid "ask for switch" msgid "ask for switch"
msgstr "pregunta pel canvi" msgstr "pregunta pel canvi"
msgid "Minutes before switching"
msgstr "Minuts abans del canvi"
msgid "Switch Mode" msgid "Switch Mode"
msgstr "Mode de canvi" msgstr "Mode de canvi"
msgid "Create"
msgstr "Crea"
msgid "Switch Timer sucessfully created" msgid "Switch Timer sucessfully created"
msgstr "Canvi de temporitzador creat" msgstr "Canvi de temporitzador creat"
@ -462,6 +525,12 @@ msgstr "No s'ha creat el canvi de temporitzador"
msgid "Switch Timer deleted" msgid "Switch Timer deleted"
msgstr "Canvi de temporitzador esborrat" msgstr "Canvi de temporitzador esborrat"
msgid "Perform Search"
msgstr "Realitza la cerca"
msgid "Search Mode"
msgstr "Mode de cerca"
msgid "Channel to Search" msgid "Channel to Search"
msgstr "Canal a cercar" msgstr "Canal a cercar"
@ -477,9 +546,6 @@ msgstr "Cerca a la descripció"
msgid "Show Search Options" msgid "Show Search Options"
msgstr "Mostra opcions de cerca" msgstr "Mostra opcions de cerca"
msgid "Perform Search"
msgstr "Realitza la cerca"
msgid "search results for" msgid "search results for"
msgstr "resultats de cerca per" msgstr "resultats de cerca per"
@ -495,12 +561,12 @@ msgstr ""
msgid "Found" msgid "Found"
msgstr "Trobada" msgstr "Trobada"
msgid "recording"
msgstr "gravació"
msgid "recordings" msgid "recordings"
msgstr "gravacions" msgstr "gravacions"
msgid "recording"
msgstr "gravació"
msgid "for" msgid "for"
msgstr "per" msgstr "per"
@ -510,6 +576,12 @@ msgstr "No s'han trobat gravacions per"
msgid "No Favorites available" msgid "No Favorites available"
msgstr "" msgstr ""
msgid "What's on now"
msgstr ""
msgid "What's on next"
msgstr ""
msgid "whole term must appear" msgid "whole term must appear"
msgstr "expressió completa" msgstr "expressió completa"
@ -525,6 +597,57 @@ msgstr "coincidència exacta"
msgid "regular expression" msgid "regular expression"
msgstr "expressió regular" msgstr "expressió regular"
msgid "fuzzy"
msgstr ""
msgid "allow empty"
msgstr ""
msgid "Interval"
msgstr ""
msgid "Channel Group"
msgstr ""
msgid "only FTA"
msgstr ""
msgid "same day"
msgstr ""
msgid "same week"
msgstr ""
msgid "same month"
msgstr ""
msgid "Record"
msgstr ""
msgid "Announce by OSD"
msgstr ""
msgid "Switch only"
msgstr ""
msgid "Announce and switch"
msgstr ""
msgid "Announce by mail"
msgstr ""
msgid "Inactive record"
msgstr ""
msgid "no"
msgstr ""
msgid "count recordings"
msgstr ""
msgid "count days"
msgstr ""
msgid "General Settings" msgid "General Settings"
msgstr "Preferències" msgstr "Preferències"
@ -570,6 +693,9 @@ msgstr "si existeix"
msgid "always" msgid "always"
msgstr "sempre" msgstr "sempre"
msgid "Use workaround for HWAccelerated OSD"
msgstr ""
msgid "Show Main Menu Entry" msgid "Show Main Menu Entry"
msgstr "Mostra entrada del menú principal" msgstr "Mostra entrada del menú principal"
@ -646,7 +772,7 @@ msgid "Display time in EPG Grids"
msgstr "Mostra el temps a l'EPG" msgstr "Mostra el temps a l'EPG"
msgid "Height of Headers (Status Header and EPG View, Perc. of osd height)" msgid "Height of Headers (Status Header and EPG View, Perc. of osd height)"
msgstr "" msgstr "Alçada capçalera d'estat (% alçada OSD)"
msgid "Height of Footer (Perc. of osd height)" msgid "Height of Footer (Perc. of osd height)"
msgstr "" msgstr ""
@ -777,19 +903,49 @@ msgstr ""
msgid "Use fixed folder" msgid "Use fixed folder"
msgstr "" msgstr ""
msgid "smart"
msgstr ""
msgid "Instant recording:"
msgstr ""
msgid "Folder for instant Recordings" msgid "Folder for instant Recordings"
msgstr "Utilitza carpetes per gravacions a l'instant"
msgid "Folder"
msgstr ""
msgid "Add episode to manual timers"
msgstr "" msgstr ""
msgid "Use Remotetimers" msgid "Use Remotetimers"
msgstr "Utilitza temporitzadors remots" msgstr "Utilitza temporitzadors remots"
msgid "Show timer confirmation messages"
msgstr ""
msgid "Favorites:"
msgstr ""
msgid "Limit channels in favorites"
msgstr ""
msgid "Start Channel"
msgstr "Inicia canal"
msgid "Stop Channel"
msgstr "Atura canal"
msgid "Use \"What's on now\" in favorites" msgid "Use \"What's on now\" in favorites"
msgstr "" msgstr ""
msgid "Use \"What's on next\" in favorites" msgid "Use \"What's on next\" in favorites"
msgstr "" msgstr ""
msgid "Use user defined time 1 in favorites" msgid "User defined times in favorites:"
msgstr ""
msgid "Use user defined time 1"
msgstr "" msgstr ""
msgid "Description" msgid "Description"
@ -798,16 +954,19 @@ msgstr ""
msgid "Time" msgid "Time"
msgstr "" msgstr ""
msgid "Use user defined time 2 in favorites" msgid "Use user defined time 2"
msgstr "" msgstr ""
msgid "Use user defined time 3 in favorites" msgid "Use user defined time 3"
msgstr "" msgstr ""
msgid "Use user defined time 4 in favorites" msgid "Use user defined time 4"
msgstr "" msgstr ""
msgid "Limit channels in favorites" msgid "Switchtimer:"
msgstr ""
msgid "Switch (x)min before start of the show"
msgstr "" msgstr ""
msgid "Create Log Messages for image loading" msgid "Create Log Messages for image loading"
@ -840,6 +999,9 @@ msgstr ""
msgid "Recording Menus Icon Cache" msgid "Recording Menus Icon Cache"
msgstr "" msgstr ""
msgid "A fancy 2d EPG Viewer"
msgstr ""
msgid "No Cast available" msgid "No Cast available"
msgstr "" msgstr ""
@ -850,7 +1012,7 @@ msgid "EPG Info"
msgstr "" msgstr ""
msgid "Reruns" msgid "Reruns"
msgstr "" msgstr "Reemissions"
msgid "Recording Information" msgid "Recording Information"
msgstr "" msgstr ""
@ -909,9 +1071,6 @@ msgstr ""
msgid "yes" msgid "yes"
msgstr "" msgstr ""
msgid "no"
msgstr ""
msgid "Adult" msgid "Adult"
msgstr "" msgstr ""

396
po/de_DE.po Executable file → Normal file
View File

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-tvguide 0.0.1\n" "Project-Id-Version: vdr-tvguide 0.0.1\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 17:24+0200\n" "POT-Creation-Date: 2022-04-29 16:05+0200\n"
"PO-Revision-Date: 2012-08-25 17:49+0200\n" "PO-Revision-Date: 2012-08-25 17:49+0200\n"
"Last-Translator: Horst\n" "Last-Translator: Horst\n"
"Language-Team: \n" "Language-Team: \n"
@ -54,6 +54,9 @@ msgstr "Favoriten"
msgid "images" msgid "images"
msgstr "Bilder" msgstr "Bilder"
msgid "tvguide: RemoteTimerModifications failed"
msgstr ""
msgid "root video folder" msgid "root video folder"
msgstr "Video Hauptverzeichnis" msgstr "Video Hauptverzeichnis"
@ -69,6 +72,15 @@ msgstr "alle Kanäle"
msgid "unknown channel" msgid "unknown channel"
msgstr "unbekannter Kanal" msgstr "unbekannter Kanal"
msgid "with"
msgstr "mit"
msgid "errors"
msgstr "Fehler"
msgid "error"
msgstr "Fehler"
msgid "Duration" msgid "Duration"
msgstr "Dauer" msgstr "Dauer"
@ -96,21 +108,18 @@ msgstr "aktive Timer"
msgid "recordings done" msgid "recordings done"
msgstr "erledigte Aufnahmen" msgstr "erledigte Aufnahmen"
msgid "What's on now"
msgstr "Was läuft jetzt?"
msgid "What's on next"
msgstr "Was läuft als nächstes?"
msgid "Instant Record" msgid "Instant Record"
msgstr "Aufnahme" msgstr "Aufnahme"
msgid "Delete Timer" msgid "Timer On/Off"
msgstr "Timer löschen" msgstr "Timer Ein/Aus"
msgid "Edit Timer" msgid "Edit Timer"
msgstr "Timer bearbeiten" msgstr "Timer bearbeiten"
msgid "Delete Timer"
msgstr "Timer löschen"
msgid "Timer Timeline" msgid "Timer Timeline"
msgstr "Timer Tagesübersicht" msgstr "Timer Tagesübersicht"
@ -141,6 +150,9 @@ msgstr "In Aufnahmen suchen"
msgid "Set Folder for" msgid "Set Folder for"
msgstr "Verzeichnis festlegen für" msgstr "Verzeichnis festlegen für"
msgid "Timer changed"
msgstr "Timer geändert"
msgid "Timer created" msgid "Timer created"
msgstr "Timer angelegt" msgstr "Timer angelegt"
@ -165,14 +177,14 @@ msgstr "Ja"
msgid "No" msgid "No"
msgstr "Nein" msgstr "Nein"
msgid "One" msgid "Timer Conflicts"
msgstr "Ein" msgstr "Timerkonflikte"
msgid "detected" msgid "detected"
msgstr "gefunden" msgstr "gefunden"
msgid "Timer Conflicts" msgid "Ignore Conflicts"
msgstr "Timerkonflikte" msgstr "Konflikte ignorieren"
msgid "Show conflict" msgid "Show conflict"
msgstr "Konflikt zeigen" msgstr "Konflikt zeigen"
@ -180,9 +192,6 @@ msgstr "Konflikt zeigen"
msgid "timers involved" msgid "timers involved"
msgstr "Timer beteiligt" msgstr "Timer beteiligt"
msgid "Ignore Conflicts"
msgstr "Konflikte ignorieren"
msgid "Ignore Conflict" msgid "Ignore Conflict"
msgstr "Konflikt ignorieren" msgstr "Konflikt ignorieren"
@ -213,6 +222,12 @@ msgstr "Timer für"
msgid "replaced by rerun" msgid "replaced by rerun"
msgstr "ersetzt durch Wiederholung" msgstr "ersetzt durch Wiederholung"
msgid "Save"
msgstr "Speichern"
msgid "Cancel"
msgstr "Abbrechen"
msgid "Timer Active" msgid "Timer Active"
msgstr "Timer aktiv" msgstr "Timer aktiv"
@ -237,14 +252,11 @@ msgstr "Timer Datei"
msgid "New Folder" msgid "New Folder"
msgstr "Neues Verzeichnis" msgstr "Neues Verzeichnis"
msgid "Save" msgid "Create Series Timer based on:"
msgstr "Speichern" msgstr "Serientimer anlegen basierend auf:"
msgid "Cancel" msgid "Create Timer"
msgstr "Abbrechen" msgstr "Timer anlegen"
msgid "Create Series Timer based on"
msgstr "Serientimer anlegen basierend auf"
msgid "Series Timer start time" msgid "Series Timer start time"
msgstr "Serientimer Start Zeit" msgstr "Serientimer Start Zeit"
@ -258,9 +270,6 @@ msgstr "Tage"
msgid "Day to start" msgid "Day to start"
msgstr "Beginnen am" msgstr "Beginnen am"
msgid "Create Timer"
msgstr "Timer anlegen"
msgid "Series Timer created" msgid "Series Timer created"
msgstr "Serientimer angelegt" msgstr "Serientimer angelegt"
@ -270,17 +279,17 @@ msgstr "Start"
msgid "Stop" msgid "Stop"
msgstr "Stop" msgstr "Stop"
msgid "Configure Search Timer based on" msgid "Configure Search Timer based on:"
msgstr "Suchtimer konfigurieren basierend auf" msgstr "Suchtimer konfigurieren basierend auf:"
msgid "Search Expression:"
msgstr "Suchausdruck:"
msgid "Continue" msgid "Continue"
msgstr "Weiter" msgstr "Weiter"
msgid "Configure Search Timer for Search String" msgid "Search Expression:"
msgstr "Suchtimer konfigurieren für Suchbegriff" msgstr "Suchausdruck:"
msgid "Configure Search Timer for Search String:"
msgstr "Suchtimer konfigurieren für Suchbegriff:"
msgid "Manually configure Options" msgid "Manually configure Options"
msgstr "Optionen manuell konfigurieren" msgstr "Optionen manuell konfigurieren"
@ -300,68 +309,44 @@ msgstr "Suchtimer konfigurieren"
msgid "Save Search Timer" msgid "Save Search Timer"
msgstr "Suchtimer speichern" msgstr "Suchtimer speichern"
msgid "Search String" msgid "Search term"
msgstr "Suchbegriff" msgstr "Suchbegriff"
msgid "Active" msgid "Active"
msgstr "Aktiv" msgstr "Aktiv"
msgid "Search Mode" msgid "Search mode"
msgstr "Suchmodus" msgstr "Suchmodus"
msgid "Use Title" msgid "Tolerance"
msgstr "Titel benutzen" msgstr "Toleranz"
msgid "Use Subtitle" msgid "Match case"
msgstr "Untertitel benutzen" msgstr "Groß/klein"
msgid "Use Description" msgid "Use title"
msgstr "Beschreibung benutzen" msgstr "Verwende Titel"
msgid "Limit Channels" msgid "Use subtitle"
msgstr "Kanäle einschränken" msgstr "Verwende Untertitel"
msgid "Use Time" msgid "Use description"
msgstr "Zeit benutzen" msgstr "Verwende Beschreibung"
msgid "Display advanced Options" msgid "Use channel"
msgstr "Erweiterte Optionen anzeigen" msgstr "Verwende Kanal"
msgid "Limit Days of the Week" msgid "from channel"
msgstr "Wochentage beschränken" msgstr "von Kanal"
msgid "Time margin for start in minutes" msgid "to channel"
msgstr "Zeit vor Start in Minuten" msgstr "bis Kanal"
msgid "Time margin for stop in minutes" msgid "Channel group"
msgstr "Zeit nach Ende in Minuten" msgstr "Kanalgruppe"
msgid "Series Recording" msgid "Use time"
msgstr "Serienaufnahme" msgstr "Verwende Uhrzeit"
msgid "Folder"
msgstr "Verzeichnis"
msgid "Use VPS"
msgstr "VPS benutzen"
msgid "Avoid Repeats"
msgstr "Wiederholungen vermeiden"
msgid "Use in Favorites"
msgstr "Als Favorit benutzen"
msgid "Hide advanced Options"
msgstr "Erweiterte Optionen ausblenden"
msgid "Display Results for Search Timer"
msgstr "Ergebnisse für Suchtimer anzeigen"
msgid "Start Channel"
msgstr "Startkanal"
msgid "Stop Channel"
msgstr "Stopkanal"
msgid "Start after" msgid "Start after"
msgstr "Beginn nach" msgstr "Beginn nach"
@ -369,20 +354,98 @@ msgstr "Beginn nach"
msgid "Start before" msgid "Start before"
msgstr "Beginn vor" msgstr "Beginn vor"
msgid "Select Days" msgid "Use duration"
msgstr "Tage bestimmen" msgstr "Verwende Dauer"
msgid "Number of allowed repeats" msgid "Min. duration"
msgstr "Anzahl erlaubter Wiederholungen" msgstr "Min. Dauer"
msgid "Max. duration"
msgstr "Max. Dauer"
msgid "Use day of week"
msgstr "Verwende Wochentag"
msgid "Day of week"
msgstr "Wochentag"
msgid "Use in Favorites"
msgstr "Als Favorit benutzen"
msgid "Use as search timer"
msgstr "Als Suchtimer verwenden"
msgid "Action"
msgstr "Aktion"
msgid "Switch ... minutes before start"
msgstr "Umschalten ... Minuten vor Start"
msgid "Unmute sound"
msgstr "Ton anschalten"
msgid "Ask ... minutes before start"
msgstr "Nachfrage ... Minuten vor Start"
msgid "Series Recording"
msgstr "Serienaufnahme"
msgid "Directory"
msgstr "Verzeichnis"
msgid "Delete recordings after ... days"
msgstr "Aufn. nach ... Tagen löschen"
msgid "Keep ... recordings"
msgstr "Behalte ... Aufnahmen"
msgid "Pause when ... recordings exist"
msgstr "Pause, wenn ... Aufnahmen exist."
msgid "Avoid Repeats"
msgstr "Vermeide Wiederholung"
msgid "Allowed repeats"
msgstr "Erlaubte Wiederholungen"
msgid "Only repeats within ... days"
msgstr "Nur Wiederh. innerhalb von ... Tagen"
msgid "Compare Title" msgid "Compare Title"
msgstr "Titel vergleichen" msgstr "Vergleiche Titel"
msgid "Compare Subtitle" msgid "Compare Subtitle"
msgstr "Untertitel vergleichen" msgstr "Vergleiche Untertitel"
msgid "Compare Description" msgid "Compare Description"
msgstr "Beschreibung vergleichen" msgstr "Vergleiche Beschreibung"
msgid "Min. match in %"
msgstr "Min. Übereinstimmung in %"
msgid "Compare date"
msgstr "Vergleiche Zeitpunkt"
msgid "Time margin for start in minutes"
msgstr "Vorlauf zum Timer-Beginn (min)"
msgid "Time margin for stop in minutes"
msgstr "Nachlauf zum Timer-Ende (min)"
msgid "Use VPS"
msgstr "Verwende VPS"
msgid "Auto delete"
msgstr "automatisch löschen"
msgid "after ... recordings"
msgstr "nach ... Aufnahmen"
msgid "after ... days after first rec."
msgstr "nach ... Tagen nach erster Aufn."
msgid "Display Results for Search Timer"
msgstr "Ergebnisse für Suchtimer anzeigen"
msgid "Really delete Search Timer" msgid "Really delete Search Timer"
msgstr "Suchtimer wirklich löschen" msgstr "Suchtimer wirklich löschen"
@ -393,7 +456,7 @@ msgstr "Nur Suchtimer löschen"
msgid "Delete Search Timer and created Timers" msgid "Delete Search Timer and created Timers"
msgstr "Suchtimer und erzeugte Timer löschen" msgstr "Suchtimer und erzeugte Timer löschen"
msgid "Search Timer sucessfully created." msgid "Search Timer sucessfully created"
msgstr "Suchtimer erfolgreich angelegt" msgstr "Suchtimer erfolgreich angelegt"
msgid "Search Timer update initialised" msgid "Search Timer update initialised"
@ -417,12 +480,12 @@ msgstr "Anderes Template benutzen"
msgid "search results for Favorite" msgid "search results for Favorite"
msgstr "Suchergebnisse für Favorit" msgstr "Suchergebnisse für Favorit"
msgid "search result for Favorite"
msgstr "Suchergebnis für Favorit"
msgid "search results for Search Timer" msgid "search results for Search Timer"
msgstr "Treffer für Suchtimer" msgstr "Treffer für Suchtimer"
msgid "search result for Favorite"
msgstr "Suchergebnis für Favorit"
msgid "search result for Search Timer" msgid "search result for Search Timer"
msgstr "Treffer für Suchtimer" msgstr "Treffer für Suchtimer"
@ -432,8 +495,8 @@ msgstr "Keine Treffer für Suchbegriff"
msgid "Configure Options for Switchtimer" msgid "Configure Options for Switchtimer"
msgstr "Optionen für Umschalttimer konfigurieren" msgstr "Optionen für Umschalttimer konfigurieren"
msgid "Minutes before switching" msgid "Create"
msgstr "Minuten vor umschalten" msgstr "Anlegen"
msgid "switch" msgid "switch"
msgstr "umschalten" msgstr "umschalten"
@ -444,12 +507,12 @@ msgstr "nur ankündigen"
msgid "ask for switch" msgid "ask for switch"
msgstr "vor umschalten fragen" msgstr "vor umschalten fragen"
msgid "Minutes before switching"
msgstr "Minuten vor umschalten"
msgid "Switch Mode" msgid "Switch Mode"
msgstr "Umschaltmodus" msgstr "Umschaltmodus"
msgid "Create"
msgstr "Anlegen"
msgid "Switch Timer sucessfully created" msgid "Switch Timer sucessfully created"
msgstr "Umschalttimer erfolgreich angelegt" msgstr "Umschalttimer erfolgreich angelegt"
@ -459,6 +522,12 @@ msgstr "Umschalttimer NICHT erfolgreich angelegt"
msgid "Switch Timer deleted" msgid "Switch Timer deleted"
msgstr "Umschalttimer gelöscht" msgstr "Umschalttimer gelöscht"
msgid "Perform Search"
msgstr "Suche ausführen"
msgid "Search Mode"
msgstr "Suchmodus"
msgid "Channel to Search" msgid "Channel to Search"
msgstr "Suche auf Kanal" msgstr "Suche auf Kanal"
@ -474,9 +543,6 @@ msgstr "In Beschreibung suchen"
msgid "Show Search Options" msgid "Show Search Options"
msgstr "Suchoptionen anzeigen" msgstr "Suchoptionen anzeigen"
msgid "Perform Search"
msgstr "Suche ausführen"
msgid "search results for" msgid "search results for"
msgstr "Suchergebnisse für" msgstr "Suchergebnisse für"
@ -492,12 +558,12 @@ msgstr "Suchausdruck muss mindestens drei Zeichen haben"
msgid "Found" msgid "Found"
msgstr " " msgstr " "
msgid "recording"
msgstr "Aufnahme gefunden"
msgid "recordings" msgid "recordings"
msgstr "Aufnahmen gefunden" msgstr "Aufnahmen gefunden"
msgid "recording"
msgstr "Aufnahme gefunden"
msgid "for" msgid "for"
msgstr "für" msgstr "für"
@ -507,6 +573,12 @@ msgstr "Keine Aufnahmen gefunden für"
msgid "No Favorites available" msgid "No Favorites available"
msgstr "Keine Favoriten verfügbar" msgstr "Keine Favoriten verfügbar"
msgid "What's on now"
msgstr "Was läuft jetzt?"
msgid "What's on next"
msgstr "Was läuft als nächstes?"
msgid "whole term must appear" msgid "whole term must appear"
msgstr "vollständiger Ausdruck" msgstr "vollständiger Ausdruck"
@ -522,6 +594,57 @@ msgstr "exakt"
msgid "regular expression" msgid "regular expression"
msgstr "Regulärer Ausdruck" msgstr "Regulärer Ausdruck"
msgid "fuzzy"
msgstr "unscharf"
msgid "allow empty"
msgstr "erlaube leere"
msgid "Interval"
msgstr "Bereich"
msgid "Channel Group"
msgstr "Kanalgruppe"
msgid "only FTA"
msgstr "ohne PayTV"
msgid "same day"
msgstr "gleicher Tag"
msgid "same week"
msgstr "gleiche Woche"
msgid "same month"
msgstr "gleicher Monat"
msgid "Record"
msgstr "Aufnehmen"
msgid "Announce by OSD"
msgstr "per OSD ankündigen"
msgid "Switch only"
msgstr "Nur umschalten"
msgid "Announce and switch"
msgstr "Ankündigen und Umschalten"
msgid "Announce by mail"
msgstr "per Mail ankündigen"
msgid "Inactive record"
msgstr "inaktive Aufnahme"
msgid "no"
msgstr "Nein"
msgid "count recordings"
msgstr "Anzahl Aufnahmen"
msgid "count days"
msgstr "Anzahl Tage"
msgid "General Settings" msgid "General Settings"
msgstr "Allgemeine Einstellungen" msgstr "Allgemeine Einstellungen"
@ -567,6 +690,9 @@ msgstr "falls vorhanden"
msgid "always" msgid "always"
msgstr "immer" msgstr "immer"
msgid "Use workaround for HWAccelerated OSD"
msgstr ""
msgid "Show Main Menu Entry" msgid "Show Main Menu Entry"
msgstr "Hauptmenüeintrag anzeigen" msgstr "Hauptmenüeintrag anzeigen"
@ -774,20 +900,50 @@ msgstr "Verzeichnis aus Liste auswählen"
msgid "Use fixed folder" msgid "Use fixed folder"
msgstr "Festes Verzeichnis benutzen" msgstr "Festes Verzeichnis benutzen"
msgid "smart"
msgstr "intelligent"
msgid "Instant recording:"
msgstr "Sofortaufnahmen:"
msgid "Folder for instant Recordings" msgid "Folder for instant Recordings"
msgstr "Verzeichnis für Sofortaufnahmen" msgstr "Verzeichnis für Sofortaufnahmen"
msgid "Folder"
msgstr "Verzeichnis"
msgid "Add episode to manual timers"
msgstr "Untertitel in manuellen Timern"
msgid "Use Remotetimers" msgid "Use Remotetimers"
msgstr "RemoteTimers benutzen" msgstr "RemoteTimers benutzen"
msgid "Show timer confirmation messages"
msgstr "Timer Bestätigungsmeldungen anzeigen"
msgid "Favorites:"
msgstr "Favoriten:"
msgid "Limit channels in favorites"
msgstr "Kanäle in Favoriten beschränken"
msgid "Start Channel"
msgstr "von Kanal"
msgid "Stop Channel"
msgstr "bis Kanal"
msgid "Use \"What's on now\" in favorites" msgid "Use \"What's on now\" in favorites"
msgstr "\"Was läuft jetzt\" in Favoriten benutzen" msgstr "\"Was läuft jetzt\" in Favoriten benutzen"
msgid "Use \"What's on next\" in favorites" msgid "Use \"What's on next\" in favorites"
msgstr "\"Was läuft als nächstes\" in Favoriten benutzen" msgstr "\"Was läuft als nächstes\" in Favoriten benutzen"
msgid "Use user defined time 1 in favorites" msgid "User defined times in favorites:"
msgstr "Benutzerdef. Zeit 1 in Favoriten benutzen" msgstr "Nutzer definierte Zeiten in Favoriten:"
msgid "Use user defined time 1"
msgstr "Verw. benutzerdef. Zeit 1"
msgid "Description" msgid "Description"
msgstr "Beschreibung" msgstr "Beschreibung"
@ -795,23 +951,26 @@ msgstr "Beschreibung"
msgid "Time" msgid "Time"
msgstr "Zeit" msgstr "Zeit"
msgid "Use user defined time 2 in favorites" msgid "Use user defined time 2"
msgstr "Benutzerdef. Zeit 2 in Favoriten benutzen" msgstr "Verw. benutzerdef. Zeit 2"
msgid "Use user defined time 3 in favorites" msgid "Use user defined time 3"
msgstr "Benutzerdef. Zeit 3 in Favoriten benutzen" msgstr "Verw. benutzerdef. Zeit 3"
msgid "Use user defined time 4 in favorites" msgid "Use user defined time 4"
msgstr "Benutzerdef. Zeit 4 in Favoriten benutzen" msgstr "Verw. benutzerdef. Zeit 4"
msgid "Limit channels in favorites" msgid "Switchtimer:"
msgstr "Kanäle in Favoriten beschränken" msgstr "Umschalttimer:"
msgid "Switch (x)min before start of the show"
msgstr "Umschalten (x)min vor der Sendung"
msgid "Create Log Messages for image loading" msgid "Create Log Messages for image loading"
msgstr "Log Nachrichten für das Laden der Bilder erzeugen" msgstr "Log Nachrichten für das Laden der Bilder erzeugen"
msgid "Limit Logo Cache" msgid "Limit Logo Cache"
msgstr "Logo Cash beschränken" msgstr "Logo Cache beschränken"
msgid "Maximal number of logos to cache" msgid "Maximal number of logos to cache"
msgstr "Maximale Anzahl Logos" msgstr "Maximale Anzahl Logos"
@ -837,6 +996,9 @@ msgstr "Kanalgruppen Cache"
msgid "Recording Menus Icon Cache" msgid "Recording Menus Icon Cache"
msgstr "Recording Menüs Icon Cache" msgstr "Recording Menüs Icon Cache"
msgid "A fancy 2d EPG Viewer"
msgstr "Eine schicke Programm Vorschau"
msgid "No Cast available" msgid "No Cast available"
msgstr "Keine Besetzung vorhanden" msgstr "Keine Besetzung vorhanden"
@ -850,7 +1012,7 @@ msgid "Reruns"
msgstr "Wiederholungen" msgstr "Wiederholungen"
msgid "Recording Information" msgid "Recording Information"
msgstr "" msgstr "Aufnahme Information"
msgid "Image Galery" msgid "Image Galery"
msgstr "Bildergalerie" msgstr "Bildergalerie"
@ -906,9 +1068,6 @@ msgstr "Überblick"
msgid "yes" msgid "yes"
msgstr "Ja" msgstr "Ja"
msgid "no"
msgstr "Nein"
msgid "Adult" msgid "Adult"
msgstr "Nur für Erwachsene" msgstr "Nur für Erwachsene"
@ -939,3 +1098,8 @@ msgstr "TheMovieDB Popularität"
msgid "TheMovieDB Vote Average" msgid "TheMovieDB Vote Average"
msgstr "TheMovieDB durchschnittliche Bewertung" msgstr "TheMovieDB durchschnittliche Bewertung"
#~ msgid "Display advanced Options"
#~ msgstr "Erweiterte Optionen anzeigen"
#~ msgid "Hide advanced Options"
#~ msgstr "Erweiterte Optionen ausblenden"

1108
po/it_IT.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-tvguide 1.0.0\n" "Project-Id-Version: vdr-tvguide 1.0.0\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 17:24+0200\n" "POT-Creation-Date: 2022-04-29 16:05+0200\n"
"PO-Revision-Date: 2013-09-25 17:49+0400\n" "PO-Revision-Date: 2013-09-25 17:49+0400\n"
"Last-Translator: AmiD, ilya\n" "Last-Translator: AmiD, ilya\n"
"Language-Team: Russia-Cherepovets(wm.amid@gmail.com)\n" "Language-Team: Russia-Cherepovets(wm.amid@gmail.com)\n"
@ -22,7 +22,7 @@ msgid "min"
msgstr "мин" msgstr "мин"
msgid "Reruns of " msgid "Reruns of "
msgstr "" msgstr "ПОВТОРЫ ЭТОЙ "
msgid "No reruns found" msgid "No reruns found"
msgstr "" msgstr ""
@ -54,6 +54,9 @@ msgstr ""
msgid "images" msgid "images"
msgstr "" msgstr ""
msgid "tvguide: RemoteTimerModifications failed"
msgstr ""
msgid "root video folder" msgid "root video folder"
msgstr "Главная видео директория" msgstr "Главная видео директория"
@ -69,6 +72,15 @@ msgstr "все каналы"
msgid "unknown channel" msgid "unknown channel"
msgstr "неизвестный канал" msgstr "неизвестный канал"
msgid "with"
msgstr ""
msgid "errors"
msgstr ""
msgid "error"
msgstr ""
msgid "Duration" msgid "Duration"
msgstr "Продолжительность" msgstr "Продолжительность"
@ -96,21 +108,18 @@ msgstr ""
msgid "recordings done" msgid "recordings done"
msgstr "" msgstr ""
msgid "What's on now"
msgstr ""
msgid "What's on next"
msgstr ""
msgid "Instant Record" msgid "Instant Record"
msgstr "Записать" msgstr "Записать"
msgid "Delete Timer" msgid "Timer On/Off"
msgstr "Удалить таймер" msgstr "таймер Вкл/Выкл"
msgid "Edit Timer" msgid "Edit Timer"
msgstr "Редактировать таймер" msgstr "Редактировать таймер"
msgid "Delete Timer"
msgstr "Удалить таймер"
msgid "Timer Timeline" msgid "Timer Timeline"
msgstr "" msgstr ""
@ -141,6 +150,9 @@ msgstr "Искать в записях"
msgid "Set Folder for" msgid "Set Folder for"
msgstr "Укажите каталог для" msgstr "Укажите каталог для"
msgid "Timer changed"
msgstr ""
msgid "Timer created" msgid "Timer created"
msgstr "Таймер создан" msgstr "Таймер создан"
@ -165,14 +177,14 @@ msgstr "Да"
msgid "No" msgid "No"
msgstr "Нет" msgstr "Нет"
msgid "One" msgid "Timer Conflicts"
msgstr "Один" msgstr "Таймер-конфликты"
msgid "detected" msgid "detected"
msgstr "обнаружен" msgstr "обнаружен"
msgid "Timer Conflicts" msgid "Ignore Conflicts"
msgstr "Таймер-конфликты" msgstr "Игнорировать конфликты"
msgid "Show conflict" msgid "Show conflict"
msgstr "Показать конфликты" msgstr "Показать конфликты"
@ -180,9 +192,6 @@ msgstr "Показать конфликты"
msgid "timers involved" msgid "timers involved"
msgstr "Таймер" msgstr "Таймер"
msgid "Ignore Conflicts"
msgstr "Игнорировать конфликты"
msgid "Ignore Conflict" msgid "Ignore Conflict"
msgstr "Игнорировать конфликт" msgstr "Игнорировать конфликт"
@ -213,6 +222,12 @@ msgstr ""
msgid "replaced by rerun" msgid "replaced by rerun"
msgstr "" msgstr ""
msgid "Save"
msgstr "Сохранить"
msgid "Cancel"
msgstr "Отменить"
msgid "Timer Active" msgid "Timer Active"
msgstr "Таймер активен" msgstr "Таймер активен"
@ -237,14 +252,11 @@ msgstr ""
msgid "New Folder" msgid "New Folder"
msgstr "" msgstr ""
msgid "Save" msgid "Create Series Timer based on:"
msgstr "Сохранить" msgstr "Настроить циклический таймер:"
msgid "Cancel" msgid "Create Timer"
msgstr "Отменить" msgstr "Создать"
msgid "Create Series Timer based on"
msgstr "Настроить циклический таймер"
msgid "Series Timer start time" msgid "Series Timer start time"
msgstr "Время с" msgstr "Время с"
@ -258,9 +270,6 @@ msgstr "Дни недели"
msgid "Day to start" msgid "Day to start"
msgstr "Начиная с" msgstr "Начиная с"
msgid "Create Timer"
msgstr "Создать"
msgid "Series Timer created" msgid "Series Timer created"
msgstr "Циклический таймер создан" msgstr "Циклический таймер создан"
@ -270,17 +279,17 @@ msgstr "Старт"
msgid "Stop" msgid "Stop"
msgstr "Стоп" msgstr "Стоп"
msgid "Configure Search Timer based on" msgid "Configure Search Timer based on:"
msgstr "Настроить поисковый таймер" msgstr "Настроить поисковый таймер:"
msgid "Search Expression:"
msgstr "Искать выражение:"
msgid "Continue" msgid "Continue"
msgstr "Продолжить" msgstr "Продолжить"
msgid "Configure Search Timer for Search String" msgid "Search Expression:"
msgstr "Настройка таймера поиска по ключевым словам" msgstr "Искать выражение:"
msgid "Configure Search Timer for Search String:"
msgstr "Настройка таймера поиска по ключевым словам:"
msgid "Manually configure Options" msgid "Manually configure Options"
msgstr "Ручная настройка параметров" msgstr "Ручная настройка параметров"
@ -295,84 +304,111 @@ msgid "No Search Timers Configured"
msgstr "" msgstr ""
msgid "Configure Search Timer Options" msgid "Configure Search Timer Options"
msgstr "" msgstr "Настроить параметры таймера"
msgid "Save Search Timer" msgid "Save Search Timer"
msgstr "" msgstr ""
msgid "Search String" msgid "Search term"
msgstr "" msgstr ""
msgid "Active" msgid "Active"
msgstr "" msgstr ""
msgid "Search Mode" msgid "Search mode"
msgstr "Режим поиска" msgstr ""
msgid "Use Title" msgid "Tolerance"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Use title"
msgstr "Искать в названиях" msgstr "Искать в названиях"
msgid "Use Subtitle" msgid "Use subtitle"
msgstr "Искать в эпизодах" msgstr "Искать в эпизодах"
msgid "Use Description" msgid "Use description"
msgstr "Искать в описаниях" msgstr "Искать в описаниях"
msgid "Limit Channels" msgid "Use channel"
msgstr "Ограничить список каналов" msgstr "Ограничить список каналов"
msgid "Use Time" msgid "from channel"
msgstr ""
msgid "to channel"
msgstr ""
msgid "Channel group"
msgstr ""
msgid "Use time"
msgstr "Время" msgstr "Время"
msgid "Display advanced Options"
msgstr ""
msgid "Limit Days of the Week"
msgstr ""
msgid "Time margin for start in minutes"
msgstr ""
msgid "Time margin for stop in minutes"
msgstr ""
msgid "Series Recording"
msgstr ""
msgid "Folder"
msgstr ""
msgid "Use VPS"
msgstr ""
msgid "Avoid Repeats"
msgstr ""
msgid "Use in Favorites"
msgstr ""
msgid "Hide advanced Options"
msgstr ""
msgid "Display Results for Search Timer"
msgstr "Тест"
msgid "Start Channel"
msgstr "С канала"
msgid "Stop Channel"
msgstr "По канал"
msgid "Start after" msgid "Start after"
msgstr "С" msgstr "С"
msgid "Start before" msgid "Start before"
msgstr "До" msgstr "До"
msgid "Select Days" msgid "Use duration"
msgstr "" msgstr ""
msgid "Number of allowed repeats" msgid "Min. duration"
msgstr ""
msgid "Max. duration"
msgstr ""
msgid "Use day of week"
msgstr ""
msgid "Day of week"
msgstr ""
msgid "Use in Favorites"
msgstr ""
msgid "Use as search timer"
msgstr ""
msgid "Action"
msgstr ""
msgid "Switch ... minutes before start"
msgstr ""
msgid "Unmute sound"
msgstr ""
msgid "Ask ... minutes before start"
msgstr ""
msgid "Series Recording"
msgstr ""
msgid "Directory"
msgstr ""
msgid "Delete recordings after ... days"
msgstr ""
msgid "Keep ... recordings"
msgstr ""
msgid "Pause when ... recordings exist"
msgstr ""
msgid "Avoid Repeats"
msgstr ""
msgid "Allowed repeats"
msgstr ""
msgid "Only repeats within ... days"
msgstr "" msgstr ""
msgid "Compare Title" msgid "Compare Title"
@ -384,6 +420,33 @@ msgstr ""
msgid "Compare Description" msgid "Compare Description"
msgstr "" msgstr ""
msgid "Min. match in %"
msgstr ""
msgid "Compare date"
msgstr ""
msgid "Time margin for start in minutes"
msgstr ""
msgid "Time margin for stop in minutes"
msgstr ""
msgid "Use VPS"
msgstr ""
msgid "Auto delete"
msgstr ""
msgid "after ... recordings"
msgstr ""
msgid "after ... days after first rec."
msgstr ""
msgid "Display Results for Search Timer"
msgstr "Тест"
msgid "Really delete Search Timer" msgid "Really delete Search Timer"
msgstr "" msgstr ""
@ -393,7 +456,7 @@ msgstr ""
msgid "Delete Search Timer and created Timers" msgid "Delete Search Timer and created Timers"
msgstr "" msgstr ""
msgid "Search Timer sucessfully created." msgid "Search Timer sucessfully created"
msgstr "Поисковый таймер создан" msgstr "Поисковый таймер создан"
msgid "Search Timer update initialised" msgid "Search Timer update initialised"
@ -417,12 +480,12 @@ msgstr "Использовать другие шаблоны"
msgid "search results for Favorite" msgid "search results for Favorite"
msgstr "" msgstr ""
msgid "search result for Favorite"
msgstr ""
msgid "search results for Search Timer" msgid "search results for Search Timer"
msgstr "Совпадений найдено" msgstr "Совпадений найдено"
msgid "search result for Favorite"
msgstr ""
msgid "search result for Search Timer" msgid "search result for Search Timer"
msgstr "Совпадение найдено" msgstr "Совпадение найдено"
@ -432,8 +495,8 @@ msgstr "Совпадений НЕ найдено"
msgid "Configure Options for Switchtimer" msgid "Configure Options for Switchtimer"
msgstr "Настройка таймера переключения" msgstr "Настройка таймера переключения"
msgid "Minutes before switching" msgid "Create"
msgstr "Минут до события" msgstr "Создать"
msgid "switch" msgid "switch"
msgstr "Переключить" msgstr "Переключить"
@ -444,12 +507,12 @@ msgstr "Только предупредить"
msgid "ask for switch" msgid "ask for switch"
msgstr "Спросить о переключении" msgstr "Спросить о переключении"
msgid "Minutes before switching"
msgstr "Минут до события"
msgid "Switch Mode" msgid "Switch Mode"
msgstr "Режим переключения" msgstr "Режим переключения"
msgid "Create"
msgstr "Создать"
msgid "Switch Timer sucessfully created" msgid "Switch Timer sucessfully created"
msgstr "Таймер переключения создан" msgstr "Таймер переключения создан"
@ -459,6 +522,12 @@ msgstr "Таймер переключения НЕ был создан!"
msgid "Switch Timer deleted" msgid "Switch Timer deleted"
msgstr "Таймер переключения удален" msgstr "Таймер переключения удален"
msgid "Perform Search"
msgstr "Найти"
msgid "Search Mode"
msgstr "Режим поиска"
msgid "Channel to Search" msgid "Channel to Search"
msgstr "Канал для поиска" msgstr "Канал для поиска"
@ -474,9 +543,6 @@ msgstr "Искать в описаниях"
msgid "Show Search Options" msgid "Show Search Options"
msgstr "Показать параметры поиска" msgstr "Показать параметры поиска"
msgid "Perform Search"
msgstr "Найти"
msgid "search results for" msgid "search results for"
msgstr "Найдено по запросу" msgstr "Найдено по запросу"
@ -492,12 +558,12 @@ msgstr ""
msgid "Found" msgid "Found"
msgstr "Найдено" msgstr "Найдено"
msgid "recording"
msgstr "запись"
msgid "recordings" msgid "recordings"
msgstr "записей" msgstr "записей"
msgid "recording"
msgstr "запись"
msgid "for" msgid "for"
msgstr "для" msgstr "для"
@ -507,6 +573,12 @@ msgstr "Не найдено записей:"
msgid "No Favorites available" msgid "No Favorites available"
msgstr "" msgstr ""
msgid "What's on now"
msgstr ""
msgid "What's on next"
msgstr ""
msgid "whole term must appear" msgid "whole term must appear"
msgstr "фраза" msgstr "фраза"
@ -522,6 +594,57 @@ msgstr "точное совпадение"
msgid "regular expression" msgid "regular expression"
msgstr "регулярные выражения" msgstr "регулярные выражения"
msgid "fuzzy"
msgstr ""
msgid "allow empty"
msgstr ""
msgid "Interval"
msgstr ""
msgid "Channel Group"
msgstr ""
msgid "only FTA"
msgstr ""
msgid "same day"
msgstr ""
msgid "same week"
msgstr ""
msgid "same month"
msgstr ""
msgid "Record"
msgstr ""
msgid "Announce by OSD"
msgstr ""
msgid "Switch only"
msgstr ""
msgid "Announce and switch"
msgstr ""
msgid "Announce by mail"
msgstr ""
msgid "Inactive record"
msgstr ""
msgid "no"
msgstr ""
msgid "count recordings"
msgstr ""
msgid "count days"
msgstr ""
msgid "General Settings" msgid "General Settings"
msgstr "Основные настройки" msgstr "Основные настройки"
@ -567,6 +690,9 @@ msgstr "если существует"
msgid "always" msgid "always"
msgstr "всегда" msgstr "всегда"
msgid "Use workaround for HWAccelerated OSD"
msgstr ""
msgid "Show Main Menu Entry" msgid "Show Main Menu Entry"
msgstr "Показывать пункт в главном меню" msgstr "Показывать пункт в главном меню"
@ -643,7 +769,7 @@ msgid "Display time in EPG Grids"
msgstr "Показывать время в сетке EPG" msgstr "Показывать время в сетке EPG"
msgid "Height of Headers (Status Header and EPG View, Perc. of osd height)" msgid "Height of Headers (Status Header and EPG View, Perc. of osd height)"
msgstr "" msgstr "Высота верхней панели (% от высоты OSD)"
msgid "Height of Footer (Perc. of osd height)" msgid "Height of Footer (Perc. of osd height)"
msgstr "" msgstr ""
@ -774,19 +900,49 @@ msgstr ""
msgid "Use fixed folder" msgid "Use fixed folder"
msgstr "" msgstr ""
msgid "smart"
msgstr ""
msgid "Instant recording:"
msgstr ""
msgid "Folder for instant Recordings" msgid "Folder for instant Recordings"
msgstr "Использовать директории для быстрой записи"
msgid "Folder"
msgstr ""
msgid "Add episode to manual timers"
msgstr "" msgstr ""
msgid "Use Remotetimers" msgid "Use Remotetimers"
msgstr "RemoteTimers benutzen" msgstr "RemoteTimers benutzen"
msgid "Show timer confirmation messages"
msgstr ""
msgid "Favorites:"
msgstr ""
msgid "Limit channels in favorites"
msgstr ""
msgid "Start Channel"
msgstr "С канала"
msgid "Stop Channel"
msgstr "По канал"
msgid "Use \"What's on now\" in favorites" msgid "Use \"What's on now\" in favorites"
msgstr "" msgstr ""
msgid "Use \"What's on next\" in favorites" msgid "Use \"What's on next\" in favorites"
msgstr "" msgstr ""
msgid "Use user defined time 1 in favorites" msgid "User defined times in favorites:"
msgstr ""
msgid "Use user defined time 1"
msgstr "" msgstr ""
msgid "Description" msgid "Description"
@ -795,16 +951,19 @@ msgstr ""
msgid "Time" msgid "Time"
msgstr "" msgstr ""
msgid "Use user defined time 2 in favorites" msgid "Use user defined time 2"
msgstr "" msgstr ""
msgid "Use user defined time 3 in favorites" msgid "Use user defined time 3"
msgstr "" msgstr ""
msgid "Use user defined time 4 in favorites" msgid "Use user defined time 4"
msgstr "" msgstr ""
msgid "Limit channels in favorites" msgid "Switchtimer:"
msgstr ""
msgid "Switch (x)min before start of the show"
msgstr "" msgstr ""
msgid "Create Log Messages for image loading" msgid "Create Log Messages for image loading"
@ -837,6 +996,9 @@ msgstr ""
msgid "Recording Menus Icon Cache" msgid "Recording Menus Icon Cache"
msgstr "" msgstr ""
msgid "A fancy 2d EPG Viewer"
msgstr ""
msgid "No Cast available" msgid "No Cast available"
msgstr "" msgstr ""
@ -847,7 +1009,7 @@ msgid "EPG Info"
msgstr "" msgstr ""
msgid "Reruns" msgid "Reruns"
msgstr "" msgstr "ПОВТОРЫ"
msgid "Recording Information" msgid "Recording Information"
msgstr "" msgstr ""
@ -906,9 +1068,6 @@ msgstr ""
msgid "yes" msgid "yes"
msgstr "" msgstr ""
msgid "no"
msgstr ""
msgid "Adult" msgid "Adult"
msgstr "" msgstr ""

View File

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-tvguide 1.1.0\n" "Project-Id-Version: vdr-tvguide 1.1.0\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 17:24+0200\n" "POT-Creation-Date: 2022-04-29 16:05+0200\n"
"PO-Revision-Date: 2013-09-15 00:12+0100\n" "PO-Revision-Date: 2013-09-15 00:12+0100\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n" "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@ -22,7 +22,7 @@ msgid "min"
msgstr "min" msgstr "min"
msgid "Reruns of " msgid "Reruns of "
msgstr "" msgstr "Repríza tohto "
msgid "No reruns found" msgid "No reruns found"
msgstr "" msgstr ""
@ -54,6 +54,9 @@ msgstr ""
msgid "images" msgid "images"
msgstr "" msgstr ""
msgid "tvguide: RemoteTimerModifications failed"
msgstr ""
msgid "root video folder" msgid "root video folder"
msgstr "Hlavný video adresár" msgstr "Hlavný video adresár"
@ -69,6 +72,15 @@ msgstr "v
msgid "unknown channel" msgid "unknown channel"
msgstr "neznámy Kanal" msgstr "neznámy Kanal"
msgid "with"
msgstr ""
msgid "errors"
msgstr ""
msgid "error"
msgstr ""
msgid "Duration" msgid "Duration"
msgstr "Då¾ka" msgstr "Då¾ka"
@ -96,21 +108,18 @@ msgstr ""
msgid "recordings done" msgid "recordings done"
msgstr "" msgstr ""
msgid "What's on now"
msgstr ""
msgid "What's on next"
msgstr ""
msgid "Instant Record" msgid "Instant Record"
msgstr "Okam¾ite nahra»" msgstr "Okam¾ite nahra»"
msgid "Delete Timer" msgid "Timer On/Off"
msgstr "Vymaza» plán nahrávania" msgstr "Zap./Vyp. plán nahrávania"
msgid "Edit Timer" msgid "Edit Timer"
msgstr "Upravi» plán nahrávania" msgstr "Upravi» plán nahrávania"
msgid "Delete Timer"
msgstr "Vymaza» plán nahrávania"
msgid "Timer Timeline" msgid "Timer Timeline"
msgstr "" msgstr ""
@ -141,6 +150,9 @@ msgstr "Vyh
msgid "Set Folder for" msgid "Set Folder for"
msgstr "Nastavi» adresár pre" msgstr "Nastavi» adresár pre"
msgid "Timer changed"
msgstr ""
msgid "Timer created" msgid "Timer created"
msgstr "Plán vytvorený" msgstr "Plán vytvorený"
@ -165,14 +177,14 @@ msgstr "
msgid "No" msgid "No"
msgstr "Nie" msgstr "Nie"
msgid "One" msgid "Timer Conflicts"
msgstr "Jeden" msgstr "Konflikty plánov"
msgid "detected" msgid "detected"
msgstr "nájdených" msgstr "nájdených"
msgid "Timer Conflicts" msgid "Ignore Conflicts"
msgstr "Konflikty plánov" msgstr "Ignorova» konflikty"
msgid "Show conflict" msgid "Show conflict"
msgstr "Zobrazi» konflikt" msgstr "Zobrazi» konflikt"
@ -180,9 +192,6 @@ msgstr "Zobrazi
msgid "timers involved" msgid "timers involved"
msgstr "plány komplikované" msgstr "plány komplikované"
msgid "Ignore Conflicts"
msgstr "Ignorova» konflikty"
msgid "Ignore Conflict" msgid "Ignore Conflict"
msgstr "Ignorova» konflikt" msgstr "Ignorova» konflikt"
@ -213,6 +222,12 @@ msgstr ""
msgid "replaced by rerun" msgid "replaced by rerun"
msgstr "" msgstr ""
msgid "Save"
msgstr "Ulo¾i»"
msgid "Cancel"
msgstr "Zru¹i»"
msgid "Timer Active" msgid "Timer Active"
msgstr "Plán aktívny" msgstr "Plán aktívny"
@ -237,14 +252,11 @@ msgstr ""
msgid "New Folder" msgid "New Folder"
msgstr "" msgstr ""
msgid "Save" msgid "Create Series Timer based on:"
msgstr "Ulo¾i»" msgstr "Vytvorenie plánu na základe série:"
msgid "Cancel" msgid "Create Timer"
msgstr "Zru¹i»" msgstr "Vytvori» plán"
msgid "Create Series Timer based on"
msgstr "Vytvorenie plánu na základe série"
msgid "Series Timer start time" msgid "Series Timer start time"
msgstr "Sériový plán zaèína" msgstr "Sériový plán zaèína"
@ -258,9 +270,6 @@ msgstr "Dni"
msgid "Day to start" msgid "Day to start"
msgstr "Zaèína dòa" msgstr "Zaèína dòa"
msgid "Create Timer"
msgstr "Vytvori» plán"
msgid "Series Timer created" msgid "Series Timer created"
msgstr "Vytvorený sériový plán" msgstr "Vytvorený sériový plán"
@ -270,17 +279,17 @@ msgstr "
msgid "Stop" msgid "Stop"
msgstr "Stop" msgstr "Stop"
msgid "Configure Search Timer based on" msgid "Configure Search Timer based on:"
msgstr "Vyhµadávanie plánu nastavi» na základe" msgstr "Vyhµadávanie plánu nastavi» na základe:"
msgid "Search Expression:"
msgstr "Hµadaný výraz:"
msgid "Continue" msgid "Continue"
msgstr "Ïal¹ie" msgstr "Ïal¹ie"
msgid "Configure Search Timer for Search String" msgid "Search Expression:"
msgstr "Konfigurácia vyhµadávania plánu pre hµadané kµúèové slovo " msgstr "Hµadaný výraz:"
msgid "Configure Search Timer for Search String:"
msgstr "Konfigurácia vyhµadávania plánu pre hµadané kµúèové slovo:"
msgid "Manually configure Options" msgid "Manually configure Options"
msgstr "Ruène konfigurova» mo¾nosti" msgstr "Ruène konfigurova» mo¾nosti"
@ -300,79 +309,106 @@ msgstr ""
msgid "Save Search Timer" msgid "Save Search Timer"
msgstr "" msgstr ""
msgid "Search String" msgid "Search term"
msgstr "" msgstr ""
msgid "Active" msgid "Active"
msgstr "" msgstr ""
msgid "Search Mode" msgid "Search mode"
msgstr "Re¾im vyhµadávania" msgstr ""
msgid "Use Title" msgid "Tolerance"
msgstr ""
msgid "Match case"
msgstr ""
msgid "Use title"
msgstr "Pou¾i» názov" msgstr "Pou¾i» názov"
msgid "Use Subtitle" msgid "Use subtitle"
msgstr "Pou¾i» titulky" msgstr "Pou¾i» titulky"
msgid "Use Description" msgid "Use description"
msgstr "Pou¾i» popis" msgstr "Pou¾i» popis"
msgid "Limit Channels" msgid "Use channel"
msgstr "Obmedzi» kanály" msgstr "Obmedzi» kanály"
msgid "Use Time" msgid "from channel"
msgstr ""
msgid "to channel"
msgstr ""
msgid "Channel group"
msgstr ""
msgid "Use time"
msgstr "Pou¾i» èas" msgstr "Pou¾i» èas"
msgid "Display advanced Options"
msgstr ""
msgid "Limit Days of the Week"
msgstr ""
msgid "Time margin for start in minutes"
msgstr ""
msgid "Time margin for stop in minutes"
msgstr ""
msgid "Series Recording"
msgstr ""
msgid "Folder"
msgstr ""
msgid "Use VPS"
msgstr ""
msgid "Avoid Repeats"
msgstr ""
msgid "Use in Favorites"
msgstr ""
msgid "Hide advanced Options"
msgstr ""
msgid "Display Results for Search Timer"
msgstr "Pozrie» výsledky pre vyhµadávanie plánov"
msgid "Start Channel"
msgstr "Od kanálu"
msgid "Stop Channel"
msgstr "Po kanál"
msgid "Start after" msgid "Start after"
msgstr "Zaèiatok po" msgstr "Zaèiatok po"
msgid "Start before" msgid "Start before"
msgstr "Zaèiatok pred" msgstr "Zaèiatok pred"
msgid "Select Days" msgid "Use duration"
msgstr "" msgstr ""
msgid "Number of allowed repeats" msgid "Min. duration"
msgstr ""
msgid "Max. duration"
msgstr ""
msgid "Use day of week"
msgstr ""
msgid "Day of week"
msgstr ""
msgid "Use in Favorites"
msgstr ""
msgid "Use as search timer"
msgstr ""
msgid "Action"
msgstr ""
msgid "Switch ... minutes before start"
msgstr ""
msgid "Unmute sound"
msgstr ""
msgid "Ask ... minutes before start"
msgstr ""
msgid "Series Recording"
msgstr ""
msgid "Directory"
msgstr ""
msgid "Delete recordings after ... days"
msgstr ""
msgid "Keep ... recordings"
msgstr ""
msgid "Pause when ... recordings exist"
msgstr ""
msgid "Avoid Repeats"
msgstr ""
msgid "Allowed repeats"
msgstr ""
msgid "Only repeats within ... days"
msgstr "" msgstr ""
msgid "Compare Title" msgid "Compare Title"
@ -384,6 +420,33 @@ msgstr ""
msgid "Compare Description" msgid "Compare Description"
msgstr "" msgstr ""
msgid "Min. match in %"
msgstr ""
msgid "Compare date"
msgstr ""
msgid "Time margin for start in minutes"
msgstr ""
msgid "Time margin for stop in minutes"
msgstr ""
msgid "Use VPS"
msgstr ""
msgid "Auto delete"
msgstr ""
msgid "after ... recordings"
msgstr ""
msgid "after ... days after first rec."
msgstr ""
msgid "Display Results for Search Timer"
msgstr "Pozrie» výsledky pre vyhµadávanie plánov"
msgid "Really delete Search Timer" msgid "Really delete Search Timer"
msgstr "" msgstr ""
@ -393,8 +456,8 @@ msgstr ""
msgid "Delete Search Timer and created Timers" msgid "Delete Search Timer and created Timers"
msgstr "" msgstr ""
msgid "Search Timer sucessfully created." msgid "Search Timer sucessfully created"
msgstr "Vyhµadávaè plánu vytvorený." msgstr "Vyhµadávaè plánu vytvorený"
msgid "Search Timer update initialised" msgid "Search Timer update initialised"
msgstr "Vyhladávaè plánu inicializovaný" msgstr "Vyhladávaè plánu inicializovaný"
@ -417,12 +480,12 @@ msgstr "Pou
msgid "search results for Favorite" msgid "search results for Favorite"
msgstr "" msgstr ""
msgid "search result for Favorite"
msgstr ""
msgid "search results for Search Timer" msgid "search results for Search Timer"
msgstr "nájdené výsledky vyhµadávania plánu" msgstr "nájdené výsledky vyhµadávania plánu"
msgid "search result for Favorite"
msgstr ""
msgid "search result for Search Timer" msgid "search result for Search Timer"
msgstr "nájdený výsledok vyhµadávania plánu" msgstr "nájdený výsledok vyhµadávania plánu"
@ -432,8 +495,8 @@ msgstr "H
msgid "Configure Options for Switchtimer" msgid "Configure Options for Switchtimer"
msgstr "Konfigurova» mo¾nosti pre prepínací plán" msgstr "Konfigurova» mo¾nosti pre prepínací plán"
msgid "Minutes before switching" msgid "Create"
msgstr "Minúty pred prepnutím" msgstr "Vytvori»"
msgid "switch" msgid "switch"
msgstr "Prepnú»" msgstr "Prepnú»"
@ -444,12 +507,12 @@ msgstr "iba ozn
msgid "ask for switch" msgid "ask for switch"
msgstr "opýta» sa na prepnutie" msgstr "opýta» sa na prepnutie"
msgid "Minutes before switching"
msgstr "Minúty pred prepnutím"
msgid "Switch Mode" msgid "Switch Mode"
msgstr "Prepínací re¾im" msgstr "Prepínací re¾im"
msgid "Create"
msgstr "Vytvori»"
msgid "Switch Timer sucessfully created" msgid "Switch Timer sucessfully created"
msgstr "Prepnutie je naplánované" msgstr "Prepnutie je naplánované"
@ -459,6 +522,12 @@ msgstr "Pl
msgid "Switch Timer deleted" msgid "Switch Timer deleted"
msgstr "Plán prepnutia vymazaný" msgstr "Plán prepnutia vymazaný"
msgid "Perform Search"
msgstr "Vykona» vyhµadávanie"
msgid "Search Mode"
msgstr "Re¾im vyhµadávania"
msgid "Channel to Search" msgid "Channel to Search"
msgstr "Hµada» na kanále" msgstr "Hµada» na kanále"
@ -474,9 +543,6 @@ msgstr "H
msgid "Show Search Options" msgid "Show Search Options"
msgstr "Zobrazi» mo¾nosti vyhµadávania" msgstr "Zobrazi» mo¾nosti vyhµadávania"
msgid "Perform Search"
msgstr "Vykona» vyhµadávanie"
msgid "search results for" msgid "search results for"
msgstr "vyhµadané výsledky pre" msgstr "vyhµadané výsledky pre"
@ -492,12 +558,12 @@ msgstr ""
msgid "Found" msgid "Found"
msgstr "Nájdené" msgstr "Nájdené"
msgid "recording"
msgstr "nahrávka"
msgid "recordings" msgid "recordings"
msgstr "nahrávky" msgstr "nahrávky"
msgid "recording"
msgstr "nahrávka"
msgid "for" msgid "for"
msgstr "pre" msgstr "pre"
@ -507,6 +573,12 @@ msgstr "Nena
msgid "No Favorites available" msgid "No Favorites available"
msgstr "" msgstr ""
msgid "What's on now"
msgstr ""
msgid "What's on next"
msgstr ""
msgid "whole term must appear" msgid "whole term must appear"
msgstr "kompletný výraz" msgstr "kompletný výraz"
@ -522,6 +594,57 @@ msgstr "presn
msgid "regular expression" msgid "regular expression"
msgstr "regulárny výraz" msgstr "regulárny výraz"
msgid "fuzzy"
msgstr ""
msgid "allow empty"
msgstr ""
msgid "Interval"
msgstr ""
msgid "Channel Group"
msgstr ""
msgid "only FTA"
msgstr ""
msgid "same day"
msgstr ""
msgid "same week"
msgstr ""
msgid "same month"
msgstr ""
msgid "Record"
msgstr ""
msgid "Announce by OSD"
msgstr ""
msgid "Switch only"
msgstr ""
msgid "Announce and switch"
msgstr ""
msgid "Announce by mail"
msgstr ""
msgid "Inactive record"
msgstr ""
msgid "no"
msgstr ""
msgid "count recordings"
msgstr ""
msgid "count days"
msgstr ""
msgid "General Settings" msgid "General Settings"
msgstr "V¹eobecné nastavenia" msgstr "V¹eobecné nastavenia"
@ -567,6 +690,9 @@ msgstr "ak s
msgid "always" msgid "always"
msgstr "v¾dy" msgstr "v¾dy"
msgid "Use workaround for HWAccelerated OSD"
msgstr ""
msgid "Show Main Menu Entry" msgid "Show Main Menu Entry"
msgstr "Zobrazi» v hlavnom menu" msgstr "Zobrazi» v hlavnom menu"
@ -643,7 +769,7 @@ msgid "Display time in EPG Grids"
msgstr "Zobrazi» èas v EPG mrie¾ke" msgstr "Zobrazi» èas v EPG mrie¾ke"
msgid "Height of Headers (Status Header and EPG View, Perc. of osd height)" msgid "Height of Headers (Status Header and EPG View, Perc. of osd height)"
msgstr "" msgstr "Vý¹ka stavovej hlavièky (% z OSD vý¹ky)"
msgid "Height of Footer (Perc. of osd height)" msgid "Height of Footer (Perc. of osd height)"
msgstr "" msgstr ""
@ -774,19 +900,49 @@ msgstr ""
msgid "Use fixed folder" msgid "Use fixed folder"
msgstr "" msgstr ""
msgid "Folder for instant Recordings" msgid "smart"
msgstr "chytrý"
msgid "Instant recording:"
msgstr "" msgstr ""
msgid "Folder for instant Recordings"
msgstr "Pou¾i» adresáre pre okam¾ité nahrávky"
msgid "Folder"
msgstr ""
msgid "Add episode to manual timers"
msgstr "Prida¿ epizódy do ru¿ného ¿asova¿a"
msgid "Use Remotetimers" msgid "Use Remotetimers"
msgstr "Pou¾i» vzdialený plánovaè" msgstr "Pou¾i» vzdialený plánovaè"
msgid "Show timer confirmation messages"
msgstr ""
msgid "Favorites:"
msgstr ""
msgid "Limit channels in favorites"
msgstr ""
msgid "Start Channel"
msgstr "Od kanálu"
msgid "Stop Channel"
msgstr "Po kanál"
msgid "Use \"What's on now\" in favorites" msgid "Use \"What's on now\" in favorites"
msgstr "" msgstr ""
msgid "Use \"What's on next\" in favorites" msgid "Use \"What's on next\" in favorites"
msgstr "" msgstr ""
msgid "Use user defined time 1 in favorites" msgid "User defined times in favorites:"
msgstr ""
msgid "Use user defined time 1"
msgstr "" msgstr ""
msgid "Description" msgid "Description"
@ -795,16 +951,19 @@ msgstr ""
msgid "Time" msgid "Time"
msgstr "" msgstr ""
msgid "Use user defined time 2 in favorites" msgid "Use user defined time 2"
msgstr "" msgstr ""
msgid "Use user defined time 3 in favorites" msgid "Use user defined time 3"
msgstr "" msgstr ""
msgid "Use user defined time 4 in favorites" msgid "Use user defined time 4"
msgstr "" msgstr ""
msgid "Limit channels in favorites" msgid "Switchtimer:"
msgstr ""
msgid "Switch (x)min before start of the show"
msgstr "" msgstr ""
msgid "Create Log Messages for image loading" msgid "Create Log Messages for image loading"
@ -837,6 +996,9 @@ msgstr ""
msgid "Recording Menus Icon Cache" msgid "Recording Menus Icon Cache"
msgstr "" msgstr ""
msgid "A fancy 2d EPG Viewer"
msgstr ""
msgid "No Cast available" msgid "No Cast available"
msgstr "" msgstr ""
@ -847,7 +1009,7 @@ msgid "EPG Info"
msgstr "" msgstr ""
msgid "Reruns" msgid "Reruns"
msgstr "" msgstr "Repríza"
msgid "Recording Information" msgid "Recording Information"
msgstr "" msgstr ""
@ -906,9 +1068,6 @@ msgstr ""
msgid "yes" msgid "yes"
msgstr "" msgstr ""
msgid "no"
msgstr ""
msgid "Adult" msgid "Adult"
msgstr "" msgstr ""

View File

@ -1,4 +1,4 @@
#define __STL_CONFIG_H #define DISABLE_TEMPLATES_COLLIDING_WITH_STL
#include <string> #include <string>
#include <sstream> #include <sstream>
@ -10,6 +10,7 @@
#include "tools.h" #include "tools.h"
#include "switchtimer.h" #include "switchtimer.h"
#include "timerconflict.h" #include "timerconflict.h"
#include <vdr/timers.h>
#include "recmanager.h" #include "recmanager.h"
static int CompareRecording(const void *p1, const void *p2) { static int CompareRecording(const void *p1, const void *p2) {
@ -42,34 +43,49 @@ bool cRecManager::RefreshRemoteTimers(void) {
bool cRecManager::CheckEventForTimer(const cEvent *event) { bool cRecManager::CheckEventForTimer(const cEvent *event) {
bool hasTimer = false; bool hasTimer = false;
if (tvguideConfig.useRemoteTimers && pRemoteTimers) { if (config.useRemoteTimers && pRemoteTimers) {
RemoteTimers_GetMatch_v1_0 rtMatch; RemoteTimers_GetMatch_v1_0 rtMatch;
rtMatch.event = event; rtMatch.event = event;
pRemoteTimers->Service("RemoteTimers::GetMatch-v1.0", &rtMatch); pRemoteTimers->Service("RemoteTimers::GetMatch-v1.0", &rtMatch);
if (rtMatch.timerMatch == tmFull) if (rtMatch.timerMatch == tmFull)
hasTimer = true; hasTimer = true;
} else } else {
#if VDRVERSNUM >= 20301
eTimerMatch TimerMatch = tmNone;
LOCK_TIMERS_READ;
const cTimers *timers = Timers;
if (timers->GetMatch(event, &TimerMatch) && (TimerMatch == tmFull))
hasTimer = true;
#else
hasTimer = event->HasTimer(); hasTimer = event->HasTimer();
#endif
}
return hasTimer; return hasTimer;
} }
cTimer *cRecManager::GetTimerForEvent(const cEvent *event) { const cTimer *cRecManager::GetTimerForEvent(const cEvent *event) {
cTimer *timer = NULL; const cTimer *timer = NULL;
if (tvguideConfig.useRemoteTimers && pRemoteTimers) { if (config.useRemoteTimers && pRemoteTimers) {
RemoteTimers_GetMatch_v1_0 rtMatch; RemoteTimers_GetMatch_v1_0 rtMatch;
rtMatch.event = event; rtMatch.event = event;
pRemoteTimers->Service("RemoteTimers::GetMatch-v1.0", &rtMatch); pRemoteTimers->Service("RemoteTimers::GetMatch-v1.0", &rtMatch);
timer = rtMatch.timer; timer = rtMatch.timer;
} else return timer;
timer = Timers.GetMatch(event); }
#if VDRVERSNUM >= 20301
LOCK_TIMERS_READ;
timer = Timers->GetMatch(event);
#else
timer = Timers.GetMatch(event);
#endif
return timer; return timer;
} }
cTimer *cRecManager::createTimer(const cEvent *event, std::string path) { cTimer *cRecManager::createTimer(const cEvent *event, std::string path) {
cTimer *timer = NULL; cTimer *timer = NULL;
if (tvguideConfig.useRemoteTimers && pRemoteTimers) { if (config.useRemoteTimers && pRemoteTimers) {
timer = createRemoteTimer(event, path); timer = createRemoteTimer(event, path);
} else { } else {
timer = createLocalTimer(event, path); timer = createLocalTimer(event, path);
@ -79,20 +95,42 @@ cTimer *cRecManager::createTimer(const cEvent *event, std::string path) {
cTimer *cRecManager::createLocalTimer(const cEvent *event, std::string path) { cTimer *cRecManager::createLocalTimer(const cEvent *event, std::string path) {
cTimer *timer = new cTimer(event); cTimer *timer = new cTimer(event);
cTimer *t = Timers.GetTimer(timer); #if VDRVERSNUM >= 20301
LOCK_TIMERS_WRITE;
cTimers* timers = Timers;
timers->SetExplicitModify();
if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
timer->SetRemote(Setup.SVDRPDefaultHost);
#else
cTimers* timers = &Timers;
#endif
cTimer *t = timers->GetTimer(timer);
if (t) { if (t) {
t->OnOff(); t->OnOff();
#if VDRVERSNUM >= 20301
t->SetEvent(event);
#else
t->SetEventFromSchedule(); t->SetEventFromSchedule();
#endif
delete timer; delete timer;
timer = t; timer = t;
isyslog("timer %s reactivated", *t->ToDescr()); isyslog("timer %s reactivated", *t->ToDescr());
} else { } else {
Timers.Add(timer); SetTimerPath(timer, event, path);
timers->Add(timer);
timers->SetModified();
#if VDRVERSNUM >= 20301
if (!HandleRemoteTimerModifications(timer)) {
timers->Del(timer);
esyslog(tr("tvguide: RemoteTimerModifications failed"));
} else {
isyslog("timer %s added (active)", *timer->ToDescr());
}
#else
isyslog("timer %s added (active)", *timer->ToDescr()); isyslog("timer %s added (active)", *timer->ToDescr());
#endif
} }
SetTimerPath(timer, event, path); return timers->GetTimer(timer);
Timers.SetModified();
return timer;
} }
cTimer *cRecManager::createRemoteTimer(const cEvent *event, std::string path) { cTimer *cRecManager::createRemoteTimer(const cEvent *event, std::string path) {
@ -115,16 +153,16 @@ cTimer *cRecManager::createRemoteTimer(const cEvent *event, std::string path) {
} }
void cRecManager::SetTimerPath(cTimer *timer, const cEvent *event, std::string path) { void cRecManager::SetTimerPath(cTimer *timer, const cEvent *event, std::string path) {
if (tvguideConfig.instRecFolderMode == eFolderFixed) { if (config.instRecFolderMode == eFolderFixed) {
Epgsearch_services_v1_2 *epgSearch = new Epgsearch_services_v1_2; Epgsearch_services_v1_2 *epgSearch = new Epgsearch_services_v1_2;
std::string recDir = tvguideConfig.instRecFixedFolder; std::string recDir = config.instRecFixedFolder;
std::replace(recDir.begin(), recDir.end(), '/', '~'); std::replace(recDir.begin(), recDir.end(), '/', '~');
if (strchr(recDir.c_str(), '%') != NULL) { if (strchr(recDir.c_str(), '%') != NULL) {
if (epgSearchPlugin->Service("Epgsearch-services-v1.1", epgSearch)) { if (epgSearchPlugin->Service("Epgsearch-services-v1.1", epgSearch)) {
std::string newFileName = epgSearch->handler->Evaluate(recDir, event); std::string newFileName = epgSearch->handler->Evaluate(recDir, event);
if (strchr(newFileName.c_str(), '%') == NULL) // only set directory to new value if all categories could have been replaced if (strchr(newFileName.c_str(), '%') == NULL) // only set directory to new value if all categories could have been replaced
timer->SetFile(newFileName.c_str()); timer->SetFile(newFileName.c_str());
else else
esyslog("tvguide: timer path not set because replacing variable was not successfull: %s", newFileName.c_str()); esyslog("tvguide: timer path not set because replacing variable was not successfull: %s", newFileName.c_str());
} }
} else { } else {
@ -137,27 +175,33 @@ void cRecManager::SetTimerPath(cTimer *timer, const cEvent *event, std::string p
return; return;
} }
//Set choosen path //Set choosen path
bool addSubtitle = false;
if (!isempty(event->ShortText())) { // add subtitle if present
addSubtitle = (config.addSubtitleToTimer != addSubtitleNever);
if (config.addSubtitleToTimer == addSubtitleSmart)
if (event->Duration() > 80 * 60)
addSubtitle = false;
}
cString newFileName; cString newFileName;
if (path.size() > 0) { if (path.size() > 0) {
std::replace(path.begin(), path.end(), '/', '~'); std::replace(path.begin(), path.end(), '/', '~');
newFileName = cString::sprintf("%s~%s", path.c_str(), timer->File()); if (addSubtitle)
newFileName = cString::sprintf("%s~%s~%s", path.c_str(), event->Title(), event->ShortText());
else
newFileName = cString::sprintf("%s~%s", path.c_str(), timer->File());
} else { } else {
newFileName = event->Title(); if (addSubtitle)
newFileName = cString::sprintf("%s~%s", event->Title(), event->ShortText());
else
newFileName = event->Title();
} }
timer->SetFile(*newFileName); timer->SetFile(*newFileName);
} }
void cRecManager::DeleteTimer(int timerID) {
cTimer *t = Timers.Get(timerID);
if (!t)
return;
DeleteTimer(t);
}
void cRecManager::DeleteTimer(const cEvent *event) { void cRecManager::DeleteTimer(const cEvent *event) {
if (!event) if (!event)
return; return;
if (tvguideConfig.useRemoteTimers && pRemoteTimers) { if (config.useRemoteTimers && pRemoteTimers) {
DeleteRemoteTimer(event); DeleteRemoteTimer(event);
} else { } else {
DeleteLocalTimer(event); DeleteLocalTimer(event);
@ -165,21 +209,48 @@ void cRecManager::DeleteTimer(const cEvent *event) {
} }
void cRecManager::DeleteLocalTimer(const cEvent *event) { void cRecManager::DeleteLocalTimer(const cEvent *event) {
cTimer *t = Timers.GetMatch(event); const cTimer *t;
#if VDRVERSNUM >= 20301
{
LOCK_TIMERS_READ;
t = Timers->GetMatch(event);
}
#else
t = Timers.GetMatch(event);
#endif
if (!t) if (!t)
return; return;
DeleteTimer(t); DeleteTimer(t);
} }
void cRecManager::DeleteTimer(const cTimer *timer) {
void cRecManager::DeleteTimer(cTimer *timer) { #if VDRVERSNUM >= 20301
if (timer->Recording()) { LOCK_TIMERS_WRITE;
timer->Skip(); cTimers* timers = Timers;
cRecordControls::Process(time(NULL)); if (timer && timer->Remote() && !timer->Recording()) {
if (HandleRemoteTimerModifications(NULL, (cTimer*)timer)) {
timers->Del((cTimer*)timer);
}
timers->SetModified();
} }
isyslog("timer %s deleted", *timer->ToDescr()); cTimer* t = timers->GetTimer(timer);
Timers.Del(timer, true); #else
Timers.SetModified(); cTimers* timers = &Timers;
cTimer* t = timers->GetTimer((cTimer*)timer);
#endif
if (!t)
return;
if (t->Recording()) {
t->Skip();
#if VDRVERSNUM >= 20301
cRecordControls::Process(timers, time(NULL));
#else
cRecordControls::Process(time(NULL));
#endif
}
isyslog("timer %s deleted", *t->ToDescr());
timers->Del(t, true);
timers->SetModified();
} }
void cRecManager::DeleteRemoteTimer(const cEvent *event) { void cRecManager::DeleteRemoteTimer(const cEvent *event) {
@ -196,45 +267,89 @@ void cRecManager::DeleteRemoteTimer(const cEvent *event) {
} }
} }
void cRecManager::SaveTimer(cTimer *timer, cTimer newTimerSettings) { void cRecManager::OnOffTimer(const cEvent *event) {
if (!timer) const cTimer *t;
#if VDRVERSNUM >= 20301
{
LOCK_TIMERS_READ;
t = Timers->GetMatch(event);
}
#else
t = Timers.GetMatch(event);
#endif
if (!t)
return; return;
SaveTimer(t);
bool active = newTimerSettings.HasFlags(tfActive); }
int prio = newTimerSettings.Priority();
int lifetime = newTimerSettings.Lifetime();
time_t day = newTimerSettings.Day();
int start = newTimerSettings.Start();
int stop = newTimerSettings.Stop();
std::string fileName = newTimerSettings.File();
timer->SetDay(day); void cRecManager::SaveTimer(const cTimer *t, cTimer *newTimerSettings) {
timer->SetStart(start); if (!t)
timer->SetStop(stop); return;
timer->SetPriority(prio);
timer->SetLifetime(lifetime); #if VDRVERSNUM >= 20301
timer->SetFile(fileName.c_str()); LOCK_TIMERS_WRITE;
cTimers* timers = Timers;
if (timer->HasFlags(tfActive) && !active) timers->SetExplicitModify();
timer->ClrFlags(tfActive); if (t && t->Remote()) {
else if (!timer->HasFlags(tfActive) && active) if (!HandleRemoteTimerModifications(newTimerSettings, (cTimer *)t)) {
timer->SetFlags(tfActive); esyslog(tr("tvguide: RemoteTimerModifications failed"));
}
}
cTimer *timer = timers->GetTimer(t);
#else
cTimers* timers = &Timers;
cTimer *timer = timers->GetTimer((cTimer *)t);
#endif
if (!timer) {
return;
}
bool active = true;
if (newTimerSettings) {
int prio = newTimerSettings->Priority();
int lifetime = newTimerSettings->Lifetime();
time_t day = newTimerSettings->Day();
int start = newTimerSettings->Start();
int stop = newTimerSettings->Stop();
std::string fileName = newTimerSettings->File();
timer->SetDay(day);
timer->SetStart(start);
timer->SetStop(stop);
timer->SetPriority(prio);
timer->SetLifetime(lifetime);
timer->SetFile(fileName.c_str());
active = newTimerSettings->HasFlags(tfActive);
} else
active = !timer->HasFlags(tfActive);
if (active)
timer->SetFlags(tfActive);
else
timer->ClrFlags(tfActive);
#if VDRVERSNUM < 20300
timer->SetEventFromSchedule(); timer->SetEventFromSchedule();
if (tvguideConfig.useRemoteTimers && pRemoteTimers) { #endif
if (config.useRemoteTimers && pRemoteTimers) {
RemoteTimers_Timer_v1_0 rt; RemoteTimers_Timer_v1_0 rt;
rt.timer = timer; rt.timer = timer;
if (!pRemoteTimers->Service("RemoteTimers::ModTimer-v1.0", &rt)) if (!pRemoteTimers->Service("RemoteTimers::ModTimer-v1.0", &rt))
rt.timer = NULL; rt.timer = NULL;
RefreshRemoteTimers(); RefreshRemoteTimers();
} else { } else {
Timers.SetModified(); timers->SetModified();
} }
} }
bool cRecManager::IsRecorded(const cEvent *event) { bool cRecManager::IsRecorded(const cEvent *event) {
#if VDRVERSNUM >= 20301
LOCK_TIMERS_WRITE;
cTimer *timer = Timers->GetMatch(event);
#else
cTimer *timer = Timers.GetMatch(event); cTimer *timer = Timers.GetMatch(event);
#endif
if (!timer) if (!timer)
return false; return false;
return timer->Recording(); return timer->Recording();
@ -260,16 +375,24 @@ cTVGuideTimerConflicts *cRecManager::CheckTimerConflict(void) {
} }
void cRecManager::CreateSeriesTimer(cTimer *seriesTimer) { void cRecManager::CreateSeriesTimer(cTimer *seriesTimer) {
#if VDRVERSNUM < 20300
seriesTimer->SetEventFromSchedule(); seriesTimer->SetEventFromSchedule();
if (tvguideConfig.useRemoteTimers && pRemoteTimers) { #endif
if (config.useRemoteTimers && pRemoteTimers) {
RemoteTimers_Timer_v1_0 rt; RemoteTimers_Timer_v1_0 rt;
rt.timer = seriesTimer; rt.timer = seriesTimer;
if (!pRemoteTimers->Service("RemoteTimers::NewTimer-v1.0", &rt)) if (!pRemoteTimers->Service("RemoteTimers::NewTimer-v1.0", &rt))
isyslog("%s", *rt.errorMsg); isyslog("%s", *rt.errorMsg);
RefreshRemoteTimers(); RefreshRemoteTimers();
} else { } else {
Timers.Add(seriesTimer); #if VDRVERSNUM >= 20301
Timers.SetModified(); LOCK_TIMERS_WRITE;
cTimers* timers = Timers;
#else
cTimers* timers = &Timers;
#endif
timers->Add(seriesTimer);
timers->SetModified();
} }
} }
@ -316,9 +439,16 @@ const cEvent **cRecManager::PerformSearchTimerSearch(std::string epgSearchString
numResults = results.size(); numResults = results.size();
if (numResults > 0) { if (numResults > 0) {
searchResults = new const cEvent *[numResults]; searchResults = new const cEvent *[numResults];
cSchedulesLock schedulesLock;
const cSchedules *schedules; const cSchedules *schedules;
#if VDRVERSNUM >= 20301
{
LOCK_SCHEDULES_READ;
schedules = Schedules;
}
#else
cSchedulesLock schedulesLock;
schedules = cSchedules::Schedules(schedulesLock); schedules = cSchedules::Schedules(schedulesLock);
#endif
const cEvent *event = NULL; const cEvent *event = NULL;
int index=0; int index=0;
for (std::list<std::string>::iterator it=results.begin(); it != results.end(); ++it) { for (std::list<std::string>::iterator it=results.begin(); it != results.end(); ++it) {
@ -328,13 +458,21 @@ const cEvent **cRecManager::PerformSearchTimerSearch(std::string epgSearchString
int eventID = atoi(flds[1].c_str()); int eventID = atoi(flds[1].c_str());
std::string channelID = flds[7]; std::string channelID = flds[7];
tChannelID chanID = tChannelID::FromString(channelID.c_str()); tChannelID chanID = tChannelID::FromString(channelID.c_str());
cChannel *channel = Channels.GetByChannelID(chanID); const cChannel *channel;
#if VDRVERSNUM >= 20301
{
LOCK_CHANNELS_READ;
channel = Channels->GetByChannelID(chanID);
}
#else
channel = Channels.GetByChannelID(chanID);
#endif
if (channel) { if (channel) {
const cSchedule *Schedule = NULL; const cSchedule *Schedule = NULL;
Schedule = schedules->GetSchedule(channel); Schedule = schedules->GetSchedule(channel);
event = Schedule->GetEvent(eventID); event = Schedule->GetEvent(eventID);
if (event) { if (event) {
searchResults[index] = event; searchResults[index] = event;
} else } else
return NULL; return NULL;
} else } else
@ -389,6 +527,52 @@ void cRecManager::GetSearchTimers(std::vector<cTVGuideSearchTimer> *searchTimer)
std::sort(searchTimer->begin(), searchTimer->end()); std::sort(searchTimer->begin(), searchTimer->end());
} }
void cRecManager::GetSearchExtCats(std::vector<std::string> *searchExtCats) {
if (!epgSearchAvailable) {
return;
}
Epgsearch_services_v1_1 *epgSearch = new Epgsearch_services_v1_1;
if (epgSearchPlugin->Service("Epgsearch-services-v1.1", epgSearch)) {
std::list<std::string> list;
list = epgSearch->handler->ExtEPGInfoList();
for (std::list<std::string>::iterator it = list.begin(); it != list.end(); it++) {
searchExtCats->push_back(*it);
}
}
}
void cRecManager::GetChannelGroups(std::vector<std::string> *channelGroups) {
if (!epgSearchAvailable) {
return;
}
Epgsearch_services_v1_1 *epgSearch = new Epgsearch_services_v1_1;
if (epgSearchPlugin->Service("Epgsearch-services-v1.1", epgSearch)) {
std::list<std::string> list;
list = epgSearch->handler->ChanGrpList();
for (std::list<std::string>::iterator it = list.begin(); it != list.end(); it++) {
channelGroups->push_back(*it);
}
}
std::sort(channelGroups->begin(), channelGroups->end());
}
void cRecManager::GetBlacklists(std::vector<std::string> *blacklists) {
if (!epgSearchAvailable) {
return;
}
Epgsearch_services_v1_1 *epgSearch = new Epgsearch_services_v1_1;
if (epgSearchPlugin->Service("Epgsearch-services-v1.1", epgSearch)) {
std::list<std::string> list;
list = epgSearch->handler->BlackList();
for (std::list<std::string>::iterator it = list.begin(); it != list.end(); it++) {
blacklists->push_back(*it);
}
}
}
int cRecManager::CreateSearchTimer(std::string epgSearchString) { int cRecManager::CreateSearchTimer(std::string epgSearchString) {
int timerID = -1; int timerID = -1;
if (!epgSearchAvailable) if (!epgSearchAvailable)
@ -435,24 +619,33 @@ void cRecManager::DeleteSearchTimer(cTVGuideSearchTimer *searchTimer, bool delTi
return; return;
int searchTimerID = searchTimer->GetID(); int searchTimerID = searchTimer->GetID();
if (delTimers) { if (delTimers) {
cTimer *timer = Timers.First(); cTimers* timers;
while(timer) { #if VDRVERSNUM >= 20301
{
LOCK_TIMERS_WRITE;
timers = Timers;
}
#else
timers = &Timers;
#endif
cTimer *timer = timers->First();
while (timer) {
if (!timer->Recording()) { if (!timer->Recording()) {
char* searchID = GetAuxValue(timer, "s-id"); char* searchID = GetAuxValue(timer, "s-id");
if (searchID) { if (searchID) {
if (searchTimerID == atoi(searchID)) { if (searchTimerID == atoi(searchID)) {
cTimer* timerNext = Timers.Next(timer); cTimer* timerNext = timers->Next(timer);
DeleteTimer(timer); DeleteTimer(timer);
timer = timerNext; timer = timerNext;
} else { } else {
timer = Timers.Next(timer); timer = timers->Next(timer);
} }
free(searchID); free(searchID);
} else { } else {
timer = Timers.Next(timer); timer = timers->Next(timer);
} }
} else { } else {
timer = Timers.Next(timer); timer = timers->Next(timer);
} }
} }
} }
@ -460,11 +653,11 @@ void cRecManager::DeleteSearchTimer(cTVGuideSearchTimer *searchTimer, bool delTi
if (epgSearchPlugin->Service("Epgsearch-services-v1.1", epgSearch)) { if (epgSearchPlugin->Service("Epgsearch-services-v1.1", epgSearch)) {
bool success = epgSearch->handler->DelSearchTimer(searchTimerID); bool success = epgSearch->handler->DelSearchTimer(searchTimerID);
if (success) { if (success) {
esyslog("tvguide: search timer \"%s\" sucessfully deleted", searchTimer->SearchString().c_str()); esyslog("tvguide: search timer \"%s\" sucessfully deleted", searchTimer->GetSearchString().c_str());
} else { } else {
esyslog("tvguide: error deleting search timer \"%s\"", searchTimer->SearchString().c_str()); esyslog("tvguide: error deleting search timer \"%s\"", searchTimer->GetSearchString().c_str());
} }
} }
} }
void cRecManager::UpdateSearchTimers(void) { void cRecManager::UpdateSearchTimers(void) {
@ -475,14 +668,14 @@ void cRecManager::UpdateSearchTimers(void) {
} }
} }
// announceOnly: 0 = switch, 1 = announce only, 2 = ask for switch // switchMode: 0 = switch, 1 = announce only, 2 = ask for switch
bool cRecManager::CreateSwitchTimer(const cEvent *event, cSwitchTimer switchTimer) { bool cRecManager::CreateSwitchTimer(const cEvent *event, cSwitchTimer switchTimer) {
if (epgSearchAvailable && event) { if (epgSearchAvailable && event) {
Epgsearch_switchtimer_v1_0 data; Epgsearch_switchtimer_v1_0 data;
data.event = event; data.event = event;
data.mode = 1; data.mode = 1;
data.switchMinsBefore = switchTimer.switchMinsBefore; data.switchMinsBefore = switchTimer.switchMinsBefore;
data.announceOnly = switchTimer.announceOnly; data.announceOnly = switchTimer.switchMode;
data.success = false; data.success = false;
epgSearchPlugin->Service("Epgsearch-switchtimer-v1.0", &data); epgSearchPlugin->Service("Epgsearch-switchtimer-v1.0", &data);
cSwitchTimer *t = new cSwitchTimer(event); cSwitchTimer *t = new cSwitchTimer(event);
@ -505,22 +698,29 @@ void cRecManager::DeleteSwitchTimer(const cEvent *event) {
} }
} }
cRecording **cRecManager::SearchForRecordings(std::string searchString, int &numResults) { const cRecording **cRecManager::SearchForRecordings(std::string searchString, int &numResults) {
cRecording **matchingRecordings = NULL; const cRecording **matchingRecordings = NULL;
int num = 0; int num = 0;
numResults = 0; numResults = 0;
for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording)) { #if VDRVERSNUM >= 20301
LOCK_RECORDINGS_READ;
const cRecordings* recordings = Recordings;
#else
const cRecordings* recordings = &Recordings;
#endif
for (const cRecording *recording = recordings->First(); recording; recording = recordings->Next(recording)) {
std::string s1 = recording->Name(); std::string s1 = recording->Name();
std::string s2 = searchString; std::string s2 = searchString;
if (s1.empty() || s2.empty()) continue; if (s1.empty() || s2.empty()) continue;
// tolerance for fuzzy searching: 90% of the shorter text length, but at least 1 // tolerance for fuzzy searching: 90% of the shorter text length, but at least 1
int tolerance = std::max(1, (int)std::min(s1.size(), s2.size()) / 10); int tolerance = std::max(1, (int)std::min(s1.size(), s2.size()) / 10);
bool match = FindIgnoreCase(s1, s2) >= 0 || FindIgnoreCase(s2, s1) >= 0; bool match = FindIgnoreCase(s1, s2) >= 0 || FindIgnoreCase(s2, s1) >= 0;
if (!match) { if (!match) {
AFUZZY af = { NULL, NULL, NULL, NULL, NULL, NULL, { 0 }, { 0 }, 0, 0, 0, 0, 0, 0 }; AFUZZY af = { NULL, NULL, NULL, NULL, NULL, NULL, { 0 }, { 0 }, 0, 0, 0, 0, 0, 0 };
if (s1.size() > 32) s1 = s1.substr(0, 32); if (s1.size() > 32) s1 = s1.substr(0, 32);
@ -530,7 +730,7 @@ cRecording **cRecManager::SearchForRecordings(std::string searchString, int &num
afuzzy_free(&af); afuzzy_free(&af);
match = (res > 0); match = (res > 0);
} }
if (!match) { if (!match) {
AFUZZY af = { NULL, NULL, NULL, NULL, NULL, NULL, { 0 }, { 0 }, 0, 0, 0, 0, 0, 0 }; AFUZZY af = { NULL, NULL, NULL, NULL, NULL, NULL, { 0 }, { 0 }, 0, 0, 0, 0, 0, 0 };
if (s2.size() > 32) s2 = s2.substr(0, 32); if (s2.size() > 32) s2 = s2.substr(0, 32);
@ -540,9 +740,9 @@ cRecording **cRecManager::SearchForRecordings(std::string searchString, int &num
afuzzy_free(&af); afuzzy_free(&af);
match = (res > 0); match = (res > 0);
} }
if (match) { if (match) {
matchingRecordings = (cRecording **)realloc(matchingRecordings, (num + 1) * sizeof(cRecording *)); matchingRecordings = (const cRecording **)realloc(matchingRecordings, (num + 1) * sizeof(cRecording *));
matchingRecordings[num++] = recording; matchingRecordings[num++] = recording;
} }
} }
@ -558,12 +758,12 @@ const cEvent **cRecManager::LoadReruns(const cEvent *event, int &numResults) {
if (epgSearchAvailable && !isempty(event->Title())) { if (epgSearchAvailable && !isempty(event->Title())) {
Epgsearch_searchresults_v1_0 data; Epgsearch_searchresults_v1_0 data;
std::string strQuery = event->Title(); std::string strQuery = event->Title();
if (tvguideConfig.useSubtitleRerun > 0) { if (config.useSubtitleRerun > 0) {
if (tvguideConfig.useSubtitleRerun == 2 || !isempty(event->ShortText())) if (config.useSubtitleRerun == 2 || !isempty(event->ShortText()))
strQuery += "~"; strQuery += "~";
if (!isempty(event->ShortText())) if (!isempty(event->ShortText()))
strQuery += event->ShortText(); strQuery += event->ShortText();
data.useSubTitle = true; data.useSubTitle = true;
} else { } else {
data.useSubTitle = false; data.useSubTitle = false;
} }
@ -572,7 +772,7 @@ const cEvent **cRecManager::LoadReruns(const cEvent *event, int &numResults) {
data.channelNr = 0; data.channelNr = 0;
data.useTitle = true; data.useTitle = true;
data.useDescription = false; data.useDescription = false;
if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data)) { if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data)) {
cList<Epgsearch_searchresults_v1_0::cServiceSearchResult>* list = data.pResultList; cList<Epgsearch_searchresults_v1_0::cServiceSearchResult>* list = data.pResultList;
if (!list) if (!list)
@ -619,17 +819,25 @@ void cRecManager::GetFavorites(std::vector<cTVGuideSearchTimer> *favorites) {
const cEvent **cRecManager::WhatsOnNow(bool nowOrNext, int &numResults) { const cEvent **cRecManager::WhatsOnNow(bool nowOrNext, int &numResults) {
std::vector<const cEvent*> tmpResults; std::vector<const cEvent*> tmpResults;
#if VDRVERSNUM >= 20301
LOCK_CHANNELS_READ;
const cChannels* channels = Channels;
LOCK_SCHEDULES_READ;
const cSchedules* schedules = Schedules;
#else
cChannels* channels = &Channels;
cSchedulesLock schedulesLock; cSchedulesLock schedulesLock;
const cSchedules *schedules = cSchedules::Schedules(schedulesLock); const cSchedules *schedules = cSchedules::Schedules(schedulesLock);
#endif
const cChannel *startChannel = NULL, *stopChannel = NULL; const cChannel *startChannel = NULL, *stopChannel = NULL;
if (tvguideConfig.favLimitChannels) { if (config.favLimitChannels) {
startChannel = Channels.GetByNumber(tvguideConfig.favStartChannel); startChannel = channels->GetByNumber(config.favStartChannel);
stopChannel = Channels.GetByNumber(tvguideConfig.favStopChannel); stopChannel = channels->GetByNumber(config.favStopChannel);
} }
if (!startChannel) if (!startChannel)
startChannel = Channels.First(); startChannel = channels->First();
for (const cChannel *channel = startChannel; channel; channel = Channels.Next(channel)) { for (const cChannel *channel = startChannel; channel; channel = channels->Next(channel)) {
if (channel->GroupSep()) continue; if (channel->GroupSep()) continue;
const cSchedule *Schedule = schedules->GetSchedule(channel); const cSchedule *Schedule = schedules->GetSchedule(channel);
if (!Schedule) continue; if (!Schedule) continue;
@ -648,7 +856,7 @@ const cEvent **cRecManager::WhatsOnNow(bool nowOrNext, int &numResults) {
numResults = tmpResults.size(); numResults = tmpResults.size();
const cEvent **results = new const cEvent *[numResults]; const cEvent **results = new const cEvent *[numResults];
for (int i=0; i<numResults; i++) { for (int i=0; i<numResults; i++) {
results[i] = tmpResults[i]; results[i] = tmpResults[i];
} }
return results; return results;
@ -658,13 +866,13 @@ const cEvent **cRecManager::UserDefinedTime(int userTime, int &numResults) {
std::vector<const cEvent*> tmpResults; std::vector<const cEvent*> tmpResults;
int favTime = 0; int favTime = 0;
if (userTime == 1) { if (userTime == 1) {
favTime = tvguideConfig.favTime1; favTime = config.favTime1;
} else if (userTime == 2) { } else if (userTime == 2) {
favTime = tvguideConfig.favTime2; favTime = config.favTime2;
} else if (userTime == 3) { } else if (userTime == 3) {
favTime = tvguideConfig.favTime3; favTime = config.favTime3;
} else if (userTime == 4) { } else if (userTime == 4) {
favTime = tvguideConfig.favTime4; favTime = config.favTime4;
} }
time_t now = time(0); time_t now = time(0);
@ -679,17 +887,25 @@ const cEvent **cRecManager::UserDefinedTime(int userTime, int &numResults) {
if (searchTime < now) if (searchTime < now)
searchTime += 24*60*60; searchTime += 24*60*60;
#if VDRVERSNUM >= 20301
LOCK_CHANNELS_READ;
const cChannels* channels = Channels;
LOCK_SCHEDULES_READ;
const cSchedules* schedules = Schedules;
#else
cChannels* channels = &Channels;
cSchedulesLock schedulesLock; cSchedulesLock schedulesLock;
const cSchedules *schedules = cSchedules::Schedules(schedulesLock); const cSchedules *schedules = cSchedules::Schedules(schedulesLock);
#endif
const cChannel *startChannel = NULL, *stopChannel = NULL; const cChannel *startChannel = NULL, *stopChannel = NULL;
if (tvguideConfig.favLimitChannels) { if (config.favLimitChannels) {
startChannel = Channels.GetByNumber(tvguideConfig.favStartChannel); startChannel = channels->GetByNumber(config.favStartChannel);
stopChannel = Channels.GetByNumber(tvguideConfig.favStopChannel); stopChannel = channels->GetByNumber(config.favStopChannel);
} }
if (!startChannel) if (!startChannel)
startChannel = Channels.First(); startChannel = channels->First();
for (const cChannel *channel = startChannel; channel; channel = Channels.Next(channel)) { for (const cChannel *channel = startChannel; channel; channel = channels->Next(channel)) {
if (channel->GroupSep()) continue; if (channel->GroupSep()) continue;
const cSchedule *Schedule = schedules->GetSchedule(channel); const cSchedule *Schedule = schedules->GetSchedule(channel);
if (!Schedule) continue; if (!Schedule) continue;
@ -708,7 +924,7 @@ const cEvent **cRecManager::UserDefinedTime(int userTime, int &numResults) {
numResults = tmpResults.size(); numResults = tmpResults.size();
const cEvent **results = new const cEvent *[numResults]; const cEvent **results = new const cEvent *[numResults];
for (int i=0; i<numResults; i++) { for (int i=0; i<numResults; i++) {
results[i] = tmpResults[i]; results[i] = tmpResults[i];
} }
return results; return results;
} }

View File

@ -28,17 +28,17 @@ public:
bool EpgSearchAvailable(void) {return epgSearchAvailable;}; bool EpgSearchAvailable(void) {return epgSearchAvailable;};
bool RefreshRemoteTimers(void); bool RefreshRemoteTimers(void);
bool CheckEventForTimer(const cEvent *event); bool CheckEventForTimer(const cEvent *event);
cTimer *GetTimerForEvent(const cEvent *event); const cTimer *GetTimerForEvent(const cEvent *event);
cTimer *createTimer(const cEvent *event, std::string path = ""); cTimer *createTimer(const cEvent *event, std::string path = "");
cTimer *createLocalTimer(const cEvent *event, std::string path); cTimer *createLocalTimer(const cEvent *event, std::string path);
cTimer *createRemoteTimer(const cEvent *event, std::string path); cTimer *createRemoteTimer(const cEvent *event, std::string path);
void SetTimerPath(cTimer *timer, const cEvent *event, std::string path); void SetTimerPath(cTimer *timer, const cEvent *event, std::string path);
void DeleteTimer(cTimer *timer); void OnOffTimer(const cEvent *event);
void DeleteTimer(int timerID); void DeleteTimer(const cTimer *timer);
void DeleteTimer(const cEvent *event); void DeleteTimer(const cEvent *event);
void DeleteLocalTimer(const cEvent *event); void DeleteLocalTimer(const cEvent *event);
void DeleteRemoteTimer(const cEvent *event); void DeleteRemoteTimer(const cEvent *event);
void SaveTimer(cTimer *timer, cTimer newTimerSettings); void SaveTimer(const cTimer *timer, cTimer *newTimerSettings = NULL);
bool IsRecorded(const cEvent *event); bool IsRecorded(const cEvent *event);
cTVGuideTimerConflicts *CheckTimerConflict(void); cTVGuideTimerConflicts *CheckTimerConflict(void);
void CreateSeriesTimer(cTimer *seriesTimer); void CreateSeriesTimer(cTimer *seriesTimer);
@ -46,13 +46,16 @@ public:
const cEvent **PerformSearch(Epgsearch_searchresults_v1_0 data, int &numResults); const cEvent **PerformSearch(Epgsearch_searchresults_v1_0 data, int &numResults);
void ReadEPGSearchTemplates(std::vector<TVGuideEPGSearchTemplate> *epgTemplates); void ReadEPGSearchTemplates(std::vector<TVGuideEPGSearchTemplate> *epgTemplates);
void GetSearchTimers(std::vector<cTVGuideSearchTimer> *timers); void GetSearchTimers(std::vector<cTVGuideSearchTimer> *timers);
void GetSearchExtCats(std::vector<std::string> *searchExtCats);
void GetChannelGroups(std::vector<std::string> *channelGroups);
void GetBlacklists(std::vector<std::string> *blacklists);
int CreateSearchTimer(std::string epgSearchString); int CreateSearchTimer(std::string epgSearchString);
bool SaveSearchTimer(cTVGuideSearchTimer *searchTimer); bool SaveSearchTimer(cTVGuideSearchTimer *searchTimer);
void DeleteSearchTimer(cTVGuideSearchTimer *searchTimer, bool delTimers); void DeleteSearchTimer(cTVGuideSearchTimer *searchTimer, bool delTimers);
void UpdateSearchTimers(void); void UpdateSearchTimers(void);
bool CreateSwitchTimer(const cEvent *event, cSwitchTimer switchTimer); bool CreateSwitchTimer(const cEvent *event, cSwitchTimer switchTimer);
void DeleteSwitchTimer(const cEvent *event); void DeleteSwitchTimer(const cEvent *event);
cRecording **SearchForRecordings(std::string searchString, int &numResults); const cRecording **SearchForRecordings(std::string searchString, int &numResults);
const cEvent **LoadReruns(const cEvent *event, int &numResults); const cEvent **LoadReruns(const cEvent *event, int &numResults);
void GetFavorites(std::vector<cTVGuideSearchTimer> *favorites); void GetFavorites(std::vector<cTVGuideSearchTimer> *favorites);
const cEvent **WhatsOnNow(bool nowOrNext, int &numResults); const cEvent **WhatsOnNow(bool nowOrNext, int &numResults);
@ -60,4 +63,4 @@ public:
virtual ~cRecManager (void); virtual ~cRecManager (void);
}; };
#endif //__TVGUIDE_RECMMANAGER_H #endif //__TVGUIDE_RECMMANAGER_H

140
recmenu.c
View File

@ -5,7 +5,7 @@
cRecMenu::cRecMenu(void) { cRecMenu::cRecMenu(void) {
border = geoManager.borderRecMenus; border = geoManager.borderRecMenus;
height = 2*border; height = 2 * border;
headerHeight = 0; headerHeight = 0;
footerHeight = 0; footerHeight = 0;
currentHeight = 0; currentHeight = 0;
@ -28,7 +28,7 @@ cRecMenu::~cRecMenu(void) {
if (footer) if (footer)
delete footer; delete footer;
if (pixmapScrollBar) if (pixmapScrollBar)
osdManager.releasePixmap(pixmapScrollBar); osdManager.DestroyPixmap(pixmapScrollBar);
if (imgScrollBar) if (imgScrollBar)
delete imgScrollBar; delete imgScrollBar;
} }
@ -54,49 +54,53 @@ int cRecMenu::CalculateOptimalWidth(void) {
} }
bool cRecMenu::CalculateHeight(bool reDraw) { bool cRecMenu::CalculateHeight(bool reDraw) {
int newHeight = 2*border; int newHeight = 2 * border;
if (header) bool returnvalue = false;
if (header) {
newHeight += headerHeight; newHeight += headerHeight;
for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
newHeight += (*item)->GetHeight();
} }
if (footer) for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
newHeight += (*item)->GetHeight();
}
if (footer) {
newHeight += footerHeight; newHeight += footerHeight;
}
y = (geoManager.osdHeight - newHeight) / 2; y = (geoManager.osdHeight - newHeight) / 2;
if (newHeight != height) { if (newHeight != height) {
height = newHeight; height = newHeight;
if (scrollable && !reDraw) { returnvalue = true;
width += scrollbarWidth + border;
}
return true;
} }
return false; if (scrollable && !reDraw) {
width += scrollbarWidth + border;
returnvalue = true;
}
return returnvalue;
} }
void cRecMenu::CreatePixmap(void) { void cRecMenu::CreatePixmap(void) {
if (pixmap) if (pixmap)
osdManager.releasePixmap(pixmap); osdManager.DestroyPixmap(pixmap);
pixmap = osdManager.requestPixmap(3, cRect(x, y, width, height)); pixmap = osdManager.CreatePixmap(3, cRect(x, y, width, height));
if (scrollable) { if (scrollable) {
int scrollBarX = x + width - scrollbarWidth - border; int scrollBarX = x + width - scrollbarWidth - border;
int scrollBarY = y + border + headerHeight; int scrollBarY = y + border + headerHeight;
int scrollBarHeight = height - headerHeight - footerHeight - 2 * border; int scrollBarHeight = height - headerHeight - footerHeight - 2 * border;
if (pixmapScrollBar) if (pixmapScrollBar)
osdManager.releasePixmap(pixmapScrollBar); osdManager.DestroyPixmap(pixmapScrollBar);
pixmapScrollBar = osdManager.requestPixmap(4, cRect(scrollBarX, scrollBarY, scrollbarWidth, scrollBarHeight)); pixmapScrollBar = osdManager.CreatePixmap(4, cRect(scrollBarX, scrollBarY, scrollbarWidth, scrollBarHeight));
} else } else
pixmapScrollBar = NULL; pixmapScrollBar = NULL;
} }
void cRecMenu::SetHeader(cRecMenuItem *header) { void cRecMenu::AddHeader(cRecMenuItem *header) {
this->header = header; this->header = header;
headerHeight = header->GetHeight(); headerHeight = header->GetHeight();
height += headerHeight; height += headerHeight;
} }
void cRecMenu::SetFooter(cRecMenuItem *footer) { void cRecMenu::AddFooter(cRecMenuItem *footer) {
this->footer = footer; this->footer = footer;
footerHeight = footer->GetHeight(); footerHeight = footer->GetHeight();
height += footerHeight; height += footerHeight;
@ -117,12 +121,11 @@ void cRecMenu::InitMenu(bool complete) {
numItems = 0; numItems = 0;
if (scrollable) { if (scrollable) {
width -= scrollbarWidth + border; width -= scrollbarWidth + border;
osdManager.releasePixmap(pixmapScrollBar); osdManager.DestroyPixmap(pixmapScrollBar);
pixmapScrollBar = NULL; pixmapScrollBar = NULL;
delete imgScrollBar; DELETENULL(imgScrollBar);
imgScrollBar = NULL;
} }
osdManager.releasePixmap(pixmap); osdManager.DestroyPixmap(pixmap);
pixmap = NULL; pixmap = NULL;
for (std::list<cRecMenuItem*>::iterator it = menuItems.begin(); it != menuItems.end(); it++) { for (std::list<cRecMenuItem*>::iterator it = menuItems.begin(); it != menuItems.end(); it++) {
if (deleteMenuItems) if (deleteMenuItems)
@ -141,7 +144,6 @@ void cRecMenu::InitMenu(bool complete) {
} }
void cRecMenu::AddMenuItem(cRecMenuItem *item, bool inFront) { void cRecMenu::AddMenuItem(cRecMenuItem *item, bool inFront) {
item->Show(); item->Show();
if (!inFront) if (!inFront)
@ -153,7 +155,7 @@ void cRecMenu::AddMenuItem(cRecMenuItem *item, bool inFront) {
bool cRecMenu::AddMenuItemInitial(cRecMenuItem *item, bool inFront) { bool cRecMenu::AddMenuItemInitial(cRecMenuItem *item, bool inFront) {
currentHeight += item->GetHeight(); currentHeight += item->GetHeight();
int totalHeight = headerHeight + footerHeight + currentHeight + 2*border; int totalHeight = headerHeight + footerHeight + currentHeight + 2*border;
if (totalHeight >= geoManager.osdHeight - 10) { if (totalHeight >= geoManager.osdHeight - 80) {
scrollable = true; scrollable = true;
currentHeight -= item->GetHeight(); currentHeight -= item->GetHeight();
if (deleteMenuItems) { if (deleteMenuItems) {
@ -176,14 +178,14 @@ void cRecMenu::Activate(cRecMenuItem *itemOld, cRecMenuItem *item) {
itemOld->setInactive(); itemOld->setInactive();
itemOld->setBackground(); itemOld->setBackground();
itemOld->Draw(); itemOld->Draw();
item->setActive(); item->SetActive();
item->setBackground(); item->setBackground();
item->Draw(); item->Draw();
} }
bool cRecMenu::ActivatePrev(void) { bool cRecMenu::ActivatePrev(void) {
cRecMenuItem *activeItem = GetActiveMenuItem(); cRecMenuItem *activeItem = GetActiveMenuItem();
if (!scrollable && footer && footer->isActive()) { if (!scrollable && footer && footer->IsActive()) {
if (menuItems.size() > 0) { if (menuItems.size() > 0) {
cRecMenuItem *itemLast = menuItems.back(); cRecMenuItem *itemLast = menuItems.back();
Activate(footer, itemLast); Activate(footer, itemLast);
@ -214,7 +216,7 @@ bool cRecMenu::ActivatePrev(void) {
} }
bool cRecMenu::ScrollUp(void) { bool cRecMenu::ScrollUp(void) {
if (footer && footer->isActive()) { if (footer && footer->IsActive()) {
if (menuItems.size() > 0) if (menuItems.size() > 0)
Activate(footer, menuItems.back()); Activate(footer, menuItems.back());
} else { } else {
@ -272,7 +274,7 @@ bool cRecMenu::ActivateNext(void) {
if (next) { if (next) {
Activate(activeItem , next); Activate(activeItem , next);
return true; return true;
} else if (!scrollable && footer && footer->isSelectable() && !footer->isActive()) { } else if (!scrollable && footer && footer->isSelectable() && !footer->IsActive()) {
Activate(activeItem , footer); Activate(activeItem , footer);
return true; return true;
} }
@ -310,7 +312,7 @@ bool cRecMenu::ScrollDown(void) {
ActivateNext(); ActivateNext();
} else { } else {
//last item reached, activate footer if not already active //last item reached, activate footer if not already active
if ((footer) && !(footer->isActive())) { if ((footer) && !(footer->IsActive())) {
cRecMenuItem *activeItem = GetActiveMenuItem(); cRecMenuItem *activeItem = GetActiveMenuItem();
Activate(activeItem , footer); Activate(activeItem , footer);
} else { } else {
@ -332,7 +334,7 @@ void cRecMenu::PageUp(void) {
Activate(footer, menuItems.front()); Activate(footer, menuItems.front());
return; return;
} }
int newActive = GetActive() - numItems; int newActive = GetNumActive() - numItems;
if (newActive < 0) if (newActive < 0)
newActive = 0; newActive = 0;
activeItem->setInactive(); activeItem->setInactive();
@ -345,7 +347,7 @@ void cRecMenu::PageUp(void) {
bool spaceLeft = true; bool spaceLeft = true;
while (newItem = GetMenuItem(startIndex-1)) { while (newItem = GetMenuItem(startIndex-1)) {
if (startIndex-1 == newActive) if (startIndex-1 == newActive)
newItem->setActive(); newItem->SetActive();
spaceLeft = AddMenuItemInitial(newItem, true); spaceLeft = AddMenuItemInitial(newItem, true);
if (!spaceLeft) if (!spaceLeft)
break; break;
@ -357,8 +359,8 @@ void cRecMenu::PageUp(void) {
break; break;
} }
} }
if (GetActive() == numItems) if (GetNumActive() == numItems)
menuItems.front()->setActive(); menuItems.front()->SetActive();
if (CalculateHeight(true)) if (CalculateHeight(true))
CreatePixmap(); CreatePixmap();
Arrange(deleteMenuItems); Arrange(deleteMenuItems);
@ -376,7 +378,7 @@ void cRecMenu::PageDown(void) {
JumpEnd(); JumpEnd();
return; return;
} }
int newActive = GetActive() + numItems; int newActive = GetNumActive() + numItems;
activeItem->setInactive(); activeItem->setInactive();
activeItem->setBackground(); activeItem->setBackground();
ClearMenuItems(); ClearMenuItems();
@ -387,7 +389,7 @@ void cRecMenu::PageDown(void) {
bool spaceLeft = true; bool spaceLeft = true;
while (newItem = GetMenuItem(stopIndex)) { while (newItem = GetMenuItem(stopIndex)) {
if (stopIndex == newActive) if (stopIndex == newActive)
newItem->setActive(); newItem->SetActive();
spaceLeft = AddMenuItemInitial(newItem); spaceLeft = AddMenuItemInitial(newItem);
if (!spaceLeft) if (!spaceLeft)
break; break;
@ -399,8 +401,8 @@ void cRecMenu::PageDown(void) {
break; break;
} }
} }
if (GetActive() == GetTotalNumMenuItems()) if (GetNumActive() == GetTotalNumMenuItems())
menuItems.back()->setActive(); menuItems.back()->SetActive();
if (CalculateHeight(true)) if (CalculateHeight(true))
CreatePixmap(); CreatePixmap();
Arrange(deleteMenuItems); Arrange(deleteMenuItems);
@ -434,14 +436,16 @@ void cRecMenu::JumpBegin(void) {
if (currentItem >= numItems) if (currentItem >= numItems)
break; break;
} }
Arrange(true); if (CalculateHeight(true))
CreatePixmap();
Arrange(false);
startIndex = 0; startIndex = 0;
stopIndex = numItems-1; stopIndex = currentItem;
cRecMenuItem *first = menuItems.front(); cRecMenuItem *first = menuItems.front();
first->setActive(); first->SetActive();
first->setBackground(); first->setBackground();
first->Draw(); first->Draw();
Display(true); Display(false);
} }
} }
@ -470,7 +474,7 @@ void cRecMenu::JumpEnd(void) {
activeItem->setBackground(); activeItem->setBackground();
ClearMenuItems(); ClearMenuItems();
int totalNumItems = GetTotalNumMenuItems(); int totalNumItems = GetTotalNumMenuItems();
int currentItem = totalNumItems-1; int currentItem = totalNumItems - 1;
int itemsAdded = 0; int itemsAdded = 0;
cRecMenuItem *newItem = NULL; cRecMenuItem *newItem = NULL;
while (newItem = GetMenuItem(currentItem)) { while (newItem = GetMenuItem(currentItem)) {
@ -480,20 +484,22 @@ void cRecMenu::JumpEnd(void) {
if (itemsAdded >= numItems) if (itemsAdded >= numItems)
break; break;
} }
Arrange(true); if (CalculateHeight(true))
CreatePixmap();
Arrange(false);
stopIndex = totalNumItems; stopIndex = totalNumItems;
startIndex = stopIndex - numItems; startIndex = stopIndex - numItems;
if (footer) { if (footer) {
footer->setActive(); footer->SetActive();
footer->setBackground(); footer->setBackground();
footer->Draw(); footer->Draw();
} else { } else {
cRecMenuItem *last = menuItems.back(); cRecMenuItem *last = menuItems.back();
last->setActive(); last->SetActive();
last->setBackground(); last->setBackground();
last->Draw(); last->Draw();
} }
Display(true); Display(false);
} }
} }
@ -525,7 +531,7 @@ void cRecMenu::Arrange(bool scroll) {
} }
void cRecMenu::Display(bool scroll) { void cRecMenu::Display(bool scroll) {
if (tvguideConfig.style == eStyleGraphical) { if (config.style == eStyleGraphical) {
drawBackgroundGraphical(bgRecMenuBack); drawBackgroundGraphical(bgRecMenuBack);
} else { } else {
pixmap->Fill(theme.Color(clrBackground)); pixmap->Fill(theme.Color(clrBackground));
@ -582,13 +588,17 @@ void cRecMenu::UpdateActiveMenuItem(void) {
void cRecMenu::DrawScrollBar(void) { void cRecMenu::DrawScrollBar(void) {
if (!pixmapScrollBar)
return;
pixmapScrollBar->Fill(theme.Color(clrBorder)); pixmapScrollBar->Fill(theme.Color(clrBorder));
pixmapScrollBar->DrawRectangle(cRect(2,2,pixmapScrollBar->ViewPort().Width()-4, pixmapScrollBar->ViewPort().Height() - 4), theme.Color(clrBackground)); pixmapScrollBar->DrawRectangle(cRect(2, 2, pixmapScrollBar->ViewPort().Width() - 4, pixmapScrollBar->ViewPort().Height() - 4), theme.Color(clrBackground));
int totalNumItems = GetTotalNumMenuItems(); int totalNumItems = GetTotalNumMenuItems();
if (imgScrollBar == NULL) { if (!totalNumItems)
return;
if (!imgScrollBar) {
int scrollBarImgHeight = (pixmapScrollBar->ViewPort().Height() - 8) * numItems / totalNumItems; int scrollBarImgHeight = (pixmapScrollBar->ViewPort().Height() - 8) * numItems / totalNumItems;
imgScrollBar = createScrollbar(pixmapScrollBar->ViewPort().Width()-8, scrollBarImgHeight, theme.Color(clrHighlight), theme.Color(clrHighlightBlending)); imgScrollBar = createScrollbar(pixmapScrollBar->ViewPort().Width() - 8, scrollBarImgHeight, theme.Color(clrHighlight), theme.Color(clrHighlightBlending));
} }
int offset = (pixmapScrollBar->ViewPort().Height() - 8) * startIndex / totalNumItems; int offset = (pixmapScrollBar->ViewPort().Height() - 8) * startIndex / totalNumItems;
pixmapScrollBar->DrawImage(cPoint(4, 2 + offset), *imgScrollBar); pixmapScrollBar->DrawImage(cPoint(4, 2 + offset), *imgScrollBar);
@ -596,10 +606,10 @@ void cRecMenu::DrawScrollBar(void) {
cRecMenuItem *cRecMenu::GetActiveMenuItem(void) { cRecMenuItem *cRecMenu::GetActiveMenuItem(void) {
for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) { for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
if ((*item)->isActive()) if ((*item)->IsActive())
return *item; return *item;
} }
if (footer && footer->isActive()) if (footer && footer->IsActive())
return footer; return footer;
return NULL; return NULL;
} }
@ -614,10 +624,10 @@ cRecMenuItem *cRecMenu::GetMenuItemAt(int num) {
return NULL; return NULL;
} }
int cRecMenu::GetActive(void) { int cRecMenu::GetNumActive(void) {
int numActive = startIndex; int numActive = startIndex;
for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) { for (std::list<cRecMenuItem*>::iterator item = menuItems.begin(); item != menuItems.end(); item++) {
if ((*item)->isActive()) { if ((*item)->IsActive()) {
break; break;
} }
numActive++; numActive++;
@ -667,29 +677,25 @@ eRecMenuState cRecMenu::ProcessKey(eKeys Key) {
cImage *cRecMenu::createScrollbar(int width, int height, tColor clrBgr, tColor clrBlend) { cImage *cRecMenu::createScrollbar(int width, int height, tColor clrBgr, tColor clrBlend) {
cImage *image = new cImage(cSize(width, height)); cImage *image = new cImage(cSize(width, height));
image->Fill(clrBgr); image->Fill(clrBgr);
if (tvguideConfig.style != eStyleFlat) { if (height >= 32 && config.style != eStyleFlat) {
int numSteps = 64; int numSteps = 64;
int alphaStep = 0x03; int alphaStep = 0x03;
if (height < 30) if (height < 100) {
return image;
else if (height < 100) {
numSteps = 32; numSteps = 32;
alphaStep = 0x06; alphaStep = 0x06;
} }
int stepY = 0.5*height / numSteps; int stepY = std::max(1, (int)(0.5 * height / numSteps));
if (stepY == 0)
stepY = 1;
int alpha = 0x40; int alpha = 0x40;
tColor clr; tColor clr;
for (int i = 0; i<numSteps; i++) { for (int i = 0; i < numSteps; i++) {
clr = AlphaBlend(clrBgr, clrBlend, alpha); clr = AlphaBlend(clrBgr, clrBlend, alpha);
for (int y = i*stepY; y < (i+1)*stepY; y++) { for (int y = i * stepY; y < (i + 1) * stepY; y++) {
for (int x=0; x<width; x++) { for (int x = 0; x < width; x++) {
image->SetPixel(cPoint(x,y), clr); image->SetPixel(cPoint(x, y), clr);
} }
} }
alpha += alphaStep; alpha += alphaStep;
} }
} }
return image; return image;
} }

View File

@ -37,8 +37,8 @@ protected:
int CalculateOptimalWidth(void); int CalculateOptimalWidth(void);
bool CalculateHeight(bool reDraw = false); bool CalculateHeight(bool reDraw = false);
void CreatePixmap(void); void CreatePixmap(void);
void SetHeader(cRecMenuItem *header); void AddHeader(cRecMenuItem *header);
void SetFooter(cRecMenuItem *footer); void AddFooter(cRecMenuItem *footer);
void ClearMenuItems(bool destructor = false); void ClearMenuItems(bool destructor = false);
void InitMenu(bool complete); void InitMenu(bool complete);
bool AddMenuItemInitial(cRecMenuItem *item, bool inFront = false); bool AddMenuItemInitial(cRecMenuItem *item, bool inFront = false);
@ -53,7 +53,7 @@ protected:
virtual int GetTotalNumMenuItems(void) { return 0; }; virtual int GetTotalNumMenuItems(void) { return 0; };
virtual void CreateMenuItems(void) {}; virtual void CreateMenuItems(void) {};
int GetStartIndex(void) { return startIndex; }; int GetStartIndex(void) { return startIndex; };
int GetActive(void); int GetNumActive(void);
public: public:
cRecMenu(void); cRecMenu(void);
virtual ~cRecMenu(void); virtual ~cRecMenu(void);
@ -63,4 +63,4 @@ public:
void UpdateActiveMenuItem(void); void UpdateActiveMenuItem(void);
virtual eRecMenuState ProcessKey(eKeys Key); virtual eRecMenuState ProcessKey(eKeys Key);
}; };
#endif //__TVGUIDE_RECMENU_H #endif //__TVGUIDE_RECMENU_H

File diff suppressed because it is too large Load Diff

View File

@ -25,6 +25,7 @@ enum eRecMenuState {
rmsSearchRerunsTimerConflictMenu, rmsSearchRerunsTimerConflictMenu,
rmsSaveTimerConflictMenu, rmsSaveTimerConflictMenu,
rmsTimerConflictShowInfo, rmsTimerConflictShowInfo,
rmsOnOffTimer,
rmsDeleteTimer, rmsDeleteTimer,
rmsDeleteTimerConfirmation, rmsDeleteTimerConfirmation,
rmsEditTimer, rmsEditTimer,
@ -46,7 +47,6 @@ enum eRecMenuState {
rmsSearchTimerOptions, rmsSearchTimerOptions,
rmsSearchTimers, rmsSearchTimers,
rmsSearchTimerEdit, rmsSearchTimerEdit,
rmsSearchTimerEditAdvanced,
rmsSearchTimerTest, rmsSearchTimerTest,
rmsSearchTimerSave, rmsSearchTimerSave,
rmsSearchTimerCreateWithTemplate, rmsSearchTimerCreateWithTemplate,
@ -110,10 +110,10 @@ public:
virtual int GetHeight(void) { return height; }; virtual int GetHeight(void) { return height; };
virtual int GetWidth(void) { return 0; }; virtual int GetWidth(void) { return 0; };
virtual void CalculateHeight(int textWidth) {}; virtual void CalculateHeight(int textWidth) {};
virtual void setActive(void) { this->active = true; } virtual void SetActive(void) { this->active = true; }
virtual void setInactive(void) { this->active = false; } virtual void setInactive(void) { this->active = false; }
bool isSelectable(void) { return selectable; } bool isSelectable(void) { return selectable; }
bool isActive(void) { return active; } bool IsActive(void) { return active; }
virtual void setBackground(void); virtual void setBackground(void);
virtual void Draw(void) {}; virtual void Draw(void) {};
virtual void Hide(void) { if (pixmap) pixmap->SetLayer(-1);}; virtual void Hide(void) { if (pixmap) pixmap->SetLayer(-1);};
@ -122,8 +122,7 @@ public:
virtual time_t GetTimeValue(void) { return 0; }; virtual time_t GetTimeValue(void) { return 0; };
virtual bool GetBoolValue(void) { return false; }; virtual bool GetBoolValue(void) { return false; };
virtual cString GetStringValue(void) { return cString(""); }; virtual cString GetStringValue(void) { return cString(""); };
virtual const cEvent *GetEventValue(void) { return NULL; }; virtual const cEvent *GetEvent(void) { return NULL; };
virtual cTimer *GetTimerValue(void) { return NULL; };
virtual eRecMenuState ProcessKey(eKeys Key) { return rmsNotConsumed; }; virtual eRecMenuState ProcessKey(eKeys Key) { return rmsNotConsumed; };
}; };
@ -175,12 +174,18 @@ public:
// --- cRecMenuItemInfo ------------------------------------------------------- // --- cRecMenuItemInfo -------------------------------------------------------
class cRecMenuItemInfo : public cRecMenuItem { class cRecMenuItemInfo : public cRecMenuItem {
private: private:
int numLines;
cString text; cString text;
std::string line1;
std::string line2;
std::string line3;
std::string line4;
cTextWrapper wrapper; cTextWrapper wrapper;
int border; int border;
const cFont *fontInfo; const cFont *fontInfo;
public: public:
cRecMenuItemInfo(const char *text, bool largeFont = false); cRecMenuItemInfo(const char *text, bool largeFont = false);
cRecMenuItemInfo(std::string line1, int numLines = 1, std::string line2 = "", std::string line3 = "", std::string line4 = "", int width = 80, bool largeFont = false);
virtual ~cRecMenuItemInfo(void); virtual ~cRecMenuItemInfo(void);
void setBackground(void); void setBackground(void);
void CalculateHeight(int textWidth); void CalculateHeight(int textWidth);
@ -200,7 +205,6 @@ private:
void DrawValue(void); void DrawValue(void);
public: public:
cRecMenuItemInt(cString text, cRecMenuItemInt(cString text,
int initialVal,
int minVal, int minVal,
int maxVal, int maxVal,
bool active = false, bool active = false,
@ -227,11 +231,15 @@ private:
void DrawValue(void); void DrawValue(void);
public: public:
cRecMenuItemBool(cString text, cRecMenuItemBool(cString text,
bool initialVal,
bool refresh = false,
bool active = false, bool active = false,
bool *callback = NULL, bool *callback = NULL,
eRecMenuState action = rmsNotConsumed); eRecMenuState action = rmsNotConsumed,
bool refresh = false);
cRecMenuItemBool(cString text,
bool active = false,
int *callback = NULL,
eRecMenuState action = rmsNotConsumed,
bool refresh = false);
virtual ~cRecMenuItemBool(void); virtual ~cRecMenuItemBool(void);
void SetPixmaps(void); void SetPixmaps(void);
void Hide(void); void Hide(void);
@ -247,6 +255,7 @@ private:
cString text; cString text;
int currentVal; int currentVal;
int *callback; int *callback;
bool refresh;
std::vector<std::string> strings; std::vector<std::string> strings;
int numValues; int numValues;
cPixmap *pixmapVal; cPixmap *pixmapVal;
@ -254,10 +263,10 @@ private:
public: public:
cRecMenuItemSelect(cString text, cRecMenuItemSelect(cString text,
std::vector<std::string> Strings, std::vector<std::string> Strings,
int initialVal,
bool active = false, bool active = false,
int *callback = NULL, int *callback = NULL,
eRecMenuState action = rmsNotConsumed); eRecMenuState action = rmsNotConsumed,
bool refresh = false);
virtual ~cRecMenuItemSelect(void); virtual ~cRecMenuItemSelect(void);
void SetPixmaps(void); void SetPixmaps(void);
void Hide(void); void Hide(void);
@ -340,7 +349,6 @@ private:
void DrawValue(char *newValue); void DrawValue(char *newValue);
public: public:
cRecMenuItemText(cString title, cRecMenuItemText(cString title,
char *initialVal,
int length, int length,
bool active = false, bool active = false,
char *callback = NULL); char *callback = NULL);
@ -369,7 +377,6 @@ private:
void DrawValue(void); void DrawValue(void);
public: public:
cRecMenuItemTime(cString text, cRecMenuItemTime(cString text,
int initialVal,
bool active = false, bool active = false,
int *callback = NULL, int *callback = NULL,
eRecMenuState action = rmsNotConsumed); eRecMenuState action = rmsNotConsumed);
@ -392,7 +399,6 @@ private:
void DrawValue(void); void DrawValue(void);
public: public:
cRecMenuItemDay(cString text, cRecMenuItemDay(cString text,
time_t initialVal,
bool active = false, bool active = false,
time_t *callback = NULL, time_t *callback = NULL,
eRecMenuState action = rmsNotConsumed); eRecMenuState action = rmsNotConsumed);
@ -480,7 +486,7 @@ public:
void SetPixmaps(void); void SetPixmaps(void);
void Hide(void); void Hide(void);
void Show(void); void Show(void);
const cEvent *GetEventValue(void) { return event; }; const cEvent *GetEvent(void) { return event; };
eRecMenuState ProcessKey(eKeys Key); eRecMenuState ProcessKey(eKeys Key);
void Draw(void); void Draw(void);
}; };
@ -489,7 +495,14 @@ public:
class cRecMenuItemChannelChooser : public cRecMenuItem { class cRecMenuItemChannelChooser : public cRecMenuItem {
private: private:
cString text; cString text;
cChannel *channel; #if VDRVERSNUM >= 20301
const cChannels *channels;
const cChannel *chanNew;
#else
cChannels *channels;
cChannel *chanNew;
#endif
const cChannel *channel;
int channelNumber; int channelNumber;
int *callback; int *callback;
bool initialChannelSet; bool initialChannelSet;
@ -498,7 +511,6 @@ private:
void DrawValue(void); void DrawValue(void);
public: public:
cRecMenuItemChannelChooser (cString text, cRecMenuItemChannelChooser (cString text,
cChannel *initialChannel,
bool active = false, bool active = false,
int *callback = NULL, int *callback = NULL,
eRecMenuState action = rmsNotConsumed); eRecMenuState action = rmsNotConsumed);
@ -532,7 +544,6 @@ private:
bool WeekDaySet(unsigned day); bool WeekDaySet(unsigned day);
public: public:
cRecMenuItemDayChooser (cString text, cRecMenuItemDayChooser (cString text,
int weekdays,
bool active = false, bool active = false,
int *callback = NULL); int *callback = NULL);
virtual ~cRecMenuItemDayChooser(void); virtual ~cRecMenuItemDayChooser(void);
@ -548,10 +559,10 @@ public:
// --- cRecMenuItemRecording ------------------------------------------------------- // --- cRecMenuItemRecording -------------------------------------------------------
class cRecMenuItemRecording : public cRecMenuItem { class cRecMenuItemRecording : public cRecMenuItem {
private: private:
cRecording *recording; const cRecording *recording;
cPixmap *pixmapText; cPixmap *pixmapText;
public: public:
cRecMenuItemRecording(cRecording *recording, bool active); cRecMenuItemRecording(const cRecording *recording, bool active);
virtual ~cRecMenuItemRecording(void); virtual ~cRecMenuItemRecording(void);
void SetPixmaps(void); void SetPixmaps(void);
void Hide(void); void Hide(void);
@ -563,24 +574,26 @@ public:
class cRecMenuItemTimelineHeader : public cRecMenuItem { class cRecMenuItemTimelineHeader : public cRecMenuItem {
private: private:
time_t day; time_t day;
cTimer *timer; const cTimer *timer;
std::vector<cTVGuideTimerConflict*> conflicts; std::vector<cTVGuideTimerConflict*> conflicts;
cPixmap *pixmapTimeline; cPixmap *pixmapTimeline;
cPixmap *pixmapTimerInfo; cPixmap *pixmapTimerInfo;
cPixmap *pixmapTimerConflicts; cPixmap *pixmapTimerConflicts;
int width5Mins; float width5Mins;
int x0; int x0;
int numTimersToday;
bool timelineDrawn; bool timelineDrawn;
void DrawTimeline(void); void DrawTimeline(void);
void DrawTimerConflicts(void); void DrawTimerConflicts(void);
void DrawCurrentTimer(void); void DrawCurrentTimer(void);
public: public:
cRecMenuItemTimelineHeader(time_t day, std::vector<cTVGuideTimerConflict*> conflictsToday); cRecMenuItemTimelineHeader(time_t day, int numTimersToday, std::vector<cTVGuideTimerConflict*> conflictsToday);
virtual ~cRecMenuItemTimelineHeader(void); virtual ~cRecMenuItemTimelineHeader(void);
void SetDay(time_t day) { this->day = day; }; void SetDay(time_t day) { this->day = day; };
void SetPixmaps(void); void SetPixmaps(void);
void SetCurrentTimer(cTimer *timer) { this->timer = timer; }; void SetCurrentTimer(const cTimer *timer) { this->timer = timer; };
void UnsetCurrentTimer(void) { timer = NULL; }; void UnsetCurrentTimer(void) { timer = NULL; };
void SetNumTimersToday(int numTimersToday) { this->numTimersToday = numTimersToday; };
void RefreshTimerDisplay(void); void RefreshTimerDisplay(void);
void Hide(void); void Hide(void);
void Show(void); void Show(void);
@ -590,13 +603,13 @@ public:
// --- cRecMenuItemTimelineTimer ------------------------------------------------------- // --- cRecMenuItemTimelineTimer -------------------------------------------------------
class cRecMenuItemTimelineTimer : public cRecMenuItem { class cRecMenuItemTimelineTimer : public cRecMenuItem {
private: private:
cTimer *timer; const cTimer *timer;
std::vector<cTVGuideTimerConflict*> conflicts; std::vector<cTVGuideTimerConflict*> conflicts;
cPixmap *pixmapBack; cPixmap *pixmapBack;
cPixmap *pixmapTimerConflicts; cPixmap *pixmapTimerConflicts;
cRecMenuItemTimelineHeader *header; cRecMenuItemTimelineHeader *header;
int x0; int x0;
int width5Mins; float width5Mins;
time_t start; time_t start;
time_t stop; time_t stop;
void DrawBackground(void); void DrawBackground(void);
@ -605,15 +618,15 @@ private:
void DrawTimerConflicts(void); void DrawTimerConflicts(void);
void DrawNoTimerInfo(void); void DrawNoTimerInfo(void);
public: public:
cRecMenuItemTimelineTimer(cTimer *timer, time_t start, time_t stop, std::vector<cTVGuideTimerConflict*> conflictsToday, cRecMenuItemTimelineHeader *header, bool active); cRecMenuItemTimelineTimer(const cTimer *timer, time_t start, time_t stop, std::vector<cTVGuideTimerConflict*> conflictsToday, cRecMenuItemTimelineHeader *header, bool active);
virtual ~cRecMenuItemTimelineTimer(void); virtual ~cRecMenuItemTimelineTimer(void);
void setActive(void); void SetActive(void);
void setInactive(void); void setInactive(void);
void SetPixmaps(void); void SetPixmaps(void);
void Hide(void); void Hide(void);
void Show(void); void Show(void);
void Draw(void); void Draw(void);
cTimer *GetTimerValue(void); const cTimer *GetTimer(void);
eRecMenuState ProcessKey(eKeys Key); eRecMenuState ProcessKey(eKeys Key);
}; };
@ -681,4 +694,4 @@ public:
eRecMenuState ProcessKey(eKeys Key); eRecMenuState ProcessKey(eKeys Key);
}; };
#endif //__TVGUIDE_RECMENUITEM_H #endif //__TVGUIDE_RECMENUITEM_H

1620
recmenus.c

File diff suppressed because it is too large Load Diff

View File

@ -10,6 +10,15 @@
#include "switchtimer.h" #include "switchtimer.h"
#include "recmanager.h" #include "recmanager.h"
typedef enum {
searchTimerActionRecord = 0,
searchTimerActionAnnounceViaOSD,
searchTimerActionSwitchOnly,
searchTimerActionAnnounceAndSwitch,
searchTimerActionAnnounceViaMail,
searchTimerActionInactiveRecord
} searchTimerAction;
// --- cRecMenuMain --------------------------------------------------------- // --- cRecMenuMain ---------------------------------------------------------
class cRecMenuMain : public cRecMenu { class cRecMenuMain : public cRecMenu {
public: public:
@ -38,7 +47,7 @@ public:
// --- cRecMenuConfirmTimer --------------------------------------------------------- // --- cRecMenuConfirmTimer ---------------------------------------------------------
class cRecMenuConfirmTimer: public cRecMenu { class cRecMenuConfirmTimer: public cRecMenu {
public: public:
cRecMenuConfirmTimer(const cEvent *event); cRecMenuConfirmTimer(const cEvent *event, bool timerChanged = false);
virtual ~cRecMenuConfirmTimer(void) {}; virtual ~cRecMenuConfirmTimer(void) {};
}; };
@ -68,11 +77,12 @@ public:
class cRecMenuTimerConflict: public cRecMenu { class cRecMenuTimerConflict: public cRecMenu {
private: private:
cTVGuideTimerConflict *conflict; cTVGuideTimerConflict *conflict;
int totalNumMenuItems;
public: public:
cRecMenuTimerConflict(cTVGuideTimerConflict *conflict); cRecMenuTimerConflict(cTVGuideTimerConflict *conflict, eRecMenuState nextAction = rmsClose);
virtual ~cRecMenuTimerConflict(void) {};
cRecMenuItem *GetMenuItem(int number); cRecMenuItem *GetMenuItem(int number);
int GetTotalNumMenuItems(void); int GetTotalNumMenuItems(void);
virtual ~cRecMenuTimerConflict(void) {};
int GetTimerConflictIndex(void); int GetTimerConflictIndex(void);
}; };
@ -115,7 +125,7 @@ public:
// --- cRecMenuEditTimer --------------------------------------------------------- // --- cRecMenuEditTimer ---------------------------------------------------------
class cRecMenuEditTimer: public cRecMenu { class cRecMenuEditTimer: public cRecMenu {
private: private:
cTimer *originalTimer; const cTimer *originalTimer;
bool timerActive; bool timerActive;
time_t day; time_t day;
int start; int start;
@ -124,10 +134,10 @@ private:
int lifetime; int lifetime;
char folder[TEXTINPUTLENGTH]; char folder[TEXTINPUTLENGTH];
public: public:
cRecMenuEditTimer(cTimer *timer, eRecMenuState nextState); cRecMenuEditTimer(const cTimer *timer, eRecMenuState nextState);
const cTimer *GetOriginalTimer(void);
virtual ~cRecMenuEditTimer(void) {}; virtual ~cRecMenuEditTimer(void) {};
cTimer GetTimer(void); cTimer *GetTimer(void);
cTimer *GetOriginalTimer(void);
}; };
/****************************************************************************************** /******************************************************************************************
@ -148,7 +158,7 @@ class cRecMenuSeriesTimer: public cRecMenu {
int lifetime; int lifetime;
void CalculateTimes(const cEvent *event); void CalculateTimes(const cEvent *event);
public: public:
cRecMenuSeriesTimer(cChannel *initialChannel, const cEvent *event, std::string folder); cRecMenuSeriesTimer(const cChannel *initialChannel, const cEvent *event, std::string folder);
virtual ~cRecMenuSeriesTimer(void) {}; virtual ~cRecMenuSeriesTimer(void) {};
cTimer *GetTimer(void); cTimer *GetTimer(void);
}; };
@ -195,62 +205,46 @@ class cRecMenuSearchTimers: public cRecMenu {
private: private:
int numSearchTimers; int numSearchTimers;
std::vector<cTVGuideSearchTimer> searchTimers; std::vector<cTVGuideSearchTimer> searchTimers;
void SetMenuItems(void);
public: public:
cRecMenuSearchTimers(std::vector<cTVGuideSearchTimer> searchTimers); cRecMenuSearchTimers(std::vector<cTVGuideSearchTimer> searchTimers);
virtual ~cRecMenuSearchTimers(void) {};
cRecMenuItem *GetMenuItem(int number); cRecMenuItem *GetMenuItem(int number);
int GetTotalNumMenuItems(void); int GetTotalNumMenuItems(void);
cTVGuideSearchTimer GetSearchTimer(void); cTVGuideSearchTimer GetSearchTimer(void);
virtual ~cRecMenuSearchTimers(void);
}; };
// --- cRecMenuSearchTimerEdit --------------------------------------------------------- // --- cRecMenuSearchTimerEdit ---------------------------------------------------------
class cRecMenuSearchTimerEdit: public cRecMenu { class cRecMenuSearchTimerEdit: public cRecMenu {
private: private:
bool advancedOptions; cTVGuideSearchTimer sT;
cTVGuideSearchTimer searchTimer; std::vector<std::string> searchModes;
std::vector<std::string> subTitleModes;
std::vector<std::string> useChannelModes;
std::vector<std::string> channelGroups;
std::vector<std::string> compareDateModes;
std::vector<std::string> searchTimerModes;
std::vector<std::string> delModes;
std::vector<std::string> channelgroups;
std::vector<cRecMenuItem*> mainMenuItems; std::vector<cRecMenuItem*> mainMenuItems;
std::vector<cRecMenuItem*> useChannelSubMenu; cString indent;
std::vector<cRecMenuItem*> useTimeSubMenu; bool init;
std::vector<cRecMenuItem*> useDayOfWeekSubMenu;
std::vector<cRecMenuItem*> avoidRepeatSubMenu;
std::vector<cRecMenuItem*> currentMenuItems;
int numMenuItems; int numMenuItems;
int useChannelPos; int useChannelPos;
int useTimePos; int useTimePos;
int useDayOfWeekPos; int useDayOfWeekPos;
int DayOfWeek(int dayofWeek = 0);
int SetDayOfWeek(int VDRDayOfWeek);
int avoidRepeatsPos; int avoidRepeatsPos;
char searchString[TEXTINPUTLENGTH]; char searchString[TEXTINPUTLENGTH];
bool timerActive; bool timerActive;
int mode;
bool useTitle;
bool useSubtitle;
bool useDescription;
bool useChannel;
int startChannel; int startChannel;
int stopChannel; int stopChannel;
bool useTime; int channelgroupIndex;
int startTime;
int stopTime;
bool useDayOfWeek;
int dayOfWeek; int dayOfWeek;
int priority;
int lifetime;
bool useEpisode;
char directory[TEXTINPUTLENGTH]; char directory[TEXTINPUTLENGTH];
int marginStart; int SplitChannelGroups(std::vector<std::string> *channelGroups, std::vector<std::string> *channelgroups);
int marginStop;
bool useVPS;
bool avoidRepeats;
int allowedRepeats;
bool compareTitle;
bool compareSubtitle;
bool compareSummary;
bool useInFavorites;
void InitMenuItems(void);
void AddSubMenu(std::vector<cRecMenuItem*> *subMenu);
public: public:
cRecMenuSearchTimerEdit(cTVGuideSearchTimer searchTimer, bool advancedOptions); cRecMenuSearchTimerEdit(cTVGuideSearchTimer searchTimer, std::vector<std::string> channelGroups);
void CreateMenuItems(void); void CreateMenuItems(void);
virtual ~cRecMenuSearchTimerEdit(void); virtual ~cRecMenuSearchTimerEdit(void);
cTVGuideSearchTimer GetSearchTimer(void); cTVGuideSearchTimer GetSearchTimer(void);
@ -264,7 +258,7 @@ private:
cTVGuideSearchTimer searchTimer; cTVGuideSearchTimer searchTimer;
public: public:
cRecMenuSearchTimerDeleteConfirm(cTVGuideSearchTimer searchTimer); cRecMenuSearchTimerDeleteConfirm(cTVGuideSearchTimer searchTimer);
virtual ~cRecMenuSearchTimerDeleteConfirm(void); virtual ~cRecMenuSearchTimerDeleteConfirm(void) {};
cTVGuideSearchTimer GetSearchTimer(void); cTVGuideSearchTimer GetSearchTimer(void);
}; };
@ -319,7 +313,7 @@ public:
class cRecMenuSwitchTimer: public cRecMenu { class cRecMenuSwitchTimer: public cRecMenu {
private: private:
int switchMinsBefore; int switchMinsBefore;
int announceOnly; int switchMode;
public: public:
cRecMenuSwitchTimer(void); cRecMenuSwitchTimer(void);
virtual ~cRecMenuSwitchTimer(void) {}; virtual ~cRecMenuSwitchTimer(void) {};
@ -412,10 +406,10 @@ public:
class cRecMenuRecordingSearchResults: public cRecMenu { class cRecMenuRecordingSearchResults: public cRecMenu {
private: private:
std::string searchString; std::string searchString;
cRecording **searchResults; const cRecording **searchResults;
int numResults; int numResults;
public: public:
cRecMenuRecordingSearchResults(std::string searchString, cRecording **searchResults, int numResults); cRecMenuRecordingSearchResults(std::string searchString, const cRecording **searchResults, int numResults);
cRecMenuItem *GetMenuItem(int number); cRecMenuItem *GetMenuItem(int number);
int GetTotalNumMenuItems(void); int GetTotalNumMenuItems(void);
virtual ~cRecMenuRecordingSearchResults(void) { virtual ~cRecMenuRecordingSearchResults(void) {
@ -438,7 +432,7 @@ public:
// --- cRecMenuTimeline --------------------------------------------------------- // --- cRecMenuTimeline ---------------------------------------------------------
class cRecMenuTimeline: public cRecMenu { class cRecMenuTimeline: public cRecMenu {
private: private:
std::vector<cTimer*> timersToday; std::vector<const cTimer*> timersToday;
int numTimersToday; int numTimersToday;
time_t today; time_t today;
time_t timeStart; time_t timeStart;
@ -454,12 +448,11 @@ private:
void ClearMenu(void); void ClearMenu(void);
public: public:
cRecMenuTimeline(cTVGuideTimerConflicts *timerConflicts); cRecMenuTimeline(cTVGuideTimerConflicts *timerConflicts);
virtual ~cRecMenuTimeline(void) {};
cRecMenuItem *GetMenuItem(int number); cRecMenuItem *GetMenuItem(int number);
int GetTotalNumMenuItems(void); int GetTotalNumMenuItems(void);
virtual ~cRecMenuTimeline(void) {
};
eRecMenuState ProcessKey(eKeys Key); eRecMenuState ProcessKey(eKeys Key);
cTimer *GetTimer(void); const cTimer *GetTimer(void);
}; };
/****************************************************************************************** /******************************************************************************************
@ -482,4 +475,4 @@ public:
virtual ~cRecMenuFavorites(void); virtual ~cRecMenuFavorites(void);
}; };
#endif //__TVGUIDE_RECMENUS_H #endif //__TVGUIDE_RECMENUS_H

File diff suppressed because it is too large Load Diff

View File

@ -1,42 +1,43 @@
#ifndef __TVGUIDE_RECMENUMANAGER_H #ifndef __TVGUIDE_RECMENUVIEW_H
#define __TVGUIDE_RECMENUMANAGER_H #define __TVGUIDE_RECMENUVIEW_H
#include "recmenu.h" #include "recmenu.h"
#include "recmanager.h" #include "recmanager.h"
#include "services/epgsearch.h" #include "services/epgsearch.h"
#include "footer.h" #include "footer.h"
// --- cRecMenuManager ------------------------------------------------------------- // --- cRecMenuView -------------------------------------------------------------
class cRecMenuManager { class cRecMenuView {
private: private:
cFooter *footer; cFooter *footer;
bool active; bool active;
cRecMenu *activeMenu; cRecMenu *activeMenu;
cRecMenu *activeMenuBuffer; cRecMenu *activeMenuBuffer;
cRecMenu *activeMenuBuffer2; cRecMenu *activeMenuBuffer2;
const cEvent *event; const cEvent *event;
cRecManager *recManager; const cEvent *displayEvent;
cTVGuideTimerConflicts *timerConflicts; cRecManager *recManager;
cDetailView *detailView; cTVGuideTimerConflicts *timerConflicts;
cPixmap *pixmapBackground; cDetailView *detailView;
bool detailViewActive; cPixmap *pixmapBackground;
void SetBackground(void); bool detailViewActive;
void DeleteBackground(void); void SetBackground(void);
void DisplaySearchTimerList(void); void DeleteBackground(void);
bool DisplayTimerConflict(cTimer *timer); void DisplaySearchTimerList(void);
bool DisplayTimerConflict(int timerID); bool DisplayTimerConflict(const cTimer *timer);
void DisplayDetailedView(const cEvent *ev); bool DisplayTimerConflict(int timerID);
void DisplayFavoriteResults(std::string header, const cEvent **result, int numResults); void DisplayDetailedView(const cEvent *ev);
public: void DisplayFavoriteResults(std::string header, const cEvent **result, int numResults);
cRecMenuManager(void); eOSState StateMachine(eRecMenuState nextState);
virtual ~cRecMenuManager(void); public:
void SetFooter(cFooter *footer) { this->footer = footer; }; cRecMenuView(void);
bool isActive(void) { return active; }; virtual ~cRecMenuView(void);
void Start(const cEvent *event); void AddFooter(cFooter *footer) { this->footer = footer; };
void StartFavorites(void); bool IsActive(void) { return active; };
void Close(void); void Start(const cEvent *event);
eOSState StateMachine(eRecMenuState nextState); void StartFavorites(void);
eOSState ProcessKey(eKeys Key); void Close(void);
}; eOSState ProcessKey(eKeys Key);
};
#endif //__TVGUIDE_RECMENUMANAGER_H
#endif //__TVGUIDE_RECMENUVIEW_H

File diff suppressed because it is too large Load Diff

View File

@ -1,136 +1,92 @@
#ifndef __TVGUIDE_SEARCHTIMER_H #ifndef __TVGUIDE_SEARCHTIMER_H
#define __TVGUIDE_SEARCHTIMER_H #define __TVGUIDE_SEARCHTIMER_H
class cTVGuideSearchTimer { class cTVGuideSearchTimer {
private: friend class cRecMenuSearchTimerEdit;
std::string strTimer; protected:
int ID; std::string strTimer;
std::string searchString; int ID;
int useTime; std::string searchString;
int startTime; int useTime;
int stopTime; int startTime;
int useChannel; int stopTime;
cChannel *channelMin; int useChannel;
cChannel *channelMax; const cChannel *channelMin;
std::string channelGroup; const cChannel *channelMax;
int useCase; std::string channelGroup;
int mode; int useCase;
int useTitle; int mode;
int useSubtitle; int useTitle;
int useDescription; int useSubtitle;
int useDuration; int useDescription;
int minDuration; int useDuration;
int maxDuration; int minDuration;
int useAsSearchTimer; int maxDuration;
int useDayOfWeek; int useAsSearchTimer;
int dayOfWeek; int useDayOfWeek;
int useEpisode; int dayOfWeek;
std::string directory; int useEpisode;
int priority; std::string directory;
int lifetime; int priority;
int marginStart; int lifetime;
int marginStop; int marginStart;
int useVPS; int marginStop;
int action; int useVPS;
int useExtEPGInfo; int action;
std::string extEPGInfoValues; int useExtEPGInfo;
int avoidRepeats; std::string extEPGInfoValues;
int allowedRepeats; int avoidRepeats;
int compareTitle; int allowedRepeats;
int compareSubtitle; int compareTitle;
int compareSummary; int compareSubtitle;
unsigned long catvaluesAvoidRepeat; int compareSummary;
int repeatsWithinDays; unsigned long catvaluesAvoidRepeat;
int delAfterDays; int repeatsWithinDays;
int recordingsKeep; int delAfterDays;
int switchMinsBefore; int recordingsKeep;
int pauseOnNrRecordings; int switchMinsBefore;
int blacklistMode; int pauseOnNrRecordings;
std::string blacklists; int blacklistMode;
int fuzzyTolerance; std::string blacklists;
int useInFavorites; int fuzzyTolerance;
int menuTemplate; int useInFavorites;
int delMode; int menuTemplate;
int delAfterCountRecs; int delMode;
int delAfterDaysOfFirstRec; int delAfterCountRecs;
int useAsSearchTimerFrom; int delAfterDaysOfFirstRec;
int useAsSearchTimerTil; int useAsSearchTimerFrom;
int ignoreMissingEPGCats; int useAsSearchTimerTil;
int unmuteSoundOnSwitch; int ignoreMissingEPGCats;
int compareSummaryMatchInPercent; int unmuteSoundOnSwitch;
std::string contentsFilter; int compareSummaryMatchInPercent;
int compareDate; std::string contentsFilter;
public: int compareDate;
cTVGuideSearchTimer(void); public:
virtual ~cTVGuideSearchTimer(void); cTVGuideSearchTimer(void);
bool operator < (const cTVGuideSearchTimer& other) const; virtual ~cTVGuideSearchTimer(void);
void SetEPGSearchString(std::string strTimer) { this->strTimer = strTimer; }; bool operator < (const cTVGuideSearchTimer& other) const;
void SetTemplate(std::string tmpl); void SetEPGSearchString(std::string strTimer) { this->strTimer = strTimer; };
bool Parse(bool readTemplate = false); void SetTemplate(std::string tmpl);
std::string BuildSearchString(void); bool Parse(bool readTemplate = false);
int GetID(void) { return ID; }; std::string BuildSearchString(void);
//GETTER int GetID(void) { return ID; };
std::string SearchString(void) const { return searchString; }; //GETTER
bool Active(void); std::string GetSearchString(void) const { return searchString; };
bool UseTitle(void) { return useTitle; }; bool IsActive(void);
bool UseSubtitle(void) { return useSubtitle; }; bool UseInFavorites(void) { return useInFavorites; };
bool UseDescription(void) { return useDescription; }; //SETTER
int SearchMode(void) { return mode; }; void SetSearchString(std::string searchString) { this->searchString = searchString; };
bool UseChannel(void) { return useChannel; }; //COMMON
int StartChannel(void) { return (channelMin)?channelMin->Number():0; }; int GetNumTimers(void);
int StopChannel(void) { return (channelMax)?channelMax->Number():0; }; int GetNumRecordings(void);
bool UseTime(void) { return useTime; }; void GetSearchModes(std::vector<std::string> *searchModes);
int StartTime(void) { return startTime; }; void GetSubTitleModes(std::vector<std::string> *subTitleModes);
int StopTime(void) { return stopTime; }; void GetUseChannelModes(std::vector<std::string> *useChannelModes);
bool UseDayOfWeek(void) { return useDayOfWeek; }; void GetSearchTimerModes(std::vector<std::string> *searchTimerModes);
int DayOfWeek(void); void GetCompareDateModes(std::vector<std::string> *compareDateModes);
int UseEpisode(void) { return useEpisode; }; void GetDelModes(std::vector<std::string> *delModes);
std::string Directory(void) { return directory; }; void Dump(void);
int Priority(void) { return priority; }; };
int Lifetime(void) { return lifetime; };
int MarginStart(void) { return marginStart; }; #endif //__TVGUIDE_SEARCHTIMER_H
int MarginStop(void) { return marginStop; };
bool UseVPS(void) { return useVPS; };
bool AvoidRepeats(void) { return avoidRepeats; };
int AllowedRepeats(void) { return allowedRepeats; };
bool CompareTitle(void) { return compareTitle; };
bool CompareSubtitle(void) { return compareSubtitle; };
bool CompareSummary(void) { return compareSummary; };
bool UseInFavorites(void) { return useInFavorites; };
//SETTER
void SetSearchString(std::string searchString) { this->searchString = searchString; };
void SetActive(bool active) { useAsSearchTimer = active; };
void SetSearchMode(int searchMode) { mode = searchMode; };
void SetUseTitle(bool useTitle) { this->useTitle = useTitle; };
void SetUseSubtitle(bool useSubtitle) { this->useSubtitle = useSubtitle; };
void SetUseDesription(bool useDescription) { this->useDescription = useDescription; };
void SetUseChannel(bool useChannel) { this->useChannel = useChannel; };
void SetStartChannel(int startChannel) { channelMin = Channels.GetByNumber(startChannel); };
void SetStopChannel(int stopChannel) { channelMax = Channels.GetByNumber(stopChannel); };
void SetUseTime(bool useTime) { this->useTime = useTime; };
void SetStartTime(int startTime) { this->startTime = startTime; };
void SetStopTime(int stopTime) { this->stopTime = stopTime; };
void SetUseDayOfWeek(bool useDayOfWeek) { this->useDayOfWeek = useDayOfWeek; };
void SetDayOfWeek(int VDRDayOfWeek);
void SetUseEpisode(int useEpisode) { this->useEpisode = useEpisode; };
void SetDirectory(std::string directory) { this-> directory = directory; };
void SetPriority(int priority) { this->priority = priority; };
void SetLifetime(int lifetime) { this->lifetime = lifetime; };
void SetMarginStart(int marginStart) { this->marginStart = marginStart; };
void SetMarginStop(int marginStop) { this->marginStop = marginStop; };
void SetUseVPS(bool useVPS) { this->useVPS = useVPS; };
void SetAvoidRepeats(bool avoidRepeats) { this->avoidRepeats = avoidRepeats; };
void SetAllowedRepeats(int allowedRepeats) { this->allowedRepeats = allowedRepeats; };
void SetCompareTitle(bool compareTitle) { this->compareTitle = compareTitle; };
void SetCompareSubtitle(bool compareSubtitle) { this->compareSubtitle = compareSubtitle; };
void SetCompareSummary(bool compareSummary) { this->compareSummary = compareSummary; };
void SetUseInFavorites(bool useInFavorites) { this->useInFavorites = useInFavorites; };
//COMMON
int GetNumTimers(void);
int GetNumRecordings(void);
void GetSearchModes(std::vector<std::string> *searchModes);
void Dump(void);
};
#endif //__TVGUIDE_SEARCHTIMER_H

View File

@ -31,172 +31,172 @@ The project's page is at http://winni.vdr-developer.org/epgsearch
#include <vdr/osdbase.h> #include <vdr/osdbase.h>
// Data structure for service "Epgsearch-search-v1.0" // Data structure for service "Epgsearch-search-v1.0"
struct Epgsearch_search_v1_0 struct Epgsearch_search_v1_0 {
{
// in // in
char* query; // search term char* query; // search term
int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression) int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression)
int channelNr; // channel number to search in (0=any) int channelNr; // channel number to search in (0=any)
bool useTitle; // search in title bool useTitle; // search in title
bool useSubTitle; // search in subtitle bool useSubTitle; // search in subtitle
bool useDescription; // search in description bool useDescription; // search in description
// out // out
cOsdMenu* pResultMenu; // pointer to the menu of results cOsdMenu* pResultMenu; // pointer to the menu of results
}; };
// Data structure for service "Epgsearch-exttimeredit-v1.0" // Data structure for service "Epgsearch-exttimeredit-v1.0"
struct Epgsearch_exttimeredit_v1_0 struct Epgsearch_exttimeredit_v1_0 {
{
// in // in
cTimer* timer; // pointer to the timer to edit cTimer* timer; // pointer to the timer to edit
bool bNew; // flag that indicates, if this is a new timer or an existing one bool bNew; // flag that indicates, if this is a new timer or an existing one
const cEvent* event; // pointer to the event corresponding to this timer (may be NULL) const cEvent* event; // pointer to the event corresponding to this timer (may be NULL)
// out // out
cOsdMenu* pTimerMenu; // pointer to the menu of results cOsdMenu* pTimerMenu; // pointer to the menu of results
}; };
// Data structure for service "Epgsearch-enablesearchtimers-v1.0" // Data structure for service "Epgsearch-enablesearchtimers-v1.0"
struct Epgsearch_enablesearchtimers_v1_0 struct Epgsearch_enablesearchtimers_v1_0 {
{
// in // in
bool enable; // enable search timer thread? bool enable; // enable search timer thread?
}; };
// Data structure for service "Epgsearch-updatesearchtimers-v1.0" // Data structure for service "Epgsearch-updatesearchtimers-v1.0"
struct Epgsearch_updatesearchtimers_v1_0 struct Epgsearch_updatesearchtimers_v1_0 {
{
// in // in
bool showMessage; // inform via osd when finished? bool showMessage; // inform via osd when finished?
}; };
// Data structure for service "Epgsearch-osdmessage-v1.0" // Data structure for service "Epgsearch-osdmessage-v1.0"
struct Epgsearch_osdmessage_v1_0 struct Epgsearch_osdmessage_v1_0 {
{
// in // in
char* message; // the message to display char* message; // the message to display
eMessageType type; eMessageType type;
}; };
// Data structure for service "EpgsearchMenu-v1.0" // Data structure for service "EpgsearchMenu-v1.0"
struct EpgSearchMenu_v1_0 struct EpgSearchMenu_v1_0 {
{
// in // in
// out // out
cOsdMenu* Menu; // pointer to the menu cOsdMenu* Menu; // pointer to the menu
}; };
// Data structure for service "Epgsearch-lastconflictinfo-v1.0" // Data structure for service "Epgsearch-lastconflictinfo-v1.0"
struct Epgsearch_lastconflictinfo_v1_0 struct Epgsearch_lastconflictinfo_v1_0 {
{
// in // in
// out // out
time_t nextConflict; // next conflict date, 0 if none time_t nextConflict; // next conflict date, 0 if none
int relevantConflicts; // number of relevant conflicts int relevantConflicts; // number of relevant conflicts
int totalConflicts; // total number of conflicts int totalConflicts; // total number of conflicts
}; };
// Data structure for service "Epgsearch-searchresults-v1.0" // Data structure for service "Epgsearch-searchresults-v1.0"
struct Epgsearch_searchresults_v1_0 struct Epgsearch_searchresults_v1_0 {
{
// in // in
char* query; // search term char* query; // search term
int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression) int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression)
int channelNr; // channel number to search in (0=any) int channelNr; // channel number to search in (0=any)
bool useTitle; // search in title bool useTitle; // search in title
bool useSubTitle; // search in subtitle bool useSubTitle; // search in subtitle
bool useDescription; // search in description bool useDescription; // search in description
// out // out
class cServiceSearchResult : public cListObject class cServiceSearchResult : public cListObject
{ {
public: public:
const cEvent* event; const cEvent* event;
cServiceSearchResult(const cEvent* Event) : event(Event) {} cServiceSearchResult(const cEvent* Event) : event(Event) {}
}; };
cList<cServiceSearchResult>* pResultList; // pointer to the results cList<cServiceSearchResult>* pResultList; // pointer to the results
}; };
// Data structure for service "Epgsearch-switchtimer-v1.0" // Data structure for service "Epgsearch-switchtimer-v1.0"
struct Epgsearch_switchtimer_v1_0 struct Epgsearch_switchtimer_v1_0 {
{
// in // in
const cEvent* event; const cEvent* event;
int mode; // mode (0=query existence, 1=add/modify, 2=delete) int mode; // mode (0=query existence, 1=add/modify, 2=delete)
// in/out // in/out
int switchMinsBefore; int switchMinsBefore;
int announceOnly; int announceOnly;
// out // out
bool success; // result bool success; // result
}; };
// Data structures for service "Epgsearch-services-v1.0" // Data structures for service "Epgsearch-services-v1.0"
class cServiceHandler class cServiceHandler
{ {
public: public:
virtual std::list<std::string> SearchTimerList() = 0; virtual std::list<std::string> SearchTimerList() = 0;
// returns a list of search timer entries in the same format as used in epgsearch.conf // returns a list of search timer entries in the same format as used in epgsearch.conf
virtual int AddSearchTimer(const std::string&) = 0; virtual int AddSearchTimer(const std::string&) = 0;
// adds a new search timer and returns its ID (-1 on error) // adds a new search timer and returns its ID (-1 on error)
virtual bool ModSearchTimer(const std::string&) = 0; virtual bool ModSearchTimer(const std::string&) = 0;
// edits an existing search timer and returns success // edits an existing search timer and returns success
virtual bool DelSearchTimer(int) = 0; virtual bool DelSearchTimer(int) = 0;
// deletes search timer with given ID and returns success // deletes search timer with given ID and returns success
virtual std::list<std::string> QuerySearchTimer(int) = 0; virtual std::list<std::string> QuerySearchTimer(int) = 0;
// returns the search result of the searchtimer with given ID in the same format as used in SVDRP command 'QRYS' (->MANUAL) // returns the search result of the searchtimer with given ID in the same format as used in SVDRP command 'QRYS' (->MANUAL)
virtual std::list<std::string> QuerySearch(std::string) = 0; virtual std::list<std::string> QuerySearch(std::string) = 0;
// returns the search result of the searchtimer with given settings in the same format as used in SVDRP command 'QRYS' (->MANUAL) // returns the search result of the searchtimer with given settings in the same format as used in SVDRP command 'QRYS' (->MANUAL)
virtual std::list<std::string> ExtEPGInfoList() = 0; virtual std::list<std::string> ExtEPGInfoList() = 0;
// returns a list of extended EPG categories in the same format as used in epgsearchcats.conf // returns a list of extended EPG categories in the same format as used in epgsearchcats.conf
virtual std::list<std::string> ChanGrpList() = 0; virtual std::list<std::string> ChanGrpList() = 0;
// returns a list of channel groups maintained by epgsearch // returns a list of channel groups maintained by epgsearch
virtual std::list<std::string> BlackList() = 0; virtual std::list<std::string> BlackList() = 0;
// returns a list of blacklists in the same format as used in epgsearchblacklists.conf // returns a list of blacklists in the same format as used in epgsearchblacklists.conf
virtual std::set<std::string> DirectoryList() = 0; virtual std::set<std::string> DirectoryList() = 0;
// List of all recording directories used in recordings, timers, search timers or in epgsearchdirs.conf // List of all recording directories used in recordings, timers, search timers or in epgsearchdirs.conf
virtual ~cServiceHandler() {} virtual ~cServiceHandler() {}
// Read a setup value // Read a setup value
virtual std::string ReadSetupValue(const std::string& entry) = 0; virtual std::string ReadSetupValue(const std::string& entry) = 0;
// Write a setup value // Write a setup value
virtual bool WriteSetupValue(const std::string& entry, const std::string& value) = 0; virtual bool WriteSetupValue(const std::string& entry, const std::string& value) = 0;
}; };
struct Epgsearch_services_v1_0 struct Epgsearch_services_v1_0 {
{
// in/out // in/out
std::auto_ptr<cServiceHandler> handler; #if __cplusplus < 201103L
std::auto_ptr<cServiceHandler> handler;
#else
std::unique_ptr<cServiceHandler> handler;
#endif
}; };
// Data structures for service "Epgsearch-services-v1.1" // Data structures for service "Epgsearch-services-v1.1"
class cServiceHandler_v1_1 : public cServiceHandler class cServiceHandler_v1_1 : public cServiceHandler
{ {
public: public:
// Get timer conflicts // Get timer conflicts
virtual std::list<std::string> TimerConflictList(bool relOnly=false) = 0; virtual std::list<std::string> TimerConflictList(bool relOnly = false) = 0;
// Check if a conflict check is advised // Check if a conflict check is advised
virtual bool IsConflictCheckAdvised() = 0; virtual bool IsConflictCheckAdvised() = 0;
}; };
struct Epgsearch_services_v1_1 struct Epgsearch_services_v1_1 {
{
// in/out // in/out
std::auto_ptr<cServiceHandler_v1_1> handler; #if __cplusplus < 201103L
std::auto_ptr<cServiceHandler_v1_1> handler;
#else
std::unique_ptr<cServiceHandler_v1_1> handler;
#endif
}; };
// Data structures for service "Epgsearch-services-v1.2" // Data structures for service "Epgsearch-services-v1.2"
class cServiceHandler_v1_2 : public cServiceHandler_v1_1 class cServiceHandler_v1_2 : public cServiceHandler_v1_1
{ {
public: public:
// List of all recording directories used in recordings, timers (and optionally search timers or in epgsearchdirs.conf) // List of all recording directories used in recordings, timers (and optionally search timers or in epgsearchdirs.conf)
virtual std::set<std::string> ShortDirectoryList() = 0; virtual std::set<std::string> ShortDirectoryList() = 0;
// Evaluate an expression against an event // Evaluate an expression against an event
virtual std::string Evaluate(const std::string& expr, const cEvent* event) = 0; virtual std::string Evaluate(const std::string& expr, const cEvent* event) = 0;
}; };
struct Epgsearch_services_v1_2 struct Epgsearch_services_v1_2 {
{
// in/out // in/out
std::auto_ptr<cServiceHandler_v1_2> handler; #if __cplusplus < 201103L
std::auto_ptr<cServiceHandler_v1_2> handler;
#else
std::unique_ptr<cServiceHandler_v1_2> handler;
#endif
}; };
#endif #endif

View File

@ -1,33 +1,182 @@
#ifndef REMOTETIMERSERVICES_INC /*
#define REMOTETIMERSERVICES_INC * remotetimers.h: Public interface of the plugin's services
*
* Copyright (C) 2008-2013 Frank Schmirler <vdr@schmirler.de>
*
* This file is part of VDR Plugin remotetimers.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/
#ifndef _SERVICE__H
#define _SERVICE__H
#include <vdr/epg.h>
#include <vdr/timers.h> #include <vdr/timers.h>
#include <vdr/epg.h>
#include <vdr/osdbase.h>
// RemoteTimers services /*
struct RemoteTimers_Event_v1_0 { * If the Data argument is NULL, all service calls return true.
//in * Otherwise the return value indicates success or failure of the service call.
const cEvent *event; *
//out * The service calls are not thread safe and must be called from the VDR main loop.
cTimer *timer; */
cString errorMsg;
/*
* RemoteTimers::InstantRecording-v1.0
* Start an instant recording or pause live TV. VDR needs to be patched to support this.
* The service returns false if a local timer should be used. An error occured if true is returned but the out parameters name and fileName are NULL.
* Data points to the following structure where pause indicates if it is an instant recording or an attempt to pause live TV.
*/
struct RemoteTimers_InstantRecording_v1_0 {
//in
const cTimer *timer;
bool pause;
const cEvent *event;
//out
cString name;
cString fileName;
}; };
/*
* RemoteTimers::RefreshTimers-v1.0
* Fetch timer list from remote VDR. You must call this service before you can use one of the service calls below.
* Data points to a cString which in case of failure (service call returns false) contains an error message.
*/
//out
// cString errorMsg;
/*
* RemoteTimers::ForEachConflict-v1.0
* Iterates the list of remote timer conflicts.
* The service call always returns true.
* Data points to a const char* which must be NULL to return the first conflict. Pass the previously returned conflict to get the next one until const char* is NULL.
*
*/
//in+out
// const char* conflict;
/*
* RemoteTimers::ForEach-v1.0
* Iterates the list of remote timers.
* The service call always returns true.
* Data points to a cTimer* which must be NULL to return the first timer. Pass the previously returned timer to get the next one until cTimer* is NULL.
*
* RemoteTimers::GetTimer-v1.0
* Test if the timer exists as either a remote or a local timer.
* The service call always returns true.
* Data points to a cTimer* which points to the timer you are looking for. If found, cTimer* will point to the timer, otherwise it will be NULL.
*/
//in+out
// cTimer* timer;
/*
* RemoteTimers::GetMatch-v1.0
* Find the remote or local timer which matches the event best.
* The service call always returns true.
* Data points to the following structure:
*/
struct RemoteTimers_GetMatch_v1_0 { struct RemoteTimers_GetMatch_v1_0 {
//in //in
const cEvent *event; const cEvent *event;
//out //out
cTimer *timer; cTimer *timer;
int timerMatch; int timerMatch;
int timerType; int timerType;
bool isRemote; bool isRemote;
}; };
/*
* RemoteTimers::GetTimerByEvent-v1.0
* Find the remote or local timer matching the event.
* If no timer matches, the service call returns false.
* Data points to a RemoteTimers_Event_v1_0 struct.
*
* RemoteTimers::NewTimerByEvent-v1.0
* Add a new timer for an event.
* In case of an error, the service call returns false and the structure includes an error message.
* Data points to a RemoteTimers_Event_v1_0 struct.
*/
struct RemoteTimers_Event_v1_0 {
//in
const cEvent *event;
//out
cTimer *timer;
cString errorMsg;
};
/*
* RemoteTimers::NewTimer-v1.0
* Add a new timer.
* In case of an error, the service call returns false and the structure includes an error message.
* Data points to a RemoteTimers_Timer_v1_0 struct.
*
* RemoteTimers::ModTimer-v1.0
* Change an existing timer.
* In case of an error, the service call returns false and the structure includes an error message.
* Data points to a RemoteTimers_Timer_v1_0 struct.
*
* RemoteTimers::DelTimer-v1.0
* Delete an existing timer.
* In case of an error, the service call returns false and the structure includes an error message.
* Data points to a RemoteTimers_Timer_v1_0 struct.
*/
struct RemoteTimers_Timer_v1_0 { struct RemoteTimers_Timer_v1_0 {
//in+out //in+out
cTimer *timer; cTimer *timer;
//out //out
cString errorMsg; cString errorMsg;
}; };
#endif //REMOTETIMERSERVICES_INC /*
* RemoteTimers::GetTimerById-v1.0
* Get a remote timer by its id (i.e. timer->Index()+1 on remote machine).
* The service call always returns true.
* Data must point to a RemoteTimers_Timer_v1_1 structure. errorMsg is unused.
* NULL is returned as timer if no remote timer exists for the given id locally.
* Note that a timer with this id may exist remotely. This can happen if the
* remote timer's channel doesn't exist on the local machine.
*/
struct RemoteTimers_Timer_v1_1 {
//in+out
cTimer *timer;
int id;
//out
cString errorMsg;
};
/*
* RemoteTimers::Menu-v1.0
* Depending on the state parameter, open the Timers or Schedule menu.
* In case of an error, menu is NULL.
* Data points to a RemoteTimers_Menu_v1_0 struct.
*/
struct RemoteTimers_Menu_v1_0 {
//in
const char *serverIp;
unsigned short serverPort;
eOSState state;
//out
cOsdMenu *menu;
};
#endif //_SERVICE__H

561
setup.c
View File

@ -1,7 +1,7 @@
#include "setup.h" #include "setup.h"
cTvguideSetup::cTvguideSetup() { cTvguideSetup::cTvguideSetup() {
tmpTvguideConfig = tvguideConfig; tmpConfig = config;
Setup(); Setup();
} }
@ -9,8 +9,8 @@ cTvguideSetup::~cTvguideSetup() {
geoManager.SetGeometry(cOsd::OsdWidth(), cOsd::OsdHeight(), true); geoManager.SetGeometry(cOsd::OsdWidth(), cOsd::OsdHeight(), true);
fontManager.DeleteFonts(); fontManager.DeleteFonts();
fontManager.SetFonts(); fontManager.SetFonts();
tvguideConfig.LoadTheme(); config.LoadTheme();
tvguideConfig.setDynamicValues(); config.setDynamicValues();
imgCache.Clear(); imgCache.Clear();
imgCache.CreateCache(); imgCache.CreateCache();
} }
@ -40,15 +40,15 @@ eOSState cTvguideSetup::ProcessKey(eKeys Key) {
if ((Key == kOk && !hadSubMenu)) { if ((Key == kOk && !hadSubMenu)) {
const char* ItemText = Get(Current())->Text(); const char* ItemText = Get(Current())->Text();
if (strcmp(ItemText, tr("General Settings")) == 0) if (strcmp(ItemText, tr("General Settings")) == 0)
state = AddSubMenu(new cMenuSetupGeneral(&tmpTvguideConfig)); state = AddSubMenu(new cMenuSetupGeneral(&tmpConfig));
if (strcmp(ItemText, tr("Screen Presentation")) == 0) if (strcmp(ItemText, tr("Screen Presentation")) == 0)
state = AddSubMenu(new cMenuSetupScreenLayout(&tmpTvguideConfig)); state = AddSubMenu(new cMenuSetupScreenLayout(&tmpConfig));
if (strcmp(ItemText, tr("Fonts and Fontsizes")) == 0) if (strcmp(ItemText, tr("Fonts and Fontsizes")) == 0)
state = AddSubMenu(new cMenuSetupFont(&tmpTvguideConfig)); state = AddSubMenu(new cMenuSetupFont(&tmpConfig));
if (strcmp(ItemText, tr("Recording Menus and Favorites")) == 0) if (strcmp(ItemText, tr("Recording Menus and Favorites")) == 0)
state = AddSubMenu(new cMenuSetupFavorites(&tmpTvguideConfig)); state = AddSubMenu(new cMenuSetupFavorites(&tmpConfig));
if (strcmp(ItemText, tr("Image Loading and Caching")) == 0) if (strcmp(ItemText, tr("Image Loading and Caching")) == 0)
state = AddSubMenu(new cMenuSetupImageCache(&tmpTvguideConfig)); state = AddSubMenu(new cMenuSetupImageCache(&tmpConfig));
} }
} }
return state; return state;
@ -56,105 +56,113 @@ eOSState cTvguideSetup::ProcessKey(eKeys Key) {
void cTvguideSetup::Store(void) { void cTvguideSetup::Store(void) {
tvguideConfig = tmpTvguideConfig; config = tmpConfig;
SetupStore("debugImageLoading", tvguideConfig.debugImageLoading); SetupStore("debugImageLoading", config.debugImageLoading);
SetupStore("useNopacityTheme", tvguideConfig.useNopacityTheme); SetupStore("useNopacityTheme", config.useNopacityTheme);
SetupStore("themeIndex", tvguideConfig.themeIndex); SetupStore("themeIndex", config.themeIndex);
SetupStore("showMainMenuEntry", tvguideConfig.showMainMenuEntry); SetupStore("useHWAccel", config.useHWAccel);
SetupStore("replaceOriginalSchedule", tvguideConfig.replaceOriginalSchedule); SetupStore("showMainMenuEntry", config.showMainMenuEntry);
SetupStore("displayMode", tvguideConfig.displayMode); SetupStore("replaceOriginalSchedule", config.replaceOriginalSchedule);
SetupStore("showTimeInGrid", tvguideConfig.showTimeInGrid); SetupStore("displayMode", config.displayMode);
SetupStore("displayStatusHeader", tvguideConfig.displayStatusHeader); SetupStore("showTimeInGrid", config.showTimeInGrid);
SetupStore("displayChannelGroups", tvguideConfig.displayChannelGroups); SetupStore("displayStatusHeader", config.displayStatusHeader);
SetupStore("displayTimeBase", tvguideConfig.displayTimeBase); SetupStore("displayChannelGroups", config.displayChannelGroups);
SetupStore("headerHeightPercent", tvguideConfig.headerHeightPercent); SetupStore("displayTimeBase", config.displayTimeBase);
SetupStore("channelGroupsPercent", tvguideConfig.channelGroupsPercent); SetupStore("headerHeightPercent", config.headerHeightPercent);
SetupStore("epgViewBorder", tvguideConfig.epgViewBorder); SetupStore("channelGroupsPercent", config.channelGroupsPercent);
SetupStore("scaleVideo", tvguideConfig.scaleVideo); SetupStore("epgViewBorder", config.epgViewBorder);
SetupStore("decorateVideo", tvguideConfig.decorateVideo); SetupStore("scaleVideo", config.scaleVideo);
SetupStore("roundedCorners", tvguideConfig.roundedCorners); SetupStore("decorateVideo", config.decorateVideo);
SetupStore("timeFormat", tvguideConfig.timeFormat); SetupStore("roundedCorners", config.roundedCorners);
SetupStore("channelCols", tvguideConfig.channelCols); SetupStore("timeFormat", config.timeFormat);
SetupStore("channelRows", tvguideConfig.channelRows); SetupStore("channelCols", config.channelCols);
SetupStore("displayTime", tvguideConfig.displayTime); SetupStore("channelRows", config.channelRows);
SetupStore("bigStepHours", tvguideConfig.bigStepHours); SetupStore("displayTime", config.displayTime);
SetupStore("hugeStepHours", tvguideConfig.hugeStepHours); SetupStore("displayHorizontalTime", config.displayHorizontalTime);
SetupStore("channelJumpMode", tvguideConfig.channelJumpMode); SetupStore("bigStepHours", config.bigStepHours);
SetupStore("blueKeyMode", tvguideConfig.blueKeyMode); SetupStore("bigStepHoursHorizontal", config.bigStepHoursHorizontal);
SetupStore("numkeyMode", tvguideConfig.numkeyMode); SetupStore("hugeStepHours", config.hugeStepHours);
SetupStore("useRemoteTimers", tvguideConfig.useRemoteTimers); SetupStore("hugeStepHoursHorizontal", config.hugeStepHoursHorizontal);
SetupStore("closeOnSwitch", tvguideConfig.closeOnSwitch); SetupStore("channelJumpMode", config.channelJumpMode);
SetupStore("hideLastGroup", tvguideConfig.hideLastGroup); SetupStore("blueKeyMode", config.blueKeyMode);
SetupStore("hideChannelLogos", tvguideConfig.hideChannelLogos); SetupStore("numkeyMode", config.numkeyMode);
SetupStore("logoExtension", tvguideConfig.logoExtension); SetupStore("useRemoteTimers", config.useRemoteTimers);
SetupStore("logoWidthRatio", tvguideConfig.logoWidthRatio); SetupStore("closeOnSwitch", config.closeOnSwitch);
SetupStore("logoHeightRatio", tvguideConfig.logoHeightRatio); SetupStore("hideLastGroup", config.hideLastGroup);
SetupStore("hideEpgImages", tvguideConfig.hideEpgImages); SetupStore("hideChannelLogos", config.hideChannelLogos);
SetupStore("epgImageWidth", tvguideConfig.epgImageWidth); SetupStore("logoExtension", config.logoExtension);
SetupStore("epgImageHeight", tvguideConfig.epgImageHeight); SetupStore("logoWidthRatio", config.logoWidthRatio);
SetupStore("numAdditionalEPGPictures", tvguideConfig.numAdditionalEPGPictures); SetupStore("logoHeightRatio", config.logoHeightRatio);
SetupStore("epgImageWidthLarge", tvguideConfig.epgImageWidthLarge); SetupStore("hideEpgImages", config.hideEpgImages);
SetupStore("epgImageHeightLarge", tvguideConfig.epgImageHeightLarge); SetupStore("epgImageWidth", config.epgImageWidth);
SetupStore("detailedViewScrollStep", tvguideConfig.detailedViewScrollStep); SetupStore("epgImageHeight", config.epgImageHeight);
SetupStore("timeLineWidthPercent", tvguideConfig.timeLineWidthPercent); SetupStore("numAdditionalEPGPictures", config.numAdditionalEPGPictures);
SetupStore("timeLineHeightPercent", tvguideConfig.timeLineHeightPercent); SetupStore("epgImageWidthLarge", config.epgImageWidthLarge);
SetupStore("displayChannelName", tvguideConfig.displayChannelName); SetupStore("epgImageHeightLarge", config.epgImageHeightLarge);
SetupStore("channelHeaderWidthPercent", tvguideConfig.channelHeaderWidthPercent); SetupStore("detailedViewScrollStep", config.detailedViewScrollStep);
SetupStore("channelHeaderHeightPercent", tvguideConfig.channelHeaderHeightPercent); SetupStore("timeLineWidthPercent", config.timeLineWidthPercent);
SetupStore("footerHeightPercent", tvguideConfig.footerHeightPercent); SetupStore("timeLineHeightPercent", config.timeLineHeightPercent);
SetupStore("instRecFolderMode", tvguideConfig.instRecFolderMode); SetupStore("displayChannelName", config.displayChannelName);
SetupStore("instRecFixedFolder", tvguideConfig.instRecFixedFolder.c_str()); SetupStore("channelHeaderWidthPercent", config.channelHeaderWidthPercent);
SetupStore("favWhatsOnNow", tvguideConfig.favWhatsOnNow); SetupStore("channelHeaderHeightPercent", config.channelHeaderHeightPercent);
SetupStore("favWhatsOnNext", tvguideConfig.favWhatsOnNext); SetupStore("footerHeightPercent", config.footerHeightPercent);
SetupStore("favUseTime1", tvguideConfig.favUseTime1); SetupStore("instRecFolderMode", config.instRecFolderMode);
SetupStore("favUseTime2", tvguideConfig.favUseTime2); SetupStore("instRecFixedFolder", config.instRecFixedFolder.c_str());
SetupStore("favUseTime3", tvguideConfig.favUseTime3); SetupStore("addSubtitleToTimer", config.addSubtitleToTimer);
SetupStore("favUseTime4", tvguideConfig.favUseTime4); SetupStore("timerMessage", config.timerMessage);
SetupStore("favTime1", tvguideConfig.favTime1); SetupStore("favWhatsOnNow", config.favWhatsOnNow);
SetupStore("favTime2", tvguideConfig.favTime2); SetupStore("favWhatsOnNext", config.favWhatsOnNext);
SetupStore("favTime3", tvguideConfig.favTime3); SetupStore("favUseTime1", config.favUseTime1);
SetupStore("favTime4", tvguideConfig.favTime4); SetupStore("favUseTime2", config.favUseTime2);
SetupStore("descUser1", tvguideConfig.descUser1.c_str()); SetupStore("favUseTime3", config.favUseTime3);
SetupStore("descUser2", tvguideConfig.descUser2.c_str()); SetupStore("favUseTime4", config.favUseTime4);
SetupStore("descUser3", tvguideConfig.descUser3.c_str()); SetupStore("favTime1", config.favTime1);
SetupStore("descUser4", tvguideConfig.descUser4.c_str()); SetupStore("favTime2", config.favTime2);
SetupStore("favLimitChannels", tvguideConfig.favLimitChannels); SetupStore("favTime3", config.favTime3);
SetupStore("favStartChannel", tvguideConfig.favStartChannel); SetupStore("favTime4", config.favTime4);
SetupStore("favStopChannel", tvguideConfig.favStopChannel); SetupStore("descUser1", config.descUser1.c_str());
SetupStore("fontIndex", tvguideConfig.fontIndex); SetupStore("descUser2", config.descUser2.c_str());
SetupStore("FontButtonDelta", tvguideConfig.FontButtonDelta); SetupStore("descUser3", config.descUser3.c_str());
SetupStore("FontDetailViewDelta", tvguideConfig.FontDetailViewDelta); SetupStore("descUser4", config.descUser4.c_str());
SetupStore("FontDetailHeaderDelta", tvguideConfig.FontDetailHeaderDelta); SetupStore("favLimitChannels", config.favLimitChannels);
SetupStore("FontMessageBoxDelta", tvguideConfig.FontMessageBoxDelta); SetupStore("favStartChannel", config.favStartChannel);
SetupStore("FontMessageBoxLargeDelta", tvguideConfig.FontMessageBoxLargeDelta); SetupStore("favStopChannel", config.favStopChannel);
SetupStore("FontStatusHeaderDelta", tvguideConfig.FontStatusHeaderDelta); SetupStore("switchMode", config.switchMode);
SetupStore("FontStatusHeaderLargeDelta", tvguideConfig.FontStatusHeaderLargeDelta); SetupStore("switchMinsBefore", config.switchMinsBefore);
SetupStore("FontChannelHeaderDelta", tvguideConfig.FontChannelHeaderDelta); SetupStore("fontIndex", config.fontIndex);
SetupStore("FontChannelGroupsDelta", tvguideConfig.FontChannelGroupsDelta); SetupStore("FontButtonDelta", config.FontButtonDelta);
SetupStore("FontGridDelta", tvguideConfig.FontGridDelta); SetupStore("FontDetailViewDelta", config.FontDetailViewDelta);
SetupStore("FontGridSmallDelta", tvguideConfig.FontGridSmallDelta); SetupStore("FontDetailHeaderDelta", config.FontDetailHeaderDelta);
SetupStore("FontTimeLineWeekdayDelta", tvguideConfig.FontTimeLineWeekdayDelta); SetupStore("FontMessageBoxDelta", config.FontMessageBoxDelta);
SetupStore("FontTimeLineDateDelta", tvguideConfig.FontTimeLineDateDelta); SetupStore("FontMessageBoxLargeDelta", config.FontMessageBoxLargeDelta);
SetupStore("FontTimeLineTimeDelta", tvguideConfig.FontTimeLineTimeDelta); SetupStore("FontStatusHeaderDelta", config.FontStatusHeaderDelta);
SetupStore("FontChannelHeaderHorizontalDelta", tvguideConfig.FontChannelHeaderHorizontalDelta); SetupStore("FontStatusHeaderLargeDelta", config.FontStatusHeaderLargeDelta);
SetupStore("FontChannelGroupsHorizontalDelta", tvguideConfig.FontChannelGroupsHorizontalDelta); SetupStore("FontChannelHeaderDelta", config.FontChannelHeaderDelta);
SetupStore("FontGridHorizontalDelta", tvguideConfig.FontGridHorizontalDelta); SetupStore("FontChannelGroupsDelta", config.FontChannelGroupsDelta);
SetupStore("FontGridHorizontalSmallDelta", tvguideConfig.FontGridHorizontalSmallDelta); SetupStore("FontGridDelta", config.FontGridDelta);
SetupStore("FontTimeLineDateHorizontalDelta", tvguideConfig.FontTimeLineDateHorizontalDelta); SetupStore("FontGridSmallDelta", config.FontGridSmallDelta);
SetupStore("FontTimeLineTimeHorizontalDelta", tvguideConfig.FontTimeLineTimeHorizontalDelta); SetupStore("FontTimeLineWeekdayDelta", config.FontTimeLineWeekdayDelta);
SetupStore("FontRecMenuItemDelta", tvguideConfig.FontRecMenuItemDelta); SetupStore("FontTimeLineDateDelta", config.FontTimeLineDateDelta);
SetupStore("FontRecMenuItemSmallDelta", tvguideConfig.FontRecMenuItemSmallDelta); SetupStore("FontTimeLineTimeDelta", config.FontTimeLineTimeDelta);
SetupStore("FontRecMenuItemLargeDelta", tvguideConfig.FontRecMenuItemLargeDelta); SetupStore("FontChannelHeaderHorizontalDelta", config.FontChannelHeaderHorizontalDelta);
SetupStore("displayRerunsDetailEPGView", tvguideConfig.displayRerunsDetailEPGView); SetupStore("FontChannelGroupsHorizontalDelta", config.FontChannelGroupsHorizontalDelta);
SetupStore("numReruns", tvguideConfig.numReruns); SetupStore("FontGridHorizontalDelta", config.FontGridHorizontalDelta);
SetupStore("useSubtitleRerun", tvguideConfig.useSubtitleRerun); SetupStore("FontGridHorizontalSmallDelta", config.FontGridHorizontalSmallDelta);
SetupStore("numLogosInitial", tvguideConfig.numLogosInitial); SetupStore("FontTimeLineDateHorizontalDelta", config.FontTimeLineDateHorizontalDelta);
SetupStore("numLogosMax", tvguideConfig.numLogosMax); SetupStore("FontTimeLineTimeHorizontalDelta", config.FontTimeLineTimeHorizontalDelta);
SetupStore("limitLogoCache", tvguideConfig.limitLogoCache); SetupStore("FontRecMenuItemDelta", config.FontRecMenuItemDelta);
SetupStore("FontRecMenuItemSmallDelta", config.FontRecMenuItemSmallDelta);
SetupStore("FontRecMenuItemLargeDelta", config.FontRecMenuItemLargeDelta);
SetupStore("displayRerunsDetailEPGView", config.displayRerunsDetailEPGView);
SetupStore("numReruns", config.numReruns);
SetupStore("useSubtitleRerun", config.useSubtitleRerun);
SetupStore("numLogosInitial", config.numLogosInitial);
SetupStore("numLogosMax", config.numLogosMax);
SetupStore("limitLogoCache", config.limitLogoCache);
} }
cMenuSetupSubMenu::cMenuSetupSubMenu(const char* Title, cTvguideConfig* data) : cOsdMenu(Title, 30) { cMenuSetupSubMenu::cMenuSetupSubMenu(const char* Title, cTVGuideConfig* data) : cOsdMenu(Title, 40) {
tmpTvguideConfig = data; tmpConfig = data;
indent = " "; indent = " ";
} }
@ -180,7 +188,7 @@ eOSState cMenuSetupSubMenu::ProcessKey(eKeys Key) {
//----- General Settings ------------------------------------------------------------------------------------------------------------- //----- General Settings -------------------------------------------------------------------------------------------------------------
cMenuSetupGeneral::cMenuSetupGeneral(cTvguideConfig* data) : cMenuSetupSubMenu(tr("General Settings"), data) { cMenuSetupGeneral::cMenuSetupGeneral(cTVGuideConfig* data) : cMenuSetupSubMenu(tr("General Settings"), data) {
themes.Load(*cString("tvguide")); themes.Load(*cString("tvguide"));
timeFormatItems[0] = "12h"; timeFormatItems[0] = "12h";
timeFormatItems[1] = "24h"; timeFormatItems[1] = "24h";
@ -200,47 +208,62 @@ cMenuSetupGeneral::cMenuSetupGeneral(cTvguideConfig* data) : cMenuSetupSubMenu(
void cMenuSetupGeneral::Set(void) { void cMenuSetupGeneral::Set(void) {
int currentItem = Current(); int currentItem = Current();
Clear(); Clear();
Add(new cMenuEditBoolItem(tr("Show Main Menu Entry"), &tmpTvguideConfig->showMainMenuEntry)); Add(new cMenuEditBoolItem(tr("Use workaround for HWAccelerated OSD"), &tmpConfig->useHWAccel));
Add(new cMenuEditBoolItem(tr("Replace VDR Schedules Menu"), &tmpTvguideConfig->replaceOriginalSchedule)); Add(new cMenuEditBoolItem(tr("Show Main Menu Entry"), &tmpConfig->showMainMenuEntry));
Add(new cMenuEditBoolItem(tr("Use appropriate nOpacity Theme"), &tmpTvguideConfig->useNopacityTheme)); Add(new cMenuEditBoolItem(tr("Replace VDR Schedules Menu"), &tmpConfig->replaceOriginalSchedule));
if (!tmpTvguideConfig->useNopacityTheme) { Add(new cMenuEditBoolItem(tr("Use appropriate nOpacity Theme"), &tmpConfig->useNopacityTheme));
if (!tmpConfig->useNopacityTheme) {
if (themes.NumThemes()) if (themes.NumThemes())
Add(new cMenuEditStraItem(cString::sprintf("%s%s", *indent, tr("Theme")), &tmpTvguideConfig->themeIndex, themes.NumThemes(), themes.Descriptions())); Add(new cMenuEditStraItem(cString::sprintf("%s%s", *indent, tr("Theme")), &tmpConfig->themeIndex, themes.NumThemes(), themes.Descriptions()));
} }
Add(new cMenuEditIntItem(tr("Time to display in minutes"), &tmpTvguideConfig->displayTime, 60, 320)); if (tmpConfig->displayMode == eVertical) {
Add(new cMenuEditBoolItem(tr("Rounded Corners"), &tmpTvguideConfig->roundedCorners)); Add(new cMenuEditIntItem(tr("Time to display in minutes"), &tmpConfig->displayTime, 60, 320));
} else if (tmpConfig->displayMode == eHorizontal) {
Add(new cMenuEditIntItem(tr("Time to display in minutes"), &tmpConfig->displayHorizontalTime, 60, 320));
}
Add(new cMenuEditBoolItem(tr("Rounded Corners"), &tmpConfig->roundedCorners));
Add(new cMenuEditStraItem(tr("Channel Jump Mode (Keys Green / Yellow)"), &tmpTvguideConfig->channelJumpMode, 2, jumpMode)); Add(new cMenuEditStraItem(tr("Channel Jump Mode (Keys Green / Yellow)"), &tmpConfig->channelJumpMode, 2, jumpMode));
Add(new cMenuEditStraItem(tr("Keys Blue and OK"), &tmpTvguideConfig->blueKeyMode, 3, blueMode)); Add(new cMenuEditStraItem(tr("Keys Blue and OK"), &tmpConfig->blueKeyMode, 3, blueMode));
Add(new cMenuEditBoolItem(tr("Close TVGuide after channel switch"), &tmpTvguideConfig->closeOnSwitch)); Add(new cMenuEditBoolItem(tr("Close TVGuide after channel switch"), &tmpConfig->closeOnSwitch));
Add(new cMenuEditStraItem(tr("Functionality of numeric Keys"), &tmpTvguideConfig->numkeyMode, 2, numMode)); Add(new cMenuEditStraItem(tr("Functionality of numeric Keys"), &tmpConfig->numkeyMode, 2, numMode));
Add(new cMenuEditBoolItem(tr("Hide last Channel Group"), &tmpTvguideConfig->hideLastGroup)); Add(new cMenuEditBoolItem(tr("Hide last Channel Group"), &tmpConfig->hideLastGroup));
Add(new cMenuEditIntItem(tr("Big Step (Keys 1 / 3) in hours"), &tmpTvguideConfig->bigStepHours, 1, 12)); if (tmpConfig->displayMode == eVertical) {
Add(new cMenuEditIntItem(tr("Huge Step (Keys 4 / 6) in hours"), &tmpTvguideConfig->hugeStepHours, 13, 48)); Add(new cMenuEditIntItem(tr("Big Step (Keys 1 / 3) in hours"), &tmpConfig->bigStepHours, 1, 12));
Add(new cMenuEditStraItem(tr("Time Format (12h/24h)"), &tmpTvguideConfig->timeFormat, 2, timeFormatItems)); Add(new cMenuEditIntItem(tr("Huge Step (Keys 4 / 6) in hours"), &tmpConfig->hugeStepHours, 13, 48));
Add(new cMenuEditIntItem(tr("EPG Window Text Scrolling Speed"), &tmpTvguideConfig->detailedViewScrollStep, 1, 30)); } else if (tmpConfig->displayMode == eHorizontal) {
Add(new cMenuEditBoolItem(tr("Display Reruns in detailed EPG View"), &tmpTvguideConfig->displayRerunsDetailEPGView)); Add(new cMenuEditIntItem(tr("Big Step (Keys 1 / 3) in hours"), &tmpConfig->bigStepHoursHorizontal, 1, 12));
if (tmpTvguideConfig->displayRerunsDetailEPGView) { Add(new cMenuEditIntItem(tr("Huge Step (Keys 4 / 6) in hours"), &tmpConfig->hugeStepHoursHorizontal, 13, 48));
Add(new cMenuEditIntItem(cString::sprintf("%s%s", *indent, tr("Number of reruns to display")), &tmpTvguideConfig->numReruns, 1, 10)); }
Add(new cMenuEditStraItem(cString::sprintf("%s%s", *indent, tr("Use Subtitle for reruns")), &tmpTvguideConfig->useSubtitleRerun, 3, useSubtitleRerunTexts)); Add(new cMenuEditStraItem(tr("Time Format (12h/24h)"), &tmpConfig->timeFormat, 2, timeFormatItems));
Add(new cMenuEditIntItem(tr("EPG Window Text Scrolling Speed"), &tmpConfig->detailedViewScrollStep, 1, 30));
Add(new cMenuEditBoolItem(tr("Display Reruns in detailed EPG View"), &tmpConfig->displayRerunsDetailEPGView));
if (tmpConfig->displayRerunsDetailEPGView) {
Add(new cMenuEditIntItem(cString::sprintf("%s%s", *indent, tr("Number of reruns to display")), &tmpConfig->numReruns, 1, 10));
Add(new cMenuEditStraItem(cString::sprintf("%s%s", *indent, tr("Use Subtitle for reruns")), &tmpConfig->useSubtitleRerun, 3, useSubtitleRerunTexts));
} }
SetCurrent(Get(currentItem)); SetCurrent(Get(currentItem));
Display(); Display();
} }
eOSState cMenuSetupGeneral::ProcessKey(eKeys Key) { eOSState cMenuSetupGeneral::ProcessKey(eKeys Key) {
bool olduseNopacityTheme = tmpConfig->useNopacityTheme;
bool olddisplayRerunsDetailEPGView = tmpConfig->displayRerunsDetailEPGView;
eOSState state = cOsdMenu::ProcessKey(Key); eOSState state = cOsdMenu::ProcessKey(Key);
if (Key == kOk) { if (Key == kOk) {
state = osBack; state = osBack;
} else if (Key != kNone) { } else if (Key != kNone) {
Set(); if (tmpConfig->useNopacityTheme != olduseNopacityTheme ||
tmpConfig->displayRerunsDetailEPGView != olddisplayRerunsDetailEPGView) {
Set();
}
} }
return state; return state;
} }
//----- Screen Presentation ------------------------------------------------------------------------------------------------------------- //----- Screen Presentation -------------------------------------------------------------------------------------------------------------
cMenuSetupScreenLayout::cMenuSetupScreenLayout(cTvguideConfig* data) : cMenuSetupSubMenu(tr("Screen Presentation"), data) { cMenuSetupScreenLayout::cMenuSetupScreenLayout(cTVGuideConfig* data) : cMenuSetupSubMenu(tr("Screen Presentation"), data) {
displayModeItems[0] = "vertical"; displayModeItems[0] = "vertical";
displayModeItems[1] = "horizontal"; displayModeItems[1] = "horizontal";
hideChannelLogosItems[0] = trVDR("yes"); hideChannelLogosItems[0] = trVDR("yes");
@ -254,55 +277,55 @@ void cMenuSetupScreenLayout::Set(void) {
int currentItem = Current(); int currentItem = Current();
Clear(); Clear();
Add(new cMenuEditStraItem(tr("Display Mode"), &tmpTvguideConfig->displayMode, 2, displayModeItems)); Add(new cMenuEditStraItem(tr("Display Mode"), &tmpConfig->displayMode, 2, displayModeItems));
if (tmpTvguideConfig->displayMode == eVertical) { if (tmpConfig->displayMode == eVertical) {
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Height of Channel Header (Perc. of osd height)")), &tmpTvguideConfig->channelHeaderHeightPercent, 5, 30)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Height of Channel Header (Perc. of osd height)")), &tmpConfig->channelHeaderHeightPercent, 5, 30));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Width of Timeline (Perc. of osd width)")), &tmpTvguideConfig->timeLineWidthPercent, 5, 30)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Width of Timeline (Perc. of osd width)")), &tmpConfig->timeLineWidthPercent, 5, 30));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Number of Channels to display")), &tmpTvguideConfig->channelCols, 3, 12)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Number of Channels to display")), &tmpConfig->channelCols, 3, 12));
} else if (tmpTvguideConfig->displayMode == eHorizontal) { } else if (tmpConfig->displayMode == eHorizontal) {
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Width of Channel Header (Perc. of osd width)")), &tmpTvguideConfig->channelHeaderWidthPercent, 5, 30)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Width of Channel Header (Perc. of osd width)")), &tmpConfig->channelHeaderWidthPercent, 5, 30));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Height of Timeline (Perc. of osd height)")), &tmpTvguideConfig->timeLineHeightPercent, 5, 30)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Height of Timeline (Perc. of osd height)")), &tmpConfig->timeLineHeightPercent, 5, 30));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Number of Channels to display")), &tmpTvguideConfig->channelRows, 3, 12)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Number of Channels to display")), &tmpConfig->channelRows, 3, 12));
Add(new cMenuEditBoolItem(*cString::sprintf("%s%s", *indent, tr("Display time in EPG Grids")), &tmpTvguideConfig->showTimeInGrid));
} }
Add(new cMenuEditIntItem(tr("Height of Headers (Status Header and EPG View, Perc. of osd height)"), &tmpTvguideConfig->headerHeightPercent, 10, 50)); Add(new cMenuEditBoolItem(tr("Display time in EPG Grids"), &tmpConfig->showTimeInGrid));
Add(new cMenuEditIntItem(tr("Height of Footer (Perc. of osd height)"), &tmpTvguideConfig->footerHeightPercent, 3, 20)); Add(new cMenuEditIntItem(tr("Height of Headers (Status Header and EPG View, Perc. of osd height)"), &tmpConfig->headerHeightPercent, 10, 50));
Add(new cMenuEditIntItem(tr("Height of Footer (Perc. of osd height)"), &tmpConfig->footerHeightPercent, 3, 20));
Add(new cMenuEditBoolItem(tr("Display status header"), &tmpTvguideConfig->displayStatusHeader)); Add(new cMenuEditBoolItem(tr("Display status header"), &tmpConfig->displayStatusHeader));
if (tmpTvguideConfig->displayStatusHeader) { if (tmpConfig->displayStatusHeader) {
Add(new cMenuEditBoolItem(*cString::sprintf("%s%s", *indent, tr("Scale video to upper right corner")), &tmpTvguideConfig->scaleVideo)); Add(new cMenuEditBoolItem(*cString::sprintf("%s%s", *indent, tr("Scale video to upper right corner")), &tmpConfig->scaleVideo));
Add(new cMenuEditBoolItem(*cString::sprintf("%s%s", *indent, tr("Rounded corners around video frame")), &tmpTvguideConfig->decorateVideo)); Add(new cMenuEditBoolItem(*cString::sprintf("%s%s", *indent, tr("Rounded corners around video frame")), &tmpConfig->decorateVideo));
} }
Add(new cMenuEditBoolItem(tr("Display Channel Names in Header"), &tmpTvguideConfig->displayChannelName)); Add(new cMenuEditBoolItem(tr("Display Channel Names in Header"), &tmpConfig->displayChannelName));
Add(new cMenuEditBoolItem(tr("Display channel groups"), &tmpTvguideConfig->displayChannelGroups)); Add(new cMenuEditBoolItem(tr("Display channel groups"), &tmpConfig->displayChannelGroups));
if (tmpTvguideConfig->displayChannelGroups) { if (tmpConfig->displayChannelGroups) {
if (tmpTvguideConfig->displayMode == eVertical) { if (tmpConfig->displayMode == eVertical) {
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Height of channel groups (Perc. of osd height)")), &tmpTvguideConfig->channelGroupsPercent, 3, 30)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Height of channel groups (Perc. of osd height)")), &tmpConfig->channelGroupsPercent, 3, 30));
} else if (tmpTvguideConfig->displayMode == eHorizontal) { } else if (tmpConfig->displayMode == eHorizontal) {
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Width of channel groups (Perc. of osd width)")), &tmpTvguideConfig->channelGroupsPercent, 3, 30)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Width of channel groups (Perc. of osd width)")), &tmpConfig->channelGroupsPercent, 3, 30));
} }
} }
Add(new cMenuEditBoolItem(tr("Display current time baseline"), &tmpTvguideConfig->displayTimeBase)); Add(new cMenuEditBoolItem(tr("Display current time baseline"), &tmpConfig->displayTimeBase));
Add(new cMenuEditStraItem(tr("Show Channel Logos"), &tmpTvguideConfig->hideChannelLogos, 2, hideChannelLogosItems)); Add(new cMenuEditStraItem(tr("Show Channel Logos"), &tmpConfig->hideChannelLogos, 2, hideChannelLogosItems));
if (!tmpTvguideConfig->hideChannelLogos) { if (!tmpConfig->hideChannelLogos) {
Add(InfoItem(tr("Logo Path used"), *tvguideConfig.logoPath)); Add(InfoItem(tr("Logo Path used"), *config.logoPath));
Add(new cMenuEditStraItem(*cString::sprintf("%s%s", *indent, tr("Logo Extension")), &tmpTvguideConfig->logoExtension, 2, logoExtensionItems)); Add(new cMenuEditStraItem(*cString::sprintf("%s%s", *indent, tr("Logo Extension")), &tmpConfig->logoExtension, 2, logoExtensionItems));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Logo width ratio")), &tmpTvguideConfig->logoWidthRatio, 1, 1000)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Logo width ratio")), &tmpConfig->logoWidthRatio, 1, 1000));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Logo height ratio")), &tmpTvguideConfig->logoHeightRatio, 1, 1000)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Logo height ratio")), &tmpConfig->logoHeightRatio, 1, 1000));
} }
Add(new cMenuEditIntItem(tr("Text Border in Detailed View (pixel)"), &tmpTvguideConfig->epgViewBorder, 0, 300)); Add(new cMenuEditIntItem(tr("Text Border in Detailed View (pixel)"), &tmpConfig->epgViewBorder, 0, 300));
Add(new cMenuEditStraItem(tr("Show EPG Images"), &tmpTvguideConfig->hideEpgImages, 2, hideChannelLogosItems)); Add(new cMenuEditStraItem(tr("Show EPG Images"), &tmpConfig->hideEpgImages, 2, hideChannelLogosItems));
if (!tmpTvguideConfig->hideEpgImages) { if (!tmpConfig->hideEpgImages) {
Add(InfoItem(tr("EPG Images Path used"), *tvguideConfig.epgImagePath)); Add(InfoItem(tr("EPG Images Path used"), *config.epgImagePath));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("EPG Image width")), &tmpTvguideConfig->epgImageWidth, 0, 800)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("EPG Image width")), &tmpConfig->epgImageWidth, 0, 800));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("EPG Image height")), &tmpTvguideConfig->epgImageHeight, 0, 800)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("EPG Image height")), &tmpConfig->epgImageHeight, 0, 800));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Number of additional EPG Images")), &tmpTvguideConfig->numAdditionalEPGPictures, 0, 20)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Number of additional EPG Images")), &tmpConfig->numAdditionalEPGPictures, 0, 20));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Additional EPG Image width")), &tmpTvguideConfig->epgImageWidthLarge, 1, 800)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Additional EPG Image width")), &tmpConfig->epgImageWidthLarge, 1, 800));
Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Additional EPG Image height")), &tmpTvguideConfig->epgImageHeightLarge, 0, 800)); Add(new cMenuEditIntItem(*cString::sprintf("%s%s", *indent, tr("Additional EPG Image height")), &tmpConfig->epgImageHeightLarge, 0, 800));
} }
SetCurrent(Get(currentItem)); SetCurrent(Get(currentItem));
@ -310,20 +333,31 @@ void cMenuSetupScreenLayout::Set(void) {
} }
eOSState cMenuSetupScreenLayout::ProcessKey(eKeys Key) { eOSState cMenuSetupScreenLayout::ProcessKey(eKeys Key) {
int olddisplayMode = tmpConfig->displayMode;
bool olddisplayStatusHeader = tmpConfig->displayStatusHeader;
bool olddisplayChannelGroups = tmpConfig->displayChannelGroups;
int oldhideChannelLogos = tmpConfig->hideChannelLogos;
int oldhideEpgImages = tmpConfig->hideEpgImages;
eOSState state = cOsdMenu::ProcessKey(Key); eOSState state = cOsdMenu::ProcessKey(Key);
if (Key == kOk) { if (Key == kOk) {
state = osBack; state = osBack;
} else if (Key != kNone) { } else if (Key != kNone) {
Set(); if (tmpConfig->displayMode != olddisplayMode ||
tmpConfig->displayStatusHeader != olddisplayStatusHeader ||
tmpConfig->displayChannelGroups != olddisplayChannelGroups ||
tmpConfig->hideChannelLogos != oldhideChannelLogos ||
tmpConfig->hideEpgImages != oldhideEpgImages) {
Set();
}
} }
return state; return state;
} }
//-----Fonts and Fontsizes ------------------------------------------------------------------------------------------------------- //-----Fonts and Fontsizes -------------------------------------------------------------------------------------------------------
cMenuSetupFont::cMenuSetupFont(cTvguideConfig* data) : cMenuSetupSubMenu(tr("Fonts and Fontsizes"), data) { cMenuSetupFont::cMenuSetupFont(cTVGuideConfig* data) : cMenuSetupSubMenu(tr("Fonts and Fontsizes"), data) {
cFont::GetAvailableFontNames(&fontNames); cFont::GetAvailableFontNames(&fontNames);
fontNames.Insert(strdup(tvguideConfig.fontNameDefault)); fontNames.Insert(strdup(config.fontNameDefault));
Set(); Set();
} }
@ -331,37 +365,37 @@ void cMenuSetupFont::Set(void) {
int currentItem = Current(); int currentItem = Current();
Clear(); Clear();
Add(new cMenuEditStraItem(tr("Font"), &tmpTvguideConfig->fontIndex, fontNames.Size(), &fontNames[0])); Add(new cMenuEditStraItem(tr("Font"), &tmpConfig->fontIndex, fontNames.Size(), &fontNames[0]));
Add(new cMenuEditIntItem(tr("Status Header Font Size"), &tmpTvguideConfig->FontStatusHeaderDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Status Header Font Size"), &tmpConfig->FontStatusHeaderDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Status Header Large Font Size"), &tmpTvguideConfig->FontStatusHeaderLargeDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Status Header Large Font Size"), &tmpConfig->FontStatusHeaderLargeDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Detail EPG View Font Size"), &tmpTvguideConfig->FontDetailViewDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Detail EPG View Font Size"), &tmpConfig->FontDetailViewDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Detail EPG View Header Font Size"), &tmpTvguideConfig->FontDetailHeaderDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Detail EPG View Header Font Size"), &tmpConfig->FontDetailHeaderDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Message Font Size"), &tmpTvguideConfig->FontMessageBoxDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Message Font Size"), &tmpConfig->FontMessageBoxDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Message Large Font Size"), &tmpTvguideConfig->FontMessageBoxLargeDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Message Large Font Size"), &tmpConfig->FontMessageBoxLargeDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Button Font Size"), &tmpTvguideConfig->FontButtonDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Button Font Size"), &tmpConfig->FontButtonDelta, -30, 30));
if (tmpTvguideConfig->displayMode == eVertical) { if (tmpConfig->displayMode == eVertical) {
Add(new cMenuEditIntItem(tr("Channel Header Font Size"), &tmpTvguideConfig->FontChannelHeaderDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Channel Header Font Size"), &tmpConfig->FontChannelHeaderDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Channel Groups Font Size"), &tmpTvguideConfig->FontChannelGroupsDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Channel Groups Font Size"), &tmpConfig->FontChannelGroupsDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Grid Font Size"), &tmpTvguideConfig->FontGridDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Grid Font Size"), &tmpConfig->FontGridDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Grid Font Small Size"), &tmpTvguideConfig->FontGridSmallDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Grid Font Small Size"), &tmpConfig->FontGridSmallDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Timeline Weekday Font Size"), &tmpTvguideConfig->FontTimeLineWeekdayDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Timeline Weekday Font Size"), &tmpConfig->FontTimeLineWeekdayDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Timeline Date Font Size"), &tmpTvguideConfig->FontTimeLineDateDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Timeline Date Font Size"), &tmpConfig->FontTimeLineDateDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Timeline Time Font Size"), &tmpTvguideConfig->FontTimeLineTimeDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Timeline Time Font Size"), &tmpConfig->FontTimeLineTimeDelta, -30, 30));
} else if (tmpTvguideConfig->displayMode == eHorizontal) { } else if (tmpConfig->displayMode == eHorizontal) {
Add(new cMenuEditIntItem(tr("Channel Header Font Size"), &tmpTvguideConfig->FontChannelHeaderHorizontalDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Channel Header Font Size"), &tmpConfig->FontChannelHeaderHorizontalDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Channel Groups Font Size"), &tmpTvguideConfig->FontChannelGroupsHorizontalDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Channel Groups Font Size"), &tmpConfig->FontChannelGroupsHorizontalDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Grid Font Size"), &tmpTvguideConfig->FontGridHorizontalDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Grid Font Size"), &tmpConfig->FontGridHorizontalDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Grid Font Small Size"), &tmpTvguideConfig->FontGridHorizontalSmallDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Grid Font Small Size"), &tmpConfig->FontGridHorizontalSmallDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Timeline Date Font Size"), &tmpTvguideConfig->FontTimeLineDateHorizontalDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Timeline Date Font Size"), &tmpConfig->FontTimeLineDateHorizontalDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Timeline Time Font Size"), &tmpTvguideConfig->FontTimeLineTimeHorizontalDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Timeline Time Font Size"), &tmpConfig->FontTimeLineTimeHorizontalDelta, -30, 30));
} }
Add(new cMenuEditIntItem(tr("Search & Recording Menu Font Size"), &tmpTvguideConfig->FontRecMenuItemDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Search & Recording Menu Font Size"), &tmpConfig->FontRecMenuItemDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Search & Recording Menu Small Font Size"), &tmpTvguideConfig->FontRecMenuItemSmallDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Search & Recording Menu Small Font Size"), &tmpConfig->FontRecMenuItemSmallDelta, -30, 30));
Add(new cMenuEditIntItem(tr("Search & Recording Menu Header Font Size"), &tmpTvguideConfig->FontRecMenuItemLargeDelta, -30, 30)); Add(new cMenuEditIntItem(tr("Search & Recording Menu Header Font Size"), &tmpConfig->FontRecMenuItemLargeDelta, -30, 30));
SetCurrent(Get(currentItem)); SetCurrent(Get(currentItem));
Display(); Display();
@ -369,7 +403,7 @@ void cMenuSetupFont::Set(void) {
//----- Recording Menus and Favorites ------------------------------------------------------------------------------------------------------- //----- Recording Menus and Favorites -------------------------------------------------------------------------------------------------------
cMenuSetupFavorites::cMenuSetupFavorites(cTvguideConfig* data) : cMenuSetupSubMenu(tr("Recording Menus and Favorites"), data) { cMenuSetupFavorites::cMenuSetupFavorites(cTVGuideConfig* data) : cMenuSetupSubMenu(tr("Recording Menus and Favorites"), data) {
strn0cpy(description1, data->descUser1.c_str(), sizeof(description1)); strn0cpy(description1, data->descUser1.c_str(), sizeof(description1));
strn0cpy(description2, data->descUser2.c_str(), sizeof(description2)); strn0cpy(description2, data->descUser2.c_str(), sizeof(description2));
strn0cpy(description3, data->descUser3.c_str(), sizeof(description3)); strn0cpy(description3, data->descUser3.c_str(), sizeof(description3));
@ -378,6 +412,12 @@ cMenuSetupFavorites::cMenuSetupFavorites(cTvguideConfig* data) : cMenuSetupSubM
recFolderMode[1] = tr("Select from folder list"); recFolderMode[1] = tr("Select from folder list");
recFolderMode[2] = tr("Use fixed folder"); recFolderMode[2] = tr("Use fixed folder");
strn0cpy(fixedFolder, data->instRecFixedFolder.c_str(), sizeof(fixedFolder)); strn0cpy(fixedFolder, data->instRecFixedFolder.c_str(), sizeof(fixedFolder));
addSubtitleMode[0] = tr("never");
addSubtitleMode[1] = tr("smart");
addSubtitleMode[2] = tr("always");
switchModeItems[0] = (tr("switch"));
switchModeItems[1] = (tr("announce only"));
switchModeItems[2] = (tr("ask for switch"));
Set(); Set();
} }
@ -385,40 +425,47 @@ void cMenuSetupFavorites::Set(void) {
int currentItem = Current(); int currentItem = Current();
Clear(); Clear();
Add(new cMenuEditStraItem(tr("Folder for instant Recordings"), &tmpTvguideConfig->instRecFolderMode, 3, recFolderMode)); Add(new cOsdItem(tr("Instant recording:"), osUnknown, false));
if (tmpTvguideConfig->instRecFolderMode == eFolderFixed) { Add(new cMenuEditStraItem(tr("Folder for instant Recordings"), &tmpConfig->instRecFolderMode, 3, recFolderMode));
if (tmpConfig->instRecFolderMode == eFolderFixed) {
Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Folder")), fixedFolder, sizeof(fixedFolder), trVDR(FileNameChars))); Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Folder")), fixedFolder, sizeof(fixedFolder), trVDR(FileNameChars)));
} }
Add(new cMenuEditStraItem(tr("Add episode to manual timers"), &tmpConfig->addSubtitleToTimer, 3, addSubtitleMode));
if (pRemoteTimers) if (pRemoteTimers)
Add(new cMenuEditBoolItem(tr("Use Remotetimers"), &tmpTvguideConfig->useRemoteTimers)); Add(new cMenuEditBoolItem(tr("Use Remotetimers"), &tmpConfig->useRemoteTimers));
Add(new cMenuEditBoolItem(tr("Show timer confirmation messages"), &tmpConfig->timerMessage));
Add(new cMenuEditBoolItem(tr("Use \"What's on now\" in favorites"), &tmpTvguideConfig->favWhatsOnNow)); Add(new cOsdItem(tr("Favorites:"), osUnknown, false));
Add(new cMenuEditBoolItem(tr("Use \"What's on next\" in favorites"), &tmpTvguideConfig->favWhatsOnNext)); Add(new cMenuEditBoolItem(tr("Limit channels in favorites"), &tmpConfig->favLimitChannels));
Add(new cMenuEditBoolItem(tr("Use user defined time 1 in favorites"), &tmpTvguideConfig->favUseTime1)); if (tmpConfig->favLimitChannels) {
if (tmpTvguideConfig->favUseTime1) { Add(new cMenuEditChanItem(tr("Start Channel"), &tmpConfig->favStartChannel));
Add(new cMenuEditChanItem(tr("Stop Channel"), &tmpConfig->favStopChannel));
}
Add(new cMenuEditBoolItem(tr("Use \"What's on now\" in favorites"), &tmpConfig->favWhatsOnNow));
Add(new cMenuEditBoolItem(tr("Use \"What's on next\" in favorites"), &tmpConfig->favWhatsOnNext));
Add(new cOsdItem(tr("User defined times in favorites:"), osUnknown, false));
Add(new cMenuEditBoolItem(tr("Use user defined time 1"), &tmpConfig->favUseTime1));
if (tmpConfig->favUseTime1) {
Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Description")), description1, sizeof(description1), trVDR(FileNameChars))); Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Description")), description1, sizeof(description1), trVDR(FileNameChars)));
Add(new cMenuEditTimeItem(cString::sprintf("%s%s", *indent, tr("Time")), &tmpTvguideConfig->favTime1)); Add(new cMenuEditTimeItem(cString::sprintf("%s%s", *indent, tr("Time")), &tmpConfig->favTime1));
} }
Add(new cMenuEditBoolItem(tr("Use user defined time 2 in favorites"), &tmpTvguideConfig->favUseTime2)); Add(new cMenuEditBoolItem(tr("Use user defined time 2"), &tmpConfig->favUseTime2));
if (tmpTvguideConfig->favUseTime2) { if (tmpConfig->favUseTime2) {
Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Description")), description2, sizeof(description2), trVDR(FileNameChars))); Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Description")), description2, sizeof(description2), trVDR(FileNameChars)));
Add(new cMenuEditTimeItem(cString::sprintf("%s%s", *indent, tr("Time")), &tmpTvguideConfig->favTime2)); Add(new cMenuEditTimeItem(cString::sprintf("%s%s", *indent, tr("Time")), &tmpConfig->favTime2));
} }
Add(new cMenuEditBoolItem(tr("Use user defined time 3 in favorites"), &tmpTvguideConfig->favUseTime3)); Add(new cMenuEditBoolItem(tr("Use user defined time 3"), &tmpConfig->favUseTime3));
if (tmpTvguideConfig->favUseTime3) { if (tmpConfig->favUseTime3) {
Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Description")), description3, sizeof(description3), trVDR(FileNameChars))); Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Description")), description3, sizeof(description3), trVDR(FileNameChars)));
Add(new cMenuEditTimeItem(cString::sprintf("%s%s", *indent, tr("Time")), &tmpTvguideConfig->favTime3)); Add(new cMenuEditTimeItem(cString::sprintf("%s%s", *indent, tr("Time")), &tmpConfig->favTime3));
} }
Add(new cMenuEditBoolItem(tr("Use user defined time 4 in favorites"), &tmpTvguideConfig->favUseTime4)); Add(new cMenuEditBoolItem(tr("Use user defined time 4"), &tmpConfig->favUseTime4));
if (tmpTvguideConfig->favUseTime4) { if (tmpConfig->favUseTime4) {
Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Description")), description4, sizeof(description4), trVDR(FileNameChars))); Add(new cMenuEditStrItem(cString::sprintf("%s%s", *indent, tr("Description")), description4, sizeof(description4), trVDR(FileNameChars)));
Add(new cMenuEditTimeItem(cString::sprintf("%s%s", *indent, tr("Time")), &tmpTvguideConfig->favTime4)); Add(new cMenuEditTimeItem(cString::sprintf("%s%s", *indent, tr("Time")), &tmpConfig->favTime4));
}
Add(new cMenuEditBoolItem(tr("Limit channels in favorites"), &tmpTvguideConfig->favLimitChannels));
if (tmpTvguideConfig->favLimitChannels) {
Add(new cMenuEditChanItem(tr("Start Channel"), &tmpTvguideConfig->favStartChannel));
Add(new cMenuEditChanItem(tr("Stop Channel"), &tmpTvguideConfig->favStopChannel));
} }
Add(new cOsdItem(tr("Switchtimer:"), osUnknown, false));
Add(new cMenuEditStraItem(tr("Switch Mode"), &tmpConfig->switchMode, 3, switchModeItems));
Add(new cMenuEditIntItem(tr("Switch (x)min before start of the show"), &tmpConfig->switchMinsBefore, 0, 10));
SetCurrent(Get(currentItem)); SetCurrent(Get(currentItem));
@ -426,53 +473,63 @@ void cMenuSetupFavorites::Set(void) {
} }
eOSState cMenuSetupFavorites::ProcessKey(eKeys Key) { eOSState cMenuSetupFavorites::ProcessKey(eKeys Key) {
int tmpFavUseTime1 = tmpTvguideConfig->favUseTime1;
int tmpFavUseTime2 = tmpTvguideConfig->favUseTime2; int tmpFavUseTime1 = tmpConfig->favUseTime1;
int tmpFavUseTime3 = tmpTvguideConfig->favUseTime3; int tmpFavUseTime2 = tmpConfig->favUseTime2;
int tmpFavUseTime4 = tmpTvguideConfig->favUseTime4; int tmpFavUseTime3 = tmpConfig->favUseTime3;
int tmpFavLimitChannels = tmpTvguideConfig->favLimitChannels; int tmpFavUseTime4 = tmpConfig->favUseTime4;
int tmpFolderMode = tmpTvguideConfig->instRecFolderMode; int tmpFavLimitChannels = tmpConfig->favLimitChannels;
int tmpFolderMode = tmpConfig->instRecFolderMode;
eOSState state = cOsdMenu::ProcessKey(Key); eOSState state = cOsdMenu::ProcessKey(Key);
if (Key == kOk) {
tmpTvguideConfig->descUser1 = description1; if ((tmpFavUseTime1 != tmpConfig->favUseTime1) ||
tmpTvguideConfig->descUser2 = description2; (tmpFavUseTime2 != tmpConfig->favUseTime2) ||
tmpTvguideConfig->descUser3 = description3; (tmpFavUseTime3 != tmpConfig->favUseTime3) ||
tmpTvguideConfig->descUser4 = description4; (tmpFavUseTime4 != tmpConfig->favUseTime4) ||
tmpTvguideConfig->instRecFixedFolder = fixedFolder; (tmpFavLimitChannels != tmpConfig->favLimitChannels) ||
} else if ((Key == kLeft)||(Key == kRight)) { (tmpFolderMode != tmpConfig->instRecFolderMode) ) {
if ((tmpFavUseTime1 != tmpTvguideConfig->favUseTime1) || Set();
(tmpFavUseTime2 != tmpTvguideConfig->favUseTime2) || Display();
(tmpFavUseTime3 != tmpTvguideConfig->favUseTime3) ||
(tmpFavUseTime4 != tmpTvguideConfig->favUseTime4) ||
(tmpFavLimitChannels != tmpTvguideConfig->favLimitChannels) ||
(tmpFolderMode != tmpTvguideConfig->instRecFolderMode) )
Set();
} }
if (state == osUnknown) {
switch (Key) {
case kOk: {
tmpConfig->descUser1 = cString::sprintf("%s", description1);
tmpConfig->descUser2 = cString::sprintf("%s", description2);
tmpConfig->descUser3 = cString::sprintf("%s", description3);
tmpConfig->descUser4 = cString::sprintf("%s", description4);
return osBack; }
default:
break;
}
}
return state; return state;
} }
//-----Image Caching------------------------------------------------------------------------------------------------------------- //-----Image Caching-------------------------------------------------------------------------------------------------------------
cMenuSetupImageCache::cMenuSetupImageCache(cTvguideConfig* data) : cMenuSetupSubMenu(tr("Image Loading and Caching"), data) { cMenuSetupImageCache::cMenuSetupImageCache(cTVGuideConfig* data) : cMenuSetupSubMenu(tr("Image Loading and Caching"), data) {
Set(); Set();
} }
void cMenuSetupImageCache::Set(void) { void cMenuSetupImageCache::Set(void) {
int currentItem = Current(); int currentItem = Current();
Clear(); Clear();
Add(new cMenuEditBoolItem(tr("Create Log Messages for image loading"), &tmpTvguideConfig->debugImageLoading)); Add(new cMenuEditBoolItem(tr("Create Log Messages for image loading"), &tmpConfig->debugImageLoading));
Add(new cMenuEditBoolItem(tr("Limit Logo Cache"), &tmpTvguideConfig->limitLogoCache)); Add(new cMenuEditBoolItem(tr("Limit Logo Cache"), &tmpConfig->limitLogoCache));
if (&tmpTvguideConfig->limitLogoCache) { if (&tmpConfig->limitLogoCache) {
Add(new cMenuEditIntItem(cString::sprintf("%s%s", *indent, tr("Maximal number of logos to cache")), &tmpTvguideConfig->numLogosMax, 1, 9999)); Add(new cMenuEditIntItem(cString::sprintf("%s%s", *indent, tr("Maximal number of logos to cache")), &tmpConfig->numLogosMax, 1, 9999));
} }
Add(new cMenuEditIntItem(tr("Number of logos to cache at start"), &tmpTvguideConfig->numLogosInitial, 0, 9999)); Add(new cMenuEditIntItem(tr("Number of logos to cache at start"), &tmpConfig->numLogosInitial, 0, 9999));
Add(InfoItem(tr("Cache Sizes"), "")); Add(InfoItem(tr("Cache Sizes"), ""));
Add(InfoItem(tr("OSD Element Cache"), (imgCache.GetCacheSize(ctOsdElement)).c_str())); Add(InfoItem(tr("OSD Element Cache"), cString::sprintf("\t%s", (imgCache.GetCacheSize(ctOsdElement)).c_str())));
Add(InfoItem(tr("Logo cache"), (imgCache.GetCacheSize(ctLogo)).c_str())); Add(InfoItem(tr("Logo cache"), cString::sprintf("\t%s", (imgCache.GetCacheSize(ctLogo)).c_str())));
Add(InfoItem(tr("EPG Grid Cache"), (imgCache.GetCacheSize(ctGrid)).c_str())); Add(InfoItem(tr("EPG Grid Cache"), cString::sprintf("\t%s", (imgCache.GetCacheSize(ctGrid)).c_str())));
Add(InfoItem(tr("Channel Groups Cache"), (imgCache.GetCacheSize(ctChannelGroup)).c_str())); Add(InfoItem(tr("Channel Groups Cache"), cString::sprintf("\t%s", (imgCache.GetCacheSize(ctChannelGroup)).c_str())));
Add(InfoItem(tr("Recording Menus Icon Cache"), (imgCache.GetCacheSize(ctIcon)).c_str())); Add(InfoItem(tr("Recording Menus Icon Cache"), cString::sprintf("\t%s", (imgCache.GetCacheSize(ctIcon)).c_str())));
SetCurrent(Get(currentItem)); SetCurrent(Get(currentItem));
Display(); Display();

22
setup.h
View File

@ -4,12 +4,14 @@
#include <vdr/menuitems.h> #include <vdr/menuitems.h>
#include "config.h" #include "config.h"
extern cTVGuideConfig config;
class cTvguideSetup : public cMenuSetupPage { class cTvguideSetup : public cMenuSetupPage {
public: public:
cTvguideSetup(void); cTvguideSetup(void);
virtual ~cTvguideSetup(); virtual ~cTvguideSetup();
private: private:
cTvguideConfig tmpTvguideConfig; cTVGuideConfig tmpConfig;
void Setup(void); void Setup(void);
protected: protected:
virtual eOSState ProcessKey(eKeys Key); virtual eOSState ProcessKey(eKeys Key);
@ -19,13 +21,13 @@ class cTvguideSetup : public cMenuSetupPage {
class cMenuSetupSubMenu : public cOsdMenu { class cMenuSetupSubMenu : public cOsdMenu {
protected: protected:
cTvguideConfig *tmpTvguideConfig; cTVGuideConfig *tmpConfig;
virtual eOSState ProcessKey(eKeys Key); virtual eOSState ProcessKey(eKeys Key);
virtual void Set(void) = 0; virtual void Set(void) = 0;
cOsdItem *InfoItem(const char *label, const char *value); cOsdItem *InfoItem(const char *label, const char *value);
cString indent; cString indent;
public: public:
cMenuSetupSubMenu(const char *Title, cTvguideConfig *data); cMenuSetupSubMenu(const char *Title, cTVGuideConfig *data);
}; };
class cMenuSetupGeneral : public cMenuSetupSubMenu { class cMenuSetupGeneral : public cMenuSetupSubMenu {
@ -39,7 +41,7 @@ class cMenuSetupGeneral : public cMenuSetupSubMenu {
const char *useSubtitleRerunTexts[3]; const char *useSubtitleRerunTexts[3];
void Set(void); void Set(void);
public: public:
cMenuSetupGeneral(cTvguideConfig *data); cMenuSetupGeneral(cTVGuideConfig *data);
}; };
class cMenuSetupScreenLayout : public cMenuSetupSubMenu { class cMenuSetupScreenLayout : public cMenuSetupSubMenu {
@ -50,7 +52,7 @@ class cMenuSetupScreenLayout : public cMenuSetupSubMenu {
const char * logoExtensionItems[2]; const char * logoExtensionItems[2];
void Set(void); void Set(void);
public: public:
cMenuSetupScreenLayout(cTvguideConfig *data); cMenuSetupScreenLayout(cTVGuideConfig *data);
}; };
class cMenuSetupFont : public cMenuSetupSubMenu { class cMenuSetupFont : public cMenuSetupSubMenu {
@ -58,7 +60,7 @@ class cMenuSetupFont : public cMenuSetupSubMenu {
cStringList fontNames; cStringList fontNames;
void Set(void); void Set(void);
public: public:
cMenuSetupFont(cTvguideConfig *data); cMenuSetupFont(cTVGuideConfig *data);
}; };
class cMenuSetupFavorites : public cMenuSetupSubMenu { class cMenuSetupFavorites : public cMenuSetupSubMenu {
@ -68,18 +70,20 @@ class cMenuSetupFavorites : public cMenuSetupSubMenu {
char description3[256]; char description3[256];
char description4[256]; char description4[256];
const char * recFolderMode[3]; const char * recFolderMode[3];
const char * addSubtitleMode[3];
const char * switchModeItems[3];
char fixedFolder[256]; char fixedFolder[256];
void Set(void); void Set(void);
virtual eOSState ProcessKey(eKeys Key); virtual eOSState ProcessKey(eKeys Key);
public: public:
cMenuSetupFavorites(cTvguideConfig *data); cMenuSetupFavorites(cTVGuideConfig *data);
}; };
class cMenuSetupImageCache : public cMenuSetupSubMenu { class cMenuSetupImageCache : public cMenuSetupSubMenu {
protected: protected:
void Set(void); void Set(void);
public: public:
cMenuSetupImageCache(cTvguideConfig *data); cMenuSetupImageCache(cTVGuideConfig *data);
}; };
#endif //__TVGUIDE_SETUP_H #endif //__TVGUIDE_SETUP_H

View File

@ -1,142 +1,143 @@
#include "tools.h" #include "tools.h"
#include "services/scraper2vdr.h" #include "services/scraper2vdr.h"
#include "imageloader.h" #include "imageloader.h"
#include "statusheader.h" #include "statusheader.h"
cStatusHeader::cStatusHeader(void) { cStatusHeader::cStatusHeader(void) {
color = theme.Color(clrStatusHeader); color = theme.Color(clrStatusHeader);
colorBlending = theme.Color(clrStatusHeaderBlending); colorBlending = theme.Color(clrStatusHeaderBlending);
height = geoManager.statusHeaderHeight; height = geoManager.statusHeaderHeight;
width = geoManager.headerContentWidth; width = geoManager.headerContentWidth;
tvFrameWidth = geoManager.tvFrameWidth; tvFrameWidth = geoManager.tvFrameWidth;
pixmap = osdManager.requestPixmap(1, cRect(0, 0, width, height)); pixmap = osdManager.CreatePixmap(1, cRect(0, 0, width, height));
pixmapText = osdManager.requestPixmap(2, cRect(0, 0, width, height)); pixmapText = osdManager.CreatePixmap(2, cRect(0, 0, width, height));
pixmapTVFrame = osdManager.requestPixmap(1, cRect(width, 0, tvFrameWidth, height)); pixmapTVFrame = osdManager.CreatePixmap(1, cRect(width, 0, tvFrameWidth, height));
} }
cStatusHeader::~cStatusHeader(void) { cStatusHeader::~cStatusHeader(void) {
osdManager.releasePixmap(pixmapText); osdManager.DestroyPixmap(pixmapText);
osdManager.releasePixmap(pixmapTVFrame); osdManager.DestroyPixmap(pixmapTVFrame);
if (tvguideConfig.scaleVideo) { if (config.scaleVideo) {
cRect vidWin = cDevice::PrimaryDevice()->CanScaleVideo(cRect::Null); cRect vidWin = cDevice::PrimaryDevice()->CanScaleVideo(cRect::Null);
cDevice::PrimaryDevice()->ScaleVideo(vidWin); cDevice::PrimaryDevice()->ScaleVideo(vidWin);
} }
} }
void cStatusHeader::Draw(void) { void cStatusHeader::Draw(void) {
pixmapText->Fill(clrTransparent); pixmapText->Fill(clrTransparent);
pixmapTVFrame->Fill(clrTransparent); pixmapTVFrame->Fill(clrTransparent);
if (tvguideConfig.style == eStyleGraphical) { if (config.style == eStyleGraphical) {
if (tvguideConfig.scaleVideo) { if (config.scaleVideo) {
drawBackgroundGraphical(bgStatusHeaderWindowed); drawBackgroundGraphical(bgStatusHeaderWindowed);
cImage *tvFrameBack = imgCache.GetOsdElement(oeStatusHeaderTVFrame); cImage *tvFrameBack = imgCache.GetOsdElement(oeStatusHeaderTVFrame);
if (tvFrameBack) if (tvFrameBack)
pixmapTVFrame->DrawImage(cPoint(0,0), *tvFrameBack); pixmapTVFrame->DrawImage(cPoint(0,0), *tvFrameBack);
} else { } else {
drawBackgroundGraphical(bgStatusHeaderFull); drawBackgroundGraphical(bgStatusHeaderFull);
} }
} else { } else {
if (tvguideConfig.decorateVideo) { if (config.decorateVideo) {
DecorateVideoFrame(); DecorateVideoFrame();
} }
drawBackground(); drawBackground();
drawBorder(); drawBorder();
} }
} }
void cStatusHeader::ScaleVideo(void) { void cStatusHeader::ScaleVideo(void) {
if (tvguideConfig.scaleVideo) { if (config.scaleVideo) {
int width = height * 16 / 9; int width = height * 16 / 9;
int x = osdManager.Left() + geoManager.osdWidth - width; int x = osdManager.Left() + geoManager.osdWidth - width;
int y = osdManager.Top(); int y = osdManager.Top();
cRect availableRect(x, y, width, height); cRect availableRect(x, y, width, height);
cRect vidWin = cDevice::PrimaryDevice()->CanScaleVideo(availableRect); cRect vidWin = cDevice::PrimaryDevice()->CanScaleVideo(availableRect);
cDevice::PrimaryDevice()->ScaleVideo(vidWin); cDevice::PrimaryDevice()->ScaleVideo(vidWin);
} }
} }
void cStatusHeader::DrawInfoText(cGrid *grid) { void cStatusHeader::DrawInfoText(cGridElement *grid) {
int border = 10; int border = 10;
int textWidth = width - 2 * border - geoManager.clockWidth - 2; int textWidth = 0;
tColor colorTextBack = (tvguideConfig.style == eStyleFlat)?color:clrTransparent; textWidth = width - 2 * border;
pixmapText->Fill(clrTransparent); tColor colorTextBack = (config.style == eStyleFlat)?color:clrTransparent;
int x = border; pixmapText->Fill(clrTransparent);
int y = border; int x = border;
if (!grid->isDummy()) { int y = border;
const cEvent *event = grid->GetEvent(); if (!grid->IsDummy()) {
int newX = DrawPoster(event, x, y, height-2*border, border); const cEvent *event = grid->GetEvent();
if (newX > 0) { int newX = DrawPoster(event, x, y, height-2*border, border);
textWidth -= (newX - x); if (newX > 0) {
x += newX; textWidth -= (newX - x);
} x += newX;
cString time = grid->getTimeString(); }
cString title(""); cString time = grid->getTimeString();
title = cString::sprintf(": %s", event->Title()); cString title("");
cString header = cString::sprintf("%s%s", *time, *title); title = cString::sprintf(": %s", event->Title());
header = CutText(*header, textWidth, fontManager.FontStatusHeaderLarge).c_str(); cString header = cString::sprintf("%s%s", *time, *title);
pixmapText->DrawText(cPoint(x,y), *header, theme.Color(clrFont), colorTextBack, fontManager.FontStatusHeaderLarge); header = CutText(*header, textWidth, fontManager.FontStatusHeaderLarge).c_str();
y += fontManager.FontStatusHeaderLarge->Height() + border; pixmapText->DrawText(cPoint(x,y), *header, theme.Color(clrFont), colorTextBack, fontManager.FontStatusHeaderLarge);
int heightText = pixmapText->ViewPort().Height() - y; y += fontManager.FontStatusHeaderLarge->Height() + border;
cTextWrapper description; int heightText = pixmapText->ViewPort().Height() - y;
description.Set(event->Description(), fontManager.FontStatusHeader, textWidth); cTextWrapper description;
int lineHeight = fontManager.FontStatusHeader->Height(); description.Set(event->Description(), fontManager.FontStatusHeader, textWidth);
int textLines = description.Lines(); int lineHeight = fontManager.FontStatusHeader->Height();
int maxLines = heightText / lineHeight; int textLines = description.Lines();
int lines = min(textLines, maxLines); int maxLines = heightText / lineHeight;
for (int i = 0; i < lines-1; i++) { int lines = std::min(textLines, maxLines);
pixmapText->DrawText(cPoint(x,y), description.GetLine(i), theme.Color(clrFont), colorTextBack, fontManager.FontStatusHeader); for (int i = 0; i < lines-1; i++) {
y += lineHeight; pixmapText->DrawText(cPoint(x,y), description.GetLine(i), theme.Color(clrFont), colorTextBack, fontManager.FontStatusHeader);
} y += lineHeight;
cString lastLine = description.GetLine(lines-1); }
if (textLines > maxLines) { cString lastLine = description.GetLine(lines-1);
lastLine = cString::sprintf("%s...", *lastLine); if (textLines > maxLines) {
} lastLine = cString::sprintf("%s...", *lastLine);
pixmapText->DrawText(cPoint(x,y), *lastLine, theme.Color(clrFont), colorTextBack, fontManager.FontStatusHeader); }
} else { pixmapText->DrawText(cPoint(x,y), *lastLine, theme.Color(clrFont), colorTextBack, fontManager.FontStatusHeader);
int heightText = pixmapText->ViewPort().Height() - y; } else {
y += (heightText - fontManager.FontStatusHeaderLarge->Height() - 2*border)/2; int heightText = pixmapText->ViewPort().Height() - y;
pixmapText->DrawText(cPoint(x,y), *grid->getText(), theme.Color(clrFont), colorTextBack, fontManager.FontStatusHeaderLarge); y += (heightText - fontManager.FontStatusHeaderLarge->Height() - 2*border)/2;
} pixmapText->DrawText(cPoint(x,y), *grid->getText(), theme.Color(clrFont), colorTextBack, fontManager.FontStatusHeaderLarge);
} }
}
int cStatusHeader::DrawPoster(const cEvent *event, int x, int y, int height, int border) {
bool hasPoster = false; int cStatusHeader::DrawPoster(const cEvent *event, int x, int y, int height, int border) {
ScraperGetPoster posterScraper2Vdr; bool hasPoster = false;
int posterWidth = 0; ScraperGetPoster posterScraper2Vdr;
int posterHeight = 0; int posterWidth = 0;
static cPlugin *pScraper2Vdr = cPluginManager::GetPlugin("scraper2vdr"); int posterHeight = 0;
if (pScraper2Vdr) { static cPlugin *pScraper = GetScraperPlugin();
posterScraper2Vdr.event = event; if (pScraper) {
posterScraper2Vdr.recording = NULL; posterScraper2Vdr.event = event;
if (pScraper2Vdr->Service("GetPoster", &posterScraper2Vdr)) { posterScraper2Vdr.recording = NULL;
hasPoster = true; if (pScraper->Service("GetPoster", &posterScraper2Vdr)) {
int posterWidthOrig = posterScraper2Vdr.poster.width; hasPoster = true;
int posterHeightOrig = posterScraper2Vdr.poster.height; int posterWidthOrig = posterScraper2Vdr.poster.width;
posterHeight = height; int posterHeightOrig = posterScraper2Vdr.poster.height;
posterWidth = posterWidthOrig * ((double)posterHeight / (double)posterHeightOrig); posterHeight = height;
} else { posterWidth = posterWidthOrig * ((double)posterHeight / (double)posterHeightOrig);
hasPoster = false; } else {
} hasPoster = false;
} }
if (hasPoster) { }
cImageLoader imgLoader; if (hasPoster) {
if (imgLoader.LoadPoster(posterScraper2Vdr.poster.path.c_str(), posterWidth, posterHeight)) { cImageLoader imgLoader;
pixmapText->DrawImage(cPoint(x, y), imgLoader.GetImage()); if (imgLoader.LoadPoster(posterScraper2Vdr.poster.path.c_str(), posterWidth, posterHeight)) {
return posterWidth + border; pixmapText->DrawImage(cPoint(x, y), imgLoader.GetImage());
} return posterWidth + border;
} }
return 0; }
} return 0;
}
void cStatusHeader::DecorateVideoFrame(void) {
int radius = 16; void cStatusHeader::DecorateVideoFrame(void) {
int frame = 2; int radius = 16;
pixmapTVFrame->DrawRectangle(cRect(0, 0, tvFrameWidth, frame), theme.Color(clrBackgroundOSD)); int frame = 2;
pixmapTVFrame->DrawEllipse(cRect(frame,frame,radius,radius), theme.Color(clrBackgroundOSD), -2); pixmapTVFrame->DrawRectangle(cRect(0, 0, tvFrameWidth, frame), theme.Color(clrBackgroundOSD));
pixmapTVFrame->DrawRectangle(cRect(tvFrameWidth - frame, frame, frame, height - 2*frame), theme.Color(clrBackgroundOSD)); pixmapTVFrame->DrawEllipse(cRect(frame,frame,radius,radius), theme.Color(clrBackgroundOSD), -2);
pixmapTVFrame->DrawEllipse(cRect(tvFrameWidth - radius - frame, frame, radius, radius), theme.Color(clrBackgroundOSD), -1); pixmapTVFrame->DrawRectangle(cRect(tvFrameWidth - frame, frame, frame, height - 2*frame), theme.Color(clrBackgroundOSD));
pixmapTVFrame->DrawRectangle(cRect(0, frame, frame, height - 2*frame), theme.Color(clrBackgroundOSD)); pixmapTVFrame->DrawEllipse(cRect(tvFrameWidth - radius - frame, frame, radius, radius), theme.Color(clrBackgroundOSD), -1);
pixmapTVFrame->DrawEllipse(cRect(frame, height - radius - frame, radius, radius), theme.Color(clrBackgroundOSD), -3); pixmapTVFrame->DrawRectangle(cRect(0, frame, frame, height - 2*frame), theme.Color(clrBackgroundOSD));
pixmapTVFrame->DrawRectangle(cRect(0, height - frame, tvFrameWidth, frame), theme.Color(clrBackgroundOSD)); pixmapTVFrame->DrawEllipse(cRect(frame, height - radius - frame, radius, radius), theme.Color(clrBackgroundOSD), -3);
pixmapTVFrame->DrawEllipse(cRect(tvFrameWidth - radius - frame, height - radius - frame, radius, radius), theme.Color(clrBackgroundOSD), -4); pixmapTVFrame->DrawRectangle(cRect(0, height - frame, tvFrameWidth, frame), theme.Color(clrBackgroundOSD));
} pixmapTVFrame->DrawEllipse(cRect(tvFrameWidth - radius - frame, height - radius - frame, radius, radius), theme.Color(clrBackgroundOSD), -4);
}

View File

@ -1,25 +1,25 @@
#ifndef __TVGUIDE_STATUSHEADER_H #ifndef __TVGUIDE_STATUSHEADER_H
#define __TVGUIDE_STATUSHEADER_H #define __TVGUIDE_STATUSHEADER_H
#include "styledpixmap.h" #include "styledpixmap.h"
#include "grid.h" #include "gridelement.h"
// --- cStatusHeader ------------------------------------------------------------- // --- cStatusHeader -------------------------------------------------------------
class cStatusHeader : public cStyledPixmap { class cStatusHeader : public cStyledPixmap {
private: private:
int width, height; int width, height;
int tvFrameWidth; int tvFrameWidth;
cPixmap *pixmapText; cPixmap *pixmapText;
cPixmap *pixmapTVFrame; cPixmap *pixmapTVFrame;
int DrawPoster(const cEvent *event, int x, int y, int height, int border); int DrawPoster(const cEvent *event, int x, int y, int height, int border);
void DecorateVideoFrame(void); void DecorateVideoFrame(void);
public: public:
cStatusHeader(void); cStatusHeader(void);
virtual ~cStatusHeader(void); virtual ~cStatusHeader(void);
void Draw(void); void Draw(void);
void ScaleVideo(void); void ScaleVideo(void);
void DrawInfoText(cGrid *grid); void DrawInfoText(cGridElement *grid);
}; };
#endif //__TVGUIDE_STATUSHEADER_H #endif //__TVGUIDE_STATUSHEADER_H

View File

@ -1,205 +1,205 @@
#include "imageloader.h" #include "imageloader.h"
#include "geometrymanager.h" #include "geometrymanager.h"
#include "styledpixmap.h" #include "styledpixmap.h"
cStyledPixmap::cStyledPixmap(void) { cStyledPixmap::cStyledPixmap(void) {
pixmap = NULL; pixmap = NULL;
} }
cStyledPixmap::cStyledPixmap(cPixmap *pixmap) { cStyledPixmap::cStyledPixmap(cPixmap *pixmap) {
this->pixmap = pixmap; this->pixmap = pixmap;
} }
cStyledPixmap::~cStyledPixmap(void) { cStyledPixmap::~cStyledPixmap(void) {
if (pixmap) if (pixmap)
osdManager.releasePixmap(pixmap); osdManager.DestroyPixmap(pixmap);
} }
void cStyledPixmap::setPixmap(cPixmap *pixmap) { void cStyledPixmap::setPixmap(cPixmap *pixmap) {
if (pixmap) { if (pixmap) {
this->pixmap = pixmap; this->pixmap = pixmap;
} }
} }
void cStyledPixmap::drawBackground() { void cStyledPixmap::drawBackground() {
if (tvguideConfig.style == eStyleBlendingDefault){ if (config.style == eStyleBlendingDefault){
drawBlendedBackground(); drawBlendedBackground();
} else if (tvguideConfig.style == eStyleBlendingMagick){ } else if (config.style == eStyleBlendingMagick){
drawSparsedBackground(); drawSparsedBackground();
} else { } else {
pixmap->Fill(color); pixmap->Fill(color);
} }
} }
void cStyledPixmap::drawBackgroundGraphical(eBackgroundType type, bool active) { void cStyledPixmap::drawBackgroundGraphical(eBackgroundType type, bool active) {
cImage *back = NULL; cImage *back = NULL;
if (type == bgGrid) { if (type == bgGrid) {
back = imgCache.GetGrid(pixmap->ViewPort().Width(), pixmap->ViewPort().Height(), active); back = imgCache.GetGrid(pixmap->ViewPort().Width(), pixmap->ViewPort().Height(), active);
} else if (type == bgChannelHeader) { } else if (type == bgChannelHeader) {
back = imgCache.GetOsdElement(oeLogoBack); back = imgCache.GetOsdElement(oeLogoBack);
} else if (type == bgChannelGroup) { } else if (type == bgChannelGroup) {
back = imgCache.GetChannelGroup(pixmap->ViewPort().Width(), pixmap->ViewPort().Height()); back = imgCache.GetChannelGroup(pixmap->ViewPort().Width(), pixmap->ViewPort().Height());
} else if (type == bgStatusHeaderWindowed) { } else if (type == bgStatusHeaderWindowed) {
back = imgCache.GetOsdElement(oeStatusHeaderContentWindowed); back = imgCache.GetOsdElement(oeStatusHeaderContentWindowed);
} else if (type == bgStatusHeaderFull) { } else if (type == bgStatusHeaderFull) {
back = imgCache.GetOsdElement(oeStatusHeaderContentFull); back = imgCache.GetOsdElement(oeStatusHeaderContentFull);
} else if (type == bgClock) { } else if (type == bgClock) {
back = imgCache.GetOsdElement(oeClock); back = imgCache.GetOsdElement(oeClock);
} else if (type == bgButton) { } else if (type == bgButton) {
drawBackgroundButton(active); drawBackgroundButton(active);
return; return;
} else if (type == bgRecMenuBack) { } else if (type == bgRecMenuBack) {
cImageLoader imgLoader; cImageLoader imgLoader;
if (imgLoader.LoadOsdElement("recmenu_background", pixmap->ViewPort().Width(), pixmap->ViewPort().Height())) { if (imgLoader.LoadOsdElement("recmenu_background", pixmap->ViewPort().Width(), pixmap->ViewPort().Height())) {
cImage background = imgLoader.GetImage(); cImage background = imgLoader.GetImage();
pixmap->DrawImage(cPoint(0, 0), background); pixmap->DrawImage(cPoint(0, 0), background);
} else { } else {
pixmap->Fill(clrTransparent); pixmap->Fill(clrTransparent);
} }
return; return;
} else if (type == bgChannelJump) { } else if (type == bgChannelJump) {
back = imgCache.GetOsdElement(oeChannelJump); back = imgCache.GetOsdElement(oeChannelJump);
} }
if (back) { if (back) {
pixmap->DrawImage(cPoint(0,0), *back); pixmap->DrawImage(cPoint(0,0), *back);
} else { } else {
pixmap->Fill(clrTransparent); pixmap->Fill(clrTransparent);
} }
} }
void cStyledPixmap::drawBackgroundButton(bool active) { void cStyledPixmap::drawBackgroundButton(bool active) {
std::string buttonName = ""; std::string buttonName = "";
int buttonWidth = pixmap->ViewPort().Width(); int buttonWidth = pixmap->ViewPort().Width();
int buttonHeight = pixmap->ViewPort().Height(); int buttonHeight = pixmap->ViewPort().Height();
if (buttonWidth > geoManager.osdWidth * 50 / 100) { if (buttonWidth > geoManager.osdWidth * 50 / 100) {
if (active) if (active)
buttonName = "button_active_70percent"; buttonName = "button_active_70percent";
else else
buttonName = "button_70percent"; buttonName = "button_70percent";
} else { } else {
if (active) if (active)
buttonName = "button_active_30percent"; buttonName = "button_active_30percent";
else else
buttonName = "button_30percent"; buttonName = "button_30percent";
} }
cImageLoader imgLoader; cImageLoader imgLoader;
if (imgLoader.LoadOsdElement(buttonName.c_str(), buttonWidth, buttonHeight)) { if (imgLoader.LoadOsdElement(buttonName.c_str(), buttonWidth, buttonHeight)) {
cImage button = imgLoader.GetImage(); cImage button = imgLoader.GetImage();
pixmap->DrawImage(cPoint(0, 0), button); pixmap->DrawImage(cPoint(0, 0), button);
} else { } else {
pixmap->Fill(clrTransparent); pixmap->Fill(clrTransparent);
} }
} }
void cStyledPixmap::drawBlendedBackground() { void cStyledPixmap::drawBlendedBackground() {
int width = pixmap->ViewPort().Width(); int width = pixmap->ViewPort().Width();
int height = pixmap->ViewPort().Height(); int height = pixmap->ViewPort().Height();
pixmap->Fill(color); pixmap->Fill(color);
int numSteps = 64; int numSteps = 64;
int alphaStep = 0x04; int alphaStep = 0x04;
if (height < 30) if (height < 30)
return; return;
else if (height < 100) { else if (height < 100) {
numSteps = 32; numSteps = 32;
alphaStep = 0x08; alphaStep = 0x08;
} }
int stepY = 0.5*height / numSteps; int stepY = 0.5*height / numSteps;
if (stepY == 0) stepY = 1; if (stepY == 0) stepY = 1;
int alpha = 0x00; int alpha = 0x00;
tColor clr; tColor clr;
for (int i = 0; i<numSteps; i++) { for (int i = 0; i<numSteps; i++) {
clr = AlphaBlend(color, colorBlending, alpha); clr = AlphaBlend(color, colorBlending, alpha);
pixmap->DrawRectangle(cRect(0,i*stepY,width,stepY), clr); pixmap->DrawRectangle(cRect(0,i*stepY,width,stepY), clr);
alpha += alphaStep; alpha += alphaStep;
} }
} }
void cStyledPixmap::drawSparsedBackground() { void cStyledPixmap::drawSparsedBackground() {
int width = pixmap->ViewPort().Width(); int width = pixmap->ViewPort().Width();
int height = pixmap->ViewPort().Height(); int height = pixmap->ViewPort().Height();
cImageLoader imgLoader; cImageLoader imgLoader;
if (imgLoader.DrawBackground(colorBlending, color, width, height)) if (imgLoader.DrawBackground(colorBlending, color, width, height))
pixmap->DrawImage(cPoint(0,0), imgLoader.GetImage()); pixmap->DrawImage(cPoint(0,0), imgLoader.GetImage());
} }
void cStyledPixmap::drawBorder() { void cStyledPixmap::drawBorder() {
int width = pixmap->ViewPort().Width(); int width = pixmap->ViewPort().Width();
int height = pixmap->ViewPort().Height(); int height = pixmap->ViewPort().Height();
drawDefaultBorder(width, height); drawDefaultBorder(width, height);
if (tvguideConfig.roundedCorners) { if (config.roundedCorners) {
int borderRadius = 12; int borderRadius = 12;
drawRoundedCorners(width, height, borderRadius); drawRoundedCorners(width, height, borderRadius);
} }
} }
void cStyledPixmap::drawDefaultBorder(int width, int height) { void cStyledPixmap::drawDefaultBorder(int width, int height) {
pixmap->DrawRectangle(cRect(0,0,width,2), clrTransparent); //top pixmap->DrawRectangle(cRect(0,0,width,2), clrTransparent); //top
pixmap->DrawRectangle(cRect(0,0,2,height), clrTransparent); //left pixmap->DrawRectangle(cRect(0,0,2,height), clrTransparent); //left
pixmap->DrawRectangle(cRect(0,height-2,width,2), clrTransparent); //bottom pixmap->DrawRectangle(cRect(0,height-2,width,2), clrTransparent); //bottom
pixmap->DrawRectangle(cRect(width-2,0,2,height), clrTransparent); //right pixmap->DrawRectangle(cRect(width-2,0,2,height), clrTransparent); //right
pixmap->DrawRectangle(cRect(2,2,width-4,1), theme.Color(clrBorder)); //top pixmap->DrawRectangle(cRect(2,2,width-4,1), theme.Color(clrBorder)); //top
pixmap->DrawRectangle(cRect(2,2,1,height-4), theme.Color(clrBorder)); //left pixmap->DrawRectangle(cRect(2,2,1,height-4), theme.Color(clrBorder)); //left
pixmap->DrawRectangle(cRect(2,height-3,width-4,1), theme.Color(clrBorder)); //bottom pixmap->DrawRectangle(cRect(2,height-3,width-4,1), theme.Color(clrBorder)); //bottom
pixmap->DrawRectangle(cRect(width-3,2,1,height-4), theme.Color(clrBorder)); //right pixmap->DrawRectangle(cRect(width-3,2,1,height-4), theme.Color(clrBorder)); //right
} }
void cStyledPixmap::drawBoldBorder() { void cStyledPixmap::drawBoldBorder() {
int width = pixmap->ViewPort().Width(); int width = pixmap->ViewPort().Width();
int height = pixmap->ViewPort().Height(); int height = pixmap->ViewPort().Height();
pixmap->DrawRectangle(cRect(0,0,width,2), theme.Color(clrBorder)); //top pixmap->DrawRectangle(cRect(0,0,width,2), theme.Color(clrBorder)); //top
pixmap->DrawRectangle(cRect(0,0,2,height), theme.Color(clrBorder)); //left pixmap->DrawRectangle(cRect(0,0,2,height), theme.Color(clrBorder)); //left
pixmap->DrawRectangle(cRect(0,height-2,width,2), theme.Color(clrBorder)); //bottom pixmap->DrawRectangle(cRect(0,height-2,width,2), theme.Color(clrBorder)); //bottom
pixmap->DrawRectangle(cRect(width-2,0,2,height), theme.Color(clrBorder)); //right pixmap->DrawRectangle(cRect(width-2,0,2,height), theme.Color(clrBorder)); //right
} }
void cStyledPixmap::drawRoundedCorners(int width, int height, int radius) { void cStyledPixmap::drawRoundedCorners(int width, int height, int radius) {
pixmap->DrawEllipse(cRect(2,2,radius,radius), theme.Color(clrBorder), -2); pixmap->DrawEllipse(cRect(2,2,radius,radius), theme.Color(clrBorder), -2);
pixmap->DrawEllipse(cRect(1,1,radius,radius), clrTransparent, -2); pixmap->DrawEllipse(cRect(1,1,radius,radius), clrTransparent, -2);
pixmap->DrawEllipse(cRect(width-radius - 2,2,radius,radius), theme.Color(clrBorder), -1); pixmap->DrawEllipse(cRect(width-radius - 2,2,radius,radius), theme.Color(clrBorder), -1);
pixmap->DrawEllipse(cRect(width-radius - 1,1,radius,radius), clrTransparent, -1); pixmap->DrawEllipse(cRect(width-radius - 1,1,radius,radius), clrTransparent, -1);
if( height > 2*radius) { if( height > 2*radius) {
pixmap->DrawEllipse(cRect(2,height-radius - 2,radius,radius), theme.Color(clrBorder), -3); pixmap->DrawEllipse(cRect(2,height-radius - 2,radius,radius), theme.Color(clrBorder), -3);
pixmap->DrawEllipse(cRect(1,height-radius - 1,radius,radius), clrTransparent, -3); pixmap->DrawEllipse(cRect(1,height-radius - 1,radius,radius), clrTransparent, -3);
pixmap->DrawEllipse(cRect(width-radius - 2,height-radius - 2,radius,radius), theme.Color(clrBorder), -4); pixmap->DrawEllipse(cRect(width-radius - 2,height-radius - 2,radius,radius), theme.Color(clrBorder), -4);
pixmap->DrawEllipse(cRect(width-radius - 1,height-radius - 1,radius,radius), clrTransparent, -4); pixmap->DrawEllipse(cRect(width-radius - 1,height-radius - 1,radius,radius), clrTransparent, -4);
} }
} }
void cStyledPixmap::drawVerticalLine(int x, int yStart, int yStop, tColor col) { void cStyledPixmap::drawVerticalLine(int x, int yStart, int yStop, tColor col) {
for (int y = yStart; y <= yStop; y++) { for (int y = yStart; y <= yStop; y++) {
pixmap->DrawPixel(cPoint(x,y), col); pixmap->DrawPixel(cPoint(x,y), col);
} }
} }
void cStyledPixmap::drawHorizontalLine(int y, int xStart, int xStop, tColor col) { void cStyledPixmap::drawHorizontalLine(int y, int xStart, int xStop, tColor col) {
for (int x = xStart; x <= xStop; x++) { for (int x = xStart; x <= xStop; x++) {
pixmap->DrawPixel(cPoint(x,y), col); pixmap->DrawPixel(cPoint(x,y), col);
} }
} }
void cStyledPixmap::DrawText(const cPoint &Point, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font) { void cStyledPixmap::DrawText(const cPoint &Point, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font) {
pixmap->DrawText(Point, s, ColorFg, ColorBg, Font); pixmap->DrawText(Point, s, ColorFg, ColorBg, Font);
} }
void cStyledPixmap::DrawImage(const cPoint &Point, const cImage &Image) { void cStyledPixmap::DrawImage(const cPoint &Point, const cImage &Image) {
pixmap->DrawImage(Point, Image); pixmap->DrawImage(Point, Image);
} }
void cStyledPixmap::DrawRectangle(const cRect &Rect, tColor Color) { void cStyledPixmap::DrawRectangle(const cRect &Rect, tColor Color) {
pixmap->DrawRectangle(Rect,Color); pixmap->DrawRectangle(Rect,Color);
} }
void cStyledPixmap::DrawEllipse(const cRect &Rect, tColor Color, int Quadrant) { void cStyledPixmap::DrawEllipse(const cRect &Rect, tColor Color, int Quadrant) {
pixmap->DrawEllipse(Rect,Color,Quadrant); pixmap->DrawEllipse(Rect,Color,Quadrant);
} }
void cStyledPixmap::SetViewPort(const cRect &Rect) { void cStyledPixmap::SetViewPort(const cRect &Rect) {
pixmap->SetViewPort(Rect); pixmap->SetViewPort(Rect);
} }

View File

@ -1,58 +1,58 @@
#ifndef __TVGUIDE_STYLEDPIXMAP_H #ifndef __TVGUIDE_STYLEDPIXMAP_H
#define __TVGUIDE_STYLEDPIXMAP_H #define __TVGUIDE_STYLEDPIXMAP_H
#include <vdr/osd.h> #include <vdr/osd.h>
#include <vdr/epg.h> #include <vdr/epg.h>
#include "timer.h" #include "timemanager.h"
#include "config.h" #include "config.h"
enum eBackgroundType { enum eBackgroundType {
bgGrid, bgGrid,
bgStatusHeaderFull, bgStatusHeaderFull,
bgStatusHeaderWindowed, bgStatusHeaderWindowed,
bgChannelHeader, bgChannelHeader,
bgChannelGroup, bgChannelGroup,
bgClock, bgClock,
bgButton, bgButton,
bgRecMenuBack, bgRecMenuBack,
bgChannelJump, bgChannelJump,
}; };
// --- cStyledPixmap ------------------------------------------------------------- // --- cStyledPixmap -------------------------------------------------------------
class cStyledPixmap { class cStyledPixmap {
private: private:
void drawVerticalLine(int x, int yStart, int yStop, tColor col); void drawVerticalLine(int x, int yStart, int yStop, tColor col);
void drawHorizontalLine(int y, int xStart, int xStop, tColor col); void drawHorizontalLine(int y, int xStart, int xStop, tColor col);
void drawBackgroundButton(bool active); void drawBackgroundButton(bool active);
protected: protected:
cPixmap *pixmap; cPixmap *pixmap;
tColor color; tColor color;
tColor colorBlending; tColor colorBlending;
void setPixmap(cPixmap *pixmap); void setPixmap(cPixmap *pixmap);
public: public:
cStyledPixmap(void); cStyledPixmap(void);
cStyledPixmap(cPixmap *pixmap); cStyledPixmap(cPixmap *pixmap);
virtual ~cStyledPixmap(void); virtual ~cStyledPixmap(void);
void drawBackground(); void drawBackground();
void drawBackgroundGraphical(eBackgroundType type, bool active = false); void drawBackgroundGraphical(eBackgroundType type, bool active = false);
void drawBlendedBackground(); void drawBlendedBackground();
void drawSparsedBackground(); void drawSparsedBackground();
void drawBorder(); void drawBorder();
void drawBoldBorder(); void drawBoldBorder();
void drawDefaultBorder(int width, int height); void drawDefaultBorder(int width, int height);
void drawRoundedCorners(int width, int height, int radius); void drawRoundedCorners(int width, int height, int radius);
void setColor(tColor color, tColor colorBlending) {this->color = color; this->colorBlending = colorBlending;}; void setColor(tColor color, tColor colorBlending) {this->color = color; this->colorBlending = colorBlending;};
void SetAlpha(int alpha) {pixmap->SetAlpha(alpha);}; void SetAlpha(int alpha) {pixmap->SetAlpha(alpha);};
void SetLayer(int layer) {pixmap->SetLayer(layer);}; void SetLayer(int layer) {pixmap->SetLayer(layer);};
void Fill(tColor clr) {pixmap->Fill(clr);}; void Fill(tColor clr) {pixmap->Fill(clr);};
void DrawText(const cPoint &Point, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font); void DrawText(const cPoint &Point, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font);
void DrawImage(const cPoint &Point, const cImage &Image); void DrawImage(const cPoint &Point, const cImage &Image);
void DrawRectangle(const cRect &Rect, tColor Color); void DrawRectangle(const cRect &Rect, tColor Color);
void DrawEllipse(const cRect &Rect, tColor Color, int Quadrant); void DrawEllipse(const cRect &Rect, tColor Color, int Quadrant);
void SetViewPort(const cRect &Rect); void SetViewPort(const cRect &Rect);
int Width() {return pixmap->ViewPort().Width();}; int Width() {return pixmap->ViewPort().Width();};
int Height() {return pixmap->ViewPort().Height();}; int Height() {return pixmap->ViewPort().Height();};
}; };
#endif //__TVGUIDE_STYLEDPIXMAP_H #endif //__TVGUIDE_STYLEDPIXMAP_H

View File

@ -6,8 +6,8 @@ cSwitchTimers SwitchTimers;
cSwitchTimer::cSwitchTimer(void) { cSwitchTimer::cSwitchTimer(void) {
eventID = 0; eventID = 0;
startTime = 0; startTime = 0;
switchMinsBefore = 2; switchMinsBefore = config.switchMinsBefore;
announceOnly = 0; switchMode = config.switchMode;
} }
cSwitchTimer::cSwitchTimer(const cEvent* Event) { cSwitchTimer::cSwitchTimer(const cEvent* Event) {

View File

@ -2,6 +2,7 @@
#define __TVGUIDE_SWITCHTIMER_H #define __TVGUIDE_SWITCHTIMER_H
#include <vdr/plugin.h> #include <vdr/plugin.h>
#include "config.h"
class cSwitchTimer : public cListObject { class cSwitchTimer : public cListObject {
public: public:
@ -9,7 +10,19 @@ public:
time_t startTime; time_t startTime;
tChannelID channelID; tChannelID channelID;
int switchMinsBefore; int switchMinsBefore;
int announceOnly; int switchMode;
#if VDRVERSNUM >= 20305
cSwitchTimer(const cSwitchTimer &SwitchTimer) { *this = SwitchTimer; };
cSwitchTimer& operator= (const cSwitchTimer &SwitchTimer)
{
this->eventID = SwitchTimer.eventID;
this->startTime = SwitchTimer.startTime;
this->channelID = SwitchTimer.channelID;
this->switchMinsBefore = SwitchTimer.switchMinsBefore;
this->switchMode = SwitchTimer.switchMode;
return *this;
};
#endif
cSwitchTimer(void); cSwitchTimer(void);
cSwitchTimer(const cEvent* Event); cSwitchTimer(const cEvent* Event);
bool Parse(const char *s); bool Parse(const char *s);

View File

@ -1,14 +1,14 @@
Description = IceBlue Description = IceBlue
clrStyle = 00000000 clrStyle = 00000000
clrBackground = DDFFFFFF clrBackground = EEFFFFFF
clrBackgroundOSD = FFFFFFFF clrBackgroundOSD = F0FFFFFF
clrGrid1 = BB555555 clrGrid1 = FFB2B2C
clrGrid2 = BB888888 clrGrid2 = 55B2B2C7
clrGridFontBack = 00000000 clrGridFontBack = 00000000
clrGridActiveFontBack = 00000000 clrGridActiveFontBack = FFFFFFFF
clrHighlight = FF000044 clrHighlight = FF000044
clrFont = FF000000 clrFont = FF000000
clrFontActive = FFFFFFFF clrFontActive = FFFFFFFF
clrFontButtons = FFFFFFFF clrFontButtons = FFFFFFFF
clrFontHeader = FF000000 clrFontHeader = FF000000
clrHeader = FFFFFFFF clrHeader = FFFFFFFF
@ -20,14 +20,14 @@ clrTimeline1Blending = 00000000
clrTimeline2 = FF000000 clrTimeline2 = FF000000
clrTimeline2Blending = 00000000 clrTimeline2Blending = 00000000
clrTimeBase = A0FF0000 clrTimeBase = A0FF0000
clrTabInactive = 88B8B8E6 clrTabInactive = 55B2B2C7
clrButtonRed = FFBB0000 clrButtonRed = FFCC00000
clrButtonRedBorder = FF000000 clrButtonRedBorder = FF000000
clrButtonGreen = FF00BB00 clrButtonGreen = FF00BB00
clrButtonGreenBorder = FF000000 clrButtonGreenBorder = FF000000
clrButtonYellow = FFBBBB00 clrButtonYellow = FFF5B800
clrButtonYellowBorder = FF000000 clrButtonYellowBorder = FF000000
clrButtonBlue = FF0000BB clrButtonBlue = FF003DF5
clrButtonBlueBorder = FF000000 clrButtonBlueBorder = FF000000
clrRecMenuBackground = AA000000 clrRecMenuBackground = AA000000
clrRecMenuTimerConflictBackground = FFCCCCCC clrRecMenuTimerConflictBackground = FFCCCCCC
@ -36,16 +36,16 @@ clrRecMenuTimerConflictOverlap = AAFF0000
clrRecMenuDayActive = FF00FF00 clrRecMenuDayActive = FF00FF00
clrRecMenuDayInactive = FFFF0000 clrRecMenuDayInactive = FFFF0000
clrRecMenuDayHighlight = 77000000 clrRecMenuDayHighlight = 77000000
clrRecMenuTextBack = FF3C3C3C clrRecMenuTextBack = 00000000
clrRecMenuTextActiveBack = FF404749 clrRecMenuTextActiveBack = FF404749
clrRecMenuKeyboardBack = FF000044 clrRecMenuKeyboardBack = FF000044
clrRecMenuKeyboardBorder = FF3C3C3C clrRecMenuKeyboardBorder = FF6C6C6C
clrRecMenuKeyboardHigh = 55FFFFFF clrRecMenuKeyboardHigh = 55FFFFFF
clrButtonRedKeyboard = FFBB0000 clrButtonRedKeyboard = FFBB0000
clrButtonGreenKeyboard = FF00BB00 clrButtonGreenKeyboard = FF00BB00
clrButtonYellowKeyboard = FFBBBB00 clrButtonYellowKeyboard = FFBBBB00
clrRecMenuTimelineTimer = B012273f clrRecMenuTimelineTimer = B012273f
clrRecMenuTimelineBack = FF828282 clrRecMenuTimelineBack = 55B2B2C7
clrRecMenuTimelineActive = FF3F3F3F clrRecMenuTimelineActive = 773F3F3F
clrRecMenuTimelineConflict = 30FF0000 clrRecMenuTimelineConflict = 30FF0000
clrRecMenuTimelineConflictOverlap = 90FF0000 clrRecMenuTimelineConflictOverlap = 90FF0000

View File

@ -1,276 +1,276 @@
#include "imageloader.h" #include "imageloader.h"
#include "timeline.h" #include "timeline.h"
cTimeLine::cTimeLine(cMyTime *myTime) { cTimeLine::cTimeLine(cTimeManager *timeManager) {
this->myTime = myTime; this->timeManager = timeManager;
if (tvguideConfig.displayMode == eVertical) { lastClock = "";
dateViewer = new cStyledPixmap(osdManager.requestPixmap(1, cRect(0, timeBase = NULL;
geoManager.statusHeaderHeight, int x11, x21, y11, y21, x12, x22, y12, y22;
geoManager.dateVieverWidth, if (config.displayMode == eVertical) {
geoManager.dateVieverHeight))); x11 = 0;
timeline = osdManager.requestPixmap(2, cRect(0, x21 = geoManager.dateVieverWidth;
geoManager.statusHeaderHeight + geoManager.channelHeaderHeight + geoManager.channelGroupsHeight, y11 = geoManager.statusHeaderHeight + geoManager.clockHeight;
geoManager.timeLineWidth, y21 = geoManager.dateVieverHeight;
geoManager.osdHeight - geoManager.statusHeaderHeight - geoManager.channelHeaderHeight - geoManager.channelGroupsHeight - geoManager.footerHeight) x12 = 0;
, cRect(0, x22 = geoManager.timeLineWidth;
0, y12 = geoManager.statusHeaderHeight + geoManager.channelHeaderHeight + geoManager.channelGroupsHeight;
geoManager.timeLineWidth, y22 = geoManager.osdHeight - geoManager.statusHeaderHeight - geoManager.channelHeaderHeight - geoManager.channelGroupsHeight - geoManager.footerHeight;
1440*geoManager.minutePixel)); } else if (config.displayMode == eHorizontal) {
timeBase = osdManager.requestPixmap(3, cRect(0, x11 = geoManager.clockWidth;
geoManager.statusHeaderHeight + geoManager.channelGroupsHeight + geoManager.channelHeaderHeight, x21 = geoManager.dateVieverWidth;
geoManager.osdWidth, y11 = geoManager.statusHeaderHeight;
geoManager.timeLineGridHeight)); y21 = geoManager.dateVieverHeight;
} else if (tvguideConfig.displayMode == eHorizontal) { x12 = geoManager.channelHeaderWidth + geoManager.channelGroupsWidth;
dateViewer = new cStyledPixmap(osdManager.requestPixmap(1, cRect(0, x22 = geoManager.osdWidth - geoManager.channelHeaderWidth - geoManager.channelGroupsWidth;
geoManager.statusHeaderHeight, y12 = geoManager.statusHeaderHeight;
geoManager.dateVieverWidth, y22 = geoManager.timeLineHeight;
geoManager.dateVieverHeight))); }
timeline = osdManager.requestPixmap(2, cRect(geoManager.channelHeaderWidth + geoManager.channelGroupsWidth, dateViewer = new cStyledPixmap(osdManager.CreatePixmap(1, cRect(x11, y11, x21, y21)));
geoManager.statusHeaderHeight, timeline = osdManager.CreatePixmap(2, cRect(x12, y12, x22, y22));
geoManager.osdWidth - geoManager.channelHeaderWidth - geoManager.channelGroupsWidth, clock = new cStyledPixmap(osdManager.CreatePixmap(3, cRect(0,
geoManager.timeLineHeight) geoManager.statusHeaderHeight,
, cRect(0, geoManager.clockWidth,
0, geoManager.clockHeight)));
1440*geoManager.minutePixel, }
geoManager.timeLineHeight));
timeBase = osdManager.requestPixmap(3, cRect(geoManager.channelGroupsWidth + geoManager.channelHeaderWidth, cTimeLine::~cTimeLine(void) {
geoManager.statusHeaderHeight, if (clock)
geoManager.timeLineGridWidth, delete clock;
geoManager.timeLineHeight + tvguideConfig.channelRows * geoManager.rowHeight)); osdManager.DestroyPixmap(timeBase);
} osdManager.DestroyPixmap(timeline);
timeBase->Fill(clrTransparent); if (dateViewer)
int clockY = 10; delete dateViewer;
int clockX; }
if (tvguideConfig.scaleVideo) {
clockX = geoManager.osdWidth - geoManager.tvFrameWidth - geoManager.clockWidth - 4; void cTimeLine::DrawDateViewer(void) {
} else { cString weekDay = timeManager->GetWeekday();
clockX = geoManager.osdWidth - geoManager.clockWidth - 10; cString date = timeManager->GetDate();
} if (config.style != eStyleGraphical) {
clock = new cStyledPixmap(osdManager.requestPixmap(3, cRect(clockX, dateViewer->setColor(theme.Color(clrHeader), theme.Color(clrHeaderBlending));
clockY, dateViewer->drawBackground();
geoManager.clockWidth, dateViewer->drawBorder();
geoManager.clockHeight)));
} } else {
cImage *imgBack = imgCache.GetOsdElement(oeDateViewer);
cTimeLine::~cTimeLine(void) { if (imgBack)
delete dateViewer; dateViewer->DrawImage(cPoint(0,0), *imgBack);
osdManager.releasePixmap(timeline); else
if (clock) dateViewer->Fill(clrTransparent);
delete clock; }
} tColor colorFont = theme.Color(clrButtonYellow);
tColor colorFontBack = (config.style == eStyleFlat) ? theme.Color(clrHeader) : clrTransparent;
void cTimeLine::drawDateViewer() {
cString weekDay = myTime->GetWeekday(); if (config.displayMode == eVertical) {
cString date = myTime->GetDate(); int textHeightWeekday = fontManager.FontTimeLineWeekday->Height();
if (tvguideConfig.style != eStyleGraphical) { int textHeightDate = fontManager.FontTimeLineDate->Height();
dateViewer->setColor(theme.Color(clrHeader), theme.Color(clrHeaderBlending)); int weekdayWidth = fontManager.FontTimeLineWeekday->Width(*weekDay);
dateViewer->drawBackground(); int dateWidth = fontManager.FontTimeLineDate->Width(*date);
dateViewer->drawBorder(); int y = ((geoManager.dateVieverHeight - textHeightWeekday - textHeightDate) / 2);
dateViewer->DrawText(cPoint((geoManager.timeLineWidth - weekdayWidth) / 2, y), *weekDay, colorFont, colorFontBack, fontManager.FontTimeLineWeekday);
} else { dateViewer->DrawText(cPoint((geoManager.timeLineWidth - dateWidth) / 2, y + textHeightWeekday), *date, colorFont, colorFontBack, fontManager.FontTimeLineDate);
cImage *imgBack = imgCache.GetOsdElement(oeDateViewer); } else if (config.displayMode == eHorizontal) {
if (imgBack) cString strDate = cString::sprintf("%s %s", *weekDay, *date);
dateViewer->DrawImage(cPoint(0,0), *imgBack); int x = ((dateViewer->Width() - fontManager.FontTimeLineDateHorizontal->Width(*strDate)) / 2);
else int y = ((dateViewer->Height() - fontManager.FontTimeLineDateHorizontal->Height()) / 2);
dateViewer->Fill(clrTransparent); dateViewer->DrawText(cPoint(x, y), *strDate, colorFont, colorFontBack, fontManager.FontTimeLineDateHorizontal);
} }
tColor colorFont = theme.Color(clrFont); }
tColor colorFontBack = (tvguideConfig.style == eStyleFlat)?theme.Color(clrHeader):clrTransparent;
void cTimeLine::DrawTimeline(void) {
if (tvguideConfig.displayMode == eVertical) { // timeline->SetTile(true);
int textHeight = fontManager.FontTimeLineWeekday->Height(); timeline->Fill(clrTransparent);
int weekdayWidth = fontManager.FontTimeLineWeekday->Width(*weekDay); tColor colorFont, colorBackground;
int dateWidth = fontManager.FontTimeLineDate->Width(*date);
dateViewer->DrawText(cPoint((geoManager.timeLineWidth-weekdayWidth)/2, (geoManager.channelHeaderHeight + geoManager.channelGroupsHeight -2*textHeight)/2), *weekDay, colorFont, colorFontBack, fontManager.FontTimeLineWeekday); int imgWidth = geoManager.timeLineGridWidth;
dateViewer->DrawText(cPoint((geoManager.timeLineWidth-dateWidth)/2, (geoManager.channelHeaderHeight + geoManager.channelGroupsHeight -2*textHeight)/2 + textHeight + 5), *date, colorFont, colorFontBack, fontManager.FontTimeLineDate); int imgHeight = geoManager.timeLineGridHeight;
} else if (tvguideConfig.displayMode == eHorizontal) { const cImage *img1 = NULL;
cString strDate = cString::sprintf("%s %s", *weekDay, *date); const cImage *img2 = NULL;
int x = (dateViewer->Width() - fontManager.FontTimeLineDateHorizontal->Width(*strDate))/2; if (config.style == eStyleGraphical) {
int y = (dateViewer->Height() - fontManager.FontTimeLineDateHorizontal->Height())/2; img1 = imgCache.GetOsdElement(oeTimeline1);
dateViewer->DrawText(cPoint(x, y), *strDate, colorFont, colorFontBack, fontManager.FontTimeLineDateHorizontal); img2 = imgCache.GetOsdElement(oeTimeline2);
} } else {
} img1 = CreateBackgroundImage(imgWidth, imgHeight, theme.Color(clrTimeline1), theme.Color(clrTimeline1Blending));
img2 = CreateBackgroundImage(imgWidth, imgHeight, theme.Color(clrTimeline2), theme.Color(clrTimeline2Blending));
void cTimeLine::drawTimeline() { }
timeline->SetTile(true); const cImage *img = NULL;
timeline->Fill(clrTransparent); if (!img1 || !img2)
tColor colorFont, colorBackground; return;
int textWidth, posX, posY;
int imgWidth = geoManager.timeLineGridWidth; char timetext[10];
int imgHeight = geoManager.timeLineGridHeight;
const cImage *img1 = NULL; int halfHours;
const cImage *img2 = NULL; if (config.displayMode == eVertical)
if (tvguideConfig.style == eStyleGraphical) { halfHours = config.displayTime / 30 + 1;
img1 = imgCache.GetOsdElement(oeTimeline1); else
img2 = imgCache.GetOsdElement(oeTimeline2); halfHours = config.displayHorizontalTime / 30 + 1;
} else {
img1 = createBackgroundImage(imgWidth, imgHeight, theme.Color(clrTimeline1), theme.Color(clrTimeline1Blending)); time_t tStart = timeManager->GetStart();
img2 = createBackgroundImage(imgWidth, imgHeight, theme.Color(clrTimeline2), theme.Color(clrTimeline2Blending)); tm *t = localtime ( &tStart );
}
const cImage *img = NULL; int x = 2 * t->tm_hour + ((t->tm_min == 0) ? 0 : 1);
if (!img1 || !img2) for (int j = x; j < (x + halfHours); j++) {
return; int i = (j >= 48) ? (j - 48) : j;
int textWidth, posX, posY; if (i % 2 == 0) {
char timetext[10]; img = img1;
colorFont = theme.Color(clrTimeline2);
for (int i=0; i<48; i++) { colorBackground = (config.style == eStyleFlat)?theme.Color(clrTimeline1):clrTransparent;
if (i%2==0) { if (config.timeFormat == e12Hours) {
img = img1; if (i == 0)
colorFont = theme.Color(clrTimeline2); sprintf(timetext, "12:00 PM");
colorBackground = (tvguideConfig.style == eStyleFlat)?theme.Color(clrTimeline1):clrTransparent; else if (i/2 < 13)
if (tvguideConfig.timeFormat == e12Hours) { sprintf(timetext, "%d:00 AM", i / 2);
if (i == 0) else
sprintf(timetext, "12:00 PM"); sprintf(timetext, "%d:00 PM", i / 2 - 12);
else if (i/2 < 13) } else {
sprintf(timetext, "%d:00 AM", i/2); sprintf(timetext, "%d:00", i / 2);
else }
sprintf(timetext, "%d:00 PM", i/2-12); } else {
} else { img = img2;
sprintf(timetext, "%d:00", i/2); colorFont = theme.Color(clrTimeline1);
} colorBackground = (config.style == eStyleFlat)?theme.Color(clrTimeline2):clrTransparent;
} else { if (config.timeFormat == e12Hours) {
img = img2; if (i == 1)
colorFont = theme.Color(clrTimeline1); sprintf(timetext, "12:30 PM");
colorBackground = (tvguideConfig.style == eStyleFlat)?theme.Color(clrTimeline2):clrTransparent; else if (i/2 < 13)
if (tvguideConfig.timeFormat == e12Hours) { sprintf(timetext, "%d:30 AM", i / 2);
if (i == 1) else
sprintf(timetext, "12:30 PM"); sprintf(timetext, "%d:30 PM", i / 2 - 12);
else if (i/2 < 13) } else {
sprintf(timetext, "%d:30 AM", i/2); sprintf(timetext, "%d:30", i / 2);
else }
sprintf(timetext, "%d:30 PM", i/2-12); }
} else { if (config.displayMode == eVertical) {
sprintf(timetext, "%d:30", i/2); posY = (j - x) * geoManager.minutePixel * 30;
} timeline->DrawImage(cPoint(0, posY), *img);
} if (config.style != eStyleGraphical) {
if (tvguideConfig.displayMode == eVertical) { DecorateTile(0, posY, imgWidth + 2, imgHeight);
posY = i*geoManager.minutePixel*30; }
timeline->DrawImage(cPoint(0, posY), *img); textWidth = fontManager.FontTimeLineTime->Width(timetext);
if (tvguideConfig.style != eStyleGraphical) { timeline->DrawText(cPoint((geoManager.timeLineWidth-textWidth) / 2, posY + 5), timetext, colorFont, colorBackground, fontManager.FontTimeLineTime);
decorateTile(0, posY, imgWidth+2, imgHeight); } else if (config.displayMode == eHorizontal) {
} posX = (j - x) * geoManager.minutePixel * 30;
textWidth = fontManager.FontTimeLineTime->Width(timetext); timeline->DrawImage(cPoint(posX, 0), *img);
timeline->DrawText(cPoint((geoManager.timeLineWidth-textWidth)/2, posY + 5), timetext, colorFont, colorBackground, fontManager.FontTimeLineTime); if (config.style != eStyleGraphical) {
} else if (tvguideConfig.displayMode == eHorizontal) { DecorateTile(posX, 0, imgWidth, imgHeight + 2);
posX = i*geoManager.minutePixel*30; }
timeline->DrawImage(cPoint(posX, 0), *img); timeline->DrawText(cPoint(posX + 15, (dateViewer->Height() - fontManager.FontTimeLineTimeHorizontal->Height()) / 2), timetext, colorFont, colorBackground, fontManager.FontTimeLineTimeHorizontal);
if (tvguideConfig.style != eStyleGraphical) { }
decorateTile(posX, 0, imgWidth, imgHeight+2); }
} DrawTimeIndicator();
timeline->DrawText(cPoint(posX + 15, (dateViewer->Height() - fontManager.FontTimeLineTimeHorizontal->Height())/2), timetext, colorFont, colorBackground, fontManager.FontTimeLineTimeHorizontal); if (config.style != eStyleGraphical) {
} delete img1;
} delete img2;
setTimeline(); }
if (tvguideConfig.style != eStyleGraphical) { }
delete img1;
delete img2; void cTimeLine::DecorateTile(int posX, int posY, int tileWidth, int tileHeight) {
} timeline->DrawRectangle(cRect(posX,posY,tileWidth,2), clrTransparent); //top
} timeline->DrawRectangle(cRect(posX,posY,2,tileHeight), clrTransparent); //left
timeline->DrawRectangle(cRect(posX,posY + tileHeight-2,tileWidth,2), clrTransparent); //bottom
void cTimeLine::decorateTile(int posX, int posY, int tileWidth, int tileHeight) { timeline->DrawRectangle(cRect(posX + tileWidth-2,posY,2,tileHeight), clrTransparent); //right
timeline->DrawRectangle(cRect(posX,posY,tileWidth,2), clrTransparent); //top
timeline->DrawRectangle(cRect(posX,posY,2,tileHeight), clrTransparent); //left timeline->DrawRectangle(cRect(2+posX,posY+2,tileWidth-4,1), theme.Color(clrBorder)); //top
timeline->DrawRectangle(cRect(posX,posY + tileHeight-2,tileWidth,2), clrTransparent); //bottom timeline->DrawRectangle(cRect(2+posX,posY+2,1,tileHeight-4), theme.Color(clrBorder)); //left
timeline->DrawRectangle(cRect(posX + tileWidth-2,posY,2,tileHeight), clrTransparent); //right timeline->DrawRectangle(cRect(2+posX,posY+tileHeight-3,tileWidth-4,1), theme.Color(clrBorder)); //bottom
timeline->DrawRectangle(cRect(posX+tileWidth-3,posY+2,1,tileHeight-4), theme.Color(clrBorder)); //right
timeline->DrawRectangle(cRect(2+posX,posY+2,tileWidth-4,1), theme.Color(clrBorder)); //top
timeline->DrawRectangle(cRect(2+posX,posY+2,1,tileHeight-4), theme.Color(clrBorder)); //left if (config.roundedCorners) {
timeline->DrawRectangle(cRect(2+posX,posY+tileHeight-3,tileWidth-4,1), theme.Color(clrBorder)); //bottom int borderRadius = 12;
timeline->DrawRectangle(cRect(posX+tileWidth-3,posY+2,1,tileHeight-4), theme.Color(clrBorder)); //right DrawRoundedCorners(posX, posY, tileWidth, tileHeight, borderRadius);
}
if (tvguideConfig.roundedCorners) { }
int borderRadius = 12;
drawRoundedCorners(posX, posY, tileWidth, tileHeight, borderRadius); void cTimeLine::DrawRoundedCorners(int posX, int posY, int width, int height, int radius) {
} timeline->DrawEllipse(cRect(posX+2,posY+2,radius,radius), theme.Color(clrBorder), -2);
} timeline->DrawEllipse(cRect(posX+1,posY+1,radius,radius), clrTransparent, -2);
void cTimeLine::drawRoundedCorners(int posX, int posY, int width, int height, int radius) { timeline->DrawEllipse(cRect(posX+width-radius - 2,posY+2,radius,radius), theme.Color(clrBorder), -1);
timeline->DrawEllipse(cRect(posX+2,posY+2,radius,radius), theme.Color(clrBorder), -2); timeline->DrawEllipse(cRect(posX+width-radius - 1,posY+1,radius,radius), clrTransparent, -1);
timeline->DrawEllipse(cRect(posX+1,posY+1,radius,radius), clrTransparent, -2);
if( height > 2*radius) {
timeline->DrawEllipse(cRect(posX+width-radius - 2,posY+2,radius,radius), theme.Color(clrBorder), -1); timeline->DrawEllipse(cRect(posX+2,posY+height-radius - 2,radius,radius), theme.Color(clrBorder), -3);
timeline->DrawEllipse(cRect(posX+width-radius - 1,posY+1,radius,radius), clrTransparent, -1); timeline->DrawEllipse(cRect(posX+1,posY+height-radius - 1,radius,radius), clrTransparent, -3);
if( height > 2*radius) { timeline->DrawEllipse(cRect(posX+width-radius - 2,posY+height-radius - 2,radius,radius), theme.Color(clrBorder), -4);
timeline->DrawEllipse(cRect(posX+2,posY+height-radius - 2,radius,radius), theme.Color(clrBorder), -3); timeline->DrawEllipse(cRect(posX+width-radius - 1,posY+height-radius - 1,radius,radius), clrTransparent, -4);
timeline->DrawEllipse(cRect(posX+1,posY+height-radius - 1,radius,radius), clrTransparent, -3); }
}
timeline->DrawEllipse(cRect(posX+width-radius - 2,posY+height-radius - 2,radius,radius), theme.Color(clrBorder), -4);
timeline->DrawEllipse(cRect(posX+width-radius - 1,posY+height-radius - 1,radius,radius), clrTransparent, -4); void cTimeLine::DrawTimeIndicator(void) {
} if (!config.displayTimeBase)
} return;
if (!timeManager->NowVisible()) {
void cTimeLine::drawCurrentTimeBase(void) { if (timeBase)
timeBase->Fill(clrTransparent); timeBase->Fill(clrTransparent);
bool nowVisible = myTime->NowVisible(); return;
if (!nowVisible) }
return; int deltaTime = (time(0) - timeManager->GetStart()) / 60 * geoManager.minutePixel;
int deltaTime = (myTime->GetNow() - myTime->GetStart()) / 60 * geoManager.minutePixel; osdManager.DestroyPixmap(timeBase);
if (tvguideConfig.displayMode == eVertical) { int x1, x2, y1, y2;
timeBase->DrawRectangle(cRect(0, deltaTime - 2, timeBase->ViewPort().Width(), 4), theme.Color(clrTimeBase)); if (config.displayMode == eVertical) {
} else { x1 = 0;
timeBase->DrawRectangle(cRect(deltaTime-2, 0, 4, timeBase->ViewPort().Height()), theme.Color(clrTimeBase)); y1 = geoManager.statusHeaderHeight + geoManager.channelGroupsHeight + geoManager.channelHeaderHeight + deltaTime - 2;
} x2 = geoManager.osdWidth;
} y2 = 4;
} else {
x1 = geoManager.channelGroupsWidth + geoManager.channelHeaderWidth + deltaTime - 2;
cImage *cTimeLine::createBackgroundImage(int width, int height, tColor clrBgr, tColor clrBlend) { y1 = geoManager.statusHeaderHeight;
cImage *image = NULL; x2 = 4;
if (tvguideConfig.style == eStyleBlendingDefault) { y2 = geoManager.timeLineHeight + config.channelRows * geoManager.rowHeight;
image = new cImage(cSize(width, height)); }
image->Fill(clrBgr); timeBase = osdManager.CreatePixmap(3, cRect(x1, y1, x2, y2));
int stepY = 0.5*height / 64; timeBase->Fill(clrTransparent);
int alpha = 0x00; timeBase->DrawRectangle(cRect(0, 0, timeBase->ViewPort().Width(), timeBase->ViewPort().Height()), theme.Color(clrTimeBase));
tColor clr; }
for (int i = 0; i<64; i++) {
clr = AlphaBlend(clrBgr, clrBlend, alpha); cImage *cTimeLine::CreateBackgroundImage(int width, int height, tColor clrBgr, tColor clrBlend) {
for (int y = i*stepY; y < (i+1)*stepY; y++) { cImage *image = NULL;
for (int x=0; x<width; x++) { if (config.style == eStyleBlendingDefault) {
image->SetPixel(cPoint(x,y), clr); image = new cImage(cSize(width, height));
} image->Fill(clrBgr);
} int stepY = 0.5*height / 64;
alpha += 0x04; int alpha = 0x00;
} tColor clr;
} else if (tvguideConfig.style == eStyleBlendingMagick) { for (int i = 0; i<64; i++) {
cImageLoader imgLoader; clr = AlphaBlend(clrBgr, clrBlend, alpha);
if (imgLoader.DrawBackground(clrBgr, clrBlend, width, height)) { for (int y = i*stepY; y < (i+1)*stepY; y++) {
image = new cImage(imgLoader.GetImage()); for (int x=0; x<width; x++) {
} image->SetPixel(cPoint(x,y), clr);
} else { }
image = new cImage(cSize(width, height)); }
image->Fill(clrBgr); alpha += 0x04;
} }
return image; } else if (config.style == eStyleBlendingMagick) {
} cImageLoader imgLoader;
if (imgLoader.DrawBackground(clrBgr, clrBlend, width, height)) {
void cTimeLine::setTimeline() { image = new cImage(imgLoader.GetImage());
int offset = myTime->GetTimelineOffset(); }
int xNew, yNew; } else {
if (tvguideConfig.displayMode == eVertical) { image = new cImage(cSize(width, height));
xNew = 0; image->Fill(clrBgr);
yNew = -offset*geoManager.minutePixel; }
} else if (tvguideConfig.displayMode == eHorizontal) { return image;
xNew = -offset*geoManager.minutePixel; }
yNew = 0;
} bool cTimeLine::DrawClock(void) {
timeline->SetDrawPortPoint(cPoint(xNew, yNew)); cString currentTime = timeManager->GetCurrentTime();
if (tvguideConfig.displayTimeBase) if (strcmp(currentTime, lastClock)) {
drawCurrentTimeBase(); clock->Fill(clrTransparent);
} const cFont *font = (config.displayMode == eVertical) ? fontManager.FontTimeLineTime : fontManager.FontTimeLineTimeHorizontal;
int textHeight = font->Height();
void cTimeLine::drawClock() { int clockTextWidth = font->Width(*currentTime);
clock->Fill(clrTransparent); tColor colorFontBack = (config.style == eStyleFlat) ? theme.Color(clrHeader) : clrTransparent;
cString currentTime = myTime->GetCurrentTime(); if (config.style == eStyleGraphical) {
const cFont *font = (tvguideConfig.displayMode == eVertical)?fontManager.FontTimeLineTime:fontManager.FontTimeLineTimeHorizontal; clock->drawBackgroundGraphical(bgClock);
int textHeight = font->Height(); } else {
int clockTextWidth = font->Width(*currentTime); clock->setColor(theme.Color(clrHeader), theme.Color(clrHeaderBlending));
tColor colorFontBack = (tvguideConfig.style == eStyleFlat)?theme.Color(clrHeader):clrTransparent; clock->drawBackground();
if (tvguideConfig.style == eStyleGraphical) { clock->drawBorder();
clock->drawBackgroundGraphical(bgClock); }
} else { clock->DrawText(cPoint((geoManager.clockWidth - clockTextWidth) / 2, (geoManager.clockHeight - textHeight) / 2), *currentTime, theme.Color(clrFont), colorFontBack, font);
clock->setColor(theme.Color(clrHeader), theme.Color(clrHeaderBlending)); lastClock = currentTime;
clock->drawBackground(); DrawTimeIndicator();
clock->drawBorder(); return true;
} }
clock->DrawText(cPoint((geoManager.clockWidth-clockTextWidth)/2, (geoManager.clockHeight-textHeight)/2), *currentTime, theme.Color(clrFont), colorFontBack, font); return false;
} }

View File

@ -1,29 +1,29 @@
#ifndef __TVGUIDE_TIMELINE_H #ifndef __TVGUIDE_TIMELINE_H
#define __TVGUIDE_TIMELINE_H #define __TVGUIDE_TIMELINE_H
#include "timer.h" #include "timemanager.h"
#include "styledpixmap.h" #include "styledpixmap.h"
// --- cTimeLine ------------------------------------------------------------- // --- cTimeLine -------------------------------------------------------------
class cTimeLine { class cTimeLine {
private: private:
cMyTime *myTime; cTimeManager *timeManager;
cStyledPixmap *dateViewer; cStyledPixmap *dateViewer;
cPixmap *timeline; cPixmap *timeline;
cStyledPixmap *clock; cStyledPixmap *clock;
cPixmap *timeBase; cPixmap *timeBase;
void decorateTile(int posX, int posY, int tileWidth, int tileHeight); cString lastClock;
void drawRoundedCorners(int posX, int posY, int width, int height, int radius); void DecorateTile(int posX, int posY, int tileWidth, int tileHeight);
cImage *createBackgroundImage(int width, int height, tColor clrBgr, tColor clrBlend); void DrawRoundedCorners(int posX, int posY, int width, int height, int radius);
void drawCurrentTimeBase(void); cImage *CreateBackgroundImage(int width, int height, tColor clrBgr, tColor clrBlend);
public: public:
cTimeLine(cMyTime *myTime); cTimeLine(cTimeManager *timeManager);
virtual ~cTimeLine(void); virtual ~cTimeLine(void);
void setTimeline(); void DrawDateViewer(void);
void drawDateViewer(); void DrawTimeline(void);
void drawTimeline(); void DrawTimeIndicator(void);
void drawClock(); bool DrawClock(void);
}; };
#endif //__TVGUIDE_TIMELINE_H #endif //__TVGUIDE_TIMELINE_H

View File

@ -1,178 +1,178 @@
#include <time.h> #include <time.h>
#include <vdr/tools.h> #include <vdr/tools.h>
#include "config.h" #include "config.h"
#include "timer.h" #include "timemanager.h"
cMyTime::~cMyTime(void) { cTimeManager::cTimeManager(void) {
} if (config.displayMode == eVertical) {
displaySeconds = (geoManager.osdHeight - geoManager.statusHeaderHeight - geoManager.channelHeaderHeight - geoManager.channelGroupsHeight - geoManager.footerHeight) / geoManager.minutePixel * 60;
cString cMyTime::printTime(time_t displayTime) { } else if (config.displayMode == eHorizontal) {
struct tm *ts; displaySeconds = (geoManager.osdWidth - geoManager.channelHeaderWidth - geoManager.channelGroupsWidth) / geoManager.minutePixel * 60;
ts = localtime(&displayTime); }
cString strTime = cString::sprintf("%d.%d-%d:%d.%d", ts->tm_mday, ts->tm_mon+1, ts->tm_hour, ts->tm_min, ts->tm_sec); }
return strTime;
} cTimeManager::~cTimeManager(void) {
}
void cMyTime::Now() { cString cTimeManager::printTime(time_t displayTime) {
t = time(0); struct tm *ts;
tStart = t; ts = localtime(&displayTime);
tStart = GetRounded(); cString strTime = cString::sprintf("%d.%d-%d:%d.%d", ts->tm_mday, ts->tm_mon+1, ts->tm_hour, ts->tm_min, ts->tm_sec);
if (tvguideConfig.displayMode == eVertical) { return strTime;
tEnd = tStart + (geoManager.osdHeight - geoManager.statusHeaderHeight - geoManager.channelHeaderHeight - geoManager.channelGroupsHeight - geoManager.footerHeight)/geoManager.minutePixel*60; }
} else if (tvguideConfig.displayMode == eHorizontal) {
tEnd = tStart + (geoManager.osdWidth - geoManager.channelHeaderWidth - geoManager.channelGroupsWidth)/geoManager.minutePixel*60;
} void cTimeManager::Now() {
} t = time(0);
tStart = t;
void cMyTime::AddStep(int step) { tStart = GetRounded();
tStart += step*60; tEnd = tStart + displaySeconds;
tEnd += step*60; }
}
void cTimeManager::AddStep(int step) {
bool cMyTime::DelStep(int step) { tStart += step * 60;
if ((tStart - step*60)+30*60 < t) { tEnd = tStart + displaySeconds;
return true; }
}
tStart -= step*60; void cTimeManager::DelStep(int step) {
tEnd -= step*60; if ((tStart - step * 60) + 30 * 60 < t) {
return false; Now();
} } else {
tStart -= step * 60;
void cMyTime::SetTime(time_t newTime) { tEnd = tStart + displaySeconds;
tStart = newTime; }
if (tvguideConfig.displayMode == eVertical) { }
tEnd = tStart + (geoManager.osdHeight - geoManager.statusHeaderHeight - geoManager.channelHeaderHeight - geoManager.channelGroupsHeight - geoManager.footerHeight)/geoManager.minutePixel*60;
} else if (tvguideConfig.displayMode == eHorizontal) { void cTimeManager::SetTime(time_t newTime) {
tEnd = tStart + (geoManager.osdWidth - geoManager.channelHeaderWidth - geoManager.channelGroupsWidth)/geoManager.minutePixel*60; tStart = newTime;
} tEnd = tStart + displaySeconds;
} }
time_t cMyTime::getPrevPrimetime(time_t current) { time_t cTimeManager::getPrevPrimetime(time_t current) {
tm *st = localtime(&current); tm *st = localtime(&current);
if (st->tm_hour < 21) { if (st->tm_hour < 21) {
current -= 24 * 60* 60; current -= 24 * 60 * 60;
st = localtime(&current); st = localtime(&current);
} }
st->tm_hour = 20; st->tm_hour = 20;
st->tm_min = 0; st->tm_min = 0;
time_t primeTime = mktime(st); time_t primeTime = mktime(st);
return primeTime; return primeTime;
} }
time_t cMyTime::getNextPrimetime(time_t current){ time_t cTimeManager::getNextPrimetime(time_t current){
tm *st = localtime(&current); tm *st = localtime(&current);
if (st->tm_hour > 19) { if (st->tm_hour > 19) {
current += 24 * 60* 60; current += 24 * 60 * 60;
st = localtime(&current); st = localtime(&current);
} }
st->tm_hour = 20; st->tm_hour = 20;
st->tm_min = 0; st->tm_min = 0;
time_t primeTime = mktime(st); time_t primeTime = mktime(st);
return primeTime; return primeTime;
} }
bool cMyTime::tooFarInPast(time_t current) { bool cTimeManager::tooFarInPast(time_t current) {
if (current < t) { if (current < t) {
return true; return true;
} }
return false; return false;
} }
cString cMyTime::GetCurrentTime() { cString cTimeManager::GetCurrentTime() {
char buf[25]; char buf[25];
t = time(0); t = time(0);
tm *st = localtime(&t); tm *st = localtime(&t);
//snprintf(text, sizeof(text), "%d:%02d", st->tm_hour, st->tm_min); //snprintf(text, sizeof(text), "%d:%02d", st->tm_hour, st->tm_min);
if (tvguideConfig.timeFormat == e12Hours) { if (config.timeFormat == e12Hours) {
strftime(buf, sizeof(buf), "%I:%M %p", st); strftime(buf, sizeof(buf), "%I:%M %p", st);
} else if (tvguideConfig.timeFormat == e24Hours) } else if (config.timeFormat == e24Hours)
strftime(buf, sizeof(buf), "%H:%M", st); strftime(buf, sizeof(buf), "%H:%M", st);
return buf; return buf;
} }
cString cMyTime::GetDate() { cString cTimeManager::GetDate() {
char text[6]; char text[6];
tm *st = localtime(&tStart); tm *st = localtime(&tStart);
snprintf(text, sizeof(text), "%d.%d", st->tm_mday, st->tm_mon+1); snprintf(text, sizeof(text), "%d.%d", st->tm_mday, st->tm_mon+1);
return text; return text;
} }
cString cMyTime::GetWeekday() { cString cTimeManager::GetWeekday() {
return WeekDayName(tStart); return WeekDayName(tStart);
} }
int cMyTime::GetTimelineOffset() { int cTimeManager::GetTimelineOffset() {
tm *st = localtime(&tStart); tm *st = localtime(&tStart);
int offset = st->tm_hour*60; int offset = st->tm_hour*60;
offset += st->tm_min; offset += st->tm_min;
return offset; return offset;
} }
time_t cMyTime::GetRounded() { time_t cTimeManager::GetRounded() {
tm *rounded = localtime ( &tStart ); tm *rounded = localtime ( &tStart );
rounded->tm_sec = 0; rounded->tm_sec = 0;
if (rounded->tm_min > 29) if (rounded->tm_min > 29)
rounded->tm_min = 30; rounded->tm_min = 30;
else else
rounded->tm_min = 0; rounded->tm_min = 0;
return mktime(rounded); return mktime(rounded);
} }
bool cMyTime::NowVisible(void) { bool cTimeManager::NowVisible(void) {
if (t > tStart) if (t > tStart)
return true; return true;
return false; return false;
} }
void cMyTime::debug() { void cTimeManager::debug() {
esyslog("t: %s, tStart: %s, tEnd: %s", *TimeString(t), *TimeString(tStart), *TimeString(tEnd)); esyslog("t: %s, tStart: %s, tEnd: %s", *TimeString(t), *TimeString(tStart), *TimeString(tEnd));
} }
// --- cTimeInterval ------------------------------------------------------------- // --- cTimeInterval -------------------------------------------------------------
cTimeInterval::cTimeInterval(time_t start, time_t stop) { cTimeInterval::cTimeInterval(time_t start, time_t stop) {
this->start = start; this->start = start;
this->stop = stop; this->stop = stop;
} }
cTimeInterval::~cTimeInterval(void) { cTimeInterval::~cTimeInterval(void) {
} }
cTimeInterval *cTimeInterval::Intersect(cTimeInterval *interval) { cTimeInterval *cTimeInterval::Intersect(cTimeInterval *interval) {
time_t startIntersect, stopIntersect; time_t startIntersect, stopIntersect;
if ((stop <= interval->Start()) || (interval->Stop() <= start)) { if ((stop <= interval->Start()) || (interval->Stop() <= start)) {
return NULL; return NULL;
} }
if (start <= interval->Start()) { if (start <= interval->Start()) {
startIntersect = interval->Start(); startIntersect = interval->Start();
} else { } else {
startIntersect = start; startIntersect = start;
} }
if (stop <= interval->Stop()) { if (stop <= interval->Stop()) {
stopIntersect = stop; stopIntersect = stop;
} else { } else {
stopIntersect = interval->Stop(); stopIntersect = interval->Stop();
} }
return new cTimeInterval(startIntersect, stopIntersect); return new cTimeInterval(startIntersect, stopIntersect);
} }
cTimeInterval *cTimeInterval::Union(cTimeInterval *interval) { cTimeInterval *cTimeInterval::Union(cTimeInterval *interval) {
time_t startUnion, stopUnion; time_t startUnion, stopUnion;
if (start <= interval->Start()) { if (start <= interval->Start()) {
startUnion = start; startUnion = start;
} else { } else {
startUnion = interval->Start(); startUnion = interval->Start();
} }
if (stop <= interval->Stop()) { if (stop <= interval->Stop()) {
stopUnion = interval->Stop(); stopUnion = interval->Stop();
} else { } else {
stopUnion = stop; stopUnion = stop;
} }
return new cTimeInterval(startUnion, stopUnion); return new cTimeInterval(startUnion, stopUnion);
} }

View File

@ -1,52 +1,56 @@
#ifndef __TVGUIDE_TIMER_H #ifndef __TVGUIDE_TIMEMANAGER_H
#define __TVGUIDE_TIMER_H #define __TVGUIDE_TIMEMANAGER_H
#include <vdr/tools.h> #include <vdr/tools.h>
#include "config.h"
// --- cMyTime -------------------------------------------------------------
// --- cTimeManager -------------------------------------------------------------
class cMyTime {
private: class cTimeManager {
time_t t; private:
time_t tStart; time_t t;
time_t tEnd; time_t tStart;
public: time_t tEnd;
cMyTime(){}; int displaySeconds;
virtual ~cMyTime(void); eTimeFormat timeFormat;
static cString printTime(time_t displayTime); public:
void Now(); cTimeManager();
time_t GetNow() { return t; }; virtual ~cTimeManager(void);
void AddStep(int step); static cString printTime(time_t displayTime);
bool DelStep(int step); void Now();
void SetTime(time_t newTime); time_t GetNow() { return t; };
time_t Get() {return t;}; void AddStep(int step);
time_t GetStart() {return tStart;}; void DelStep(int step);
time_t GetEnd() {return tEnd;}; void SetTime(time_t newTime);
cString GetCurrentTime(); time_t Get() {return t;};
cString GetDate(); time_t GetStart() {return tStart;};
cString GetWeekday(); time_t GetEnd() {return tEnd;};
time_t getPrevPrimetime(time_t current); cString GetCurrentTime();
time_t getNextPrimetime(time_t current); cString GetDate();
bool tooFarInPast(time_t current); cString GetWeekday();
int GetTimelineOffset(); time_t getPrevPrimetime(time_t current);
time_t GetRounded(); time_t getNextPrimetime(time_t current);
bool NowVisible(void); bool tooFarInPast(time_t current);
void debug(); int GetTimelineOffset();
}; time_t GetRounded();
bool NowVisible(void);
// --- cTimeInterval ------------------------------------------------------------- int GetDisplaySeconds(void) { return displaySeconds; };
void debug();
class cTimeInterval { };
private:
time_t start; // --- cTimeInterval -------------------------------------------------------------
time_t stop;
public: class cTimeInterval {
cTimeInterval(time_t start, time_t stop); private:
virtual ~cTimeInterval(void); time_t start;
time_t Start(void) { return start; }; time_t stop;
time_t Stop(void) { return stop; }; public:
cTimeInterval *Intersect(cTimeInterval *interval); cTimeInterval(time_t start, time_t stop);
cTimeInterval *Union(cTimeInterval *interval); virtual ~cTimeInterval(void);
}; time_t Start(void) { return start; };
time_t Stop(void) { return stop; };
#endif //__TVGUIDE_TIMER_H cTimeInterval *Intersect(cTimeInterval *interval);
cTimeInterval *Union(cTimeInterval *interval);
};
#endif //__TVGUIDE_TIMEMANAGER_H

View File

@ -1,177 +1,185 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <vdr/timers.h> #include <vdr/timers.h>
#include "tools.h" #include "tools.h"
#include "timer.h" #include "timemanager.h"
#include "timerconflict.h" #include "timerconflict.h"
cTVGuideTimerConflict::cTVGuideTimerConflict(void) { cTVGuideTimerConflict::cTVGuideTimerConflict(void) {
time = 0; time = 0;
timeStart = 0; timeStart = 0;
timeStop = 0; timeStop = 0;
overlapStart = 0; overlapStart = 0;
overlapStop = 0; overlapStop = 0;
percentPossible = 0; percentPossible = 0;
timerID = 0; timerID = 0;
} }
cTVGuideTimerConflict::~cTVGuideTimerConflict(void) { cTVGuideTimerConflict::~cTVGuideTimerConflict(void) {
}
}
bool cTVGuideTimerConflict::timerInvolved(int involvedID) {
bool cTVGuideTimerConflict::timerInvolved(int involvedID) { int numConflicts = timerIDs.size();
int numConflicts = timerIDs.size(); for (int i = 0; i < numConflicts; i++) {
for (int i=0; i<numConflicts; i++) { if (timerIDs[i] == involvedID)
if (timerIDs[i] == involvedID) return true;
return true; }
} return false;
return false; }
}
// --- cTVGuideTimerConflicts------------------------------------
// --- cTVGuideTimerConflicts------------------------------------
cTVGuideTimerConflicts::cTVGuideTimerConflicts(void) {
cTVGuideTimerConflicts::cTVGuideTimerConflicts(void) { numConflicts = 0;
numConflicts = 0; currentConflict = -1;
currentConflict = -1; }
}
cTVGuideTimerConflicts::~cTVGuideTimerConflicts(void) {
cTVGuideTimerConflicts::~cTVGuideTimerConflicts(void) { for(std::vector<cTVGuideTimerConflict*>::const_iterator it = conflicts.begin(); it != conflicts.end(); it++) {
for(std::vector<cTVGuideTimerConflict*>::const_iterator it = conflicts.begin(); it != conflicts.end(); it++) { cTVGuideTimerConflict *conf = *it;
cTVGuideTimerConflict *conf = *it; delete conf;
delete conf; }
} conflicts.clear();
conflicts.clear(); }
}
void cTVGuideTimerConflicts::AddConflict(std::string epgSearchConflictLine) {
void cTVGuideTimerConflicts::AddConflict(std::string epgSearchConflictLine) { /* TIMERCONFLICT FORMAT:
/* TIMERCONFLICT FORMAT: The result list looks like this for example when we have 2 timer conflicts at one time:
The result list looks like this for example when we have 2 timer conflicts at one time: 1190232780:152|30|50#152#45:45|10|50#152#45
1190232780:152|30|50#152#45:45|10|50#152#45 '1190232780' is the time of the conflict in seconds since 1970-01-01.
'1190232780' is the time of the conflict in seconds since 1970-01-01. It's followed by list of timers that have a conflict at this time:
It's followed by list of timers that have a conflict at this time: '152|30|50#152#45' is the description of the first conflicting timer. Here:
'152|30|50#1 int editTimer(cTimer *timer, bool active, int prio, int start, int stop); '152' is VDR's timer id of this timer as returned from VDR's LSTT command
52#45' is the description of the first conflicting timer. Here: '30' is the percentage of recording that would be done (0...100)
'152' is VDR's timer id of this timer as returned from VDR's LSTT command '50#152#45' is the list of concurrent timers at this conflict
'30' is the percentage of recording that would be done (0...100) '45|10|50#152#45' describes the next conflict
'50#152#45' is the list of concurrent timers at this conflict */
'45|10|50#152#45' describes the next conflict cTVGuideTimerConflict *conflict = new cTVGuideTimerConflict();
*/ splitstring s(epgSearchConflictLine.c_str());
cTVGuideTimerConflict *conflict = new cTVGuideTimerConflict(); std::vector<std::string> flds = s.split(':');
splitstring s(epgSearchConflictLine.c_str()); if (flds.size() < 2)
std::vector<std::string> flds = s.split(':'); return;
if (flds.size() < 2) conflict->time = atoi(flds[0].c_str());
return; splitstring s2(flds[1].c_str());
conflict->time = atoi(flds[0].c_str()); std::vector<std::string> flds2 = s2.split('|');
splitstring s2(flds[1].c_str()); if (flds2.size() < 3)
std::vector<std::string> flds2 = s2.split('|'); return;
if (flds2.size() < 3) conflict->timerID = atoi(flds2[0].c_str());
return; conflict->percentPossible = atoi(flds2[1].c_str());
conflict->timerID = atoi(flds2[0].c_str()); splitstring s3(flds2[2].c_str());
conflict->percentPossible = atoi(flds2[1].c_str()); std::vector<std::string> flds3 = s3.split('#');
splitstring s3(flds2[2].c_str()); std::vector<int> timerIDs;
std::vector<std::string> flds3 = s3.split('#'); for (int k = 0; k < (int)flds3.size(); k++) {
std::vector<int> timerIDs; timerIDs.push_back(atoi(flds3[k].c_str()) - 1);
for (int k = 0; k < flds3.size(); k++) { }
timerIDs.push_back(atoi(flds3[k].c_str()) - 1); conflict->timerIDs = timerIDs;
} conflicts.push_back(conflict);
conflict->timerIDs = timerIDs; }
conflicts.push_back(conflict);
} void cTVGuideTimerConflicts::CalculateConflicts(void) {
numConflicts = conflicts.size();
void cTVGuideTimerConflicts::CalculateConflicts(void) { for (int i=0; i < numConflicts; i++) {
numConflicts = conflicts.size(); cTimeInterval *unionSet = NULL;
time_t startTime = 0; int numTimers = conflicts[i]->timerIDs.size();
time_t endTime = 0; #if VDRVERSNUM >= 20301
for (int i=0; i < numConflicts; i++) { LOCK_TIMERS_READ;
cTimeInterval *unionSet = NULL; const cTimers* timers = Timers;
int numTimers = conflicts[i]->timerIDs.size(); for (int j=0; j < numTimers; j++) {
for (int j=0; j < numTimers; j++) { const cTimer *timer = timers->GetById(conflicts[i]->timerIDs[j] + 1);
const cTimer *timer = Timers.Get(conflicts[i]->timerIDs[j]); #else
if (timer) { const cTimers* timers = &Timers;
if (!unionSet) { for (int j=0; j < numTimers; j++) {
unionSet = new cTimeInterval(timer->StartTime(), timer->StopTime()); const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]);
} else { #endif
cTimeInterval *timerInterval = new cTimeInterval(timer->StartTime(), timer->StopTime()); if (timer) {
cTimeInterval *newUnion = unionSet->Union(timerInterval); if (!unionSet) {
delete unionSet; unionSet = new cTimeInterval(timer->StartTime(), timer->StopTime());
delete timerInterval; } else {
unionSet = newUnion; cTimeInterval *timerInterval = new cTimeInterval(timer->StartTime(), timer->StopTime());
} cTimeInterval *newUnion = unionSet->Union(timerInterval);
} delete unionSet;
} delete timerInterval;
conflicts[i]->timeStart = unionSet->Start(); unionSet = newUnion;
conflicts[i]->timeStop = unionSet->Stop(); }
delete unionSet; }
}
cTimeInterval *intersect = NULL; conflicts[i]->timeStart = unionSet->Start();
for (int j=0; j < numTimers; j++) { conflicts[i]->timeStop = unionSet->Stop();
const cTimer *timer = Timers.Get(conflicts[i]->timerIDs[j]); delete unionSet;
if (timer) {
if (!intersect) { cTimeInterval *intersect = NULL;
intersect = new cTimeInterval(timer->StartTime(), timer->StopTime()); for (int j=0; j < numTimers; j++) {
} else { #if VDRVERSNUM >= 20301
cTimeInterval *timerInterval = new cTimeInterval(timer->StartTime(), timer->StopTime()); const cTimer *timer = timers->GetById(conflicts[i]->timerIDs[j] + 1);
cTimeInterval *newIntersect = intersect->Intersect(timerInterval); #else
if (newIntersect) { const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]);
delete intersect; #endif
intersect = newIntersect; if (timer) {
} if (!intersect) {
delete timerInterval; intersect = new cTimeInterval(timer->StartTime(), timer->StopTime());
} } else {
} cTimeInterval *timerInterval = new cTimeInterval(timer->StartTime(), timer->StopTime());
} cTimeInterval *newIntersect = intersect->Intersect(timerInterval);
conflicts[i]->overlapStart = intersect->Start(); if (newIntersect) {
conflicts[i]->overlapStop = intersect->Stop(); delete intersect;
delete intersect; intersect = newIntersect;
} }
} delete timerInterval;
}
cTVGuideTimerConflict *cTVGuideTimerConflicts::GetCurrentConflict(void) { }
if (currentConflict < 0) }
return NULL; conflicts[i]->overlapStart = intersect->Start();
if (currentConflict > (numConflicts-1)) conflicts[i]->overlapStop = intersect->Stop();
return NULL; delete intersect;
return conflicts[currentConflict]; }
} }
int cTVGuideTimerConflicts::GetCurrentConflictTimerID(int timerIndex) { cTVGuideTimerConflict *cTVGuideTimerConflicts::GetCurrentConflict(void) {
if (currentConflict < 0) if (currentConflict < 0)
return -1; return NULL;
if (currentConflict > (numConflicts-1)) if (currentConflict > (numConflicts-1))
return -1; return NULL;
int numTimersInConflict = conflicts[currentConflict]->timerIDs.size(); return conflicts[currentConflict];
if (timerIndex > (numTimersInConflict - 1)) }
return -1;
return conflicts[currentConflict]->timerIDs[timerIndex]; int cTVGuideTimerConflicts::GetCurrentConflictTimerID(int timerIndex) {
} if (currentConflict < 0)
return -1;
int cTVGuideTimerConflicts::GetCorrespondingConflict(int timerID) { if (currentConflict > (numConflicts-1))
int conflictIndex = -1; return -1;
if (numConflicts > 0) { int numTimersInConflict = conflicts[currentConflict]->timerIDs.size();
for (int i=0; i<numConflicts; i++) { if (timerIndex > (numTimersInConflict - 1))
if (conflicts[i]->timerInvolved(timerID)) { return -1;
conflictIndex = i; return conflicts[currentConflict]->timerIDs[timerIndex];
break; }
}
} int cTVGuideTimerConflicts::GetCorrespondingConflict(int timerID) {
} int conflictIndex = -1;
return conflictIndex; if (numConflicts > 0) {
} for (int i = 0; i < numConflicts; i++) {
if (conflicts[i]->timerInvolved(timerID)) {
cTVGuideTimerConflict *cTVGuideTimerConflicts::GetConflict(int conflictIndex) { conflictIndex = i;
if (conflictIndex < 0) break;
return NULL; }
if (conflictIndex > (numConflicts-1)) }
return NULL; }
return conflicts[conflictIndex]; return conflictIndex;
} }
std::vector<cTVGuideTimerConflict*> cTVGuideTimerConflicts::GetConflictsBetween(time_t start, time_t stop) { cTVGuideTimerConflict *cTVGuideTimerConflicts::GetConflict(int conflictIndex) {
std::vector<cTVGuideTimerConflict*> conflictsFound; if (conflictIndex < 0)
for (int i=0; i < numConflicts; i++) { return NULL;
if ((conflicts[i]->timeStart > start) && (conflicts[i]->timeStart < stop)|| if (conflictIndex > (numConflicts-1))
(conflicts[i]->timeStop > start) && (conflicts[i]->timeStop < stop)) return NULL;
conflictsFound.push_back(conflicts[i]); return conflicts[conflictIndex];
} }
return conflictsFound;
} std::vector<cTVGuideTimerConflict*> cTVGuideTimerConflicts::GetConflictsBetween(time_t start, time_t stop) {
std::vector<cTVGuideTimerConflict*> conflictsFound;
for (int i = 0; i < numConflicts; i++) {
if ((conflicts[i]->timeStart > start) && (conflicts[i]->timeStart < stop)||
(conflicts[i]->timeStop > start) && (conflicts[i]->timeStop < stop))
conflictsFound.push_back(conflicts[i]);
}
return conflictsFound;
}

View File

@ -1,38 +1,38 @@
#ifndef __TVGUIDE_TIMERCONFLICT_H #ifndef __TVGUIDE_TIMERCONFLICT_H
#define __TVGUIDE_TIMERCONFLICT_H #define __TVGUIDE_TIMERCONFLICT_H
class cTVGuideTimerConflict { class cTVGuideTimerConflict {
public: public:
cTVGuideTimerConflict(void); cTVGuideTimerConflict(void);
virtual ~cTVGuideTimerConflict(void); virtual ~cTVGuideTimerConflict(void);
time_t time; time_t time;
time_t timeStart; time_t timeStart;
time_t timeStop; time_t timeStop;
time_t overlapStart; time_t overlapStart;
time_t overlapStop; time_t overlapStop;
int percentPossible; int percentPossible;
int timerID; int timerID;
std::vector<int> timerIDs; std::vector<int> timerIDs;
bool timerInvolved(int involvedID); bool timerInvolved(int involvedID);
}; };
class cTVGuideTimerConflicts { class cTVGuideTimerConflicts {
private: private:
std::vector<cTVGuideTimerConflict*> conflicts; std::vector<cTVGuideTimerConflict*> conflicts;
int numConflicts; int numConflicts;
int currentConflict; int currentConflict;
public: public:
cTVGuideTimerConflicts(void); cTVGuideTimerConflicts(void);
virtual ~cTVGuideTimerConflicts(void); virtual ~cTVGuideTimerConflicts(void);
void AddConflict(std::string epgSearchConflictLine); void AddConflict(std::string epgSearchConflictLine);
void CalculateConflicts(void); void CalculateConflicts(void);
int NumConflicts(void) {return numConflicts; }; int NumConflicts(void) {return numConflicts; };
void SetCurrentConflict(int current) { currentConflict = current; }; void SetCurrentConflict(int current) { currentConflict = current; };
cTVGuideTimerConflict *GetCurrentConflict(void); cTVGuideTimerConflict *GetCurrentConflict(void);
int GetCurrentConflictTimerID(int timerIndex); int GetCurrentConflictTimerID(int timerIndex);
int GetCorrespondingConflict(int timerID); int GetCorrespondingConflict(int timerID);
cTVGuideTimerConflict *GetConflict(int conflictIndex); cTVGuideTimerConflict *GetConflict(int conflictIndex);
std::vector<cTVGuideTimerConflict*> GetConflictsBetween(time_t start, time_t stop); std::vector<cTVGuideTimerConflict*> GetConflictsBetween(time_t start, time_t stop);
}; };
#endif //__TVGUIDE_RECMMANAGER_H #endif //__TVGUIDE_RECMMANAGER_H

971
tools.c
View File

@ -1,474 +1,497 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <sstream> #include <sstream>
#include <algorithm> #include <algorithm>
#include <ctype.h> #include <ctype.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <vdr/osd.h> #include <vdr/osd.h>
#include <vdr/plugin.h> #include <vdr/plugin.h>
#include "services/epgsearch.h" #include <vdr/skins.h>
#include "services/epgsearch.h"
#include "tools.h" #include "tools.h"
/**************************************************************************************** cPlugin *GetScraperPlugin(void) {
* CUTTEXT static cPlugin *pScraper = cPluginManager::GetPlugin("scraper2vdr");
****************************************************************************************/ if( !pScraper ) // if it doesn't exit, try tvscraper
std::string CutText(std::string text, int width, const cFont *font) { pScraper = cPluginManager::GetPlugin("tvscraper");
if (width <= font->Size()) return pScraper;
return text.c_str(); }
if (font->Width(text.c_str()) < width)
return text.c_str(); /****************************************************************************************
cTextWrapper twText; * CUTTEXT
twText.Set(text.c_str(), font, width); ****************************************************************************************/
std::string cuttedTextNative = twText.GetLine(0); std::string utf8_substr(const std::string& str, unsigned int start, long unsigned int leng) {
std::stringstream sstrText; if (leng==0) { return ""; }
sstrText << cuttedTextNative << "..."; unsigned int c, i, ix, q;
std::string cuttedText = sstrText.str(); long unsigned int min=std::string::npos, max=std::string::npos;
int actWidth = font->Width(cuttedText.c_str()); for (q=0, i=0, ix=str.length(); i < ix; i++, q++) {
if (actWidth > width) { if (q==start){ min=i; }
int overlap = actWidth - width; if (q<=start+leng || leng==std::string::npos){ max=i; }
int charWidth = font->Width(".");
if (charWidth == 0) c = (unsigned char) str[i];
charWidth = 1; if (c>=0 && c<=127) i+=0;
int cutChars = overlap / charWidth; else if ((c & 0xE0) == 0xC0) i+=1;
if (cutChars > 0) { else if ((c & 0xF0) == 0xE0) i+=2;
cuttedTextNative = cuttedTextNative.substr(0, cuttedTextNative.length() - cutChars); else if ((c & 0xF8) == 0xF0) i+=3;
std::stringstream sstrText2; //else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8
sstrText2 << cuttedTextNative << "..."; //else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8
cuttedText = sstrText2.str(); else return "";//invalid utf8
} }
} if (q<=start+leng || leng==std::string::npos){ max=i; }
return cuttedText; if (min==std::string::npos || max==std::string::npos) { return ""; }
} return str.substr(min,max-min);
}
/****************************************************************************************
* StrToLowerCase std::string CutText(std::string text, int width, const cFont *font) {
****************************************************************************************/ int actWidth = font->Width(text.c_str());
std::string StrToLowerCase(std::string str) { if (actWidth <= width) {
std::string lowerCase = str; return text.c_str();
const int length = lowerCase.length(); } else {
for(int i=0; i < length; ++i) { int i = std::max(width / font->Size(), 1) - 1;
lowerCase[i] = std::tolower(lowerCase[i]); std::string cuttext, oldtext;
} cuttext = utf8_substr(text, 0, i);
return lowerCase; do {
} oldtext = cuttext;
i++;
/**************************************************************************************** cuttext = utf8_substr(text, 0, i);
* GetDirectoryFromTimer std::stringstream sstrText;
****************************************************************************************/ sstrText << cuttext << "...";
std::string GetDirectoryFromTimer(std::string file) { actWidth = font->Width(sstrText.str().c_str());
std::string dir = ""; }
size_t found = file.find_last_of('~'); while (actWidth < width);
if (found != std::string::npos) { std::stringstream sstrText2;
dir = file.substr(0, found); sstrText2 << oldtext << "...";
} return sstrText2.str();
return dir; }
} }
/**************************************************************************************** /****************************************************************************************
* GetDirectoryFromTimer * StrToLowerCase
****************************************************************************************/ ****************************************************************************************/
void ReadRecordingDirectories(std::vector<std::string> *folders, cList<cNestedItem> *rootFolders, cString path) { std::string StrToLowerCase(std::string str) {
cPlugin *epgSearchPlugin = NULL; std::string lowerCase = str;
epgSearchPlugin = cPluginManager::GetPlugin("epgsearch"); const int length = lowerCase.length();
if (epgSearchPlugin) { for(int i=0; i < length; ++i) {
Epgsearch_services_v1_0 *epgSearch = new Epgsearch_services_v1_0; lowerCase[i] = std::tolower(lowerCase[i]);
if (epgSearchPlugin->Service("Epgsearch-services-v1.0", epgSearch)) { }
std::set<std::string> epgSearchDirs = epgSearch->handler->DirectoryList(); return lowerCase;
std::set<std::string>::iterator it; }
for (it = epgSearchDirs.begin(); it != epgSearchDirs.end(); it++) {
std::string newFolder = *it; /****************************************************************************************
std::replace(newFolder.begin(), newFolder.end(), '/', '~'); * GetDirectoryFromTimer
folders->push_back(newFolder); ****************************************************************************************/
} std::string GetDirectoryFromTimer(std::string file) {
} std::string dir = "";
} else { size_t found = file.find_last_of('~');
cList<cNestedItem> *foldersLevel = NULL; if (found != std::string::npos) {
if (rootFolders) { dir = file.substr(0, found);
foldersLevel = rootFolders; }
} else { return dir;
foldersLevel = &Folders; }
}
for (cNestedItem *folder = foldersLevel->First(); folder; folder = foldersLevel->Next(folder)) { /****************************************************************************************
std::string strFolder = *cString::sprintf("%s%s", *path, folder->Text()); * GetDirectoryFromTimer
std::replace(strFolder.begin(), strFolder.end(), '/', '~'); ****************************************************************************************/
folders->push_back(strFolder); void ReadRecordingDirectories(std::vector<std::string> *folders, cList<cNestedItem> *rootFolders, cString path) {
cList<cNestedItem> *subItems = folder->SubItems(); cPlugin *epgSearchPlugin = NULL;
if (subItems) { epgSearchPlugin = cPluginManager::GetPlugin("epgsearch");
std::string strFolder2 = *cString::sprintf("%s%s", *path, folder->Text()); if (epgSearchPlugin) {
std::replace(strFolder2.begin(), strFolder2.end(), '/', '~'); Epgsearch_services_v1_0 *epgSearch = new Epgsearch_services_v1_0;
ReadRecordingDirectories(folders, subItems, strFolder2.c_str()); if (epgSearchPlugin->Service("Epgsearch-services-v1.0", epgSearch)) {
} std::set<std::string> epgSearchDirs = epgSearch->handler->DirectoryList();
} std::set<std::string>::iterator it;
} for (it = epgSearchDirs.begin(); it != epgSearchDirs.end(); it++) {
} std::string newFolder = *it;
std::replace(newFolder.begin(), newFolder.end(), '/', '~');
folders->push_back(newFolder);
/**************************************************************************************** }
* DrawRoundedCorners }
****************************************************************************************/ } else {
void DrawRoundedCorners(cPixmap *p, int posX, int posY, int width, int height, int radius, int borderWidth, tColor borderColor) { cList<cNestedItem> *foldersLevel = NULL;
if( height > 2*radius) { if (rootFolders) {
p->DrawEllipse(cRect(posX, posY, radius, radius), borderColor, -2); foldersLevel = rootFolders;
p->DrawEllipse(cRect(posX - borderWidth, posY - borderWidth, radius, radius), clrTransparent, -2); } else {
foldersLevel = &Folders;
p->DrawEllipse(cRect(posX+width - radius, posY, radius, radius), borderColor, -1); }
p->DrawEllipse(cRect(posX+width - radius + borderWidth, posY - borderWidth, radius, radius), clrTransparent, -1); for (cNestedItem *folder = foldersLevel->First(); folder; folder = foldersLevel->Next(folder)) {
std::string strFolder = *cString::sprintf("%s%s", *path, folder->Text());
p->DrawEllipse(cRect(posX, posY + height - radius, radius, radius), borderColor, -3); std::replace(strFolder.begin(), strFolder.end(), '/', '~');
p->DrawEllipse(cRect(posX - borderWidth, posY + height - radius + borderWidth, radius, radius), clrTransparent, -3); folders->push_back(strFolder);
cList<cNestedItem> *subItems = folder->SubItems();
p->DrawEllipse(cRect(posX + width - radius, posY + height - radius, radius, radius), borderColor, -4); if (subItems) {
p->DrawEllipse(cRect(posX + width - radius + borderWidth, posY + height - radius + borderWidth, radius, radius), clrTransparent, -4); std::string strFolder2 = *cString::sprintf("%s%s", *path, folder->Text());
} std::replace(strFolder2.begin(), strFolder2.end(), '/', '~');
} ReadRecordingDirectories(folders, subItems, strFolder2.c_str());
}
}
/**************************************************************************************** }
* SPLTSTRING }
****************************************************************************************/
// split: receives a char delimiter; returns a vector of strings /****************************************************************************************
// By default ignores repeated delimiters, unless argument rep == 1. * DrawRoundedCorners
std::vector<std::string>& splitstring::split(char delim, int rep) { ****************************************************************************************/
if (!flds.empty()) flds.clear(); // empty vector if necessary void DrawRoundedCorners(cPixmap *p, int posX, int posY, int width, int height, int radius, int borderWidth, tColor borderColor) {
std::string work = data(); if( height > 2*radius) {
std::string buf = ""; p->DrawEllipse(cRect(posX, posY, radius, radius), borderColor, -2);
int i = 0; p->DrawEllipse(cRect(posX - borderWidth, posY - borderWidth, radius, radius), clrTransparent, -2);
while (i < work.length()) {
if (work[i] != delim) p->DrawEllipse(cRect(posX+width - radius, posY, radius, radius), borderColor, -1);
buf += work[i]; p->DrawEllipse(cRect(posX+width - radius + borderWidth, posY - borderWidth, radius, radius), clrTransparent, -1);
else if (rep == 1) {
flds.push_back(buf); p->DrawEllipse(cRect(posX, posY + height - radius, radius, radius), borderColor, -3);
buf = ""; p->DrawEllipse(cRect(posX - borderWidth, posY + height - radius + borderWidth, radius, radius), clrTransparent, -3);
} else if (buf.length() > 0) {
flds.push_back(buf); p->DrawEllipse(cRect(posX + width - radius, posY + height - radius, radius, radius), borderColor, -4);
buf = ""; p->DrawEllipse(cRect(posX + width - radius + borderWidth, posY + height - radius + borderWidth, radius, radius), clrTransparent, -4);
} }
i++; }
}
if (!buf.empty())
flds.push_back(buf); /****************************************************************************************
return flds; * SPLTSTRING
} ****************************************************************************************/
// split: receives a char delimiter; returns a vector of strings
/**************************************************************************************** // By default ignores repeated delimiters, unless argument rep == 1.
* FINDIGNORECASE std::vector<std::string>& splitstring::split(char delim, int rep) {
****************************************************************************************/ if (!flds.empty()) flds.clear(); // empty vector if necessary
int FindIgnoreCase(const std::string& expr, const std::string& query) std::string work = data();
{ std::string buf = "";
const char *p = expr.c_str(); int i = 0;
const char *r = strcasestr(p, query.c_str()); while (i < (int)work.length()) {
if (work[i] != delim)
if (!r) buf += work[i];
return -1; else if (rep == 1) {
return r - p; flds.push_back(buf);
} buf = "";
} else if (buf.length() > 0) {
flds.push_back(buf);
/**************************************************************************************** buf = "";
* GetAuxValue }
****************************************************************************************/ i++;
char* GetAuxValue(const char* aux, const char* name) { }
if (isempty(aux)) if (!buf.empty())
return NULL; flds.push_back(buf);
return flds;
char* descr = strdup(aux); }
char* beginaux = strstr(descr, "<epgsearch>");
char* endaux = strstr(descr, "</epgsearch>"); /****************************************************************************************
if (!beginaux || !endaux) { * FINDIGNORECASE
free(descr); ****************************************************************************************/
return NULL; int FindIgnoreCase(const std::string& expr, const std::string& query)
} {
const char *p = expr.c_str();
beginaux += 11; // strlen("<epgsearch>"); const char *r = strcasestr(p, query.c_str());
endaux[0] = 0;
memmove(descr, beginaux, endaux - beginaux + 1); if (!r)
return -1;
if (strcmp(name, "epgsearch") == 0) return r - p;
return descr; // full aux }
int namelen = strlen(name);
char catname[100] = ""; /****************************************************************************************
catname[0] = '<'; * GetAuxValue
memcpy(catname + 1, name, namelen); ****************************************************************************************/
catname[1 + namelen] = '>'; char* GetAuxValue(const char* aux, const char* name) {
catname[2 + namelen] = 0; if (isempty(aux))
return NULL;
char* cat = strcasestr(descr, catname);
if (!cat) { char* descr = strdup(aux);
free(descr); char* beginaux = strstr(descr, "<epgsearch>");
return NULL; char* endaux = strstr(descr, "</epgsearch>");
} if (!beginaux || !endaux) {
free(descr);
cat += namelen + 2; return NULL;
char* end = strstr(cat, "</"); }
if (!end) {
free(descr); beginaux += 11; // strlen("<epgsearch>");
return NULL; endaux[0] = 0;
} memmove(descr, beginaux, endaux - beginaux + 1);
end[0] = 0;
if (strcmp(name, "epgsearch") == 0)
int catlen = end - cat + 1; return descr; // full aux
char* value = (char *) malloc(catlen);
memcpy(value, cat, catlen); int namelen = strlen(name);
char catname[100] = "";
free(descr); catname[0] = '<';
return value; memcpy(catname + 1, name, namelen);
} catname[1 + namelen] = '>';
catname[2 + namelen] = 0;
char* GetAuxValue(const cRecording *recording, const char* name) {
if (!recording || !recording->Info()) char* cat = strcasestr(descr, catname);
return NULL; if (!cat) {
return GetAuxValue(recording->Info()->Aux(), name); free(descr);
} return NULL;
}
char* GetAuxValue(const cTimer *timer, const char* name) {
if (!timer || !timer->Aux()) cat += namelen + 2;
return NULL; char* end = strstr(cat, "</");
return GetAuxValue(timer->Aux(), name); if (!end) {
} free(descr);
return NULL;
/**************************************************************************************** }
* FUZZYSEARCH end[0] = 0;
****************************************************************************************/
int catlen = end - cat + 1;
/****************************************************************************** char* value = (char *) malloc(catlen);
FUNCTION afuzzy_init() memcpy(value, cat, catlen);
Initialization of the fuzzy search routine. This applies to the consequent
calls of the afuzzy_CheckRTR (whole string matching) and afuzzy_CheckSUB free(descr);
(substring match) routines. afuzzy_init() should be called for each return value;
new pattern or error length. The search is case sensitive }
ARGUMENTS: char* GetAuxValue(const cRecording *recording, const char* name) {
p Pattern if (!recording || !recording->Info())
kerr Number of possible errors. Shouldn't exceed pattern length return NULL;
UseFilter Use agrep filter algorithm that speeds up search. return GetAuxValue(recording->Info()->Aux(), name);
fuzzy pointer to the structure that will be later passes to Check* }
(the first 6 elements should be NULLs for the first call)
char* GetAuxValue(const cTimer *timer, const char* name) {
RETURN VALUE: if (!timer || !timer->Aux())
none return NULL;
return GetAuxValue(timer->Aux(), name);
ALGORITHM }
see. the article on agrep algorithms.
The only change is accounting transpositions as one edit operation . /****************************************************************************************
******************************************************************************/ * FUZZYSEARCH
void afuzzy_init(const char *p, int kerr, int UseFilter, AFUZZY *fuzzy) ****************************************************************************************/
{
int cnt, p_len, i, j, l, d, m, dd; /******************************************************************************
char PatFilter[sizeof(Uint)*8 + 1]; FUNCTION afuzzy_init()
Initialization of the fuzzy search routine. This applies to the consequent
fuzzy->k = kerr; calls of the afuzzy_CheckRTR (whole string matching) and afuzzy_CheckSUB
m = strlen(p); (substring match) routines. afuzzy_init() should be called for each
fuzzy->FilterSet = 0; new pattern or error length. The search is case sensitive
memset(fuzzy->Map, 0 , sizeof(fuzzy->Map) );
ARGUMENTS:
if (fuzzy->S) p Pattern
free(fuzzy->S); kerr Number of possible errors. Shouldn't exceed pattern length
if (fuzzy->R) UseFilter Use agrep filter algorithm that speeds up search.
free(fuzzy->R); fuzzy pointer to the structure that will be later passes to Check*
if (fuzzy->R1) (the first 6 elements should be NULLs for the first call)
free(fuzzy->R1);
if (fuzzy->RP) RETURN VALUE:
free(fuzzy->RP); none
if (fuzzy->RI)
free(fuzzy->RI); ALGORITHM
if (fuzzy->FilterS) see. the article on agrep algorithms.
free(fuzzy->FilterS); The only change is accounting transpositions as one edit operation .
******************************************************************************/
fuzzy->FilterS = NULL; void afuzzy_init(const char *p, int kerr, int UseFilter, AFUZZY *fuzzy)
fuzzy->S = (Uint *)calloc(m + 1, sizeof(Uint)); {
fuzzy->R = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint)); int cnt, p_len, i, j, l, d, m, dd;
fuzzy->R1 = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint)); char PatFilter[sizeof(Uint)*8 + 1];
fuzzy->RI = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
fuzzy->RP = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint)); fuzzy->k = kerr;
m = strlen(p);
for (i = 0, cnt = 0; i < m; i++) fuzzy->FilterSet = 0;
{ memset(fuzzy->Map, 0 , sizeof(fuzzy->Map) );
l = fuzzy->Map[(unsigned char)p[i]];
if (!l) if (fuzzy->S)
{ free(fuzzy->S);
l = fuzzy->Map[(unsigned char)p[i]] = ++cnt; if (fuzzy->R)
fuzzy->S[l] = 0; free(fuzzy->R);
} if (fuzzy->R1)
fuzzy->S[l] |= 1 << i; free(fuzzy->R1);
} if (fuzzy->RP)
free(fuzzy->RP);
if (fuzzy->RI)
for (d = 0; d <= fuzzy->k; d++) free(fuzzy->RI);
fuzzy->RI[d] = (1 << d) - 1; if (fuzzy->FilterS)
free(fuzzy->FilterS);
fuzzy->mask_ok = (1 << (m - 1));
fuzzy->r_size = sizeof(Uint) * (fuzzy->k + 1); fuzzy->FilterS = NULL;
p_len = m; fuzzy->S = (Uint *)calloc(m + 1, sizeof(Uint));
fuzzy->R = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
if (p_len > (int) sizeof(Uint)*8) fuzzy->R1 = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
p_len = (int) sizeof(Uint)*8; fuzzy->RI = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
fuzzy->RP = (Uint *)calloc(fuzzy->k + 1, sizeof(Uint));
/* If k is zero then no filter is needed! */
if (fuzzy->k && (p_len >= 2*(fuzzy->k + 1)) ) for (i = 0, cnt = 0; i < m; i++)
{ {
if (UseFilter) l = fuzzy->Map[(unsigned char)p[i]];
{ if (!l)
fuzzy->FilterSet = 1; {
memset(fuzzy->FilterMap, 0 , sizeof(fuzzy->FilterMap) ); l = fuzzy->Map[(unsigned char)p[i]] = ++cnt;
fuzzy->FilterS = (Uint *)calloc(m + 1, sizeof(Uint)); fuzzy->S[l] = 0;
}
/* Not let's fill the interleaved pattern */ fuzzy->S[l] |= 1 << i;
dd = p_len / (fuzzy->k + 1); }
p_len = dd * (fuzzy->k + 1);
for (i = 0, cnt = 0; i < dd; i++) for (d = 0; d <= fuzzy->k; d++)
for (j = 0; j < fuzzy->k + 1; j++, cnt++) fuzzy->RI[d] = (1 << d) - 1;
PatFilter[cnt] = (unsigned char)p[j*dd + i];
PatFilter[p_len] = 0; fuzzy->mask_ok = (1 << (m - 1));
fuzzy->r_size = sizeof(Uint) * (fuzzy->k + 1);
for (i = 0, cnt = 0; i < p_len; i++) p_len = m;
{
l = fuzzy->FilterMap[(unsigned char)PatFilter[i]]; if (p_len > (int) sizeof(Uint)*8)
if (!l) p_len = (int) sizeof(Uint)*8;
{
l = fuzzy->FilterMap[(unsigned char)PatFilter[i]] = ++cnt; /* If k is zero then no filter is needed! */
fuzzy->FilterS[l] = 0; if (fuzzy->k && (p_len >= 2*(fuzzy->k + 1)) )
} {
fuzzy->FilterS[l] |= 1 << i; if (UseFilter)
} {
fuzzy->filter_ok = 0; fuzzy->FilterSet = 1;
for (i = p_len - fuzzy->k - 1; i <= p_len - 1; i++) /* k+1 times */ memset(fuzzy->FilterMap, 0 , sizeof(fuzzy->FilterMap) );
fuzzy->filter_ok |= 1 << i; fuzzy->FilterS = (Uint *)calloc(m + 1, sizeof(Uint));
/* k+1 first bits set to 1 */ /* Not let's fill the interleaved pattern */
fuzzy->filter_shift = (1 << (fuzzy->k + 2)) - 1; dd = p_len / (fuzzy->k + 1);
} p_len = dd * (fuzzy->k + 1);
}
} for (i = 0, cnt = 0; i < dd; i++)
for (j = 0; j < fuzzy->k + 1; j++, cnt++)
/****************************************************************************** PatFilter[cnt] = (unsigned char)p[j*dd + i];
FUNCTION afuzzy_free() PatFilter[p_len] = 0;
Cleaning up after previous afuzzy_init() call.
for (i = 0, cnt = 0; i < p_len; i++)
ARGUMENTS: {
fuzzy pointer to the afuzzy parameters structure l = fuzzy->FilterMap[(unsigned char)PatFilter[i]];
if (!l)
RETURN VALUE: {
none l = fuzzy->FilterMap[(unsigned char)PatFilter[i]] = ++cnt;
******************************************************************************/ fuzzy->FilterS[l] = 0;
void afuzzy_free(AFUZZY *fuzzy) }
{ fuzzy->FilterS[l] |= 1 << i;
if (fuzzy->S) }
{ fuzzy->filter_ok = 0;
free(fuzzy->S); for (i = p_len - fuzzy->k - 1; i <= p_len - 1; i++) /* k+1 times */
fuzzy->S = NULL; fuzzy->filter_ok |= 1 << i;
}
if (fuzzy->R) /* k+1 first bits set to 1 */
{ fuzzy->filter_shift = (1 << (fuzzy->k + 2)) - 1;
free(fuzzy->R); }
fuzzy->R = NULL; }
} }
if (fuzzy->R1)
{ /******************************************************************************
free(fuzzy->R1); FUNCTION afuzzy_free()
fuzzy->R1 = NULL; Cleaning up after previous afuzzy_init() call.
}
if (fuzzy->RP) ARGUMENTS:
{ fuzzy pointer to the afuzzy parameters structure
free(fuzzy->RP);
fuzzy->RP = NULL; RETURN VALUE:
} none
if (fuzzy->RI) ******************************************************************************/
{ void afuzzy_free(AFUZZY *fuzzy)
free(fuzzy->RI); {
fuzzy->RI = NULL; if (fuzzy->S)
} {
if (fuzzy->FilterS) free(fuzzy->S);
{ fuzzy->S = NULL;
free(fuzzy->FilterS); }
fuzzy->FilterS = NULL; if (fuzzy->R)
} {
} free(fuzzy->R);
fuzzy->R = NULL;
}
/****************************************************************************** if (fuzzy->R1)
FUNCTION afuzzy_CheckSUB() {
Perform a fuzzy pattern substring matching. afuzzy_init() should be free(fuzzy->R1);
called previously to initialize the pattern and error length. fuzzy->R1 = NULL;
Positive result means that some part of the string given matches the }
pattern with no more than afuzzy->k errors (1 error = 1 letter if (fuzzy->RP)
replacement or transposition) {
free(fuzzy->RP);
ARGUMENTS: fuzzy->RP = NULL;
t the string to test }
fuzzy pointer to the afuzzy parameters structure if (fuzzy->RI)
{
RETURN VALUE: free(fuzzy->RI);
0 - no match fuzzy->RI = NULL;
> 0 - strings match }
if (fuzzy->FilterS)
ALGORITHM {
???????????????? free(fuzzy->FilterS);
******************************************************************************/ fuzzy->FilterS = NULL;
int afuzzy_checkSUB(const char *t, AFUZZY *fuzzy) }
{ }
register char c;
register int j, d;
/******************************************************************************
/* For eficciency this case should be little bit optimized */ FUNCTION afuzzy_CheckSUB()
if (!fuzzy->k) Perform a fuzzy pattern substring matching. afuzzy_init() should be
{ called previously to initialize the pattern and error length.
Uint R = 0, R1; Positive result means that some part of the string given matches the
pattern with no more than afuzzy->k errors (1 error = 1 letter
for (j = 0; (c = t[j]) != '\0'; j++) replacement or transposition)
{
R1 = ( ((R<<1) | 1) & fuzzy->S[fuzzy->Map[(unsigned char)c]]); ARGUMENTS:
R = R1; t the string to test
fuzzy pointer to the afuzzy parameters structure
if (R1 & fuzzy->mask_ok)
return 1; RETURN VALUE:
} /* end for (register int j = 0 ... */ 0 - no match
return 0; > 0 - strings match
}
ALGORITHM
if (fuzzy->FilterSet && !afuzzy_checkFLT(t, fuzzy)) ????????????????
return 0; ******************************************************************************/
int afuzzy_checkSUB(const char *t, AFUZZY *fuzzy)
memcpy(fuzzy->R, fuzzy->RI, fuzzy->r_size); /* R = RI */ {
char c;
for (j = 0; (c = t[j]); j++) int j, d;
{
for (d = 0; d <= fuzzy->k; d++) /* For eficciency this case should be little bit optimized */
{ if (!fuzzy->k)
fuzzy->R1[d] = (((fuzzy->R[d]<<1) | 1) & {
fuzzy->S[fuzzy->Map[(unsigned char)c]]); Uint R = 0, R1;
if (d > 0)
fuzzy->R1[d] |= ((fuzzy->R[d-1] | fuzzy->R1[d-1])<<1) | 1 | for (j = 0; (c = t[j]) != '\0'; j++)
fuzzy->R[d-1]; {
} R1 = ( ((R<<1) | 1) & fuzzy->S[fuzzy->Map[(unsigned char)c]]);
if (fuzzy->R1[fuzzy->k] & fuzzy->mask_ok) R = R1;
return j;
if (R1 & fuzzy->mask_ok)
memcpy(fuzzy->R, fuzzy->R1, fuzzy->r_size); return 1;
} /* end for (int j = 0 ... */
} /* end for (register int j = 0 ... */ return 0;
}
return 0;
} if (fuzzy->FilterSet && !afuzzy_checkFLT(t, fuzzy))
return 0;
static int afuzzy_checkFLT(const char *t, AFUZZY *fuzzy)
{ memcpy(fuzzy->R, fuzzy->RI, fuzzy->r_size); /* R = RI */
register Uint FilterR = 0;
register Uint FilterR1; for (j = 0; (c = t[j]); j++)
register int j; {
for (d = 0; d <= fuzzy->k; d++)
for (j = 0; t[j] != '\0'; j++) {
{ fuzzy->R1[d] = (((fuzzy->R[d]<<1) | 1) &
FilterR1 = ( ((FilterR<<(fuzzy->k+1)) | fuzzy->filter_shift) & fuzzy->S[fuzzy->Map[(unsigned char)c]]);
fuzzy->FilterS[fuzzy->FilterMap[(unsigned char)t[j]]]); if (d > 0)
if (FilterR1 & fuzzy->filter_ok) fuzzy->R1[d] |= ((fuzzy->R[d-1] | fuzzy->R1[d-1])<<1) | 1 |
return 1; fuzzy->R[d-1];
FilterR = FilterR1; }
} /* end for (register int j = 0 ... */ if (fuzzy->R1[fuzzy->k] & fuzzy->mask_ok)
return j;
return 0;
} memcpy(fuzzy->R, fuzzy->R1, fuzzy->r_size);
} /* end for (int j = 0 ... */
return 0;
}
int afuzzy_checkFLT(const char *t, AFUZZY *fuzzy)
{
Uint FilterR = 0;
Uint FilterR1;
int j;
for (j = 0; t[j] != '\0'; j++)
{
FilterR1 = ( ((FilterR<<(fuzzy->k+1)) | fuzzy->filter_shift) &
fuzzy->FilterS[fuzzy->FilterMap[(unsigned char)t[j]]]);
if (FilterR1 & fuzzy->filter_ok)
return 1;
FilterR = FilterR1;
} /* end for (int j = 0 ... */
return 0;
}

140
tools.h
View File

@ -1,68 +1,72 @@
#ifndef __TVGUIDETOOLS_H #ifndef __TVGUIDETOOLS_H
#define __TVGUIDETOOLS_H #define __TVGUIDETOOLS_H
#include <string> #include <string>
#include <vector> #include <vector>
#include <vdr/font.h> #include <vdr/font.h>
#include <vdr/recording.h> #include <vdr/recording.h>
#include <vdr/plugin.h>
std::string CutText(std::string text, int width, const cFont *font);
std::string StrToLowerCase(std::string str); cPlugin *GetScraperPlugin(void);
std::string GetDirectoryFromTimer(std::string file);
void ReadRecordingDirectories(std::vector<std::string> *folders, cList<cNestedItem> *rootFolders, cString path); std::string utf8_substr(const std::string& str, unsigned int start=0, long unsigned int leng=std::string::npos);
void DrawRoundedCorners(cPixmap *p, int posX, int posY, int width, int height, int radius, int borderWidth, tColor borderColor); std::string CutText(std::string text, int width, const cFont *font);
std::string StrToLowerCase(std::string str);
class splitstring : public std::string { std::string GetDirectoryFromTimer(std::string file);
std::vector<std::string> flds; void ReadRecordingDirectories(std::vector<std::string> *folders, cList<cNestedItem> *rootFolders, cString path);
public: void DrawRoundedCorners(cPixmap *p, int posX, int posY, int width, int height, int radius, int borderWidth, tColor borderColor);
splitstring(const char *s) : std::string(s) { };
std::vector<std::string>& split(char delim, int rep=0); class splitstring : public std::string {
}; std::vector<std::string> flds;
public:
int FindIgnoreCase(const std::string& expr, const std::string& query); splitstring(const char *s) : std::string(s) { };
std::vector<std::string>& split(char delim, int rep=0);
char* GetAuxValue(const char* aux, const char* name); };
char* GetAuxValue(const cRecording *recording, const char* name);
char* GetAuxValue(const cTimer* timer, const char* name); int FindIgnoreCase(const std::string& expr, const std::string& query);
#ifndef _AFUZZY_H char* GetAuxValue(const char* aux, const char* name);
#define _AFUZZY_H char* GetAuxValue(const cRecording *recording, const char* name);
char* GetAuxValue(const cTimer* timer, const char* name);
// source from:
/* #ifndef _AFUZZY_H
Leonid Boitsov 2002. (itman@narod.ru) #define _AFUZZY_H
C version of Stas Namin.
This code is a GPL software and is distributed under GNU // source from:
public licence without any warranty. /*
*/ Leonid Boitsov 2002. (itman@narod.ru)
C version of Stas Namin.
typedef unsigned int Uint; This code is a GPL software and is distributed under GNU
public licence without any warranty.
#define MaxPatSize (sizeof(Uint) * 8) */
typedef struct typedef unsigned int Uint;
{
Uint *R, #define MaxPatSize (sizeof(Uint) * 8)
*R1,
*RP, typedef struct
*S, {
*RI; Uint *R,
Uint *FilterS; *R1,
*RP,
int Map[256]; *S,
int FilterMap[256]; *RI;
int k; Uint *FilterS;
Uint mask_ok;
Uint filter_ok; int Map[256];
Uint filter_shift; int FilterMap[256];
int r_size; int k;
int FilterSet; Uint mask_ok;
} AFUZZY; Uint filter_ok;
Uint filter_shift;
void afuzzy_init(const char *p, int kerr, int UseFilter, AFUZZY *fuzzy); int r_size;
void afuzzy_free(AFUZZY *fuzzy); int FilterSet;
int afuzzy_checkSUB(const char *t, AFUZZY *fuzzy); } AFUZZY;
static int afuzzy_checkFLT(const char *t, AFUZZY *fuzzy);
#endif void afuzzy_init(const char *p, int kerr, int UseFilter, AFUZZY *fuzzy);
void afuzzy_free(AFUZZY *fuzzy);
#endif // __TVGUIDETOOLS_H int afuzzy_checkSUB(const char *t, AFUZZY *fuzzy);
int afuzzy_checkFLT(const char *t, AFUZZY *fuzzy);
#endif
#endif // __TVGUIDETOOLS_H

View File

@ -12,6 +12,7 @@
#include <vdr/plugin.h> #include <vdr/plugin.h>
#include <vdr/device.h> #include <vdr/device.h>
#include <vdr/menu.h> #include <vdr/menu.h>
#include <Magick++.h>
#define DEFINE_CONFIG 1 #define DEFINE_CONFIG 1
#include "geometrymanager.h" #include "geometrymanager.h"
@ -26,8 +27,8 @@
#error "VDR-2.0.0 API version or greater is required!" #error "VDR-2.0.0 API version or greater is required!"
#endif #endif
static const char *VERSION = "1.2.2"; static const char *VERSION = "1.3.6";
static const char *DESCRIPTION = "A fancy 2d EPG Viewer"; static const char *DESCRIPTION = tr("A fancy 2d EPG Viewer");
static const char *MAINMENUENTRY = "Tvguide"; static const char *MAINMENUENTRY = "Tvguide";
class cPluginTvguide : public cPlugin { class cPluginTvguide : public cPlugin {
@ -35,7 +36,7 @@ public:
cPluginTvguide(void); cPluginTvguide(void);
virtual ~cPluginTvguide(); virtual ~cPluginTvguide();
virtual const char *Version(void) { return VERSION; } virtual const char *Version(void) { return VERSION; }
virtual const char *Description(void) { return DESCRIPTION; } virtual const char *Description(void) { return tr(DESCRIPTION); }
virtual const char *CommandLineHelp(void); virtual const char *CommandLineHelp(void);
virtual bool ProcessArgs(int argc, char *argv[]); virtual bool ProcessArgs(int argc, char *argv[]);
virtual bool Initialize(void); virtual bool Initialize(void);
@ -45,7 +46,7 @@ public:
virtual void MainThreadHook(void); virtual void MainThreadHook(void);
virtual cString Active(void); virtual cString Active(void);
virtual time_t WakeupTime(void); virtual time_t WakeupTime(void);
virtual const char *MainMenuEntry(void) { return (tvguideConfig.showMainMenuEntry)?MAINMENUENTRY:NULL; } virtual const char *MainMenuEntry(void) { return (config.showMainMenuEntry) ? MAINMENUENTRY : NULL; }
virtual cOsdObject *MainMenuAction(void); virtual cOsdObject *MainMenuAction(void);
virtual cMenuSetupPage *SetupMenu(void); virtual cMenuSetupPage *SetupMenu(void);
virtual bool SetupParse(const char *Name, const char *Value); virtual bool SetupParse(const char *Name, const char *Value);
@ -62,9 +63,9 @@ cPluginTvguide::~cPluginTvguide() {
const char *cPluginTvguide::CommandLineHelp(void) { const char *cPluginTvguide::CommandLineHelp(void) {
return return
" -e <IMAGESDIR>, --epgimages=<IMAGESDIR> Set directory where epgimages are stored.\n" " -e <IMAGESDIR>, --epgimages=<IMAGESDIR> Set directory where epgimages are stored.\n"
" -i <ICONDIR>, --icons=<ICONDIR> Set directory where icons are stored.\n" " -i <ICONDIR>, --iconpath=<ICONDIR> Set directory where icons are stored.\n"
" -l <LOGODIR>, --logodir=<LOGODIR> Set directory where logos are stored.\n"; " -l <LOGODIR>, --logopath=<LOGODIR> Set directory where logos are stored.\n";
} }
bool cPluginTvguide::ProcessArgs(int argc, char *argv[]) { bool cPluginTvguide::ProcessArgs(int argc, char *argv[]) {
@ -78,13 +79,13 @@ bool cPluginTvguide::ProcessArgs(int argc, char *argv[]) {
while ((c = getopt_long(argc, argv, "e:i:l:", long_options, NULL)) != -1) { while ((c = getopt_long(argc, argv, "e:i:l:", long_options, NULL)) != -1) {
switch (c) { switch (c) {
case 'e': case 'e':
tvguideConfig.SetImagesPath(cString(optarg)); config.SetImagesPath(cString(optarg));
break; break;
case 'i': case 'i':
tvguideConfig.SetIconsPath(cString(optarg)); config.SetIconsPath(cString(optarg));
break; break;
case 'l': case 'l':
tvguideConfig.SetLogoPath(cString(optarg)); config.SetLogoPath(cString(optarg));
break; break;
default: default:
return false; return false;
@ -93,11 +94,15 @@ bool cPluginTvguide::ProcessArgs(int argc, char *argv[]) {
return true; return true;
} }
__attribute__((constructor)) static void init(void) {
Magick::InitializeMagick(NULL);
}
bool cPluginTvguide::Initialize(void) { bool cPluginTvguide::Initialize(void) {
tvguideConfig.SetDefaultPathes(); config.SetDefaultPathes();
tvguideConfig.LoadTheme(); config.LoadTheme();
tvguideConfig.SetStyle(); config.SetStyle();
tvguideConfig.setDynamicValues(); config.setDynamicValues();
geoManager.SetGeometry(cOsd::OsdWidth(), cOsd::OsdHeight()); geoManager.SetGeometry(cOsd::OsdWidth(), cOsd::OsdHeight());
fontManager.SetFonts(); fontManager.SetFonts();
imgCache.CreateCache(); imgCache.CreateCache();
@ -134,11 +139,11 @@ cMenuSetupPage *cPluginTvguide::SetupMenu(void) {
} }
bool cPluginTvguide::SetupParse(const char *Name, const char *Value) { bool cPluginTvguide::SetupParse(const char *Name, const char *Value) {
return tvguideConfig.SetupParse(Name, Value); return config.SetupParse(Name, Value);
} }
bool cPluginTvguide::Service(const char *Id, void *Data) { bool cPluginTvguide::Service(const char *Id, void *Data) {
if (strcmp(Id, "MainMenuHooksPatch-v1.0::osSchedule") == 0 && tvguideConfig.replaceOriginalSchedule != 0) { if (strcmp(Id, "MainMenuHooksPatch-v1.0::osSchedule") == 0 && config.replaceOriginalSchedule != 0) {
if (Data == NULL) if (Data == NULL)
return true; return true;
cOsdObject **guide = (cOsdObject**) Data; cOsdObject **guide = (cOsdObject**) Data;

File diff suppressed because it is too large Load Diff

View File

@ -1,65 +1,66 @@
#ifndef __TVGUIDE_TVGUIDEOSD_H #ifndef __TVGUIDE_TVGUIDEOSD_H
#define __TVGUIDE_TVGUIDEOSD_H #define __TVGUIDE_TVGUIDEOSD_H
#include "timer.h" #include "timemanager.h"
#include "grid.h" #include "gridelement.h"
#include "channelcolumn.h" #include "channelepg.h"
#include "statusheader.h" #include "statusheader.h"
#include "detailview.h" #include "detailview.h"
#include "timeline.h" #include "timeline.h"
#include "channelgroups.h" #include "channelgroups.h"
#include "footer.h" #include "footer.h"
#include "recmenumanager.h" #include "recmenuview.h"
#include "channeljump.h" #include "channeljump.h"
// --- cTvGuideOsd ------------------------------------------------------------- // --- cTvGuideOsd -------------------------------------------------------------
class cTvGuideOsd : public cOsdObject { class cTvGuideOsd : public cOsdObject {
private: private:
cMyTime *myTime; cTimeManager *timeManager;
cList<cChannelColumn> columns; cList<cChannelEpg> columns;
cGrid *activeGrid; cGridElement *activeGrid;
cStatusHeader *statusHeader; cStatusHeader *statusHeader;
cDetailView *detailView; cDetailView *detailView;
cTimeLine *timeLine; cTimeLine *timeLine;
cChannelGroups *channelGroups; cChannelGroups *channelGroups;
cFooter *footer; cFooter *footer;
cRecMenuManager *recMenuManager; cRecMenuView *recMenuView;
cChannelJump *channelJumper; cChannelJump *channelJumper;
bool detailViewActive; int GetLastValidChannel(void);
void drawOsd(); bool detailViewActive;
void readChannels(const cChannel *channelStart); void drawOsd();
void drawGridsChannelJump(int offset = 0); void readChannels(const cChannel *channelStart);
void drawGridsTimeJump(); void drawGridsChannelJump(int offset = 0);
void processKeyUp(); void drawGridsTimeJump(bool last = false);
void processKeyDown(); void processKeyUp();
void processKeyLeft(); void processKeyDown();
void processKeyRight(); void processKeyLeft();
void processKeyRed(); void processKeyRight();
void processKeyGreen(); void processKeyRed();
void processKeyYellow(); void processKeyGreen();
eOSState processKeyBlue(bool *alreadyUnlocked); void processKeyYellow();
eOSState processKeyOk(bool *alreadyUnlocked); eOSState processKeyBlue(bool *alreadyUnlocked);
void processNumKey(int numKey); eOSState processKeyOk(bool *alreadyUnlocked);
void TimeJump(int mode); void processNumKey(int numKey);
void ChannelJump(int num); void TimeJump(int mode);
void CheckTimeout(void); void ChannelJump(int num);
void setNextActiveGrid(cGrid *next); void CheckTimeout(void);
void channelForward(); void setNextActiveGrid(cGridElement *next);
void channelBack(); void channelForward();
void timeForward(); void channelBack();
void timeBack(); void timeForward();
void ScrollForward(); void timeBack();
void ScrollBack(); void ScrollForward();
eOSState ChannelSwitch(bool *alreadyUnlocked); void ScrollBack();
void DetailedEPG(); eOSState ChannelSwitch(bool *alreadyUnlocked);
void SetTimers(); void DetailedEPG();
void dump(); void SetTimers();
public: void dump();
cTvGuideOsd(void); public:
virtual ~cTvGuideOsd(void); cTvGuideOsd(void);
virtual void Show(void); virtual ~cTvGuideOsd(void);
virtual eOSState ProcessKey(eKeys Key); virtual void Show(void);
}; virtual eOSState ProcessKey(eKeys Key);
};
#endif //__TVGUIDE_TVGUIDEOSD_H
#endif //__TVGUIDE_TVGUIDEOSD_H

2114
view.c

File diff suppressed because it is too large Load Diff

299
view.h
View File

@ -1,149 +1,150 @@
#ifndef __TVGUIDE_VIEW_H #ifndef __TVGUIDE_VIEW_H
#define __TVGUIDE_VIEW_H #define __TVGUIDE_VIEW_H
#include <vector> #include <vector>
#include <string> #include <string>
#include <sstream> #include <sstream>
#include <vdr/skins.h> #include <vdr/skins.h>
#include "services/scraper2vdr.h" #include "services/scraper2vdr.h"
#include "services/epgsearch.h" #include "services/epgsearch.h"
#include "services/remotetimers.h" #include "services/remotetimers.h"
#include "config.h" #include "config.h"
#include "imagecache.h" #include "imagecache.h"
#include "imageloader.h" #include "imageloader.h"
#include "tools.h" #include "tools.h"
enum eEPGViewTabs { enum eEPGViewTabs {
evtInfo = 0, evtInfo = 0,
evtAddInfo, evtAddInfo,
evtImages, evtImages,
evtCount evtCount
}; };
enum eMediaViewTabs { enum eMediaViewTabs {
mvtInfo = 0, mvtInfo = 0,
mvtAddInfo, mvtAddInfo,
mvtCast, mvtCast,
mvtOnlineInfo, mvtOnlineInfo,
mvtImages, mvtImages,
mvtCount mvtCount
}; };
class cView : public cThread { class cView : public cThread {
protected: protected:
const cEvent *event; const cEvent *event;
cPixmap *pixmapBackground; cPixmap *pixmapBackground;
cStyledPixmap *pixmapHeader; cStyledPixmap *pixmapHeader;
cPixmap *pixmapHeaderLogo; cPixmap *pixmapHeaderLogo;
cPixmap *pixmapContent; cPixmap *pixmapContent;
cPixmap *pixmapScrollbar; cPixmap *pixmapScrollbar;
cPixmap *pixmapScrollbarBack; cPixmap *pixmapScrollbarBack;
cPixmap *pixmapTabs; cPixmap *pixmapTabs;
cFont *font, *fontSmall, *fontHeader, *fontHeaderLarge; cFont *font, *fontSmall, *fontHeader, *fontHeaderLarge;
cImage *imgScrollBar; cImage *imgScrollBar;
int activeView; int activeView;
bool scrollable; bool scrollable;
bool tabbed; bool tabbed;
int x, y; int x, y;
int width, height; int width, height;
int border; int border;
int headerWidth, headerHeight; int headerWidth, headerHeight;
int contentHeight; int contentHeight;
int tabHeight; int tabHeight;
int scrollbarWidth; int scrollbarWidth;
std::vector<std::string> tabs; cTextWrapper wrapper;
std::string title; std::vector<std::string> tabs;
std::string subTitle; std::string title;
std::string dateTime; std::string subTitle;
std::string infoText; std::string dateTime;
std::string addInfoText; std::string infoText;
const cChannel *channel; std::string addInfoText;
int eventID; const cChannel *channel;
bool headerDrawn; int eventID;
void DrawHeader(void); bool headerDrawn;
void ClearContent(void); void DrawHeader(void);
void CreateContent(int fullHeight); void ClearContent(void);
void DrawContent(std::string *text); void CreateContent(int fullHeight);
void DrawFloatingContent(std::string *infoText, cTvMedia *img, cTvMedia *img2 = NULL); void DrawContent(std::string *text);
void CreateFloatingTextWrapper(cTextWrapper *twNarrow, cTextWrapper *twFull, std::string *text, int widthImg, int heightImg); void DrawFloatingContent(std::string *infoText, cTvMedia *img, cTvMedia *img2 = NULL);
void DrawActors(std::vector<cActor> *actors); void CreateFloatingTextWrapper(cTextWrapper *twNarrow, cTextWrapper *twFull, std::string *text, int widthImg, int heightImg);
void ClearScrollbar(void); void DrawActors(std::vector<cActor> *actors);
void ClearScrollbarImage(void); void ClearScrollbar(void);
cImage *CreateScrollbarImage(int width, int height, tColor clrBgr, tColor clrBlend); void ClearScrollbarImage(void);
virtual void SetTabs(void) {}; cImage *CreateScrollbarImage(int width, int height, tColor clrBgr, tColor clrBlend);
void DrawTabs(void); virtual void SetTabs(void) {};
public: void DrawTabs(void);
cView(void); public:
virtual ~cView(void); cView(void);
void SetTitle(const char *t) { title = t ? t : ""; }; virtual ~cView(void);
void SetSubTitle(const char *s) { subTitle = s ? s : ""; }; void SetTitle(const char *t) { title = t ? t : ""; };
void SetDateTime(const char *dt) { dateTime = dt; }; void SetSubTitle(const char *s) { subTitle = s ? s : ""; };
void SetInfoText(const char *i) { infoText = i ? i : ""; }; void SetDateTime(const char *dt) { dateTime = dt; };
void SetAdditionalInfoText(std::string addInfo) { addInfoText = addInfo; }; void SetInfoText(const char *i) { infoText = i ? i : ""; };
void SetChannel(const cChannel *c) { channel = c; }; void SetAdditionalInfoText(std::string addInfo) { addInfoText = addInfo; };
void SetEventID(int id) { eventID = id; }; void SetChannel(const cChannel *c) { channel = c; };
void SetEvent(const cEvent *event) { this->event = event; }; void SetEventID(int id) { eventID = id; };
virtual void LoadMedia(void) {}; void SetEvent(const cEvent *event) { this->event = event; };
void SetGeometry(void); virtual void LoadMedia(void) {};
void SetFonts(void); void SetGeometry(void);
virtual bool KeyUp(void); void SetFonts(void);
virtual bool KeyDown(void); virtual bool KeyUp(void);
virtual void KeyLeft(void) {}; virtual bool KeyDown(void);
virtual void KeyRight(void) {}; virtual void KeyLeft(void) {};
void DrawScrollbar(void); virtual void KeyRight(void) {};
virtual void Action(void) {}; void DrawScrollbar(void);
}; virtual void Action(void) {};
};
class cEPGView : public cView {
protected: class cEPGView : public cView {
std::vector<std::string> epgPics; protected:
int numEPGPics; std::vector<std::string> epgPics;
int numTabs; int numEPGPics;
void SetTabs(void); int numTabs;
void CheckEPGImages(void); void SetTabs(void);
void DrawImages(void); void CheckEPGImages(void);
public: void DrawImages(void);
cEPGView(void); public:
virtual ~cEPGView(void); cEPGView(void);
void KeyLeft(void); virtual ~cEPGView(void);
void KeyRight(void); void KeyLeft(void);
void Action(void); void KeyRight(void);
}; void Action(void);
};
class cSeriesView : public cView {
protected: class cSeriesView : public cView {
int seriesId; protected:
int episodeId; int seriesId;
cSeries series; int episodeId;
std::string tvdbInfo; cSeries series;
void SetTabs(void); std::string tvdbInfo;
void CreateTVDBInfo(void); void SetTabs(void);
void DrawImages(void); void CreateTVDBInfo(void);
int GetRandomPoster(void); void DrawImages(void);
public: int GetRandomPoster(void);
cSeriesView(int seriesId, int episodeId); public:
virtual ~cSeriesView(void); cSeriesView(int seriesId, int episodeId);
void LoadMedia(void); virtual ~cSeriesView(void);
void KeyLeft(void); void LoadMedia(void);
void KeyRight(void); void KeyLeft(void);
void Action(void); void KeyRight(void);
}; void Action(void);
};
class cMovieView : public cView {
protected: class cMovieView : public cView {
int movieId; protected:
cMovie movie; int movieId;
std::string movieDBInfo; cMovie movie;
void SetTabs(void); std::string movieDBInfo;
void CreateMovieDBInfo(void); void SetTabs(void);
void DrawImages(void); void CreateMovieDBInfo(void);
public: void DrawImages(void);
cMovieView(int movieId); public:
virtual ~cMovieView(void); cMovieView(int movieId);
void LoadMedia(void); virtual ~cMovieView(void);
void KeyLeft(void); void LoadMedia(void);
void KeyRight(void); void KeyLeft(void);
void Action(void); void KeyRight(void);
}; void Action(void);
};
#endif //__TVGUIDE_VIEW_H
#endif //__TVGUIDE_VIEW_H