- cc_frm_header: rework positions/dimensions calculations

This commit is contained in:
svenhoefer
2013-05-30 21:51:12 +02:00
parent 2c0838eb06
commit b318c15895
3 changed files with 73 additions and 38 deletions

View File

@@ -111,7 +111,7 @@ class CComponentsHeader : public CComponentsForm
const char* cch_icon_name; const char* cch_icon_name;
fb_pixel_t cch_col_text; fb_pixel_t cch_col_text;
Font* cch_font; Font* cch_font;
int cch_icon_x, cch_items_y, cch_text_x, ccif_width, cch_icon_w, cch_buttons, cch_btn_offset; int cch_items_y, cch_icon_x, cch_icon_w, cch_text_x, cch_buttons, cch_buttons_w, cch_buttons_h, cch_buttons_space, cch_offset;
std::vector<std::string> v_cch_btn; std::vector<std::string> v_cch_btn;
void initIcon(); void initIcon();
@@ -150,11 +150,12 @@ class CComponentsHeader : public CComponentsForm
virtual void setCaption(neutrino_locale_t caption_locale); virtual void setCaption(neutrino_locale_t caption_locale);
virtual void setCaptionFont(Font* font_name); virtual void setCaptionFont(Font* font_name);
virtual void setCaptionColor(fb_pixel_t text_color){cch_col_text = text_color;}; virtual void setCaptionColor(fb_pixel_t text_color){cch_col_text = text_color;};
virtual void setButtonOffset(const int offset){cch_btn_offset = offset;}; virtual void setOffset(const int offset){cch_offset = offset;};
virtual void setIcon(const char* icon_name); virtual void setIcon(const char* icon_name);
virtual void addButtonIcon(const std::string& button_name); virtual void addButtonIcon(const std::string& button_name);
virtual void removeButtonIcons(); virtual void removeButtonIcons();
virtual void setDefaultButtons(const int buttons); virtual void setDefaultButtons(const int buttons);
virtual void setButtonsSpace(const int buttons_space){cch_buttons_space = buttons_space;};
virtual void initCCItems(); virtual void initCCItems();
void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); void paint(bool do_save_bg = CC_SAVE_SCREEN_YES);

View File

