Update of /cvsroot/audacity/audacity-src/src
In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv18306/src

Modified Files:
      Tag: Audacity_UmixIt
        LyricsWindow.cpp MixerBoard.cpp MixerBoard.h TrackPanel.cpp 
Log Message:
MixerBoard updates:
* resize
* instrument icons

Index: LyricsWindow.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/Attic/LyricsWindow.cpp,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -d -r1.1.2.2 -r1.1.2.3
--- LyricsWindow.cpp    10 Feb 2007 04:06:52 -0000      1.1.2.2
+++ LyricsWindow.cpp    20 Feb 2007 07:20:26 -0000      1.1.2.3
@@ -26,8 +26,12 @@
 const wxSize gSize = wxSize(LYRICS_DEFAULT_WIDTH, LYRICS_DEFAULT_HEIGHT);
 
 LyricsWindow::LyricsWindow(AudacityProject *parent):
-  wxFrame(parent, -1, _("Audacity Lyrics - ") + parent->GetName(), 
-            wxDefaultPosition,  gSize, 
+   wxFrame(parent, -1, 
+            wxString::Format(_("Audacity Lyrics%s"), 
+                              ((parent->GetName() == wxEmptyString) ? 
+                                 wxEmptyString : 
+                                 wxString::Format(wxT("- %s"), 
parent->GetName()))), 
+            wxDefaultPosition, gSize, 
             wxDEFAULT_FRAME_STYLE | ((parent == NULL) ? 0x0 : 
wxFRAME_FLOAT_ON_PARENT))
 {
    mProject = parent;

Index: MixerBoard.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/Attic/MixerBoard.cpp,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -d -r1.1.2.3 -r1.1.2.4
--- MixerBoard.cpp      14 Feb 2007 09:46:11 -0000      1.1.2.3
+++ MixerBoard.cpp      20 Feb 2007 07:20:26 -0000      1.1.2.4
@@ -12,7 +12,7 @@
 
 #include <wx/dcmemory.h>
 #include <wx/arrimpl.cpp>
-#include <wx/settings.h> // for wxSystemSettings::GetSystemColour
+#include <wx/settings.h> // for wxSystemSettings::GetSystemColour and 
wxSystemSettings::GetMetric
 #include <wx/sizer.h>
 
 #include "AColor.h"
@@ -26,6 +26,7 @@
 
 #define kInset 4
 #define kDoubleInset (2 * kInset)
+#define kTripleInset (3 * kInset)
 #define kQuadrupleInset (4 * kInset)
 
 #define TITLE_BAR_HEIGHT 18
@@ -69,10 +70,11 @@
 
    // CREATE THE CONTROLS PROGRAMMATICALLY.
    
-   //vvv For some reason the sizers aren't getting offset vertically, 
-   // probably because I'm not using wxDefaultPosition, 
-   // so positions are calculated explicitly below, but sizers are still in.
-   wxBoxSizer* pBoxSizer_MixerTrackCluster = new wxBoxSizer(wxVERTICAL);
+   // Not sure why, but sizers aren't getting offset vertically, 
+   // probably because not using wxDefaultPosition, 
+   // so positions are calculated explicitly below, but sizers are commented 
out. 
+   //    wxBoxSizer* pBoxSizer_MixerTrackCluster = new wxBoxSizer(wxVERTICAL);
+
    wxColour trackColor = this->GetTrackColor();
 
        // track name
@@ -82,7 +84,7 @@
       new wxStaticText(this, -1, mLeftTrack->GetName(), ctrlPos, ctrlSize, 
                         wxALIGN_CENTRE | wxST_NO_AUTORESIZE | wxSUNKEN_BORDER);
    mStaticText_TrackName->SetBackgroundColour(trackColor);
-   pBoxSizer_MixerTrackCluster->Add(mStaticText_TrackName, 0, wxALIGN_CENTER | 
wxALL, kDoubleInset);
+   //pBoxSizer_MixerTrackCluster->Add(mStaticText_TrackName, 0, wxALIGN_CENTER 
| wxALL, kDoubleInset);
 
 
    // musical instrument image
@@ -93,7 +95,7 @@
    wxASSERT(bitmap);
    mStaticBitmap_MusicalInstrument = 
       new wxStaticBitmap(this, -1, *bitmap, ctrlPos, ctrlSize, 
wxSUNKEN_BORDER);
-   pBoxSizer_MixerTrackCluster->Add(mStaticBitmap_MusicalInstrument, 0, 
wxALIGN_CENTER | wxALL, kDoubleInset);
+   //pBoxSizer_MixerTrackCluster->Add(mStaticBitmap_MusicalInstrument, 0, 
wxALIGN_CENTER | wxALL, kDoubleInset);
 
 
    // mute/solo buttons
@@ -119,11 +121,11 @@
                   mMixerBoard->mImageSoloDown, 
mMixerBoard->mImageSoloDisabled, 
                   true); // toggle button
 
-   wxBoxSizer* pBoxSizer_MuteSolo = new wxBoxSizer(wxHORIZONTAL);
-   pBoxSizer_MuteSolo->Add(mToggleButton_Mute, 0, wxALIGN_CENTER | wxALL, 
kInset);
-   pBoxSizer_MuteSolo->Add(kDoubleInset, 0, 0); // horizontal spacer
-   pBoxSizer_MuteSolo->Add(mToggleButton_Solo, 0, wxALIGN_CENTER | wxALL, 
kInset);
-   pBoxSizer_MixerTrackCluster->Add(pBoxSizer_MuteSolo, 0, wxALIGN_CENTER | 
wxALL, kDoubleInset);
+   //wxBoxSizer* pBoxSizer_MuteSolo = new wxBoxSizer(wxHORIZONTAL);
+   //pBoxSizer_MuteSolo->Add(mToggleButton_Mute, 0, wxALIGN_CENTER | wxALL, 
kInset);
+   //pBoxSizer_MuteSolo->Add(kDoubleInset, 0, 0); // horizontal spacer
+   //pBoxSizer_MuteSolo->Add(mToggleButton_Solo, 0, wxALIGN_CENTER | wxALL, 
kInset);
+   //pBoxSizer_MixerTrackCluster->Add(pBoxSizer_MuteSolo, 0, wxALIGN_CENTER | 
wxALL, kDoubleInset);
 
 
    // pan slider
