Files
neutrino/src/gui/pipsetup.cpp
Thilo Graf dde298b1b7 CMsgBox: rework msgbox classes with Window class implementation
Replacing messagebox, hintbox_ext and some derivated parts with
basic class hintbox and derivated class CMsgBox. This should unify
window handling and avoids maintain of multiple classes with quasi
same purpose and adds more functionality.

TODO: fix and optimize details
2016-10-24 10:31:24 +02:00

210 lines
5.3 KiB
C++

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <gui/color.h>
#include <gui/widget/msgbox.h>
#include <driver/fontrenderer.h>
#include <driver/rcinput.h>
#include <system/settings.h>
#include <global.h>
#include <neutrino.h>
#include <gui/pipsetup.h>
#include <video.h>
#define PERCENT 5
#define XMOVE 10
#define YMOVE 10
#ifdef ENABLE_PIP
extern cVideo *pipDecoder;
CPipSetup::CPipSetup()
{
frameBuffer = CFrameBuffer::getInstance();
if(CNeutrinoApp::getInstance()->getMode() == NeutrinoMessages::mode_radio) {
gx = &g_settings.pip_radio_x;
gy = &g_settings.pip_radio_y;
gw = &g_settings.pip_radio_width;
gh = &g_settings.pip_radio_height;
} else {
gx = &g_settings.pip_x;
gy = &g_settings.pip_y;
gw = &g_settings.pip_width;
gh = &g_settings.pip_height;
}
x_coord = *gx;
y_coord = *gy;
width = *gw;
height = *gh;
maxw = frameBuffer->getScreenWidth(true);
maxh = frameBuffer->getScreenHeight(true);
minw = maxw/8;
minh = minw*1000/1825;
}
void CPipSetup::move(int x, int y, bool abs)
{
int newx, newy;
if(abs) {
newx = x;
newy = y;
} else {
newx = x_coord + x;
newy = y_coord + y;
if(newx < 0) newx = 0;
else if((newx + width) >= maxw) newx = maxw - width;
if(newy < 0) newy = 0;
else if((newy + height) >= maxh) newy = maxh - height;
}
x_coord = newx;
y_coord = newy;
*gx = x_coord;
*gy = y_coord;
printf("CPipSetup::move: x %d y %d\n", x_coord, y_coord);
pipDecoder->Pig(x_coord, y_coord, width, height, maxw, maxh);
}
// w and h is percent, if not absolute
void CPipSetup::resize(int w, int h, bool abs)
{
int neww, newh;
if(abs) {
width = w;
height = h;
} else {
neww = width + (maxw*w/100);
//newh = neww * 100 / 125;
newh = height + (maxh*h/100);
if(neww > maxw) neww = maxw;
else if(neww < minw) neww = minw;
if(newh > maxh) newh = maxh;
else if(newh < minh) newh = minh;
if( (x_coord + neww) > maxw)
return;
if( (y_coord + newh) > maxh)
return;
width = neww;
height = newh;
}
*gw = width;
*gh = height;
printf("CPipSetup::resize: w %d h %d \n", width, height);
pipDecoder->Pig(x_coord, y_coord, width, height, maxw, maxh);
}
int CPipSetup::exec(CMenuTarget* parent, const std::string &)
{
neutrino_msg_t msg;
neutrino_msg_data_t data;
int oldx = x_coord;
int oldy = y_coord;
int oldw = width;
int oldh = height;
printf("CPipSetup::exec\n");
int res = menu_return::RETURN_REPAINT;
if (parent)
parent->hide();
paint();
uint64_t timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_MENU] == 0 ? 0xFFFF : g_settings.timing[SNeutrinoSettings::TIMING_MENU]);
bool loop=true;
while (loop) {
g_RCInput->getMsgAbsoluteTimeout(&msg, &data, &timeoutEnd, true);
if ( msg <= CRCInput::RC_MaxRC )
timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_MENU] == 0 ? 0xFFFF : g_settings.timing[SNeutrinoSettings::TIMING_MENU]);
if ((msg == (neutrino_msg_t) g_settings.key_pip_setup) ||
(msg == CRCInput::RC_timeout) || (msg == CRCInput::RC_ok)) {
loop = false;
break;
} else if ((msg == CRCInput::RC_home) || (msg == CRCInput::RC_spkr)) {
clear();
move(oldx, oldy, true);
resize(oldw, oldh, true);
paint();
if (msg == CRCInput::RC_home)
loop = false;
} else if ((msg == CRCInput::RC_up) || (msg == CRCInput::RC_down)) {
clear();
move(0, (msg == CRCInput::RC_up) ? -YMOVE : YMOVE);
paint();
} else if ((msg == CRCInput::RC_left) || (msg == CRCInput::RC_right)) {
clear();
move((msg == CRCInput::RC_left) ? -XMOVE : XMOVE, 0);
paint();
} else if ((msg == CRCInput::RC_plus) || (msg == CRCInput::RC_minus)) {
clear();
int percent = (msg == CRCInput::RC_plus) ? PERCENT : -PERCENT;
resize(percent, percent);
paint();
} else if (msg > CRCInput::RC_MaxRC) {
if ( CNeutrinoApp::getInstance()->handleMsg( msg, data ) & messages_return::cancel_all ) {
loop = false;
res = menu_return::RETURN_EXIT_ALL;
}
}
}
hide();
return res;
}
void CPipSetup::hide()
{
frameBuffer->Clear();
}
void CPipSetup::clear()
{
frameBuffer->paintBackgroundBoxRel(x_coord, y_coord, width, height);
}
void CPipSetup::paint()
{
if (!frameBuffer->getActive())
return;
char xpos[30];
char ypos[30];
char wpos[30];
char hpos[30];
sprintf(xpos, "X: %d", x_coord );
sprintf(ypos, "Y: %d", y_coord );
sprintf(wpos, "W: %d", width );
sprintf(hpos, "H: %d", height );
int mheight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getHeight();
int mwidth = 10 + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth("W: 9999");
int x = (frameBuffer->getScreenWidth() - mwidth)/2;
int y = (frameBuffer->getScreenHeight() - mheight*4)/2;
if (pipDecoder->getBlank())
frameBuffer->paintBoxRel(x_coord, y_coord, width, height, COL_MENUCONTENT_PLUS_0);
frameBuffer->paintBoxRel(x, y, mwidth, mheight*4, COL_MENUCONTENT_PLUS_0);
g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight, mwidth, xpos, COL_MENUCONTENT_TEXT);
g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight*2, mwidth, ypos, COL_MENUCONTENT_TEXT);
g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight*3, mwidth, wpos, COL_MENUCONTENT_TEXT);
g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight*4, mwidth, hpos, COL_MENUCONTENT_TEXT);
}
#endif //#ifdef ENABLE_PIP