Commit 744c1b58 authored by Olivier Teulière's avatar Olivier Teulière

* skins/utils/bezier.cpp: Fixed a bug in the computation of the size of a

   Bezier curve
 * skins2/*: Fixed "lazy redrawing" for the slider control
parent dab1d31a
...@@ -69,12 +69,13 @@ void CtrlGeneric::setLayout( GenericLayout *pLayout, ...@@ -69,12 +69,13 @@ void CtrlGeneric::setLayout( GenericLayout *pLayout,
} }
void CtrlGeneric::notifyLayout( int width, int height ) const void CtrlGeneric::notifyLayout( int width, int height,
int xOffSet, int yOffSet ) const
{ {
// Notify the layout // Notify the layout
if( m_pLayout ) if( m_pLayout )
{ {
m_pLayout->onControlUpdate( *this, width, height ); m_pLayout->onControlUpdate( *this, width, height, xOffSet, yOffSet );
} }
} }
......
...@@ -84,9 +84,10 @@ class CtrlGeneric: public SkinObject, public Observer<VarBool> ...@@ -84,9 +84,10 @@ class CtrlGeneric: public SkinObject, public Observer<VarBool>
VarBool *pVisible = NULL ); VarBool *pVisible = NULL );
/// Tell the layout when the image has changed, with the size of the /// Tell the layout when the image has changed, with the size of the
/// rectangle to repaint (use the default values for repainting the /// rectangle to repaint and its offset.
/// whole window) /// Use the default values to repaint the whole window
virtual void notifyLayout( int witdh = -1, int height = -1 ) const; virtual void notifyLayout( int witdh = -1, int height = -1,
int xOffSet = 0, int yOffSet = 0 ) const;
/// Same as notifyLayout(), but takes optional images as parameters. /// Same as notifyLayout(), but takes optional images as parameters.
/// The maximum size(s) of the images will be used for repainting. /// The maximum size(s) of the images will be used for repainting.
......
...@@ -163,7 +163,15 @@ void CtrlSliderCursor::draw( OSGraphics &rImage, int xDest, int yDest ) ...@@ -163,7 +163,15 @@ void CtrlSliderCursor::draw( OSGraphics &rImage, int xDest, int yDest )
void CtrlSliderCursor::onUpdate( Subject<VarPercent> &rVariable ) void CtrlSliderCursor::onUpdate( Subject<VarPercent> &rVariable )
{ {
// The position has changed // The position has changed
notifyLayout( m_rCurve.getWidth(), m_rCurve.getHeight() ); if( m_pImg )
{
notifyLayout( m_rCurve.getWidth() + m_pImg->getWidth(),
m_rCurve.getHeight() + m_pImg->getHeight(),
- m_pImg->getWidth() / 2,
- m_pImg->getHeight() / 2 );
}
else
notifyLayout();
} }
...@@ -189,8 +197,16 @@ void CtrlSliderCursor::transOverDown( SkinObject *pCtrl ) ...@@ -189,8 +197,16 @@ void CtrlSliderCursor::transOverDown( SkinObject *pCtrl )
pThis->captureMouse(); pThis->captureMouse();
pThis->m_pImg = pThis->m_pImgDown; pThis->m_pImg = pThis->m_pImgDown;
pThis->notifyLayout( pThis->m_rCurve.getWidth(), if( pThis->m_pImg )
pThis->m_rCurve.getHeight() ); {
pThis->notifyLayout(
pThis->m_rCurve.getWidth() + pThis->m_pImg->getWidth(),
pThis->m_rCurve.getHeight() + pThis->m_pImg->getHeight(),
- pThis->m_pImg->getWidth() / 2,
- pThis->m_pImg->getHeight() / 2 );
}
else
pThis->notifyLayout();
} }
...@@ -203,8 +219,16 @@ void CtrlSliderCursor::transDownOver( SkinObject *pCtrl ) ...@@ -203,8 +219,16 @@ void CtrlSliderCursor::transDownOver( SkinObject *pCtrl )
pThis->releaseMouse(); pThis->releaseMouse();
pThis->m_pImg = pThis->m_pImgUp; pThis->m_pImg = pThis->m_pImgUp;
pThis->notifyLayout( pThis->m_rCurve.getWidth(), if( pThis->m_pImg )
pThis->m_rCurve.getHeight() ); {
pThis->notifyLayout(
pThis->m_rCurve.getWidth() + pThis->m_pImg->getWidth(),
pThis->m_rCurve.getHeight() + pThis->m_pImg->getHeight(),
- pThis->m_pImg->getWidth() / 2,
- pThis->m_pImg->getHeight() / 2 );
}
else
pThis->notifyLayout();
} }
...@@ -213,8 +237,16 @@ void CtrlSliderCursor::transUpOver( SkinObject *pCtrl ) ...@@ -213,8 +237,16 @@ void CtrlSliderCursor::transUpOver( SkinObject *pCtrl )
CtrlSliderCursor *pThis = (CtrlSliderCursor*)pCtrl; CtrlSliderCursor *pThis = (CtrlSliderCursor*)pCtrl;
pThis->m_pImg = pThis->m_pImgOver; pThis->m_pImg = pThis->m_pImgOver;
pThis->notifyLayout( pThis->m_rCurve.getWidth(), if( pThis->m_pImg )
pThis->m_rCurve.getHeight() ); {
pThis->notifyLayout(
pThis->m_rCurve.getWidth() + pThis->m_pImg->getWidth(),
pThis->m_rCurve.getHeight() + pThis->m_pImg->getHeight(),
- pThis->m_pImg->getWidth() / 2,
- pThis->m_pImg->getHeight() / 2 );
}
else
pThis->notifyLayout();
} }
...@@ -223,8 +255,16 @@ void CtrlSliderCursor::transOverUp( SkinObject *pCtrl ) ...@@ -223,8 +255,16 @@ void CtrlSliderCursor::transOverUp( SkinObject *pCtrl )
CtrlSliderCursor *pThis = (CtrlSliderCursor*)pCtrl; CtrlSliderCursor *pThis = (CtrlSliderCursor*)pCtrl;
pThis->m_pImg = pThis->m_pImgUp; pThis->m_pImg = pThis->m_pImgUp;
pThis->notifyLayout( pThis->m_rCurve.getWidth(), if( pThis->m_pImg )
pThis->m_rCurve.getHeight() ); {
pThis->notifyLayout(
pThis->m_rCurve.getWidth() + pThis->m_pImg->getWidth(),
pThis->m_rCurve.getHeight() + pThis->m_pImg->getHeight(),
- pThis->m_pImg->getWidth() / 2,
- pThis->m_pImg->getHeight() / 2 );
}
else
pThis->notifyLayout();
} }
......
...@@ -122,9 +122,10 @@ const list<LayeredControl> &GenericLayout::getControlList() const ...@@ -122,9 +122,10 @@ const list<LayeredControl> &GenericLayout::getControlList() const
void GenericLayout::onControlUpdate( const CtrlGeneric &rCtrl, void GenericLayout::onControlUpdate( const CtrlGeneric &rCtrl,
int width, int height ) int width, int height,
int xOffSet, int yOffSet )
{ {
// The size was not specified (or invalid) // The size is not valid, refresh the whole layout
if( width <= 0 || height <= 0 ) if( width <= 0 || height <= 0 )
{ {
refreshAll(); refreshAll();
...@@ -134,7 +135,9 @@ void GenericLayout::onControlUpdate( const CtrlGeneric &rCtrl, ...@@ -134,7 +135,9 @@ void GenericLayout::onControlUpdate( const CtrlGeneric &rCtrl,
const Position *pPos = rCtrl.getPosition(); const Position *pPos = rCtrl.getPosition();
if( pPos ) if( pPos )
{ {
refreshRect( pPos->getLeft(), pPos->getTop(), width, height ); refreshRect( pPos->getLeft() + xOffSet,
pPos->getTop() + yOffSet,
width, height );
} }
} }
......
...@@ -105,8 +105,12 @@ class GenericLayout: public SkinObject, public Box ...@@ -105,8 +105,12 @@ class GenericLayout: public SkinObject, public Box
virtual const list<LayeredControl> &getControlList() const; virtual const list<LayeredControl> &getControlList() const;
/// Called by a control when its image has changed /// Called by a control when its image has changed
/// The arguments indicate the size of the rectangle to refresh,
/// and the offset (from the control position) of this rectangle.
/// Use a negative width or height to refresh the layout completely
virtual void onControlUpdate( const CtrlGeneric &rCtrl, virtual void onControlUpdate( const CtrlGeneric &rCtrl,
int width, int height ); int width, int height,
int xOffSet, int yOffSet );
/// Get the list of the anchors of this layout /// Get the list of the anchors of this layout
virtual const list<Anchor*>& getAnchorList() const; virtual const list<Anchor*>& getAnchorList() const;
......
...@@ -133,9 +133,9 @@ int Bezier::getWidth() const ...@@ -133,9 +133,9 @@ int Bezier::getWidth() const
int width = 0; int width = 0;
for( int i = 0; i < m_nbPoints; i++ ) for( int i = 0; i < m_nbPoints; i++ )
{ {
if( m_leftVect[i] > width ) if( m_leftVect[i] >= width )
{ {
width = m_leftVect[i]; width = m_leftVect[i] + 1;
} }
} }
return width; return width;
...@@ -147,9 +147,9 @@ int Bezier::getHeight() const ...@@ -147,9 +147,9 @@ int Bezier::getHeight() const
int height = 0; int height = 0;
for( int i = 0; i < m_nbPoints; i++ ) for( int i = 0; i < m_nbPoints; i++ )
{ {
if( m_topVect[i] > height ) if( m_topVect[i] >= height )
{ {
height = m_topVect[i]; height = m_topVect[i] + 1;
} }
} }
return height; return height;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment