From 3a774635dc72055d9119440f76d1bdceedc3b42e Mon Sep 17 00:00:00 2001 From: Ryan Norton Date: Sun, 7 Nov 2004 12:22:11 +0000 Subject: [PATCH] allow multiple movie loading as per Julian's suggestion. DOC. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30339 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/moviectrl.tex | 11 ++++- include/wx/mac/carbon/moviectrl.h | 9 +++- include/wx/msw/moviectrl.h | 9 +++- src/mac/carbon/moviectrl.cpp | 76 +++++++++++++++++++++---------- src/msw/moviectrl.cpp | 57 +++++++++++++++++------ 5 files changed, 116 insertions(+), 46 deletions(-) diff --git a/docs/latex/wx/moviectrl.tex b/docs/latex/wx/moviectrl.tex index 7ca1e5da95..b4d5e582bf 100644 --- a/docs/latex/wx/moviectrl.tex +++ b/docs/latex/wx/moviectrl.tex @@ -38,7 +38,7 @@ Contructors \docparam{parent}{parent of this control. Must not be NULL.} \docparam{id}{id to use for events} -\docparam{fileName}{File the movie is located at.} +\docparam{fileName}{If not empty, loads this file and starts playing it immediately.} \docparam{label}{Control label - possible caption for the movie.} \docparam{pos}{Position to put control at.} \docparam{size}{Size to put the control at and to stretch movie to.} @@ -55,7 +55,7 @@ Creates this control. Returns \tt{false} if it can't load the movie located at \docparam{parent}{parent of this control. Must not be NULL.} \docparam{id}{id to use for events} -\docparam{fileName}{File the movie is located at.} +\docparam{fileName}{If not empty, loads this file and starts playing it immediately.} \docparam{label}{Control label - possible caption for the movie.} \docparam{pos}{Position to put control at.} \docparam{size}{Size to put the control at and to stretch movie to.} @@ -90,6 +90,13 @@ Obtains the state the playback of the movie is in - Obtains the length - the total amount of time the movie has +\membersection{wxMovieCtrl::Load}\label{wxmoviectrlload} + +\func{bool}{Load}{\param{const wxString\& }{fileName}} + +Loads the file that \tt{fileName} refers to. + +Unlike Create, you must manually call Play() to start playing the file. \membersection{wxMovieCtrl::Pause}\label{wxmoviectrlpause} diff --git a/include/wx/mac/carbon/moviectrl.h b/include/wx/mac/carbon/moviectrl.h index 6102095df5..ac6ab9a8ee 100644 --- a/include/wx/mac/carbon/moviectrl.h +++ b/include/wx/mac/carbon/moviectrl.h @@ -26,12 +26,12 @@ enum wxMovieCtrlState class wxMovieCtrl : public wxControl { public: - wxMovieCtrl() + wxMovieCtrl() : m_bLoaded(false) { } wxMovieCtrl(wxWindow* parent, wxWindowID id, const wxString& fileName, const wxString& label = wxT(""), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = 0, const wxString& name = wxPanelNameStr) + long style = 0, const wxString& name = wxPanelNameStr) : m_bLoaded(false) { Create(parent, id, fileName, label, pos, size, style, name); } ~wxMovieCtrl(); @@ -49,6 +49,8 @@ public: double GetPlaybackRate(); bool SetPlaybackRate(double dRate); + bool Load(const wxString& fileName); + #if wxUSE_DATETIME bool Seek(const wxTimeSpan& where); wxTimeSpan Tell(); @@ -59,6 +61,9 @@ protected: void OnSize(wxSizeEvent& evt); wxSize DoGetBestSize() const; bool InitQT(); + void Cleanup(); + + bool m_bLoaded; struct MovieRecord* m_movie; wxSize m_bestSize; diff --git a/include/wx/msw/moviectrl.h b/include/wx/msw/moviectrl.h index b7498552a3..d1b1c1026d 100644 --- a/include/wx/msw/moviectrl.h +++ b/include/wx/msw/moviectrl.h @@ -26,12 +26,12 @@ enum wxMovieCtrlState class wxMovieCtrl : public wxControl { public: - wxMovieCtrl() + wxMovieCtrl() : m_bLoaded(false) { } wxMovieCtrl(wxWindow* parent, wxWindowID id, const wxString& fileName, const wxString& label = wxT(""), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = 0, const wxString& name = wxPanelNameStr) + long style = 0, const wxString& name = wxPanelNameStr) : m_bLoaded(false) { Create(parent, id, fileName, label, pos, size, style, name); } ~wxMovieCtrl(); @@ -43,6 +43,8 @@ public: bool Play(); bool Pause(); bool Stop(); + + bool Load(const wxString& fileName); wxMovieCtrlState GetState(); @@ -60,7 +62,10 @@ public: protected: void OnSize(wxSizeEvent& evt); wxSize DoGetBestSize() const; + void Cleanup(); + bool m_bVideo; + bool m_bLoaded; //msw-specific - we need to overload the window proc WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); diff --git a/src/mac/carbon/moviectrl.cpp b/src/mac/carbon/moviectrl.cpp index f4d141f787..b856825148 100644 --- a/src/mac/carbon/moviectrl.cpp +++ b/src/mac/carbon/moviectrl.cpp @@ -130,6 +130,34 @@ bool wxMovieCtrl::Create(wxWindow* parent, wxWindowID id, const wxString& fileNa const wxString& label, const wxPoint& pos, const wxSize& size, long WXUNUSED(style), const wxString& name) { + //do some window stuff + if ( !wxControl::Create(parent, id, pos, size, wxNO_BORDER, wxDefaultValidator, name) ) + return false; + + //Set our background color to black by default + SetBackgroundColour(*wxBLACK); + + if(!fileName.empty()) + { + if (!Load(fileName)) + return false; + + SetLabel(label); + + if(!Play()) + return false; + } + else + wxControl::SetLabel(label); + + return true; +} + +bool wxMovieCtrl::Load(const wxString& fileName) +{ + if(m_bLoaded) + Cleanup(); + if ( !InitQT() ) return false; @@ -186,13 +214,6 @@ bool wxMovieCtrl::Create(wxWindow* parent, wxWindowID id, const wxString& fileNa wxEVT_SIZE, (wxObjectEventFunction) (wxEventFunction) (wxSizeEventFunction) &wxMovieCtrl::OnSize ); - //do some window stuff - if ( !wxControl::Create(parent, id, pos, size, wxNO_BORDER, wxDefaultValidator, name) ) - return false; - - //Set our background color to black by default - SetBackgroundColour(*wxBLACK); - //reparent movie #ifdef __WXMSW__ CreatePortAssociation(this->GetHWND(), NULL, 0L); @@ -206,13 +227,10 @@ bool wxMovieCtrl::Create(wxWindow* parent, wxWindowID id, const wxString& fileNa #endif , nil); - //go! - SetLabel(label); - Play(); - return true; } + bool wxMovieCtrl::Play() { ::StartMovie(m_movie); @@ -290,23 +308,31 @@ wxMovieCtrlState wxMovieCtrl::GetState() return wxMOVIECTRL_PAUSED; } -wxMovieCtrl::~wxMovieCtrl() +void wxMovieCtrl::Cleanup() { - if (m_timer) - { - delete m_timer; + //soldier in OnSize + this->Disconnect( wxID_ANY, + wxEVT_SIZE, + (wxObjectEventFunction) (wxEventFunction) (wxSizeEventFunction) &wxMovieCtrl::OnSize ); - StopMovie(m_movie); - DisposeMovie(m_movie); - - //Note that ExitMovies() is not neccessary, but - //the docs are fuzzy on whether or not TerminateQTML is - ExitMovies(); + delete m_timer; - #ifndef __WXMAC__ - TerminateQTML(); - #endif - } + StopMovie(m_movie); + DisposeMovie(m_movie); + + //Note that ExitMovies() is not neccessary, but + //the docs are fuzzy on whether or not TerminateQTML is + ExitMovies(); + +#ifndef __WXMAC__ + TerminateQTML(); +#endif +} + +wxMovieCtrl::~wxMovieCtrl() +{ + if(m_bLoaded) + Cleanup(); } wxSize wxMovieCtrl::DoGetBestSize() const diff --git a/src/msw/moviectrl.cpp b/src/msw/moviectrl.cpp index 6b2de258f2..7917b6382b 100644 --- a/src/msw/moviectrl.cpp +++ b/src/msw/moviectrl.cpp @@ -51,6 +51,35 @@ bool wxMovieCtrl::Create(wxWindow* parent, wxWindowID id, const wxString& fileNa const wxString& label, const wxPoint& pos, const wxSize& size, long style, const wxString& name) { + //do some window stuff - ORDER IS IMPORTANT + //base create + if ( !wxControl::Create(parent, id, pos, size, wxNO_BORDER | wxCLIP_CHILDREN, wxDefaultValidator, name) ) + return false; + + //Set our background color to black by default + SetBackgroundColour(*wxBLACK); + + if(!fileName.empty()) + { + if (!Load(fileName)) + return false; + + SetLabel(label); + + if(!Play()) + return false; + } + else + wxControl::SetLabel(label); + + return true; +} + +bool wxMovieCtrl::Load(const wxString& fileName) +{ + if(m_bLoaded) + Cleanup(); + //cast helpers IGraphBuilder*& pGB = (IGraphBuilder*&) m_pGB; IMediaControl*& pMC = (IMediaControl*&) m_pMC; @@ -95,17 +124,6 @@ bool wxMovieCtrl::Create(wxWindow* parent, wxWindowID id, const wxString& fileNa m_bestSize.x = nSX; m_bestSize.y = nSY; - - //do some window stuff - ORDER IS IMPORTANT - //base create - if ( !wxControl::Create(parent, id, pos, size, wxNO_BORDER | wxCLIP_CHILDREN, wxDefaultValidator, name) ) - return false; - - //TODO: Connect() here instead of message maps - - //Set our background color to black by default - SetBackgroundColour(*wxBLACK); - if (m_bVideo) { wxDSVERIFY( pVW->put_Owner((OAHWND)this->GetHandle()) ); @@ -117,9 +135,7 @@ bool wxMovieCtrl::Create(wxWindow* parent, wxWindowID id, const wxString& fileNa //set the time format wxDSVERIFY( pMS->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME) ); - SetLabel(label); - Play(); - + m_bLoaded = true; return true; } @@ -277,8 +293,13 @@ WXLRESULT wxMovieCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPar return wxControl::MSWWindowProc(nMsg, wParam, lParam); } -wxMovieCtrl::~wxMovieCtrl() +void wxMovieCtrl::Cleanup() { + if(m_bVideo) + this->Disconnect( wxID_ANY, + wxEVT_SIZE, + (wxObjectEventFunction) (wxEventFunction) (wxSizeEventFunction) &wxMovieCtrl::OnSize ); + //cast helpers IGraphBuilder*& pGB = (IGraphBuilder*&) m_pGB; IMediaControl*& pMC = (IMediaControl*&) m_pMC; @@ -305,6 +326,12 @@ wxMovieCtrl::~wxMovieCtrl() SAFE_RELEASE(pGB); } +wxMovieCtrl::~wxMovieCtrl() +{ + if (m_bLoaded) + Cleanup(); +} + wxSize wxMovieCtrl::DoGetBestSize() const { return m_bestSize; -- 2.45.2