mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-04 09:39:42 +02:00
166 lines
4.9 KiB
C++
166 lines
4.9 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
Lyrics.h
|
|
|
|
Dominic Mazzoni
|
|
Vaughan Johnson
|
|
|
|
**********************************************************************/
|
|
|
|
#ifndef __AUDACITY_LYRICS__
|
|
#define __AUDACITY_LYRICS__
|
|
|
|
#include "Audacity.h"
|
|
|
|
#include <vector>
|
|
#include <wx/textctrl.h> // to inherit
|
|
#include "commands/CommandManagerWindowClasses.h"
|
|
#include "widgets/wxPanelWrapper.h"
|
|
|
|
class AudacityProject;
|
|
class LabelTrack;
|
|
|
|
|
|
#define LYRICS_DEFAULT_WIDTH 608
|
|
#define LYRICS_DEFAULT_HEIGHT 280
|
|
|
|
/// \brief used in LyricsPanel, a Syllable gives positional information to
|
|
/// be used with the bouncing ball effect.
|
|
struct Syllable {
|
|
Syllable() = default;
|
|
Syllable( const Syllable& ) = default;
|
|
Syllable& operator= ( const Syllable& ) = default;
|
|
//Syllable( Syllable && ) = default;
|
|
//Syllable& operator= ( Syllable&& ) = default;
|
|
|
|
double t;
|
|
wxString text;
|
|
wxString textWithSpace;
|
|
int char0; // index of first char of syllable in LyricsPanel::mText, used only for kHighlightLyrics
|
|
int char1; // index of last char of syllable in LyricsPanel::mText, used only for kHighlightLyrics
|
|
int width;
|
|
int leftX;
|
|
int x; // centerX, used only for kBouncingBallLyrics
|
|
};
|
|
|
|
class LyricsPanel;
|
|
|
|
// Override wxTextCtrl to handle selection events, which the parent ignores if the control is read-only.
|
|
class HighlightTextCtrl final : public wxTextCtrl
|
|
{
|
|
public:
|
|
HighlightTextCtrl(LyricsPanel* parent,
|
|
wxWindowID id,
|
|
const wxString& value = {},
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize);
|
|
virtual ~HighlightTextCtrl() {};
|
|
|
|
void OnMouseEvent(wxMouseEvent &evt);
|
|
|
|
private:
|
|
LyricsPanel* mLyricsPanel;
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
|
|
/**************************************************************//**
|
|
|
|
\brief LyricsPanel is a panel that paints the bouncing
|
|
ball and the lyrics text.
|
|
*******************************************************************/
|
|
class LyricsPanel final
|
|
: public wxPanelWrapper
|
|
, public NonKeystrokeInterceptingWindow
|
|
{
|
|
DECLARE_DYNAMIC_CLASS(LyricsPanel)
|
|
|
|
enum LyricsStyle {
|
|
kBouncingBallLyrics, // Lyrics move from right to left with bouncing ball.
|
|
// kGuitarTab, //v <<future>> Guitar Tablature moves from right to left.
|
|
kHighlightLyrics, // Lyrics show in scrolling page and syllables highlight successively.
|
|
};
|
|
|
|
public:
|
|
LyricsPanel(wxWindow* parent, wxWindowID id,
|
|
AudacityProject *project,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize);
|
|
virtual ~LyricsPanel();
|
|
|
|
int FindSyllable(long startChar); // Find the syllable whose char0 <= startChar <= char1.
|
|
int GetCurrentSyllableIndex() { return mCurrentSyllable; };
|
|
Syllable* GetSyllable(int nSyl) { return &(mSyllables[nSyl]); };
|
|
void SetCurrentSyllableIndex(int nSyl) { mCurrentSyllable = nSyl; };
|
|
|
|
LyricsStyle GetLyricsStyle() { return mLyricsStyle; };
|
|
void SetLyricsStyle(const LyricsStyle newLyricsStyle);
|
|
|
|
void Update(double t);
|
|
void UpdateLyrics(wxEvent &e);
|
|
void OnShow(wxShowEvent& e);
|
|
void OnStartStop(wxCommandEvent &e);
|
|
|
|
//
|
|
// Event handlers
|
|
//
|
|
void OnKeyEvent(wxKeyEvent & event);
|
|
void DoPaint(wxDC &dc);
|
|
void OnPaint(wxPaintEvent &evt);
|
|
void OnSize(wxSizeEvent &evt);
|
|
|
|
// Doesn't seem to be a way to capture a selection event in a read-only wxTextCtrl.
|
|
// Thus the HighlightTextCtrl class.
|
|
// void OnHighlightTextCtrl(wxCommandEvent & event);
|
|
|
|
void HandlePaint(wxDC &dc);
|
|
void HandlePaint_BouncingBall(wxDC &dc);
|
|
|
|
void HandleLayout();
|
|
|
|
private:
|
|
void Clear();
|
|
void AddLabels(const LabelTrack *pLT);
|
|
void Finish(double finalT);
|
|
|
|
void Add(double t, const wxString &syllable, wxString &highlightText);
|
|
|
|
unsigned int GetDefaultFontSize() const; // Depends on mLyricsStyle. Call only after mLyricsStyle is set.
|
|
|
|
void SetDrawnFont(wxDC *dc); // for kBouncingBallLyrics
|
|
void SetHighlightFont(); // for kHighlightLyrics
|
|
|
|
void Measure(wxDC *dc);
|
|
int FindSyllable(double t);
|
|
void GetKaraokePosition(double t, int *outX, double *outY);
|
|
|
|
private:
|
|
int mWidth; // client width
|
|
int mHeight; // client height
|
|
|
|
int mKaraokeHeight; //v mHeight - mBrandingHeight (so just mHeight now that Branding is removed).
|
|
unsigned int mKaraokeFontSize;
|
|
|
|
LyricsStyle mLyricsStyle; // default kHighlightLyrics
|
|
HighlightTextCtrl* mHighlightTextCtrl; // only for kHighlightLyrics
|
|
|
|
double mT;
|
|
|
|
int mCurrentSyllable;
|
|
std::vector<Syllable> mSyllables;
|
|
wxString mText;
|
|
|
|
int mTextHeight; // only for drawn text
|
|
bool mMeasurementsDone; // only for drawn text
|
|
|
|
wxWeakRef<AudacityProject> mProject;
|
|
bool mDelayedUpdate{ false };
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
#endif // __AUDACITY_LYRICS__
|