/********************************************************************** Audacity: A Digital Audio Editor ToolBar.h Dominic Mazzoni Shane T. Mueller Leland Lucius **********************************************************************/ #ifndef __AUDACITY_TOOLBAR__ #define __AUDACITY_TOOLBAR__ #include "../Experimental.h" #include #include #include #include "../Prefs.h" #include "../Theme.h" #include "../widgets/wxPanelWrapper.h" // to inherit #include class wxBoxSizer; class wxDC; class wxEraseEvent; class wxMouseEvent; class wxObject; class wxPaintEvent; class wxPoint; class wxSize; class wxSizeEvent; class wxString; class wxWindow; class AButton; class Grabber; class ToolDock; class ToolBarResizer; //////////////////////////////////////////////////////////// /// class ToolBar //////////////////////////////////////////////////////////// // // Custom event // DECLARE_EXPORTED_EVENT_TYPE(AUDACITY_DLL_API, EVT_TOOLBAR_UPDATED, -1); // // Height of a single line toolbar // #define toolbarSingle 27 // // Size of border around toolbars // #define toolbarGap 1 // // ToolBar IDs // enum { NoBarID = -1, TransportBarID, ToolsBarID, MeterBarID, RecordMeterBarID, PlayMeterBarID, MixerBarID, EditBarID, TranscriptionBarID, ScrubbingBarID, DeviceBarID, SelectionBarID, #ifdef EXPERIMENTAL_SPECTRAL_EDITING SpectralSelectionBarID, #endif ToolBarCount }; // How may pixels padding each side of a floating toolbar enum { ToolBarFloatMargin = 1 }; class AudacityProject; class ToolBar /* not final */ : public wxPanelWrapper , protected PrefsListener { public: using Holder = wxWindowPtr; ToolBar( AudacityProject &project, int type, const wxString & label, const wxString & section, bool resizable = false); virtual ~ToolBar(); bool AcceptsFocus() const override { return false; }; void SetToDefaultSize(); //NEW virtuals: virtual void Create(wxWindow *parent); virtual void EnableDisableButtons() = 0; virtual void ReCreateButtons(); void UpdatePrefs() override; virtual void RegenerateTooltips() = 0; int GetType(); wxString GetTitle(); wxString GetLabel(); wxString GetSection(); ToolDock *GetDock(); void SetLabel(const wxString & label) override; virtual void SetDocked(ToolDock *dock, bool pushed); // NEW virtual: virtual bool Expose(bool show = true); bool IsResizable() const; bool IsVisible() const; bool IsDocked() const; bool IsPositioned(){ return mPositioned; }; void SetVisible( bool bVisible ); void SetPositioned(){ mPositioned = true;}; /// Resizable toolbars should implement these. // NEW virtuals: virtual int GetInitialWidth() { return -1; } virtual int GetMinToolbarWidth() { return GetInitialWidth(); } virtual wxSize GetDockedSize() { return GetMinSize(); } public: static AButton *MakeButton(wxWindow *parent, teBmps eUp, teBmps eDown, teBmps eHilite, teBmps eDownHi, teBmps eStandardUp, teBmps eStandardDown, teBmps eDisabled, wxWindowID id, wxPoint placement, bool processdownevents, wxSize size); static void MakeAlternateImages(AButton &button, int idx, teBmps eUp, teBmps eDown, teBmps eHilite, teBmps eDownHi, teBmps eStandardUp, teBmps eStandardDown, teBmps eDisabled, wxSize size); static void SetButtonToolTip (AudacityProject &project, AButton &button, // If a shortcut key is defined for the command, then it is appended, // parenthesized, after the translated name. const TranslatedInternalString commands[], size_t nCommands); protected: void SetButton(bool down, AButton *button); void MakeMacRecoloredImage(teBmps eBmpOut, teBmps eBmpIn); void MakeRecoloredImage(teBmps eBmpOut, teBmps eBmpIn); void MakeButtonBackgroundsLarge(); void MakeButtonBackgroundsSmall(); wxBoxSizer *GetSizer(); void Add(wxWindow *window, int proportion = 0, int flag = wxALIGN_TOP, int border = 0, wxObject *userData = NULL); // Takes ownership of sizer void Add(wxSizer *sizer, int proportion = 0, int flag = 0, int border = 0, wxObject *userData = NULL); void Add(int width, int height, int proportion = 0, int flag = 0, int border = 0, wxObject *userData = NULL); void AddSpacer(int size = 14); void AddStretchSpacer(int prop = 1); void Detach(wxWindow *window); void Detach(wxSizer *sizer); void Updated(); /// Returns the width in pixels of the resizer element int GetResizeGrabberWidth(); virtual void Populate() = 0; virtual void Repaint(wxDC *dc) = 0; void OnErase(wxEraseEvent & event); void OnPaint(wxPaintEvent & event); void OnMouseEvents(wxMouseEvent &event); protected: AudacityProject &mProject; wxString mLabel; wxString mSection; int mType; private: void Init(wxWindow *parent, int type, const wxString & title, const wxString & label); wxWindow *mParent; Grabber *mGrabber; ToolBarResizer *mResizer; wxBoxSizer *mHSizer; bool mVisible; bool mResizable; bool mPositioned; // true if position floating determined. public: DECLARE_CLASS(ToolBar) DECLARE_EVENT_TABLE() friend class ToolBarResizer; }; struct RegisteredToolbarFactory { using Function = std::function< ToolBar::Holder( AudacityProject & ) >; using Functions = std::vector< Function >; RegisteredToolbarFactory( int id, const Function &function ); static const Functions &GetFactories(); }; #endif