@@ -132,7 +134,7 @@
    ctrlSize = wxSize((size.GetWidth() * 4 / 5), PAN_HEIGHT);
    /* i18n-hint: Title of the Pan slider, used to move the sound left or right 
stereoscopically */
    mSlider_Pan = new ASlider(this, ID_ASLIDER_PAN, _("Pan"), ctrlPos, 
ctrlSize, PAN_SLIDER);
-   pBoxSizer_MixerTrackCluster->Add(mSlider_Pan, 0, wxALIGN_CENTER | wxALL, 
kDoubleInset);
+   //pBoxSizer_MixerTrackCluster->Add(mSlider_Pan, 0, wxALIGN_CENTER | wxALL, 
kDoubleInset);
 
 
    // gain slider & level meter
@@ -159,10 +161,10 @@
    mMeter->HandleLayout();
    //this->ResetMeter();
 
-   wxBoxSizer* pBoxSizer_GainAndMeter = new wxBoxSizer(wxHORIZONTAL);
-   pBoxSizer_GainAndMeter->Add(mSlider_Gain, 0, wxALIGN_CENTER | wxALL, 
kInset);
-   pBoxSizer_GainAndMeter->Add(mMeter, 0, wxALIGN_CENTER | wxALL, kInset);
-   pBoxSizer_MixerTrackCluster->Add(pBoxSizer_GainAndMeter, 0, wxALIGN_CENTER 
| wxALL, kDoubleInset);
+   //wxBoxSizer* pBoxSizer_GainAndMeter = new wxBoxSizer(wxHORIZONTAL);
+   //pBoxSizer_GainAndMeter->Add(mSlider_Gain, 0, wxALIGN_CENTER | wxALL, 
kInset);
+   //pBoxSizer_GainAndMeter->Add(mMeter, 0, wxALIGN_CENTER | wxALL, kInset);
+   //pBoxSizer_MixerTrackCluster->Add(pBoxSizer_GainAndMeter, 0, 
wxALIGN_CENTER | wxALL, kDoubleInset);
 
 
    #if wxUSE_TOOLTIPS
@@ -176,12 +178,6 @@
 
       mMeter->SetToolTip(_T("Level Meter"));
    #endif // wxUSE_TOOLTIPS
-
-
-   this->SetSizer(pBoxSizer_MixerTrackCluster);
-   //vvv Don't want to shrink to minimum for sizer. 
-   //pBoxSizer_MixerTrackCluster->Fit(this);
-   //pBoxSizer_MixerTrackCluster->SetSizeHints(this);
 }
 
 void MixerTrackCluster::ResetMeter()
@@ -189,6 +185,31 @@
    mMeter->Reset(mLeftTrack->GetRate(), true);
 }
 
