24 Commits

Author SHA1 Message Date
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
27 changed files with 552 additions and 207 deletions

36
HISTORY
View File

@@ -250,3 +250,39 @@ Version 1.2.16
- Optimize display "REC" sign in epgview - Optimize display "REC" sign in epgview
- Separate "displayTime" for horizontal and vertical view - Separate "displayTime" for horizontal and vertical view
- RecMenu "Timer Timeline" displays now sorted active timer - 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

View File

@@ -68,29 +68,28 @@ void cChannelGroupGrid::Draw(void) {
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("%c", nameUpper.at(i)); cString currentChar = cString::sprintf("%s", utf8_substr(groupName.c_str(), i, 1).c_str());
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

@@ -34,6 +34,8 @@ cTVGuideConfig::cTVGuideConfig() {
channelJumpMode = eNumJump; channelJumpMode = eNumJump;
jumpChannels = 0; jumpChannels = 0;
blueKeyMode = 2; blueKeyMode = 2;
addSubtitleToTimer = 1;
timerMessage = 1;
closeOnSwitch = 1; closeOnSwitch = 1;
numkeyMode = 0; numkeyMode = 0;
useRemoteTimers = 0; useRemoteTimers = 0;
@@ -295,6 +297,8 @@ bool cTVGuideConfig::SetupParse(const char *Name, const char *Value) {
else if (strcmp(Name, "footerHeightPercent") == 0) footerHeightPercent = atoi(Value); else if (strcmp(Name, "footerHeightPercent") == 0) footerHeightPercent = atoi(Value);
else if (strcmp(Name, "instRecFolderMode") == 0) instRecFolderMode = atoi(Value); else if (strcmp(Name, "instRecFolderMode") == 0) instRecFolderMode = atoi(Value);
else if (strcmp(Name, "instRecFixedFolder") == 0) instRecFixedFolder = Value; else if (strcmp(Name, "instRecFixedFolder") == 0) instRecFixedFolder = Value;
else if (strcmp(Name, "addSubtitleToTimer") == 0) addSubtitleToTimer = atoi(Value);
else if (strcmp(Name, "timerMessage") == 0) timerMessage = atoi(Value);
else if (strcmp(Name, "favWhatsOnNow") == 0) favWhatsOnNow = atoi(Value); else if (strcmp(Name, "favWhatsOnNow") == 0) favWhatsOnNow = atoi(Value);
else if (strcmp(Name, "favWhatsOnNext") == 0) favWhatsOnNext = atoi(Value); else if (strcmp(Name, "favWhatsOnNext") == 0) favWhatsOnNext = atoi(Value);
else if (strcmp(Name, "favUseTime1") == 0) favUseTime1 = atoi(Value); else if (strcmp(Name, "favUseTime1") == 0) favUseTime1 = atoi(Value);

View File

@@ -43,6 +43,12 @@ enum eInstRecFolderMode {
eFolderFixed eFolderFixed
}; };
typedef enum {
addSubtitleNever = 0,
addSubtitleSmart,
addSubtitleAlways
} addSubtitleToTimerMode;
class cTVGuideConfig { class cTVGuideConfig {
private: private:
cString checkSlashAtEnd(std::string path); cString checkSlashAtEnd(std::string path);
@@ -82,6 +88,8 @@ class cTVGuideConfig {
int channelJumpMode; int channelJumpMode;
int jumpChannels; int jumpChannels;
int blueKeyMode; int blueKeyMode;
int timerMessage;
int addSubtitleToTimer;
int closeOnSwitch; int closeOnSwitch;
int numkeyMode; int numkeyMode;
int useRemoteTimers; int useRemoteTimers;

View File

@@ -20,9 +20,9 @@ cEpgGrid::~cEpgGrid(void) {
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;
@@ -37,11 +37,11 @@ void cEpgGrid::PositionPixmap() {
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.requestPixmap(-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));
} }
@@ -49,11 +49,11 @@ void cEpgGrid::PositionPixmap() {
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.requestPixmap(-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 ));
} }

View File

@@ -7,7 +7,7 @@ cOsdManager::cOsdManager(void) {
bool cOsdManager::setOsd() { bool cOsdManager::setOsd() {
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop()); osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
if (osd) { if (osd) {
tArea Area = { 0, 0, cOsd::OsdWidth(), cOsd::OsdHeight(), 32 }; tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 };
if (osd->SetAreas(&Area, 1) == oeOk) { if (osd->SetAreas(&Area, 1) == oeOk) {
return true; return true;
} }

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: 2020-01-06 14:31+0100\n" "POT-Creation-Date: 2020-08-04 14:15+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"
@@ -102,12 +105,15 @@ 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 ""
@@ -757,7 +763,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 ""
@@ -888,15 +894,30 @@ msgstr ""
msgid "Use fixed folder" msgid "Use fixed folder"
msgstr "" msgstr ""
msgid "Folder for instant Recordings" msgid "smart"
msgstr "" msgstr ""
msgid "Instant recording:"
msgstr ""
msgid "Folder for instant Recordings"
msgstr "Utilitza carpetes per gravacions a l'instant"
msgid "Folder" msgid "Folder"
msgstr "" msgstr ""
msgid "Add episode to manual timers"
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" msgid "Limit channels in favorites"
msgstr "" msgstr ""
@@ -982,7 +1003,7 @@ msgid "EPG Info"
msgstr "" msgstr ""
msgid "Reruns" msgid "Reruns"
msgstr "" msgstr "Reemissions"
msgid "Recording Information" msgid "Recording Information"
msgstr "" msgstr ""

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: 2020-01-06 14:31+0100\n" "POT-Creation-Date: 2020-08-04 14:15+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"
@@ -99,12 +102,15 @@ msgstr "erledigte Aufnahmen"
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"
@@ -885,15 +891,30 @@ 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" msgid "Folder"
msgstr "Verzeichnis" 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" msgid "Limit channels in favorites"
msgstr "Kanäle in Favoriten beschränken" msgstr "Kanäle in Favoriten beschränken"
@@ -982,7 +1003,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"

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: 2020-01-06 14:31+0100\n" "POT-Creation-Date: 2020-08-04 14:15+0200\n"
"PO-Revision-Date: 2012-08-25 17:49+0200\n" "PO-Revision-Date: 2012-08-25 17:49+0200\n"
"Last-Translator: fiveten_59\n" "Last-Translator: fiveten_59\n"
"Language-Team: \n" "Language-Team: \n"
@@ -54,6 +54,9 @@ msgstr "Favoriti"
msgid "images" msgid "images"
msgstr "Immagini" msgstr "Immagini"
msgid "tvguide: RemoteTimerModifications failed"
msgstr ""
msgid "root video folder" msgid "root video folder"
msgstr "cartella video di root" msgstr "cartella video di root"
@@ -99,12 +102,15 @@ msgstr "registrazione eseguita"
msgid "Instant Record" msgid "Instant Record"
msgstr "Registrazione immediata" msgstr "Registrazione immediata"
msgid "Delete Timer" msgid "Timer On/Off"
msgstr "Cancella il Timer" msgstr "Timer On/Off"
msgid "Edit Timer" msgid "Edit Timer"
msgstr "Edita il Timer" msgstr "Edita il Timer"
msgid "Delete Timer"
msgstr "Cancella il Timer"
msgid "Timer Timeline" msgid "Timer Timeline"
msgstr "Scadenza del Timer" msgstr "Scadenza del Timer"
@@ -885,15 +891,30 @@ msgstr "Scegli dall'elenco cartelle"
msgid "Use fixed folder" msgid "Use fixed folder"
msgstr "Usa cartella fissa" msgstr "Usa cartella fissa"
msgid "smart"
msgstr "intelligente"
msgid "Instant recording:"
msgstr ""
msgid "Folder for instant Recordings" msgid "Folder for instant Recordings"
msgstr "Cartella per la registrazione immediata" msgstr "Cartella per la registrazione immediata"
msgid "Folder" msgid "Folder"
msgstr "Cartella" msgstr "Cartella"
msgid "Add episode to manual timers"
msgstr "Aggiungi episodi ai timer manuali"
msgid "Use Remotetimers" msgid "Use Remotetimers"
msgstr "Usa Remotetimers" msgstr "Usa Remotetimers"
msgid "Show timer confirmation messages"
msgstr ""
msgid "Favorites:"
msgstr ""
msgid "Limit channels in favorites" msgid "Limit channels in favorites"
msgstr "Limite dei canali nei favoriti" msgstr "Limite dei canali nei favoriti"

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: 2020-01-06 14:31+0100\n" "POT-Creation-Date: 2020-08-04 14:15+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 "Главная видео директория"
@@ -99,12 +102,15 @@ 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 ""
@@ -292,7 +298,7 @@ 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 ""
@@ -754,7 +760,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 ""
@@ -885,15 +891,30 @@ msgstr ""
msgid "Use fixed folder" msgid "Use fixed folder"
msgstr "" msgstr ""
msgid "Folder for instant Recordings" msgid "smart"
msgstr "" msgstr ""
msgid "Instant recording:"
msgstr ""
msgid "Folder for instant Recordings"
msgstr "Использовать директории для быстрой записи"
msgid "Folder" msgid "Folder"
msgstr "" msgstr ""
msgid "Add episode to manual timers"
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" msgid "Limit channels in favorites"
msgstr "" msgstr ""
@@ -979,7 +1000,7 @@ msgid "EPG Info"
msgstr "" msgstr ""
msgid "Reruns" msgid "Reruns"
msgstr "" msgstr "ПОВТОРЫ"
msgid "Recording Information" msgid "Recording Information"
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: 2020-01-06 14:31+0100\n" "POT-Creation-Date: 2020-08-04 14:15+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<EFBFBD>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<76> video adres<65>r" msgstr "Hlavn<76> video adres<65>r"
@@ -99,12 +102,15 @@ msgstr ""
msgid "Instant Record" msgid "Instant Record"
msgstr "Okam<61>ite nahra<72>" msgstr "Okam<61>ite nahra<72>"
msgid "Delete Timer" msgid "Timer On/Off"
msgstr "Vymaza<EFBFBD> pl<70>n nahr<68>vania" msgstr "Zap./Vyp. pl<70>n nahr<68>vania"
msgid "Edit Timer" msgid "Edit Timer"
msgstr "Upravi<76> pl<70>n nahr<68>vania" msgstr "Upravi<76> pl<70>n nahr<68>vania"
msgid "Delete Timer"
msgstr "Vymaza<7A> pl<70>n nahr<68>vania"
msgid "Timer Timeline" msgid "Timer Timeline"
msgstr "" msgstr ""
@@ -754,7 +760,7 @@ msgid "Display time in EPG Grids"
msgstr "Zobrazi<7A> <20>as v EPG mrie<69>ke" msgstr "Zobrazi<7A> <20>as v EPG mrie<69>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<EFBFBD><EFBFBD>ka stavovej hlavi<76>ky (% z OSD v<><76>ky)"
msgid "Height of Footer (Perc. of osd height)" msgid "Height of Footer (Perc. of osd height)"
msgstr "" msgstr ""
@@ -885,15 +891,30 @@ msgstr ""
msgid "Use fixed folder" msgid "Use fixed folder"
msgstr "" msgstr ""
msgid "Folder for instant Recordings" msgid "smart"
msgstr "chytr<74>"
msgid "Instant recording:"
msgstr "" msgstr ""
msgid "Folder for instant Recordings"
msgstr "Pou<6F>i<EFBFBD> adres<65>re pre okam<61>it<69> nahr<68>vky"
msgid "Folder" msgid "Folder"
msgstr "" msgstr ""
msgid "Add episode to manual timers"
msgstr "Prida<64> epiz<69>dy do ru<72>n<EFBFBD>ho <20>asova<76>a"
msgid "Use Remotetimers" msgid "Use Remotetimers"
msgstr "Pou<6F>i<EFBFBD> vzdialen<65> pl<70>nova<76>" msgstr "Pou<6F>i<EFBFBD> vzdialen<65> pl<70>nova<76>"
msgid "Show timer confirmation messages"
msgstr ""
msgid "Favorites:"
msgstr ""
msgid "Limit channels in favorites" msgid "Limit channels in favorites"
msgstr "" msgstr ""
@@ -979,7 +1000,7 @@ msgid "EPG Info"
msgstr "" msgstr ""
msgid "Reruns" msgid "Reruns"
msgstr "" msgstr "Repr<EFBFBD>za"
msgid "Recording Information" msgid "Recording Information"
msgstr "" msgstr ""

View File

@@ -96,10 +96,11 @@ 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);
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
((cTimer*)timer)->SetRemote(Setup.SVDRPDefaultHost);
LOCK_TIMERS_WRITE; LOCK_TIMERS_WRITE;
cTimers* timers = Timers; cTimers* timers = Timers;
timers->SetExplicitModify();
if (Setup.SVDRPPeering && *Setup.SVDRPDefaultHost)
timer->SetRemote(Setup.SVDRPDefaultHost);
#else #else
cTimers* timers = &Timers; cTimers* timers = &Timers;
#endif #endif
@@ -115,12 +116,21 @@ cTimer *cRecManager::createLocalTimer(const cEvent *event, std::string path) {
timer = t; timer = t;
isyslog("timer %s reactivated", *t->ToDescr()); isyslog("timer %s reactivated", *t->ToDescr());
} else { } else {
SetTimerPath(timer, event, path);
timers->Add(timer); 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) {
@@ -165,12 +175,25 @@ 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);
} }
@@ -204,6 +227,12 @@ void cRecManager::DeleteTimer(const cTimer *timer) {
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
LOCK_TIMERS_WRITE; LOCK_TIMERS_WRITE;
cTimers* timers = Timers; cTimers* timers = Timers;
if (timer && timer->Remote() && !timer->Recording()) {
if (HandleRemoteTimerModifications(NULL, (cTimer*)timer)) {
timers->Del((cTimer*)timer);
}
timers->SetModified();
}
cTimer* t = timers->GetTimer(timer); cTimer* t = timers->GetTimer(timer);
#else #else
cTimers* timers = &Timers; cTimers* timers = &Timers;
@@ -238,36 +267,67 @@ void cRecManager::DeleteRemoteTimer(const cEvent *event) {
} }
} }
void cRecManager::SaveTimer(const cTimer *t, cTimer newTimerSettings) { void cRecManager::OnOffTimer(const cEvent *event) {
const cTimer *t;
#if VDRVERSNUM >= 20301
{
LOCK_TIMERS_READ;
t = Timers->GetMatch(event);
}
#else
t = Timers.GetMatch(event);
#endif
if (!t)
return;
SaveTimer(t);
}
void cRecManager::SaveTimer(const cTimer *t, cTimer *newTimerSettings) {
if (!t) if (!t)
return; return;
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
LOCK_TIMERS_WRITE; LOCK_TIMERS_WRITE;
cTimer *timer = Timers->GetTimer(t); cTimers* timers = Timers;
timers->SetExplicitModify();
if (t && t->Remote()) {
if (!HandleRemoteTimerModifications(newTimerSettings, (cTimer *)t)) {
esyslog(tr("tvguide: RemoteTimerModifications failed"));
}
}
cTimer *timer = timers->GetTimer(t);
#else #else
cTimer *timer = Timers.GetTimer((cTimer*)t); cTimers* timers = &Timers;
cTimer *timer = timers->GetTimer((cTimer *)t);
#endif #endif
if (!timer) {
return;
}
bool active = newTimerSettings.HasFlags(tfActive); bool active = true;
int prio = newTimerSettings.Priority(); if (newTimerSettings) {
int lifetime = newTimerSettings.Lifetime(); int prio = newTimerSettings->Priority();
time_t day = newTimerSettings.Day(); int lifetime = newTimerSettings->Lifetime();
int start = newTimerSettings.Start(); time_t day = newTimerSettings->Day();
int stop = newTimerSettings.Stop(); int start = newTimerSettings->Start();
std::string fileName = newTimerSettings.File(); int stop = newTimerSettings->Stop();
std::string fileName = newTimerSettings->File();
timer->SetDay(day); timer->SetDay(day);
timer->SetStart(start); timer->SetStart(start);
timer->SetStop(stop); timer->SetStop(stop);
timer->SetPriority(prio); timer->SetPriority(prio);
timer->SetLifetime(lifetime); timer->SetLifetime(lifetime);
timer->SetFile(fileName.c_str()); timer->SetFile(fileName.c_str());
if (timer->HasFlags(tfActive) && !active) active = newTimerSettings->HasFlags(tfActive);
timer->ClrFlags(tfActive); } else
else if (!timer->HasFlags(tfActive) && active) active = !timer->HasFlags(tfActive);
timer->SetFlags(tfActive);
if (active)
timer->SetFlags(tfActive);
else
timer->ClrFlags(tfActive);
#if VDRVERSNUM < 20300 #if VDRVERSNUM < 20300
timer->SetEventFromSchedule(); timer->SetEventFromSchedule();
@@ -279,11 +339,7 @@ void cRecManager::SaveTimer(const cTimer *t, cTimer newTimerSettings) {
rt.timer = NULL; rt.timer = NULL;
RefreshRemoteTimers(); RefreshRemoteTimers();
} else { } else {
#if VDRVERSNUM >= 20301 timers->SetModified();
Timers->SetModified();
#else
Timers.SetModified();
#endif
} }
} }

