diff --git a/src/gui/widget/colorchooser.cpp b/src/gui/widget/colorchooser.cpp index 5eef2d02e..5a4faf130 100644 --- a/src/gui/widget/colorchooser.cpp +++ b/src/gui/widget/colorchooser.cpp @@ -1,32 +1,22 @@ /* - Neutrino-GUI - DBoxII-Project + Based up Neutrino-GUI - Tuxbox-Project Copyright (C) 2001 Steffen Hehn 'McClean' - Homepage: http://dbox.cyberphoria.org/ - - Kommentar: - - Diese GUI wurde von Grund auf neu programmiert und sollte nun vom - Aufbau und auch den Ausbaumoeglichkeiten gut aussehen. Neutrino basiert - auf der Client-Server Idee, diese GUI ist also von der direkten DBox- - Steuerung getrennt. Diese wird dann von Daemons uebernommen. - License: GPL - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with this program. If not, see . */ #ifdef HAVE_CONFIG_H @@ -46,55 +36,67 @@ #include #include - -#define VALUE_R 0 -#define VALUE_G 1 -#define VALUE_B 2 -#define VALUE_ALPHA 3 - -static const char * const iconnames[4] = { +static const char * const icon_names[VALUES] = +{ NEUTRINO_ICON_VOLUMESLIDER2RED, NEUTRINO_ICON_VOLUMESLIDER2GREEN, NEUTRINO_ICON_VOLUMESLIDER2BLUE, NEUTRINO_ICON_VOLUMESLIDER2ALPHA }; -static const neutrino_locale_t colorchooser_names[4] = +static const neutrino_locale_t colorchooser_names[VALUES] = { - LOCALE_COLORCHOOSER_RED , + LOCALE_COLORCHOOSER_RED, LOCALE_COLORCHOOSER_GREEN, - LOCALE_COLORCHOOSER_BLUE , + LOCALE_COLORCHOOSER_BLUE, LOCALE_COLORCHOOSER_ALPHA }; -CColorChooser::CColorChooser(const neutrino_locale_t Name, unsigned char *R, unsigned char *G, unsigned char *B, unsigned char* Alpha, CChangeObserver* Observer) // UTF-8 +CColorChooser::CColorChooser(const neutrino_locale_t Name, unsigned char *R, unsigned char *G, unsigned char *B, unsigned char* A, CChangeObserver* Observer) { frameBuffer = CFrameBuffer::getInstance(); - hheight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); - mheight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getHeight(); - font_info = SNeutrinoSettings::FONT_TYPE_MENU; + header_height = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); + item_height = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getHeight(); observer = Observer; name = Name; - //calculate max width of LOCALS - offset = 0; - for (int i = 0; i < 4; i++) { - int tmpoffset = g_Font[font_info]->getRenderWidth(g_Locale->getText(colorchooser_names[i])); - if (tmpoffset > offset) { - offset = tmpoffset; - } + // calculate max width of locals + text_width = 0; + for (int i = 0; i < VALUES; i++) + { + int tmp_text_width = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(g_Locale->getText(colorchooser_names[i])); + if (tmp_text_width > text_width) + text_width = tmp_text_width; } - width = w_max((offset + (162 + mheight*4 + 10)), 0); - height = h_max(hheight+ mheight* 4, 0); + // assuming all sliders have same dimensions + int dummy; + frameBuffer->getIconSize(NEUTRINO_ICON_VOLUMESLIDER2ALPHA, &slider_width, &dummy); - x = frameBuffer->getScreenX() + ((frameBuffer->getScreenWidth()-width) >> 1); - y = frameBuffer->getScreenY() + ((frameBuffer->getScreenHeight()-height)>>1); + bar_width = frameBuffer->scale2Res(150); + /* + We have a half slider_width before and after the bar + to get the middle of the slider at the point of choise + */ + bar_offset = slider_width/2; + bar_full = bar_width + slider_width; - value[VALUE_R] = R; - value[VALUE_G] = G; - value[VALUE_B] = B; - value[VALUE_ALPHA] = Alpha; + preview_w = VALUES*item_height; + preview_h = VALUES*item_height; + + width = w_max((text_width + bar_full + preview_w + 4*OFFSET_INNER_MID), 0); + height = h_max((header_height + VALUES*item_height + 2*OFFSET_INNER_SMALL), 0); + + x = getScreenStartX(width); + y = getScreenStartY(height); + + preview_x = x + text_width + bar_full + 3*OFFSET_INNER_MID; + preview_y = y + header_height + OFFSET_INNER_SMALL; + + value[VALUE_R] = R; + value[VALUE_G] = G; + value[VALUE_B] = B; + value[VALUE_A] = A; chooser_gradient = gradient_none; } @@ -102,13 +104,10 @@ CColorChooser::CColorChooser(const neutrino_locale_t Name, unsigned char *R, uns void CColorChooser::setColor() { fb_pixel_t col = getColor(); - int x_col = x+offset+160; - int y_col = y+hheight+5; - int w_col = mheight*4; - int h_col = mheight*4-10; - if ((g_settings.theme.menu_Head_gradient) && ((chooser_gradient == gradient_head_body) || (chooser_gradient == gradient_head_text))) { - CComponentsHeader header(x_col, y_col+((h_col-hheight)/2), w_col, hheight, "Head"); + if ((g_settings.theme.menu_Head_gradient) && ((chooser_gradient == gradient_head_body) || (chooser_gradient == gradient_head_text))) + { + CComponentsHeader header(preview_x, preview_y+((preview_h-header_height)/2), preview_w, header_height, "Head"); if (chooser_gradient == gradient_head_body) header.setColorBody(col); else if (chooser_gradient == gradient_head_text) @@ -116,15 +115,20 @@ void CColorChooser::setColor() header.paint(CC_SAVE_SCREEN_NO); } else - frameBuffer->paintBoxRel(x_col+2, y_col+2, w_col-4 , h_col-4, col); + { + CComponentsShapeSquare preview(preview_x, preview_y, preview_w, preview_h, NULL, false, COL_FRAME_PLUS_0, col); + preview.setFrameThickness(1); + preview.setCorner(RADIUS_SMALL); + preview.paint(false); + } } fb_pixel_t CColorChooser::getColor() { int color = convertSetupColor2RGB(*(value[VALUE_R]), *(value[VALUE_G]), *(value[VALUE_B])); - int tAlpha = (value[VALUE_ALPHA]) ? (convertSetupAlpha2Alpha(*(value[VALUE_ALPHA]))) : 0xFF; + int alpha = (value[VALUE_A]) ? (convertSetupAlpha2Alpha(*(value[VALUE_A]))) : 0xFF; - return (((tAlpha << 24) & 0xFF000000) | color); + return (((alpha << 24) & 0xFF000000) | color); } int CColorChooser::exec(CMenuTarget* parent, const std::string &) @@ -136,91 +140,94 @@ int CColorChooser::exec(CMenuTarget* parent, const std::string &) if (parent) parent->hide(); - unsigned char r_alt= *value[VALUE_R]; - unsigned char g_alt= *value[VALUE_G]; - unsigned char b_alt= *value[VALUE_B]; + unsigned char r_alt = *value[VALUE_R]; + unsigned char g_alt = *value[VALUE_G]; + unsigned char b_alt = *value[VALUE_B]; unsigned char a_null = 0; - unsigned char a_alt = (value[VALUE_ALPHA]) ? (*(value[VALUE_ALPHA])) : a_null; + unsigned char a_alt = (value[VALUE_A]) ? (*(value[VALUE_A])) : a_null; paint(); setColor(); int selected = 0; - uint64_t timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_MENU] == 0 ? 0xFFFF : g_settings.timing[SNeutrinoSettings - ::TIMING_MENU]); + 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]); + timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_MENU] == 0 ? 0xFFFF : g_settings.timing[SNeutrinoSettings::TIMING_MENU]); int val = (*value[selected]); switch ( msg ) { case CRCInput::RC_down: + { + if (selected < ((value[VALUE_A]) ? 3 : 2)) { - if (selected < ((value[VALUE_ALPHA]) ? 3 : 2)) - { - paintSlider(x + 10, y + hheight + mheight * selected, value[selected], colorchooser_names[selected], iconnames[selected], false); - selected++; - paintSlider(x + 10, y + hheight + mheight * selected, value[selected], colorchooser_names[selected], iconnames[selected], true); - } else { - paintSlider(x + 10, y + hheight + mheight * selected, value[selected], colorchooser_names[selected], iconnames[selected], false); - selected = 0; - paintSlider(x + 10, y + hheight + mheight * selected, value[selected], colorchooser_names[selected], iconnames[selected], true); - } - break; - + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + item_height * selected, value[selected], colorchooser_names[selected], icon_names[selected], false); + selected++; + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + item_height * selected, value[selected], colorchooser_names[selected], icon_names[selected], true); } + else + { + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + item_height * selected, value[selected], colorchooser_names[selected], icon_names[selected], false); + selected = 0; + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + item_height * selected, value[selected], colorchooser_names[selected], icon_names[selected], true); + } + break; + + } case CRCInput::RC_up: + { + if (selected > 0) { - if (selected > 0) - { - paintSlider(x + 10, y + hheight + mheight * selected, value[selected], colorchooser_names[selected], iconnames[selected], false); - selected--; - paintSlider(x + 10, y + hheight + mheight * selected, value[selected], colorchooser_names[selected], iconnames[selected], true); - } else { - paintSlider(x + 10, y + hheight + mheight * selected, value[selected], colorchooser_names[selected], iconnames[selected], false); - selected = ((value[VALUE_ALPHA]) ? 3 : 2); - paintSlider(x + 10, y + hheight + mheight * selected, value[selected], colorchooser_names[selected], iconnames[selected], true); - } - break; + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + item_height * selected, value[selected], colorchooser_names[selected], icon_names[selected], false); + selected--; + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + item_height * selected, value[selected], colorchooser_names[selected], icon_names[selected], true); } + else + { + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + item_height * selected, value[selected], colorchooser_names[selected], icon_names[selected], false); + selected = ((value[VALUE_A]) ? 3 : 2); + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + item_height * selected, value[selected], colorchooser_names[selected], icon_names[selected], true); + } + break; + } case CRCInput::RC_right: + { + if (val < 100) { - if (val < 100) - { - if (val < 98) - val += 2; - else - val = 100; - (*value[selected]) = (uint8_t)val; + if (val < 98) + val += 2; + else + val = 100; + (*value[selected]) = (uint8_t)val; - paintSlider(x + 10, y + hheight + mheight * selected, value[selected], colorchooser_names[selected], iconnames[selected], true); - setColor(); - } - break; + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + item_height * selected, value[selected], colorchooser_names[selected], icon_names[selected], true); + setColor(); } + break; + } case CRCInput::RC_left: + { + if (val > 0) { - if (val > 0) - { - if (val > 2) - val -= 2; - else - val = 0; - (*value[selected]) = (uint8_t)val; + if (val > 2) + val -= 2; + else + val = 0; + (*value[selected]) = (uint8_t)val; - paintSlider(x + 10, y + hheight + mheight * selected, value[selected], colorchooser_names[selected], iconnames[selected], true); - setColor(); - } - break; + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + item_height * selected, value[selected], colorchooser_names[selected], icon_names[selected], true); + setColor(); } + break; + } case CRCInput::RC_home: - if (((*value[VALUE_R] != r_alt) || (*value[VALUE_G] != g_alt) || (*value[VALUE_B] != b_alt) || ((value[VALUE_ALPHA]) && (*(value[VALUE_ALPHA]) != a_alt))) && + { + if (((*value[VALUE_R] != r_alt) || (*value[VALUE_G] != g_alt) || (*value[VALUE_B] != b_alt) || ((value[VALUE_A]) && (*(value[VALUE_A]) != a_alt))) && (ShowMsg(name, LOCALE_MESSAGEBOX_DISCARD, CMsgBox::mbrYes, CMsgBox::mbYes | CMsgBox::mbCancel) == CMsgBox::mbrCancel)) break; @@ -228,15 +235,19 @@ int CColorChooser::exec(CMenuTarget* parent, const std::string &) *value[VALUE_R] = r_alt; *value[VALUE_G] = g_alt; *value[VALUE_B] = b_alt; - if (value[VALUE_ALPHA]) - *value[VALUE_ALPHA] = a_alt; + if (value[VALUE_A]) + *value[VALUE_A] = a_alt; loop = false; break; + } case CRCInput::RC_timeout: case CRCInput::RC_ok: + { loop = false; break; + } default: + { if (CNeutrinoApp::getInstance()->listModeKey(msg)) { break; @@ -246,12 +257,13 @@ int CColorChooser::exec(CMenuTarget* parent, const std::string &) loop = false; res = menu_return::RETURN_EXIT_ALL; } + } } } hide(); - if(observer) + if (observer) observer->changeNotify(name, NULL); return res; @@ -259,33 +271,37 @@ int CColorChooser::exec(CMenuTarget* parent, const std::string &) void CColorChooser::hide() { - frameBuffer->paintBackgroundBoxRel(x,y, width,height); + frameBuffer->paintBackgroundBoxRel(x, y, width, height); } void CColorChooser::paint() { - CComponentsHeader header(x, y, width, hheight, g_Locale->getText(name)); + CComponentsHeader header(x, y, width, header_height, g_Locale->getText(name)); + header.enableShadow(CC_SHADOW_RIGHT | CC_SHADOW_CORNER_TOP_RIGHT | CC_SHADOW_CORNER_BOTTOM_RIGHT); header.paint(CC_SAVE_SCREEN_NO); - frameBuffer->paintBoxRel(x,y+hheight, width,height-hheight, COL_MENUCONTENT_PLUS_0, RADIUS_MID, CORNER_BOTTOM);//round + PaintBoxRel(x, y + header_height, width, height - header_height, COL_MENUCONTENT_PLUS_0, RADIUS_LARGE, CORNER_BOTTOM, CC_SHADOW_ON); - for (int i = 0; i < 4; i++) - paintSlider(x + 10, y + hheight + mheight * i, value[i], colorchooser_names[i], iconnames[i], (i == 0)); - - if ((!g_settings.theme.menu_Head_gradient) || ((chooser_gradient != gradient_head_body) && (chooser_gradient != gradient_head_text))) { - //color preview - frameBuffer->paintBoxRel(x+offset+160,y+hheight+5, mheight*4, mheight*4-10, COL_MENUHEAD_PLUS_0); - frameBuffer->paintBoxRel(x+offset+162,y+hheight+2+5, mheight*4-4 ,mheight*4-4-10, 254); - } + for (int i = 0; i < VALUES; i++) + paintSlider(x, y + header_height + OFFSET_INNER_SMALL + i*item_height, value[i], colorchooser_names[i], icon_names[i], (i == 0)); } void CColorChooser::paintSlider(int px, int py, unsigned char *spos, const neutrino_locale_t text, const char * const iconname, const bool selected) { if (!spos) return; - frameBuffer->paintBoxRel(px+offset+10,py,120,mheight, COL_MENUCONTENT_PLUS_0); - frameBuffer->paintIcon(NEUTRINO_ICON_VOLUMEBODY,px+offset+10,py+2+mheight/4); - frameBuffer->paintIcon(selected ? iconname : NEUTRINO_ICON_VOLUMESLIDER2,px+offset+13+(*spos),py+mheight/4); - g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(px,py+mheight, width, g_Locale->getText(text), COL_MENUCONTENT_TEXT); + // clear area + frameBuffer->paintBoxRel(px + text_width + 2*OFFSET_INNER_MID, py, bar_full, item_height, COL_MENUCONTENT_PLUS_0); + // paint bar + /* + NEUTRINO_ICON_VOLUMEBODY should be scaled to bar_width. + So long we paint a simple frame. This is more save on higher resolutions. + */ + //frameBuffer->paintIcon(NEUTRINO_ICON_VOLUMEBODY, px + text_width + 2*OFFSET_INNER_MID + bar_offset, py, item_height); + frameBuffer->paintBoxFrame(px + text_width + 2*OFFSET_INNER_MID + bar_offset, py + item_height/3, bar_width, item_height/3, 1, COL_FRAME_PLUS_0); + // paint slider + frameBuffer->paintIcon(selected ? iconname : NEUTRINO_ICON_VOLUMESLIDER2, px + text_width + 2*OFFSET_INNER_MID + ((*spos)*bar_width / 100), py, item_height); + + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(px + OFFSET_INNER_MID, py + item_height, text_width, g_Locale->getText(text), COL_MENUCONTENT_TEXT); } diff --git a/src/gui/widget/colorchooser.h b/src/gui/widget/colorchooser.h index 1a0503a6e..02c8d9536 100644 --- a/src/gui/widget/colorchooser.h +++ b/src/gui/widget/colorchooser.h @@ -1,32 +1,22 @@ /* - Neutrino-GUI - DBoxII-Project + Based up Neutrino-GUI - Tuxbox-Project Copyright (C) 2001 Steffen Hehn 'McClean' - Homepage: http://dbox.cyberphoria.org/ - - Kommentar: - - Diese GUI wurde von Grund auf neu programmiert und sollte nun vom - Aufbau und auch den Ausbaumoeglichkeiten gut aussehen. Neutrino basiert - auf der Client-Server Idee, diese GUI ist also von der direkten DBox- - Steuerung getrennt. Diese wird dann von Daemons uebernommen. - - + License: GPL - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with this program. If not, see . */ @@ -38,21 +28,40 @@ #include +enum { + VALUE_R = 0, // red + VALUE_G = 1, // green + VALUE_B = 2, // blue + VALUE_A = 3, // alpha + + VALUES +}; + class CFrameBuffer; class CColorChooser : public CMenuTarget { private: - CFrameBuffer *frameBuffer; + CFrameBuffer *frameBuffer; int x; int y; int width; int height; - int hheight,mheight; // head/menu font height - int offset; - int font_info; + int header_height; + int item_height; + int text_width; + int bar_width; + int bar_offset; + int bar_full; + int slider_width; + int slider_step; + int preview_x; + int preview_y; + int preview_w; + int preview_h; + int chooser_gradient; - unsigned char * value[4]; // r, g, b, alpha + unsigned char * value[VALUES]; neutrino_locale_t name; @@ -63,8 +72,7 @@ class CColorChooser : public CMenuTarget void paintSlider(int x, int y, unsigned char *spos, const neutrino_locale_t text, const char * const iconname, const bool selected); public: - - CColorChooser(const neutrino_locale_t Name, unsigned char *R, unsigned char *G, unsigned char *B, unsigned char* Alpha, CChangeObserver* Observer = NULL); // UTF-8 + CColorChooser(const neutrino_locale_t Name, unsigned char *R, unsigned char *G, unsigned char *B, unsigned char* A, CChangeObserver* Observer = NULL); void hide(); int exec(CMenuTarget* parent, const std::string & actionKey); @@ -78,6 +86,4 @@ class CColorChooser : public CMenuTarget void setGradient(int gradient = gradient_none) { chooser_gradient = gradient; }; }; - #endif -