/* Based up Neutrino-GUI - Tuxbox-Project Copyright (C) 2001 by Steffen Hehn 'McClean' Scrollbar class based up CComponentsFrmChain. Copyright (C) 2014 Thilo Graf 'dbt' 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, see . */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "cc_frm_scrollbar.h" #include "system/debug.h" using namespace std; /* base schema x,y +-----------------+ |+---------------+| ||sb_up_obj || || || |+---------------+| |+---------------+| ||sb_segments_obj|| ||+-------------+|| ||| segment ||| ||| id 0 ||| ||| ||| ||+-------------+|| ||| segment ||| ||| id 1 ||| ||| ||| ||+-------------+|| |+---------------+| |+---------------+| ||sb_up_obj || || || |+---------------+| +-----------------+ */ //sub class CComponentsScrollBar inherit from CComponentsFrmChain CComponentsScrollBar::CComponentsScrollBar( const int &x_pos, const int &y_pos, const int &w, const int &h, const int& count, CComponentsForm* parent, int shadow_mode, fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow) :CComponentsFrmChain(x_pos, y_pos, w, h, NULL, CC_DIR_Y, parent, shadow_mode, color_frame, color_body, color_shadow) { initVarSbForm(count); } void CComponentsScrollBar::initVarSbForm(const int& count) { cc_item_type = CC_ITEMTYPE_FRM_SCROLLBAR; fr_thickness = 0; append_x_offset = 0; append_y_offset = 2; sb_up_obj = sb_down_obj = NULL; sb_segments_obj = NULL; string ftype = ".png"; sb_up_icon = frameBuffer->getIconBasePath() + "/" + NEUTRINO_ICON_BUTTON_TOP + ftype; sb_down_icon = frameBuffer->getIconBasePath() + "/" + NEUTRINO_ICON_BUTTON_DOWN + ftype; sb_segments_count = count; sb_mark_id = 0; initCCItems(); } void CComponentsScrollBar::setSegmentCount(const int& segment_count, const int& mark_id) { sb_segments_count = segment_count; sb_mark_id = mark_id; initSegments(); } void CComponentsScrollBar::initCCItems() { initTopNaviIcon(); initSegments(); initBottomNaviIcon(); } void CComponentsScrollBar::initTopNaviIcon() { //initialize icon object if (sb_up_obj == NULL){ sb_up_obj = new CComponentsPicture(CC_CENTERED, fr_thickness, sb_up_icon, this); sb_up_obj->doPaintBg(false); } sb_up_obj->setWidth(width-2*fr_thickness); } void CComponentsScrollBar::initBottomNaviIcon() { //initialize icon object if (sb_down_obj == NULL){ sb_down_obj = new CComponentsPicture(CC_CENTERED, CC_APPEND, sb_down_icon, this); sb_down_obj->doPaintBg(false); } sb_down_obj->setWidth(width-2*fr_thickness); } void CComponentsScrollBar::initSegments() { //init dimensions for segments int w_seg = width - 4*fr_thickness; int h_seg = height - (sb_segments_count-1)*append_y_offset; //calculate height of segment container int h_seg_obj = height - 2*sb_up_obj->getHeight() - 3*append_y_offset; //init segment container if (sb_segments_obj == NULL){ sb_segments_obj = new CComponentsFrmChain(CC_CENTERED, CC_APPEND, w_seg, h_seg_obj, NULL, CC_DIR_Y, this, false); sb_segments_obj->setFrameThickness(0,0); sb_segments_obj->setAppendOffset(0, 3); }else sb_segments_obj->setDimensionsAll(CC_CENTERED, CC_APPEND, w_seg, h_seg_obj); //set current color for segment container sb_segments_obj->setColorBody(col_body); //clean up segment container before add new segments sb_segments_obj->clear(); //set y position of 1st segment and set height of segments int y_seg = 1+ append_y_offset; h_seg = sb_segments_obj->getHeight()/sb_segments_count - append_y_offset; //create and add segments to segment container for(u_int8_t i=0; igetCCItemId(item); if (sb_mark_id > id){ dprintf(DEBUG_NORMAL, "[CComponentsScrollBar] %s: sb_mark_id out of range current=%d allowed=%d\n", __func__, sb_mark_id, id); } //set color for marked id if (sb_mark_id == id){ item->setColorBody(COL_MENUCONTENTSELECTED_PLUS_0); item->enableColBodyGradient(CC_COLGRAD_COL_A_2_COL_B); item->setColBodyGradient(CColorGradient::gradientDark2Light2Dark, CFrameBuffer::gradientHorizontal); } else{ item->setColorBody(COL_MENUCONTENT_PLUS_1); item->disableColBodyGradient(); } } //set corner types sb_segments_obj->front()->setCorner(RADIUS_MIN, CORNER_TOP); sb_segments_obj->back()->setCorner(RADIUS_MIN, CORNER_BOTTOM); }