CComponentsForm: add some usefull slots/signal to help paint backgrounds

Requried to paint form items only on changed contents and on repaint
This commit is contained in:
2017-01-24 23:27:44 +01:00
committed by M. Liebmann
parent 384e98c089
commit 5c8aa90e01
5 changed files with 46 additions and 34 deletions

View File

@@ -335,7 +335,7 @@ void CComponentsForm::exchangeCCItem(CComponentsItem* item_a, CComponentsItem* i
void CComponentsForm::paintForm(bool do_save_bg) void CComponentsForm::paintForm(bool do_save_bg)
{ {
//paint body //paint body
if (!is_painted) if (!is_painted || force_paint_bg)
paintInit(do_save_bg); paintInit(do_save_bg);
//paint //paint
@@ -520,23 +520,7 @@ void CComponentsForm::paintCCItems()
cc_item->allowPaint(item_visible); cc_item->allowPaint(item_visible);
} }
} }
#if 0
void CComponentsForm::hide()
{
// hack: ensure hiding of minitv during hide of forms and inherited classes,
// because the handling of minitv items are different to other item types
// and need an explizit call of hide()
for(size_t i=0; i<v_cc_items.size(); i++) {
if (v_cc_items[i]->getItemType() == CC_ITEMTYPE_PIP){
v_cc_items[i]->kill();
break;
}
}
//hide body
CComponents::hide();
}
#endif
//erase or paint over rendered objects //erase or paint over rendered objects
void CComponentsForm::killCCItems(const fb_pixel_t& bg_color, bool ignore_parent) void CComponentsForm::killCCItems(const fb_pixel_t& bg_color, bool ignore_parent)
{ {
@@ -693,3 +677,21 @@ bool CComponentsForm::enableColBodyGradient(const int& enable_mode, const fb_pix
} }
return false; return false;
} }
void CComponentsForm::forceItemsPaint(bool force)
{
dprintf(DEBUG_NORMAL, "\033[33m[CComponentsForm] [%s - %d] try to detect items [%u] with possible required background repaint \033[0m\n", __func__, __LINE__, v_cc_items.size());
for (size_t i = 0; i < v_cc_items.size(); i++){
dprintf(DEBUG_NORMAL, "\033[33m[CComponentsForm] [%s - %d] found item type = [%d] \033[0m\n", __func__, __LINE__, v_cc_items[i]->getItemType());
if (v_cc_items[i]->getItemType() == CC_ITEMTYPE_TEXT){
CComponentsText* text = static_cast <CComponentsText*>(v_cc_items[i]);
text->forceTextPaint(force);
dprintf(DEBUG_NORMAL, "\033[33m[CComponentsForm] [%s - %d] force repaint of item type CC_ITEMTYPE_TEXT [%u] content [%s]\033[0m\n", __func__, __LINE__, i, text->getText().c_str());
}
if (v_cc_items[i]->getItemType() == CC_ITEMTYPE_LABEL){
CComponentsLabel* label = static_cast <CComponentsLabel*>(v_cc_items[i]);
label ->forceTextPaint(force);
dprintf(DEBUG_NORMAL, "\033[33m[CComponentsForm] [%s - %d] force repaint of item type CC_ITEMTYPE_LABEL [%u] content [%s]\033[0m\n", __func__, __LINE__, i, label->getText().c_str());
}
}
}

View File