+void MixerTrackCluster::UpdateHeight() // For wxSizeEvents, update gain slider 
and meter.
+{
+   wxSize scrolledWindowClientSize = this->GetParent()->GetClientSize();   
+   int newClusterHeight = 
+      scrolledWindowClientSize.GetHeight() - 
+      wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y) + // 
wxScrolledWindow::GetClientSize doesn't account for its scrollbar size.
+      kDoubleInset;
+   this->SetSize(-1, newClusterHeight); 
+
+   // Change only the heights of mSlider_Gain and mMeter.
+   int newHeight = 
+      newClusterHeight - 
+      (kInset + // margin above mStaticText_TrackName
+         TITLE_BAR_HEIGHT + kDoubleInset + // mStaticText_TrackName + margin
+         MUSICAL_INSTRUMENT_HEIGHT_AND_WIDTH + kQuadrupleInset + // musical 
instrument icon + margin
+         MUTE_SOLO_HEIGHT + kQuadrupleInset + // mute/solo buttons + margin
+         PAN_HEIGHT + kQuadrupleInset) - // pan slider
+      kQuadrupleInset; // margin below gain slider and meter 
+
+   mSlider_Gain->SetSize(-1, newHeight);
+   mMeter->SetSize(-1, newHeight);
+}
+
+
+// These are used by TrackPanel for synchronizing control states, etc.
 void MixerTrackCluster::UpdateName()
 {
    mStaticText_TrackName->SetLabel(mLeftTrack->GetName()); 
@@ -284,7 +305,7 @@
 wxColour MixerTrackCluster::GetTrackColor()
 {
    //vvv This doesn't work right when switching back and forth between two 
projects 
-   // when one is branded and the other is not, because for some reason, 
OnActivate 
+   // when one is branded and the other is not, because OnActivate 
    // isn't always called, so gActiveProject isn't updated. 
    Branding* pBranding = mProject->GetBranding();
    if (pBranding && (pBranding->GetBrandColorScheme() == "UmixIt")) //vvv 
UmixIt 
@@ -304,14 +325,14 @@
 
    dc.BeginDrawing();
 
-   wxRect bev = this->GetRect();
-   bev.x = 0;
-   bev.Inflate(-2, -2);
+   wxSize clusterSize = this->GetSize();
+   wxRect bev(0, 0, clusterSize.GetWidth() - 1, clusterSize.GetHeight() - 1);
    AColor::Bevel(dc, true, bev);
 
    dc.EndDrawing();
 }
 
+
 void MixerTrackCluster::OnButton_Mute(wxCommandEvent& event)
 {
    // Shift-click mutes this track and unmutes other tracks. Tell mMixerBoard 
to handle it.
@@ -423,21 +444,29 @@
 
 // class MixerBoard
 
-#define MIXER_TRACK_PANEL_MIN_WIDTH 96
+#define MIXER_BOARD_MIN_HEIGHT 480
+#define MIXER_TRACK_CLUSTER_WIDTH 100 - kInset
 #define DEFAULT_NUM_TRACKCLUSTERS 8 // Default to fitting 8 tracks.
-const wxSize kDefaultSize = wxSize((DEFAULT_NUM_TRACKCLUSTERS * 
MIXER_TRACK_PANEL_MIN_WIDTH) + kDoubleInset, 480); 
+const wxSize kDefaultSize = 
+   wxSize((DEFAULT_NUM_TRACKCLUSTERS * 
+               (kInset + MIXER_TRACK_CLUSTER_WIDTH)) + // left margin and 
width for each
+               kDoubleInset, // plus final right margin
+            MIXER_BOARD_MIN_HEIGHT); 
 
 BEGIN_EVENT_TABLE(MixerBoard, wxFrame)
    EVT_CLOSE(MixerBoard::OnCloseWindow)
+   EVT_MAXIMIZE(MixerBoard::OnMaximize)
+   EVT_SIZE(MixerBoard::OnSize)
 END_EVENT_TABLE()
 
 MixerBoard::MixerBoard(AudacityProject* parent):
-  wxFrame(parent, -1, _("Audacity Mixer Board - ") + parent->GetName(), 
-            wxDefaultPosition,  kDefaultSize, 
-            //vvv frame tool: wxCAPTION | wxSYSTEM_MENU | wxFRAME_TOOL_WINDOW 
| 
-            //vvv No resize yet:   wxDEFAULT_FRAME_STYLE | 
-            wxCAPTION | wxMINIMIZE_BOX | wxSYSTEM_MENU | 
-               ((parent == NULL) ? 0x0 : wxFRAME_FLOAT_ON_PARENT))
+  wxFrame(parent, -1,
+            wxString::Format(_("Audacity Mixer Board%s"), 
+                              ((parent->GetName() == wxEmptyString) ? 
+                                 wxEmptyString : 
+                                 wxString::Format(wxT("- %s"), 
parent->GetName()))), 
+            wxDefaultPosition, kDefaultSize, 
+            wxDEFAULT_FRAME_STYLE | ((parent == NULL) ? 0x0 : 
wxFRAME_FLOAT_ON_PARENT))
 {
    // public data members
    // mute & solo button images: Create once and store on MixerBoard for use 
in all MixerTrackClusters.
@@ -452,7 +481,6 @@
    mImageSoloDisabled = NULL;
 
    // private data members
-   mMixerTrackClusterWidth = MIXER_TRACK_PANEL_MIN_WIDTH; 
    this->LoadMusicalInstruments(); // Set up mMusicalInstruments.
    mProject = parent;
    
@@ -461,19 +489,29 @@
                            this->GetClientAreaOrigin(), // const wxPoint& pos 
= wxDefaultPosition, 
                            this->GetClientSize(), // const wxSize& size = 
wxDefaultSize, 
                            wxHSCROLL); // long style = wxHSCROLL | wxVSCROLL, 
const wxString& name = "scrolledWindow")
-   
mScrolledWindow->SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW));
+
+   // Set background color a la wxColour dark in AColor::Init, so same as 
TrackPanel background.
+   
mScrolledWindow->SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW));
 
+   
    mScrolledWindow->SetScrollRate(10, 0); // no vertical scroll
-   //vvv Default width should be 
-   //    this->GetClientSize().GetWidth()
-   // but that gives no horizontal scrollbar, so then added track chops off 
bottom of 
-   // existing MixerTrackClusters. So, until they know how to resize, always 
start with a horizontal scroll bar.
-   mScrolledWindow->SetVirtualSize(this->GetClientSize().GetWidth() + 
kQuadrupleInset, 
-                                    this->GetClientSize().GetHeight());
+   mScrolledWindow->SetVirtualSize(kDefaultSize.GetWidth(), -1);
+
+   /* This doesn't work to make the mScrolledWindow automatically resize, so 
do it explicitly in OnSize.
+         wxBoxSizer* pBoxSizer = new wxBoxSizer(wxVERTICAL);
+         pBoxSizer->Add(mScrolledWindow, 0, wxExpand, 0);
+         this->SetAutoLayout(true);
+         this->SetSizer(pBoxSizer);
+         pBoxSizer->Fit(this);
+         pBoxSizer->SetSizeHints(this);
+      */
 
    mSoloCount = 0;
    mT = -1.0;
    mTracks = mProject->GetTracks();
 
+   this->SetSizeHints(kInset + MIXER_TRACK_CLUSTER_WIDTH, // int minW=-1, // 
Show at least one cluster wide. 
+                        MIXER_BOARD_MIN_HEIGHT); // int minH=-1, 
+
    // loads either the XPM or the windows resource, depending on the platform
    #if !defined(__WXMAC__) && !defined(__WXX11__)
       #ifdef __WXMSW__
@@ -504,9 +542,6 @@
 
 void MixerBoard::AddTrackClusters() // Add clusters for any tracks we're not 
