⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 batchprefs.cpp

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 CPP
字号:
/**********************************************************************  Audacity: A Digital Audio Editor  BatchPrefs.cpp  Dominic Mazzoni  James Crook**********************************************************************/#include "BatchPrefs.h"#include "../Audacity.h"#include "../EditToolBar.h"#include "../Envelope.h"#include "../Languages.h"#include "../Prefs.h"#include "../Project.h"#include "../BatchCommandDialog.h"#include <wx/defs.h>#include <wx/checkbox.h>#include <wx/choice.h>#include <wx/intl.h>#include <wx/sizer.h>#include <wx/statbox.h>#include <wx/stattext.h>#include <wx/textctrl.h>#include <wx/radiobut.h>#include <wx/button.h>#define AssignDefaultsButtonID  7001#define CurrentComboID          7002#define SetButtonID             7003#define ClearButtonID           7004#define CommandsListID          7005#define SaveButtonID            7006#define LoadButtonID            7007#define CleanSpeechButtonID     7008#define Mp3ButtonID             7009#define EmptyChainButtonID      7010BEGIN_EVENT_TABLE(BatchPrefs, wxPanel)//   EVT_BUTTON(AssignDefaultsButtonID, BatchPrefs::OnDefaults)//   EVT_BUTTON(SetButtonID, BatchPrefs::OnSet)//   EVT_BUTTON(ClearButtonID, BatchPrefs::OnClear)//   EVT_BUTTON(SaveButtonID, BatchPrefs::OnSave)//   EVT_BUTTON(LoadButtonID, BatchPrefs::OnLoad)   EVT_LIST_ITEM_ACTIVATED(CommandsListID, BatchPrefs::OnItemSelected)   EVT_LIST_BEGIN_DRAG(CommandsListID, BatchPrefs::OnDrag)  // The user has started dragging an item with the left mouse button. The event handler must call wxTreeEvent::Allow() for the drag operation to continue.     EVT_BUTTON(CleanSpeechButtonID, BatchPrefs::OnSetChainCleanSpeech)   EVT_BUTTON(Mp3ButtonID,         BatchPrefs::OnSetChainMp3)   EVT_BUTTON(EmptyChainButtonID,  BatchPrefs::OnSetChainEmpty)//EVT_TREE_BEGIN_RDRAG(id, func)  // The user has started dragging an item with the right mouse button. The event handler must call wxTreeEvent::Allow() for the drag operation to continue.  //   EVT_LIST_END_DRAG(CommandsListID, BatchPrefs::OnDragEnd)   // The user has released the mouse after dragging an item.  END_EVENT_TABLE()enum { BlankColumn,      ItemNumberColumn,       ActionColumn,    ParamsColumn,};// Titles for the lists of check boxes.const wxString Titles[NUM_BATCH_CHECKBOX_CONTAINERS] ={   _("Behaviors"),  // e.g. 'Pause Always Allowed'.   _("Show / Hide") // e.g. show/hide a toolbar or a tabbed window.};BatchPrefs::BatchPrefs(wxWindow * parent):   PrefsPanel(parent){   int i;   topSizer = new wxBoxSizer( wxVERTICAL );   // CheckSizer is a sizer that holds the left and right sizers.   wxBoxSizer * CheckSizer = new wxBoxSizer( wxHORIZONTAL );   // We have two containers, a left and a right one.   for(i=0;i<NUM_BATCH_CHECKBOX_CONTAINERS;i++)   {      mCheckListSizers[i] = new wxStaticBoxSizer(            new wxStaticBox(this, -1,         Titles[i] ),         wxVERTICAL );#if USE_SCROLLING_CHECK_LISTBOX_IN_PREFS      mCheckListBoxes[i] = new wxCheckListBox           (            this,                  // parent            -1,                    // control id            wxPoint(10, 10),       // listbox poistion            wxSize(245, 130),      // listbox size            0,                     // initially no entries.            NULL,                  // initial empty list of strings.            0           );      if( mCheckListBoxes[i] )         mCheckListSizers[i]->Add(mCheckListBoxes[i], 1, wxGROW|wxALL, 2);#endif      CheckSizer->Add( mCheckListSizers[i], 1, wxGROW|wxALL, 1);   }   // And CheckSizer is itself added in to the topSizer.   topSizer->Add( CheckSizer, 0, wxGROW | wxALL, TOP_LEVEL_BORDER );   // Create all the checkboxes.   mbCreating=true;   AllCheckBoxActions();   // batchControlSizer is a sizer that holds the left and right sizers.   wxBoxSizer * batchControlSizer = new wxBoxSizer( wxHORIZONTAL );   wxStaticBoxSizer *batchOptionsSizer =      new wxStaticBoxSizer(         new wxStaticBox(this, -1, _("Batch Options")),            wxVERTICAL);   wxStaticText * item =       new wxStaticText(this, -1,                        _("Batch mode is an\n experimental feature.\n\nPlease read the release\n notes for known limitations"),                        wxDefaultPosition, wxDefaultSize, 0);   batchOptionsSizer->Add(item, 0, wxALIGN_LEFT | wxALL, 5);   wxButton * btnCleanSpeech = new wxButton( this, CleanSpeechButtonID,      _("CleanSpeech Chain"), wxDefaultPosition, wxDefaultSize, 0);   wxButton * btnMp3 = new wxButton( this, Mp3ButtonID,      _("Mp3 Conversion Chain"), wxDefaultPosition, wxDefaultSize, 0);   wxButton * btnEmpty = new wxButton( this, EmptyChainButtonID,      _("Empty Chain"), wxDefaultPosition, wxDefaultSize, 0);   batchOptionsSizer->Add(btnCleanSpeech, 0, wxALIGN_CENTER | wxALL, 5);   batchOptionsSizer->Add(btnMp3, 0, wxALIGN_CENTER | wxALL, 5);   batchOptionsSizer->Add(btnEmpty, 0, wxALIGN_CENTER | wxALL, 5);   batchControlSizer->Add( batchOptionsSizer, 1, wxGROW|wxALL, 1);    wxStaticBoxSizer *batchSequenceSizer =      new wxStaticBoxSizer(         new wxStaticBox(this, -1, _("Batch Sequence (Double-Click to edit)")),            wxVERTICAL);   mList = new wxListCtrl( this, CommandsListID ,      wxDefaultPosition, wxDefaultSize,      wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxSUNKEN_BORDER       );   wxASSERT( mList );   //An empty first column is a workaround - under Win98 the first column    //can't be right aligned.   mList->InsertColumn(BlankColumn,   wxT(""),         wxLIST_FORMAT_LEFT );   mList->InsertColumn(ItemNumberColumn,    _("No"),   wxLIST_FORMAT_RIGHT );   mList->InsertColumn(ActionColumn,  _("Command"),    wxLIST_FORMAT_RIGHT );   mList->InsertColumn(ParamsColumn,  _("Parameters"), wxLIST_FORMAT_LEFT );   wxASSERT( mList );   mBatchCommands.ReadChain();   PopulateList();   mList->SetColumnWidth( BlankColumn,  0 ); // First column width is zero, to hide it.   mList->SetColumnWidth( ItemNumberColumn,  wxLIST_AUTOSIZE );   mList->SetColumnWidth( ActionColumn, 110 );   mList->SetColumnWidth( ParamsColumn, 320 );   batchSequenceSizer->Add( mList, 1, wxEXPAND );   batchControlSizer->Add( batchSequenceSizer, 3, wxGROW|wxALL, 1);   topSizer->Add( batchControlSizer, 1, wxEXPAND );   // Finish layout   outSizer = new wxBoxSizer( wxVERTICAL );   outSizer->Add(topSizer, 1, wxGROW|wxALL, TOP_LEVEL_BORDER);   SetAutoLayout(true);   SetSizer(outSizer);   outSizer->Fit(this);   outSizer->SetSizeHints(this);}void BatchPrefs::PopulateList(){   unsigned int i;   wxString command;   wxString params;   wxASSERT( mList );   mList->DeleteAllItems();   for(i=0;i<mBatchCommands.mCommandChain.GetCount();i++)   {      command =mBatchCommands.mCommandChain[i];       params  =mBatchCommands.mParamsChain[i];      AddItem( command, params );   }   AddItem( _("- END -"), wxT(""));   mList->Refresh(false);}void BatchPrefs::OnSetChainMp3(wxCommandEvent &event){   mBatchCommands.SetWavToMp3Chain();   PopulateList();}void BatchPrefs::OnSetChainCleanSpeech(wxCommandEvent &event){   mBatchCommands.SetCleanSpeechChain();   PopulateList();}void BatchPrefs::OnSetChainEmpty(wxCommandEvent &event){   mBatchCommands.ResetChain();   PopulateList();}void BatchPrefs::OnDrag(wxListEvent &event){   event.Allow();//   wxLogDebug( "From %i", event.GetItem() );//   mDragStart = event.GetItem();}void BatchPrefs::OnDragEnd(wxListEvent &event){   int i;   i=7;}void BatchPrefs::OnItemSelected(wxListEvent &event){   int itemNo = event.GetIndex();   // Keep chain short.   // We currently only store shortish chains in the prefs.   if( itemNo > 20 )      return;   wxString command, params;   BatchCommandDialog Dlg( this, -1);   wxListItem info;   info.SetId( itemNo );   info.SetMask( wxLIST_MASK_TEXT );   info.SetColumn( ActionColumn );   mList->GetItem( info );    command = info.GetText();   info.SetColumn( ParamsColumn );   mList->GetItem( info );    params = info.GetText();      Dlg.SetCommandAndParams( command, params );   if( Dlg.ShowModal())   {      SetItem(          itemNo,          Dlg.mSelectedCommand,         Dlg.mSelectedParameters);   }}wxCheckBox * BatchPrefs::CreateCheckBox(const wxString Description, const bool State){   wxSizer * pSizer;   pSizer = mCheckListSizers[mCurrentCheckBoxContainer];   wxASSERT( pSizer );   wxCheckBox * pCheckBox = new wxCheckBox(this, -1, Description);   pCheckBox->SetValue(State);   pSizer->Add(pCheckBox, 0, wxGROW|wxALL, 2);   return pCheckBox;}// TIDY-ME: Can CheckBoxAction be made part of the base class?// It is used by both GuiPrefs and BatchPrefs.// Function that deals with one checkbox, either creating it or// using its value to update gPrefs and the GUI.// The function is made more complex by coping with// checkboxes in a sizer or checkboxes in a check list box.void BatchPrefs::CheckBoxAction(   const wxString Description,   const wxString SettingName,   bool bDefault,   int mWindowID){   bool bValue = false;   bool bIsInListBox;// TODO:  What should we do if on a Mac?// wxWidgets 2.4.1 documentation suggests that wxCheckListBox isn't// supported on Mac.#if USE_SCROLLING_CHECK_LISTBOX_IN_PREFS   int Counter = ++(mCheckBoxCounters[mCurrentCheckBoxContainer]);   wxCheckListBox * pCurrentList = mCheckListBoxes[mCurrentCheckBoxContainer];   // If there was a non null list box, then it goes in it.   bIsInListBox = ( pCurrentList != NULL );#else   bIsInListBox = false;#endif   if( !bIsInListBox )   {      // It's on the dialog, better make sure we      // have a slot for a check box pointer for it.      mCurrentCheckBox++;      wxASSERT( mCurrentCheckBox < MAX_BATCH_CHECKBOXES );   }   // IF Creating THEN create the checkbox, reading from gPrefs   if( mbCreating )   {      gPrefs->Read(SettingName, &bValue, bDefault);      if( !bIsInListBox )      {         mCheckBoxes[ mCurrentCheckBox ] =            CreateCheckBox( Description, bValue );      }      else      {#if USE_SCROLLING_CHECK_LISTBOX_IN_PREFS         wxASSERT( pCurrentList );         pCurrentList->Append( Description );         pCurrentList->Check(Counter, bValue);#endif      }   }   // ELSE we are taking the value and writing it to   // gPrefs and then applying the settings   else   {      if( !bIsInListBox )      {         wxASSERT( mCheckBoxes[ mCurrentCheckBox ] != NULL );         bValue = mCheckBoxes[ mCurrentCheckBox ]->GetValue();      }      else      {#if USE_SCROLLING_CHECK_LISTBOX_IN_PREFS         wxASSERT( pCurrentList );         bValue = pCurrentList->IsChecked( Counter );#endif      }      gPrefs->Write(SettingName,bValue);   }}void BatchPrefs::AddItem( wxString const & Action, wxString const & Params){   int i=mList->GetItemCount();   mList->InsertItem( i, wxT("") );   mList->SetItem( i, ItemNumberColumn, wxString::Format(wxT(" %02i"),i+1) );   mList->SetItem( i, ActionColumn, Action );   mList->SetItem( i, ParamsColumn, Params );}/// This is a condensed list of all the check boxes./// This function is used in two ways :///   a) when creating the check boxes.///   b) when applying the settings./// Member variables of BatchPrefs are set before calling this function/// so that it 'knows what to do'./// This removes repetitive code and guarantees that the same setting/// names are used in saving the parameters as were used in retrieving/// them.void BatchPrefs::AllCheckBoxActions(){   mCurrentCheckBox=-1;   mCheckBoxCounters[0]=-1;   mCheckBoxCounters[1]=-1;   mCurrentCheckBoxContainer=0;   CheckBoxAction(_("Batch debug mode"),  wxT("/Batch/Debug"), false);   CheckBoxAction(_("Normalize on load"), wxT("/Batch/NormalizeOnLoad"), false );   CheckBoxAction(_("Prompt to save, even if empty"),    wxT("/Batch/EmptyCanBeDirty"), false );   CheckBoxAction(_("CleanSpeech Mode (Customized GUI)"), wxT("/Batch/CleanSpeechMode"), false);   mCurrentCheckBoxContainer=1;   CheckBoxAction(_("Show Mp3-ID3 Dialog"), wxT("/Batch/ShowId3Dialog"), false);// CheckBoxAction(_("Show Confirmation for 'delete orphans'"), wxT("/Batch/ShowDeleteConfirmation"), true);// Commented out code might be useful as a first step if we want an immediate response to // switching in and out of CleanSpeech mode.// As things currently stand, the batch commands available will NOT reflect changes in// CleanSpeech mode until we close and reopen the preferences dialog.#if 0   int mode;   AudacityProject *proj = GetActiveProject();   mode = gPrefs->Read(wxT("/Batch/CleanSpeechMode"), 1L);   proj->SetCleanSpeechMode(mode == 1);#endif};bool BatchPrefs::Apply(){   mbCreating = false;   AllCheckBoxActions();   unsigned int j;   for(j = 0; j < gAudacityProjects.GetCount(); j++)   {      gAudacityProjects[j]->UpdateBatchPrefs();      gAudacityProjects[j]->LayoutToolBars(); // Just to add/remove the CleanSpeech button.   }   mBatchCommands.SaveChain();   return true;}BatchPrefs::~BatchPrefs(){}void BatchPrefs::SetItem(int itemNo, const wxString command, const wxString params){   // There is a 'rogue' entry of "- END -" at the end of the list   // which users can click on to add an entry to the end.   // There is a special entry of "No Action" in the effects list,   // which can be used to delete an entry.   // special case - deleting an item.   if( command.IsSameAs(wxT("No Action")))   {      //Attempt to delete the 'rogue' entry at the end.      if( (itemNo+1) >= mList->GetItemCount() )         return;      mBatchCommands.mCommandChain.RemoveAt( itemNo );      mBatchCommands.mParamsChain.RemoveAt( itemNo );      PopulateList();      return;   }   // Set the item in the list.   mList->SetItem( itemNo ,ActionColumn, command );    mList->SetItem( itemNo ,ParamsColumn, params );   // IF at end of list THEN extend list   // else replace item.   if( (itemNo+1) >= mList->GetItemCount() )   {      // Add new rogue      AddItem( _("- END -"),wxT(""));      mBatchCommands.mCommandChain.Add( command );      mBatchCommands.mParamsChain.Add( params );   }   else   {      mBatchCommands.mCommandChain[itemNo] = command;      mBatchCommands.mParamsChain[itemNo] = params;   }   mList->Refresh(false);}// Indentation settings for Vim and Emacs and unique identifier for Arch, a// version control system. Please do not modify past this point.//// Local Variables:// c-basic-offset: 3// indent-tabs-mode: nil// End://// vim: et sts=3 sw=3// arch-tag: 7e997d04-6b94-4abb-b3d6-748400f86598

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -