From 6c5e34688aa88b1307bc4f5d61d191a6d90280a2 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Tue, 26 Feb 2013 17:21:03 +0400 Subject: [PATCH] gui/pipsetup.cpp: add simple PiP size/position setup --- src/gui/Makefile.am | 1 + src/gui/pipsetup.cpp | 219 +++++++++++++++++++++++++++++++++++++++++++ src/gui/pipsetup.h | 29 ++++++ 3 files changed, 249 insertions(+) create mode 100644 src/gui/pipsetup.cpp create mode 100644 src/gui/pipsetup.h diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am index 0a12511b6..750092a9b 100644 --- a/src/gui/Makefile.am +++ b/src/gui/Makefile.am @@ -108,6 +108,7 @@ libneutrino_gui_a_SOURCES = \ user_menue_setup.cpp \ vfd_setup.cpp \ videosettings.cpp \ + pipsetup.cpp \ zapit_setup.cpp libneutrino_gui2_a_SOURCES = \ diff --git a/src/gui/pipsetup.cpp b/src/gui/pipsetup.cpp new file mode 100644 index 000000000..a3679c762 --- /dev/null +++ b/src/gui/pipsetup.cpp @@ -0,0 +1,219 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include + +#include +#include +#include + +#define PERCENT 5 +#define XMOVE 10 +#define YMOVE 10 + +#ifdef BOXMODEL_APOLLO + +extern cVideo *pipDecoder; + +CPipSetup::CPipSetup() +{ + frameBuffer = CFrameBuffer::getInstance(); + x_coord = g_settings.pip_x; + y_coord = g_settings.pip_y; + width = g_settings.pip_width; + height = g_settings.pip_height; + + 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; + g_settings.pip_x = x_coord; + g_settings.pip_y = 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; + } + g_settings.pip_width = width; + g_settings.pip_height = 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]); + + switch (msg) { + case CRCInput::RC_timeout: + case CRCInput::RC_ok: + loop = false; + break; + case CRCInput::RC_setup: + res = menu_return::RETURN_EXIT_ALL; + loop = false; + break; + case CRCInput::RC_home: + loop = false; + case CRCInput::RC_spkr: + clear(); + move(oldx, oldy, true); + resize(oldw, oldh, true); + paint(); + break; + case CRCInput::RC_up: + clear(); + move(0, -YMOVE); + paint(); + break; + case CRCInput::RC_down: + clear(); + move(0, YMOVE); + paint(); + break; + case CRCInput::RC_left: + clear(); + move(-XMOVE, 0); + paint(); + break; + case CRCInput::RC_right: + clear(); + move(XMOVE, 0); + paint(); + break; + case CRCInput::RC_plus: + clear(); + resize(PERCENT, PERCENT); + paint(); + break; + case CRCInput::RC_minus: + clear(); + resize(-PERCENT, -PERCENT); + paint(); + break; + default: + 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); + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight*2, mwidth, ypos, COL_MENUCONTENT); + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight*3, mwidth, wpos, COL_MENUCONTENT); + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight*4, mwidth, hpos, COL_MENUCONTENT); +} + +#endif //BOXMODEL_APOLLO diff --git a/src/gui/pipsetup.h b/src/gui/pipsetup.h new file mode 100644 index 000000000..373f3096b --- /dev/null +++ b/src/gui/pipsetup.h @@ -0,0 +1,29 @@ +#ifndef __PIP_SETUP_H_ +#define __PIP_SETUP_H_ + +#include +#include +#include + +class CPipSetup : public CMenuTarget +{ + private: + CFrameBuffer * frameBuffer; + int x_coord; + int y_coord; + int width; + int height; + int maxw; + int maxh; + int minw; + int minh; + void paint(); + void hide(); + void clear(); + public: + CPipSetup(); + void move(int x, int y, bool abs = false); + void resize(int w, int h, bool abs = false); + int exec(CMenuTarget* parent, const std::string & actionKey); +}; +#endif