View File

@@ -33,11 +33,12 @@ public:
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 OnOffTimer(const cEvent *event);
void DeleteTimer(const cTimer *timer); 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(const 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);

View File

@@ -441,7 +441,7 @@ void cRecMenu::JumpBegin(void) {
CreatePixmap(); CreatePixmap();
Arrange(false); 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();
@@ -589,10 +589,14 @@ 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 (!totalNumItems)
return;
if (imgScrollBar == NULL) { if (imgScrollBar == NULL) {
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));

View File

@@ -557,7 +557,7 @@ void cRecMenuItemSelect::Draw(void) {
void cRecMenuItemSelect::DrawValue(void) { void cRecMenuItemSelect::DrawValue(void) {
pixmapVal->Fill(clrTransparent); pixmapVal->Fill(clrTransparent);
std::string textVal = strings[currentVal]; std::string textVal = strings[currentVal];
int iconSize = min(128, height); int iconSize = std::min(128, height);
int textX = width - font->Width(textVal.c_str()) - iconSize; int textX = width - font->Width(textVal.c_str()) - iconSize;
int textY = (height - font->Height()) / 2; int textY = (height - font->Height()) / 2;
pixmapVal->DrawText(cPoint(textX, textY), textVal.c_str(), colorText, clrTransparent, font); pixmapVal->DrawText(cPoint(textX, textY), textVal.c_str(), colorText, clrTransparent, font);
@@ -664,7 +664,7 @@ void cRecMenuItemSelectDirectory::Draw(void) {
void cRecMenuItemSelectDirectory::DrawValue(void) { void cRecMenuItemSelectDirectory::DrawValue(void) {
pixmapVal->Fill(clrTransparent); pixmapVal->Fill(clrTransparent);
int iconSize = min(128, height); int iconSize = std::min(128, height);
int textX = std::max(width - font->Width(folders[currentVal].c_str()) - iconSize, 10 + font->Width(*text) + 2 * iconSize); int textX = std::max(width - font->Width(folders[currentVal].c_str()) - iconSize, 10 + font->Width(*text) + 2 * iconSize);
int textY = (height - font->Height()) / 2; int textY = (height - font->Height()) / 2;
pixmapVal->DrawText(cPoint(textX, textY), folders[currentVal].c_str(), colorText, clrTransparent, font, width - textX - iconSize, font->Height(), taTop | taRight); pixmapVal->DrawText(cPoint(textX, textY), folders[currentVal].c_str(), colorText, clrTransparent, font, width - textX - iconSize, font->Height(), taTop | taRight);
@@ -967,7 +967,7 @@ char *cRecMenuItemText::GetSMSKeys(int num) {
if (specialChar) if (specialChar)
addition = 1; addition = 1;
Utf8FromArray(startCharUtf8, p, numChars+addition); Utf8FromArray(startCharUtf8, p, numChars+addition);
int maxChars = min(numChars+1+addition, 8); int maxChars = std::min(numChars+1+addition, 8);
char *smskey = new char[maxChars]; char *smskey = new char[maxChars];
Utf8Strn0Cpy(smskey, p, maxChars); Utf8Strn0Cpy(smskey, p, maxChars);
return smskey; return smskey;
@@ -1548,6 +1548,7 @@ cRecMenuItemTimer::cRecMenuItemTimer(const cTimer *timer,
this->overlapStop = overlapStop; this->overlapStop = overlapStop;
this->active = active; this->active = active;
height = 3 * font->Height(); height = 3 * font->Height();
pixmapStatus = NULL;
pixmapIcons = NULL; pixmapIcons = NULL;
} }
@@ -1585,6 +1586,8 @@ void cRecMenuItemTimer::Show(void) {
} }
void cRecMenuItemTimer::Draw(void) { void cRecMenuItemTimer::Draw(void) {
if (!timer)
return;
const cChannel *channel = timer->Channel(); const cChannel *channel = timer->Channel();
int channelTransponder = 0; int channelTransponder = 0;
cString channelName = ""; cString channelName = "";
@@ -1598,7 +1601,7 @@ void cRecMenuItemTimer::Draw(void) {
if (!config.hideChannelLogos) { if (!config.hideChannelLogos) {
if (imgLoader.LoadLogo(channel, logoWidth, height)) { if (imgLoader.LoadLogo(channel, logoWidth, height)) {
cImage logo = imgLoader.GetImage(); cImage logo = imgLoader.GetImage();
pixmapIcons->DrawImage(cPoint(logoX, 0), logo); pixmapIcons->DrawImage(cPoint(logoX, (height - logo.Height()) / 2), logo);
logoX += logoWidth + 5; logoX += logoWidth + 5;
} }
} }
@@ -1740,8 +1743,13 @@ cRecMenuItemTimerConflictHeader::~cRecMenuItemTimerConflictHeader(void) {
} }
void cRecMenuItemTimerConflictHeader::SetPixmaps(void) { void cRecMenuItemTimerConflictHeader::SetPixmaps(void) {
pixmap = osdManager.requestPixmap(4, cRect(x, y, width, height)); if (!pixmap) {
pixmapStatus = osdManager.requestPixmap(5, cRect(x, y, width, height)); pixmap = osdManager.requestPixmap(4, cRect(x, y, width, height));
pixmapStatus = osdManager.requestPixmap(5, cRect(x, y, width, height));
} else {
pixmap->SetViewPort(cRect(x, y, width, height));
pixmapStatus->SetViewPort(cRect(x, y, width, height));
}
pixmapStatus->Fill(clrTransparent); pixmapStatus->Fill(clrTransparent);
} }
@@ -2005,7 +2013,7 @@ void cRecMenuItemChannelChooser::DrawValue(void) {
cImageLoader imgLoader; cImageLoader imgLoader;
if (imgLoader.LoadLogo(channel, logoWidth, height - 10)) { if (imgLoader.LoadLogo(channel, logoWidth, height - 10)) {
cImage logo = imgLoader.GetImage(); cImage logo = imgLoader.GetImage();
pixmapChannel->DrawImage(cPoint(logoX, 5), logo); pixmapChannel->DrawImage(cPoint(logoX, (height - logo.Height()) / 2), logo);
} }
} else { } else {
cString textVal = tr("all Channels"); cString textVal = tr("all Channels");
@@ -2155,7 +2163,7 @@ void cRecMenuItemDayChooser::SetSizes(void) {
if (charWidth > maxWidth) if (charWidth > maxWidth)
maxWidth = charWidth; maxWidth = charWidth;
} }
daysSize = min(maxWidth + 15, height - 4); daysSize = std::min(maxWidth + 15, height - 4);
daysX = width - 10 - 7 * daysSize; daysX = width - 10 - 7 * daysSize;
daysY = (height - daysSize) / 2; daysY = (height - daysSize) / 2;
} }
@@ -2304,13 +2312,14 @@ void cRecMenuItemRecording::Show(void) {
} }
// --- cRecMenuItemTimelineHeader ------------------------------------------------------- // --- cRecMenuItemTimelineHeader -------------------------------------------------------
cRecMenuItemTimelineHeader::cRecMenuItemTimelineHeader(time_t day, std::vector<cTVGuideTimerConflict*> conflictsToday) { cRecMenuItemTimelineHeader::cRecMenuItemTimelineHeader(time_t day, int numTimersToday, std::vector<cTVGuideTimerConflict*> conflictsToday) {
conflicts = conflictsToday; conflicts = conflictsToday;
pixmapTimeline = NULL; pixmapTimeline = NULL;
pixmapTimerInfo = NULL; pixmapTimerInfo = NULL;
pixmapTimerConflicts = NULL; pixmapTimerConflicts = NULL;
timer = NULL; timer = NULL;
this->day = day; this->day = day;
this->numTimersToday = numTimersToday;
selectable = false; selectable = false;
active = false; active = false;
height = 5 * font->Height(); height = 5 * font->Height();
@@ -2359,7 +2368,7 @@ void cRecMenuItemTimelineHeader::Draw(void) {
} }
DrawTimerConflicts(); DrawTimerConflicts();
pixmap->Fill(clrTransparent); pixmap->Fill(clrTransparent);
cString headerText = tr("Timers for"); cString headerText = cString::sprintf("%i %s", numTimersToday, tr("Timers for"));
cString dateText = DateString(day); cString dateText = DateString(day);
cString header = cString::sprintf("%s: %s", *headerText, *dateText); cString header = cString::sprintf("%s: %s", *headerText, *dateText);
int xText = (width - fontLarge->Width(*header)) / 2; int xText = (width - fontLarge->Width(*header)) / 2;
@@ -2384,7 +2393,7 @@ void cRecMenuItemTimelineHeader::DrawCurrentTimer(void) {
if (!config.hideChannelLogos) { if (!config.hideChannelLogos) {
if (imgLoader.LoadLogo(channel, logoWidth, infoHeight)) { if (imgLoader.LoadLogo(channel, logoWidth, infoHeight)) {
cImage logo = imgLoader.GetImage(); cImage logo = imgLoader.GetImage();
pixmapTimerInfo->DrawImage(cPoint(0, 0), logo); pixmapTimerInfo->DrawImage(cPoint(0, (infoHeight - logo.Height()) / 2), logo);
x += logoWidth + 10; x += logoWidth + 10;
logoDrawn = true; logoDrawn = true;
} }
@@ -2421,7 +2430,7 @@ void cRecMenuItemTimelineHeader::DrawTimeline(void) {
pixmapTimeline->Fill(clrTransparent); pixmapTimeline->Fill(clrTransparent);
width5Mins = (float)width * 5.0 / 24.0 / 60.0; width5Mins = (float)width * 5.0 / 24.0 / 60.0;
int widthHour = 12 * width5Mins; int widthHour = 12 * width5Mins;
x0 = (width - 24*widthHour)/2; x0 = (width - (24 * widthHour)) / 2;
int barHeight = fontSmall->Height(); int barHeight = fontSmall->Height();
int y = height - barHeight; int y = height - barHeight;
tColor col1 = theme.Color(clrTimeline1); tColor col1 = theme.Color(clrTimeline1);
@@ -2526,7 +2535,8 @@ void cRecMenuItemTimelineTimer::SetPixmaps(void) {
} }
width5Mins = (float)width * 5.0 / 24.0 / 60.0; width5Mins = (float)width * 5.0 / 24.0 / 60.0;
x0 = (width - 24*12*width5Mins)/2; int widthHour = 12 * width5Mins;
x0 = (width - (24 * widthHour)) / 2;
} }
void cRecMenuItemTimelineTimer::Draw(void) { void cRecMenuItemTimelineTimer::Draw(void) {

View File

@@ -25,6 +25,7 @@ enum eRecMenuState {
rmsSearchRerunsTimerConflictMenu, rmsSearchRerunsTimerConflictMenu,
rmsSaveTimerConflictMenu, rmsSaveTimerConflictMenu,
rmsTimerConflictShowInfo, rmsTimerConflictShowInfo,
rmsOnOffTimer,
rmsDeleteTimer, rmsDeleteTimer,
rmsDeleteTimerConfirmation, rmsDeleteTimerConfirmation,
rmsEditTimer, rmsEditTimer,
@@ -573,19 +574,21 @@ private:
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(const 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);
@@ -601,7 +604,7 @@ private:
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);

View File

@@ -11,8 +11,9 @@ cRecMenuMain::cRecMenuMain(bool epgSearchAvailable, bool timerActive, bool switc
action = rmsInstantRecordFolder; action = rmsInstantRecordFolder;
AddMenuItem(new cRecMenuItemButton(tr("Instant Record"), action, true, false, false, true)); AddMenuItem(new cRecMenuItemButton(tr("Instant Record"), action, true, false, false, true));
} else { } else {
AddMenuItem(new cRecMenuItemButton(tr("Delete Timer"), rmsDeleteTimer, true, false, false, true)); AddMenuItem(new cRecMenuItemButton(tr("Timer On/Off"), rmsOnOffTimer, true, false, false, true));
AddMenuItem(new cRecMenuItemButton(tr("Edit Timer"), rmsEditTimer, false, false, false, true)); AddMenuItem(new cRecMenuItemButton(tr("Edit Timer"), rmsEditTimer, false, false, false, true));
AddMenuItem(new cRecMenuItemButton(tr("Delete Timer"), rmsDeleteTimer, false, false, false, true));
} }
AddMenuItem(new cRecMenuItemButton(tr("Timer Timeline"), rmsTimeline, false, false, false, true)); AddMenuItem(new cRecMenuItemButton(tr("Timer Timeline"), rmsTimeline, false, false, false, true));
@@ -194,8 +195,9 @@ cRecMenuAskDeleteTimer::cRecMenuAskDeleteTimer(const cEvent *event) {
// --- cRecMenuTimerConflicts --------------------------------------------------------- // --- cRecMenuTimerConflicts ---------------------------------------------------------
cRecMenuTimerConflicts::cRecMenuTimerConflicts(cTVGuideTimerConflicts *conflicts) { cRecMenuTimerConflicts::cRecMenuTimerConflicts(cTVGuideTimerConflicts *conflicts) {
int numConflicts = conflicts->NumConflicts(); SetWidthPercent(50);
int numConflicts = (conflicts) ? conflicts->NumConflicts() : 0;
cString text; cString text;
if (numConflicts == 1) { if (numConflicts == 1) {
text = cString::sprintf("%s %s %s", tr("One"), tr("Timer Conflict"), tr("detected")); text = cString::sprintf("%s %s %s", tr("One"), tr("Timer Conflict"), tr("detected"));
@@ -230,19 +232,21 @@ int cRecMenuTimerConflicts::GetTimerConflict(void) {
} }
// --- cRecMenuTimerConflict --------------------------------------------------------- // --- cRecMenuTimerConflict ---------------------------------------------------------
cRecMenuTimerConflict::cRecMenuTimerConflict(cTVGuideTimerConflict *conflict) { cRecMenuTimerConflict::cRecMenuTimerConflict(cTVGuideTimerConflict *conflict, eRecMenuState nextAction) {
SetWidthPercent(95); SetWidthPercent(95);
this->conflict = conflict; this->conflict = conflict;
SetHeader(new cRecMenuItemTimerConflictHeader(conflict->timeStart, totalNumMenuItems = (int)conflict->timerIDs.size();
conflict->timeStop,
conflict->overlapStart, SetHeader(new cRecMenuItemTimerConflictHeader(conflict->timeStart,
conflict->timeStop,
conflict->overlapStart,
conflict->overlapStop)); conflict->overlapStop));
SetFooter(new cRecMenuItemButton(tr("Ignore Conflict"), rmsIgnoreTimerConflict, false, true)); SetFooter(new cRecMenuItemButton(tr("Ignore Conflict"), nextAction, false, true));
int i=0; int i=0;
for(std::vector<int>::iterator it = conflict->timerIDs.begin(); it != conflict->timerIDs.end(); it++) { for(std::vector<int>::iterator it = conflict->timerIDs.begin(); it != conflict->timerIDs.end(); it++) {
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
LOCK_TIMERS_READ; LOCK_TIMERS_READ;
const cTimer *timer = Timers->Get(*it); const cTimer *timer = Timers->GetById(*it + 1);
#else #else
const cTimer *timer = Timers.Get(*it); const cTimer *timer = Timers.Get(*it);
#endif #endif
@@ -268,7 +272,7 @@ cRecMenuTimerConflict::cRecMenuTimerConflict(cTVGuideTimerConflict *conflict) {
} }
cRecMenuItem *cRecMenuTimerConflict::GetMenuItem(int number) { cRecMenuItem *cRecMenuTimerConflict::GetMenuItem(int number) {
if ((number >= 0) && (number < (int)conflict->timerIDs.size())) { if ((number >= 0) && (number < totalNumMenuItems)) {
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
LOCK_TIMERS_READ; LOCK_TIMERS_READ;
const cTimer *timer = Timers->Get(conflict->timerIDs[number]); const cTimer *timer = Timers->Get(conflict->timerIDs[number]);
@@ -290,8 +294,8 @@ cRecMenuItem *cRecMenuTimerConflict::GetMenuItem(int number) {
return NULL; return NULL;
} }
int cRecMenuTimerConflict::GetTotalNumMenuItems(void) { int cRecMenuTimerConflict::GetTotalNumMenuItems(void) {
return conflict->timerIDs.size(); return totalNumMenuItems;
} }
int cRecMenuTimerConflict::GetTimerConflictIndex(void) { int cRecMenuTimerConflict::GetTimerConflictIndex(void) {
@@ -467,17 +471,17 @@ const cTimer *cRecMenuEditTimer::GetOriginalTimer(void) {
return originalTimer; return originalTimer;
} }
cTimer cRecMenuEditTimer::GetTimer(void) { cTimer *cRecMenuEditTimer::GetTimer(void) {
cTimer t; cTimer *t = (cTimer *)originalTimer;
if (timerActive) if (timerActive)
t.SetFlags(tfActive); t->SetFlags(tfActive);
else else
t.SetFlags(tfNone); t->ClrFlags(tfActive);
t.SetDay(day); t->SetDay(day);
t.SetStart(start); t->SetStart(start);
t.SetStop(stop); t->SetStop(stop);
t.SetPriority(prio); t->SetPriority(prio);
t.SetLifetime(lifetime); t->SetLifetime(lifetime);
std::string newFolder(folder); std::string newFolder(folder);
std::string newFile = originalTimer->File(); std::string newFile = originalTimer->File();
size_t found = newFile.find_last_of('~'); size_t found = newFile.find_last_of('~');
@@ -492,7 +496,7 @@ cTimer cRecMenuEditTimer::GetTimer(void) {
newFile = *cString::sprintf("%s~%s", newFolder.c_str(), newFile.c_str()); newFile = *cString::sprintf("%s~%s", newFolder.c_str(), newFile.c_str());
} }
std::replace(newFile.begin(), newFile.end(), '/', '~'); std::replace(newFile.begin(), newFile.end(), '/', '~');
t.SetFile(newFile.c_str()); t->SetFile(newFile.c_str());
return t; return t;
} }
@@ -1410,8 +1414,8 @@ cRecMenuTimeline::cRecMenuTimeline(cTVGuideTimerConflicts *timerConflicts) {
SetStartStop(); SetStartStop();
conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop); conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop);
GetTimersForDay(); GetTimersForDay();
SetWidthPercent(95); SetWidthPercent(90);
header = new cRecMenuItemTimelineHeader(timeStart, conflictsToday); header = new cRecMenuItemTimelineHeader(timeStart, numTimersToday, conflictsToday);
SetHeader(header); SetHeader(header);
cRecMenuItem *footer = new cRecMenuItemButton(tr("Close"), rmsClose, false, true); cRecMenuItem *footer = new cRecMenuItemButton(tr("Close"), rmsClose, false, true);
SetFooter(footer); SetFooter(footer);
@@ -1432,9 +1436,6 @@ void cRecMenuTimeline::GetTimersForDay(void) {
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
LOCK_TIMERS_READ; LOCK_TIMERS_READ;
const cTimers* timers = Timers; const cTimers* timers = Timers;
#else
const cTimers* timers = &Timers;
#endif
cSortedTimers SortedTimers(timers); cSortedTimers SortedTimers(timers);
int i = 0; int i = 0;
while (i < SortedTimers.Size()) { while (i < SortedTimers.Size()) {
@@ -1445,17 +1446,29 @@ void cRecMenuTimeline::GetTimersForDay(void) {
} }
i++; i++;
} }
#else
for (const cTimer *t = Timers.First(); t; t = Timers.Next(t)) {
if (((t->StartTime() > timeStart) && (t->StartTime() <= timeStop)) || ((t->StopTime() > timeStart) && (t->StopTime() <= timeStop))) {
timersToday.push_back(t);
}
}
#endif
numTimersToday = timersToday.size(); numTimersToday = timersToday.size();
} }
void cRecMenuTimeline::SetTimers(void) { void cRecMenuTimeline::SetTimers(void) {
ClearMenu(); ClearMenu();
GetTimersForDay();
conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop);
header->UnsetCurrentTimer();
header->SetDay(timeStart);
header->RefreshTimerDisplay();
header->SetNumTimersToday(numTimersToday);
if (numTimersToday == 0) { if (numTimersToday == 0) {
AddMenuItem(new cRecMenuItemTimelineTimer(NULL, 0, 0, conflictsToday, header, false)); AddMenuItem(new cRecMenuItemTimelineTimer(NULL, 0, 0, conflictsToday, header, false));
header->UnsetCurrentTimer();
footer->setActive(); footer->setActive();
} else { } else {
for (int i=0; i<numTimersToday; i++) { for (int i = 0; i<numTimersToday; i++) {
cRecMenuItemTimelineTimer *item = new cRecMenuItemTimelineTimer(timersToday[i], timeStart, timeStop, conflictsToday, header, false); cRecMenuItemTimelineTimer *item = new cRecMenuItemTimelineTimer(timersToday[i], timeStart, timeStop, conflictsToday, header, false);
if (i==0) if (i==0)
item->setActive(); item->setActive();
@@ -1474,12 +1487,6 @@ void cRecMenuTimeline::PrevDay(void) {
return; return;
timeStart -= 3600*24; timeStart -= 3600*24;
timeStop -= 3600*24; timeStop -= 3600*24;
conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop);
SetWidthPercent(95);
header->SetDay(timeStart);
header->UnsetCurrentTimer();
header->RefreshTimerDisplay();
GetTimersForDay();
SetTimers(); SetTimers();
Display(); Display();
} }
@@ -1487,12 +1494,6 @@ void cRecMenuTimeline::PrevDay(void) {
void cRecMenuTimeline::NextDay(void) { void cRecMenuTimeline::NextDay(void) {
timeStart += 3600*24; timeStart += 3600*24;
timeStop += 3600*24; timeStop += 3600*24;
conflictsToday = timerConflicts->GetConflictsBetween(timeStart, timeStop);
SetWidthPercent(95);
header->SetDay(timeStart);
header->UnsetCurrentTimer();
header->RefreshTimerDisplay();
GetTimersForDay();
SetTimers(); SetTimers();
Display(); Display();
} }

View File

@@ -77,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);
}; };
@@ -136,7 +137,7 @@ public:
cRecMenuEditTimer(const cTimer *timer, eRecMenuState nextState); cRecMenuEditTimer(const cTimer *timer, eRecMenuState nextState);
const cTimer *GetOriginalTimer(void); const cTimer *GetOriginalTimer(void);
virtual ~cRecMenuEditTimer(void) {}; virtual ~cRecMenuEditTimer(void) {};
cTimer GetTimer(void); cTimer *GetTimer(void);
}; };
/****************************************************************************************** /******************************************************************************************

View File

@@ -93,16 +93,18 @@ void cRecMenuView::DisplaySearchTimerList(void) {
} }
bool cRecMenuView::DisplayTimerConflict(const cTimer *timer) { bool cRecMenuView::DisplayTimerConflict(const cTimer *timer) {
int timerID = 0;
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
LOCK_TIMERS_READ; LOCK_TIMERS_READ;
for (const cTimer *t = Timers->First(); t; t = Timers->Next(t)) { for (const cTimer *t = Timers->First(); t; t = Timers->Next(t)) {
if (t == timer)
return DisplayTimerConflict(timer->Id() - 1);
#else #else
int timerID = 0;
for (const cTimer *t = Timers.First(); t; t = Timers.Next(t)) { for (const cTimer *t = Timers.First(); t; t = Timers.Next(t)) {
#endif
if (t == timer) if (t == timer)
return DisplayTimerConflict(timerID); return DisplayTimerConflict(timerID);
timerID++; timerID++;
#endif
} }
return false; return false;
} }
@@ -119,7 +121,8 @@ bool cRecMenuView::DisplayTimerConflict(int timerID) {
cTVGuideTimerConflict *conflict = timerConflicts->GetCurrentConflict(); cTVGuideTimerConflict *conflict = timerConflicts->GetCurrentConflict();
if (!conflict) if (!conflict)
return false; return false;
activeMenu = new cRecMenuTimerConflict(conflict); delete activeMenu;
activeMenu = new cRecMenuTimerConflict(conflict, rmsIgnoreTimerConflict);
activeMenu->Display(); activeMenu->Display();
return true; return true;
} }
@@ -161,11 +164,16 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
if (cRecMenuAskFolder *menu = dynamic_cast<cRecMenuAskFolder*>(activeMenu)) { if (cRecMenuAskFolder *menu = dynamic_cast<cRecMenuAskFolder*>(activeMenu)) {
recFolder = menu->GetFolder(); recFolder = menu->GetFolder();
} }
delete activeMenu;
cTimer *timer = recManager->createTimer(event, recFolder); cTimer *timer = recManager->createTimer(event, recFolder);
if (!DisplayTimerConflict(timer)) { if (!DisplayTimerConflict(timer)) {
activeMenu = new cRecMenuConfirmTimer(event); if (config.timerMessage) {
activeMenu->Display(); delete activeMenu;
activeMenu = new cRecMenuConfirmTimer(event);
activeMenu->Display();
} else {
Close();
state = osEnd;
}
} }
break; } break; }
case rmsInstantRecordFolder: case rmsInstantRecordFolder:
@@ -175,24 +183,49 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
activeMenu = new cRecMenuAskFolder(event, rmsInstantRecord); activeMenu = new cRecMenuAskFolder(event, rmsInstantRecord);
activeMenu->Display(); activeMenu->Display();
break; break;
case rmsOnOffTimer: {
//caller: main menu
//De/Activate timer for active event
recManager->OnOffTimer(event);
if (config.timerMessage) {
delete activeMenu;
activeMenu = new cRecMenuConfirmTimer(event, true);
activeMenu->Display();
} else {
Close();
state = osEnd;
}
break; }
case rmsDeleteTimer: { case rmsDeleteTimer: {
//caller: main menu //caller: main menu
//delete timer for active event //delete timer for active event
delete activeMenu;
if (recManager->IsRecorded(event)) { if (recManager->IsRecorded(event)) {
delete activeMenu;
activeMenu = new cRecMenuAskDeleteTimer(event); activeMenu = new cRecMenuAskDeleteTimer(event);
activeMenu->Display();
} else { } else {
recManager->DeleteTimer(event); recManager->DeleteTimer(event);
activeMenu = new cRecMenuConfirmDeleteTimer(event); if (config.timerMessage) {
delete activeMenu;
activeMenu = new cRecMenuConfirmDeleteTimer(event);
activeMenu->Display();
} else {
Close();
state = osEnd;
}
} }
activeMenu->Display();
break; } break; }
case rmsDeleteTimerConfirmation: { case rmsDeleteTimerConfirmation: {
//delete running timer for active event //delete running timer for active event
recManager->DeleteTimer(event); recManager->DeleteTimer(event);
delete activeMenu; if (config.timerMessage) {
activeMenu = new cRecMenuConfirmDeleteTimer(event); delete activeMenu;
activeMenu->Display(); activeMenu = new cRecMenuConfirmDeleteTimer(event);
activeMenu->Display();
} else {
Close();
state = osEnd;
}
break; } break; }
case rmsEditTimer: { case rmsEditTimer: {
//edit timer for active event //edit timer for active event
@@ -206,7 +239,7 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
case rmsSaveTimer: { case rmsSaveTimer: {
//caller: cRecMenuEditTimer //caller: cRecMenuEditTimer
//save timer for active event //save timer for active event
cTimer timerModified; cTimer *timerModified;
const cTimer *originalTimer; const cTimer *originalTimer;
if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) { if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) {
timerModified = menu->GetTimer(); timerModified = menu->GetTimer();
@@ -219,9 +252,14 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
case rmsIgnoreTimerConflict: case rmsIgnoreTimerConflict:
//caller: cRecMenuTimerConflict //caller: cRecMenuTimerConflict
//Confirming created Timer //Confirming created Timer
delete activeMenu; if (config.timerMessage) {
activeMenu = new cRecMenuConfirmTimer(event); delete activeMenu;
activeMenu->Display(); activeMenu = new cRecMenuConfirmTimer(event);
activeMenu->Display();
} else {
Close();
state = osEnd;
}
break; break;
case rmsTimerConflictShowInfo: { case rmsTimerConflictShowInfo: {
//caller: cRecMenuTimerConflict //caller: cRecMenuTimerConflict
@@ -229,12 +267,18 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) { if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) {
timerIndex = menu->GetTimerConflictIndex(); timerIndex = menu->GetTimerConflictIndex();
} else break; } else break;
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); const cTimers* timers;
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex) + 1;
{
LOCK_TIMERS_READ; LOCK_TIMERS_READ;
const cTimer *t = Timers->Get(timerID); timers = Timers;
}
const cTimer *t = timers->GetById(timerID);
#else #else
const cTimer *t = Timers.Get(timerID); int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex);
timers = &Timers;
const cTimer *t = timers->Get(timerID);
#endif #endif
if (t) { if (t) {
const cEvent *ev = t->Event(); const cEvent *ev = t->Event();
@@ -250,21 +294,30 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) { if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) {
timerIndex = menu->GetTimerConflictIndex(); timerIndex = menu->GetTimerConflictIndex();
} else break; } else break;
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex);
const cTimers* timers; const cTimers* timers;
const cEvent *event;
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex) + 1;
{ {
LOCK_TIMERS_READ; LOCK_TIMERS_READ;
timers = Timers; timers = Timers;
} }
event = timers->GetById(timerID)->Event();
#else #else
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex);
timers = &Timers; timers = &Timers;
event = timers->Get(timerID)->Event();
#endif #endif
recManager->DeleteTimer(timers->Get(timerID)->Event()); recManager->DeleteTimer(event);
delete activeMenu;
if (!DisplayTimerConflict(timerID)) { if (!DisplayTimerConflict(timerID)) {
activeMenu = new cRecMenuConfirmTimer(timers->Get(timerID)->Event()); if (config.timerMessage) {
activeMenu->Display(); delete activeMenu;
activeMenu = new cRecMenuConfirmDeleteTimer(event);
activeMenu->Display();
} else {
Close();
state = osEnd;
}
} }
break; } break; }
case rmsEditTimerConflictMenu: { case rmsEditTimerConflictMenu: {
@@ -274,12 +327,18 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) { if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) {
timerIndex = menu->GetTimerConflictIndex(); timerIndex = menu->GetTimerConflictIndex();
} else break; } else break;
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); const cTimers* timers;
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex) + 1;
{
LOCK_TIMERS_READ; LOCK_TIMERS_READ;
const cTimer *timer = Timers->Get(timerID); timers = Timers;
}
const cTimer *timer = timers->GetById(timerID);
#else #else
const cTimer *timer = Timers.Get(timerID); int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex);
timers = &Timers;
const cTimer *timer = timers->Get(timerID);
#endif #endif
if (timer) { if (timer) {
delete activeMenu; delete activeMenu;
@@ -290,17 +349,22 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
case rmsSaveTimerConflictMenu: { case rmsSaveTimerConflictMenu: {
//caller: cRecMenuEditTimer //caller: cRecMenuEditTimer
//save timer from current timer conflict //save timer from current timer conflict
cTimer timerModified; cTimer *timerModified;
const cTimer *originalTimer; const cTimer *originalTimer;
if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) { if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) {
timerModified = menu->GetTimer(); timerModified = menu->GetTimer();
originalTimer = menu->GetOriginalTimer(); originalTimer = menu->GetOriginalTimer();
} else break; } else break;
recManager->SaveTimer(originalTimer, timerModified); recManager->SaveTimer(originalTimer, timerModified);
delete activeMenu;
if (!DisplayTimerConflict(originalTimer)) { if (!DisplayTimerConflict(originalTimer)) {
activeMenu = new cRecMenuConfirmTimer(originalTimer->Event(), true); if (config.timerMessage) {
activeMenu->Display(); delete activeMenu;
activeMenu = new cRecMenuConfirmTimer(originalTimer->Event(), true);
activeMenu->Display();
} else {
Close();
state = osEnd;
}
} }
break; } break; }
/*************************************************************************************** /***************************************************************************************
@@ -648,7 +712,7 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
} else break; } else break;
timerConflicts->SetCurrentConflict(timerConflict); timerConflicts->SetCurrentConflict(timerConflict);
delete activeMenu; delete activeMenu;
activeMenu = new cRecMenuTimerConflict(timerConflicts->GetCurrentConflict()); activeMenu = new cRecMenuTimerConflict(timerConflicts->GetCurrentConflict(), rmsTimerConflicts);
activeMenu->Display(); activeMenu->Display();
break; } break; }
case rmsSearchRerunsTimerConflictMenu: { case rmsSearchRerunsTimerConflictMenu: {
@@ -660,12 +724,18 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) { if (cRecMenuTimerConflict *menu = dynamic_cast<cRecMenuTimerConflict*>(activeMenu)) {
timerConflict = menu->GetTimerConflictIndex(); timerConflict = menu->GetTimerConflictIndex();
} else break; } else break;
int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict); const cTimers* timers;
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict) + 1;
{
LOCK_TIMERS_READ; LOCK_TIMERS_READ;
const cTimer *timer = Timers->Get(timerID); timers = Timers;
}
const cTimer *timer = timers->GetById(timerID);
#else #else
cTimer *timer = Timers.Get(timerID); int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict);
timers = &Timers;
const cTimer *timer = timers->Get(timerID);
#endif #endif
if (timer) { if (timer) {
const cEvent *event = timer->Event(); const cEvent *event = timer->Event();
@@ -707,12 +777,16 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
originalConflictIndex = menu->GetTimerConflictIndex(); originalConflictIndex = menu->GetTimerConflictIndex();
} else break; } else break;
int originalTimerID = timerConflicts->GetCurrentConflictTimerID(originalConflictIndex); int originalTimerID = timerConflicts->GetCurrentConflictTimerID(originalConflictIndex);
const cTimers* timers;
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
{
LOCK_TIMERS_READ; LOCK_TIMERS_READ;
const cTimer *timerOriginal = Timers->Get(originalTimerID); timers = Timers;
}
#else #else
cTimer *timerOriginal = Timers.Get(originalTimerID); timers = &Timers;
#endif #endif
const cTimer *timerOriginal = timers->Get(originalTimerID);
if (replace && timerOriginal) { if (replace && timerOriginal) {
recManager->DeleteTimer(timerOriginal->Event()); recManager->DeleteTimer(timerOriginal->Event());
recManager->createTimer(replace); recManager->createTimer(replace);
@@ -749,7 +823,7 @@ eOSState cRecMenuView::StateMachine(eRecMenuState nextState) {
} }
break;} break;}
case rmsTimelineTimerSave: { case rmsTimelineTimerSave: {
cTimer timerModified; cTimer *timerModified;
const cTimer *originalTimer; const cTimer *originalTimer;
if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) { if (cRecMenuEditTimer *menu = dynamic_cast<cRecMenuEditTimer*>(activeMenu)) {
timerModified = menu->GetTimer(); timerModified = menu->GetTimer();

12
setup.c
View File

@@ -108,6 +108,8 @@ void cTvguideSetup::Store(void) {
SetupStore("footerHeightPercent", config.footerHeightPercent); SetupStore("footerHeightPercent", config.footerHeightPercent);
SetupStore("instRecFolderMode", config.instRecFolderMode); SetupStore("instRecFolderMode", config.instRecFolderMode);
SetupStore("instRecFixedFolder", config.instRecFixedFolder.c_str()); SetupStore("instRecFixedFolder", config.instRecFixedFolder.c_str());
SetupStore("addSubtitleToTimer", config.addSubtitleToTimer);
SetupStore("timerMessage", config.timerMessage);
SetupStore("favWhatsOnNow", config.favWhatsOnNow); SetupStore("favWhatsOnNow", config.favWhatsOnNow);
SetupStore("favWhatsOnNext", config.favWhatsOnNext); SetupStore("favWhatsOnNext", config.favWhatsOnNext);
SetupStore("favUseTime1", config.favUseTime1); SetupStore("favUseTime1", config.favUseTime1);
@@ -410,6 +412,9 @@ 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[0] = (tr("switch"));
switchModeItems[1] = (tr("announce only")); switchModeItems[1] = (tr("announce only"));
switchModeItems[2] = (tr("ask for switch")); switchModeItems[2] = (tr("ask for switch"));
@@ -420,13 +425,16 @@ void cMenuSetupFavorites::Set(void) {
int currentItem = Current(); int currentItem = Current();
Clear(); Clear();
Add(new cMenuEditStraItem(tr("Folder for instant Recordings"), &tmpConfig->instRecFolderMode, 3, recFolderMode)); Add(new cOsdItem(tr("Instant recording:"), osUnknown, false));
Add(new cMenuEditStraItem(tr("Folder for instant Recordings"), &tmpConfig->instRecFolderMode, 3, recFolderMode));
if (tmpConfig->instRecFolderMode == eFolderFixed) { 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"), &tmpConfig->useRemoteTimers)); Add(new cMenuEditBoolItem(tr("Use Remotetimers"), &tmpConfig->useRemoteTimers));
Add(new cMenuEditBoolItem(tr("Show timer confirmation messages"), &tmpConfig->timerMessage));
Add(new cOsdItem(tr("Favorites:"), osUnknown, false));
Add(new cMenuEditBoolItem(tr("Limit channels in favorites"), &tmpConfig->favLimitChannels)); Add(new cMenuEditBoolItem(tr("Limit channels in favorites"), &tmpConfig->favLimitChannels));
if (tmpConfig->favLimitChannels) { if (tmpConfig->favLimitChannels) {
Add(new cMenuEditChanItem(tr("Start Channel"), &tmpConfig->favStartChannel)); Add(new cMenuEditChanItem(tr("Start Channel"), &tmpConfig->favStartChannel));

View File

@@ -70,6 +70,7 @@ 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]; const char * switchModeItems[3];
char fixedFolder[256]; char fixedFolder[256];
void Set(void); void Set(void);

View File

@@ -16,12 +16,11 @@ cTVGuideTimerConflict::cTVGuideTimerConflict(void) {
} }
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;
} }
@@ -44,13 +43,12 @@ cTVGuideTimerConflicts::~cTVGuideTimerConflicts(void) {
} }
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#1 int editTimer(cTimer *timer, bool active, int prio, int start, int stop); '152|30|50#152#45' is the description of the first conflicting timer. Here:
52#45' is the description of the first conflicting timer. Here:
'152' is VDR's timer id of this timer as returned from VDR's LSTT command '152' is VDR's timer id of this timer as returned from VDR's LSTT command
'30' is the percentage of recording that would be done (0...100) '30' is the percentage of recording that would be done (0...100)
'50#152#45' is the list of concurrent timers at this conflict '50#152#45' is the list of concurrent timers at this conflict
@@ -86,11 +84,13 @@ void cTVGuideTimerConflicts::CalculateConflicts(void) {
#if VDRVERSNUM >= 20301 #if VDRVERSNUM >= 20301
LOCK_TIMERS_READ; LOCK_TIMERS_READ;
const cTimers* timers = Timers; const cTimers* timers = Timers;
for (int j=0; j < numTimers; j++) {
const cTimer *timer = timers->GetById(conflicts[i]->timerIDs[j] + 1);
#else #else
const cTimers* timers = &Timers; const cTimers* timers = &Timers;
#endif
for (int j=0; j < numTimers; j++) { for (int j=0; j < numTimers; j++) {
const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]); const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]);
#endif
if (timer) { if (timer) {
if (!unionSet) { if (!unionSet) {
unionSet = new cTimeInterval(timer->StartTime(), timer->StopTime()); unionSet = new cTimeInterval(timer->StartTime(), timer->StopTime());
@@ -109,7 +109,11 @@ void cTVGuideTimerConflicts::CalculateConflicts(void) {
cTimeInterval *intersect = NULL; cTimeInterval *intersect = NULL;
for (int j=0; j < numTimers; j++) { for (int j=0; j < numTimers; j++) {
#if VDRVERSNUM >= 20301
const cTimer *timer = timers->GetById(conflicts[i]->timerIDs[j] + 1);
#else
const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]); const cTimer *timer = timers->Get(conflicts[i]->timerIDs[j]);
#endif
if (timer) { if (timer) {
if (!intersect) { if (!intersect) {
intersect = new cTimeInterval(timer->StartTime(), timer->StopTime()); intersect = new cTimeInterval(timer->StartTime(), timer->StopTime());
@@ -152,7 +156,7 @@ int cTVGuideTimerConflicts::GetCurrentConflictTimerID(int timerIndex) {
int cTVGuideTimerConflicts::GetCorrespondingConflict(int timerID) { int cTVGuideTimerConflicts::GetCorrespondingConflict(int timerID) {
int conflictIndex = -1; int conflictIndex = -1;
if (numConflicts > 0) { if (numConflicts > 0) {
for (int i=0; i<numConflicts; i++) { for (int i = 0; i < numConflicts; i++) {
if (conflicts[i]->timerInvolved(timerID)) { if (conflicts[i]->timerInvolved(timerID)) {
conflictIndex = i; conflictIndex = i;
break; break;
@@ -172,7 +176,7 @@ cTVGuideTimerConflict *cTVGuideTimerConflicts::GetConflict(int conflictIndex) {
std::vector<cTVGuideTimerConflict*> cTVGuideTimerConflicts::GetConflictsBetween(time_t start, time_t stop) { std::vector<cTVGuideTimerConflict*> cTVGuideTimerConflicts::GetConflictsBetween(time_t start, time_t stop) {
std::vector<cTVGuideTimerConflict*> conflictsFound; std::vector<cTVGuideTimerConflict*> conflictsFound;
for (int i=0; i < numConflicts; i++) { for (int i = 0; i < numConflicts; i++) {
if ((conflicts[i]->timeStart > start) && (conflicts[i]->timeStart < stop)|| if ((conflicts[i]->timeStart > start) && (conflicts[i]->timeStart < stop)||
(conflicts[i]->timeStop > start) && (conflicts[i]->timeStop < stop)) (conflicts[i]->timeStop > start) && (conflicts[i]->timeStop < stop))
conflictsFound.push_back(conflicts[i]); conflictsFound.push_back(conflicts[i]);

39
tools.c
View File

@@ -10,7 +10,6 @@
#include <vdr/plugin.h> #include <vdr/plugin.h>
#include <vdr/skins.h> #include <vdr/skins.h>
#include "services/epgsearch.h" #include "services/epgsearch.h"
#include "tools.h" #include "tools.h"
cPlugin *GetScraperPlugin(void) { cPlugin *GetScraperPlugin(void) {
@@ -23,22 +22,47 @@ cPlugin *GetScraperPlugin(void) {
/**************************************************************************************** /****************************************************************************************
* CUTTEXT * CUTTEXT
****************************************************************************************/ ****************************************************************************************/
std::string utf8_substr(const std::string& str, unsigned int start, long unsigned int leng) {
if (leng==0) { return ""; }
unsigned int c, i, ix, q;
long unsigned int min=std::string::npos, max=std::string::npos;
for (q=0, i=0, ix=str.length(); i < ix; i++, q++) {
if (q==start){ min=i; }
if (q<=start+leng || leng==std::string::npos){ max=i; }
c = (unsigned char) str[i];
if (c>=0 && c<=127) i+=0;
else if ((c & 0xE0) == 0xC0) i+=1;
else if ((c & 0xF0) == 0xE0) i+=2;
else if ((c & 0xF8) == 0xF0) i+=3;
//else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8
//else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8
else return "";//invalid utf8
}
if (q<=start+leng || leng==std::string::npos){ max=i; }
if (min==std::string::npos || max==std::string::npos) { return ""; }
return str.substr(min,max-min);
}
std::string CutText(std::string text, int width, const cFont *font) { std::string CutText(std::string text, int width, const cFont *font) {
int actWidth = font->Width(text.c_str()); int actWidth = font->Width(text.c_str());
if (actWidth <= width) { if (actWidth <= width) {
return text.c_str(); return text.c_str();
} else { } else {
int i = std::max((actWidth - width) / font->Size(), 1); int i = std::max(width / font->Size(), 1) - 1;
std::string cuttext, oldtext;
cuttext = utf8_substr(text, 0, i);
do { do {
text = text.substr(0, text.length() - i); oldtext = cuttext;
i++;
cuttext = utf8_substr(text, 0, i);
std::stringstream sstrText; std::stringstream sstrText;
sstrText << text << "...."; sstrText << cuttext << "...";
actWidth = font->Width(sstrText.str().c_str()); actWidth = font->Width(sstrText.str().c_str());
i = 1;
} }
while ((actWidth > width) && (text.length() > 0)); while (actWidth < width);
std::stringstream sstrText2; std::stringstream sstrText2;
sstrText2 << text << "..."; sstrText2 << oldtext << "...";
return sstrText2.str(); return sstrText2.str();
} }
} }
@@ -105,7 +129,6 @@ void ReadRecordingDirectories(std::vector<std::string> *folders, cList<cNestedIt
} }
} }
/**************************************************************************************** /****************************************************************************************
* DrawRoundedCorners * DrawRoundedCorners
****************************************************************************************/ ****************************************************************************************/

View File

@@ -9,6 +9,7 @@
cPlugin *GetScraperPlugin(void); cPlugin *GetScraperPlugin(void);
std::string utf8_substr(const std::string& str, unsigned int start=0, long unsigned int leng=std::string::npos);
std::string CutText(std::string text, int width, const cFont *font); std::string CutText(std::string text, int width, const cFont *font);
std::string StrToLowerCase(std::string str); std::string StrToLowerCase(std::string str);
std::string GetDirectoryFromTimer(std::string file); std::string GetDirectoryFromTimer(std::string file);

View File

@@ -27,7 +27,7 @@
#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.16"; static const char *VERSION = "1.3.4";
static const char *DESCRIPTION = tr("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";

29
view.c
View File

@@ -113,12 +113,18 @@ void cView::DrawHeader(void) {
} }
} }
//Date and Time, Title, Subtitle //Date and Time, Title, Subtitle
int yDateTime = border / 2;
int yTitle = (headerHeight - fontHeaderLarge->Height()) / 2;
int ySubtitle = headerHeight - fontHeader->Height() - border / 3;
int textWidthMax = headerWidth - xText - border / 2; int textWidthMax = headerWidth - xText - border / 2;
wrapper.Set(title.c_str(), fontHeaderLarge, textWidthMax);
int lineHeight = fontHeaderLarge->Height();
int textLines = wrapper.Lines();
int yDateTime = border / 2;
int yTitle = (headerHeight - textLines * lineHeight) / 2;
int ySubtitle = headerHeight - fontHeader->Height() - border / 3;
pixmapHeader->DrawText(cPoint(xText, yDateTime), CutText(dateTime, textWidthMax, fontHeader).c_str(), theme.Color(clrFont), theme.Color(clrStatusHeader), fontHeader); pixmapHeader->DrawText(cPoint(xText, yDateTime), CutText(dateTime, textWidthMax, fontHeader).c_str(), theme.Color(clrFont), theme.Color(clrStatusHeader), fontHeader);
pixmapHeader->DrawText(cPoint(xText, yTitle), CutText(title, textWidthMax, fontHeaderLarge).c_str(), theme.Color(clrFont), theme.Color(clrStatusHeader), fontHeaderLarge); for (int i = 0; i < textLines; i++) {
pixmapHeader->DrawText(cPoint(xText, yTitle + i * lineHeight), wrapper.GetLine(i), theme.Color(clrFont), theme.Color(clrStatusHeader), fontHeaderLarge);
}
pixmapHeader->DrawText(cPoint(xText, ySubtitle), CutText(subTitle, textWidthMax, fontHeader).c_str(), theme.Color(clrFont), theme.Color(clrStatusHeader), fontHeader); pixmapHeader->DrawText(cPoint(xText, ySubtitle), CutText(subTitle, textWidthMax, fontHeader).c_str(), theme.Color(clrFont), theme.Color(clrStatusHeader), fontHeader);
//REC Icon //REC Icon
eTimerMatch timerMatch = tmNone; eTimerMatch timerMatch = tmNone;
@@ -216,7 +222,7 @@ void cView::DrawContent(std::string *text) {
wText.Set(text->c_str(), font, width - 2 * border); wText.Set(text->c_str(), font, width - 2 * border);
int lineHeight = font->Height(); int lineHeight = font->Height();
int textLines = wText.Lines(); int textLines = wText.Lines();
int textHeight = lineHeight * textLines + 2*border; int textHeight = lineHeight * textLines + 2 * border;
int yText = border; int yText = border;
CreateContent(textHeight); CreateContent(textHeight);
for (int i=0; i < textLines; i++) { for (int i=0; i < textLines; i++) {
@@ -246,14 +252,14 @@ void cView::DrawFloatingContent(std::string *infoText, cTvMedia *img, cTvMedia *
int lineHeight = font->Height(); int lineHeight = font->Height();
int textLinesTall = wTextTall.Lines(); int textLinesTall = wTextTall.Lines();
int textLinesFull = wTextFull.Lines(); int textLinesFull = wTextFull.Lines();
int textHeight = lineHeight * (textLinesTall + textLinesFull) + 2*border; int textHeight = lineHeight * (textLinesTall + textLinesFull) + 2 * border;
int yText = border; int yText = border;
CreateContent(max(textHeight, imgHeight + 2*border)); CreateContent(std::max(textHeight, imgHeight + 2 * border));
for (int i=0; i < textLinesTall; i++) { for (int i = 0; i < textLinesTall; i++) {
pixmapContent->DrawText(cPoint(border, yText), wTextTall.GetLine(i), theme.Color(clrFont), clrTransparent, font); pixmapContent->DrawText(cPoint(border, yText), wTextTall.GetLine(i), theme.Color(clrFont), clrTransparent, font);
yText += lineHeight; yText += lineHeight;
} }
for (int i=0; i < textLinesFull; i++) { for (int i = 0; i < textLinesFull; i++) {
pixmapContent->DrawText(cPoint(border, yText), wTextFull.GetLine(i), theme.Color(clrFont), clrTransparent, font); pixmapContent->DrawText(cPoint(border, yText), wTextFull.GetLine(i), theme.Color(clrFont), clrTransparent, font);
yText += lineHeight; yText += lineHeight;
} }
@@ -268,13 +274,13 @@ void cView::DrawFloatingContent(std::string *infoText, cTvMedia *img, cTvMedia *
osdManager.flush(); osdManager.flush();
if (imgLoader.LoadPoster(img2->path.c_str(), imgWidth2, imgHeight2)) { if (imgLoader.LoadPoster(img2->path.c_str(), imgWidth2, imgHeight2)) {
if (Running() && pixmapContent) if (Running() && pixmapContent)
pixmapContent->DrawImage(cPoint(width - imgWidth2 - border, imgHeight + 2*border), imgLoader.GetImage()); pixmapContent->DrawImage(cPoint(width - imgWidth2 - border, imgHeight + 2 * border), imgLoader.GetImage());
} }
} }
void cView::CreateFloatingTextWrapper(cTextWrapper *twNarrow, cTextWrapper *twFull, std::string *text, int widthImg, int heightImg) { void cView::CreateFloatingTextWrapper(cTextWrapper *twNarrow, cTextWrapper *twFull, std::string *text, int widthImg, int heightImg) {
int lineHeight = font->Height(); int lineHeight = font->Height();
int linesNarrow = (heightImg + 2*border)/ lineHeight; int linesNarrow = (heightImg + 2 * border)/ lineHeight;
int linesDrawn = 0; int linesDrawn = 0;
int y = 0; int y = 0;
int widthNarrow = width - 3 * border - widthImg; int widthNarrow = width - 3 * border - widthImg;
@@ -481,7 +487,6 @@ bool cView::KeyUp(void) {
if (!scrollable) if (!scrollable)
return false; return false;
int aktHeight = pixmapContent->DrawPort().Point().Y(); int aktHeight = pixmapContent->DrawPort().Point().Y();
// int lineHeight = font->Height();
if (aktHeight >= 0) { if (aktHeight >= 0) {
return false; return false;
} }

1
view.h
View File

@@ -51,6 +51,7 @@ protected:
int contentHeight; int contentHeight;
int tabHeight; int tabHeight;
int scrollbarWidth; int scrollbarWidth;
cTextWrapper wrapper;
std::vector<std::string> tabs; std::vector<std::string> tabs;
std::string title; std::string title;
std::string subTitle; std::string subTitle;