void GenericLayout::onControlUpdate( const CtrlGeneric &rCtrl, int width, int height, int xOffSet, int yOffSet ) { // The size is not valid, refresh the whole layout if( width <= 0 || height <= 0 ) { refreshAll(); return; } const Position *pPos = rCtrl.getPosition(); if( pPos ) { refreshRect( pPos->getLeft() + xOffSet, pPos->getTop() + yOffSet, width, height ); } }
void GenericLayout::onControlUpdate( const CtrlGeneric &rCtrl, int width, int height, int xOffSet, int yOffSet ) { // Do nothing if the layout or control is hidden if( !m_visible ) return; const Position *pPos = rCtrl.getPosition(); if( width > 0 && height > 0 ) { // make sure region is within the layout rect region( pPos->getLeft() + xOffSet, pPos->getTop() + yOffSet, width, height ); rect layout( 0, 0, m_rect.getWidth(), m_rect.getHeight() ); rect inter; if( rect::intersect( layout, region, &inter ) ) { refreshRect( inter.x, inter.y, inter.width, inter.height ); } } }
void GenericLayout::refreshRect( int x, int y, int width, int height ) { // Do nothing if the layout is hidden if( !m_visible ) return; // Draw all the controls of the layout list<LayeredControl>::const_iterator iter; list<LayeredControl>::const_iterator iterVideo = m_controlList.end(); for( iter = m_controlList.begin(); iter != m_controlList.end(); iter++ ) { CtrlGeneric *pCtrl = (*iter).m_pControl; const Position *pPos = pCtrl->getPosition(); if( pPos && pCtrl->isVisible() ) { pCtrl->draw( *m_pImage, pPos->getLeft(), pPos->getTop() ); } } // Refresh the associated window TopWindow *pWindow = getWindow(); if( pWindow ) { // Check boundaries if( x < 0 ) x = 0; if( y < 0) y = 0; if( x + width > m_width ) width = m_width - x; if( y + height > m_height ) height = m_height - y; // Refresh the window... but do not paint on a visible video control! if( !m_pVideoControl || !m_pVideoControl->isVisible() ) { // No video control, we can safely repaint the rectangle pWindow->refresh( x, y, width, height ); } else { // Bad luck, there is a video control somewhere (not necessarily // in the repainting zone, btw). // We will divide the repainting into 4 regions (top, left, bottom // and right). The overlapping parts (i.e. the corners) of these // regions will be painted twice, because otherwise the algorithm // becomes a real mess :) // Use short variable names for convenience int xx = m_pVideoControl->getPosition()->getLeft(); int yy = m_pVideoControl->getPosition()->getTop(); int ww = m_pVideoControl->getPosition()->getWidth(); int hh = m_pVideoControl->getPosition()->getHeight(); // Top part: if( y < yy ) pWindow->refresh( x, y, width, yy - y ); // Left part: if( x < xx ) pWindow->refresh( x, y, xx - x, height ); // Bottom part if( y + height > yy + hh ) pWindow->refresh( x, yy + hh, width, y + height - (yy + hh) ); // Right part if( x + width > xx + ww ) pWindow->refresh( xx + ww, y, x + width - (xx + ww), height ); } } }