#include "../src/vout_window.hpp"
#include "../src/os_graphics.hpp"
#include "../src/vlcproc.hpp"
+#include "../src/vout_manager.hpp"
+#include "../src/window_manager.hpp"
#include "../commands/async_queue.hpp"
#include "../commands/cmd_resize.hpp"
CtrlVideo::CtrlVideo( intf_thread_t *pIntf, GenericLayout &rLayout,
bool autoResize, const UString &rHelp,
VarBool *pVisible ):
- CtrlGeneric( pIntf, rHelp, pVisible ), m_pVout( NULL ),
- m_rLayout( rLayout ), m_xShift( 0 ), m_yShift( 0 )
+ CtrlGeneric( pIntf, rHelp, pVisible ), m_rLayout( rLayout ),
+ m_xShift( 0 ), m_yShift( 0 ), m_bAutoResize( autoResize ),
+ m_pVoutWindow( NULL ), m_bIsUseable( false )
{
// Observe the vout size variable if the control is auto-resizable
- if( autoResize )
+ if( m_bAutoResize )
{
VarBox &rVoutSize = VlcProc::instance( pIntf )->getVoutSizeVar();
rVoutSize.addObserver( this );
VarBox &rVoutSize = VlcProc::instance( getIntf() )->getVoutSizeVar();
rVoutSize.delObserver( this );
- if( m_pVout )
- {
- delete m_pVout;
- }
+ //m_pLayout->getActiveVar().delObserver( this );
}
void CtrlVideo::onResize()
{
const Position *pPos = getPosition();
- if( pPos && m_pVout )
+ if( pPos && m_pVoutWindow )
{
- m_pVout->move( pPos->getLeft(), pPos->getTop() );
- m_pVout->resize( pPos->getWidth(), pPos->getHeight() );
+ m_pVoutWindow->move( pPos->getLeft(), pPos->getTop() );
+ m_pVoutWindow->resize( pPos->getWidth(), pPos->getHeight() );
}
}
void CtrlVideo::draw( OSGraphics &rImage, int xDest, int yDest )
{
- GenericWindow *pParent = getWindow();
const Position *pPos = getPosition();
- if( pParent && pPos )
+ if( pPos )
{
// Draw a black rectangle under the video to avoid transparency
rImage.fillRect( pPos->getLeft(), pPos->getTop(), pPos->getWidth(),
}
-void CtrlVideo::onUpdate( Subject<VarBox, void *> &rVoutSize, void *arg )
+void CtrlVideo::setLayout( GenericLayout *pLayout,
+ const Position &rPosition )
{
- int newWidth = ((VarBox&)rVoutSize).getWidth() + m_xShift;
- int newHeight = ((VarBox&)rVoutSize).getHeight() + m_yShift;
+ CtrlGeneric::setLayout( pLayout, rPosition );
+ m_pLayout->getActiveVar().addObserver( this );
- // Create a resize command
- CmdGeneric *pCmd = new CmdResize( getIntf(), m_rLayout, newWidth,
- newHeight );
- // Push the command in the asynchronous command queue
- AsyncQueue *pQueue = AsyncQueue::instance( getIntf() );
- pQueue->push( CmdGenericPtr( pCmd ) );
+ m_bIsUseable = isVisible() && m_pLayout->getActiveVar().get();
+
+ // register Video Control
+ VoutManager::instance( getIntf() )->registerCtrlVideo( this );
+
+ msg_Dbg( getIntf(),"New VideoControl detected(%p), useability=%s",
+ this, m_bIsUseable ? "true" : "false" );
}
-void CtrlVideo::setVisible( bool visible )
+void CtrlVideo::resizeControl( int width, int height )
{
- if( visible )
+ WindowManager &rWindowManager =
+ getIntf()->p_sys->p_theme->getWindowManager();
+
+ const Position *pPos = getPosition();
+
+ if( width != pPos->getWidth() || height != pPos->getHeight() )
{
- 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 )
+ // new layout dimensions
+ int newWidth = width + m_xShift;
+ int newHeight = height + m_yShift;
+
+ // Resize the layout
+ rWindowManager.startResize( m_rLayout, WindowManager::kResizeSE );
+ rWindowManager.resize( m_rLayout, newWidth, newHeight );
+ rWindowManager.stopResize();
+
+ if( m_pVoutWindow )
{
- m_pVout = new VoutWindow( getIntf(), pPos->getLeft(),
- pPos->getTop(), false, false, *pParent );
- m_pVout->resize( pPos->getWidth(), pPos->getHeight() );
- m_pVout->show();
+ m_pVoutWindow->resize( pPos->getWidth(), pPos->getHeight() );
+ m_pVoutWindow->move( pPos->getLeft(), pPos->getTop() );
}
}
- else
+}
+
+
+void CtrlVideo::onUpdate( Subject<VarBox> &rVoutSize, void *arg )
+{
+ int newWidth = ((VarBox&)rVoutSize).getWidth() + m_xShift;
+ int newHeight = ((VarBox&)rVoutSize).getHeight() + m_yShift;
+
+ resizeControl( newWidth, newHeight );
+}
+
+
+void CtrlVideo::onUpdate( Subject<VarBool> &rVariable, void *arg )
+{
+ // Visibility changed
+ if( &rVariable == m_pVisible )
+ {
+ msg_Dbg( getIntf(), "VideoCtrl : Visibility changed (visible=%d)",
+ isVisible() );
+ }
+
+ // Active Layout changed
+ if( &rVariable == &m_pLayout->getActiveVar() )
{
- delete m_pVout;
- m_pVout = NULL;
+ msg_Dbg( getIntf(), "VideoCtrl : Active Layout changed (isActive=%d)",
+ m_pLayout->getActiveVar().get() );
+ }
+
+ m_bIsUseable = isVisible() && m_pLayout->getActiveVar().get();
+
+ if( m_bIsUseable && !isUsed() )
+ {
+ VoutManager::instance( getIntf() )->requestVout( this );
+ }
+ else if( !m_bIsUseable && isUsed() )
+ {
+ VoutManager::instance( getIntf() )->discardVout( this );
+ }
+}
+
+void CtrlVideo::attachVoutWindow( VoutWindow* pVoutWindow, int width, int height )
+{
+ width = ( width < 0 ) ? pVoutWindow->getOriginalWidth() : width;
+ height = ( height < 0 ) ? pVoutWindow->getOriginalHeight() : height;
+
+ WindowManager &rWindowManager =
+ getIntf()->p_sys->p_theme->getWindowManager();
+ TopWindow* pWin = getWindow();
+ rWindowManager.show( *pWin );
+
+ if( m_bAutoResize && width && height )
+ {
+ int newWidth = width + m_xShift;
+ int newHeight = height + m_yShift;
+
+ rWindowManager.startResize( m_rLayout, WindowManager::kResizeSE );
+ rWindowManager.resize( m_rLayout, newWidth, newHeight );
+ rWindowManager.stopResize();
+ }
+
+ pVoutWindow->setCtrlVideo( this );
+
+ m_pVoutWindow = pVoutWindow;
+}
+
+
+void CtrlVideo::detachVoutWindow( )
+{
+ m_pVoutWindow->setCtrlVideo( NULL );
+ m_pVoutWindow = NULL;
+}
+
+
+void CtrlVideo::resizeInnerVout( )
+{
+ if( m_pVoutWindow )
+ {
+ WindowManager &rWindowManager =
+ getIntf()->p_sys->p_theme->getWindowManager();
+ TopWindow* pWin = getWindow();
+
+ const Position *pPos = getPosition();
+
+ m_pVoutWindow->resize( pPos->getWidth(), pPos->getHeight() );
+ m_pVoutWindow->move( pPos->getLeft(), pPos->getTop() );
}
}