From: John F. <jo...@us...> - 2009-11-24 15:35:33
|
Update of /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv2755 Modified Files: dragbuttonlist.cpp dragbuttonlist.h ingexgui.cpp Log Message: Change DragButtonList to MVC philosophy. Index: dragbuttonlist.h =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/dragbuttonlist.h,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** dragbuttonlist.h 18 Sep 2009 16:10:15 -0000 1.9 --- dragbuttonlist.h 24 Nov 2009 15:35:24 -0000 1.10 *************** *** 1,4 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * * - all rights reserved. * * * --- 1,4 ---- /*************************************************************************** ! * Copyright (C) 2006-2009 British Broadcasting Corporation * * - all rights reserved. * * * *************** *** 30,33 **** --- 30,35 ---- class ChunkInfo; + WX_DEFINE_ARRAY_INT(int, ArrayOfInts); + /// Ignore the "drag" bit - this class represents a set of source selection buttons for playback. class DragButtonList : public wxScrolledWindow *************** *** 45,49 **** --- 47,57 ---- // std::vector<std::string> * GetFiles(); private: + void UpdateUI(wxUpdateUIEvent&); + void OnRadioButton(wxCommandEvent& event); + void Select(unsigned int); wxBoxSizer * mSizer; + ArrayOfInts mEnableStates; + unsigned int mSelected; + DECLARE_EVENT_TABLE(); }; Index: dragbuttonlist.cpp =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/dragbuttonlist.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** dragbuttonlist.cpp 18 Sep 2009 16:10:15 -0000 1.10 --- dragbuttonlist.cpp 24 Nov 2009 15:35:24 -0000 1.11 *************** *** 27,30 **** --- 27,35 ---- #include "avid_mxf_info.h" + BEGIN_EVENT_TABLE(DragButtonList, wxScrolledWindow) + EVT_RADIOBUTTON(wxID_ANY, DragButtonList::OnRadioButton) + EVT_UPDATE_UI(wxID_ANY, DragButtonList::UpdateUI) + END_EVENT_TABLE() + /// @param parent The parent window. DragButtonList::DragButtonList(wxWindow * parent) *************** *** 35,38 **** --- 40,62 ---- } + /// Updates the radio button enable and selected states + void DragButtonList::UpdateUI(wxUpdateUIEvent& event) + { + if (event.GetId() > wxID_HIGHEST && event.GetId() <= (int) mEnableStates.GetCount() + wxID_HIGHEST) { + event.Enable(mEnableStates[event.GetId() - wxID_HIGHEST - 1]); + } + if (event.GetId() == (int) mSelected + wxID_HIGHEST + 1) { + ((wxRadioButton *) event.GetEventObject())->SetValue(true); //toggles the others automatically + } + } + + /// Notes the selection when a new button is pressed + void DragButtonList::OnRadioButton(wxCommandEvent& event) + { + mSelected = event.GetId() - wxID_HIGHEST - 1; + event.SetId(mSelected); + event.Skip(); //pass to the parent to select the source + } + /// Replaces current state with a new column of video track radio buttons, one for each track with a video file, and with a quad split button at the top. /// Returns information about the new state. *************** *** 46,55 **** { mSizer->Clear(true); //delete all buttons fileNames.clear(); trackNames.clear(); ! wxRadioButton * quadSplit = new wxRadioButton(this, 0, wxT("Quad Split")); //the quad split is always the first video track (id = 0) quadSplit->SetToolTip(wxT("Up to the first four successfully opened files")); mSizer->Add(quadSplit, -1, wxEXPAND); ! quadSplit->Enable(false); //enable later if any files successfully loaded std::vector<std::string> audioFileNames; prodauto::PlayerInputType inputType = prodauto::MXF_INPUT; --- 70,81 ---- { mSizer->Clear(true); //delete all buttons + mEnableStates.Clear(); fileNames.clear(); trackNames.clear(); ! wxRadioButton * quadSplit = new wxRadioButton(this, wxID_HIGHEST + 1, wxT("Quad Split")); //the quad split is always the first video track (id = 0) quadSplit->SetToolTip(wxT("Up to the first four successfully opened files")); mSizer->Add(quadSplit, -1, wxEXPAND); ! mEnableStates.Add(false); //enable later if any files successfully loaded ! mSelected = 0; std::vector<std::string> audioFileNames; prodauto::PlayerInputType inputType = prodauto::MXF_INPUT; *************** *** 68,75 **** fileNames.push_back((*chunkInfo.GetFiles())[i][j].in()); } ! wxRadioButton * rb = new wxRadioButton(this, fileNames.size(), wxString(chunkInfo.GetTracks()[i][j].src.package_name, *wxConvCurrent)); //ID corresponds to file index ! rb->Enable(false); //we don't know whether the player can open this file yet rb->SetToolTip(name); mSizer->Add(rb, -1, wxEXPAND); trackNames.push_back(chunkInfo.GetTracks()[i][j].src.package_name.in()); } --- 94,101 ---- fileNames.push_back((*chunkInfo.GetFiles())[i][j].in()); } ! wxRadioButton * rb = new wxRadioButton(this, fileNames.size() + wxID_HIGHEST + 1, wxString(chunkInfo.GetTracks()[i][j].src.package_name, *wxConvCurrent)); //ID corresponds to file index rb->SetToolTip(name); mSizer->Add(rb, -1, wxEXPAND); + mEnableStates.Add(false); //we don't know whether the player can open this file yet trackNames.push_back(chunkInfo.GetTracks()[i][j].src.package_name.in()); } *************** *** 107,116 **** { mSizer->Clear(true); //delete all buttons fileNames.clear(); trackNames.clear(); ! wxRadioButton * quadSplit = new wxRadioButton(this, 0, wxT("Quad Split")); //the quad split is always the first video track (id = 0) quadSplit->SetToolTip(wxT("Up to the first four successfully opened files")); mSizer->Add(quadSplit, -1, wxEXPAND); ! quadSplit->Enable(false); //enable later if any files successfully loaded std::vector<std::string> audioFileNames; wxString projName; --- 133,144 ---- { mSizer->Clear(true); //delete all buttons + mEnableStates.Clear(); fileNames.clear(); trackNames.clear(); ! wxRadioButton * quadSplit = new wxRadioButton(this, wxID_HIGHEST + 1, wxT("Quad Split")); //the quad split is always the first video track (id = 0) quadSplit->SetToolTip(wxT("Up to the first four successfully opened files")); mSizer->Add(quadSplit, -1, wxEXPAND); ! mEnableStates.Add(false); //enable later if any files successfully loaded ! mSelected = 0; std::vector<std::string> audioFileNames; wxString projName; *************** *** 123,130 **** if (info.isVideo) { fileNames.push_back(path); ! wxRadioButton * rb = new wxRadioButton(this, fileNames.size(), wxString(info.tracksString, *wxConvCurrent)); //ID corresponds to file index ! rb->Enable(false); //we don't know whether the player can open this file yet rb->SetToolTip(paths[i]); mSizer->Add(rb, -1, wxEXPAND); trackNames.push_back(info.tracksString); wxString p = wxString(info.projectName, *wxConvCurrent); --- 151,158 ---- if (info.isVideo) { fileNames.push_back(path); ! wxRadioButton * rb = new wxRadioButton(this, fileNames.size() + wxID_HIGHEST + 1, wxString(info.tracksString, *wxConvCurrent)); //ID corresponds to file index rb->SetToolTip(paths[i]); mSizer->Add(rb, -1, wxEXPAND); + mEnableStates.Add(false); //we don't know whether the player can open this file yet trackNames.push_back(info.tracksString); wxString p = wxString(info.projectName, *wxConvCurrent); *************** *** 161,182 **** /// @param sources Returns the source name associated with each source. /// @param names Returns corresponding displayed names. void DragButtonList::SetEtoE(std::vector<std::string> & sources, std::vector<std::string> & names) { mSizer->Clear(true); //delete all buttons sources.clear(); names.clear(); ! wxRadioButton * quadSplit = new wxRadioButton(this, 0, wxT("Quad Split")); //the quad split is always the first video source (id = 0) mSizer->Add(quadSplit, -1, wxEXPAND); ! quadSplit->Enable(false); //enable later if any sources successfully opened char source[3]; wxString name; ! for (unsigned int i = 0; i < 4; i++) { sprintf(source, "%dp", i); sources.push_back(source); name.Printf(wxT("Live %d"), i + 1); names.push_back((const char *) name.mb_str(*wxConvCurrent)); ! wxRadioButton * rb = new wxRadioButton(this, sources.size(), name); ! rb->Enable(false); //we don't know whether the player can open this source yet mSizer->Add(rb, -1, wxEXPAND); } Layout(); --- 189,216 ---- /// @param sources Returns the source name associated with each source. /// @param names Returns corresponding displayed names. + + #define N_SOURCES 4 + void DragButtonList::SetEtoE(std::vector<std::string> & sources, std::vector<std::string> & names) { mSizer->Clear(true); //delete all buttons + mEnableStates.Clear(); sources.clear(); names.clear(); ! wxRadioButton * quadSplit = new wxRadioButton(this, wxID_HIGHEST + 1, wxT("Quad Split")); //the quad split is always the first video source (id = 0) mSizer->Add(quadSplit, -1, wxEXPAND); ! mEnableStates.Add(false); //enable later if any sources successfully opened ! mSelected = 0; char source[3]; + mEnableStates.SetCount(sources.size() + 1); wxString name; ! for (unsigned int i = 0; i < N_SOURCES; i++) { sprintf(source, "%dp", i); sources.push_back(source); name.Printf(wxT("Live %d"), i + 1); names.push_back((const char *) name.mb_str(*wxConvCurrent)); ! wxRadioButton * rb = new wxRadioButton(this, sources.size() + wxID_HIGHEST + 1, name); mSizer->Add(rb, -1, wxEXPAND); + mEnableStates.Add(false); //we don't know whether the player can open this source yet } Layout(); *************** *** 192,212 **** bool someOK = false; for (size_t i = 0; i < enables->size(); i++) { ! if (mSizer->GetItem(i + 1)) { //sanity check (the quad split button shifts all the rest down) ! mSizer->GetItem(i + 1)->GetWindow()->Enable(enables->at(i)); ! someOK |= enables->at(i); ! if (selected == i + 1) { ! wxRadioButton * selectedButton = (wxRadioButton *) mSizer->GetItem(i + 1)->GetWindow(); ! selectedButton->SetValue(true); ! } } } ! if (mSizer->GetItem((size_t) 0)) { //sanity check // if (enables->size() < 2) { // //no point in having a quad split if only one track to show ! // mSizer->GetItem((size_t) 0)->GetWindow()->Hide(); // } // else { // //enable quad split if any files OK ! mSizer->GetItem((size_t) 0)->GetWindow()->Enable(someOK); // } } --- 226,246 ---- bool someOK = false; for (size_t i = 0; i < enables->size(); i++) { ! if (i >= mEnableStates.GetCount() - 1) { //sanity check ! break; } + mEnableStates[i + 1] = enables->at(i); //shifted down one by quad split + someOK |= enables->at(i); } ! if (selected < mEnableStates.GetCount()) { //sanity check ! mSelected = selected; ! } ! if (mEnableStates.GetCount()) { //sanity check // if (enables->size() < 2) { // //no point in having a quad split if only one track to show ! // mSizer->GetItem((size_t) 0)->GetWindow()->Hide(); ... this will need updating to reflect MVC philosophy // } // else { // //enable quad split if any files OK ! mEnableStates[0] = someOK; // } } *************** *** 217,220 **** --- 251,256 ---- { mSizer->Clear(true); //delete all buttons + mEnableStates.Clear(); + mSelected = 0; } *************** *** 224,253 **** bool DragButtonList::EarlierTrack(bool select) { ! ! int previous = -1; //no previous button found ! bool more = false; ! for (size_t i = 0; i < mSizer->GetChildren().GetCount(); i++) { ! wxRadioButton * radioButton = (wxRadioButton *) mSizer->GetItem(i)->GetWindow(); ! if (radioButton->GetValue()) { //selected ! if (previous > -1) { //there is a previous button to select ! if (select) { //we want to select a track ! //select it ! radioButton = (wxRadioButton *) mSizer->GetItem(previous)->GetWindow(); ! radioButton->SetValue(true); ! //this doesn't generate an event, so do so manually ! wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, previous); ! AddPendingEvent(event); ! } ! more = true; ! } ! //finished, whether or not we can select break; } - else if (radioButton->IsEnabled()) { //selectable - //the latest previous button - previous = i; - } } ! return more; } --- 260,274 ---- bool DragButtonList::EarlierTrack(bool select) { ! int previous; ! for (previous = mSelected - 1; previous > -1; previous--) { ! if (mEnableStates[previous]) { //found an enabled button break; } } ! if (previous > -1 && select) { ! //select the previous enabled button ! Select(previous); ! } ! return previous > -1; } *************** *** 257,280 **** bool DragButtonList::LaterTrack(bool select) { ! bool selected_found = false; //not found the selected track yet ! bool more = false; ! for (size_t i = 0; i < mSizer->GetChildren().GetCount(); i++) { ! wxRadioButton * radioButton = (wxRadioButton *) mSizer->GetItem(i)->GetWindow(); ! if (radioButton->GetValue()) { //selected ! selected_found = true; ! } ! else if (selected_found && radioButton->IsEnabled()) { //the next selectable track after the selected track ! more = true; ! if (select) { //we want to select a track ! //select it ! radioButton->SetValue(true); ! //this doesn't generate an event, so do so manually ! wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, i); ! AddPendingEvent(event); ! } break; } } ! return more; } --- 278,292 ---- bool DragButtonList::LaterTrack(bool select) { ! unsigned int next; ! for (next = mSelected + 1; next < mEnableStates.GetCount(); next++) { ! if (mEnableStates[next]) { //found an enabled button break; } } ! if (next < mEnableStates.GetCount() && select) { ! //select the next enabled button ! Select(next); ! } ! return next < mEnableStates.GetCount(); } *************** *** 284,304 **** void DragButtonList::SelectQuadrant(unsigned int source) { ! if (mSizer->GetItem((size_t) 0)) { //sanity check (may have been an event hanging around while the sizer was cleared?) ! if (((wxRadioButton *) mSizer->GetItem((size_t) 0)->GetWindow())->GetValue()) { //quad split is displayed: display the individual source ! if (mSizer->GetItem(source) && ((wxRadioButton *) mSizer->GetItem(source)->GetWindow())->IsEnabled()){ //a source exists in this quadrant, and its file is successfully loaded ! //press the button (this deselects the others) ! ((wxRadioButton *) mSizer->GetItem(source)->GetWindow())->SetValue(true); ! //this doesn't generate an event, so do so manually ! wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, source); ! AddPendingEvent(event); ! } ! } ! else { //source is displayed: display the quad split ! ((wxRadioButton *) mSizer->GetItem((size_t) 0)->GetWindow())->SetValue(true); ! //this doesn't generate an event, so do so manually ! wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, 0); ! AddPendingEvent(event); ! } } } --- 296,315 ---- void DragButtonList::SelectQuadrant(unsigned int source) { ! if (0 == mSelected && source && source < mEnableStates.GetCount()) { //showing quad split; sanity check ! //show individual source ! Select(source); } + else if (mSelected) { //showing an individual source + //show quad split + Select(0); + } + } + + /// Selects the given source; does not sanity-check the value + void DragButtonList::Select(unsigned int source) + { + mSelected = source; + wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, mSelected); + GetParent()->AddPendingEvent(event); //Don't want to go through this class's event handler as no point and it will change the ID } Index: ingexgui.cpp =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/ingexgui.cpp,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** ingexgui.cpp 22 Oct 2009 14:47:24 -0000 1.20 --- ingexgui.cpp 24 Nov 2009 15:35:24 -0000 1.21 *************** *** 474,478 **** //notebook playback page wxPanel * playbackPage = new wxPanel(mNotebook); //need this as can't add a sizer directly to a notebook - playbackPage->SetNextHandler(this); //allow track select radio button events to propagate here mNotebook->AddPage(playbackPage, wxT("Playback")); mPlaybackPageSizer = new wxBoxSizer(wxVERTICAL); --- 474,477 ---- *************** *** 884,888 **** /// NEW_FILESET: Sets enable state of track select buttons and selects one. /// Event client data: vector of enable states (tracks present) ! /// Event int: the selected tracks. /// STATE_CHANGE: Reflect the player's status. /// Event int: PLAY, PLAY_BACKWARDS, PAUSE, STOP, CLOSE. --- 883,887 ---- /// NEW_FILESET: Sets enable state of track select buttons and selects one. /// Event client data: vector of enable states (tracks present) ! /// Event int: the selected track. /// STATE_CHANGE: Reflect the player's status. /// Event int: PLAY, PLAY_BACKWARDS, PAUSE, STOP, CLOSE. |