yet showing.
 {
-   //vvv Need to reorder when track order changes. This just makes sure all 
are visible, 
-   // and relies on them staying in order.
-
    wxASSERT(mTracks);
    if (mTracks->IsEmpty())
       return;
@@ -514,9 +549,8 @@
    if (mImageMuteUp == NULL) 
       this->CreateMuteSoloImages();
 
-   const int kClusterHeight = mScrolledWindow->GetClientSize().GetHeight();
-   unsigned int count = mMixerTrackClusters.size();
-   MixerTrackClusterHash::iterator iterHash;
+   const int kClusterHeight = mScrolledWindow->GetClientSize().GetHeight() - 
kDoubleInset;
+   size_t count = mMixerTrackClusters.GetCount();
    TrackListIterator iterTracks(mTracks);
    MixerTrackCluster* pMixerTrackCluster = NULL;
    Track* pLeftTrack;
@@ -529,18 +563,20 @@
          pRightTrack = iterTracks.Next();
 
       if (pLeftTrack->GetKind() == Track::Wave) {
-         iterHash = mMixerTrackClusters.find(pLeftTrack);
-         if (iterHash == mMixerTrackClusters.end())
+         if (this->FindMixerTrackCluster((WaveTrack*)pLeftTrack, 
&pMixerTrackCluster) == -1)
          {  // Not already showing it.
-            wxPoint clusterPos(count * mMixerTrackClusterWidth, 0); // y 
should always be 0. 
-            wxSize clusterSize(mMixerTrackClusterWidth, kClusterHeight);
+            wxPoint clusterPos(
+               ((count * (kInset + MIXER_TRACK_CLUSTER_WIDTH)) + // left 
margin and width for each to its left
+                  kInset), // plus left margin for new cluster
+               kInset); 
+            wxSize clusterSize(MIXER_TRACK_CLUSTER_WIDTH, kClusterHeight);
             pMixerTrackCluster = 
                new MixerTrackCluster(mScrolledWindow, this, mProject, 
                                        (WaveTrack*)pLeftTrack, 
(WaveTrack*)pRightTrack, 
                                        clusterPos, clusterSize);
             if (pMixerTrackCluster)
             {
-               mMixerTrackClusters[(void*)pLeftTrack] = pMixerTrackCluster;
+               mMixerTrackClusters.Add(pMixerTrackCluster);
                count++;
                this->IncrementSoloCount((int)(pLeftTrack->GetSolo()));
             }
@@ -550,18 +586,71 @@
    }
 
    if (pMixerTrackCluster)
-   {  // Added at least one MixerTrackCluster.
-      int width; 
-      int height;
-      mScrolledWindow->GetVirtualSize(&width, &height);
-      int reqVirtualWidth = count * mMixerTrackClusterWidth;
-      if (reqVirtualWidth > width)
-         width = reqVirtualWidth;
-      mScrolledWindow->SetVirtualSize(width, 
this->GetClientSize().GetHeight());
-      mScrolledWindow->Refresh(false); 
+      // Added at least one MixerTrackCluster.
+      this->UpdateWidth();
+}
+
+void MixerBoard::RemoveTrackCluster(const WaveTrack* pLeftTrack)
+{
+   // Find and destroy.
+   MixerTrackCluster* pMixerTrackCluster;
+   int nIndex = this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster);
+   if (pMixerTrackCluster == NULL) 
+      return; // Couldn't find it.
+      
+   mMixerTrackClusters.RemoveAt(nIndex);
+   pMixerTrackCluster->Destroy(); // delete is unsafe on wxWindow.
+
+   // Close the gap, if any.
+   wxPoint pos;
+   int targetX;
+   for (unsigned int i = nIndex; i < mMixerTrackClusters.GetCount(); i++)
+   {
+      pos = mMixerTrackClusters[i]->GetPosition();
+      targetX = 
+         (i * (kInset + MIXER_TRACK_CLUSTER_WIDTH)) + // left margin and width 
for each
+         kInset; // plus left margin for this cluster
+      if (pos.x != targetX)
+         mMixerTrackClusters[i]->Move(targetX, pos.y);
    }
+
+   this->UpdateWidth();
 }
 
+void MixerBoard::MoveTrackCluster(const WaveTrack* pLeftTrack, 
+                                  bool bUp) // Up in TrackPanel is left in 
MixerBoard.
+{
+   MixerTrackCluster* pMixerTrackCluster;
+   int nIndex = this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster);
+   if (pMixerTrackCluster == NULL) 
+      return; // Couldn't find it.
+
+   wxPoint pos;
+   if (bUp)
+   {  // Move it up (left).
+      wxASSERT(nIndex > 0); // Shouldn't be called if already first.
+
+      pos = pMixerTrackCluster->GetPosition();
+      mMixerTrackClusters[nIndex] = mMixerTrackClusters[nIndex - 1];
+      mMixerTrackClusters[nIndex]->Move(pos);
+
+      mMixerTrackClusters[nIndex - 1] = pMixerTrackCluster;
+      pMixerTrackCluster->Move(pos.x - (kInset + MIXER_TRACK_CLUSTER_WIDTH), 
pos.y);
+   }
+   else
+   {  // Move it down (right).
+      wxASSERT(((unsigned int)nIndex + 1) < mMixerTrackClusters.GetCount()); 
// Shouldn't be called if already last.
+
+      pos = pMixerTrackCluster->GetPosition();
+      mMixerTrackClusters[nIndex] = mMixerTrackClusters[nIndex + 1];
+      mMixerTrackClusters[nIndex]->Move(pos);
+
+      mMixerTrackClusters[nIndex + 1] = pMixerTrackCluster;
+      pMixerTrackCluster->Move(pos.x + (kInset + MIXER_TRACK_CLUSTER_WIDTH), 
pos.y);
+   }
+}
+
+
 wxBitmap* MixerBoard::GetMusicalInstrumentBitmap(const WaveTrack* pLeftTrack)
 {
    if (mMusicalInstruments.IsEmpty())
@@ -579,22 +668,28 @@
    unsigned int nScore;
    for (nInstrIndex = 0; nInstrIndex < mMusicalInstruments.GetCount(); 
nInstrIndex++)
    {
+      nScore = 0;
+
       nNumKeywords = mMusicalInstruments[nInstrIndex].mKeywords.GetCount();
       if (nNumKeywords > 0)
       {
          nPointsPerMatch = 10 / nNumKeywords;
-         nScore = 0;
          for (nKeywordIndex = 0; nKeywordIndex < nNumKeywords; nKeywordIndex++)
             if 
(strTrackName.Contains(mMusicalInstruments[nInstrIndex].mKeywords[nKeywordIndex]))
+            {
                nScore += 
                   nPointsPerMatch + 
                   // Longer keywords get more points.
                   (2 * 
mMusicalInstruments[nInstrIndex].mKeywords[nKeywordIndex].Length());
-         if (nScore > nBestScore)
-         {
-            nBestScore = nScore;
-            nBestItemIndex = nInstrIndex;
-         }
+            }
+      }
+
+      // Choose later one if just matching nBestScore, for better variety, 
+      // and so default works as last element.
+      if (nScore >= nBestScore) 
+      {
+         nBestScore = nScore;
+         nBestItemIndex = nInstrIndex;
       }
    }
    return mMusicalInstruments[nBestItemIndex].mBitmap;
@@ -612,13 +707,8 @@
 
 void MixerBoard::ResetMeters()
 {
-   MixerTrackClusterHash::iterator iterHash;
-   MixerTrackCluster* pMixerTrackCluster;
-   for (iterHash = mMixerTrackClusters.begin(); iterHash != 
mMixerTrackClusters.end(); ++iterHash)
-   {
-      pMixerTrackCluster = &(*iterHash->second);
-      pMixerTrackCluster->ResetMeter();
-   }
+   for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++)
+      mMixerTrackClusters[i]->ResetMeter();
 }
 
 void MixerBoard::UniquelyMuteOrSolo(const WaveTrack* pTargetLeftTrack, bool 
bSolo)
@@ -650,91 +740,58 @@
 
 void MixerBoard::UpdateName(const WaveTrack* pLeftTrack)
 {
-   MixerTrackClusterHash::iterator iterHash = 
mMixerTrackClusters.find(pLeftTrack);
-   if (iterHash != mMixerTrackClusters.end())
-   {  // Found it.
-      MixerTrackCluster* pMixerTrackCluster = &(*iterHash->second);
+   MixerTrackCluster* pMixerTrackCluster;
+   this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster);
+   if (pMixerTrackCluster != NULL) // Found it.
       pMixerTrackCluster->UpdateName();
-   }
 }
 
 void MixerBoard::UpdateMute(const WaveTrack* pLeftTrack /*= NULL*/) // NULL 
