audacia/src/Lyrics.h

138 lines
3.9 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
Lyrics.h
Dominic Mazzoni
Vaughan Johnson
**********************************************************************/
#ifndef __AUDACITY_LYRICS__
#define __AUDACITY_LYRICS__
#include "Audacity.h"
#include <wx/dynarray.h>
#include <wx/panel.h>
#include <wx/textctrl.h>
#define LYRICS_DEFAULT_WIDTH 608
#define LYRICS_DEFAULT_HEIGHT 280
struct Syllable {
double t;
wxString text;
wxString textWithSpace;
int char0; // index of first char of syllable in Lyrics::mText, used only for kHighlightLyrics
int char1; // index of last char of syllable in Lyrics::mText, used only for kHighlightLyrics
int width;
int leftX;
int x; // centerX, used only for kBouncingBallLyrics
};
WX_DECLARE_OBJARRAY(Syllable, SyllableArray);
class Lyrics;
// Override wxTextCtrl to handle selection events, which the parent ignores if the control is read-only.
class HighlightTextCtrl : public wxTextCtrl
{
public:
HighlightTextCtrl(Lyrics* parent,
wxWindowID id,
const wxString& value = wxT(""),
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize);
virtual ~HighlightTextCtrl() {};
void OnMouseEvent(wxMouseEvent &evt);
private:
Lyrics* mLyrics;
DECLARE_EVENT_TABLE()
};
class Lyrics : public wxPanel
{
DECLARE_DYNAMIC_CLASS(Lyrics)
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:
Lyrics(wxWindow* parent, wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize);
virtual ~Lyrics();
void Clear();
void Add(double t, wxString syllable);
void Finish(double finalT);
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);
//
// Event handlers
//
void OnKeyEvent(wxKeyEvent & event);
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:
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;
SyllableArray mSyllables;
wxString mText;
int mTextHeight; // only for drawn text
bool mMeasurementsDone; // only for drawn text
DECLARE_EVENT_TABLE()
};
#endif // __AUDACITY_LYRICS__