1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-08 16:11:14 +02:00
audacity/src/toolbars/EditToolBar.cpp
lllucius 1eeb4d979a The fabled realtime effects...
I've made it where you can enable and disable via experimentals:

EXPERIMENTAL_REALTIME_EFFECTS
EXPERIMENTAL_EFFECTS_RACK

You will notice that, as of now, the only effects currently set up for
realtime are VSTs.  Now that this is in, I will start converting the
rest.

As I start to convert the effects, the astute of you may notice that
they no longer directly access tracks or any "internal" Audacity
objects.  This isolates the effects from changes in Audacity and makes
it much easier to add new ones.

Anyway, all 3 platforms can now display VST effects in graphical mode.
Yes, that means Linux too.  There are quite a few VSTs for Linux if
you search for them.

The so-called "rack" definitely needs some discussion, work, and attention
from someone much better at graphics than me.  I'm not really sure it should
stay in as-is.  I'd originally planned for it to be simply a utility window
where you can store your (preconfigured) favorite effects.  It should probably
revert back to that idea.

You may notice that this DOES include the API work I did.  The realtime effects
were too tied to it and I didn't want to redo the whole thing.  As I mentioned
elsewhere, the API stuff may or may not be very future proof.

So, let the critter complaints commence.  I absolute KNOW there will be some.
(I know I'll be hearing from the Linux peeps pretty darn quickly.  ;-))
2014-10-26 03:24:10 +00:00

333 lines
8.8 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
EditToolBar.cpp
Dominic Mazzoni
Shane T. Mueller
Leland Lucius
See EditToolBar.h for details
*******************************************************************//*!
\class EditToolBar
\brief A ToolBar that has the edit buttons on it.
This class, which is a child of Toolbar, creates the
window containing interfaces to commonly-used edit
functions that are otherwise only available through
menus. The window can be embedded within a normal project
window, or within a ToolbarFrame that is managed by a
global ToolBarStub called gControlToolBarStub.
All of the controls in this window were custom-written for
Audacity - they are not native controls on any platform -
however, it is intended that the images could be easily
replaced to allow "skinning" or just customization to
match the look and feel of each platform.
*//*******************************************************************/
#include "../Audacity.h"
// For compilers that support precompilation, includes "wx/wx.h".
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/event.h>
#include <wx/image.h>
#include <wx/intl.h>
#include <wx/sizer.h>
#include <wx/tooltip.h>
#endif
#include "EditToolBar.h"
#include "../AllThemeResources.h"
#include "../AudioIO.h"
#include "../ImageManipulation.h"
#include "../Internat.h"
#include "../Prefs.h"
#include "../Project.h"
#include "../Theme.h"
#include "../UndoManager.h"
#include "../widgets/AButton.h"
IMPLEMENT_CLASS(EditToolBar, ToolBar);
const int BUTTON_WIDTH = 27;
const int SEPARATOR_WIDTH = 14;
////////////////////////////////////////////////////////////
/// Methods for EditToolBar
////////////////////////////////////////////////////////////
BEGIN_EVENT_TABLE( EditToolBar, ToolBar )
EVT_COMMAND_RANGE( ETBCutID,
ETBCutID + ETBNumButtons - 1,
wxEVT_COMMAND_BUTTON_CLICKED,
EditToolBar::OnButton )
END_EVENT_TABLE()
//Standard contructor
EditToolBar::EditToolBar()
: ToolBar(EditBarID, _("Edit"), wxT("Edit"))
{
}
EditToolBar::~EditToolBar()
{
for (int i=0; i<ETBNumButtons; i++)
delete mButtons[i];
}
void EditToolBar::Create(wxWindow * parent)
{
ToolBar::Create(parent);
}
void EditToolBar::AddSeparator()
{
AddSpacer();
}
/// This is a convenience function that allows for button creation in
/// MakeButtons() with fewer arguments
/// Very similar to code in ControlToolBar...
AButton *EditToolBar::AddButton(
teBmps eEnabledUp, teBmps eEnabledDown, teBmps eDisabled,
int id,
const wxChar *label,
bool toggle)
{
AButton *&r = mButtons[id];
r = ToolBar::MakeButton(
bmpRecoloredUpSmall, bmpRecoloredDownSmall, bmpRecoloredHiliteSmall,
eEnabledUp, eEnabledDown, eDisabled,
wxWindowID(id),
wxDefaultPosition,
toggle,
theTheme.ImageSize( bmpRecoloredUpSmall ));
r->SetLabel(label);
// JKC: Unlike ControlToolBar, does not have a focus rect. Shouldn't it?
// r->SetFocusRect( r->GetRect().Deflate( 4, 4 ) );
Add( r, 0, wxALIGN_CENTER );
return r;
}
void EditToolBar::Populate()
{
MakeButtonBackgroundsSmall();
/* Buttons */
AddButton(bmpCut, bmpCut, bmpCutDisabled, ETBCutID,
_("Cut selection"));
AddButton(bmpCopy, bmpCopy, bmpCopyDisabled, ETBCopyID,
_("Copy selection"));
AddButton(bmpPaste, bmpPaste, bmpPasteDisabled, ETBPasteID,
_("Paste"));
AddButton(bmpTrim, bmpTrim, bmpTrimDisabled, ETBTrimID,
_("Trim audio outside selection"));
AddButton(bmpSilence, bmpSilence, bmpSilenceDisabled, ETBSilenceID,
_("Silence audio selection"));
AddSeparator();
AddButton(bmpUndo, bmpUndo, bmpUndoDisabled, ETBUndoID,
_("Undo"));
AddButton(bmpRedo, bmpRedo, bmpRedoDisabled, ETBRedoID,
_("Redo"));
AddSeparator();
#ifdef EXPERIMENTAL_SYNC_LOCK
AddButton(bmpSyncLockTracksUp, bmpSyncLockTracksDown, bmpSyncLockTracksDisabled, ETBSyncLockID,
_("Sync-Lock Tracks"), true);
AddSeparator();
#endif
AddButton(bmpZoomIn, bmpZoomIn, bmpZoomInDisabled, ETBZoomInID,
_("Zoom In"));
AddButton(bmpZoomOut, bmpZoomOut, bmpZoomOutDisabled, ETBZoomOutID,
_("Zoom Out"));
AddButton(bmpZoomSel, bmpZoomSel, bmpZoomSelDisabled, ETBZoomSelID,
_("Fit selection in window"));
AddButton(bmpZoomFit, bmpZoomFit, bmpZoomFitDisabled, ETBZoomFitID,
_("Fit project in window"));
mButtons[ETBZoomInID]->SetEnabled(false);
mButtons[ETBZoomOutID]->SetEnabled(false);
mButtons[ETBZoomSelID]->SetEnabled(false);
mButtons[ETBZoomFitID]->SetEnabled(false);
mButtons[ETBPasteID]->SetEnabled(false);
#ifdef EXPERIMENTAL_SYNC_LOCK
mButtons[ETBSyncLockID]->PushDown();
#endif
#if defined(EXPERIMENTAL_EFFECTS_RACK)
AddSeparator();
AddButton(bmpEditEffects, bmpEditEffects, bmpEditEffects, ETBEffectsID,
_("Show Effects Rack"), true);
#endif
RegenerateTooltips();
}
void EditToolBar::UpdatePrefs()
{
RegenerateTooltips();
// Set label to pull in language change
SetLabel(_("Edit"));
// Give base class a chance
ToolBar::UpdatePrefs();
}
void EditToolBar::RegenerateTooltips()
{
#if wxUSE_TOOLTIPS
mButtons[ETBCutID]->SetToolTip(_("Cut"));
mButtons[ETBCopyID]->SetToolTip(_("Copy"));
mButtons[ETBPasteID]->SetToolTip(_("Paste"));
mButtons[ETBTrimID]->SetToolTip(_("Trim Audio"));
mButtons[ETBSilenceID]->SetToolTip(_("Silence Audio"));
mButtons[ETBUndoID]->SetToolTip(_("Undo"));
mButtons[ETBRedoID]->SetToolTip(_("Redo"));
#ifdef EXPERIMENTAL_SYNC_LOCK
mButtons[ETBSyncLockID]->SetToolTip(_("Sync-Lock Tracks"));
#endif
mButtons[ETBZoomInID]->SetToolTip(_("Zoom In"));
mButtons[ETBZoomOutID]->SetToolTip(_("Zoom Out"));
mButtons[ETBZoomSelID]->SetToolTip(_("Fit Selection"));
mButtons[ETBZoomFitID]->SetToolTip(_("Fit Project"));
#if defined(EXPERIMENTAL_EFFECTS_RACK)
mButtons[ETBEffectsID]->SetToolTip(_("Open Effects Rack"));
#endif
#endif
}
void EditToolBar::OnButton(wxCommandEvent &event)
{
AudacityProject *p = GetActiveProject();
if (!p) return;
bool busy = gAudioIO->IsBusy();
int id = event.GetId();
switch (id) {
case ETBCutID:
if (!busy) p->OnCut();
break;
case ETBCopyID:
if (!busy) p->OnCopy();
break;
case ETBPasteID:
if (!busy) p->OnPaste();
break;
case ETBTrimID:
if (!busy) p->OnTrim();
break;
case ETBSilenceID:
if (!busy) p->OnSilence();
break;
case ETBUndoID:
if (!busy) p->OnUndo();
break;
case ETBRedoID:
if (!busy) p->OnRedo();
break;
#ifdef EXPERIMENTAL_SYNC_LOCK
case ETBSyncLockID:
p->OnSyncLock();
return;//avoiding the call to SetButton()
#endif
case ETBZoomInID:
p->OnZoomIn();
break;
case ETBZoomOutID:
p->OnZoomOut();
break;
#if 0 // Disabled for version 1.2.0 since it doesn't work quite right...
case ETBZoomToggleID:
p->OnZoomToggle();
break;
#endif
case ETBZoomSelID:
p->OnZoomSel();
break;
case ETBZoomFitID:
p->OnZoomFit();
break;
#if defined(EXPERIMENTAL_EFFECTS_RACK)
case ETBEffectsID:
EffectManager::Get().ShowRack();
break;
#endif
}
SetButton(false, mButtons[id]);
}
void EditToolBar::EnableDisableButtons()
{
AudacityProject *p = GetActiveProject();
if (!p) return;
// Is anything selected?
bool selection = false;
TrackListIterator iter(p->GetTracks());
for (Track *t = iter.First(); t; t = iter.Next())
if (t->GetSelected()) {
selection = true;
break;
}
selection &= (p->GetSel0() < p->GetSel1());
mButtons[ETBCutID]->SetEnabled(selection);
mButtons[ETBCopyID]->SetEnabled(selection);
mButtons[ETBTrimID]->SetEnabled(selection);
mButtons[ETBSilenceID]->SetEnabled(selection);
mButtons[ETBUndoID]->SetEnabled(p->GetUndoManager()->UndoAvailable());
mButtons[ETBRedoID]->SetEnabled(p->GetUndoManager()->RedoAvailable());
bool tracks = (!p->GetTracks()->IsEmpty());
mButtons[ETBZoomInID]->SetEnabled(tracks && (p->GetZoom() < gMaxZoom));
mButtons[ETBZoomOutID]->SetEnabled(tracks && (p->GetZoom() > gMinZoom) );
#if 0 // Disabled for version 1.2.0 since it doesn't work quite right...
mButtons[ETBZoomToggleID]->SetEnabled(tracks);
#endif
mButtons[ETBZoomSelID]->SetEnabled(selection);
mButtons[ETBZoomFitID]->SetEnabled(tracks);
mButtons[ETBPasteID]->SetEnabled(p->Clipboard());
#ifdef EXPERIMENTAL_SYNC_LOCK
bool bSyncLockTracks;
gPrefs->Read(wxT("/GUI/SyncLockTracks"), &bSyncLockTracks, false);
if (bSyncLockTracks)
mButtons[ETBSyncLockID]->PushDown();
else
mButtons[ETBSyncLockID]->PopUp();
#endif
}