@@ -109,15 +109,15 @@ void CComponentsHeader::initVarHeader()
cch_text = ""; cch_text = "";
cch_col_text = COL_MENUHEAD; cch_col_text = COL_MENUHEAD;
cch_items_y = 0; cch_items_y = 0;
cch_icon_x = 0; cch_offset = 8;
cch_icon_w = 5; cch_icon_x = cch_offset;
cch_text_x = 0; cch_icon_w = 0;
ccif_width = 0; cch_text_x = cch_offset;
cch_buttons = 0; cch_buttons = 0;
cch_btn_offset = 8; cch_buttons_w = 0;
cch_buttons_h = 0;
cch_buttons_space = cch_offset;
v_cch_btn.clear(); v_cch_btn.clear();
} }
CComponentsHeader::~CComponentsHeader() CComponentsHeader::~CComponentsHeader()
@@ -152,12 +152,9 @@ void CComponentsHeader::setIcon(const char* icon_name)
void CComponentsHeader::initIcon() void CComponentsHeader::initIcon()
{ {
//reset cch_icon_w
cch_icon_w = cch_btn_offset;
//init cch_icon_obj only if an icon available //init cch_icon_obj only if an icon available
if (cch_icon_name == NULL) { if (cch_icon_name == NULL) {
cch_icon_w = cch_btn_offset; cch_icon_w = 0;
if (cch_icon_obj) if (cch_icon_obj)
delete cch_icon_obj; delete cch_icon_obj;
cch_icon_obj = NULL; cch_icon_obj = NULL;
@@ -174,12 +171,16 @@ void CComponentsHeader::initIcon()
addCCItem(cch_icon_obj); //icon addCCItem(cch_icon_obj); //icon
} }
//get dimensions of header icon
int iw, ih;
frameBuffer->getIconSize(cch_icon_name, &iw, &ih);
//set properties for icon object //set properties for icon object
if (cch_icon_obj){ if (cch_icon_obj){
cch_icon_obj->setWidth(height-2*fr_thickness); cch_icon_obj->setWidth(iw);
cch_icon_obj->setHeight(height); cch_icon_obj->setHeight(ih);
cch_icon_obj->setPictureAlign(CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER);
cch_icon_obj->doPaintBg(false); cch_icon_obj->doPaintBg(false);
cch_icon_obj->setPictureAlign(CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER);
//set corner mode of icon item //set corner mode of icon item
cch_icon_obj->setCornerRadius(corner_rad-fr_thickness); cch_icon_obj->setCornerRadius(corner_rad-fr_thickness);
@@ -190,11 +191,14 @@ void CComponentsHeader::initIcon()
cc_icon_corner_type = CORNER_LEFT; cc_icon_corner_type = CORNER_LEFT;
cch_icon_obj->setCornerType(cc_icon_corner_type); cch_icon_obj->setCornerType(cc_icon_corner_type);
//set width of icon object //global set width of icon object
cch_icon_w = cch_icon_obj->getWidth(); cch_icon_w = cch_icon_obj->getWidth();
//adapt height //global adapt height
height = max(height, cch_icon_obj->getHeight()); height = max(height, cch_icon_obj->getHeight());
//re-align height of icon object
cch_icon_obj->setHeight(height);
} }
} }
@@ -209,7 +213,6 @@ void CComponentsHeader::removeButtonIcons()
v_cch_btn.clear(); v_cch_btn.clear();
cch_btn_obj->removeAllIcons(); cch_btn_obj->removeAllIcons();
initButtons(); initButtons();
} }
void CComponentsHeader::initDefaultButtons() void CComponentsHeader::initDefaultButtons()
@@ -237,12 +240,15 @@ void CComponentsHeader::setDefaultButtons(const int buttons)
// calculate minimal width of icon form // calculate minimal width of icon form
void CComponentsHeader::initButtonFormSize() void CComponentsHeader::initButtonFormSize()
{ {
ccif_width = 0; cch_buttons_w = 0;
cch_buttons_h = 0;
for(size_t i=0; i<v_cch_btn.size(); i++){ for(size_t i=0; i<v_cch_btn.size(); i++){
int bw, bh; int bw, bh;
frameBuffer->getIconSize(v_cch_btn[i].c_str(), &bw, &bh); frameBuffer->getIconSize(v_cch_btn[i].c_str(), &bw, &bh);
ccif_width += (bw + cch_btn_offset); cch_buttons_w += (bw + cch_buttons_space);
cch_buttons_h = std::max(cch_buttons_h, bh);
} }
cch_buttons_w -= cch_buttons_space;
} }
void CComponentsHeader::initButtons() void CComponentsHeader::initButtons()
@@ -264,25 +270,50 @@ void CComponentsHeader::initButtons()
//set button form properties //set button form properties
if (cch_btn_obj){ if (cch_btn_obj){
cch_btn_obj->setDimensionsAll(0+width-ccif_width, 0, ccif_width-cch_btn_offset, height); cch_btn_obj->setDimensionsAll(width-cch_offset-cch_buttons_w, cch_items_y, cch_buttons_w, cch_buttons_h);
cch_btn_obj->doPaintBg(false); cch_btn_obj->doPaintBg(false);
cch_btn_obj->setIconOffset(cch_btn_offset); cch_btn_obj->setIconOffset(cch_buttons_space);
cch_btn_obj->setIconAlign(CComponentsIconForm::CC_ICONS_FRM_ALIGN_RIGHT); cch_btn_obj->setIconAlign(CComponentsIconForm::CC_ICONS_FRM_ALIGN_RIGHT);
cch_btn_obj->removeAllIcons(); cch_btn_obj->removeAllIcons();
cch_btn_obj->addIcon(v_cch_btn); cch_btn_obj->addIcon(v_cch_btn);
//set corner mode of button item
cch_btn_obj->setCornerRadius(corner_rad-fr_thickness);
int cc_btn_corner_type = corner_type;
if (corner_type == CORNER_TOP_RIGHT || corner_type == CORNER_TOP)
cc_btn_corner_type = CORNER_TOP_RIGHT;
else
cc_btn_corner_type = CORNER_RIGHT;
cch_btn_obj->setCornerType(cc_btn_corner_type);
//global adapt height
height = max(height, cch_btn_obj->getHeight()); height = max(height, cch_btn_obj->getHeight());
//re-align height of button object
cch_btn_obj->setHeight(height);
//re-align height of icon object
if (cch_icon_obj)
cch_icon_obj->setHeight(height);
} }
} }
void CComponentsHeader::initCaption() void CComponentsHeader::initCaption()
{ {
//reset header text position first //recalc header text position if header icon is defined
cch_text_x = cch_icon_x+cch_icon_w; if (cch_icon_name != NULL){
cch_text_x = cch_icon_x+cch_icon_w+cch_offset;
}
//calc width of text object in header
int cc_text_w = width-cch_text_x-cch_offset;
if (cch_buttons_w)
cc_text_w -= cch_buttons_w-cch_offset;
//create cch_text_obj and add to collection //create cch_text_obj and add to collection
if (cch_text_obj == NULL){ if (cch_text_obj == NULL){
#ifdef DEBUG_CC #ifdef DEBUG_CC
printf(" [CComponentsHeader]\n [%s - %d] init header text: %s\n", __FUNCTION__, __LINE__, cch_text.c_str()); printf(" [CComponentsHeader]\n [%s - %d] init header text: %s [ x %d w %d ]\n", __FUNCTION__, __LINE__, cch_text.c_str(), cch_text_x, cc_text_w);
#endif #endif
cch_text_obj = new CComponentsText(); cch_text_obj = new CComponentsText();
//add text item //add text item
@@ -291,19 +322,22 @@ void CComponentsHeader::initCaption()
//set header text properties //set header text properties
if (cch_text_obj){ if (cch_text_obj){
cch_text_obj->setText(cch_text, CTextBox::AUTO_WIDTH, cch_font); cch_text_obj->setDimensionsAll(cch_text_x, cch_items_y, cc_text_w, height);
cch_text_obj->doPaintBg(false);
cch_text_obj->setText(cch_text, CTextBox::TOP | CTextBox::NO_AUTO_LINEBREAK, cch_font);
cch_text_obj->forceTextPaint(); //here required cch_text_obj->forceTextPaint(); //here required
cch_text_obj->setDimensionsAll(cch_text_x, cch_items_y, width-cch_icon_w-fr_thickness, height-2*fr_thickness);
cch_text_obj->setTextColor(cch_col_text); cch_text_obj->setTextColor(cch_col_text);
cch_text_obj->setColorBody(col_body); cch_text_obj->setColorBody(col_body);
cch_text_obj->doPaintBg(false);
//corner of text item //corner of text item
cch_text_obj->setCornerRadius(corner_rad-fr_thickness); cch_text_obj->setCornerRadius(corner_rad-fr_thickness);
cch_text_obj->setCornerType(corner_type); cch_text_obj->setCornerType(corner_type);
//get height /*
height = max(height, cch_text_obj->getHeight()); global adapt height not needed here again
because this object is initialized at last
*/
//height = max(height, cch_text_obj->getHeight());
} }
} }
@@ -312,11 +346,11 @@ void CComponentsHeader::initCCItems()
//init icon //init icon
initIcon(); initIcon();
//init text
initCaption();
//init buttons //init buttons
initButtons(); initButtons();
//init text
initCaption();
} }
void CComponentsHeader::paint(bool do_save_bg) void CComponentsHeader::paint(bool do_save_bg)

View File

@@ -142,7 +142,7 @@ void CComponentsText::initCCText()
ct_text_sent = ct_textbox->setText(&ct_text, ct_box->iWidth); ct_text_sent = ct_textbox->setText(&ct_text, ct_box->iWidth);
ct_old_text = ct_text; ct_old_text = ct_text;
#ifdef DEBUG_CC #ifdef DEBUG_CC
printf(" [CComponentsText] [%s - %d] init text: %s [x %d, y %d, h %d, w %d]\n", __FUNCTION__, __LINE__, ct_text.c_str(), ct_box->iX, ct_box->iY, height, width); printf(" [CComponentsText] [%s - %d] init text: %s [x %d, y %d, w %d, h %d]\n", __FUNCTION__, __LINE__, ct_text.c_str(), ct_box->iX, ct_box->iY, ct_box->iWidth, ct_box->iHeight);
#endif #endif
} }