means update for all tracks.
 {
-   MixerTrackClusterHash::iterator iterHash;
-   MixerTrackCluster* pMixerTrackCluster;
    if (pLeftTrack == NULL) 
    {
-      for (iterHash = mMixerTrackClusters.begin(); iterHash != 
mMixerTrackClusters.end(); ++iterHash)
-      {
-         pMixerTrackCluster = &(*iterHash->second);
-         pMixerTrackCluster->UpdateMute();
-      }
+      for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++)
+         mMixerTrackClusters[i]->UpdateMute();
    }
    else 
    {
-      iterHash = mMixerTrackClusters.find(pLeftTrack);
-      if (iterHash != mMixerTrackClusters.end())
-      {  // Found it.
-         pMixerTrackCluster = &(*iterHash->second);
+      MixerTrackCluster* pMixerTrackCluster;
+      this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster);
+      if (pMixerTrackCluster != NULL) // Found it.
          pMixerTrackCluster->UpdateMute();
-      }
    }
 }
 
 void MixerBoard::UpdateSolo(const WaveTrack* pLeftTrack /*= NULL*/) // NULL 
means update for all tracks.
 {
-   MixerTrackClusterHash::iterator iterHash;
-   MixerTrackCluster* pMixerTrackCluster;
    if (pLeftTrack == NULL) 
    {
-      // Update all the MixerTrackClusters.
-      for (iterHash = mMixerTrackClusters.begin(); iterHash != 
mMixerTrackClusters.end(); ++iterHash)
-      {
-         pMixerTrackCluster = &(*iterHash->second);
-         pMixerTrackCluster->UpdateSolo();
-      }
-      
-      // Update mSoloCount.
-      mSoloCount = 0;
-      TrackListIterator iterTracks(mTracks);
-      Track* pLeftTrack = iterTracks.First();
-      while (pLeftTrack) {
-         if (pLeftTrack->GetKind() == Track::Wave) 
-            this->IncrementSoloCount((int)(pLeftTrack->GetSolo()));
-         if (pLeftTrack->GetLinked()) 
-            pLeftTrack = iterTracks.Next();
-         pLeftTrack = iterTracks.Next();
-      }
+      for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++)
+         mMixerTrackClusters[i]->UpdateSolo();
    }
    else 
    {
-      iterHash = mMixerTrackClusters.find(pLeftTrack);
-      if (iterHash != mMixerTrackClusters.end())
-      {  // Found it.
-         pMixerTrackCluster = &(*iterHash->second);
+      MixerTrackCluster* pMixerTrackCluster;
+      this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster);
+      if (pMixerTrackCluster != NULL) // Found it.
          pMixerTrackCluster->UpdateSolo();
-      }
    }
 }
 
 void MixerBoard::UpdatePan(const WaveTrack* pLeftTrack)
 {
-   MixerTrackClusterHash::iterator iterHash = 
mMixerTrackClusters.find(pLeftTrack);
-   if (iterHash != mMixerTrackClusters.end())
-   {  // Found it.
-      MixerTrackCluster* pMixerTrackCluster = &(*iterHash->second);
+   MixerTrackCluster* pMixerTrackCluster;
+   this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster);
+   if (pMixerTrackCluster != NULL) // Found it.
       pMixerTrackCluster->UpdatePan();
-   }
 }
 
 void MixerBoard::UpdateGain(const WaveTrack* pLeftTrack)
 {
-   MixerTrackClusterHash::iterator iterHash = 
mMixerTrackClusters.find(pLeftTrack);
-   if (iterHash != mMixerTrackClusters.end())
-   {  // Found it.
-      MixerTrackCluster* pMixerTrackCluster = &(*iterHash->second);
+   MixerTrackCluster* pMixerTrackCluster;
+   this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster);
+   if (pMixerTrackCluster != NULL) // Found it.
       pMixerTrackCluster->UpdateGain();
-   }
 }
 
 void MixerBoard::UpdateMeters(double t)
