239 lines
5.4 KiB
C++
239 lines
5.4 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
ToolManager.h
|
|
|
|
Dominic Mazzoni
|
|
Shane T. Mueller
|
|
Leland Lucius
|
|
|
|
**********************************************************************/
|
|
|
|
#ifndef __AUDACITY_TOOLMANAGER__
|
|
#define __AUDACITY_TOOLMANAGER__
|
|
|
|
#include <functional>
|
|
|
|
#include <wx/defs.h>
|
|
#include <wx/eventfilter.h> // to inherit
|
|
#include <wx/frame.h> // to inherit
|
|
#include <wx/timer.h> // member variable
|
|
|
|
#include "../ClientData.h"
|
|
#include "ToolDock.h"
|
|
|
|
#include "../commands/CommandFunctors.h"
|
|
#include "../commands/CommandManager.h"
|
|
|
|
|
|
class wxCommandEvent;
|
|
class wxFrame;
|
|
class wxMouseEvent;
|
|
class wxPaintEvent;
|
|
class wxPoint;
|
|
class wxRect;
|
|
class wxRegion;
|
|
class wxSize;
|
|
class wxTimer;
|
|
class wxTimerEvent;
|
|
class wxWindow;
|
|
|
|
class AudacityProject;
|
|
class ProjectWindow;
|
|
class ToolFrame;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// class ToolManager
|
|
////////////////////////////////////////////////////////////
|
|
|
|
class AUDACITY_DLL_API ToolManager final
|
|
: public wxEvtHandler
|
|
, public wxEventFilter
|
|
, public ClientData::Base
|
|
{
|
|
|
|
public:
|
|
// a hook function to break dependency of ToolManager on ProjectWindow
|
|
using GetTopPanelHook = std::function< wxWindow*( wxWindow& ) >;
|
|
static GetTopPanelHook SetGetTopPanelHook( const GetTopPanelHook& );
|
|
|
|
static ToolManager &Get( AudacityProject &project );
|
|
static const ToolManager &Get( const AudacityProject &project );
|
|
|
|
ToolManager( AudacityProject *parent );
|
|
ToolManager( const ToolManager & ) PROHIBITED;
|
|
ToolManager &operator=( const ToolManager & ) PROHIBITED;
|
|
~ToolManager();
|
|
|
|
void CreateWindows();
|
|
|
|
void LayoutToolBars();
|
|
|
|
bool IsDocked( int type );
|
|
|
|
bool IsVisible( int type );
|
|
|
|
void ShowHide( int type );
|
|
|
|
void Expose( int type, bool show );
|
|
|
|
ToolBar *GetToolBar( int type ) const;
|
|
|
|
ToolDock *GetTopDock();
|
|
const ToolDock *GetTopDock() const;
|
|
ToolDock *GetBotDock();
|
|
const ToolDock *GetBotDock() const;
|
|
|
|
void Reset();
|
|
static void OnResetToolBars(const CommandContext &context);
|
|
|
|
void Destroy();
|
|
void RegenerateTooltips();
|
|
|
|
int FilterEvent(wxEvent &event) override;
|
|
|
|
bool RestoreFocus();
|
|
|
|
private:
|
|
|
|
ToolBar *Float( ToolBar *t, wxPoint & pos );
|
|
|
|
void OnTimer( wxTimerEvent & event );
|
|
void OnMouse( wxMouseEvent & event );
|
|
void OnCaptureLost( wxMouseCaptureLostEvent & event );
|
|
void UndockBar( wxPoint mp );
|
|
void OnGrabber( GrabberEvent & event );
|
|
void HandleEscapeKey();
|
|
void DoneDragging();
|
|
|
|
void OnIndicatorCreate( wxWindowCreateEvent & event );
|
|
void OnIndicatorPaint( wxPaintEvent & event );
|
|
|
|
void ReadConfig();
|
|
void WriteConfig();
|
|
void Updated();
|
|
|
|
AudacityProject *mParent;
|
|
wxWindowRef mLastFocus{};
|
|
|
|
ToolFrame *mDragWindow;
|
|
ToolDock *mDragDock;
|
|
ToolBar *mDragBar {};
|
|
wxPoint mDragOffset;
|
|
ToolBarConfiguration::Position mDragBefore {};
|
|
|
|
wxPoint mLastPos;
|
|
wxRect mBarPos;
|
|
|
|
using FramePtr = Destroy_ptr<wxFrame>;
|
|
FramePtr mIndicator;
|
|
std::unique_ptr<wxRegion> mLeft, mDown;
|
|
wxRegion *mCurrent;
|
|
|
|
wxTimer mTimer;
|
|
bool mLastState;
|
|
|
|
#if defined(__WXMAC__)
|
|
bool mTransition;
|
|
#endif
|
|
|
|
ToolDock *mTopDock{};
|
|
ToolDock *mBotDock{};
|
|
|
|
ToolBar::Holder mBars[ ToolBarCount ];
|
|
|
|
wxPoint mPrevPosition {};
|
|
ToolDock *mPrevDock {};
|
|
ToolBarConfiguration::Position mPrevSlot
|
|
{ ToolBarConfiguration::UnspecifiedPosition };
|
|
ToolBarConfiguration mPrevConfiguration;
|
|
bool mDidDrag{};
|
|
bool mClicked{};
|
|
|
|
public:
|
|
|
|
DECLARE_CLASS( ToolManager )
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// class ToolFrame
|
|
////////////////////////////////////////////////////////////
|
|
|
|
class ToolFrame final : public wxFrame
|
|
{
|
|
public:
|
|
|
|
ToolFrame( AudacityProject *parent, ToolManager *manager, ToolBar *bar, wxPoint pos );
|
|
|
|
~ToolFrame();
|
|
|
|
ToolBar *GetBar() { return mBar; }
|
|
void ClearBar() { mBar = nullptr; }
|
|
void LockInMinSize(ToolBar * pBar);
|
|
|
|
//
|
|
// Transition a toolbar from float to dragging
|
|
//
|
|
void OnGrabber( GrabberEvent & event );
|
|
|
|
//
|
|
// Handle toolbar updates
|
|
//
|
|
void OnToolBarUpdate( wxCommandEvent & event );
|
|
|
|
//
|
|
// Handle frame paint events
|
|
//
|
|
void OnPaint( wxPaintEvent & WXUNUSED(event) );
|
|
|
|
void OnMotion( wxMouseEvent & event );
|
|
|
|
void OnCaptureLost( wxMouseCaptureLostEvent & WXUNUSED(event) );
|
|
|
|
//
|
|
// Do not allow the window to close through keyboard accelerators
|
|
// (like ALT+F4 on Windows)
|
|
//
|
|
void OnClose( wxCloseEvent & event );
|
|
|
|
void OnKeyDown( wxKeyEvent &event );
|
|
|
|
void Resize( const wxSize &size );
|
|
|
|
private:
|
|
|
|
AudacityProject *const mParent;
|
|
ToolManager *mManager;
|
|
ToolBar *mBar;
|
|
wxSize mMinSize;
|
|
wxSize mOrigSize;
|
|
|
|
public:
|
|
|
|
DECLARE_CLASS( ToolFrame )
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
|
|
|
|
// Construct a static instance of this class to add a menu item that shows and
|
|
// hides a toolbar
|
|
struct AUDACITY_DLL_API AttachedToolBarMenuItem : CommandHandlerObject {
|
|
AttachedToolBarMenuItem(
|
|
ToolBarID id, const CommandID &name, const TranslatableString &label_in,
|
|
const Registry::OrderingHint &hint = {},
|
|
// IDs of other toolbars not to be shown simultaneously with this one:
|
|
std::vector< ToolBarID > excludeIds = {} );
|
|
|
|
void OnShowToolBar(const CommandContext &context);
|
|
|
|
const ToolBarID mId;
|
|
const MenuTable::AttachedItem mAttachedItem;
|
|
const std::vector< ToolBarID > mExcludeIds;
|
|
};
|
|
|
|
#endif
|