26#include <wx/scrolbar.h>
27#include <wx/settings.h>
29#include <wx/stattext.h>
30#include <wx/textdlg.h>
111 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
112 , mProject{ project }
114 , mSelectedTrack(selectedTrack)
116 , mViewInfo(&viewinfo),
119 , mFreqFormat(freqFormat)
132 mGrid->CreateGrid(0,
Col_Max, wxGrid::wxGridSelectRows);
133 mGrid->SetDefaultCellAlignment(wxALIGN_LEFT, wxALIGN_CENTER);
134 mGrid->SetRowLabelSize(0);
137 for (
const auto &
label : {
149 XO(
"High Frequency"),
163 wxGridCellAttr *attr;
173 attr->SetAlignment(wxALIGN_CENTER, wxALIGN_CENTER);
182 attr->SetAlignment(wxALIGN_CENTER, wxALIGN_CENTER);
194 mGrid->SetRowMinimalAcceptableHeight(0);
195 mGrid->EnableDragRowSize(
false);
232 wxRect r =
mGrid->GetGridColLabelWindow()->GetRect();
233 wxScrollBar sb(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSB_VERTICAL);
234 r.width += sb.GetSize().GetWidth() + 6;
237 wxWindow * w = FindWindowById(
ID_IMPORT,
this );
240 r.width += w->GetSize().GetWidth();
242 SetClientSize(r.width, 300);
246 SetSizeHints(r.GetWidth(), r.GetHeight());
258 S.AddFixedText(
XO(
"Press F2 or double click to edit cell contents."));
259 S.StartHorizontalLay(wxEXPAND,1);
261 S.StartVerticalLay(wxEXPAND,1);
264 S.Prop(1).AddWindow(
mGrid );
267 S.StartVerticalLay(0);
278 S.EndHorizontalLay();
280 S.StartHorizontalLay(wxALIGN_RIGHT,
false);
284 S.EndHorizontalLay();
296 int cnt =
mData.size();
312 if (
mGrid->GetNumberRows()) {
317 mGrid->InsertRows(0, cnt);
320 for (i = 0; i < cnt; i++) {
337 mGrid->AutoSizeRows(
true);
341 wxChoice tc(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
mTrackNames);
359 bool ret = wxDialogWrapper::Show(show);
361#if defined(__WXMAC__) || defined(__WXGTK__)
378 int cnt =
mData.size();
386 for (i = lt->GetNumLabels() - 1; i >= 0 ; i--) {
405 auto newTrack = std::make_shared<LabelTrack>();
406 newTrack->SetName(
name);
412 for (i = 0; i < cnt; i++) {
420 if (rd.
index == tndx++) {
438 if (
mGrid->IsCellEditControlShown()) {
439 mGrid->HideCellEditControl();
440 mGrid->SaveEditControlValue();
449 if (index < 1 || index >= (
int)
mTrackNames.size()) {
451 mTrackNames.push_back(wxString::Format(wxT(
"%d - %s"), index, dflt));
467 if (
mData.size() == 0) {
495 int cnt =
mData.size();
503 double distMin = std::numeric_limits<double>::max();
507 for (i = 0; i < cnt; i++)
509 dist = t0 -
mData[i].selectedRegion.t0();
510 if (dist >= 0.0 && dist < distMin)
521 double t0Min = std::numeric_limits<double>::max();
522 for (i = 0; i < cnt; i++)
524 if (
mData[i].selectedRegion.t0() < t0Min)
527 t0Min =
mData[i].selectedRegion.t0();
555 int cnt =
mData.size();
560 if (
mGrid->IsCellEditControlShown()) {
561 mGrid->HideCellEditControl();
566 row =
mGrid->GetGridCursorRow();
567 if (row > 0 && row >= cnt) {
578 if (event.GetId() ==
ID_INSERTA && row < cnt) {
589 mGrid->EnableCellEditControl(
true);
590 mGrid->ShowCellEditControl();
595 int row =
mGrid->GetGridCursorRow();
596 int col =
mGrid->GetGridCursorCol();
597 int cnt =
mData.size();
605 if (
mGrid->IsCellEditControlShown()) {
606 mGrid->HideCellEditControl();
617 if (row > 0 && row >= --cnt) {
620 mGrid->SetGridCursor(row, col);
623 if (
mData.size() == 0 && wxWindow::FindFocus() ==
mGrid->GetGridWindow()) {
624 wxWindow *ok = wxWindow::FindWindowById( wxID_OK,
this);
636 XO(
"Select a text file containing labels"),
645 if (!fileName.empty()) {
652 XO(
"Could not open file: %s").
Format( fileName ) );
657 auto lt = std::make_shared<LabelTrack>();
673 int cnt =
mData.size();
684 fName =
SelectFile(FileNames::Operation::Export,
685 XO(
"Export Labels As:"),
690 wxFD_SAVE | wxFD_OVERWRITE_PROMPT | wxRESIZE_BORDER,
699 if (wxFileExists(fName)) {
701 wxString safetyFileName = fName + wxT(
"~");
703 wxString safetyFileName = fName + wxT(
".bak");
706 if (wxFileExists(safetyFileName))
707 wxRemoveFile(safetyFileName);
709 wxRename(fName, safetyFileName);
714 wxFile{}.Create(fName);
721 XO(
"Couldn't write to file: %s").
Format( fName ) );
726 auto lt = std::make_shared<LabelTrack>();
729 for (i = 0; i < cnt; i++) {
739 f.Write(wxTextFileType_Mac);
749 t->SetSelected(
true );
764 static bool guard =
false;
765 int row =
event.GetRow();
780 switch (event.GetCol())
820 XO(
"New Label Track"),
821 XO(
"Enter track name"),
823 XO(
"Label Track").Translation());
827 if (d.ShowModal() == wxID_CANCEL) {
904 wxSize sz = GetSize();
905 int prefWidth, prefHeight;
906 gPrefs->Read(wxT(
"/LabelEditor/Width"), &prefWidth, sz.x);
907 gPrefs->Read(wxT(
"/LabelEditor/Height"), &prefHeight, sz.y);
909 wxRect screenRect(wxGetClientDisplayRect());
910 wxSize prefSize = wxSize(prefWidth, prefHeight);
911 prefSize.DecTo(screenRect.GetSize());
916 wxSize sz = GetSize();
917 gPrefs->Write(wxT(
"/LabelEditor/Width"), sz.x);
918 gPrefs->Write(wxT(
"/LabelEditor/Height"), sz.y);
924 if (
mGrid->IsCellEditControlShown()) {
925 mGrid->SaveEditControlValue();
926 mGrid->HideCellEditControl();
941 if (
mGrid->IsCellEditControlShown()) {
942 auto editor =
mGrid->GetCellEditor(
mGrid->GetGridCursorRow(),
943 mGrid->GetGridCursorCol());
947 mGrid->HideCellEditControl();
953 EndModal(wxID_CANCEL);
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
EVT_BUTTON(wxID_NO, DependencyDialog::OnNo) EVT_BUTTON(wxID_YES
const TranslatableString name
#define GRID_VALUE_FREQUENCY
#define GRID_VALUE_CHOICE
EVT_COMMAND(wxID_ANY, EVT_FREQUENCYTEXTCTRL_UPDATED, LabelDialog::OnFreqUpdate) LabelDialog
IteratorRange< Iterator > make_iterator_range(const Iterator &i1, const Iterator &i2)
FilePath SelectFile(FileNames::Operation op, const TranslatableString &message, const FilePath &default_path, const FilePath &default_filename, const FileExtension &default_extension, const FileTypes &fileTypes, int flags, wxWindow *parent)
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Wrap wxTextEntryDialog so that caption IS translatable.
Modified version of wxGridChoiceEditor using wxChoice instead of wxComboBox.
void SetChoices(const wxArrayString &choices)
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
virtual bool Flush(bool bCurrentOnly=false) wxOVERRIDE
FILES_API const FileType AllFiles
FILES_API const FileType TextFiles
Supplies an accessible grid based on wxGrid.
static void ShowHelp(wxWindow *parent, const FilePath &localFileName, const URLString &remoteURL, bool bModal=false, bool alwaysDefaultBrowser=false)
Dialog for editing labels.
void OnChangeEtime(wxGridEvent &event, int row, RowData *rd)
void OnFreqUpdate(wxCommandEvent &event)
void OnChangeTrack(wxGridEvent &event, int row, RowData *rd)
void OnRemove(wxCommandEvent &event)
wxString TrackName(int &index, const wxString &dflt=_("Label Track"))
ChoiceEditor * mChoiceEditor
bool TransferDataToWindow() override
void AddLabels(const LabelTrack *t)
void OnSelectCell(wxGridEvent &event)
LabelTrack * mSelectedTrack
void OnHelp(wxCommandEvent &event)
void OnOK(wxCommandEvent &event)
void OnCellChange(wxGridEvent &event)
void OnChangeLabel(wxGridEvent &event, int row, RowData *rd)
void OnInsert(wxCommandEvent &event)
void OnChangeLfreq(wxGridEvent &event, int row, RowData *rd)
NumericEditor * mFrequencyEditor
NumericFormatSymbol mFreqFormat
wxArrayString mTrackNames
void OnCancel(wxCommandEvent &event)
ManualPageID GetHelpPageName()
AudacityProject & mProject
bool TransferDataFromWindow() override
void OnExport(wxCommandEvent &event)
NumericFormatSymbol mFormat
void OnChangeStime(wxGridEvent &event, int row, RowData *rd)
void PopulateOrExchange(ShuttleGui &S)
void OnImport(wxCommandEvent &event)
void OnUpdate(wxCommandEvent &event)
NumericEditor * mTimeEditor
bool Show(bool show=true) override
void OnChangeHfreq(wxGridEvent &event, int row, RowData *rd)
void Populate()
Creates the dialog and its contents.
A LabelStruct holds information for ONE label in a LabelTrack.
SelectedRegion selectedRegion
A LabelTrack is a Track that holds labels (LabelStruct).
const LabelStruct * GetLabel(int index) const
void ResetTextSelection()
static LabelTrackView & Get(LabelTrack &)
static NumericFormatSymbol LookupFormat(Type type, const wxString &id)
wxGridCellEditor for the NumericTextCtrl.
void SetRate(double rate)
void SetFormat(const NumericFormatSymbol &format)
static ProjectWindow & Get(AudacityProject &project)
void RedrawProject(const bool bForceWaveTracks=false)
SelectedRegion selectedRegion
RowData(int index_, const wxString &title_, const SelectedRegion &selectedRegion_)
Defines a selected portion of a project.
bool setT0(double t, bool maySwap=true)
bool setT1(double t, bool maySwap=true)
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
A flat linked list of tracks supporting Add, Remove, Clear, and Contains, serialization of the list o...
TrackKind * Add(const std::shared_ptr< TrackKind > &t)
auto Any() -> TrackIterRange< TrackType >
wxString Translation() const
NotifyingSelectedRegion selectedRegion