@@ -744,13 +801,23 @@
 
    mT = t;
 
-   MixerTrackClusterHash::iterator iterHash;
-   MixerTrackCluster* pMixerTrackCluster;
-   for (iterHash = mMixerTrackClusters.begin(); iterHash != 
mMixerTrackClusters.end(); ++iterHash)
-   {
-      pMixerTrackCluster = &(*iterHash->second);
-      pMixerTrackCluster->UpdateMeter(t);
-   }
+   for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++)
+      mMixerTrackClusters[i]->UpdateMeter(t);
+}
+
+void MixerBoard::UpdateWidth()
+{
+   int newWidth = 
+      (mMixerTrackClusters.GetCount() * 
+         (kInset + MIXER_TRACK_CLUSTER_WIDTH)) + // left margin and width for 
each
+      kTripleInset; // plus final right margin
+
+   mScrolledWindow->SetVirtualSize(newWidth - kInset, -1);
+
+   this->SetSizeHints(kInset + MIXER_TRACK_CLUSTER_WIDTH, // int minW=-1, // 
Show at least one cluster wide. 
+                        MIXER_BOARD_MIN_HEIGHT, // int minH=-1, 
+                        newWidth); // int maxW=-1, 
+   this->SetSize(newWidth, -1);
 }
 
 // private methods
@@ -820,13 +887,28 @@
    mImageSoloDisabled = new wxImage(mMuteSoloWidth, MUTE_SOLO_HEIGHT); // 
Leave empty because unused.
 }
 
