// Draw a black rectangle under the video to avoid transparency
rImage.fillRect( pPos->getLeft(), pPos->getTop(), pPos->getWidth(),
pPos->getHeight(), 0 );
-
- // Create a child window for the vout if it doesn't exist yet
- if (!m_pVout)
- {
- m_pVout = new VoutWindow( getIntf(), pPos->getLeft(),
- pPos->getTop(), false, false, *pParent );
- m_pVout->resize( pPos->getWidth(), pPos->getHeight() );
- m_pVout->show();
- }
}
}
pQueue->push( CmdGenericPtr( pCmd ) );
}
+
+void CtrlVideo::setVisible( bool visible )
+{
+ if( visible )
+ {
+ GenericWindow *pParent = getWindow();
+ const Position *pPos = getPosition();
+ // Create a child window for the vout if it doesn't exist yet
+ if( !m_pVout && pParent && pPos )
+ {
+ m_pVout = new VoutWindow( getIntf(), pPos->getLeft(),
+ pPos->getTop(), false, false, *pParent );
+ m_pVout->resize( pPos->getWidth(), pPos->getHeight() );
+ m_pVout->show();
+ }
+ }
+ else
+ {
+ delete m_pVout;
+ m_pVout = NULL;
+ }
+}
+
/// Method called when the vout size is updated
virtual void onUpdate( Subject<VarBox,void*> &rVoutSize, void* );
+ /// Called by the layout when the control is show/hidden
+ void setVisible( bool visible );
+
private:
/// Vout window
VoutWindow *m_pVout;
#include "os_factory.hpp"
#include "os_graphics.hpp"
#include "../controls/ctrl_generic.hpp"
+#include "../controls/ctrl_video.hpp"
GenericLayout::GenericLayout( intf_thread_t *pIntf, int width, int height,
int maxHeight ):
SkinObject( pIntf ), m_pWindow( NULL ), m_width( width ),
m_height( height ), m_minWidth( minWidth ), m_maxWidth( maxWidth ),
- m_minHeight( minHeight ), m_maxHeight( maxHeight )
+ m_minHeight( minHeight ), m_maxHeight( maxHeight ), m_pVideoControl( NULL )
{
// Get the OSFactory
OSFactory *pOsFactory = OSFactory::instance( getIntf() );
{
m_controlList.push_back( LayeredControl( pControl, layer ) );
}
+
+ // Check if it is a video control
+ if( pControl->getType() == "video" )
+ {
+ m_pVideoControl = (CtrlVideo*)pControl;
+ }
}
else
{
pWindow->refresh( 0, 0, width, height );
pWindow->resize( width, height );
pWindow->refresh( 0, 0, width, height );
-
// Change the shape of the window and redraw it
pWindow->updateShape();
pWindow->refresh( 0, 0, width, height );
if( pPos && pCtrl->isVisible() )
{
pCtrl->draw( *m_pImage, pPos->getLeft(), pPos->getTop() );
- // Remember the video control (we assume there is at most one video
- // control per layout)
- if( pCtrl->getType() == "video" && pCtrl->getPosition() )
- iterVideo = iter;
}
}
height = m_height - y;
// Refresh the window... but do not paint on a video control!
- if( iterVideo == m_controlList.end() )
+ if( !m_pVideoControl )
{
// No video control, we can safely repaint the rectangle
pWindow->refresh( x, y, width, height );
// becomes a real mess :)
// Use short variable names for convenience
- int xx = iterVideo->m_pControl->getPosition()->getLeft();
- int yy = iterVideo->m_pControl->getPosition()->getTop();
- int ww = iterVideo->m_pControl->getPosition()->getWidth();
- int hh = iterVideo->m_pControl->getPosition()->getHeight();
+ 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 )
m_anchorList.push_back( pAnchor );
}
+
+void GenericLayout::onShow()
+{
+ refreshAll();
+ // TODO find a better way to handle the vout ?
+ if( m_pVideoControl )
+ {
+ m_pVideoControl->setVisible( true );
+ }
+}
+
+
+void GenericLayout::onHide()
+{
+ // TODO find a better way to handle the vout ?
+ if( m_pVideoControl )
+ {
+ m_pVideoControl->setVisible( false );
+ }
+}
+
class Anchor;
class OSGraphics;
class CtrlGeneric;
+class CtrlVideo;
/// Control and its associated layer
/// Add an anchor to this layout
virtual void addAnchor( Anchor *pAnchor );
+ /// Called when the layout is shown
+ virtual void onShow();
+
+ /// Called when the layout is hidden
+ virtual void onHide();
+
private:
/// Parent window of the layout
TopWindow *m_pWindow;
OSGraphics *m_pImage;
/// List of the controls in the layout
list<LayeredControl> m_controlList;
+ //// Video control
+ CtrlVideo *m_pVideoControl;
/// List of the anchors in the layout
list<Anchor*> m_anchorList;
};
void TopWindow::setActiveLayout( GenericLayout *pLayout )
{
+ bool isVisible = getVisibleVar().get();
+ if( m_pActiveLayout && isVisible )
+ {
+ m_pActiveLayout->onHide();
+ }
+
pLayout->setWindow( this );
m_pActiveLayout = pLayout;
// Get the size of the layout and resize the window
resize( pLayout->getWidth(), pLayout->getHeight() );
+
updateShape();
- pLayout->refreshAll();
+ if( isVisible )
+ {
+ pLayout->onShow();
+ }
}
void TopWindow::innerShow()
{
+ printf("show %x\n", m_pActiveLayout);
// First, refresh the layout and update the shape of the window
if( m_pActiveLayout )
{
updateShape();
- m_pActiveLayout->refreshAll();
+ m_pActiveLayout->onShow();
}
// Show the window
GenericWindow::innerShow();
}
-
+
+void TopWindow::innerHide()
+{
+ if( m_pActiveLayout )
+ {
+ // Notify the active layout
+ m_pActiveLayout->onHide();
+ }
+ // Hide the window
+ GenericWindow::innerShow();
+}
+
+
void TopWindow::updateShape()
{
// Set the shape of the window
/// Actually show the window
virtual void innerShow();
+ /// Actually hide the window
+ virtual void innerHide();
+
private:
/// Change the active layout
virtual void setActiveLayout( GenericLayout *pLayout );
{
if( vout_Control( m_pVout, VOUT_REPARENT ) != VLC_SUCCESS )
vout_Control( m_pVout, VOUT_CLOSE );
- m_pVout = NULL;
+ // m_pVout = NULL;
}
}