1
0
mirror of https://github.com/cookiengineer/audacity synced 2026-04-12 17:20:34 +02:00
Files
audacity/src/ShuttleGui.h
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

380 lines
14 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
ShuttleGui.h
James Crook
Audacity is free software.
This file is licensed under the wxWidgets license, see License.txt
**********************************************************************/
#ifndef SHUTTLE_GUI
#define SHUTTLE_GUI
#include "Audacity.h"
#include <wx/grid.h>
#include <wx/string.h>
#include "WrappedType.h"
const int nMaxNestedSizers = 20;
enum teShuttleMode
{
eIsCreating,
eIsGettingFromDialog,
eIsSettingToDialog,
eIsSavingViaShuttle,
eIsGettingViaShuttle,
// Next two are only ever seen in constructor.
// After that they revert to one of the modes above.
// They are used to achieve 'two step' operation,
// where we transfer between two shuttles in one go.
eIsCreatingFromPrefs,
eIsSavingToPrefs
};
class wxArrayInt;
class wxListCtrl;
class wxCheckBox;
class wxChoice;
class wxComboBox;
class wxScrolledWindow;
class wxStaticText;
class wxTreeCtrl;
class wxTextCtrl;
class wxSlider;
class wxTreeListCtrl;
class wxNotebook;
typedef wxWindow wxNotebookPage; // so far, any window can be a page
class wxButton;
class wxBitmapButton;
class wxRadioButton;
class wxBitmap;
class wxPanel;
class wxSizer;
class wxStaticBox;
class wxMenuBar;
class wxMenu;
class wxSpinCtrl;
class wxListBox;
class wxGrid;
class Shuttle;
class WrappedType;
class AUDACITY_DLL_API ShuttleGuiBase
{
public:
ShuttleGuiBase(wxWindow * pParent,teShuttleMode ShuttleMode);
~ShuttleGuiBase(void);
void Init();
//-- Add functions. These only add a widget or 2.
void AddPrompt(const wxString &Prompt);
void AddUnits(const wxString &Prompt);
void AddTitle(const wxString &Prompt);
wxWindow * AddWindow(wxWindow * pWindow, int Flags = wxALIGN_CENTRE | wxALL );
wxSlider * AddSlider(const wxString &Prompt, int pos, int Max, int Min = 0);
wxSlider * AddVSlider(const wxString &Prompt, int pos, int Max);
wxSpinCtrl * AddSpinCtrl(const wxString &Prompt, int Value, int Max, int Min);
wxTreeCtrl * AddTree();
wxRadioButton * AddRadioButton( const wxString & Prompt );
wxRadioButton * AddRadioButtonToGroup( const wxString & Prompt);
wxButton * AddButton( const wxString & Text, int PositionFlags = wxALIGN_CENTRE );
wxBitmapButton * AddBitmapButton(const wxBitmap &Bitmap, int PositionFlags = wxALIGN_CENTRE);
wxStaticText * AddVariableText(const wxString &Str, bool bCenter = false, int PositionFlags = 0);
wxTextCtrl * AddTextBox(const wxString &Caption, const wxString &Value, const int nChars);
wxTextCtrl * AddNumericTextBox(const wxString &Caption, const wxString &Value, const int nChars);
wxTextCtrl * AddTextWindow(const wxString &Value);
wxListBox * AddListBox(const wxArrayString * pChoices, long style = 0);
wxListCtrl * AddListControl();
wxListCtrl * AddListControlReportMode();
wxGrid * AddGrid();
wxCheckBox * AddCheckBox( const wxString &Prompt, const wxString &Selected);
wxCheckBox * AddCheckBoxOnRight( const wxString &Prompt, const wxString &Selected);
wxComboBox * AddCombo( const wxString &Prompt, const wxString &Selected,const wxArrayString * pChoices, long style = 0 );
wxChoice * AddChoice( const wxString &Prompt, const wxString &Selected, const wxArrayString * pChoices );
wxMenuBar * AddMenuBar( );
wxMenu * AddMenu( const wxString & Title );
void AddIcon( wxBitmap * pBmp);
void AddIconButton( const wxString & Command, const wxString & Params,wxBitmap * pBmp );
void AddFixedText( const wxString & Str, bool bCenter = false );
void AddConstTextBox( const wxString &Caption, const wxString & Value );
//-- Start and end functions. These are used for sizer, or other window containers
// and create the appropriate widget.
void StartHorizontalLay(int PositionFlags=wxALIGN_CENTRE, int iProp=1);
void EndHorizontalLay();
void StartVerticalLay(int iProp=1);
void EndVerticalLay();
wxScrolledWindow * StartScroller(int iStyle=0);
void EndScroller();
wxPanel * StartPanel(int iStyle=0);
void EndPanel();
void StartMultiColumn(int nCols, int PositionFlags=wxALIGN_LEFT);
void EndMultiColumn();
void StartTwoColumn() {StartMultiColumn(2);};
void EndTwoColumn() {EndMultiColumn();};
void StartThreeColumn(){StartMultiColumn(3);};
void EndThreeColumn(){EndMultiColumn();};
wxStaticBox * StartStatic( const wxString & Str, int iProp=0 );
void EndStatic();
wxNotebook * StartNotebook();
void EndNotebook();
wxNotebookPage * StartNotebookPage( const wxString Name );
void StartNotebookPage( const wxString Name, wxNotebookPage * pPage );
void EndNotebookPage();
wxPanel * StartInvisiblePanel();
void EndInvisiblePanel();
void StartRadioButtonGroup( const wxString & SettingName );
void EndRadioButtonGroup();
void StartRadioButtonGroup( const wxString & SettingName, const int iDefaultValue );
void StartRadioButtonGroup( const wxString & SettingName, const wxString &DefaultValue );
void DoDataShuttle( const wxString &Name, WrappedType & WrappedRef );
bool DoStep( int iStep );
int TranslateToIndex( const wxString &Value, const wxArrayString &Choices );
wxString TranslateFromIndex( const int nIn, const wxArrayString &Choices );
int TranslateToIndex( const int Value, const wxArrayInt &Choices );
int TranslateFromIndex( const int nIn, const wxArrayInt &Choices );
//-- Tie functions both add controls and also read/write to them.
// The ones taking a 'WrappedType' are type-generic and are used by the type specific ones.
wxTextCtrl * TieTextBox( const wxString &Prompt, WrappedType & WrappedRef, const int nChars);
wxTextCtrl * TieTextBox( const wxString &Caption, wxString & Value, const int nChars=0);
wxTextCtrl * TieTextBox( const wxString &Prompt, int &Selected, const int nChars=0);
wxTextCtrl * TieTextBox( const wxString &Prompt, double &Value, const int nChars=0);
wxTextCtrl * TieNumericTextBox( const wxString &Prompt, WrappedType & WrappedRef, const int nChars);
wxTextCtrl * TieNumericTextBox( const wxString &Caption, wxString & Value, const int nChars=0);
wxTextCtrl * TieNumericTextBox( const wxString &Prompt, int &Selected, const int nChars=0);
wxTextCtrl * TieNumericTextBox( const wxString &Prompt, double &Value, const int nChars=0);
wxCheckBox * TieCheckBox( const wxString &Prompt, WrappedType & WrappedRef );
wxCheckBox * TieCheckBox( const wxString &Prompt, const wxString &Selected );
wxCheckBox * TieCheckBox( const wxString &Prompt, bool & Var );
wxCheckBox * TieCheckBoxOnRight( const wxString & Prompt, WrappedType & WrappedRef );
wxCheckBox * TieCheckBoxOnRight( const wxString & Prompt, bool & Var );
wxChoice * TieChoice( const wxString &Prompt, WrappedType & WrappedRef, const wxArrayString * pChoices );
wxChoice * TieChoice( const wxString &Prompt, wxString &Selected, const wxArrayString * pChoices );
wxChoice * TieChoice( const wxString &Prompt, int &Selected, const wxArrayString * pChoices );
wxSlider * TieSlider( const wxString &Prompt, WrappedType & WrappedRef, const int max, const int min = 0 );
wxSlider * TieSlider( const wxString &Prompt, int &pos, const int max, const int min = 0);
wxSlider * TieSlider( const wxString &Prompt, float &pos, const float fMin, const float fMax);
wxSlider * TieVSlider( const wxString &Prompt, float &pos, const float fMin, const float fMax);
wxRadioButton * TieRadioButton( const wxString & Prompt, WrappedType &WrappedRef);
wxRadioButton * TieRadioButton( const wxString &Prompt, const int iValue);
wxRadioButton * TieRadioButton( const wxString &Prompt, const wxString &Value);
wxSpinCtrl * TieSpinCtrl( const wxString &Prompt, WrappedType & WrappedRef, const int max, const int min = 0 );
wxSpinCtrl * TieSpinCtrl( const wxString &Prompt, int &Value, const int max, const int min = 0 );
//-- Variants of the standard Tie functions which do two step exchange in one go
// Note that unlike the other Tie functions, ALL the arguments are const.
// That's because the data is being exchanged between the dialog and mpShuttle
// so it doesn't need an argument that is writeable.
wxCheckBox * TieCheckBox(
const wxString &Prompt,
const wxString &SettingName,
const bool bDefault);
wxCheckBox * TieCheckBoxOnRight(
const wxString &Prompt,
const wxString &SettingName,
const bool bDefault);
wxChoice * TieChoice(
const wxString &Prompt,
const wxString &SettingName,
const wxString &Default,
const wxArrayString &Choices,
const wxArrayString & TranslatedChoices );
wxChoice * TieChoice(
const wxString &Prompt,
const wxString &SettingName,
const int Default,
const wxArrayString & Choices,
const wxArrayInt & TranslatedChoices);
wxTextCtrl * TieTextBox(
const wxString &Prompt,
const wxString &SettingName,
const wxString &Default,
const int nChars);
wxTextCtrl * TieTextBox(
const wxString & Prompt,
const wxString & SettingName,
const double & Default,
const int nChars);
wxTextCtrl * TieNumericTextBox(
const wxString &Prompt,
const wxString &SettingName,
const wxString &Default,
const int nChars);
wxTextCtrl * TieNumericTextBox(
const wxString & Prompt,
const wxString & SettingName,
const double & Default,
const int nChars);
wxSlider * TieSlider(
const wxString & Prompt,
const wxString & SettingName,
const int iDefault,
const int max,
const int min = 0);
wxSpinCtrl * TieSpinCtrl(
const wxString &Prompt,
const wxString &SettingName,
const int Value,
const int max,
const int min);
//-- End of variants.
void EnableCtrl( bool bEnable );
void SetSizeHints( int minX, int minY );
void SetBorder( int Border ) {miBorder = Border;};
void SetStyle( int Style ) {miStyle = Style;};
void SetNoMatchSelector( int iSelector ) {miNoMatchSelector = iSelector;};
void SetSizerProportion( int iProp ) {miSizerProp = iProp;};
void SetStretchyCol( int i );
void SetStretchyRow( int i );
//--Some Additions since June 2007 that don't fit in elsewhere...
wxWindow * GetParent() {return mpParent;};
ShuttleGuiBase & Prop( int iProp );
int GetId() {return miIdNext;};
void UseUpId();
protected:
void SetProportions( int Default );
void PushSizer();
void PopSizer();
void UpdateSizersCore( bool bPrepend, int Flags );
void UpdateSizers();
void UpdateSizersC();
void UpdateSizersAtStart();
long Style( long Style );
wxWindow * mpLastWind;
wxWindow * mpDlg;
wxSizer * pSizerStack[ nMaxNestedSizers ];
wxString mBoxName;
Shuttle * mpShuttle; /*! Controls source/destination of shuttled data. You can
leave this NULL if you are shuttling to variables */
int miNoMatchSelector; //! Used in choices to determine which item to use on no match.
teShuttleMode mShuttleMode;
// These five are needed to handle radio button groups.
wxString mSettingName; /// The setting controlled by a group.
int mRadioCount; /// The index of this radio item. -1 for none.
WrappedType mRadioValue; /// The wrapped value associated with the active radio button.
wxString mRadioValueString; /// Unwrapped string value.
int mRadioValueInt; /// Unwrapped integer value.
int miSizerProp;
int mSizerDepth;
int miBorder;
long miStyle;
int miProp;
// See UseUpId() for explanation of these three.
int miId;
int miIdNext;
int miIdSetByUser;
// Proportion set by user rather than default.
int miPropSetByUser;
wxSizer * mpSubSizer;
wxSizer * mpSizer;
wxWindow * mpParent;
wxWindow * mpWind;
wxMenuBar * mpMenuBar;
wxMenu * mpMenu;
};
// A rarely used helper function that sets a pointer
// ONLY if the value it is to be set to is non NULL.
extern void SetIfCreated( wxChoice *&Var, wxChoice * Val );
extern void SetIfCreated( wxTextCtrl *&Var, wxTextCtrl * Val );
extern void SetIfCreated( wxStaticText *&Var, wxStaticText * Val );
class GuiWaveTrack;
class AdornedRulerPanel;
class RulerPanel;
class AttachableScrollBar;
struct ViewInfo;
#include <wx/scrolbar.h> // to get wxSB_HORIZONTAL
// CreateStdButtonSizer defs...should probably move to widgets subdir
enum
{
eOkButton = 0x0001,
eCancelButton = 0x0002,
eYesButton = 0x0004,
eNoButton = 0x0008,
eHelpButton = 0x0010,
ePreviewButton = 0x0020,
eDebugButton = 0x0040,
eDefaultsButton= 0x0080,
ePreviewDryButton = 0x0100,
eApplyButton = 0x0200,
};
enum
{
ePreviewID = wxID_LOWEST - 1,
eDebugID = wxID_LOWEST - 2,
eDefaultsID = wxID_LOWEST - 3,
ePreviewDryID = wxID_LOWEST - 4
};
AUDACITY_DLL_API wxSizer *CreateStdButtonSizer( wxWindow *parent,
long buttons = eOkButton | eCancelButton,
wxButton *extra = NULL );
// ShuttleGui extends ShuttleGuiBase with Audacity specific extensions.
class AUDACITY_DLL_API ShuttleGui : public ShuttleGuiBase
{
public:
ShuttleGui(wxWindow * pParent,teShuttleMode ShuttleMode);
~ShuttleGui(void);
public:
ShuttleGui & Id(int id );
// Prop() sets the proportion value, defined as in wxSizer::Add().
ShuttleGui & Prop( int iProp ){ ShuttleGuiBase::Prop(iProp); return *this;}; // Has to be here too, to return a ShuttleGui and not a ShuttleGuiBase.
GuiWaveTrack * AddGuiWaveTrack( const wxString & Name);
AdornedRulerPanel * AddAdornedRuler( ViewInfo *pViewInfo );
RulerPanel * AddRulerVertical( float low, float hi, const wxString & Units );
AttachableScrollBar * AddAttachableScrollBar( long style = wxSB_HORIZONTAL );
void AddStandardButtons( long buttons = eOkButton | eCancelButton, wxButton *extra = NULL );
void AddSpace( int width, int height );
void AddSpace( int size ) { AddSpace( size, size ); };
int GetBorder() { return miBorder; };
void SetSizeHints( int minX = -1, int minY = -1 );
void SetSizeHints( const wxArrayString & items );
void SetSizeHints( const wxArrayInt & items );
static void SetSizeHints( wxWindow *window, const wxArrayString & items );
static void SetSizeHints( wxWindow *window, const wxArrayInt & items );
};
#endif