mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-29 08:21:12 +02:00
CComponentsHeader: rework and simplified logo handling
This should fix some issues with possible overlapps of logos with title. With some Conditions with text alignment on the right side needs a fix. There is an issue with size and position of text object, but is stll not used at the moment. For all other conditions of logo and text alignments now it should be not a problem (I hope) and have more code clarity.
This commit is contained in:
@@ -273,6 +273,7 @@ void CComponentsHeader::initIcon()
|
||||
|
||||
void CComponentsHeader::initLogo()
|
||||
{
|
||||
// init logo with required height and logo
|
||||
int h_logo = cch_logo.dy_max == -1 ? height - 2*OFFSET_INNER_MIN : cch_logo.dy_max;
|
||||
|
||||
if(!cch_logo_obj)
|
||||
@@ -291,70 +292,71 @@ void CComponentsHeader::initLogo()
|
||||
h_logo = dy_orig;
|
||||
}
|
||||
|
||||
//cch_logo_obj->setWidth(1, true);
|
||||
// manage logo position
|
||||
if (cch_logo_obj->hasLogo()){
|
||||
cch_logo_obj->setHeight(h_logo, true);
|
||||
|
||||
// set id of logo item depends of neighbor items
|
||||
/* Detect next and previous items,
|
||||
* current item is logo item.
|
||||
*/
|
||||
int logo_id = getCCItemId(cch_logo_obj);
|
||||
int prev_id = logo_id - 1;
|
||||
CComponentsItem *prev_item = getCCItem((cch_caption_align & CC_TITLE_RIGHT) ? logo_id - 2 : logo_id - 1);
|
||||
CComponentsItem *next_item = getCCItem((cch_caption_align & CC_TITLE_RIGHT) ? logo_id - 1 : logo_id + 1);
|
||||
|
||||
//right end
|
||||
int x_logo_right = width - cch_logo_obj->getWidth();
|
||||
if (!(cch_caption_align & CC_TITLE_RIGHT)){
|
||||
if (cch_btn_obj)
|
||||
x_logo_right -= cch_btn_obj->getWidth();
|
||||
if (cch_cl_obj)
|
||||
x_logo_right -= cch_cl_obj->getWidth();
|
||||
}else{
|
||||
if (cch_icon_obj)
|
||||
x_logo_right += cch_icon_obj->getWidth();
|
||||
/*
|
||||
* FIXME: Workaround to fix next item in case of wrong order of items.
|
||||
*/
|
||||
if (next_item){
|
||||
if (next_item->getItemType() == CC_ITEMTYPE_FRM_ICONFORM)
|
||||
next_item = cch_cl_obj;
|
||||
}
|
||||
|
||||
//left end
|
||||
int x_logo_left = cch_offset;
|
||||
if (!(cch_caption_align & CC_TITLE_RIGHT))
|
||||
x_logo_left = getCCItem(prev_id) ? getCCItem(prev_id)->getXPos() + getCCItem(prev_id)->getWidth() : 0;
|
||||
else
|
||||
if (cch_icon_obj)
|
||||
x_logo_left += cch_icon_obj->getWidth();
|
||||
/*
|
||||
* Adjust usable space for logo.
|
||||
*/
|
||||
int x_logo_left = prev_item ? prev_item->getXPos() + prev_item->getWidth() : cch_offset;
|
||||
int x_logo_right = next_item ? next_item->getXPos() : width - cch_offset;
|
||||
int logo_space = x_logo_right - x_logo_left;
|
||||
|
||||
//calculate available space
|
||||
int logo_space = x_logo_right + cch_logo_obj->getWidth() - x_logo_left;
|
||||
|
||||
//reduce logo width if logo space too small
|
||||
/*
|
||||
* Reduce logo width if logo space too small
|
||||
* and adjust logo new width if required.
|
||||
*/
|
||||
int w_logo = min(cch_logo_obj->getWidth(), logo_space);
|
||||
cch_logo_obj->setWidth(w_logo, true);
|
||||
|
||||
//set final logo position
|
||||
int x_logo = 0;
|
||||
if (cch_logo.Align & CC_LOGO_RIGHT){
|
||||
if (cch_caption_align & CC_TITLE_RIGHT){
|
||||
if (cch_text_obj)
|
||||
x_logo = cch_text_obj->getXPos() - cch_logo_obj->getWidth();
|
||||
}else
|
||||
x_logo = x_logo_right;
|
||||
}
|
||||
/*
|
||||
* Adjust logo x position depends of align parameters.
|
||||
*/
|
||||
int x_logo = x_logo_left;
|
||||
if (cch_logo.Align & CC_LOGO_RIGHT)
|
||||
x_logo = x_logo_right - w_logo;
|
||||
|
||||
if (cch_logo.Align & CC_LOGO_LEFT)
|
||||
x_logo = x_logo_left;
|
||||
|
||||
if (cch_logo.Align & CC_LOGO_CENTER){
|
||||
x_logo = width/2 - cch_logo_obj->getWidth()/2;
|
||||
//fallback if adjacent item and logo are overlapping
|
||||
if (!(cch_caption_align & CC_TITLE_RIGHT)){
|
||||
if (getCCItem(prev_id)){
|
||||
int x_tmp = x_logo_left + logo_space/2 - cch_logo_obj->getWidth()/2;
|
||||
if (x_logo <= x_logo_left)
|
||||
x_logo = x_tmp;
|
||||
}
|
||||
}else{
|
||||
if (cch_text_obj){
|
||||
if (x_logo + cch_logo_obj->getWidth() >= cch_text_obj->getXPos()){
|
||||
x_logo = (x_logo_left + cch_text_obj->getXPos())/2 - cch_logo_obj->getWidth()/2;
|
||||
}
|
||||
x_logo = logo_space/2 - w_logo/2;
|
||||
/*
|
||||
* We are using centered mode as default,
|
||||
* but we must notice possible overlapp
|
||||
* with previous or next item.
|
||||
*/
|
||||
if (cch_caption_align & CC_TITLE_LEFT){
|
||||
int left_tag = prev_item->getXPos() + prev_item->getWidth();
|
||||
if (x_logo <= left_tag)
|
||||
x_logo = left_tag + logo_space/2 - w_logo/2;
|
||||
}
|
||||
|
||||
if (cch_caption_align & CC_TITLE_RIGHT){
|
||||
if (x_logo + w_logo >= next_item->getXPos())
|
||||
x_logo = next_item->getXPos() - logo_space/2 - w_logo/2;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally set logo x position
|
||||
*/
|
||||
cch_logo_obj->setXPos(x_logo);
|
||||
cch_logo_obj->setYPos(height/2 - cch_logo_obj->getHeight()/2);
|
||||
}
|
||||
@@ -547,7 +549,7 @@ void CComponentsHeader::initCaption()
|
||||
}
|
||||
|
||||
//calc width of text object in header
|
||||
cc_text_w = width-cch_text_x-cch_offset;
|
||||
cc_text_w = width-cch_text_x/*-cch_offset*/;
|
||||
|
||||
//context buttons
|
||||
int buttons_w = 0;
|
||||
@@ -601,15 +603,15 @@ void CComponentsHeader::initCaption()
|
||||
int w_free = cc_text_w;
|
||||
|
||||
//recalc caption width
|
||||
cc_text_w = min(cc_text_w, cch_font->getRenderWidth(cch_text)+ OFFSET_INNER_MID);
|
||||
cc_text_w = min(cc_text_w, cch_font->getRenderWidth(cch_text)) + cch_offset;
|
||||
|
||||
//set alignment of text item in dependency from text alignment
|
||||
if (cch_caption_align & CC_TITLE_CENTER)
|
||||
cch_text_x = width/2 - cc_text_w/2;
|
||||
|
||||
if (cch_caption_align & CC_TITLE_RIGHT){
|
||||
if (cch_caption_align & CC_TITLE_RIGHT){ //FIXME: does not work correct with some conditions, but still not used at the moment
|
||||
cch_text_x += w_free;
|
||||
cch_text_x -= max(cc_text_w, cch_font->getRenderWidth(cch_text)+ OFFSET_INNER_MID);
|
||||
cch_text_x -= max(cc_text_w, cch_font->getRenderWidth(cch_text));
|
||||
}
|
||||
|
||||
//assign general properties
|
||||
|
@@ -32,7 +32,7 @@
|
||||
#include "cc_frm_clock.h"
|
||||
#include <driver/colorgradient.h>
|
||||
|
||||
#define DEFAULT_LOGO_ALIGN CCHeaderTypes::CC_LOGO_CENTER
|
||||
#define DEFAULT_LOGO_ALIGN CCHeaderTypes::CC_LOGO_RIGHT
|
||||
#define DEFAULT_TITLE_ALIGN CCHeaderTypes::CC_TITLE_LEFT
|
||||
|
||||
class CCHeaderTypes
|
||||
|
Reference in New Issue
Block a user