/*
	Based up Neutrino-GUI - Tuxbox-Project
	Copyright (C) 2001 by Steffen Hehn 'McClean'

	(C) 2008,2013,2014 by Thilo Graf
	(C) 2009,2010,2013 Stefan Seyfried

	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.
 */

///
/*!
	description of parameters:

	position of progressbar:
	x_pos >	start position on screen x
	y_pos >	start position on screen y
	pb_width >	with of progressbar
	pb_height >	height of progressbar

	definitions of values:
	value >	value, you will display
	max_value >	maximal value that you will display

	appearance:
	activebar_col >	color of inner bar that shows the current value
	passivebar_col >	color of passive bar
	frame_col >	general frame color of progressbar, set 0 for no frame
	shadowbar_col	color > shadow behind progressbar, set 0 for no shadow

*/

#ifndef __CC_PROGRESSBAR_H__
#define __CC_PROGRESSBAR_H__

#include "config.h"
#include "cc_base.h"
#include "cc_item.h"
#include <string>

class CProgressBar : public CComponentsItem
{
	private:
		///colors of active and passive bar area, active means the displayed value, passive the neutral area
		fb_pixel_t pb_active_col, pb_passive_col;

		int pb_last_width;

		///width of progress
		int pb_active_width, pb_passive_width;

		///maximal width,heigth of progress
		int pb_max_width, pb_height;

		///start position of bars
		int pb_start_x_passive;

		///color values
		int pb_red, pb_green, pb_yellow;

		///start position of activ/passiv area
		int pb_x, pb_y;

		///to evaluate values, these will be convert to the graph
		int pb_value, pb_max_value;

		int *pb_design, *pb_gradient;
		int pb_type;

		void initDimensions();

		///paints graph
		void paintProgress(bool do_save_bg = CC_SAVE_SCREEN_NO);

	public:
		///parameters:
		///x_pos, y_pos, w, h: position and dimension in pixel
		///w, h: width / height of bar. Can later be set with paintProgressbar.
		///R, G, Y: percentage of the bar where red/green/yellow is used, only used for colored designs
		///active_col, passive_col: sets colors for displayed values, activ_col means the the displayed progress
		///color_frame, color_body, color_shadow: colores of progressbar for frame, body and shadow, Note: color of frame is ineffective on fr_thickness = 0
		CProgressBar(	const int x_pos = 0,
				const int y_pos = 0,
				const int w = -1,
				const int h = -1,
				fb_pixel_t color_frame = 0,
				fb_pixel_t color_body = COL_MENUCONTENT_PLUS_0,
				fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0,
				const fb_pixel_t active_col = COL_INFOBAR_PLUS_7,
				const fb_pixel_t passive_col = COL_INFOBAR_PLUS_3,
				const int R = 40,
				const int G = 100,
				const int Y = 70,
				CComponentsForm *parent = NULL);


		///set up to display available values
		void setValue(const int val){ pb_value = val;}
		//return current value
		int getValue(void) { return pb_value; }
		void setMaxValue(const int max_val){pb_max_value = max_val;}
		///set up booth values to display at once
		void setValues(const int val, const int max_val){pb_value = val; pb_max_value = max_val;}

		///setters for status colors
		void setActiveColor(fb_pixel_t active_color) {pb_active_col = active_color;}
		void setPassiveColor(fb_pixel_t passive_color) {pb_passive_col = passive_color;}
		///set up booth status colors at once
		void setStatusColors(fb_pixel_t active_color, fb_pixel_t passive_color) {pb_passive_col = passive_color; pb_active_col = active_color;}

		///r, g, b: percentage of the bar where red/green/yellow is used, only used for colored designs
		void setRgb(const int r, const int g, const int b){pb_red =  r; pb_green = g; pb_yellow = b;}

		///x, y, width, height, value, max_value: set most wanted parameters at once
		void setProgress(const int x_pos, const int y_pos,
					const int w, const int h,
					const int val, const int max_val){x=x_pos; y=y_pos; width=w; height=h; pb_value=val; pb_max_value=max_val;}

		///force update on next paint
		void reset() { pb_last_width = -1; }
		void paint(bool do_save_bg = CC_SAVE_SCREEN_NO);

		enum pb_color_t {
			PB_OFF = -2,	/* -2 */
			PB_MONO,	/* -1 */
			PB_MATRIX,	/*  0 */
			PB_LINES_V,	/*  1 */
			PB_LINES_H,	/*  2 */
			PB_COLOR	/*  3 */
		};

		enum pb_type_t {
			PB_REDLEFT = 0,
			PB_REDRIGHT,
			PB_TIMESCALE
		};

		void setType(pb_type_t type);

		//set design (overides g_settings.progressbar_design)
		void setDesign(int &design) { pb_design = &design; }

		//set gradient (overides g_settings.progressbar_gradient)
		void setGradient(int &gradient) { pb_gradient = &gradient; }
};

#endif /* __CC_PROGRESSBAR_H__ */
