1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-20 14:20:06 +02:00

New library for components

This commit is contained in:
Paul Licameli 2021-02-25 20:52:08 -05:00
parent dd87ec0fbd
commit 54b5f7d12c
55 changed files with 232 additions and 133 deletions

@ -219,41 +219,4 @@ typedef const char *constSamplePtr;
// ----------------------------------------------------------------------------
typedef wxString PluginID;
// ----------------------------------------------------------------------------
// Supported channel assignments
// ----------------------------------------------------------------------------
typedef enum
{
// Use to mark end of list
ChannelNameEOL = -1,
// The default channel assignment
ChannelNameMono,
// From this point, the channels follow the 22.2 surround sound format
ChannelNameFrontLeft,
ChannelNameFrontRight,
ChannelNameFrontCenter,
ChannelNameLowFrequency1,
ChannelNameBackLeft,
ChannelNameBackRight,
ChannelNameFrontLeftCenter,
ChannelNameFrontRightCenter,
ChannelNameBackCenter,
ChannelNameLowFrequency2,
ChannelNameSideLeft,
ChannelNameSideRight,
ChannelNameTopFrontLeft,
ChannelNameTopFrontRight,
ChannelNameTopFrontCenter,
ChannelNameTopCenter,
ChannelNameTopBackLeft,
ChannelNameTopBackRight,
ChannelNameTopSideLeft,
ChannelNameTopSideRight,
ChannelNameTopBackCenter,
ChannelNameBottomFrontCenter,
ChannelNameBottomFrontLeft,
ChannelNameBottomFrontRight,
} ChannelName, *ChannelNames;
#endif // __AUDACITY_TYPES_H__

@ -7,6 +7,7 @@ set( LIBRARIES
lib-strings
lib-utility
lib-uuid
lib-components
)
if ( ${_OPT}has_networking )

@ -0,0 +1,29 @@
#[[
Various abstract base classes related to modules and plugins.
ComponentInterfaceSymbol, which pairs an internal identifier string (suitable
for storing as a configuration file value) with a user-visible translatable
string. It serves to "name" various things.
CommandParameters, for write and reading key-value pairs to and from strings.
]]#
list( APPEND SOURCES
ComponentInterface.cpp
ComponentInterface.h
ComponentInterfaceSymbol.h
ConfigInterface.cpp
ConfigInterface.h
EffectAutomationParameters.cpp
EffectAutomationParameters.h
EffectInterface.cpp
EffectInterface.h
ModuleInterface.cpp
ModuleInterface.h
PluginInterface.cpp
PluginInterface.h
)
audacity_library( lib-components "${SOURCES}"
"lib-strings-interface;PRIVATE;wxBase"
"" ""
)

@ -0,0 +1,10 @@
/**********************************************************************
Audacity: A Digital Audio Editor
@file ComponentInterface.cpp
**********************************************************************/
#include "ComponentInterface.h"
ComponentInterface::~ComponentInterface() = default;

@ -43,7 +43,7 @@
#define __AUDACITY_COMPONENT_INTERFACE_H__
#include "Identifier.h"
#include "audacity/Types.h"
#include "Internat.h"
#include <wx/string.h> // member variables
class ComponentInterfaceSymbol;
@ -58,10 +58,10 @@ plugins. It is what makes a class a plug-in. Additionally it provides an
optional parameter definitions function, for those components such as commands,
effects and (soon) preference pagess that define parameters.
********************************************************************************/
class AUDACITY_DLL_API ComponentInterface /* not final */
class COMPONENTS_API ComponentInterface /* not final */
{
public:
virtual ~ComponentInterface() {};
virtual ~ComponentInterface();
// These should return an untranslated value
virtual PluginPath GetPath() = 0;

@ -0,0 +1,10 @@
/**********************************************************************
Audacity: A Digital Audio Editor
@file ConfigInterface.cpp
**********************************************************************/
#include "ConfigInterface.h"
ConfigClientInterface::~ConfigClientInterface() = default;

@ -43,6 +43,7 @@
#define __AUDACITY_CONFIGINTERFACE_H__
#include "Identifier.h"
#include <vector>
/*************************************************************************************//**
@ -53,10 +54,10 @@ differentiates between private and shared config. It should probably be replace
with a Shuttle.
*******************************************************************************************/
class AUDACITY_DLL_API ConfigClientInterface /* not final */
class COMPONENTS_API ConfigClientInterface /* not final */
{
public:
virtual ~ConfigClientInterface() {};
virtual ~ConfigClientInterface();
virtual bool HasSharedConfigGroup(const RegistryPath & group) = 0;
virtual bool GetSharedConfigSubgroups(const RegistryPath & group, RegistryPaths & subgroups) = 0;

@ -0,0 +1,10 @@
/**********************************************************************
Audacity: A Digital Audio Editor
@file EffectAutomationParameters.cpp
**********************************************************************/
#include "EffectAutomationParameters.h"
CommandParameters::~CommandParameters() = default;

@ -52,7 +52,6 @@
#include "ComponentInterface.h"
#include "ComponentInterfaceSymbol.h"
/**
\brief CommandParameters, derived from wxFileConfig, is essentially doing
the same things as the Shuttle classes. It does text <-> binary conversions of
@ -64,7 +63,7 @@ wxWidget validators, and can create default dialogs. However until that convers
done, we need this class, and we use a pointer to one from within a Shuttle when interfacing
with the code that still uses it.
*/
class CommandParameters final : public wxFileConfig
class COMPONENTS_API CommandParameters final : public wxFileConfig
{
public:
CommandParameters(const wxString & parms = {})
@ -78,9 +77,7 @@ public:
SetParameters(parms);
}
virtual ~CommandParameters()
{
}
virtual ~CommandParameters();
virtual bool HasGroup(const wxString & strName) const override
{

@ -0,0 +1,18 @@
/**********************************************************************
Audacity: A Digital Audio Editor
@file EffectInterface.cpp
**********************************************************************/
#include "EffectInterface.h"
EffectDefinitionInterface::~EffectDefinitionInterface() = default;
EffectHostInterface::~EffectHostInterface() = default;
EffectClientInterface::~EffectClientInterface() = default;
EffectUIHostInterface::~EffectUIHostInterface() = default;
EffectUIClientInterface::~EffectUIClientInterface() = default;

@ -44,11 +44,10 @@
#include <functional>
#include "Identifier.h"
#include "audacity/ComponentInterface.h"
#include "ComponentInterface.h"
#include "ComponentInterfaceSymbol.h"
#include "audacity/ConfigInterface.h"
#include "audacity/EffectAutomationParameters.h" // for command automation
#include "ConfigInterface.h"
#include "EffectAutomationParameters.h" // for command automation
class ShuttleGui;
@ -63,6 +62,8 @@ typedef enum EffectType : int
} EffectType;
using EffectFamilySymbol = ComponentInterfaceSymbol;
/*************************************************************************************//**
\class EffectDefinitionInterface
@ -71,15 +72,15 @@ typedef enum EffectType : int
flag-functions for interactivity, play-preview and whether the effect can run without a GUI.
*******************************************************************************************/
class AUDACITY_DLL_API EffectDefinitionInterface /* not final */ : public ComponentInterface
class COMPONENTS_API EffectDefinitionInterface /* not final */ : public ComponentInterface
{
public:
virtual ~EffectDefinitionInterface() {};
virtual ~EffectDefinitionInterface();
// Type determines how it behaves.
virtual EffectType GetType() = 0;
// Classification determines which menu it appears in.
virtual EffectType GetClassification() { return GetType();};
virtual EffectType GetClassification() { return GetType();}
virtual EffectFamilySymbol GetFamily() = 0;
@ -116,10 +117,10 @@ virtual (abstract) functions to get presets and actually apply the effect. It u
ConfigClientInterface to add Getters/setters for private and shared configs.
*******************************************************************************************/
class AUDACITY_DLL_API EffectHostInterface /* not final */ : public ConfigClientInterface
class COMPONENTS_API EffectHostInterface /* not final */ : public ConfigClientInterface
{
public:
virtual ~EffectHostInterface() {};
virtual ~EffectHostInterface();
virtual double GetDefaultDuration() = 0;
virtual double GetDuration() = 0;
@ -132,6 +133,45 @@ public:
virtual RegistryPath GetFactoryDefaultsGroup() = 0;
};
class sampleCount;
// ----------------------------------------------------------------------------
// Supported channel assignments
// ----------------------------------------------------------------------------
typedef enum
{
// Use to mark end of list
ChannelNameEOL = -1,
// The default channel assignment
ChannelNameMono,
// From this point, the channels follow the 22.2 surround sound format
ChannelNameFrontLeft,
ChannelNameFrontRight,
ChannelNameFrontCenter,
ChannelNameLowFrequency1,
ChannelNameBackLeft,
ChannelNameBackRight,
ChannelNameFrontLeftCenter,
ChannelNameFrontRightCenter,
ChannelNameBackCenter,
ChannelNameLowFrequency2,
ChannelNameSideLeft,
ChannelNameSideRight,
ChannelNameTopFrontLeft,
ChannelNameTopFrontRight,
ChannelNameTopFrontCenter,
ChannelNameTopCenter,
ChannelNameTopBackLeft,
ChannelNameTopBackRight,
ChannelNameTopSideLeft,
ChannelNameTopSideRight,
ChannelNameTopBackCenter,
ChannelNameBottomFrontCenter,
ChannelNameBottomFrontLeft,
ChannelNameBottomFrontRight,
} ChannelName, *ChannelNames;
/*************************************************************************************//**
\class EffectClientInterface
@ -141,7 +181,7 @@ Effect into a plug-in command. It has functions for realtime that are not part
AudacityCommand.
*******************************************************************************************/
class AUDACITY_DLL_API EffectClientInterface /* not final */ : public EffectDefinitionInterface
class COMPONENTS_API EffectClientInterface /* not final */ : public EffectDefinitionInterface
{
public:
using EffectDialogFactory = std::function<
@ -149,7 +189,7 @@ public:
EffectHostInterface*, EffectUIClientInterface* )
>;
virtual ~EffectClientInterface() {};
virtual ~EffectClientInterface();
virtual bool SetHost(EffectHostInterface *host) = 0;
@ -213,10 +253,10 @@ can call SetHostUI passing in a pointer to an EffectUIHostInterface. It contain
functionality and is provided, apparently, for type checking. Since only EffectUIHost
uses it, EffectUIHost could be used instead.
*******************************************************************************************/
class AUDACITY_DLL_API EffectUIHostInterface
class COMPONENTS_API EffectUIHostInterface
{
public:
virtual ~EffectUIHostInterface() {};
virtual ~EffectUIHostInterface();
};
/*************************************************************************************//**
@ -227,10 +267,10 @@ public:
values. It can import and export presets.
*******************************************************************************************/
class AUDACITY_DLL_API EffectUIClientInterface /* not final */
class COMPONENTS_API EffectUIClientInterface /* not final */
{
public:
virtual ~EffectUIClientInterface() {};
virtual ~EffectUIClientInterface();
virtual void SetHostUI(EffectUIHostInterface *host) = 0;
virtual bool IsGraphicalUI() = 0;

@ -0,0 +1,10 @@
/**********************************************************************
Audacity: A Digital Audio Editor
@file ModuleInterface.cpp
**********************************************************************/
#include "ModuleInterface.h"
ModuleInterface::~ModuleInterface() = default;

@ -45,8 +45,8 @@
#include <functional>
#include <memory>
#include "Identifier.h"
#include "audacity/ComponentInterface.h"
#include "audacity/PluginInterface.h"
#include "ComponentInterface.h"
#include "PluginInterface.h"
// ============================================================================
//
@ -65,10 +65,11 @@
///
// ============================================================================
class ModuleInterface /* not final */ : public ComponentInterface
class COMPONENTS_API ModuleInterface /* not final */
: public ComponentInterface
{
public:
virtual ~ModuleInterface() {};
virtual ~ModuleInterface();
// Called immediately after creation to give the instance a chance to
// initialize. Return "true" if initialziation was successful.

@ -0,0 +1,10 @@
/**********************************************************************
Audacity: A Digital Audio Editor
@file PluginInterface.cpp
**********************************************************************/
#include "PluginInterface.h"
PluginManagerInterface::~PluginManagerInterface() = default;

@ -42,18 +42,21 @@
#ifndef __AUDACITY_PLUGININTERFACE_H__
#define __AUDACITY_PLUGININTERFACE_H__
#include "audacity/ConfigInterface.h"
#include "audacity/EffectInterface.h"
#include "audacity/ComponentInterface.h"
#include "ConfigInterface.h"
#include "EffectInterface.h"
#include "ComponentInterface.h"
#include "Identifier.h"
class ModuleInterface;
using PluginID = wxString;
using PluginIDs = wxArrayString;
class AUDACITY_DLL_API PluginManagerInterface /* not final */
class COMPONENTS_API PluginManagerInterface /* not final */
{
public:
virtual ~PluginManagerInterface();
static const PluginID &DefaultRegistrationCallback(
ModuleInterface *provider, ComponentInterface *ident );
static const PluginID &AudacityCommandRegistrationCallback(

@ -16,7 +16,7 @@
#include "export/Export.h"
#include "commands/CommandFlag.h"
#include "audacity/ComponentInterface.h" // for ComponentInterfaceSymbol
#include "ComponentInterface.h" // for ComponentInterfaceSymbol
class wxArrayString;
class Effect;

@ -120,7 +120,6 @@ list( APPEND SOURCES
Clipboard.h
CommonCommandFlags.cpp
CommonCommandFlags.h
ComponentInterfaceSymbol.h
CrashReport.cpp
CrashReport.h
DarkThemeAsCeeCode.h
@ -1007,13 +1006,7 @@ list( APPEND SOURCES
#
#
list( APPEND HEADERS
../include/audacity/EffectInterface.h
../include/audacity/Types.h
../include/audacity/ConfigInterface.h
../include/audacity/ModuleInterface.h
../include/audacity/PluginInterface.h
../include/audacity/ComponentInterface.h
../include/audacity/EffectAutomationParameters.h
)
#

@ -18,6 +18,7 @@ Describes shared object that is used to access FFmpeg libraries.
#include "audacity/Types.h"
#include "widgets/wxPanelWrapper.h" // to inherit
#if defined(__WXMSW__)

@ -15,7 +15,7 @@
#include <wx/defs.h>
#include "widgets/wxPanelWrapper.h" // to inherit
#include "audacity/ComponentInterface.h" // member variable
#include "ComponentInterface.h" // member variable
class wxArrayString;
class wxGridEvent;

@ -20,7 +20,7 @@ i.e. an alternative to the usual interface, for Audacity.
#include "ModuleManager.h"
#include "audacity/ModuleInterface.h"
#include "ModuleInterface.h"
@ -32,7 +32,7 @@ i.e. an alternative to the usual interface, for Audacity.
#include "FileNames.h"
#include "MemoryX.h"
#include "audacity/PluginInterface.h"
#include "PluginInterface.h"
#ifdef EXPERIMENTAL_MODULE_PREFS
#include "Prefs.h"

@ -66,7 +66,6 @@ using ModuleInterfaceHandle = std::unique_ptr<
typedef std::map<wxString, ModuleInterfaceHandle> ModuleMap;
typedef std::map<ModuleInterface *, std::unique_ptr<wxDynamicLibrary>> LibraryMap;
using PluginIDs = wxArrayString;
class AUDACITY_DLL_API ModuleManager final
{

@ -28,7 +28,7 @@ for shared and private configs - which need to move out.
#include <wx/log.h>
#include <wx/tokenzr.h>
#include "audacity/ModuleInterface.h"
#include "ModuleInterface.h"
#include "AudacityFileConfig.h"
#include "Internat.h" // for macro XO

@ -17,8 +17,8 @@
#include <map>
#include <memory>
#include "audacity/EffectInterface.h"
#include "audacity/PluginInterface.h"
#include "EffectInterface.h"
#include "PluginInterface.h"
class wxArrayString;
class FileConfig;

@ -9,7 +9,7 @@
**********************************************************************/
#include "PluginRegistrationDialog.h"
#include "audacity/EffectInterface.h"
#include "EffectInterface.h"
#include "ModuleManager.h"
#include "PluginManager.h"
#include "ShuttleGui.h"

@ -38,7 +38,7 @@
#include <functional>
#include "../include/audacity/ComponentInterface.h"
#include "ComponentInterface.h"
#include "ComponentInterfaceSymbol.h"
#include "wxArrayStringEx.h"
#include "widgets/FileConfig.h"

@ -25,7 +25,7 @@
#include "Resample.h"
#include "Prefs.h"
#include "Internat.h"
#include "../include/audacity/ComponentInterface.h"
#include "ComponentInterface.h"
#include <soxr.h>

@ -65,7 +65,7 @@ preferences.
#include <wx/radiobut.h>
#include <wx/button.h>
#include "../include/audacity/EffectAutomationParameters.h" // for command automation
#include "EffectAutomationParameters.h" // for command automation
#include "WrappedType.h"
//#include "effects/Effect.h"

@ -11,7 +11,7 @@
#ifndef __AUDACITY_SHUTTLE__
#define __AUDACITY_SHUTTLE__
#include "../include/audacity/ComponentInterface.h"
#include "ComponentInterface.h"
#include "ComponentInterfaceSymbol.h"
class ComponentInterfaceSymbol;

@ -113,7 +113,7 @@ for registering for changes.
#include <wx/spinctrl.h>
#include <wx/stattext.h>
#include <wx/bmpbuttn.h>
#include "../include/audacity/ComponentInterface.h"
#include "ComponentInterface.h"
#include "widgets/ReadOnlyText.h"
#include "widgets/wxPanelWrapper.h"
#include "widgets/wxTextCtrlWrapper.h"

@ -24,6 +24,7 @@
#include "Prefs.h"
#include "WrappedType.h"
#include "ComponentInterfaceSymbol.h"
class ChoiceSetting;
@ -746,8 +747,6 @@ public:
teShuttleMode GetMode() { return mShuttleMode; };
};
class ComponentInterfaceSymbol;
//! Convenience function often useful when adding choice controls
AUDACITY_DLL_API TranslatableStrings Msgids(
const EnumValueSymbol strings[], size_t nStrings);

@ -13,7 +13,7 @@
#include <wx/defs.h>
#include "audacity/ComponentInterface.h" // member variable
#include "ComponentInterface.h" // member variable
#include "widgets/wxPanelWrapper.h" // to inherit

@ -35,7 +35,7 @@ ShuttleGui.
#include <wx/utils.h>
#include <wx/log.h>
#include "audacity/ConfigInterface.h"
#include "ConfigInterface.h"
#include "../Shuttle.h"
#include "../ShuttleGui.h"

@ -20,8 +20,8 @@
#include "../widgets/wxPanelWrapper.h" // to inherit
#include "../include/audacity/ComponentInterface.h"
#include "../include/audacity/EffectAutomationParameters.h" // for command automation
#include "ComponentInterface.h"
#include "EffectAutomationParameters.h" // for command automation
#include "../Registrar.h"

@ -12,7 +12,7 @@
#ifndef __AUDACITY_LOAD_COMMANDS__
#define __AUDACITY_LOAD_COMMANDS__
#include "audacity/ModuleInterface.h"
#include "ModuleInterface.h"
#include <functional>
#include <memory>

@ -25,8 +25,8 @@ class wxChoice;
class wxListBox;
class wxWindow;
#include "audacity/ConfigInterface.h"
#include "audacity/EffectInterface.h"
#include "ConfigInterface.h"
#include "EffectInterface.h"
#include "../SelectedRegion.h"

@ -16,7 +16,7 @@
#include <vector>
#include <unordered_map>
#include "audacity/EffectInterface.h"
#include "EffectInterface.h"
#include "Identifier.h"
class AudacityCommand;

@ -16,6 +16,9 @@
#include <wx/bitmap.h> // member variables
#include "Identifier.h"
#include "PluginInterface.h"
#if defined(EXPERIMENTAL_EFFECTS_RACK)
#include <vector>
@ -102,8 +105,8 @@ private:
#endif
#include "audacity/EffectInterface.h"
#include "../widgets/wxPanelWrapper.h" // to inherit
#include "EffectInterface.h"
#include "widgets/wxPanelWrapper.h" // to inherit
#include "../SelectedRegion.h"

@ -11,7 +11,7 @@
#ifndef __AUDACITY_LOAD_EFFECTS__
#define __AUDACITY_LOAD_EFFECTS__
#include "audacity/ModuleInterface.h"
#include "ModuleInterface.h"
#include <functional>
#include <memory>

@ -11,7 +11,7 @@
#include "RealtimeEffectManager.h"
#include "audacity/EffectInterface.h"
#include "EffectInterface.h"
#include <memory>
#include <atomic>

@ -94,7 +94,7 @@
#include "../../widgets/WindowAccessible.h"
#endif
#include "audacity/ConfigInterface.h"
#include "ConfigInterface.h"
#include <cstring>

@ -12,9 +12,9 @@
#if USE_VST
#include "audacity/EffectInterface.h"
#include "audacity/ModuleInterface.h"
#include "audacity/PluginInterface.h"
#include "EffectInterface.h"
#include "ModuleInterface.h"
#include "PluginInterface.h"
#include "../../SampleFormat.h"
#include "../../xml/XMLTagHandler.h"

@ -21,9 +21,9 @@
#include <AudioUnit/AudioUnit.h>
#include <AudioUnit/AudioUnitProperties.h>
#include "audacity/EffectInterface.h"
#include "audacity/ModuleInterface.h"
#include "audacity/PluginInterface.h"
#include "EffectInterface.h"
#include "ModuleInterface.h"
#include "PluginInterface.h"
#include "AUControl.h"

@ -18,9 +18,9 @@ class NumericTextCtrl;
#include <wx/dynlib.h> // member variable
#include <wx/event.h> // to inherit
#include "audacity/EffectInterface.h"
#include "audacity/ModuleInterface.h"
#include "audacity/PluginInterface.h"
#include "EffectInterface.h"
#include "ModuleInterface.h"
#include "PluginInterface.h"
#include "ladspa.h"
#include "../../SampleFormat.h"

@ -31,9 +31,9 @@
#include "lv2/uri-map/uri-map.h"
#include "lv2/units/units.h"
#include "audacity/ModuleInterface.h"
#include "audacity/EffectInterface.h"
#include "audacity/PluginInterface.h"
#include "ModuleInterface.h"
#include "EffectInterface.h"
#include "PluginInterface.h"
#include "lv2_external_ui.h"

@ -8,9 +8,9 @@
**********************************************************************/
#include "audacity/ModuleInterface.h"
#include "audacity/EffectInterface.h"
#include "audacity/PluginInterface.h"
#include "ModuleInterface.h"
#include "EffectInterface.h"
#include "PluginInterface.h"
///////////////////////////////////////////////////////////////////////////////
//

@ -14,9 +14,9 @@
#include <memory>
#include "audacity/ModuleInterface.h"
#include "audacity/EffectInterface.h"
#include "audacity/PluginInterface.h"
#include "ModuleInterface.h"
#include "EffectInterface.h"
#include "PluginInterface.h"
#include <vamp-hostsdk/PluginLoader.h>

@ -1,5 +1,3 @@
#include "../CommonCommandFlags.h"
#include "../Menus.h"
#include "../Prefs.h"

@ -29,7 +29,7 @@ MousePrefs, QualityPrefs, SpectrumPrefs and ThemePrefs.
#include <functional>
#include "../widgets/wxPanelWrapper.h" // to inherit
#include "../include/audacity/ComponentInterface.h"
#include "ComponentInterface.h"
#include "../Registry.h"
/* A few constants for an attempt at semi-uniformity */

@ -11,6 +11,7 @@
#ifndef __AUDACITY_QUALITY_SETTINGS__
#define __AUDACITY_QUALITY_SETTINGS__
#include <audacity/Types.h>
#include "Prefs.h" // for EnumSetting
class IntSetting;

@ -17,7 +17,7 @@
#include <wx/brush.h> // member variable
#include "Identifier.h"
#include "audacity/Types.h"
class wxChoice;
class wxCommandEvent;

@ -13,6 +13,7 @@ Paul Licameli
#include <functional>
#include <unordered_map>
#include <vector>
#include "../../AttachedVirtualFunction.h"
#include "../../UIHandle.h"

@ -168,7 +168,7 @@ different formats.
#include "NumericTextCtrl.h"
#include "Identifier.h"
#include "audacity/Types.h"
#include "../AllThemeResources.h"
#include "../AColor.h"
#include "../KeyboardCapture.h"

@ -17,8 +17,8 @@
#include <memory>
#include "../../include/audacity/ComponentInterface.h"
#include "MemoryX.h"
#include "ComponentInterface.h"
#include "ComponentInterfaceSymbol.h"
#include <vector>
#include <wx/setup.h> // for wxUSE_* macros

@ -29,6 +29,7 @@
#include <wx/msw/winundef.h>
#endif
#include "audacity/Types.h"
#include <wx/defs.h>
#include <wx/arrstr.h>
#include <wx/filename.h>