@@ -65,6 +65,11 @@ class CComponentsForm : public CComponentsItem
const fb_pixel_t& color_body, const fb_pixel_t& color_body,
const fb_pixel_t& color_shadow); const fb_pixel_t& color_shadow);
///force repaint of all possible text items
void forceItemsPaint(bool force);
///slot for background paint event, reserved for forceItemsPaint()
sigc::slot0<void> sl_repaint;
public: public:
CComponentsForm( const int x_pos = 0, const int y_pos = 0, const int w = 800, const int h = 600, CComponentsForm( const int x_pos = 0, const int y_pos = 0, const int w = 800, const int h = 600,
CComponentsForm *parent = NULL, CComponentsForm *parent = NULL,

View File

@@ -101,7 +101,7 @@ CComponentsFrmClock::CComponentsFrmClock( const int& x_pos,
cl_sl_show = sigc::mem_fun0(*this, &CComponentsFrmClock::ShowTime); cl_sl_show = sigc::mem_fun0(*this, &CComponentsFrmClock::ShowTime);
//init slot to ensure paint segments after painted background //init slot to ensure paint segments after painted background
cl_sl_repaint = sigc::bind<0>(sigc::mem_fun1(*this, &CComponentsFrmClock::forceSegemnentsPaint), true); sl_repaint = sigc::bind<0>(sigc::mem_fun1(*this, &CComponentsFrmClock::forceItemsPaint), true);
//run clock already if required //run clock already if required
if (activ) if (activ)
@@ -301,10 +301,10 @@ void CComponentsFrmClock::initCCLockItems()
v_cc_items[i]->setPos(x_lbl, y_lbl); v_cc_items[i]->setPos(x_lbl, y_lbl);
} }
if(!OnAfterPaintBg.empty())
OnAfterPaintBg.clear();
//init slot to handle repaint of segments if background was repainted //init slot to handle repaint of segments if background was repainted
OnAfterPaintBg.clear(); OnAfterPaintBg.connect(sl_repaint);
if (paint_bg)
OnAfterPaintBg.connect(cl_sl_repaint);
} }
@@ -330,6 +330,7 @@ bool CComponentsFrmClock::startClock()
if (cl_timer->OnTimer.empty()){ if (cl_timer->OnTimer.empty()){
dprintf(DEBUG_INFO,"\033[33m[CComponentsFrmClock]\t[%s] init slot...\033[0m\n", __func__); dprintf(DEBUG_INFO,"\033[33m[CComponentsFrmClock]\t[%s] init slot...\033[0m\n", __func__);
cl_timer->OnTimer.connect(cl_sl_show); cl_timer->OnTimer.connect(cl_sl_show);
force_paint_bg = true;
} }
} }
cl_timer->setTimerInterval(cl_interval); cl_timer->setTimerInterval(cl_interval);
@@ -381,8 +382,12 @@ void CComponentsFrmClock::paint(bool do_save_bg)
//prepare items before paint //prepare items before paint
initCCLockItems(); initCCLockItems();
if (!is_painted)
force_paint_bg = false;
//paint form contents //paint form contents
CComponentsForm::paint(do_save_bg); CComponentsForm::paint(do_save_bg);
} }
void CComponentsFrmClock::setClockFont(Font *font, const int& style) void CComponentsFrmClock::setClockFont(Font *font, const int& style)
@@ -455,9 +460,3 @@ bool CComponentsFrmClock::enableColBodyGradient(const int& enable_mode, const fb
} }
return false; return false;
} }
void CComponentsFrmClock::forceSegemnentsPaint(bool force)
{
for (size_t i = 0; i < v_cc_items.size(); i++)
static_cast <CComponentsLabel*>(v_cc_items[i])->forceTextPaint(force);
}

View File

@@ -54,9 +54,6 @@ class CComponentsFrmClock : public CComponentsForm, public CCTextScreen
///slot for timer event, reserved for ShowTime() ///slot for timer event, reserved for ShowTime()
sigc::slot0<void> cl_sl_show; sigc::slot0<void> cl_sl_show;
///slot for background paint event, reserved for initCCLockItems()
sigc::slot0<void> cl_sl_repaint;
///refresh interval in seconds ///refresh interval in seconds
int cl_interval; int cl_interval;
@@ -93,8 +90,6 @@ class CComponentsFrmClock : public CComponentsForm, public CCTextScreen
void toggleFormat(); void toggleFormat();
///init internal font ///init internal font
void initClockFont(int dx, int dy); void initClockFont(int dx, int dy);
///force repaint of all segments
void forceSegemnentsPaint(bool force);
public: public:

View File

@@ -30,6 +30,9 @@
#include <neutrino.h> #include <neutrino.h>
#include "cc_frm_header.h" #include "cc_frm_header.h"
#include <system/debug.h> #include <system/debug.h>
#include <sigc++/bind.h>
using namespace std; using namespace std;
//------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------
@@ -133,6 +136,9 @@ void CComponentsHeader::initVarHeader( const int& x_pos, const int& y_pos, const
cch_cl_sec_format = cch_cl_format; cch_cl_sec_format = cch_cl_format;
cch_cl_enable_run = false; cch_cl_enable_run = false;
//init slot to ensure paint segments after painted background
sl_repaint = sigc::bind<0>(sigc::mem_fun1(*this, &CComponentsHeader::forceItemsPaint), true);
addContextButton(buttons); addContextButton(buttons);
initCCItems(); initCCItems();
initParent(parent); initParent(parent);
@@ -517,6 +523,11 @@ void CComponentsHeader::initCaption()
*/ */
//height = max(height, cch_text_obj->getHeight()); //height = max(height, cch_text_obj->getHeight());
} }
if(!OnAfterPaintBg.empty())
OnAfterPaintBg.clear();
//init slot to handle repaint of text if background was repainted
OnAfterPaintBg.connect(sl_repaint);
} }
void CComponentsHeader::initCCItems() void CComponentsHeader::initCCItems()
@@ -539,12 +550,12 @@ void CComponentsHeader::initCCItems()
//init text //init text
initCaption(); initCaption();
} }
void CComponentsHeader::paint(bool do_save_bg) void CComponentsHeader::paint(bool do_save_bg)
{ {
//prepare items //prepare items
initCCItems(); initCCItems();
//paint form contents //paint form contents
CComponentsForm::paint(do_save_bg); CComponentsForm::paint(do_save_bg);