- colorchooser: rework tis gui-element; ...

* use OFFSET defines
* rename some variables
* use paintBoxFrame() instead of background-icon; this avoids scaling
  issues on higher resolutions; scaled icons are ugly
This commit is contained in:
vanhofen
2017-09-14 21:37:44 +02:00
committed by Jacek Jendrzej
parent 10d236fd16
commit 442f1adff0
2 changed files with 181 additions and 159 deletions

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_CONFIG_H
@@ -46,55 +36,67 @@
#include <gui/widget/msgbox.h>
#include <gui/widget/icons.h>
#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);
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
@@ -38,21 +28,40 @@
#include <string>
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