diff --git a/src/gui/components/cc_frm_button.cpp b/src/gui/components/cc_frm_button.cpp index 5f2b53b1e..f611d65a4 100644 --- a/src/gui/components/cc_frm_button.cpp +++ b/src/gui/components/cc_frm_button.cpp @@ -101,7 +101,7 @@ void CComponentsButton::initVarButton( const int& x_pos, const int& y_pos, const width = w; height = h; shadow = shadow_mode; - shadow_w = shadow ? OFFSET_SHADOW/2 : 0; //buttons are mostly small elements, so these elements should have a reasonable shadow width + shadow_w = shadow != CC_SHADOW_OFF ? OFFSET_SHADOW/2 : 0; //buttons are mostly small elements, so these elements should have a reasonable shadow width cc_body_gradient_enable = CC_COLGRAD_OFF/*g_settings.gradiant*/; //TODO: gradient is prepared for use but disabled at the moment till some other parts of gui parts are provide gradient setColBodyGradient(cc_body_gradient_enable/*CColorGradient::gradientLight2Dark*/, CFrameBuffer::gradientVertical, CColorGradient::light); @@ -195,24 +195,34 @@ void CComponentsButton::initCaption() x_cap += cc_btn_icon_obj ? cc_btn_icon_obj->getWidth() : 0; int w_cap = width - w_frame - append_x_offset - x_cap - w_frame; - int h_cap = height*65/100 /*- 2*fr_thickness*/; - + int h_cap = (height*75/100) - 2*w_frame; /*NOTE: paint of centered text in y direction without y_offset looks unlovely displaced in y direction especially besides small icons and inside small areas, but text render isn't wrong here, because capitalized chars or long chars like e. 'q', 'y' are considered! Therefore we here need other icons or a hack, that considers some different height values. */ - int y_cap = height/2 - h_cap/2 + w_frame/2; + int y_cap = height/2 - h_cap/2; cc_btn_capt_obj->setDimensionsAll(x_cap, y_cap, w_cap, h_cap); //text and font - if (cc_btn_font == NULL) - cc_btn_font = *cc_btn_dy_font->getDynFont(w_cap, h_cap, cc_btn_capt); + Font* def_font = *cc_btn_dy_font->getDynFont(w_cap, h_cap, cc_btn_capt); + if (cc_btn_font == NULL){ + /* use dynamic font as default font if no font defined */ + cc_btn_font = def_font; + }else{ + /* if button dimension too small, use dynamic font as default font size, this ignores possible defined font + * Otherwise definied font will be used. + */ + if (cc_btn_font->getHeight() > h_cap){ + cc_btn_font = def_font; + } + } cc_btn_capt_obj->setText(cc_btn_capt, CTextBox::NO_AUTO_LINEBREAK, cc_btn_font); cc_btn_capt_obj->forceTextPaint(); //here required; + cc_btn_capt_obj->getCTextBoxObject()->setTextBorderWidth(0,0); //set color cc_btn_capt_obj->setTextColor(this->cc_item_enabled ? cc_btn_capt_col : cc_btn_capt_disable_col); @@ -280,3 +290,9 @@ void CComponentsButton::paint(bool do_save_bg) //paint form contents paintForm(do_save_bg); } + +void CComponentsButton::enableShadow(int mode, const int& shadow_width, bool force_paint) +{ + clear(); + initVarButton(x, y, width, height, cc_btn_capt, cc_btn_icon, cc_parent, cc_item_selected, cc_item_enabled, mode, col_frame, col_body, col_shadow); +} diff --git a/src/gui/components/cc_frm_button.h b/src/gui/components/cc_frm_button.h index 80653e2be..1235dd0b9 100644 --- a/src/gui/components/cc_frm_button.h +++ b/src/gui/components/cc_frm_button.h @@ -195,6 +195,12 @@ class CComponentsButton : public CComponentsFrmChain, public CCTextScreen inline virtual void setButtonAlias(const int& alias_value){cc_btn_alias = alias_value;}; ///returns an alias value from button object, see also cc_btn_alias inline virtual int getButtonAlias(){return cc_btn_alias;}; + + /**1st parameter requires defines CC_SHADOW_ON (default), CC_SHADOW_OFF, CC_SHADOW_BOTTOM or CC_SHADOW_RIGHT, see also cc_types.h + * 2nd parameter defines shadow width, default = defined by system + * 3rd parameter forces paint of shadow layer, default = false, Note: default shadow will paint only on first paint, use 3rd parameter=true ignores this + */ + void enableShadow(int mode = CC_SHADOW_ON, const int& shadow_width = -1, bool force_paint = false); }; //! Sub class of CComponentsButton. diff --git a/src/gui/components/cc_frm_footer.cpp b/src/gui/components/cc_frm_footer.cpp index 5c2f5878d..2e742c663 100644 --- a/src/gui/components/cc_frm_footer.cpp +++ b/src/gui/components/cc_frm_footer.cpp @@ -69,10 +69,13 @@ void CComponentsFooter::initVarFooter( const int& x_pos, const int& y_pos, const width = w == 0 ? frameBuffer->getScreenWidth(true) : w; //init footer height + initCaptionFont(); height = max(h, cch_font->getHeight()); shadow = shadow_mode; - ccf_enable_button_shadow = false; + ccf_enable_button_shadow = false ; + ccf_button_shadow_width = 0; + ccf_button_shadow_force_paint = false; col_frame = color_frame; col_body = color_body; col_shadow = color_shadow; @@ -85,7 +88,7 @@ void CComponentsFooter::initVarFooter( const int& x_pos, const int& y_pos, const corner_type = CORNER_BOTTOM; ccf_enable_button_bg = false /*g_settings.theme.Button_gradient*/; //TODO: not implemented at the moment - ccf_btn_font = NULL; + ccf_btn_font = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_FOOT]; chain = NULL; addContextButton(buttons); @@ -95,46 +98,79 @@ void CComponentsFooter::initVarFooter( const int& x_pos, const int& y_pos, const void CComponentsFooter::setButtonLabels(const struct button_label_s * const content, const size_t& label_count, const int& chain_width, const int& label_width) { - //define required total width of button group, minimal width is >0, sensless values are nonsens! - int w_chain = chain_width > 0 ? chain_width : width;//TODO: alow and handle only with rational values >0, exit here - if (w_chain < 100){ - dprintf(DEBUG_NORMAL, "[CComponentsFooter] [%s - %d] stupid width of chain: width = %d, values < 100 are nonsens, buttons not painted!\n", __func__, __LINE__, w_chain); - return; + /* clean up before init*/ + if (chain) + chain->clear(); + + /* set general available full basic space for button chain, + * in this case this is footer width + */ + int w_chain = width - 2*cch_offset; + + /* calculate current available space for button container depends + * of already enbedded footer objects. + * If already existing some items then subtract those width from footer width. + * ...so we have the possible usable size for button container. + */ + if(!v_cc_items.empty()){ //FIXME: footer container seems always not empty here, so here j initialized with = 1. I dont't know where it comes from! dbt! + for (size_t j= 1; j< size(); j++) + w_chain -= getCCItem(j)->getWidth(); } - //consider context button group on the right side of footer, if exist then subtract result from chain_width of button container - if (cch_btn_obj) - w_chain -= cch_btn_obj->getWidth(); + /* On defined parameter chain_width + * calculate current available space for button container depends + * of passed chain with parameter + * Consider that chain_width is not too large. + */ + if (chain_width > 0 && chain_width <= w_chain){ + if (chain_width <= w_chain){ + w_chain = chain_width; + } + } - //calculate required position of button container - //consider icon (inherited) width, if exist then set evaluated result as x position for button label container and ... - int x_chain = 0; + /* initialize button container (chain object): this contains all passed (as interleaved) button label items, + * With this container we can work inside footer as primary container (in this context '=this') and the parent for the button label container (chain object). + * Button label container (chain object) itself is concurrent to the parent object for button objects. + */ + int x_chain = width/2 - w_chain/2; if (cch_icon_obj) - x_chain = (cch_icon_obj->getXPos() + cch_offset + cch_icon_obj->getWidth()); - //... reduce also total width for button label container - w_chain -= x_chain; - - //initialize container (chain object) as button label container: this contains all passed (as interleaved) button label items, with this container we can work inside - //footer as primary container (in this context '=this') and the parent for the button label container (chain object), - //button label container (chain object) itself is concurrent the parent object for button objects. + x_chain = cch_offset+cch_icon_obj->getWidth()+cch_offset; if (chain == NULL){ - chain = new CComponentsFrmChain(x_chain, CC_CENTERED, w_chain, height, 0, CC_DIR_X, this, CC_SHADOW_OFF, COL_FRAME_PLUS_0, col_body); + chain = new CComponentsFrmChain(x_chain, 0, w_chain, height, 0, CC_DIR_X, this, CC_SHADOW_OFF, COL_MENUCONTENT_PLUS_6, col_body); + chain->setAppendOffset(0, 0); chain->setCorner(this->corner_rad, this->corner_type); chain->doPaintBg(false); } - if (!chain->empty()) - chain->clear(); - //calculate default static width of button labels inside button object container related to available width of chain object - int w_btn_fix = chain->getWidth() / label_count; - int w_btn_min = min(label_width, w_btn_fix); + /* Calculate usable width of button labels inside button object container + * related to available width of chain object and passed + * label_width parameter. + * Parameter is used as minimal value and will be reduced + * if it is too large. + * Too small label_width parameter will be compensated by + * button objects itself. + */ + int w_offset = int((label_count-1)*cch_offset); + int w_btn = chain->getWidth()/label_count - w_offset; + if (label_width){ + int w_label = label_width; + int w_defined = int(label_width*label_count); + int w_max = chain->getWidth() - w_offset; + while (w_defined > w_max){ + w_label--; + w_defined = int(w_label*label_count) - w_offset; + } + w_btn = w_label; + } - int w_used = 0; - - //generate and add button objects passed from button label content with default width to chain object. + /* generate button objects passed from button label content + * with default width to chain object. + */ + vector v_btns; + int h_btn = height*85/100; for (size_t i= 0; i< label_count; i++){ - string txt = content[i].text; - string icon_name = string(content[i].button); + string txt = content[i].text; + string icon_name = string(content[i].button); //ignore item, if no text and icon are defined; if (txt.empty() && icon_name.empty()){ @@ -142,14 +178,14 @@ void CComponentsFooter::setButtonLabels(const struct button_label_s * const cont continue; } - CComponentsButton *btn = new CComponentsButton(0, CC_CENTERED, w_btn_min, (ccf_enable_button_bg ? height-2*fr_thickness : height)- 2*shadow_w, txt, icon_name, NULL, false, true, ccf_enable_button_shadow); + CComponentsButton *btn = new CComponentsButton(0, CC_CENTERED, w_btn, /*(ccf_enable_button_bg ? */h_btn-2*fr_thickness/* : height)*/-ccf_button_shadow_width, txt, icon_name, NULL, false, true, ccf_enable_button_shadow); - btn->setButtonFont(ccf_btn_font); btn->doPaintBg(ccf_enable_button_bg); btn->setButtonDirectKey(content[i].directKey); btn->setButtonDirectKeyA(content[i].directKeyAlt); btn->setButtonResult(content[i].btn_result); btn->setButtonAlias(content[i].btn_alias); + btn->setButtonFont(ccf_btn_font); //set button frames to icon color, predefined for available color buttons if (btn_auto_frame_col){ @@ -165,32 +201,35 @@ void CComponentsFooter::setButtonLabels(const struct button_label_s * const cont btn->setColorFrame(f_col); } - chain->addCCItem(btn); + v_btns.push_back(btn); - //set x position of next button object - if (i != 0) - btn->setXPos(CC_APPEND); - - //collect used button width inside chain object - w_used += btn->getWidth(); + if (w_btn < btn->getWidth()){ + btn->setWidth(w_btn); + btn->setButtonFont(NULL); + } + + dprintf(DEBUG_NORMAL, "[CComponentsFooter] [%s - %d] button %s [%u] btn->getWidth() = %d w_btn = %d, (chain->getWidth() = %d)\n", __func__, __LINE__, txt.c_str(), i, btn->getWidth(), w_btn, chain->getWidth()); } - //calculate offset between button objects inside chain object - int w_rest = max(w_chain - w_used, 0); - int btn_offset = w_rest / chain->size(); - chain->setAppendOffset(btn_offset, 0); - dprintf(DEBUG_INFO, "[CComponentsFooter] [%s - %d] btn_offset = %d, w_rest = %d, w_chain = %d, w_used = %d, chain->size() = %u\n", __func__, __LINE__, btn_offset, w_rest, w_chain, w_used, chain->size()); + /* add generated button objects to chain object. + */ + if (!v_btns.empty()){ + /*add all buttons into button container*/ + chain->addCCItem(v_btns); - //set x position of 1st button object inside chain, this is centering button objects inside chain - int x_1st_btn = btn_offset/2; - chain->getCCItem(0)->setXPos(x_1st_btn); + /* set position of labels, as centered inside button container*/ + int w_chain_used = 0; + for (size_t a= 0; a< chain->size(); a++) + w_chain_used += chain->getCCItem(a)->getWidth(); + w_chain_used += (chain->size()-1)*cch_offset; - //check used width of generated buttons, if required then use dynamic font, and try to fit buttons into chain container, dynamic font is used if ccf_btn_font==NULL - //NOTE: user should be set not too small window size and not too large fontsize, at some point this possibility will be depleted and it's no more space for readable caption - if (w_used > width && ccf_btn_font != NULL){ - chain->clear(); - ccf_btn_font = NULL; - setButtonLabels(content, label_count, chain_width, label_width); + int x_btn = chain->getWidth()/2 - w_chain_used/2; + chain->getCCItem(0)->setXPos(x_btn); + + for (size_t c= 1; c< chain->size(); c++){ + x_btn += chain->getCCItem(c-1)->getWidth()+ cch_offset; + chain->getCCItem(c)->setXPos(x_btn); + } } } @@ -360,8 +399,10 @@ void CComponentsFooter::setButtonText(const uint& btn_id, const std::string& tex void CComponentsFooter::enableButtonShadow(int mode, const int& shadow_width, bool force_paint) { ccf_enable_button_shadow = mode; + ccf_button_shadow_width = shadow_width; + ccf_button_shadow_force_paint = force_paint; if (chain){ for(size_t i=0; isize(); i++) - chain->enableShadow(mode, shadow_width, force_paint); + chain->getCCItem(i)->enableShadow(ccf_enable_button_shadow, ccf_button_shadow_width, ccf_button_shadow_force_paint); } } diff --git a/src/gui/components/cc_frm_footer.h b/src/gui/components/cc_frm_footer.h index 863ca7cea..301a93362 100644 --- a/src/gui/components/cc_frm_footer.h +++ b/src/gui/components/cc_frm_footer.h @@ -72,8 +72,12 @@ class CComponentsFooter : public CComponentsHeader ///show button with background, default false bool ccf_enable_button_bg; - ///enable button with shadow, default false - bool ccf_enable_button_shadow; + ///enable button with shadow mode, default CC_SHADOW_OFF + int ccf_enable_button_shadow; + ///set button shadow button width + int ccf_button_shadow_width; + ///set button shadow button repaint mode + bool ccf_button_shadow_force_paint; ///enable/disable button frame in icon color, predefined for red, green, yellow and blue, default disabled bool btn_auto_frame_col; @@ -183,7 +187,7 @@ class CComponentsFooter : public CComponentsHeader virtual void setSizeMode(const int& size_mode){cch_size_mode = size_mode; initCCItems();} ///enable and sets shadow properties for embedded buttons - void enableButtonShadow(int mode = CC_SHADOW_ON, const int& shadow_width = RADIUS_SMALL, bool force_paint = false); + void enableButtonShadow(int mode = CC_SHADOW_ON, const int& shadow_width = OFFSET_SHADOW/2, bool force_paint = false); ///disable shadow for embedded buttons void disbaleButtonShadow(){enableButtonShadow(CC_SHADOW_OFF);} }; diff --git a/src/gui/components/cc_frm_header.h b/src/gui/components/cc_frm_header.h index d30280da8..74201268e 100644 --- a/src/gui/components/cc_frm_header.h +++ b/src/gui/components/cc_frm_header.h @@ -119,8 +119,8 @@ class CComponentsHeader : public CComponentsForm, public CCTextScreen CComponentsHeader(CComponentsForm *parent = NULL); CComponentsHeader( const int& x_pos, const int& y_pos, const int& w, const int& h = 0, - const std::string& caption = "", - const std::string& = "", + const std::string& caption = std::string(), + const std::string& = std::string(), const int& buttons = 0, CComponentsForm *parent = NULL, int shadow_mode = CC_SHADOW_OFF, diff --git a/src/gui/components/cc_item_picture.cpp b/src/gui/components/cc_item_picture.cpp index 1fd538ac5..8801834ca 100644 --- a/src/gui/components/cc_item_picture.cpp +++ b/src/gui/components/cc_item_picture.cpp @@ -247,11 +247,11 @@ void CComponentsPicture::initPosition(int *x_position, int *y_position) } -void CComponentsPicture::getSize(int* width_image, int *height_image) -{ - *width_image = width; - *height_image = height; -} +// void CComponentsPicture::getSize(int* width_image, int *height_image) +// { +// *width_image = width; +// *height_image = height; +// } int CComponentsPicture::getWidth() { diff --git a/src/gui/components/cc_item_picture.h b/src/gui/components/cc_item_picture.h index 3aab7e11b..8d39e73d2 100644 --- a/src/gui/components/cc_item_picture.h +++ b/src/gui/components/cc_item_picture.h @@ -144,12 +144,12 @@ class CComponentsPicture : public CComponentsItem ///returns current assigned image name std::string getPictureName(){return pic_name;} - ///handle image size - virtual void getSize(int* width_image, int *height_image); - ///return width of component - virtual int getWidth(); - ///return height of component - virtual int getHeight(); +// ///handle image size +// void getSize(int* width_image, int *height_image); + ///return width of item + int getWidth(); + ///return height of item + int getHeight(); ///set width of object and image, value >0 causes scale of image, parameter keep_aspect = true causes scaling of height with same aspect, default = false virtual void setWidth(const int& w, bool keep_aspect = false); diff --git a/src/gui/test_menu.cpp b/src/gui/test_menu.cpp index 9d9b84fd7..53fd1b09e 100644 --- a/src/gui/test_menu.cpp +++ b/src/gui/test_menu.cpp @@ -370,9 +370,10 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) #endif else if (actionKey == "button"){ if (button == NULL){ - button = new CComponentsButtonRed(100, 100, 100, 50, "Test"); + button = new CComponentsButtonRed(100, 100, 100, 50, "Test", NULL, false, true, CC_SHADOW_OFF); button->enableShadow(); - } + }else + button->disableShadow(); if (!button->isPainted()){ @@ -560,7 +561,7 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) footer->setIcon(NEUTRINO_ICON_INFO); //add button labels with conventional button label struct - footer->setButtonLabels(TestButtons, TestButtonsCount, 0, footer->getWidth()/6); + footer->setButtonLabels(TestButtons, TestButtonsCount, 0, footer->getWidth()/TestButtonsCount); //also possible: use directly button name and as 2nd parameter string or locale as text // footer->setButtonLabel(NULL, "Test", 0, 250); diff --git a/src/gui/widget/msgbox.cpp b/src/gui/widget/msgbox.cpp index 2175b3d03..0b1feb8fa 100644 --- a/src/gui/widget/msgbox.cpp +++ b/src/gui/widget/msgbox.cpp @@ -97,6 +97,8 @@ void CMsgBox::init(const int& Height, const int& ShowButtons, const msg_result_t height = min(MAX_WINDOW_HEIGHT, height); width = min(MAX_WINDOW_WIDTH, width); + shadow = CC_SHADOW_ON; + //set result if (Default_result != mbrNone) result = default_result = Default_result; @@ -175,8 +177,9 @@ void CMsgBox::initButtons() ccw_footer->setButtonLabels(v_buttons, 0, 125); - //show buttons with background + //show buttons with background and shadow ccw_footer->enableButtonBg(btn_enable_bg); + ccw_footer->enableButtonShadow(CC_SHADOW_ON, OFFSET_SHADOW/2, true); //set position of meassage window and refresh window properties setCenterPos();