mirror of
https://projects.vdr-developer.org/git/vdr-plugin-tvguide.git
synced 2023-10-05 15:01:48 +02:00
Favorites menu with EPG Search favorite timers with blue key
This commit is contained in:
parent
d0651a4a50
commit
a8b7c95434
1
HISTORY
1
HISTORY
@ -105,3 +105,4 @@ Version 1.1.0
|
|||||||
- completely refactored recording menu
|
- completely refactored recording menu
|
||||||
- restructured detailöed EPG View that tv frame and status buttons
|
- restructured detailöed EPG View that tv frame and status buttons
|
||||||
are displayed
|
are displayed
|
||||||
|
- Favorites menu with EPG Search favorite timers with blue key
|
||||||
|
2
config.c
2
config.c
@ -28,7 +28,7 @@ cTvguideConfig::cTvguideConfig() {
|
|||||||
hugeStepHours = 24;
|
hugeStepHours = 24;
|
||||||
channelJumpMode = eNumJump;
|
channelJumpMode = eNumJump;
|
||||||
jumpChannels = 0;
|
jumpChannels = 0;
|
||||||
blueKeyMode = 0;
|
blueKeyMode = eBlueKeySwitch;
|
||||||
closeOnSwitch = 1;
|
closeOnSwitch = 1;
|
||||||
numkeyMode = 0;
|
numkeyMode = 0;
|
||||||
useRemoteTimers = 0;
|
useRemoteTimers = 0;
|
||||||
|
6
config.h
6
config.h
@ -30,6 +30,12 @@ enum {
|
|||||||
eStyleFlat
|
eStyleFlat
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
eBlueKeySwitch,
|
||||||
|
eBlueKeyEPG,
|
||||||
|
eBlueKeyFavorites
|
||||||
|
};
|
||||||
|
|
||||||
class cTvguideConfig {
|
class cTvguideConfig {
|
||||||
private:
|
private:
|
||||||
public:
|
public:
|
||||||
|
21
footer.c
21
footer.c
@ -45,12 +45,21 @@ void cFooter::drawYellowButton(const char *text) {
|
|||||||
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() {
|
void cFooter::drawBlueButton(bool detailedEPG) {
|
||||||
cString text;
|
cString text;
|
||||||
if (tvguideConfig.blueKeyMode == 0)
|
if (tvguideConfig.blueKeyMode == eBlueKeySwitch)
|
||||||
text = tr("Switch to Channel");
|
text = tr("Switch to Channel");
|
||||||
else if (tvguideConfig.blueKeyMode == 1)
|
else if (tvguideConfig.blueKeyMode == eBlueKeyEPG) {
|
||||||
text = tr("Detailed EPG");
|
if (!detailedEPG)
|
||||||
|
text = tr("Detailed EPG");
|
||||||
|
else
|
||||||
|
text = tr("Close detailed EPG");
|
||||||
|
} else if (tvguideConfig.blueKeyMode == eBlueKeyFavorites) {
|
||||||
|
if (!detailedEPG)
|
||||||
|
text = tr("Favorites");
|
||||||
|
else
|
||||||
|
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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,6 +77,10 @@ void cFooter::UpdateGroupButtons(const cChannel *channel, bool force) {
|
|||||||
void cFooter::SetDetailedViewMode(void) {
|
void cFooter::SetDetailedViewMode(void) {
|
||||||
ClearButton(positionButtons[1]);
|
ClearButton(positionButtons[1]);
|
||||||
ClearButton(positionButtons[2]);
|
ClearButton(positionButtons[2]);
|
||||||
|
if (tvguideConfig.blueKeyMode != eBlueKeySwitch) {
|
||||||
|
ClearButton(positionButtons[3]);
|
||||||
|
drawBlueButton(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cFooter::LeaveDetailedViewMode(const cChannel *channel) {
|
void cFooter::LeaveDetailedViewMode(const cChannel *channel) {
|
||||||
|
2
footer.h
2
footer.h
@ -24,7 +24,7 @@ public:
|
|||||||
void drawGreenButton(const char *text);
|
void drawGreenButton(const char *text);
|
||||||
void drawYellowButton();
|
void drawYellowButton();
|
||||||
void drawYellowButton(const char *text);
|
void drawYellowButton(const char *text);
|
||||||
void drawBlueButton();
|
void drawBlueButton(bool detailedEPG = false);
|
||||||
void UpdateGroupButtons(const cChannel *channel, bool force = false);
|
void UpdateGroupButtons(const cChannel *channel, bool force = false);
|
||||||
void SetDetailedViewMode(void);
|
void SetDetailedViewMode(void);
|
||||||
void LeaveDetailedViewMode(const cChannel *channel);
|
void LeaveDetailedViewMode(const cChannel *channel);
|
||||||
|
17
po/ca_ES.po
17
po/ca_ES.po
@ -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-01-12 16:23+0100\n"
|
"POT-Creation-Date: 2014-01-14 17:00+0100\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"
|
||||||
@ -45,6 +45,12 @@ msgstr "Canvia al canal"
|
|||||||
msgid "Detailed EPG"
|
msgid "Detailed EPG"
|
||||||
msgstr "EPG Detallat"
|
msgstr "EPG Detallat"
|
||||||
|
|
||||||
|
msgid "Close detailed EPG"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "images"
|
msgid "images"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -327,6 +333,9 @@ msgstr ""
|
|||||||
msgid "Avoid Repeats"
|
msgid "Avoid Repeats"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Use in Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hide advanced Options"
|
msgid "Hide advanced Options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -474,6 +483,9 @@ msgstr "per"
|
|||||||
msgid "No recordings found for"
|
msgid "No recordings found for"
|
||||||
msgstr "No s'han trobat gravacions per"
|
msgstr "No s'han trobat gravacions per"
|
||||||
|
|
||||||
|
msgid "No Favorites available"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "whole term must appear"
|
msgid "whole term must appear"
|
||||||
msgstr "expressió completa"
|
msgstr "expressió completa"
|
||||||
|
|
||||||
@ -513,6 +525,9 @@ msgstr "Blau: Canvi de canal, OK: EPG detallat"
|
|||||||
msgid "Blue: Detailed EPG, Ok: Channel Switch"
|
msgid "Blue: Detailed EPG, Ok: Channel Switch"
|
||||||
msgstr "Blau: EPG detallat, OK: Canvi de canal"
|
msgstr "Blau: EPG detallat, OK: Canvi de canal"
|
||||||
|
|
||||||
|
msgid "Blue: Favorites / Switch, Ok: Detailed EPG"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Timely Jump"
|
msgid "Timely Jump"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
17
po/de_DE.po
17
po/de_DE.po
@ -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-01-12 16:23+0100\n"
|
"POT-Creation-Date: 2014-01-14 17:00+0100\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"
|
||||||
@ -42,6 +42,12 @@ msgstr "Umschalten"
|
|||||||
msgid "Detailed EPG"
|
msgid "Detailed EPG"
|
||||||
msgstr "Detailiertes EPG"
|
msgstr "Detailiertes EPG"
|
||||||
|
|
||||||
|
msgid "Close detailed EPG"
|
||||||
|
msgstr "Det. EPG schließen"
|
||||||
|
|
||||||
|
msgid "Favorites"
|
||||||
|
msgstr "Favoriten"
|
||||||
|
|
||||||
msgid "images"
|
msgid "images"
|
||||||
msgstr "Bilder"
|
msgstr "Bilder"
|
||||||
|
|
||||||
@ -324,6 +330,9 @@ msgstr "VPS benutzen"
|
|||||||
msgid "Avoid Repeats"
|
msgid "Avoid Repeats"
|
||||||
msgstr "Wiederholungen vermeiden"
|
msgstr "Wiederholungen vermeiden"
|
||||||
|
|
||||||
|
msgid "Use in Favorites"
|
||||||
|
msgstr "Als Favorit benutzen"
|
||||||
|
|
||||||
msgid "Hide advanced Options"
|
msgid "Hide advanced Options"
|
||||||
msgstr "Erweiterte Optionen ausblenden"
|
msgstr "Erweiterte Optionen ausblenden"
|
||||||
|
|
||||||
@ -471,6 +480,9 @@ msgstr "für"
|
|||||||
msgid "No recordings found for"
|
msgid "No recordings found for"
|
||||||
msgstr "Keine Aufnahmen gefunden für"
|
msgstr "Keine Aufnahmen gefunden für"
|
||||||
|
|
||||||
|
msgid "No Favorites available"
|
||||||
|
msgstr "Keine Favoriten verfügbar"
|
||||||
|
|
||||||
msgid "whole term must appear"
|
msgid "whole term must appear"
|
||||||
msgstr "vollständiger Ausdruck"
|
msgstr "vollständiger Ausdruck"
|
||||||
|
|
||||||
@ -510,6 +522,9 @@ msgstr "Blau: Umschalten, OK: Detailiertes EPG"
|
|||||||
msgid "Blue: Detailed EPG, Ok: Channel Switch"
|
msgid "Blue: Detailed EPG, Ok: Channel Switch"
|
||||||
msgstr "Blau: Detailiertes EPG, OK: Umschalten"
|
msgstr "Blau: Detailiertes EPG, OK: Umschalten"
|
||||||
|
|
||||||
|
msgid "Blue: Favorites / Switch, Ok: Detailed EPG"
|
||||||
|
msgstr "Blau: Favoriten / Umschalten, OK: Det. EPG"
|
||||||
|
|
||||||
msgid "Timely Jump"
|
msgid "Timely Jump"
|
||||||
msgstr "Zeitsprung"
|
msgstr "Zeitsprung"
|
||||||
|
|
||||||
|
17
po/ru_RU.po
17
po/ru_RU.po
@ -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-01-12 16:23+0100\n"
|
"POT-Creation-Date: 2014-01-14 17:00+0100\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"
|
||||||
@ -42,6 +42,12 @@ msgstr "Переключиться"
|
|||||||
msgid "Detailed EPG"
|
msgid "Detailed EPG"
|
||||||
msgstr "Подробный EPG"
|
msgstr "Подробный EPG"
|
||||||
|
|
||||||
|
msgid "Close detailed EPG"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "images"
|
msgid "images"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -324,6 +330,9 @@ msgstr ""
|
|||||||
msgid "Avoid Repeats"
|
msgid "Avoid Repeats"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Use in Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hide advanced Options"
|
msgid "Hide advanced Options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -471,6 +480,9 @@ msgstr "для"
|
|||||||
msgid "No recordings found for"
|
msgid "No recordings found for"
|
||||||
msgstr "Не найдено записей:"
|
msgstr "Не найдено записей:"
|
||||||
|
|
||||||
|
msgid "No Favorites available"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "whole term must appear"
|
msgid "whole term must appear"
|
||||||
msgstr "фраза"
|
msgstr "фраза"
|
||||||
|
|
||||||
@ -510,6 +522,9 @@ msgstr "Синяя: Переключить канал, OK: Подробный EP
|
|||||||
msgid "Blue: Detailed EPG, Ok: Channel Switch"
|
msgid "Blue: Detailed EPG, Ok: Channel Switch"
|
||||||
msgstr "Синяя: Подробный EPG, OK: Переключить канал"
|
msgstr "Синяя: Подробный EPG, OK: Переключить канал"
|
||||||
|
|
||||||
|
msgid "Blue: Favorites / Switch, Ok: Detailed EPG"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Timely Jump"
|
msgid "Timely Jump"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
17
po/sk_SK.po
17
po/sk_SK.po
@ -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-01-12 16:23+0100\n"
|
"POT-Creation-Date: 2014-01-14 17:00+0100\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"
|
||||||
@ -42,6 +42,12 @@ msgstr "Prepn
|
|||||||
msgid "Detailed EPG"
|
msgid "Detailed EPG"
|
||||||
msgstr "Podrobné EPG"
|
msgstr "Podrobné EPG"
|
||||||
|
|
||||||
|
msgid "Close detailed EPG"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "images"
|
msgid "images"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -324,6 +330,9 @@ msgstr ""
|
|||||||
msgid "Avoid Repeats"
|
msgid "Avoid Repeats"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Use in Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hide advanced Options"
|
msgid "Hide advanced Options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -471,6 +480,9 @@ msgstr "pre"
|
|||||||
msgid "No recordings found for"
|
msgid "No recordings found for"
|
||||||
msgstr "Nena¹li sa nahrávky s názvom "
|
msgstr "Nena¹li sa nahrávky s názvom "
|
||||||
|
|
||||||
|
msgid "No Favorites available"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "whole term must appear"
|
msgid "whole term must appear"
|
||||||
msgstr "kompletný výraz"
|
msgstr "kompletný výraz"
|
||||||
|
|
||||||
@ -510,6 +522,9 @@ msgstr "Modr
|
|||||||
msgid "Blue: Detailed EPG, Ok: Channel Switch"
|
msgid "Blue: Detailed EPG, Ok: Channel Switch"
|
||||||
msgstr "Modré: podrobné EPG, OK: prepnú» kanál"
|
msgstr "Modré: podrobné EPG, OK: prepnú» kanál"
|
||||||
|
|
||||||
|
msgid "Blue: Favorites / Switch, Ok: Detailed EPG"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Timely Jump"
|
msgid "Timely Jump"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
20
recmanager.c
20
recmanager.c
@ -574,3 +574,23 @@ const cEvent **cRecManager::LoadReruns(const cEvent *event, int &numResults) {
|
|||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cRecManager::GetFavorites(std::vector<cTVGuideSearchTimer> *favorites) {
|
||||||
|
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> searchTimerList;
|
||||||
|
searchTimerList = epgSearch->handler->SearchTimerList();
|
||||||
|
for(std::list<std::string>::iterator it = searchTimerList.begin(); it != searchTimerList.end(); it++) {
|
||||||
|
cTVGuideSearchTimer timer;
|
||||||
|
timer.SetEPGSearchString(it->c_str());
|
||||||
|
if (timer.Parse()) {
|
||||||
|
if (timer.UseInFavorites())
|
||||||
|
favorites->push_back(timer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -54,6 +54,7 @@ public:
|
|||||||
void DeleteSwitchTimer(const cEvent *event);
|
void DeleteSwitchTimer(const cEvent *event);
|
||||||
cRecording **SearchForRecordings(std::string searchString, int &numResults);
|
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);
|
||||||
virtual ~cRecManager (void);
|
virtual ~cRecManager (void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2658,3 +2658,83 @@ eRecMenuState cRecMenuItemSearchTimer::ProcessKey(eKeys Key) {
|
|||||||
}
|
}
|
||||||
return rmsNotConsumed;
|
return rmsNotConsumed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- cRecMenuItemFavorite -------------------------------------------------------
|
||||||
|
cRecMenuItemFavorite::cRecMenuItemFavorite(cTVGuideSearchTimer favorite,
|
||||||
|
eRecMenuState action1,
|
||||||
|
bool active) {
|
||||||
|
this->favorite = favorite;
|
||||||
|
this->action = action1;
|
||||||
|
pixmapText = NULL;
|
||||||
|
pixmapIcons = NULL;
|
||||||
|
selectable = true;
|
||||||
|
this->active = active;
|
||||||
|
height = 2 * font->Height();;
|
||||||
|
}
|
||||||
|
|
||||||
|
cRecMenuItemFavorite::~cRecMenuItemFavorite(void) {
|
||||||
|
if (pixmapText)
|
||||||
|
osdManager.releasePixmap(pixmapText);
|
||||||
|
if (pixmapIcons)
|
||||||
|
osdManager.releasePixmap(pixmapIcons);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cRecMenuItemFavorite::SetPixmaps(void) {
|
||||||
|
if (!pixmap) {
|
||||||
|
pixmap = osdManager.requestPixmap(4, cRect(x, y, width, height));
|
||||||
|
pixmapText = osdManager.requestPixmap(5, cRect(x, y, width, height));
|
||||||
|
pixmapIcons = osdManager.requestPixmap(6, cRect(x, y, width, height));
|
||||||
|
} else {
|
||||||
|
pixmap->SetViewPort(cRect(x, y, width, height));
|
||||||
|
pixmapText->SetViewPort(cRect(x, y, width, height));
|
||||||
|
pixmapIcons->SetViewPort(cRect(x, y, width, height));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cRecMenuItemFavorite::Draw(void) {
|
||||||
|
int textX = DrawIcons();
|
||||||
|
if (!drawn) {
|
||||||
|
pixmapText->Fill(clrTransparent);
|
||||||
|
textX += 20;
|
||||||
|
cString label = cString::sprintf("\"%s\"", favorite.SearchString().c_str());
|
||||||
|
pixmapText->DrawText(cPoint(textX, (height - fontLarge->Height())/2), *label, colorText, clrTransparent, fontLarge);
|
||||||
|
drawn = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cRecMenuItemFavorite::Hide(void) {
|
||||||
|
if (pixmap) pixmap->SetLayer(-1);
|
||||||
|
if (pixmapText) pixmapText->SetLayer(-1);
|
||||||
|
if (pixmapIcons) pixmapIcons->SetLayer(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cRecMenuItemFavorite::Show(void) {
|
||||||
|
if (pixmap) pixmap->SetLayer(4);
|
||||||
|
if (pixmapText) pixmapText->SetLayer(5);
|
||||||
|
if (pixmapIcons) pixmapIcons->SetLayer(6);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cRecMenuItemFavorite::DrawIcons(void) {
|
||||||
|
pixmapIcons->Fill(clrTransparent);
|
||||||
|
int iconsX = 10;
|
||||||
|
int iconSize = height / 2;
|
||||||
|
int iconY = (height - iconSize) / 2;
|
||||||
|
std::string iconSearch;
|
||||||
|
iconSearch = active ? "search_active" : "search_inactive" ;
|
||||||
|
cImage *imgSearch = imgCache.GetIcon(iconSearch, iconSize, iconSize);
|
||||||
|
if (imgSearch) {
|
||||||
|
pixmapIcons->DrawImage(cPoint(iconsX, iconY), *imgSearch);
|
||||||
|
iconsX += iconSize + 10;
|
||||||
|
}
|
||||||
|
return iconsX;
|
||||||
|
}
|
||||||
|
|
||||||
|
eRecMenuState cRecMenuItemFavorite::ProcessKey(eKeys Key) {
|
||||||
|
switch (Key & ~k_Repeat) {
|
||||||
|
case kOk:
|
||||||
|
return action;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return rmsNotConsumed;
|
||||||
|
}
|
@ -605,4 +605,25 @@ public:
|
|||||||
eRecMenuState ProcessKey(eKeys Key);
|
eRecMenuState ProcessKey(eKeys Key);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// --- cRecMenuItemFavorite -------------------------------------------------------
|
||||||
|
class cRecMenuItemFavorite : public cRecMenuItem {
|
||||||
|
private:
|
||||||
|
cTVGuideSearchTimer favorite;
|
||||||
|
eRecMenuState action1;
|
||||||
|
cPixmap *pixmapText;
|
||||||
|
cPixmap *pixmapIcons;
|
||||||
|
int DrawIcons(void);
|
||||||
|
public:
|
||||||
|
cRecMenuItemFavorite(cTVGuideSearchTimer favorite,
|
||||||
|
eRecMenuState action1,
|
||||||
|
bool active);
|
||||||
|
virtual ~cRecMenuItemFavorite(void);
|
||||||
|
void SetPixmaps(void);
|
||||||
|
void Hide(void);
|
||||||
|
void Show(void);
|
||||||
|
void Draw(void);
|
||||||
|
cTVGuideSearchTimer GetFavorite(void) { return favorite; };
|
||||||
|
eRecMenuState ProcessKey(eKeys Key);
|
||||||
|
};
|
||||||
|
|
||||||
#endif //__TVGUIDE_RECMENUITEM_H
|
#endif //__TVGUIDE_RECMENUITEM_H
|
@ -39,6 +39,19 @@ void cRecMenuManager::Start(const cEvent *event) {
|
|||||||
osdManager.flush();
|
osdManager.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cRecMenuManager::StartFavorites(void) {
|
||||||
|
active = true;
|
||||||
|
activeMenuBuffer = NULL;
|
||||||
|
detailViewActive = false;
|
||||||
|
SetBackground();
|
||||||
|
std::vector<cTVGuideSearchTimer> favorites;
|
||||||
|
recManager->GetFavorites(&favorites);
|
||||||
|
activeMenu = new cRecMenuFavorites(favorites);
|
||||||
|
activeMenu->Display();
|
||||||
|
osdManager.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void cRecMenuManager::Close(void) {
|
void cRecMenuManager::Close(void) {
|
||||||
event = NULL;
|
event = NULL;
|
||||||
active = false;
|
active = false;
|
||||||
@ -299,7 +312,7 @@ eOSState cRecMenuManager::StateMachine(eRecMenuState nextState) {
|
|||||||
activeMenu->Display();
|
activeMenu->Display();
|
||||||
break; }
|
break; }
|
||||||
case rmsSearchTimerTest: {
|
case rmsSearchTimerTest: {
|
||||||
//caller: cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplatesCreate, rmsSearchTimers
|
//caller: cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplatesCreate, cRecMenuSearchTimers, cRecMenuFavorites
|
||||||
//show results of currently choosen search timer
|
//show results of currently choosen search timer
|
||||||
cTVGuideSearchTimer searchTimer;
|
cTVGuideSearchTimer searchTimer;
|
||||||
if (cRecMenuSearchTimerEdit *menu = dynamic_cast<cRecMenuSearchTimerEdit*>(activeMenu)) {
|
if (cRecMenuSearchTimerEdit *menu = dynamic_cast<cRecMenuSearchTimerEdit*>(activeMenu)) {
|
||||||
@ -311,6 +324,8 @@ eOSState cRecMenuManager::StateMachine(eRecMenuState nextState) {
|
|||||||
TVGuideEPGSearchTemplate tmpl = menu->GetTemplate();
|
TVGuideEPGSearchTemplate tmpl = menu->GetTemplate();
|
||||||
searchTimer.SetTemplate(tmpl.templValue);
|
searchTimer.SetTemplate(tmpl.templValue);
|
||||||
searchTimer.Parse(true);
|
searchTimer.Parse(true);
|
||||||
|
} else if (cRecMenuFavorites *menu = dynamic_cast<cRecMenuFavorites*>(activeMenu)) {
|
||||||
|
searchTimer = menu->GetFavorite();
|
||||||
} else break;
|
} else break;
|
||||||
int numSearchResults = 0;
|
int numSearchResults = 0;
|
||||||
std::string searchString = searchTimer.BuildSearchString();
|
std::string searchString = searchTimer.BuildSearchString();
|
||||||
|
@ -31,6 +31,7 @@ public:
|
|||||||
void SetFooter(cFooter *footer) { this->footer = footer; };
|
void SetFooter(cFooter *footer) { this->footer = footer; };
|
||||||
bool isActive(void) { return active; };
|
bool isActive(void) { return active; };
|
||||||
void Start(const cEvent *event);
|
void Start(const cEvent *event);
|
||||||
|
void StartFavorites(void);
|
||||||
void Close(void);
|
void Close(void);
|
||||||
eOSState StateMachine(eRecMenuState nextState);
|
eOSState StateMachine(eRecMenuState nextState);
|
||||||
eOSState ProcessKey(eKeys Key);
|
eOSState ProcessKey(eKeys Key);
|
||||||
|
52
recmenus.c
52
recmenus.c
@ -701,6 +701,7 @@ cRecMenuSearchTimerEdit::cRecMenuSearchTimerEdit(cTVGuideSearchTimer searchTimer
|
|||||||
compareTitle = searchTimer.CompareTitle();
|
compareTitle = searchTimer.CompareTitle();
|
||||||
compareSubtitle = searchTimer.CompareSubtitle();
|
compareSubtitle = searchTimer.CompareSubtitle();
|
||||||
compareSummary = searchTimer.CompareSummary();
|
compareSummary = searchTimer.CompareSummary();
|
||||||
|
useInFavorites = searchTimer.UseInFavorites();
|
||||||
|
|
||||||
SetWidthPercent(70);
|
SetWidthPercent(70);
|
||||||
cString infoText;
|
cString infoText;
|
||||||
@ -769,6 +770,7 @@ void cRecMenuSearchTimerEdit::InitMenuItems(void) {
|
|||||||
mainMenuItems.push_back(new cRecMenuItemInt(tr("Time margin for stop in minutes"), marginStop, 0, 30, false, &marginStop, rmsSearchTimerSave));
|
mainMenuItems.push_back(new cRecMenuItemInt(tr("Time margin for stop in minutes"), marginStop, 0, 30, false, &marginStop, rmsSearchTimerSave));
|
||||||
mainMenuItems.push_back(new cRecMenuItemBool(tr("Use VPS"), useVPS, false, false, &useVPS, rmsSearchTimerSave));
|
mainMenuItems.push_back(new cRecMenuItemBool(tr("Use VPS"), useVPS, false, false, &useVPS, rmsSearchTimerSave));
|
||||||
mainMenuItems.push_back(new cRecMenuItemBool(tr("Avoid Repeats"), avoidRepeats, true, false, &avoidRepeats, rmsSearchTimerSave));
|
mainMenuItems.push_back(new cRecMenuItemBool(tr("Avoid Repeats"), avoidRepeats, true, false, &avoidRepeats, rmsSearchTimerSave));
|
||||||
|
mainMenuItems.push_back(new cRecMenuItemBool(tr("Use in Favorites"), useInFavorites, false, false, &useInFavorites, rmsSearchTimerSave));
|
||||||
mainMenuItems.push_back(new cRecMenuItemButton(tr("Hide advanced Options"), rmsSearchTimerEdit, false));
|
mainMenuItems.push_back(new cRecMenuItemButton(tr("Hide advanced Options"), rmsSearchTimerEdit, false));
|
||||||
}
|
}
|
||||||
mainMenuItems.push_back(new cRecMenuItemButton(tr("Display Results for Search Timer"), rmsSearchTimerTest, false));
|
mainMenuItems.push_back(new cRecMenuItemButton(tr("Display Results for Search Timer"), rmsSearchTimerTest, false));
|
||||||
@ -871,6 +873,7 @@ cTVGuideSearchTimer cRecMenuSearchTimerEdit::GetSearchTimer(void) {
|
|||||||
searchTimer.SetCompareSubtitle(compareSubtitle);
|
searchTimer.SetCompareSubtitle(compareSubtitle);
|
||||||
searchTimer.SetCompareSummary(compareSummary);
|
searchTimer.SetCompareSummary(compareSummary);
|
||||||
}
|
}
|
||||||
|
searchTimer.SetUseInFavorites(useInFavorites);
|
||||||
return searchTimer;
|
return searchTimer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1440,3 +1443,52 @@ eRecMenuState cRecMenuTimeline::ProcessKey(eKeys Key) {
|
|||||||
}
|
}
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************************
|
||||||
|
* Favorites
|
||||||
|
******************************************************************************************/
|
||||||
|
|
||||||
|
// --- cRecMenuFavorites ---------------------------------------------------------
|
||||||
|
|
||||||
|
cRecMenuFavorites::cRecMenuFavorites(std::vector<cTVGuideSearchTimer> favorites) {
|
||||||
|
this->favorites = favorites;
|
||||||
|
numFavorites = favorites.size();
|
||||||
|
SetWidthPercent(70);
|
||||||
|
cString header;
|
||||||
|
if (numFavorites > 0) {
|
||||||
|
header = tr("Favorites");
|
||||||
|
} else {
|
||||||
|
header = tr("No Favorites available");
|
||||||
|
}
|
||||||
|
cRecMenuItemInfo *headerItem = new cRecMenuItemInfo(*header, true);
|
||||||
|
headerItem->CalculateHeight(width - 2 * border);
|
||||||
|
SetHeader(headerItem);
|
||||||
|
|
||||||
|
for (int i = 0; i < numFavorites; i++) {
|
||||||
|
AddMenuItemInitial(new cRecMenuItemFavorite(favorites[i], rmsSearchTimerTest, (i==0)?true:false));
|
||||||
|
}
|
||||||
|
|
||||||
|
cRecMenuItem *button = new cRecMenuItemButton(tr("Close"), rmsClose, (numFavorites==0)?true:false);
|
||||||
|
SetFooter(button);
|
||||||
|
CalculateHeight();
|
||||||
|
CreatePixmap();
|
||||||
|
Arrange();
|
||||||
|
}
|
||||||
|
|
||||||
|
cRecMenuFavorites::~cRecMenuFavorites(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
cRecMenuItem *cRecMenuFavorites::GetMenuItem(int number) {
|
||||||
|
if (number > -1 && number < numFavorites)
|
||||||
|
return new cRecMenuItemFavorite(favorites[number], rmsSearchTimerTest, false);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cRecMenuFavorites::GetTotalNumMenuItems(void) {
|
||||||
|
return numFavorites;
|
||||||
|
}
|
||||||
|
|
||||||
|
cTVGuideSearchTimer cRecMenuFavorites::GetFavorite(void) {
|
||||||
|
cRecMenuItemFavorite *activeItem = dynamic_cast<cRecMenuItemFavorite*>(GetActiveMenuItem());
|
||||||
|
return activeItem->GetFavorite();
|
||||||
|
}
|
18
recmenus.h
18
recmenus.h
@ -244,6 +244,7 @@ private:
|
|||||||
bool compareTitle;
|
bool compareTitle;
|
||||||
bool compareSubtitle;
|
bool compareSubtitle;
|
||||||
bool compareSummary;
|
bool compareSummary;
|
||||||
|
bool useInFavorites;
|
||||||
void InitMenuItems(void);
|
void InitMenuItems(void);
|
||||||
void AddSubMenu(std::vector<cRecMenuItem*> *subMenu);
|
void AddSubMenu(std::vector<cRecMenuItem*> *subMenu);
|
||||||
public:
|
public:
|
||||||
@ -458,4 +459,21 @@ public:
|
|||||||
cTimer *GetTimer(void);
|
cTimer *GetTimer(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/******************************************************************************************
|
||||||
|
* Favorites
|
||||||
|
******************************************************************************************/
|
||||||
|
|
||||||
|
// --- cRecMenuFavorites ---------------------------------------------------------
|
||||||
|
class cRecMenuFavorites: public cRecMenu {
|
||||||
|
private:
|
||||||
|
std::vector<cTVGuideSearchTimer> favorites;
|
||||||
|
int numFavorites;
|
||||||
|
public:
|
||||||
|
cRecMenuFavorites(std::vector<cTVGuideSearchTimer> favorites);
|
||||||
|
cRecMenuItem *GetMenuItem(int number);
|
||||||
|
int GetTotalNumMenuItems(void);
|
||||||
|
cTVGuideSearchTimer GetFavorite(void);
|
||||||
|
virtual ~cRecMenuFavorites(void);
|
||||||
|
};
|
||||||
|
|
||||||
#endif //__TVGUIDE_RECMENUS_H
|
#endif //__TVGUIDE_RECMENUS_H
|
@ -95,6 +95,7 @@ public:
|
|||||||
bool CompareTitle(void) { return compareTitle; };
|
bool CompareTitle(void) { return compareTitle; };
|
||||||
bool CompareSubtitle(void) { return compareSubtitle; };
|
bool CompareSubtitle(void) { return compareSubtitle; };
|
||||||
bool CompareSummary(void) { return compareSummary; };
|
bool CompareSummary(void) { return compareSummary; };
|
||||||
|
bool UseInFavorites(void) { return useInFavorites; };
|
||||||
//SETTER
|
//SETTER
|
||||||
void SetSearchString(std::string searchString) { this->searchString = searchString; };
|
void SetSearchString(std::string searchString) { this->searchString = searchString; };
|
||||||
void SetActive(bool active) { useAsSearchTimer = active; };
|
void SetActive(bool active) { useAsSearchTimer = active; };
|
||||||
@ -120,6 +121,7 @@ public:
|
|||||||
void SetCompareTitle(bool compareTitle) { this->compareTitle = compareTitle; };
|
void SetCompareTitle(bool compareTitle) { this->compareTitle = compareTitle; };
|
||||||
void SetCompareSubtitle(bool compareSubtitle) { this->compareSubtitle = compareSubtitle; };
|
void SetCompareSubtitle(bool compareSubtitle) { this->compareSubtitle = compareSubtitle; };
|
||||||
void SetCompareSummary(bool compareSummary) { this->compareSummary = compareSummary; };
|
void SetCompareSummary(bool compareSummary) { this->compareSummary = compareSummary; };
|
||||||
|
void SetUseInFavorites(bool useInFavorites) { this->useInFavorites = useInFavorites; };
|
||||||
//COMMON
|
//COMMON
|
||||||
int GetNumTimers(void);
|
int GetNumTimers(void);
|
||||||
int GetNumRecordings(void);
|
int GetNumRecordings(void);
|
||||||
|
3
setup.c
3
setup.c
@ -165,6 +165,7 @@ cMenuSetupGeneral::cMenuSetupGeneral(cTvguideConfig* data) : cMenuSetupSubMenu(
|
|||||||
jumpMode[1] = tr("previous / next channel group");
|
jumpMode[1] = tr("previous / next channel group");
|
||||||
blueMode[0] = tr("Blue: Channel Switch, Ok: Detailed EPG");
|
blueMode[0] = tr("Blue: Channel Switch, Ok: Detailed EPG");
|
||||||
blueMode[1] = tr("Blue: Detailed EPG, Ok: Channel Switch");
|
blueMode[1] = tr("Blue: Detailed EPG, Ok: Channel Switch");
|
||||||
|
blueMode[2] = tr("Blue: Favorites / Switch, Ok: Detailed EPG");
|
||||||
numMode[0] = tr("Timely Jump");
|
numMode[0] = tr("Timely Jump");
|
||||||
numMode[1] = tr("Jump to specific channel");
|
numMode[1] = tr("Jump to specific channel");
|
||||||
useSubtitleRerunTexts[0] = tr("never");
|
useSubtitleRerunTexts[0] = tr("never");
|
||||||
@ -187,7 +188,7 @@ void cMenuSetupGeneral::Set(void) {
|
|||||||
Add(new cMenuEditBoolItem(tr("Rounded Corners"), &tmpTvguideConfig->roundedCorners));
|
Add(new cMenuEditBoolItem(tr("Rounded Corners"), &tmpTvguideConfig->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)"), &tmpTvguideConfig->channelJumpMode, 2, jumpMode));
|
||||||
Add(new cMenuEditStraItem(tr("Keys Blue and OK"), &tmpTvguideConfig->blueKeyMode, 2, blueMode));
|
Add(new cMenuEditStraItem(tr("Keys Blue and OK"), &tmpTvguideConfig->blueKeyMode, 3, blueMode));
|
||||||
Add(new cMenuEditBoolItem(tr("Close TVGuide after channel switch"), &tmpTvguideConfig->closeOnSwitch));
|
Add(new cMenuEditBoolItem(tr("Close TVGuide after channel switch"), &tmpTvguideConfig->closeOnSwitch));
|
||||||
Add(new cMenuEditStraItem(tr("Functionality of numeric Keys"), &tmpTvguideConfig->numkeyMode, 2, numMode));
|
Add(new cMenuEditStraItem(tr("Functionality of numeric Keys"), &tmpTvguideConfig->numkeyMode, 2, numMode));
|
||||||
Add(new cMenuEditBoolItem(tr("Hide last Channel Group"), &tmpTvguideConfig->hideLastGroup));
|
Add(new cMenuEditBoolItem(tr("Hide last Channel Group"), &tmpTvguideConfig->hideLastGroup));
|
||||||
|
2
setup.h
2
setup.h
@ -34,7 +34,7 @@ class cMenuSetupGeneral : public cMenuSetupSubMenu {
|
|||||||
cThemes themes;
|
cThemes themes;
|
||||||
const char * timeFormatItems[2];
|
const char * timeFormatItems[2];
|
||||||
const char * jumpMode[2];
|
const char * jumpMode[2];
|
||||||
const char * blueMode[2];
|
const char * blueMode[3];
|
||||||
const char * numMode[2];
|
const char * numMode[2];
|
||||||
const char *useSubtitleRerunTexts[3];
|
const char *useSubtitleRerunTexts[3];
|
||||||
void Set(void);
|
void Set(void);
|
||||||
|
28
tvguideosd.c
28
tvguideosd.c
@ -108,7 +108,7 @@ void cTvGuideOsd::drawOsd() {
|
|||||||
footer->drawGreenButton();
|
footer->drawGreenButton();
|
||||||
footer->drawYellowButton();
|
footer->drawYellowButton();
|
||||||
}
|
}
|
||||||
footer->drawBlueButton();
|
footer->drawBlueButton(false);
|
||||||
osdManager.flush();
|
osdManager.flush();
|
||||||
readChannels(newStartChannel);
|
readChannels(newStartChannel);
|
||||||
drawGridsChannelJump(offset);
|
drawGridsChannelJump(offset);
|
||||||
@ -500,19 +500,23 @@ void cTvGuideOsd::processKeyYellow() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
eOSState cTvGuideOsd::processKeyBlue() {
|
eOSState cTvGuideOsd::processKeyBlue() {
|
||||||
if (tvguideConfig.blueKeyMode == 0) {
|
if (tvguideConfig.blueKeyMode == eBlueKeySwitch) {
|
||||||
return ChannelSwitch();
|
return ChannelSwitch();
|
||||||
} else if (tvguideConfig.blueKeyMode == 1) {
|
} else if (tvguideConfig.blueKeyMode == eBlueKeyEPG) {
|
||||||
DetailedEPG();
|
DetailedEPG();
|
||||||
|
} else if (tvguideConfig.blueKeyMode == eBlueKeyFavorites) {
|
||||||
|
recMenuManager->StartFavorites();
|
||||||
}
|
}
|
||||||
return osContinue;
|
return osContinue;
|
||||||
}
|
}
|
||||||
|
|
||||||
eOSState cTvGuideOsd::processKeyOk() {
|
eOSState cTvGuideOsd::processKeyOk() {
|
||||||
if (tvguideConfig.blueKeyMode == 0) {
|
if (tvguideConfig.blueKeyMode == eBlueKeySwitch) {
|
||||||
DetailedEPG();
|
DetailedEPG();
|
||||||
} else if (tvguideConfig.blueKeyMode == 1) {
|
} else if (tvguideConfig.blueKeyMode == eBlueKeyEPG) {
|
||||||
return ChannelSwitch();
|
return ChannelSwitch();
|
||||||
|
} else if (tvguideConfig.blueKeyMode == eBlueKeyFavorites) {
|
||||||
|
DetailedEPG();
|
||||||
}
|
}
|
||||||
return osContinue;
|
return osContinue;
|
||||||
}
|
}
|
||||||
@ -656,11 +660,21 @@ eOSState cTvGuideOsd::ProcessKey(eKeys Key) {
|
|||||||
detailView = NULL;
|
detailView = NULL;
|
||||||
detailViewActive = false;
|
detailViewActive = false;
|
||||||
processKeyRed();
|
processKeyRed();
|
||||||
} else if (((Key & ~k_Repeat) == kBlue) && (tvguideConfig.blueKeyMode == 0)) {
|
} else if ((Key & ~k_Repeat) == kBlue) {
|
||||||
delete detailView;
|
delete detailView;
|
||||||
detailView = NULL;
|
detailView = NULL;
|
||||||
detailViewActive = false;
|
detailViewActive = false;
|
||||||
state = processKeyBlue();
|
if ((tvguideConfig.blueKeyMode == eBlueKeySwitch) || (tvguideConfig.blueKeyMode == eBlueKeyFavorites))
|
||||||
|
state = ChannelSwitch();
|
||||||
|
else {
|
||||||
|
osdManager.flush();
|
||||||
|
state = osContinue;
|
||||||
|
}
|
||||||
|
} else if ((Key & ~k_Repeat) == kOk && (tvguideConfig.blueKeyMode = eBlueKeyEPG)) {
|
||||||
|
delete detailView;
|
||||||
|
detailView = NULL;
|
||||||
|
detailViewActive = false;
|
||||||
|
state = ChannelSwitch();
|
||||||
} else {
|
} else {
|
||||||
state = detailView->ProcessKey(Key);
|
state = detailView->ProcessKey(Key);
|
||||||
if (state == osEnd) {
|
if (state == osEnd) {
|
||||||
|
Loading…
Reference in New Issue
Block a user