audacia/src/tracks/labeltrack/ui/LabelTrackControls.cpp

197 lines
5.4 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
LabelTrackControls.cpp
Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../../Audacity.h"
#include "LabelTrackControls.h"
#include "LabelTrackView.h"
#include "../../../HitTestResult.h"
#include "../../../LabelTrack.h"
#include "../../../widgets/PopupMenuTable.h"
#include "../../../Prefs.h"
#include "../../../RefreshCode.h"
#include "../../../ShuttleGui.h"
#include "../../../widgets/wxPanelWrapper.h"
#include <wx/dialog.h>
#include <wx/fontenum.h>
#include <wx/listbox.h>
#include <wx/spinctrl.h>
LabelTrackControls::~LabelTrackControls()
{
}
std::vector<UIHandlePtr> LabelTrackControls::HitTest
(const TrackPanelMouseState & state,
const AudacityProject *pProject)
{
return CommonTrackControls::HitTest(state, pProject);
}
class LabelTrackMenuTable : public PopupMenuTable
{
LabelTrackMenuTable() : mpData(NULL) {}
DECLARE_POPUP_MENU(LabelTrackMenuTable);
public:
static LabelTrackMenuTable &Instance();
void InitMenu(Menu*, void *pUserData) override
{
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData);
}
void DestroyMenu() override
{
mpData = nullptr;
}
CommonTrackControls::InitMenuData *mpData;
void OnSetFont(wxCommandEvent &);
};
LabelTrackMenuTable &LabelTrackMenuTable::Instance()
{
static LabelTrackMenuTable instance;
return instance;
}
enum
{
OnSetFontID = 30000,
};
BEGIN_POPUP_MENU(LabelTrackMenuTable)
POPUP_MENU_SEPARATOR()
POPUP_MENU_ITEM(OnSetFontID, _("&Font..."), OnSetFont)
END_POPUP_MENU()
void LabelTrackMenuTable::OnSetFont(wxCommandEvent &)
{
// Small helper class to enumerate all fonts in the system
// We use this because the default implementation of
// wxFontEnumerator::GetFacenames() has changed between wx2.6 and 2.8
class FontEnumerator : public wxFontEnumerator
{
public:
explicit FontEnumerator(wxArrayString* fontNames) :
mFontNames(fontNames) {}
bool OnFacename(const wxString& font) override
{
mFontNames->push_back(font);
return true;
}
private:
wxArrayString* mFontNames;
};
wxArrayString facenames;
FontEnumerator fontEnumerator(&facenames);
fontEnumerator.EnumerateFacenames(wxFONTENCODING_SYSTEM, false);
wxString facename = gPrefs->Read(wxT("/GUI/LabelFontFacename"), wxT(""));
// Correct for empty facename, or bad preference file:
// get the name of a really existing font, to highlight by default
// in the list box
facename = LabelTrackView::GetFont(facename).GetFaceName();
long fontsize = gPrefs->Read(wxT("/GUI/LabelFontSize"),
LabelTrackView::DefaultFontSize);
/* i18n-hint: (noun) This is the font for the label track.*/
wxDialogWrapper dlg(mpData->pParent, wxID_ANY, wxString(_("Label Track Font")));
dlg.SetName(dlg.GetTitle());
ShuttleGui S(&dlg, eIsCreating);
wxListBox *lb;
wxSpinCtrl *sc;
S.StartVerticalLay(true);
{
S.StartMultiColumn(2, wxEXPAND);
{
S.SetStretchyRow(0);
S.SetStretchyCol(1);
/* i18n-hint: (noun) The name of the typeface*/
S.AddPrompt(_("Face name"));
lb = safenew wxListBox(&dlg, wxID_ANY,
wxDefaultPosition,
wxDefaultSize,
facenames,
wxLB_SINGLE);
lb->SetSelection( make_iterator_range( facenames ).index( facename ));
S
.Name(XO("Face name"))
.Position( wxALIGN_LEFT | wxEXPAND | wxALL )
.AddWindow(lb);
/* i18n-hint: (noun) The size of the typeface*/
S.AddPrompt(_("Face size"));
sc = safenew wxSpinCtrl(&dlg, wxID_ANY,
wxString::Format(wxT("%ld"), fontsize),
wxDefaultPosition,
wxDefaultSize,
wxSP_ARROW_KEYS,
8, 48, fontsize);
S
.Name(XO("Face size"))
.Position( wxALIGN_LEFT | wxALL )
.AddWindow(sc);
}
S.EndMultiColumn();
S.AddStandardButtons();
}
S.EndVerticalLay();
dlg.Layout();
dlg.Fit();
dlg.CenterOnParent();
if (dlg.ShowModal() == wxID_CANCEL)
return;
gPrefs->Write(wxT("/GUI/LabelFontFacename"), lb->GetStringSelection());
gPrefs->Write(wxT("/GUI/LabelFontSize"), sc->GetValue());
gPrefs->Flush();
LabelTrackView::ResetFont();
mpData->result = RefreshCode::RefreshAll;
}
PopupMenuTable *LabelTrackControls::GetMenuExtension(Track *)
{
return &LabelTrackMenuTable::Instance();
}
using DoGetLabelTrackControls = DoGetControls::Override< LabelTrack >;
template<> template<> auto DoGetLabelTrackControls::Implementation() -> Function {
return [](LabelTrack &track) {
return std::make_shared<LabelTrackControls>( track.SharedPointer() );
};
}
static DoGetLabelTrackControls registerDoGetLabelTrackControls;
using GetDefaultLabelTrackHeight = GetDefaultTrackHeight::Override< LabelTrack >;
template<> template<>
auto GetDefaultLabelTrackHeight::Implementation() -> Function {
return [](LabelTrack &) {
// Label tracks are narrow
// Default is to allow two rows so that NEW users get the
// idea that labels can 'stack' when they would overlap.
return 73;
};
}
static GetDefaultLabelTrackHeight registerGetDefaultLabelTrackHeight;