+int MixerBoard::FindMixerTrackCluster(const WaveTrack* pLeftTrack, 
MixerTrackCluster** hMixerTrackCluster)
+{
+   *hMixerTrackCluster = NULL;
+   for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++)
+   {
+      if (mMixerTrackClusters[i]->mLeftTrack == pLeftTrack)
+      {
+         *hMixerTrackCluster = mMixerTrackClusters[i];
+         return i;
+      }
+   }
+   return -1;
+}
+
 void MixerBoard::LoadMusicalInstruments()
 {
    wxRect bev(1, 1, MUSICAL_INSTRUMENT_HEIGHT_AND_WIDTH - 2, 
MUSICAL_INSTRUMENT_HEIGHT_AND_WIDTH - 2);
    wxBitmap* bitmap;
    wxMemoryDC dc;
    MusicalInstrument* pMusicalInstrument;
-   
+
+
    bitmap = new wxBitmap((const char**)acoustic_guitar_gtr_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
@@ -838,37 +920,45 @@
    AColor::Bevel(dc, false, bev);
    pMusicalInstrument = new MusicalInstrument(bitmap, 
wxT("acoustic_piano_pno"));
    mMusicalInstruments.Add(pMusicalInstrument);
-  
+
+   bitmap = new wxBitmap((const char**)back_vocal_bg_vox_xpm);
+   dc.SelectObject(*bitmap);
+   AColor::Bevel(dc, false, bev);
+   pMusicalInstrument = new MusicalInstrument(bitmap, 
wxT("back_vocal_bg_vox"));
+   mMusicalInstruments.Add(pMusicalInstrument);
+
    bitmap = new wxBitmap((const char**)clap_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
    pMusicalInstrument = new MusicalInstrument(bitmap, wxT("clap"));
    mMusicalInstruments.Add(pMusicalInstrument);
-  
+
+
    bitmap = new wxBitmap((const char**)drums_dr_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
    pMusicalInstrument = new MusicalInstrument(bitmap, wxT("drums_dr"));
    mMusicalInstruments.Add(pMusicalInstrument);
   
-   bitmap = new wxBitmap((const char**)electric_bass_guitar_el_bs_gtr_xpm);
+   bitmap = new wxBitmap((const char**)electric_bass_guitar_bs_gtr_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
-   pMusicalInstrument = new MusicalInstrument(bitmap, 
wxT("electric_bass_guitar_el_bs_gtr"));
+   pMusicalInstrument = new MusicalInstrument(bitmap, 
wxT("electric_bass_guitar_bs_gtr"));
    mMusicalInstruments.Add(pMusicalInstrument);
 
-   bitmap = new wxBitmap((const char**)electric_guitar_el_gtr_xpm);
+   bitmap = new wxBitmap((const char**)electric_guitar_gtr_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
-   pMusicalInstrument = new MusicalInstrument(bitmap, 
wxT("electric_guitar_el_gtr"));
+   pMusicalInstrument = new MusicalInstrument(bitmap, 
wxT("electric_guitar_gtr"));
    mMusicalInstruments.Add(pMusicalInstrument);
 
-   bitmap = new wxBitmap((const char**)electric_piano_el_pno_key_xpm);
+   bitmap = new wxBitmap((const char**)electric_piano_pno_key_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
-   pMusicalInstrument = new MusicalInstrument(bitmap, 
wxT("electric_piano_el_pno_key"));
+   pMusicalInstrument = new MusicalInstrument(bitmap, 
wxT("electric_piano_pno_key"));
    mMusicalInstruments.Add(pMusicalInstrument);
 
+
    bitmap = new wxBitmap((const char**)kick_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
@@ -893,16 +983,17 @@
    pMusicalInstrument = new MusicalInstrument(bitmap, wxT("sax"));
    mMusicalInstruments.Add(pMusicalInstrument);
 
-   bitmap = new wxBitmap((const char**)string_violin_cello_xpm);
+
+   bitmap = new wxBitmap((const char**)snare_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
-   pMusicalInstrument = new MusicalInstrument(bitmap, 
wxT("string_violin_cello"));
+   pMusicalInstrument = new MusicalInstrument(bitmap, wxT("snare"));
    mMusicalInstruments.Add(pMusicalInstrument);
 
-   bitmap = new wxBitmap((const char**)snare_xpm);
+   bitmap = new wxBitmap((const char**)string_violin_cello_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
-   pMusicalInstrument = new MusicalInstrument(bitmap, wxT("snare"));
+   pMusicalInstrument = new MusicalInstrument(bitmap, 
wxT("string_violin_cello"));
    mMusicalInstruments.Add(pMusicalInstrument);
 
    bitmap = new wxBitmap((const char**)synth_xpm);
@@ -917,10 +1008,11 @@
    pMusicalInstrument = new MusicalInstrument(bitmap, wxT("tambo"));
    mMusicalInstruments.Add(pMusicalInstrument);
 
-   bitmap = new wxBitmap((const char**)trumpet_tr_xpm);
+
+   bitmap = new wxBitmap((const char**)trumpet_horn_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
-   pMusicalInstrument = new MusicalInstrument(bitmap, wxT("trumpet_tr"));
+   pMusicalInstrument = new MusicalInstrument(bitmap, wxT("trumpet_horn"));
    mMusicalInstruments.Add(pMusicalInstrument);
 
    bitmap = new wxBitmap((const char**)turntable_xpm);
@@ -938,13 +1030,46 @@
    bitmap = new wxBitmap((const char**)vocal_vox_xpm);
    dc.SelectObject(*bitmap);
    AColor::Bevel(dc, false, bev);
-   pMusicalInstrument = new MusicalInstrument(bitmap, wxT("vocal_vocals_vox"));
+   pMusicalInstrument = new MusicalInstrument(bitmap, wxT("vocal_vox"));
+   mMusicalInstruments.Add(pMusicalInstrument);
+
+
+   // This one should always be last, so it wins when best score is 0.
+   bitmap = new wxBitmap((const char**)_default_instrument_xpm); 
+   dc.SelectObject(*bitmap);
+   AColor::Bevel(dc, false, bev);
+   pMusicalInstrument = new MusicalInstrument(bitmap, wxEmptyString);
    mMusicalInstruments.Add(pMusicalInstrument);
 }
 
 // event handlers
-void MixerBoard::OnCloseWindow(wxCloseEvent & WXUNUSED(event))
+void MixerBoard::OnCloseWindow(wxCloseEvent &WXUNUSED(event))
 {
   this->Hide();
 }
 
+void MixerBoard::OnMaximize(wxMaximizeEvent &event) 
+{
+   // Update the size hints before skipping to let default handling happen.
+   // Try to show all clusters.
+   int newWidth = 
+      (mMixerTrackClusters.GetCount() * (kInset + MIXER_TRACK_CLUSTER_WIDTH)) 
+ // left margin and width for each
+                     kTripleInset; // plus final right margin
+   this->SetSizeHints(kInset + MIXER_TRACK_CLUSTER_WIDTH, // int minW=-1, // 
Show at least one cluster wide. 
+                        MIXER_BOARD_MIN_HEIGHT, // int minH=-1, 
+                        newWidth); // int maxW=-1, 
+
+   mScrolledWindow->SetVirtualSize(newWidth - kInset, -1);
+
+   event.Skip();
+}
+
+void MixerBoard::OnSize(wxSizeEvent &evt)
+{
+   // this->FitInside() doesn't work, and it doesn't happen automatically. Is 
wxScrolledWindow wrong?
+   mScrolledWindow->SetSize(this->GetClientSize());
+   
+   for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++)
+      mMixerTrackClusters[i]->UpdateHeight();
+
+}
\ No newline at end of file

Index: TrackPanel.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/TrackPanel.cpp,v
retrieving revision 1.212.2.15.2.5
retrieving revision 1.212.2.15.2.6
diff -u -d -r1.212.2.15.2.5 -r1.212.2.15.2.6
--- TrackPanel.cpp      10 Feb 2007 04:06:52 -0000      1.212.2.15.2.5
+++ TrackPanel.cpp      20 Feb 2007 07:20:27 -0000      1.212.2.15.2.6
@@ -2705,6 +2705,13 @@
    Track *t = iter.First();
    while (t) {
       if (t == toRemove || t == partner) {
+         if (t->GetKind() == Track::Wave)
+         {
+            MixerBoard* pMixerBoard = this->GetMixerBoard(); // Update mixer 
board, too.
+            if (pMixerBoard)
+               pMixerBoard->RemoveTrackCluster((WaveTrack*)t);
+         }
+
          name = t->GetName();
          delete t;
          t = iter.RemoveCurrent();
@@ -3046,10 +3053,19 @@
       SetCursor(*mArrowCursor);
       return;
    }
+   MixerBoard* pMixerBoard = this->GetMixerBoard(); // Update mixer board, too.
    if (event.m_y < mMoveUpThreshold)
+   {
       mTracks->MoveUp(mCapturedTrack);
+      if (pMixerBoard)
+         pMixerBoard->MoveTrackCluster((WaveTrack*)mCapturedTrack, true);
+   }
    else if (event.m_y > mMoveDownThreshold)
+   {
       mTracks->MoveDown(mCapturedTrack);
+      if (pMixerBoard)
+         pMixerBoard->MoveTrackCluster((WaveTrack*)mCapturedTrack, false);
+   }
    else
       return;
 
@@ -4419,7 +4435,12 @@
 void TrackPanel::OnMoveTrack(wxCommandEvent & event)
 {
    wxASSERT(event.GetId() == OnMoveUpID || event.GetId() == OnMoveDownID);
-   if (mTracks->Move(mPopupMenuTarget, OnMoveUpID == event.GetId())) {
+   bool bUp = (OnMoveUpID == event.GetId());
+   if (mTracks->Move(mPopupMenuTarget, bUp)) {
+      MixerBoard* pMixerBoard = this->GetMixerBoard(); // Update mixer board, 
too.
+      if (pMixerBoard)
+         pMixerBoard->MoveTrackCluster((WaveTrack*)mPopupMenuTarget, bUp);
+      
       MakeParentPushState(wxString::Format(_("Moved '%s' %s"),
                                            mPopupMenuTarget->GetName().
                                            c_str(),

Index: MixerBoard.h
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/Attic/MixerBoard.h,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -d -r1.1.2.3 -r1.1.2.4
--- MixerBoard.h        14 Feb 2007 09:46:11 -0000      1.1.2.3
+++ MixerBoard.h        20 Feb 2007 07:20:27 -0000      1.1.2.4
@@ -41,6 +41,9 @@
 
    void ResetMeter();
 
+   void UpdateHeight(); // For wxSizeEvents, update gain slider and meter.
+
+   // These are used by TrackPanel for synchronizing control states, etc.
    void UpdateName();
    void UpdateMute();
    void UpdateSolo();
@@ -62,13 +65,14 @@
    void OnSlider_Gain(wxCommandEvent& event);
    void OnSliderScroll_Gain(wxScrollEvent& event);
 
+public:
+   WaveTrack* mLeftTrack;
+   WaveTrack* mRightTrack;
+
 private:
    MixerBoard* mMixerBoard;
    AudacityProject* mProject;
 
-   WaveTrack* mLeftTrack;
-   WaveTrack* mRightTrack;
-
    // controls
    wxStaticText* mStaticText_TrackName;
    wxStaticBitmap* mStaticBitmap_MusicalInstrument;
@@ -82,10 +86,8 @@
    DECLARE_EVENT_TABLE()
 };
 
+WX_DEFINE_ARRAY(MixerTrackCluster*, MixerTrackClusterArray);
 
-class TrackList;
-
-WX_DECLARE_VOIDPTR_HASH_MAP(MixerTrackCluster*, MixerTrackClusterHash);
 
 class MusicalInstrument {
 public:
@@ -97,13 +99,17 @@
 };
 WX_DECLARE_OBJARRAY(MusicalInstrument, MusicalInstrumentArray);
 
+
+class TrackList;
+
 class MixerBoard : public wxFrame { 
 public:
    MixerBoard(AudacityProject* parent);
    ~MixerBoard();
 
    void AddTrackClusters(); // Add clusters for any tracks we're not yet 
showing.
-   //vvv Also need to remove clusters for any removed tracks. 
+   void RemoveTrackCluster(const WaveTrack* pLeftTrack);
+   void MoveTrackCluster(const WaveTrack* pLeftTrack, bool bUp); // Up in 
TrackPanel is left in MixerBoard.
 
    wxBitmap* GetMusicalInstrumentBitmap(const WaveTrack* pLeftTrack);
 
@@ -122,12 +128,18 @@
    
    void UpdateMeters(double t);
 
+   void UpdateWidth();
+
 private:
    void CreateMuteSoloImages();
+   int FindMixerTrackCluster(const WaveTrack* pLeftTrack, MixerTrackCluster** 
hMixerTrackCluster);
    void LoadMusicalInstruments();
 
    // event handlers
-   void OnCloseWindow(wxCloseEvent & WXUNUSED(event));
+   void OnCloseWindow(wxCloseEvent &WXUNUSED(event));
+   void OnMaximize(wxMaximizeEvent &event);
+   void OnSize(wxSizeEvent &evt);
+
 
 public:
    // mute & solo button images: Create once and store on MixerBoard for use 
in all MixerTrackClusters.
@@ -144,8 +156,7 @@
    int mMuteSoloWidth;
 
 private:
-   MixerTrackClusterHash   mMixerTrackClusters; // Hash clusters based on the 
left WaveTrack* they're showing.
-   int                     mMixerTrackClusterWidth;
+   MixerTrackClusterArray  mMixerTrackClusters; 
    MusicalInstrumentArray  mMusicalInstruments; 
    AudacityProject*        mProject;
    wxScrolledWindow*       mScrolledWindow; // Holds the MixerTrackClusters 
and handles scrolling.


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Audacity-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/audacity-cvs

Reply via email to