Files
neutrino/src/gui/volumebar.cpp

371 lines
8.5 KiB
C++

/*
Based up Neutrino-GUI - Tuxbox-Project
Copyright (C) 2001 by Steffen Hehn 'McClean'
Volumebar class for gui.
Copyright (C) 2013, Thilo Graf 'dbt'
Copyright (C) 2013, M. Liebmann (micha-bbg)
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 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.
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., 51 Franklin St, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "gui/volumebar.h"
#include <neutrino.h>
#include <gui/infoclock.h>
#include <driver/neutrinofonts.h>
using namespace std;
CVolumeBar::CVolumeBar()
{
initVarVolumeBar();
}
void CVolumeBar::initVarVolumeBar()
{
col_body = COL_MENUCONTENT_PLUS_0;
vb_item_offset = 4;
height = 4*vb_item_offset; //default height
//assume volume value as pointer to global setting
vb_vol = &g_settings.current_volume;
//items
//icon object
vb_icon = NULL;
//progressbar object
vb_pb = NULL;
vb_pbx = 0;
vb_pbw = 0;
vb_pbh = 0;
vb_pby = 0;
//digit
vb_digit = NULL;
vb_digit_mode = CTextBox::CENTER ;
VolumeFont = SNeutrinoSettings::FONT_TYPE_INFOBAR_INFO;
initVolumeBarSize();
initVolumeBarPosition();
initVolumeBarItems();
}
//calculates size referred for possible activated clock or/and mute icon
void CVolumeBar::initVolumeBarSize()
{
CVolumeHelper *cvh = CVolumeHelper::getInstance();
cvh->refresh();
cvh->getSpacer(&h_spacer, &v_spacer);
cvh->getDimensions(&x, &y, &sw, &sh, &vb_icon_w, &vb_digit_w);
cvh->getVolBarDimensions(&y, &height);
vb_digit_w += cornerRad()/2;
//scale
vb_pbw = 200;
vb_pbh = height-4*vb_item_offset;
//adapt x-pos
vb_icon_x = vb_item_offset;
vb_pbx = vb_icon_x + vb_icon_w + vb_item_offset;
vb_digit_x = vb_pbx + vb_pbw + vb_item_offset;
//result for width
width = (vb_icon_w + vb_pbw + vb_digit_w) + 4*vb_item_offset;
// mute icon
cvh->getMuteIconDimensions(&mute_ax, &mute_ay, &mute_dx, &mute_dy);
// info clock
int dummy;
cvh->getInfoClockDimensions(&dummy, &clock_y, &clock_width, &clock_height);
int mute_corrY = 0;
if (mute_dy < height)
mute_corrY = (height - mute_dy) / 2;
cvh->setMuteIconCorrY(mute_corrY);
vb_pbh = height-8;
vb_pby = height/2-vb_pbh/2;
}
//init current position of form
void CVolumeBar::initVolumeBarPosition()
{
CNeutrinoApp* neutrino = CNeutrinoApp::getInstance();
switch (g_settings.volume_pos)
{
case VOLUMEBAR_POS_TOP_RIGHT:{
int x_corr = 0;
if (( neutrino->getMode() != CNeutrinoApp::mode_scart ) && ( neutrino->getMode() != CNeutrinoApp::mode_audio) && ( neutrino->getMode() != CNeutrinoApp::mode_pic)) {
if ((neutrino->isMuted()) && (!g_settings.mode_clock))
x_corr = mute_dx + h_spacer;
if (g_settings.mode_clock)
y = clock_y + clock_height + v_spacer;
}
x = sw - width - x_corr;
break;
}
case VOLUMEBAR_POS_TOP_LEFT:
break;
case VOLUMEBAR_POS_BOTTOM_LEFT:
y = (sh + frameBuffer->getScreenY()) - height - v_spacer;
break;
case VOLUMEBAR_POS_BOTTOM_RIGHT:
x = sw - width;
y = (sh + frameBuffer->getScreenY()) - height - v_spacer;
break;
case VOLUMEBAR_POS_TOP_CENTER:
x = ((sw - width) / 2) + x - h_spacer/2;
break;
case VOLUMEBAR_POS_BOTTOM_CENTER:
x = ((sw - width) / 2) + x - h_spacer/2;
y = (sh + frameBuffer->getScreenY()) - height - v_spacer;
break;
case VOLUMEBAR_POS_HIGHER_CENTER:
x = ((sw - width) / 2) + x - h_spacer/2;
y = (sh + frameBuffer->getScreenY()) - sh/10;
break;
}
}
void CVolumeBar::initVolumeBarItems()
{
//icon
initVolumeBarIcon();
//scale
initVolumeBarScale();
//digits
if (g_settings.volume_digits)
initVolumeBarDigit();
}
//init current icon object
void CVolumeBar::initVolumeBarIcon()
{
vb_icon = new CComponentsPicture(vb_icon_x, 0, vb_icon_w, height, NEUTRINO_ICON_VOLUME);
vb_icon->setPictureAlign(CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER);
vb_icon->setColorBody(col_body);
vb_icon->setCorner(cornerRad(), CORNER_LEFT);
//add icon to container
addCCItem(vb_icon);
}
//create new scale
void CVolumeBar::initVolumeBarScale()
{
vb_pb = new CProgressBar();
vb_pb->setInvert();
vb_pb->setBlink();
vb_pb->setRgb(85, 75, 100);
vb_pb->setFrameThickness(2);
vb_pb->setProgress(vb_pbx, vb_pby, vb_pbw, vb_pbh, *vb_vol, 100);
//add progressbar to container
addCCItem(vb_pb);
}
//set digit text with current volume value
void CVolumeBar::initVolumeBarDigitValue()
{
vb_digit->setText(*vb_vol ,vb_digit_mode, *(CVolumeHelper::getInstance()->vb_font));
}
//create digit
void CVolumeBar::initVolumeBarDigit()
{
vb_digit = new CComponentsLabel();
vb_digit->setDimensionsAll(vb_digit_x, 0, vb_digit_w, height);
vb_digit->setTextColor(COL_MENUCONTENT_TEXT);
vb_digit->setCorner(cornerRad(), CORNER_RIGHT);
initVolumeBarDigitValue();
//add digit label to container
addCCItem(vb_digit);
}
//refresh and paint digit
void CVolumeBar::paintVolumeBarDigit()
{
// digits
CTextBox* ctb = vb_digit->getCTextBoxObject();
if (ctb)
ctb->setFontUseDigitHeight();
// paint digit
vb_digit->paint(CC_SAVE_SCREEN_NO);
}
//refresh progressbar and digit
void CVolumeBar::repaintVolScale()
{
paintVolScale();
if (g_settings.volume_digits) {
initVolumeBarDigitValue();
paintVolumeBarDigit();
}
}
//set current volume value and paint form
void CVolumeBar::paintVolScale()
{
vb_pb->setValue(*vb_vol);
vb_pb->paint(CC_SAVE_SCREEN_NO);
}
//final paint
void CVolumeBar::paint(bool do_save_bg)
{
//paint form
paintForm(do_save_bg);
}
// CVolumeHelper ####################################################################################################
CVolumeHelper::CVolumeHelper()
{
h_spacer = 11;
v_spacer = 6;
vb_font = NULL;
clock_font = NULL;
frameBuffer = CFrameBuffer::getInstance();
Init();
}
void CVolumeHelper::Init(Font** font)
{
x = frameBuffer->getScreenX() + h_spacer;
y = frameBuffer->getScreenY() + v_spacer;
sw = g_settings.screen_EndX - h_spacer;
sh = frameBuffer->getScreenHeight();
initVolBarSize();
initMuteIcon();
initInfoClock(font);
}
void CVolumeHelper::initInfoClock(Font** font)
{
if (clock_font == NULL){
if (font == NULL) {
clock_font = &g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE];
}
else
clock_font = font;
}
else {
if (font != NULL)
clock_font = font;
}
digit_offset = (*clock_font)->getDigitOffset();
digit_h = (*clock_font)->getDigitHeight();
int t1 = (*clock_font)->getMaxDigitWidth();
int t2 = (*clock_font)->getRenderWidth(":");
clock_dy = digit_h + (int)((float)digit_offset * 1.3);
clock_dx = t1*7 + t2*2;
clock_ax = sw - clock_dx;
clock_ay = y;
vol_ay = y;
mute_corrY = 0;
if (g_settings.mode_clock) {
if (mute_dy > clock_dy)
clock_ay += (mute_dy - clock_dy) / 2;
else
mute_corrY = (clock_dy - mute_dy) / 2;
}
else {
if (mute_dy > vol_height)
vol_ay += (mute_dy - vol_height) / 2;
else
mute_corrY = (vol_height - mute_dy) / 2;
}
}
void CVolumeHelper::initMuteIcon()
{
frameBuffer->getIconSize(NEUTRINO_ICON_BUTTON_MUTE, &mute_dx, &mute_dy);
mute_ax = sw - mute_dx;
mute_ay = y;
}
void CVolumeHelper::initVolBarSize()
{
icon_width = 0;
icon_height = 0;
digit_width = 0;
frameBuffer->getIconSize(NEUTRINO_ICON_VOLUME, &icon_width, &icon_height);
icon_height = max(icon_height, 16); // if no icon available
icon_height += 2;
icon_width += 8;
g_settings.volume_size = max(g_settings.volume_size, icon_height);
vol_height = g_settings.volume_size;
if (g_settings.volume_digits) {
CNeutrinoFonts *cnf = CNeutrinoFonts::getInstance();
cnf->setFontUseDigitHeight(true);
int tmp_h = vol_height;
digit_width = 0;
vb_font = cnf->getDynFont(digit_width, tmp_h, "100", CNeutrinoFonts::FONT_STYLE_REGULAR, CNeutrinoFonts::FONT_ID_VOLBAR);
digit_width += 6;
vol_height = max(vol_height, tmp_h);
}
}
int CVolumeHelper::getInfoClockX()
{
if (CNeutrinoApp::getInstance()->isMuted())
return clock_ax - mute_dx - h_spacer;
else
return clock_ax;
}
void CVolumeHelper::refresh(Font** font)
{
Init(font);
}
CVolumeHelper* CVolumeHelper::getInstance()
{
static CVolumeHelper* Helper = NULL;
if(!Helper)
Helper = new CVolumeHelper();
return Helper;
}