From 06a7414a31788fa59a9769f7fc1b224c1d19404b Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Sat, 22 Mar 2014 00:21:30 +0100 Subject: [PATCH] CComponentsHeader: rework context button handling CComponentsHeader uses now CComponentsIconForm, which is now derived from CComponentsFrmChain. Some methods should be now simplified and allow to handle some modifications easier. Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/6fe7b452c11a4e3bb5ba439a07b86b71441dd738 Author: Thilo Graf Date: 2014-03-22 (Sat, 22 Mar 2014) ------------------ This commit was generated by Migit --- src/gui/audioplayer.cpp | 2 +- src/gui/components/cc_frm.cpp | 3 +- src/gui/components/cc_frm_chain.cpp | 89 +++++++++------------ src/gui/components/cc_frm_chain.h | 33 ++++---- src/gui/components/cc_frm_footer.cpp | 3 +- src/gui/components/cc_frm_header.cpp | 108 ++++++++++---------------- src/gui/components/cc_frm_header.h | 37 ++++----- src/gui/components/cc_frm_icons.cpp | 111 +++++---------------------- src/gui/components/cc_frm_icons.h | 18 +---- src/gui/components/cc_frm_window.cpp | 2 +- src/gui/pictureviewer.cpp | 2 +- src/gui/test_menu.cpp | 33 +++++--- src/gui/upnpbrowser.cpp | 4 +- 13 files changed, 164 insertions(+), 281 deletions(-) diff --git a/src/gui/audioplayer.cpp b/src/gui/audioplayer.cpp index 776b13a5a..6d6f62a61 100644 --- a/src/gui/audioplayer.cpp +++ b/src/gui/audioplayer.cpp @@ -1587,7 +1587,7 @@ void CAudioPlayerGui::paintHead() #ifdef ENABLE_GUI_MOUNT if (!m_inetmode) - header.addButtonIcon(NEUTRINO_ICON_BUTTON_MENU); + header.setContextButton(NEUTRINO_ICON_BUTTON_MENU); #endif header.paint(CC_SAVE_SCREEN_NO); diff --git a/src/gui/components/cc_frm.cpp b/src/gui/components/cc_frm.cpp index 11cfcd13d..fbf203048 100644 --- a/src/gui/components/cc_frm.cpp +++ b/src/gui/components/cc_frm.cpp @@ -196,10 +196,11 @@ void CComponentsForm::removeCCItem(const uint& cc_item_id) delete v_cc_items[cc_item_id]; v_cc_items[cc_item_id] = NULL; v_cc_items.erase(v_cc_items.begin()+cc_item_id); + dprintf(DEBUG_DEBUG, "[CComponentsForm] %s removing cc_Item [id=%u]...\n", __func__, cc_item_id); } } else - dprintf(DEBUG_NORMAL, "[CComponentsForm] %s removing cc_Item not possible, v_cc_items is empty...\n", __func__); + dprintf(DEBUG_NORMAL, "[CComponentsForm] %s removing of cc_Item [id=%u] not possible, v_cc_items is empty...\n", __func__, cc_item_id); } void CComponentsForm::removeCCItem(CComponentsItem* cc_Item) diff --git a/src/gui/components/cc_frm_chain.cpp b/src/gui/components/cc_frm_chain.cpp index c893df239..f57be9161 100644 --- a/src/gui/components/cc_frm_chain.cpp +++ b/src/gui/components/cc_frm_chain.cpp @@ -31,24 +31,20 @@ using namespace std; //sub class CComponentsFrmChain CComponentsFrmChain::CComponentsFrmChain( const int& x_pos, const int& y_pos, const int& w, const int& h, const std::vector *v_items, - bool horizontal, - bool dynamic_width, - bool dynamic_height, + int direction, CComponentsForm* parent, bool has_shadow, fb_pixel_t& color_frame, fb_pixel_t& color_body, fb_pixel_t& color_shadow) { - initVarChain(x_pos, y_pos, w, h, v_items, horizontal, dynamic_width, dynamic_height, parent, has_shadow, color_frame, color_body, color_shadow); + initVarChain(x_pos, y_pos, w, h, v_items, direction, parent, has_shadow, color_frame, color_body, color_shadow); } void CComponentsFrmChain::initVarChain( const int& x_pos, const int& y_pos, const int& w, const int& h, const std::vector *v_items, - bool horizontal, - bool dynamic_width, - bool dynamic_height, + int direction, CComponentsForm* parent, bool has_shadow, fb_pixel_t& color_frame, @@ -68,62 +64,49 @@ void CComponentsFrmChain::initVarChain( const int& x_pos, const int& y_pos, cons col_body = color_body; col_shadow = color_shadow; - chn_horizontal = horizontal; - chn_dyn_height = dynamic_height; - chn_dyn_width = dynamic_width; + chn_direction = direction; - if (v_items){ + if (v_items) addCCItem(*v_items); - initCChainItems(); - } + + initChainItems(); initParent(parent); } -void CComponentsFrmChain::initCChainItems() +void CComponentsFrmChain::setDirection(int direction) { - if (!v_cc_items.empty()){ - if (chn_dyn_height) - height = 0; - if (chn_dyn_width) - width = 0; - } - + chn_direction = direction; + initChainItems(); +}; + +void CComponentsFrmChain::initChainItems() +{ + //init required dimensions, preferred are current width and height + int w_tmp = width; + int h_tmp = height; + + //exit if no item available + if (v_cc_items.empty()) + return; + + //set new values + w_tmp = append_x_offset; + h_tmp = append_y_offset; + for (size_t i= 0; i< v_cc_items.size(); i++){ - //set general start position for all items - if (i == 0) - v_cc_items[i]->setPos(0, 0); - - //set arrangement with required direction - if (chn_horizontal){ - if (i > 0) - v_cc_items[i]->setPos(CC_APPEND, 0); - } - else{ - if (i > 0) - v_cc_items[i]->setPos(0, CC_APPEND); + if (chn_direction & CC_DIR_X){ + w_tmp += v_cc_items[i]->getWidth(); + w_tmp += append_x_offset; + v_cc_items[i]->setPos(CC_APPEND, CC_CENTERED); } - //assign size - if (chn_horizontal){ - //assign dynamic width - if (chn_dyn_width) - width += v_cc_items[i]->getWidth(); - //assign dynamic height - if (chn_dyn_height) - height = max(v_cc_items[i]->getHeight(), height); - else - v_cc_items[i]->setHeight(height); - } - else{ - //assign dynamic height - if (chn_dyn_height) - height += v_cc_items[i]->getHeight(); - //assign dynamic width - if (chn_dyn_width) - width = max(v_cc_items[i]->getWidth(), width); - else - v_cc_items[i]->setWidth(width); + if (chn_direction & CC_DIR_Y){ + h_tmp += v_cc_items[i]->getHeight(); + h_tmp += append_y_offset; + v_cc_items[i]->setPos(CC_CENTERED, CC_APPEND); } } + width = max (w_tmp, width); + height = max (h_tmp, height); } diff --git a/src/gui/components/cc_frm_chain.h b/src/gui/components/cc_frm_chain.h index 5b49eef39..3005942d6 100644 --- a/src/gui/components/cc_frm_chain.h +++ b/src/gui/components/cc_frm_chain.h @@ -36,45 +36,46 @@ You can set default form parameters like position, size, colors etc. and additi to display with defined direction. */ +//direction types +enum +{ + CC_DIR_X = 0x1, + CC_DIR_Y = 0x2 +}; + class CComponentsFrmChain : public CComponentsForm { private: - ///property: defined arrangement mode of items, can be vertical or horizontal - int chn_horizontal; - - ///property: defines height from sum of all contained items - bool chn_dyn_height; - ///property: defines width from sum of all contained items - bool chn_dyn_width; - ///init all required variables void initVarChain( const int& x_pos, const int& y_pos, const int& w, const int& h, const std::vector *v_items, - bool horizontal, - bool dynamic_width, - bool dynamic_height, + int direction, CComponentsForm* parent, bool has_shadow, fb_pixel_t& color_frame, fb_pixel_t& color_body, fb_pixel_t& color_shadow); - - void initCChainItems(); protected: + ///property: mode for arrangement direction of items, see also setDirection(), getDirection() + int chn_direction; + void initChainItems(); public: CComponentsFrmChain( const int& x_pos = 1, const int& y_pos = 1, const int& w = 720, const int& h = 32, const std::vector *v_items = NULL, - bool horizontal = true, - bool dynamic_width = false, - bool dynamic_height = false, + int direction = CC_DIR_X, CComponentsForm* parent = NULL, bool has_shadow = CC_SHADOW_OFF, fb_pixel_t& color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t& color_body = COL_MENUHEAD_PLUS_0, fb_pixel_t& color_shadow = COL_MENUCONTENTDARK_PLUS_0); // ~CComponentsSlider(); //inherited from CComponentsForm + + ///defines mode for arrangement direction of items, see also chn_direction + virtual void setDirection(int direction); + ///gets the mode of arrangment direction + virtual int getDirection(){return chn_direction;}; }; #endif diff --git a/src/gui/components/cc_frm_footer.cpp b/src/gui/components/cc_frm_footer.cpp index a3332d764..2fa63df8e 100644 --- a/src/gui/components/cc_frm_footer.cpp +++ b/src/gui/components/cc_frm_footer.cpp @@ -73,7 +73,6 @@ void CComponentsFooter::initVarFooter( const int& x_pos, const int& y_pos, const else height = cch_font->getHeight(); - cch_buttons = buttons; shadow = has_shadow; col_frame = color_frame; col_body = color_body; @@ -82,7 +81,7 @@ void CComponentsFooter::initVarFooter( const int& x_pos, const int& y_pos, const corner_rad = RADIUS_LARGE; corner_type = CORNER_BOTTOM; - initDefaultButtons(); + addContextButton(buttons); initCCItems(); initParent(parent); } diff --git a/src/gui/components/cc_frm_header.cpp b/src/gui/components/cc_frm_header.cpp index 705f3b47f..248977542 100644 --- a/src/gui/components/cc_frm_header.cpp +++ b/src/gui/components/cc_frm_header.cpp @@ -100,7 +100,6 @@ void CComponentsHeader::initVarHeader( const int& x_pos, const int& y_pos, const col_body = COL_MENUHEAD_PLUS_0; cch_text = caption; cch_icon_name = icon_name; - cch_buttons = buttons; corner_rad = RADIUS_LARGE, corner_type = CORNER_TOP; @@ -115,11 +114,9 @@ void CComponentsHeader::initVarHeader( const int& x_pos, const int& y_pos, const cch_icon_x = cch_offset; cch_icon_w = 0; cch_text_x = cch_offset; - cch_buttons_w = 0; - cch_buttons_h = 0; cch_buttons_space = cch_offset; - initDefaultButtons(); + addContextButton(buttons); initCCItems(); initParent(parent); } @@ -170,7 +167,7 @@ void CComponentsHeader::initCaptionFont(Font* font) void CComponentsHeader::setIcon(const char* icon_name) { if (icon_name){ - string s_icon = static_cast(icon_name); + string s_icon = string(icon_name); setIcon(s_icon); } else @@ -194,18 +191,12 @@ void CComponentsHeader::initIcon() return; } - //create instance for cch_icon_obj + //create instance for cch_icon_obj and add to container at once if (cch_icon_obj == NULL){ dprintf(DEBUG_DEBUG, "[CComponentsHeader]\n [%s - %d] init header icon: %s\n", __func__, __LINE__, cch_icon_name.c_str()); - cch_icon_obj = new CComponentsPicture(cch_icon_x, cch_items_y, 0, 0, cch_icon_name); + cch_icon_obj = new CComponentsPicture(cch_icon_x, cch_items_y, 0, 0, cch_icon_name, CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER, this); } - //add item only one time - if (!cch_icon_obj->isAdded()) - addCCItem(cch_icon_obj); //icon - - - //set properties for icon object if (cch_icon_obj){ //get dimensions of header icon @@ -215,7 +206,6 @@ void CComponentsHeader::initIcon() cch_icon_obj->setWidth(iw); cch_icon_obj->setHeight(ih); cch_icon_obj->doPaintBg(false); - cch_icon_obj->setPictureAlign(CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER); //set corner mode of icon item int cc_icon_corner_type = corner_type; @@ -236,56 +226,36 @@ void CComponentsHeader::initIcon() } } -void CComponentsHeader::addButtonIcon(const std::string& button_name) +void CComponentsHeader::addContextButton(const std::string& button_name) { v_cch_btn.push_back(button_name); - initButtons(); -} - -void CComponentsHeader::removeButtonIcons() -{ - v_cch_btn.clear(); - cch_btn_obj->removeAllIcons(); - initButtons(); -} - -void CComponentsHeader::initDefaultButtons() -{ - if (cch_buttons & CC_BTN_EXIT) - v_cch_btn.push_back(NEUTRINO_ICON_BUTTON_HOME); - if (cch_buttons & CC_BTN_HELP) - v_cch_btn.push_back(NEUTRINO_ICON_BUTTON_HELP); - if (cch_buttons & CC_BTN_INFO) - v_cch_btn.push_back(NEUTRINO_ICON_BUTTON_INFO); - if (cch_buttons & CC_BTN_MENU) - v_cch_btn.push_back(NEUTRINO_ICON_BUTTON_MENU); - dprintf(DEBUG_DEBUG, "[CComponentsHeader] %s added %d default buttons...\n", __func__, (int)v_cch_btn.size()); } -void CComponentsHeader::setDefaultButtons(const int buttons) +void CComponentsHeader::addContextButton(const std::vector& v_button_names) { - cch_buttons = buttons; - v_cch_btn.clear(); - initDefaultButtons(); + for (size_t i= 0; i< v_button_names.size(); i++) + addContextButton(v_button_names[i]); } -// calculate minimal width of icon form -void CComponentsHeader::initButtonFormSize() +void CComponentsHeader::addContextButton(const int& buttons) { - cch_buttons_w = 0; - cch_buttons_h = 0; + if (buttons & CC_BTN_EXIT) + addContextButton(NEUTRINO_ICON_BUTTON_HOME); + if (buttons & CC_BTN_HELP) + addContextButton(NEUTRINO_ICON_BUTTON_HELP); + if (buttons & CC_BTN_INFO) + addContextButton(NEUTRINO_ICON_BUTTON_INFO); + if (buttons & CC_BTN_MENU) + addContextButton(NEUTRINO_ICON_BUTTON_MENU); +} - if (cch_btn_obj == NULL) - return; - - for(size_t i=0; igetIconSize(v_cch_btn[i].c_str(), &bw, &bh); - cch_buttons_w += (bw + cch_buttons_space); - cch_buttons_h = std::max(cch_buttons_h, bh); - } - cch_buttons_w -= cch_buttons_space; +void CComponentsHeader::removeContextButtons() +{ + dprintf(DEBUG_DEBUG, "[CComponentsHeader]\t [%s - %d] removing %u context buttons...\n", __func__, __LINE__, v_cch_btn.size()); + v_cch_btn.clear(); + if (cch_btn_obj) + cch_btn_obj->clear();; } void CComponentsHeader::initButtons() @@ -293,28 +263,21 @@ void CComponentsHeader::initButtons() //exit if no button defined if (v_cch_btn.empty()){ if (cch_btn_obj) - delete cch_btn_obj; - cch_btn_obj = NULL; + cch_btn_obj->clear(); //clean up, but hold instance return; } - - initButtonFormSize(); + //create instance for header buttons chain object and add to container if (cch_btn_obj == NULL){ - cch_btn_obj = new CComponentsIconForm(); dprintf(DEBUG_DEBUG, "[CComponentsHeader]\n [%s - %d] init header buttons...\n", __func__, __LINE__); + cch_btn_obj = new CComponentsIconForm(this); } - //add button form only one time - if (!cch_btn_obj->isAdded()) - addCCItem(cch_btn_obj); //buttons - //set button form properties if (cch_btn_obj){ - cch_btn_obj->setDimensionsAll(width-cch_offset-cch_buttons_w, cch_items_y, cch_buttons_w, cch_buttons_h); + cch_btn_obj->setDimensionsAll(0, cch_items_y, 0, 0); cch_btn_obj->doPaintBg(false); - cch_btn_obj->setIconOffset(cch_buttons_space); - cch_btn_obj->setIconAlign(CComponentsIconForm::CC_ICONS_FRM_ALIGN_RIGHT); + cch_btn_obj->setAppendOffset(cch_buttons_space, 0); cch_btn_obj->removeAllIcons(); cch_btn_obj->addIcon(v_cch_btn); @@ -348,8 +311,15 @@ void CComponentsHeader::initCaption() //calc width of text object in header cc_text_w = width-cch_text_x-cch_offset; - if (cch_buttons_w) - cc_text_w -= cch_buttons_w-cch_offset; + int buttons_w = 0; + if (cch_btn_obj){ + //get width of buttons object + buttons_w = cch_btn_obj->getWidth(); + //set x position of buttons + cch_btn_obj->setXPos(width - buttons_w); + } + //set required width of caption object + cc_text_w -= buttons_w-cch_offset; //create cch_text_obj and add to collection if (cch_text_obj == NULL){ @@ -367,7 +337,7 @@ void CComponentsHeader::initCaption() if (cch_caption_align == CTextBox::CENTER) cch_text_x = CC_CENTERED; cch_text_obj->setDimensionsAll(cch_text_x, cch_items_y, cc_text_w, height); - cch_text_obj->doPaintBg(false); + cch_text_obj->doPaintBg(true); cch_text_obj->setText(cch_text, cch_caption_align, cch_font); cch_text_obj->forceTextPaint(); //here required cch_text_obj->setTextColor(cch_col_text); diff --git a/src/gui/components/cc_frm_header.h b/src/gui/components/cc_frm_header.h index e4bad26c0..d30522d0b 100644 --- a/src/gui/components/cc_frm_header.h +++ b/src/gui/components/cc_frm_header.h @@ -53,7 +53,7 @@ class CComponentsHeader : public CComponentsForm CComponentsPicture * cch_icon_obj; ///object: caption object, see also setCaption() CComponentsText * cch_text_obj; - ///object: context button object, see also addButtonIcon(), removeButtonIcons() + ///object: context button object, see also addContextButton(), removeContextButtons() CComponentsIconForm * cch_btn_obj; ///property: caption text, see also setCaption() @@ -73,17 +73,11 @@ class CComponentsHeader : public CComponentsForm int cch_icon_w; ///property: internal x-position for caption object int cch_text_x; - ///property: internal context button definition button icons, see modes CC_BTN_HELP, CC_BTN_INFO, CC_BTN_MENU, CC_BTN_EXIT - int cch_buttons; - ///property: internal width for context button object - int cch_buttons_w; - ///property: internal height for context button object - int cch_buttons_h; ///property: internal offset of context button icons within context button object int cch_buttons_space; ///property: internal offset for header items int cch_offset; - ///property: internal container of icon names for context button object, see also addButtonIcon() + ///property: internal container of icon names for context button object, see also addContextButton() std::vector v_cch_btn; ///property: size of header, possible values are CC_HEADER_SIZE_LARGE, CC_HEADER_SIZE_SMALL int cch_size_mode; @@ -98,10 +92,6 @@ class CComponentsHeader : public CComponentsForm void initCaption(); ///sub: init context button object void initButtons(); - ///sub: init default buttons for context button object - void initDefaultButtons(); - ///sub: init default buttons for context button object - void initButtonFormSize(); public: enum @@ -143,10 +133,23 @@ class CComponentsHeader : public CComponentsForm ///set name of icon virtual void setIcon(const std::string& icon_name); - ///add separate button icons to context button object - virtual void addButtonIcon(const std::string& button_name); - ///remove button icons from context button object - virtual void removeButtonIcons(); + ///context buttons are to find on the right part of header + ///add a single context button icon to the header object, arg as string, icon will just add, existing icons are preserved + virtual void addContextButton(const std::string& button_name); + ///add a group of context button icons to the header object, arg as string vector, icons will just add, existing icons are preserved + virtual void addContextButton(const std::vector& v_button_names); + ///add a single context button icon or combined button icons to the header object, possible types are for example: CC_BTN_HELP, CC_BTN_INFO, CC_BTN_MENU, CC_BTN_EXIT + ///icons will just add, existing icons are preserved + virtual void addContextButton(const int& buttons); + ///remove context buttons from context button object + virtual void removeContextButtons(); + ///sets a single context button icon to the header object, arg as string, existing buttons are removed + virtual void setContextButton(const std::string& button_name){removeContextButtons(); addContextButton(button_name);}; + ///sets a group of context button icons to the header object, arg as string vector, existing buttons are removed + virtual void setContextButton(const std::vector& v_button_names){removeContextButtons(); addContextButton(v_button_names);}; + ///sets a single context button icon or combined button icons to the header object, possible types are for example: CC_BTN_HELP, CC_BTN_INFO, CC_BTN_MENU, CC_BTN_EXIT + ///existing buttons are removed + virtual void setContextButton(const int& buttons){removeContextButtons(); addContextButton(buttons);}; enum { @@ -156,8 +159,6 @@ class CComponentsHeader : public CComponentsForm CC_BTN_EXIT = 0x80 }; - ///set internal context button icons, possible modes CC_BTN_HELP, CC_BTN_INFO, CC_BTN_MENU, CC_BTN_EXIT - virtual void setDefaultButtons(const int buttons); ///set offset between icons within context button object virtual void setButtonsSpace(const int buttons_space){cch_buttons_space = buttons_space;}; diff --git a/src/gui/components/cc_frm_icons.cpp b/src/gui/components/cc_frm_icons.cpp index 926f25544..67349abf8 100644 --- a/src/gui/components/cc_frm_icons.cpp +++ b/src/gui/components/cc_frm_icons.cpp @@ -65,52 +65,52 @@ void CComponentsIconForm::initVarIconForm( const int &x_pos, const int &y_pos, c col_body = color_body; col_shadow = color_shadow; - ccif_offset = 2; - ccif_icon_align = CC_ICONS_FRM_ALIGN_LEFT; + chn_direction = CC_DIR_X; + + append_y_offset = 2; + + initChainItems(); initParent(parent); } void CComponentsIconForm::addIcon(const std::string& icon_name) { - v_icons.push_back(icon_name); + //create new cc-picture item object + CComponentsPicture *ccp = new CComponentsPicture(0, 0, 0, 0, icon_name, CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER, this); + ccp->doPaintBg(false); + + initChainItems(); } void CComponentsIconForm::addIcon(std::vector icon_name) { for (size_t i= 0; i< icon_name.size(); i++) - v_icons.push_back(icon_name[i]); + addIcon(icon_name[i]); } void CComponentsIconForm::insertIcon(const uint& icon_id, const std::string& icon_name) { - v_icons.insert(v_icons.begin()+icon_id, icon_name); + //create new cc-picture item object + CComponentsPicture *ccp = new CComponentsPicture(0, 0, 0, 0, icon_name, CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER); + ccp->doPaintBg(false); + + insertCCItem(icon_id, ccp); + initChainItems(); } void CComponentsIconForm::removeIcon(const uint& icon_id) { - v_icons.erase(v_icons.begin()+icon_id); -} - -void CComponentsIconForm::removeIcon(const std::string& icon_name) -{ - int id = getIconId(icon_name); - removeIcon(id); -} - -int CComponentsIconForm::getIconId(const std::string& icon_name) -{ - for (size_t i= 0; i< v_icons.size(); i++) - if (v_icons[i] == icon_name) - return i; - return -1; + removeCCItem(icon_id); + initChainItems(); } //For existing instances it's recommended //to remove old items before add new icons, otherwise icons will be appended. -void CComponentsIconForm::removeAllIcons() +void CComponentsIconForm::removeAllIcons()//TODO { clear(); v_icons.clear(); + initChainItems(); } //get maximal form height depends of biggest icon height, but don't touch defined form height @@ -123,72 +123,3 @@ void CComponentsIconForm::initMaxHeight(int *pheight) } } -void CComponentsIconForm::initCCIcons() -{ - int ccp_y = 0; - int ccp_h = 0; - int ccp_w = 0; - //calculate start pos of first icon - int ccp_x = 0 + fr_thickness; //CC_ICONS_FRM_ALIGN_LEFT; - - if (ccif_icon_align == CC_ICONS_FRM_ALIGN_RIGHT) - ccp_x += (width - fr_thickness); - - //get width of first icon - frameBuffer->getIconSize(v_icons[0].c_str(), &ccp_w, &ccp_h); - - //get maximal form height - int h = 0; - initMaxHeight(&h); - - //set xpos of first icon with right alignment, icon must positionized on the right border reduced with icon width - if (ccif_icon_align == CC_ICONS_FRM_ALIGN_RIGHT) - ccp_x -= ccp_w; - - //init and add item objects - size_t i_cnt = v_icons.size(); //icon count - - for (size_t i= 0; i< i_cnt; i++){ - //create new cc-picture item object - CComponentsPicture *ccp = new CComponentsPicture(ccp_x, ccp_y, ccp_w, h, v_icons[i]); - ccp->setPictureAlign(CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER); - ccp->doPaintBg(false); - //add item to form - addCCItem(ccp); - - //reset current width for next object - ccp_w = 0; - //get next icon size if available - size_t next_i = i+1; - if (next_i != i_cnt) - frameBuffer->getIconSize(v_icons[next_i].c_str(), &ccp_w, &ccp_h); - - //set next icon position - int tmp_offset = ( igetWidth() + tmp_offset); - if (ccif_icon_align == CC_ICONS_FRM_ALIGN_RIGHT) - ccp_x -= (ccp_w + tmp_offset); - } - - //calculate width and height of form - int w_tmp = 0; - int h_tmp = 0; - for (size_t i= 0; i< i_cnt; i++){ - w_tmp += v_cc_items[i]->getWidth()+ccif_offset+fr_thickness; - h_tmp = max(h_tmp, v_cc_items[i]->getHeight()+2*fr_thickness); - - } - width = max(w_tmp, width); - height = max(h_tmp, height); -} - -void CComponentsIconForm::paint(bool do_save_bg) -{ - //init and add icons - initCCIcons(); - - //paint form contents - paintForm(do_save_bg); -} diff --git a/src/gui/components/cc_frm_icons.h b/src/gui/components/cc_frm_icons.h index 6f48c195e..302294800 100644 --- a/src/gui/components/cc_frm_icons.h +++ b/src/gui/components/cc_frm_icons.h @@ -24,13 +24,12 @@ #ifndef __CC_FORM_ICONS_H__ #define __CC_FORM_ICONS_H__ -#include "cc_frm.h" +#include "cc_frm_chain.h" -class CComponentsIconForm : public CComponentsForm +class CComponentsIconForm : public CComponentsFrmChain { private: std::vector v_icons; - int ccif_offset, ccif_icon_align; void initMaxHeight(int *pheight); protected: @@ -52,25 +51,12 @@ class CComponentsIconForm : public CComponentsForm fb_pixel_t color_body = COL_MENUHEAD_PLUS_0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); // ~CComponentsIconForm(); //inherited from CComponentsForm - void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); - void initCCIcons(); void addIcon(const std::string& icon_name); void addIcon(std::vector icon_name); void removeIcons(){v_icons.clear();}; void insertIcon(const uint& icon_id, const std::string& icon_name); void removeIcon(const uint& icon_id); - void removeIcon(const std::string& icon_name); void removeAllIcons(); - void setIconOffset(const int offset){ccif_offset = offset;}; - - enum //alignements - { - CC_ICONS_FRM_ALIGN_RIGHT , - CC_ICONS_FRM_ALIGN_LEFT - }; - void setIconAlign(int alignment){ccif_icon_align = alignment;}; - - int getIconId(const std::string& icon_name); }; #endif diff --git a/src/gui/components/cc_frm_window.cpp b/src/gui/components/cc_frm_window.cpp index 2c92230a7..ed0d536ad 100644 --- a/src/gui/components/cc_frm_window.cpp +++ b/src/gui/components/cc_frm_window.cpp @@ -168,7 +168,7 @@ void CComponentsWindow::initHeader() ccw_head->setPos(0, 0); ccw_head->setIcon(ccw_icon_name); ccw_head->setCaption(ccw_caption, ccw_align_mode); - ccw_head->setDefaultButtons(ccw_buttons); + ccw_head->setContextButton(ccw_buttons); ccw_head->setCorner(corner_rad, CORNER_TOP); } } diff --git a/src/gui/pictureviewer.cpp b/src/gui/pictureviewer.cpp index 10e5b1123..633a3995e 100644 --- a/src/gui/pictureviewer.cpp +++ b/src/gui/pictureviewer.cpp @@ -709,7 +709,7 @@ void CPictureViewerGui::paintHead() CComponentsHeaderLocalized header(x, y, width, theight, LOCALE_PICTUREVIEWER_HEAD, NEUTRINO_ICON_MP3, CComponentsHeaderLocalized::CC_BTN_HELP); #ifdef ENABLE_GUI_MOUNT - header.addButtonIcon(NEUTRINO_ICON_BUTTON_MENU); + header.setContextButton(NEUTRINO_ICON_BUTTON_MENU); #endif header.paint(CC_SAVE_SCREEN_NO); diff --git a/src/gui/test_menu.cpp b/src/gui/test_menu.cpp index 5b758e3b8..34f892240 100644 --- a/src/gui/test_menu.cpp +++ b/src/gui/test_menu.cpp @@ -482,12 +482,12 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) int hh = 30;//g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); if (header == NULL){ header = new CComponentsHeader (100, 50, 500, hh, "Test-Header"/*, NEUTRINO_ICON_INFO, CComponentsHeader::CC_BTN_HELP | CComponentsHeader::CC_BTN_EXIT | CComponentsHeader::CC_BTN_MENU*/); -// header->addHeaderButton(NEUTRINO_ICON_BUTTON_RED); - header->setDefaultButtons(CComponentsHeader::CC_BTN_HELP | CComponentsHeader::CC_BTN_EXIT | CComponentsHeader::CC_BTN_MENU); + header->addContextButton(NEUTRINO_ICON_BUTTON_RED); + header->addContextButton(CComponentsHeader::CC_BTN_HELP | CComponentsHeader::CC_BTN_EXIT | CComponentsHeader::CC_BTN_MENU); } -// else //For existing instances it's recommended -// //to remove old button icons before add new buttons, otherwise icons will be appended. -// header->removeHeaderButtons(); + else //For existing instances it's recommended to remove old button icons before add new buttons, + //otherwise icons will be appended to already existant icons, alternatively use the setContextButton() methode + header->removeContextButtons(); // example to manipulate header items // header->setFrameThickness(5); @@ -497,9 +497,19 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) // change text of header header->setCaption("Test"); -// add any other button icon -// header->addButton(NEUTRINO_ICON_BUTTON_BLUE); -// header->addButton(NEUTRINO_ICON_BUTTON_GREEN); + //add context buttons via vector +// vector v_buttons; +// v_buttons.push_back(NEUTRINO_ICON_BUTTON_YELLOW); +// v_buttons.push_back(NEUTRINO_ICON_BUTTON_RED); +// header->addContextButton(v_buttons); +// +// // add any other button icon via string +// header->addContextButton(NEUTRINO_ICON_BUTTON_BLUE); +// header->addContextButton(NEUTRINO_ICON_BUTTON_GREEN); +// header->addContextButton(CComponentsHeader::CC_BTN_HELP | CComponentsHeader::CC_BTN_EXIT | CComponentsHeader::CC_BTN_MENU); + +// set a single button, this will also remove all existant context button icons from header +// header->setContextButton(NEUTRINO_ICON_HINT_AUDIO); // example to replace the text item with an image item // get text x position @@ -540,11 +550,12 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) if (iconform == NULL) iconform = new CComponentsIconForm(); iconform->setColorBody(COL_LIGHT_GRAY); - iconform->setDimensionsAll(100, 100, 480, 60); + iconform->setDimensionsAll(100, 100,80/*480*/, 80); iconform->setFrameThickness(2); iconform->setColorFrame(COL_WHITE); - iconform->setIconOffset(5); - iconform->setIconAlign(CComponentsIconForm::CC_ICONS_FRM_ALIGN_RIGHT); + iconform->setDirection(CC_DIR_X); + iconform->setAppendOffset(5, 5); + //For existing instances it's recommended //to remove old items before add new icons, otherwise icons will be appended. iconform->removeAllIcons(); diff --git a/src/gui/upnpbrowser.cpp b/src/gui/upnpbrowser.cpp index cdb02fce1..ebbf3dc29 100644 --- a/src/gui/upnpbrowser.cpp +++ b/src/gui/upnpbrowser.cpp @@ -956,7 +956,7 @@ void CUpnpBrowserGui::paintDevices() // Head CComponentsHeaderLocalized header(m_x, m_y + m_title_height, m_width, m_theight, LOCALE_UPNPBROWSER_HEAD, NEUTRINO_ICON_UPNP); if (CNeutrinoApp::getInstance()->isMuted()) - header.addButtonIcon(NEUTRINO_ICON_BUTTON_MUTE_SMALL); + header.addContextButton(NEUTRINO_ICON_BUTTON_MUTE_SMALL); header.paint(CC_SAVE_SCREEN_NO); // Items @@ -1130,7 +1130,7 @@ printf("CUpnpBrowserGui::paintItem:s selected %d max %d offset %d\n", selected, name += m_devices[m_selecteddevice].friendlyname; CComponentsHeader header(m_x, m_y + m_title_height, m_width, m_theight, name, NEUTRINO_ICON_UPNP); if (CNeutrinoApp::getInstance()->isMuted()) - header.addButtonIcon(NEUTRINO_ICON_BUTTON_MUTE_SMALL); + header.setContextButton(NEUTRINO_ICON_BUTTON_MUTE_SMALL); header.paint(CC_SAVE_SCREEN_NO); // Items