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