19#include <wx/combobox.h>
20#include <wx/display.h>
21#include <wx/scrolbar.h>
28 return dlg.ShowModal() == wxID_OK;
41 ComboEditor(
const wxArrayString& choices,
bool allowOthers =
false)
42 : wxGridCellChoiceEditor(choices, allowOthers)
48 void PaintBackground(wxDC&,
const wxRect& WXUNUSED(rectCell),
const wxGridCellAttr & WXUNUSED(attr))
override
55 wxGridCellChoiceEditor::SetParameters(
params);
64 void SetSize(
const wxRect& rectOrig)
override
66 wxRect rect(rectOrig);
67 wxRect r = Combo()->GetRect();
70 rect.y -= (r.GetHeight() - rect.GetHeight()) / 2;
71 rect.height = r.GetHeight();
73 wxGridCellChoiceEditor::SetSize(rect);
90 wxComboBox * tc = Combo();
96 ch =
event.GetUnicodeKey();
102 ch =
event.GetKeyCode();
103 isPrintable = ch >= WXK_SPACE && ch < WXK_START;
116 const long pos = tc->GetLastPosition();
117 tc->Remove(pos - 1, pos);
123 tc->WriteText(
static_cast<wxChar
>(ch));
129 wxGridCellEditor *
Clone()
const override
143#define LABEL_ARTIST XO("Artist Name")
144#define LABEL_TITLE XO("Track Title")
145#define LABEL_ALBUM XO("Album Title")
146#define LABEL_TRACK XO("Track Number")
147#define LABEL_YEAR XO("Year")
148#define LABEL_GENRE XO("Genre")
149#define LABEL_COMMENTS XO("Comments")
177#define STATICCNT WXSIZEOF(labelmap)
214 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER),
216 mEditTitle(editTitle),
217 mEditTrack(editTrack)
228 PopulateOrExchange(
S);
230 TransferDataToWindow();
235 wxSize sz = GetSize();
236 SetSizeHints(sz.x,
std::min(sz.y, 600));
243 wxRect r = GetRect();
244 gPrefs->Read(wxT(
"/TagsEditorDialog/x"), &r.x, r.x);
245 gPrefs->Read(wxT(
"/TagsEditorDialog/y"), &r.y, r.y);
246 gPrefs->Read(wxT(
"/TagsEditorDialog/width"), &r.width, r.width);
247 gPrefs->Read(wxT(
"/TagsEditorDialog/height"), &r.height, r.height);
250 if (IsWindowRectValid(&r))
251 Move(r.GetPosition());
253 SetSize(r.GetSize());
257 wxScrollBar sb(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSB_VERTICAL);
258 r = mGrid->GetClientRect();
259 r.width -= mGrid->GetColSize(0);
260 r.width -= sb.GetSize().GetWidth();
263 mGrid->SetColSize(1, r.width);
287 gPrefs->Read(wxT(
"/AudioFiles/ShowId3Dialog"), &bShow,
true );
289 S.StartVerticalLay();
291 S.StartHorizontalLay(wxALIGN_LEFT, 0);
293 S.AddUnits(
XO(
"Use arrow keys (or ENTER key after editing) to navigate fields."));
295 S.EndHorizontalLay();
304 mGrid->RegisterDataType(wxT(
"Combo"),
308 mGrid->SetColLabelSize(
mGrid->GetDefaultRowSize());
310 auto cs = transform_container<wxArrayStringEx>(
314 mGrid->CreateGrid(0, 2, wxGrid::wxGridSelectRows);
315 mGrid->SetRowLabelSize(0);
316 mGrid->SetDefaultCellAlignment(wxALIGN_LEFT, wxALIGN_CENTER);
317 mGrid->SetColLabelValue(0,
_(
"Tag"));
318 mGrid->SetColLabelValue(1,
_(
"Value"));
321 wxComboBox tc(
this, wxID_ANY, wxT(
""), wxDefaultPosition, wxDefaultSize, cs);
322 mGrid->SetColSize(0, tc.GetSize().x);
323 mGrid->SetColMinimalWidth(0, tc.GetSize().x);
326 .Position(wxEXPAND | wxALL)
329 S.StartMultiColumn(4, wxALIGN_CENTER);
338 S.StartHorizontalLay(wxALIGN_CENTRE, 0);
340 S.StartStatic(
XO(
"Genres"));
342 S.StartMultiColumn(4, wxALIGN_CENTER);
350 S.StartStatic(
XO(
"Template"));
352 S.StartMultiColumn(4, wxALIGN_CENTER);
363 S.EndHorizontalLay();
364 S.StartHorizontalLay(wxALIGN_LEFT, 0);
366 S.Id(
DontShowID ).AddCheckBox(
XXO(
"Don't show this when exporting audio"), !bShow );
368 S.EndHorizontalLay();
377 bool bShow = !Evt.IsChecked();
378 gPrefs->Write(wxT(
"/AudioFiles/ShowId3Dialog"), bShow );
389 int i, cnt =
mGrid->GetNumberRows();
391 if (
mGrid->IsCellEditControlShown()) {
392 mGrid->SaveEditControlValue();
393 mGrid->HideCellEditControl();
397 for (i = 0; i < cnt; i++) {
400 auto n =
mGrid->GetCellValue(i, 0);
401 wxString v =
mGrid->GetCellValue(i, 1);
407 bool bSpecialTag =
true;
413 else if (n.CmpNoCase(
LABEL_TITLE.Translation()) == 0) {
416 else if (n.CmpNoCase(
LABEL_ALBUM.Translation()) == 0) {
419 else if (n.CmpNoCase(
LABEL_TRACK.Translation()) == 0) {
422 else if (n.CmpNoCase(
LABEL_YEAR.Translation()) == 0) {
425 else if (n.CmpNoCase(
LABEL_GENRE.Translation()) == 0) {
450 if (
mGrid->GetNumberRows()) {
458 mGrid->SetReadOnly(i, 0);
466 mGrid->SetReadOnly(i, 1);
471 mGrid->SetReadOnly(i, 1);
479 const auto &n = pair.first;
480 const auto &v = pair.second;
481 if (popTagMap.find(n) == popTagMap.end()) {
483 mGrid->SetCellValue(i, 0, n);
484 mGrid->SetCellValue(i, 1, v);
490 mGrid->AppendRows(1);
505 static bool ischanging =
false;
514 if (event.GetCol() != 0) {
520 auto row =
event.GetRow();
521 const wxString
key0 =
mGrid->GetCellValue(row, 0).Upper();
522 auto nn =
mGrid->GetNumberRows();
523 for (
decltype(nn) ii = 0; ii < nn; ++ii) {
526 auto key =
mGrid->GetCellValue(ii, 0).Upper();
527 if (
key0.CmpNoCase(
key) == 0) {
530 mGrid->SetGridCursor(ii, 0);
542 if (
mGrid->IsCellEditControlShown()) {
543 mGrid->SaveEditControlValue();
544 mGrid->HideCellEditControl();
548 wxDefaultPosition, wxDefaultSize,
549 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
555 S.StartVerticalLay(
true);
557 tc =
S.AddTextWindow(wxT(
""));
561 S.AddStandardButtons();
565 for (
int i = 0; i < cnt; i++) {
568 std::sort( g.begin(), g.end() );
570 for (
int i = 0; i < cnt; i++) {
571 tc->AppendText(g[i] + wxT(
"\n"));
575 if (dlg.ShowModal() == wxID_CANCEL) {
580 wxFile f(
fn.GetFullPath(), wxFile::write);
581 if (!f.IsOpened() || !f.Write(tc->GetValue())) {
583 XO(
"Unable to save genre file."),
584 XO(
"Reset Genres") );
596 XO(
"Are you sure you want to reset the genre list to defaults?"),
606 wxTextFile tf(
fn.GetFullPath());
608 bool open = (tf.Exists() && tf.Open()) ||
609 (!tf.Exists() && tf.Create());
613 XO(
"Unable to open genre file."),
614 XO(
"Reset Genres") );
621 for (
int i = 0; i < cnt; i++) {
627 XO(
"Unable to save genre file."),
628 XO(
"Reset Genres") );
651 XO(
"Load Metadata As:"),
656 wxFD_OPEN | wxRESIZE_BORDER,
667 if (!reader.
Parse(&temp,
fn)) {
671 XO(
"Error Loading Metadata"),
709 XO(
"Save Metadata As:"),
714 wxFD_SAVE | wxFD_OVERWRITE_PROMPT | wxRESIZE_BORDER,
740 auto cleanup =
finally( [&] {
783 const auto &n = pair.first;
784 const auto &v = pair.second;
785 gPrefs->Write(wxT(
"/Tags/") + n, v);
807 size_t row =
mGrid->GetGridCursorRow();
814 mGrid->GetCellValue(row, 0)
819 mGrid->SetCellValue(row, 1, wxEmptyString);
822 mGrid->DeleteRows(row, 1);
828 if (
mGrid->IsCellEditControlShown()) {
829 mGrid->SaveEditControlValue();
830 mGrid->HideCellEditControl();
831#if defined(__WXMAC__)
845 wxRect r = GetRect();
846 gPrefs->Write(wxT(
"/TagsEditorDialog/x"), r.x);
847 gPrefs->Write(wxT(
"/TagsEditorDialog/y"), r.y);
848 gPrefs->Write(wxT(
"/TagsEditorDialog/width"), r.width);
849 gPrefs->Write(wxT(
"/TagsEditorDialog/height"), r.height);
862 if (
mGrid->IsCellEditControlShown()) {
863 auto editor =
mGrid->GetCellEditor(
mGrid->GetGridCursorRow(),
864 mGrid->GetGridCursorCol());
868 mGrid->HideCellEditControl();
869#if defined(__WXMSW__)
874 auto focus = wxWindow::FindFocus();
875 if (escKey && focus ==
mGrid)
878 EndModal(wxID_CANCEL);
883 if (event.GetKeyCode() == WXK_ESCAPE)
891 int cnt =
mGrid->GetNumberRows();
893 for (
int i = 0; i < cnt; i++) {
897 mGrid->SetCellEditor(i, 1,
mGrid->GetDefaultEditorForType(wxT(
"Combo")));
900 mGrid->SetCellEditor(i, 1, NULL);
912 for (i = 0; i < cnt; i++) {
915 std::sort( g.begin(), g.end() );
917 for (i = 0; i < cnt; i++) {
918 parm = parm + (i == 0 ? wxT(
"") : wxT(
",")) + g[i];
923 auto editor =
mGrid->GetDefaultEditorForType(wxT(
"Combo"));
924 editor->SetParameters(parm);
931 wxPoint topLeft(windowRect->GetTopLeft().x, windowRect->GetTopLeft().y);
932 wxPoint topRight(windowRect->GetTopRight().x, windowRect->GetTopRight().y);
933 wxPoint bottomLeft(windowRect->GetBottomLeft().x, windowRect->GetBottomLeft().y);
934 wxPoint bottomRight(windowRect->GetBottomRight().x, windowRect->GetBottomRight().y);
935 display.GetFromPoint(topLeft);
936 if (display.GetFromPoint(topLeft) == -1 &&
937 display.GetFromPoint(topRight) == -1 &&
938 display.GetFromPoint(bottomLeft) == -1 &&
939 display.GetFromPoint(bottomRight) == -1) {
R GuardedCall(const F1 &body, const F2 &handler=F2::Default(), F3 delayedHandler=DefaultDelayedHandlerAction) noexcept(noexcept(handler(std::declval< AudacityException * >())) &&noexcept(handler(nullptr)) &&noexcept(std::function< void(AudacityException *)>{std::move(delayedHandler)}))
Execute some code on any thread; catch any AudacityException; enqueue error report on the main thread...
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
static const AudacityProject::AttachedObjects::RegisteredFactory key
EVT_BUTTON(wxID_NO, DependencyDialog::OnNo) EVT_BUTTON(wxID_YES
EffectDistortion::Params params
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)
std::vector< TranslatableString > TranslatableStrings
void PaintBackground(wxDC &, const wxRect &WXUNUSED(rectCell), const wxGridCellAttr &WXUNUSED(attr)) override
ComboEditor(const wxArrayString &choices, bool allowOthers=false)
virtual void StartingKey(wxKeyEvent &event) override
void SetParameters(const wxString ¶ms) override
void SetSize(const wxRect &rectOrig) override
wxGridCellEditor * Clone() const override
virtual bool DeleteGroup(const wxString &key) wxOVERRIDE
virtual bool Flush(bool bCurrentOnly=false) wxOVERRIDE
FILES_API const FileType XMLFiles
Supplies an accessible grid based on wxGrid.
static void ShowHelp(wxWindow *parent, const FilePath &localFileName, const URLString &remoteURL, bool bModal=false, bool alwaysDefaultBrowser=false)
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Holds a msgid for the translation catalog; may also bind format arguments.
wxString Translation() const
Reads a file and passes the results through an XMLTagHandler.
const TranslatableString & GetErrorStr() const
bool Parse(XMLTagHandler *baseHandler, const FilePath &fname)
Wrapper to output XML data to files.
void SetName(const TranslatableString &title)
FILES_API FilePath DataDir()
Audacity user data directory.