X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9180b5352f9d5b5bcccee563e9b3c0f68c4f1303..520a495c5972c9e966ba91cb7923bbd5b20f7197:/samples/mediaplayer/mediaplayer.cpp diff --git a/samples/mediaplayer/mediaplayer.cpp b/samples/mediaplayer/mediaplayer.cpp index d24c54c84d..c7128dcdf0 100644 --- a/samples/mediaplayer/mediaplayer.cpp +++ b/samples/mediaplayer/mediaplayer.cpp @@ -16,13 +16,22 @@ // the wxMediaCtrl class in wxWidgets. // // To use this sample, simply select Open File from the file menu, -// select the file you want to play - and MediaPlayer will play the file, -// showing video if neccessary. +// select the file you want to play - and MediaPlayer will play the file in a +// new notebook page, showing video if neccessary. // // You can select one of the menu options, or move the slider around // to manipulate what is playing. // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// Known bugs with wxMediaCtrl: +// +// 1) Certain backends can't play the same media file at the same time (MCI, +// Cocoa NSMovieView-Quicktime). +// 2) Positioning on Mac Carbon is messed up if put in a sub-control like a +// Notebook (like this sample does) on OS versions < 10.2. +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // ============================================================================ // Definitions // ============================================================================ @@ -51,6 +60,21 @@ #include "wx/sizer.h" //for positioning controls/wxBoxSizer #include "wx/timer.h" //timer for updating status bar #include "wx/textdlg.h" //for getting user text from OpenURL +#include "wx/notebook.h" //for wxNotebook and putting movies in pages + +// Use some stuff that's not part of the current API, such as loading +// media from a URL, etc. +#define wxUSE_UNOFFICIALSTUFF 0 + +//Libraries for MSVC with optional backends +#ifdef _MSC_VER + #if wxUSE_DIRECTSHOW + #pragma comment(lib,"strmiids.lib") + #endif + #if wxUSE_QUICKTIME + #pragma comment(lib,"qtmlClient.lib") + #endif +#endif // ---------------------------------------------------------------------------- // Bail out if the user doesn't want one of the @@ -61,8 +85,8 @@ #error "This is a GUI sample" #endif -#if !wxUSE_MEDIACTRL || !wxUSE_MENUS || !wxUSE_SLIDER || !wxUSE_TIMER -#error "menus, slider, mediactrl, and timers must all enabled for this sample!" +#if !wxUSE_MEDIACTRL || !wxUSE_MENUS || !wxUSE_SLIDER || !wxUSE_TIMER || !wxUSE_NOTEBOOK +#error "menus, slider, mediactrl, notebook, and timers must all be enabled for this sample!" #endif // ============================================================================ @@ -78,17 +102,24 @@ enum { // menu items wxID_LOOP = 1, - wxID_OPENFILE, + wxID_OPENFILESAMEPAGE, + wxID_OPENFILENEWPAGE, + wxID_OPENURLSAMEPAGE, + wxID_OPENURLNEWPAGE, + wxID_CLOSECURRENTPAGE, wxID_PLAY, wxID_PAUSE, // wxID_STOP, [built-in to wxWidgets] // wxID_ABOUT, [built-in to wxWidgets] // wxID_EXIT, [built-in to wxWidgets] - // id for our slider + // event id for our slider wxID_SLIDER, - // id for our wxMediaCtrl + // event id for our notebook + wxID_NOTEBOOK, + + // event id for our wxMediaCtrl wxID_MEDIACTRL }; @@ -118,33 +149,63 @@ public: void OnAbout(wxCommandEvent& event); void OnLoop(wxCommandEvent& event); - void OnOpenFile(wxCommandEvent& event); - void OnOpenURL(wxCommandEvent& event); + void OnOpenFileSamePage(wxCommandEvent& event); + void OnOpenFileNewPage(wxCommandEvent& event); + void OnOpenURLSamePage(wxCommandEvent& event); + void OnOpenURLNewPage(wxCommandEvent& event); + void OnCloseCurrentPage(wxCommandEvent& event); void OnPlay(wxCommandEvent& event); void OnPause(wxCommandEvent& event); void OnStop(wxCommandEvent& event); - // Slider event handlers - void OnSeek(wxCommandEvent& event); - - // Media event handlers - void OnMediaStop(wxMediaEvent& event); + // Notebook event handlers + void OnPageChange(wxNotebookEvent& event); private: // Rebuild base status string (see Implementation) void ResetStatus(); - wxMediaCtrl* m_mediactrl; //Our media control - wxSlider* m_slider; //The slider below our media control + // Common open file code + void OpenFile(bool bNewPage); + void OpenURL(bool bNewPage); + + // Get the media control and slider of current notebook page + wxMediaCtrl* GetCurrentMediaCtrl(); + wxSlider* GetCurrentSlider(); + class MyTimer* m_timer; //Timer to write info to status bar wxString m_basestatus; //Base status string (see ResetStatus()) - int m_nLoops; //Counter, incremented each time media loops + wxNotebook* m_notebook; // So that mytimer can access MyFrame's members friend class MyTimer; }; + + +// ---------------------------------------------------------------------------- +// MyNotebookPage +// ---------------------------------------------------------------------------- + +class MyNotebookPage : public wxPanel +{ + MyNotebookPage(wxNotebook* book); + + // Slider event handlers + void OnSeek(wxCommandEvent& event); + + // Media event handlers + void OnMediaFinished(wxMediaEvent& event); + +public: + friend class MyFrame; //make MyFrame able to access private members + wxMediaCtrl* m_mediactrl; //Our media control + wxSlider* m_slider; //The slider below our media control + int m_nLoops; //Number of times media has looped + bool m_bLoop; //Whether we are looping or not +}; + // ---------------------------------------------------------------------------- // MyTimer // ---------------------------------------------------------------------------- @@ -239,7 +300,7 @@ bool MyApp::OnInit() // MyFrame Constructor // // 1) Create our menus -// 2) Create our controls and add them to some sizers +// 2) Create our notebook control and add it to the frame // 3) Create our status bar // 4) Connect our events // 5) Start our timer @@ -258,7 +319,19 @@ MyFrame::MyFrame(const wxString& title) _T("&About...\tF1"), _T("Show about dialog")); - menuFile->Append(wxID_OPENFILE, _T("&Open File"), _T("Open a File")); + menuFile->Append(wxID_OPENFILESAMEPAGE, _T("&Open File"), + _T("Open a File in the current notebook page")); + menuFile->Append(wxID_OPENFILENEWPAGE, _T("&Open File in a new page"), + _T("Open a File in a new notebook page")); +#if wxUSE_UNOFFICIALSTUFF + menuFile->Append(wxID_OPENURLSAMEPAGE, _T("&Open URL"), + _T("Open a URL in the current notebook page")); + menuFile->Append(wxID_OPENURLNEWPAGE, _T("&Open URL in a new page"), + _T("Open a URL in a new notebook page")); +#endif + menuFile->AppendSeparator(); + menuFile->Append(wxID_CLOSECURRENTPAGE, _T("&Close Current Page"), + _T("Close current notebook page")); menuFile->AppendSeparator(); menuFile->Append(wxID_PLAY, _T("&Play"), _T("Resume playback")); menuFile->Append(wxID_PAUSE, _T("P&ause"), _T("Pause playback")); @@ -279,40 +352,10 @@ MyFrame::MyFrame(const wxString& title) SetMenuBar(menuBar); // - // Create and attach the first/main sizer - // - wxBoxSizer* vertsizer = new wxBoxSizer(wxVERTICAL); - this->SetSizer(vertsizer); - this->SetAutoLayout(true); - - // - // Create our media control - // - m_mediactrl = new wxMediaCtrl(this, wxID_MEDIACTRL); - vertsizer->Add(m_mediactrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); - - // - // Create our slider - // - m_slider = new wxSlider(this, wxID_SLIDER, 0, //init - 0, //start - 0, //end - wxDefaultPosition, wxDefaultSize, - wxSL_HORIZONTAL ); - vertsizer->Add(m_slider, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND , 5); - - - // - // Create the second sizer which will position things - // vertically - - // - // -------Menu---------- - // [m_mediactrl] + // Create our notebook - using wxNotebook is luckily pretty + // simple and self-explanatory in most cases // - // [m_slider] - // - wxBoxSizer* horzsizer = new wxBoxSizer(wxHORIZONTAL); - vertsizer->Add(horzsizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); + m_notebook = new wxNotebook(this, wxID_NOTEBOOK); // // Create our status bar @@ -320,8 +363,6 @@ MyFrame::MyFrame(const wxString& title) #if wxUSE_STATUSBAR // create a status bar just for fun (by default with 1 pane only) CreateStatusBar(1); - ResetStatus(); - SetStatusText(m_basestatus); #endif // wxUSE_STATUSBAR // @@ -374,7 +415,7 @@ MyFrame::MyFrame(const wxString& title) // // The fourth is an optional userdata param - // this is of historical relevance only and is - // there only for backwards compatability. + // there only for backwards compatibility. // // The fifth is the context in which to call the // handler - by default (this param is optional) @@ -402,9 +443,25 @@ MyFrame::MyFrame(const wxString& title) (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) &MyFrame::OnLoop); - this->Connect(wxID_OPENFILE, wxEVT_COMMAND_MENU_SELECTED, + this->Connect(wxID_OPENFILENEWPAGE, wxEVT_COMMAND_MENU_SELECTED, + (wxObjectEventFunction) (wxEventFunction) + (wxCommandEventFunction) &MyFrame::OnOpenFileNewPage); + + this->Connect(wxID_OPENFILESAMEPAGE, wxEVT_COMMAND_MENU_SELECTED, + (wxObjectEventFunction) (wxEventFunction) + (wxCommandEventFunction) &MyFrame::OnOpenFileSamePage); + + this->Connect(wxID_OPENURLNEWPAGE, wxEVT_COMMAND_MENU_SELECTED, + (wxObjectEventFunction) (wxEventFunction) + (wxCommandEventFunction) &MyFrame::OnOpenURLNewPage); + + this->Connect(wxID_OPENURLSAMEPAGE, wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnOpenFile); + (wxCommandEventFunction) &MyFrame::OnOpenURLSamePage); + + this->Connect(wxID_CLOSECURRENTPAGE, wxEVT_COMMAND_MENU_SELECTED, + (wxObjectEventFunction) (wxEventFunction) + (wxCommandEventFunction) &MyFrame::OnCloseCurrentPage); this->Connect(wxID_PLAY, wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction) (wxEventFunction) @@ -418,30 +475,17 @@ MyFrame::MyFrame(const wxString& title) (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) &MyFrame::OnStop); - - // - // Slider events - // - this->Connect(wxID_SLIDER, wxEVT_COMMAND_SLIDER_UPDATED, - (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnSeek); - // - // Media Control events + // Notebook events // - this->Connect(wxID_MEDIACTRL, wxEVT_MEDIA_STOP, + this->Connect(wxID_NOTEBOOK, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, (wxObjectEventFunction) (wxEventFunction) - (wxMediaEventFunction) &MyFrame::OnMediaStop); - + (wxNotebookEventFunction) &MyFrame::OnPageChange); + // // End of Events // - // - // Set our loop counter to 0 - // - m_nLoops = 0; - // // Create a timer to update our status bar // @@ -479,17 +523,39 @@ MyFrame::~MyFrame() // ---------------------------------------------------------------------------- void MyFrame::ResetStatus() { + wxMediaCtrl* currentMediaCtrl = GetCurrentMediaCtrl(); + m_basestatus = wxString::Format(_T("Size(x,y):%i,%i ") _T("Length(Seconds):%u Speed:%1.1fx"), - m_mediactrl->GetBestSize().x, - m_mediactrl->GetBestSize().y, - (unsigned)((m_mediactrl->Length() / 1000)), - m_mediactrl->GetPlaybackRate() + currentMediaCtrl->GetBestSize().x, + currentMediaCtrl->GetBestSize().y, + (unsigned)((currentMediaCtrl->Length() / 1000)), + currentMediaCtrl->GetPlaybackRate() ); +} - m_slider->SetRange(0, (m_mediactrl->Length() / 1000)); +// ---------------------------------------------------------------------------- +// MyFrame::GetCurrentMediaCtrl +// +// Obtains the media control of the current page, or NULL if there are no +// pages open +// ---------------------------------------------------------------------------- +wxMediaCtrl* MyFrame::GetCurrentMediaCtrl() +{ + wxASSERT(m_notebook->GetCurrentPage() != NULL); + return ((MyNotebookPage*)m_notebook->GetCurrentPage())->m_mediactrl; +} - m_nLoops = 0; +// ---------------------------------------------------------------------------- +// MyFrame::GetCurrentSlider +// +// Obtains the slider of the current page, or NULL if there are no +// pages open +// ---------------------------------------------------------------------------- +wxSlider* MyFrame::GetCurrentSlider() +{ + wxASSERT(m_notebook->GetCurrentPage() != NULL); + return ((MyNotebookPage*)m_notebook->GetCurrentPage())->m_slider; } // ---------------------------------------------------------------------------- @@ -527,31 +593,150 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) // ---------------------------------------------------------------------------- void MyFrame::OnLoop(wxCommandEvent& WXUNUSED(event)) { - m_mediactrl->Loop( !m_mediactrl->IsLooped() ); + if(!m_notebook->GetCurrentPage()) + { + wxMessageBox(wxT("No files are currently open!")); + return; + } + + ((MyNotebookPage*)m_notebook->GetCurrentPage())->m_bLoop = + !((MyNotebookPage*)m_notebook->GetCurrentPage())->m_bLoop; } // ---------------------------------------------------------------------------- -// MyFrame::OnOpenFile +// MyFrame::OnOpenFileSamePage // // Called from file->openfile. -// Opens and plays a media file +// Opens and plays a media file in the current notebook page +// ---------------------------------------------------------------------------- +void MyFrame::OnOpenFileSamePage(wxCommandEvent& WXUNUSED(event)) +{ + OpenFile(false); +} + +// ---------------------------------------------------------------------------- +// MyFrame::OnOpenFileNewPage +// +// Called from file->openfileinnewpage. +// Opens and plays a media file in a new notebook page +// ---------------------------------------------------------------------------- +void MyFrame::OnOpenFileNewPage(wxCommandEvent& WXUNUSED(event)) +{ + OpenFile(true); +} + +// ---------------------------------------------------------------------------- +// MyFrame::OpenFile +// +// Code to actually open the media file +// +// 1) Create file dialog and ask the user for input file +// 2) If the user didn't want anything, break out +// 3) Create a new page if the user wanted one or there isn't a current page +// 4) Load the media +// 5) Play the media +// 6) Reset the text on the status bar +// 7) Set the slider of the current page to accurately reflect media length // ---------------------------------------------------------------------------- -void MyFrame::OnOpenFile(wxCommandEvent& WXUNUSED(event)) +void MyFrame::OpenFile(bool bNewPage) { wxFileDialog fd(this); if(fd.ShowModal() == wxID_OK) { - if( !m_mediactrl->Load(fd.GetPath()) ) + if(bNewPage || !m_notebook->GetCurrentPage()) + m_notebook->AddPage(new MyNotebookPage(m_notebook), fd.GetPath(), true); + + if( !GetCurrentMediaCtrl()->Load(fd.GetPath()) ) wxMessageBox(wxT("Couldn't load file!")); - if( !m_mediactrl->Play() ) + if( !GetCurrentMediaCtrl()->Play() ) wxMessageBox(wxT("Couldn't play movie!")); ResetStatus(); + + GetCurrentSlider()->SetRange(0, + (int)(GetCurrentMediaCtrl()->Length() / 1000)); + } } +// ---------------------------------------------------------------------------- +// MyFrame::OnOpenURLSamePage +// +// Called from file->openurl. +// Opens and plays a media file from a URL in the current notebook page +// ---------------------------------------------------------------------------- +void MyFrame::OnOpenURLSamePage(wxCommandEvent& WXUNUSED(event)) +{ + OpenURL(false); +} + +// ---------------------------------------------------------------------------- +// MyFrame::OnOpenURLNewPage +// +// Called from file->openurlinnewpage. +// Opens and plays a media file from a URL in a new notebook page +// ---------------------------------------------------------------------------- +void MyFrame::OnOpenURLNewPage(wxCommandEvent& WXUNUSED(event)) +{ + OpenURL(true); +} + +// ---------------------------------------------------------------------------- +// MyFrame::OpenURL +// +// Code to actually open the media file from a URL +// +// 1) Create text input dialog and ask the user for an input URL +// 2) If the user didn't want anything, break out +// 3) Create a new page if the user wanted one or there isn't a current page +// 4) Load the media +// 5) Play the media +// 6) Reset the text on the status bar +// 7) Set the slider of the current page to accurately reflect media length +// ---------------------------------------------------------------------------- +void MyFrame::OpenURL(bool bNewPage) +{ + wxString theURL = wxGetTextFromUser(wxT("Enter the URL that has the movie to play")); + + if(!theURL.empty()) + { + if(bNewPage || !m_notebook->GetCurrentPage()) + m_notebook->AddPage(new MyNotebookPage(m_notebook), theURL, true); + + if( !GetCurrentMediaCtrl()->Load(wxURI(theURL)) ) + wxMessageBox(wxT("Couldn't load URL!")); + + if( !GetCurrentMediaCtrl()->Play() ) + wxMessageBox(wxT("Couldn't play movie!")); + + ResetStatus(); + + GetCurrentSlider()->SetRange(0, + (int)(GetCurrentMediaCtrl()->Length() / 1000)); + } +} + +// ---------------------------------------------------------------------------- +// MyFrame::OnCloseCurrentPage +// +// Called when the user wants to close the current notebook page +// +// 1) Get the current page number (wxControl::GetSelection) +// 2) If there is no current page, break out +// 3) Delete the current page +// ---------------------------------------------------------------------------- +void MyFrame::OnCloseCurrentPage(wxCommandEvent& WXUNUSED(event)) +{ + int sel = m_notebook->GetSelection(); + + if (sel != wxNOT_FOUND) + { + m_notebook->DeletePage(sel); + } +} + // ---------------------------------------------------------------------------- // MyFrame::OnPlay // @@ -560,7 +745,13 @@ void MyFrame::OnOpenFile(wxCommandEvent& WXUNUSED(event)) // ---------------------------------------------------------------------------- void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event)) { - if( !m_mediactrl->Play() ) + if(!m_notebook->GetCurrentPage()) + { + wxMessageBox(wxT("No files are currently open!")); + return; + } + + if( !GetCurrentMediaCtrl()->Play() ) wxMessageBox(wxT("Couldn't play movie!")); } @@ -572,7 +763,13 @@ void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event)) // ---------------------------------------------------------------------------- void MyFrame::OnPause(wxCommandEvent& WXUNUSED(event)) { - if( !m_mediactrl->Pause() ) + if(!m_notebook->GetCurrentPage()) + { + wxMessageBox(wxT("No files are currently open!")); + return; + } + + if( !GetCurrentMediaCtrl()->Pause() ) wxMessageBox(wxT("Couldn't pause movie!")); } @@ -587,32 +784,25 @@ void MyFrame::OnPause(wxCommandEvent& WXUNUSED(event)) // ---------------------------------------------------------------------------- void MyFrame::OnStop(wxCommandEvent& WXUNUSED(event)) { - if( !m_mediactrl->Stop() ) + if(!m_notebook->GetCurrentPage()) + { + wxMessageBox(wxT("No files are currently open!")); + return; + } + + if( !GetCurrentMediaCtrl()->Stop() ) wxMessageBox(wxT("Couldn't stop movie!")); } // ---------------------------------------------------------------------------- -// MyFrame::OnSeek +// MyFrame::OnCloseCurrentPage // -// Called from file->seek. -// Called when the user moves the slider - -// seeks to a position within the media +// Called when the user wants to closes the current notebook page // ---------------------------------------------------------------------------- -void MyFrame::OnSeek(wxCommandEvent& WXUNUSED(event)) -{ - if( m_mediactrl->Seek( m_slider->GetValue() * 1000 ) == wxInvalidOffset ) - wxMessageBox(wxT("Couldn't seek in movie!")); -} -// ---------------------------------------------------------------------------- -// MyFrame::OnMediaStop -// -// Called when the media is about to stop playing. -// Here we just increase our loop counter -// ---------------------------------------------------------------------------- -void MyFrame::OnMediaStop(wxMediaEvent& WXUNUSED(event)) +void MyFrame::OnPageChange(wxNotebookEvent& WXUNUSED(event)) { - ++m_nLoops; + ResetStatus(); } // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -631,19 +821,131 @@ void MyFrame::OnMediaStop(wxMediaEvent& WXUNUSED(event)) // ---------------------------------------------------------------------------- void MyTimer::Notify() { - long lPosition = (m_frame->m_mediactrl->Tell() / 1000); - m_frame->m_slider->SetValue(lPosition); + if (!m_frame->m_notebook->GetCurrentPage()) return; + wxMediaCtrl* m_mediactrl = ((MyNotebookPage*)m_frame->m_notebook->GetCurrentPage())->m_mediactrl; + wxSlider* m_slider = ((MyNotebookPage*)m_frame->m_notebook->GetCurrentPage())->m_slider; + if (!m_mediactrl) return; + + long lPosition = (long)( m_mediactrl->Tell() / 1000 ); + m_slider->SetValue(lPosition); #if wxUSE_STATUSBAR m_frame->SetStatusText(wxString::Format( _T("%s Pos:%u State:%s Loops:%i"), m_frame->m_basestatus.c_str(), (unsigned int)lPosition, - wxGetMediaStateText(m_frame->m_mediactrl->GetState()), - m_frame->m_nLoops + wxGetMediaStateText(m_mediactrl->GetState()), + ((MyNotebookPage*)m_frame->m_notebook->GetCurrentPage())->m_nLoops + ) ); #endif + +} + + +// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +// MyNotebookPage +// +// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +// ---------------------------------------------------------------------------- +// MyNotebookPage Constructor +// +// Creates a media control and slider and adds it to this panel, +// along with some sizers for positioning +// ---------------------------------------------------------------------------- + +MyNotebookPage::MyNotebookPage(wxNotebook* theBook) : + wxPanel(theBook, wxID_ANY), m_nLoops(0), m_bLoop(false) +{ + // + // Create and attach the first/main sizer + // + wxBoxSizer* vertsizer = new wxBoxSizer(wxVERTICAL); + this->SetSizer(vertsizer); + this->SetAutoLayout(true); + + // + // Create our media control + // + m_mediactrl = new wxMediaCtrl(); + + // Make sure creation was successful + bool bOK = m_mediactrl->Create(this, wxID_MEDIACTRL); + wxASSERT_MSG(bOK, wxT("Could not create media control!")); + + vertsizer->Add(m_mediactrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); + + // + // Create our slider + // + m_slider = new wxSlider(this, wxID_SLIDER, 0, //init + 0, //start + 0, //end + wxDefaultPosition, wxDefaultSize, + wxSL_HORIZONTAL ); + vertsizer->Add(m_slider, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND , 5); + + + // + // Create the second sizer which will position things + // vertically - + // + // -------Menu---------- + // [m_mediactrl] + // + // [m_slider] + // + wxBoxSizer* horzsizer = new wxBoxSizer(wxHORIZONTAL); + vertsizer->Add(horzsizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); + + // + // Slider events + // + this->Connect(wxID_SLIDER, wxEVT_COMMAND_SLIDER_UPDATED, + (wxObjectEventFunction) (wxEventFunction) + (wxCommandEventFunction) &MyNotebookPage::OnSeek); + + // + // Media Control events + // + this->Connect(wxID_MEDIACTRL, wxEVT_MEDIA_FINISHED, + (wxObjectEventFunction) (wxEventFunction) + (wxMediaEventFunction) &MyNotebookPage::OnMediaFinished); +} + +// ---------------------------------------------------------------------------- +// MyNotebook::OnSeek +// +// Called from file->seek. +// Called when the user moves the slider - +// seeks to a position within the media +// ---------------------------------------------------------------------------- +void MyNotebookPage::OnSeek(wxCommandEvent& WXUNUSED(event)) +{ + if( m_mediactrl->Seek( + m_slider->GetValue() * 1000 + ) == wxInvalidOffset ) + wxMessageBox(wxT("Couldn't seek in movie!")); +} + +// ---------------------------------------------------------------------------- +// OnMediaFinished +// +// Called when the media stops playing. +// Here we loop it if the user wants to (has been selected from file menu) +// ---------------------------------------------------------------------------- +void MyNotebookPage::OnMediaFinished(wxMediaEvent& WXUNUSED(event)) +{ + if(m_bLoop) + { + if ( !m_mediactrl->Play() ) + wxMessageBox(wxT("Couldn't loop movie!")); + else + ++m_nLoops; + } } //