diff --git a/aegisub/src/audio_box.cpp b/aegisub/src/audio_box.cpp index 0406430e7..9ccfb6cef 100644 --- a/aegisub/src/audio_box.cpp +++ b/aegisub/src/audio_box.cpp @@ -39,7 +39,13 @@ #ifndef AGI_PRE #include +#include +#include +#include +#include +#include #include +#include #include #include // Keep this last so wxSW_3D is set. #endif @@ -47,12 +53,15 @@ #include #include "audio_box.h" + +#include "include/aegisub/context.h" +#include "include/aegisub/toolbar.h" + #include "audio_controller.h" #include "audio_display.h" #include "audio_karaoke.h" #include "audio_timing.h" #include "command/command.h" -#include "include/aegisub/context.h" #include "libresrc/libresrc.h" #include "main.h" #include "toggle_bitmap.h" @@ -66,7 +75,6 @@ enum AudioBoxControlIDs { Audio_Vertical_Zoom, Audio_Volume, Audio_Button_Karaoke, - Audio_Button_Goto, Audio_Button_Join, /// Karaoke -> Enter join mode. Audio_Button_Split, /// Karaoke -> Enter split mode. @@ -74,25 +82,6 @@ enum AudioBoxControlIDs { Audio_Button_Cancel /// Karaoke -> Split/Join mode -> Cancel. }; -static void add_button(wxWindow *parent, wxSizer *sizer, int border, const char *command) { - cmd::Command *c = cmd::get(command); - wxBitmapButton *btn = new wxBitmapButton(parent, cmd::id(command), c->Icon(16)); - ToolTipManager::Bind(btn, c->StrHelp(), "Audio", command); - sizer->Add(btn, 0, wxRIGHT, border); -} - -static void add_option(wxWindow *parent, wxSizer *sizer, int border, const char *command, const char *option) { - cmd::Command *c = cmd::get(command); - ToggleBitmap *btn = new ToggleBitmap(parent, cmd::id(command), c->Icon(16), wxSize(20, -1)); - ToolTipManager::Bind(btn, c->StrHelp(), "Audio", command); - btn->SetValue(OPT_GET(option)->GetBool()); - sizer->Add(btn, 0, wxRIGHT | wxALIGN_CENTER | wxEXPAND, border); -} - - -/// @brief Constructor -/// @param parent -/// AudioBox::AudioBox(wxWindow *parent, agi::Context *context) : wxPanel(parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL|wxBORDER_RAISED) , audioDisplay(new AudioDisplay(this, context->audioController, context)) @@ -121,7 +110,12 @@ AudioBox::AudioBox(wxWindow *parent, agi::Context *context) wxSizer *VertVolArea = new wxBoxSizer(wxVERTICAL); VertVolArea->Add(VertVol,1,wxEXPAND,0); - add_option(this, VertVolArea, 0, "audio/opt/vertical_link", "Audio/Link"); + cmd::Command *link_command = cmd::get("audio/opt/vertical_link"); + ToggleBitmap *link_btn = new ToggleBitmap(this, cmd::id("audio/opt/vertical_link"), link_command->Icon(16), wxSize(20, -1)); + ToolTipManager::Bind(link_btn, link_command->StrHelp(), "Audio", "audio/opt/vertical_link"); + link_btn->SetValue(OPT_GET("Audio/Link")->GetBool()); + link_btn->Bind(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, &AudioBox::OnVerticalLinkButton, this); + VertVolArea->Add(link_btn, 0, wxRIGHT | wxALIGN_CENTER | wxEXPAND, 0); OPT_SUB("Audio/Link", bind(&AudioBox::OnVerticalLink, this, std::tr1::placeholders::_1)); // Top sizer @@ -132,31 +126,6 @@ AudioBox::AudioBox(wxWindow *parent, agi::Context *context) // Buttons sizer wxSizer *ButtonSizer = new wxBoxSizer(wxHORIZONTAL); - add_button(this, ButtonSizer, 0, "time/prev"); - add_button(this, ButtonSizer, 0, "time/next"); - add_button(this, ButtonSizer, 0, "audio/play/selection"); - add_button(this, ButtonSizer, 10, "audio/stop"); - - add_button(this, ButtonSizer, 0, "audio/play/selection/before"); - add_button(this, ButtonSizer, 0, "audio/play/selection/after"); - add_button(this, ButtonSizer, 0, "audio/play/selection/begin"); - add_button(this, ButtonSizer, 0, "audio/play/selection/end"); - add_button(this, ButtonSizer, 10, "audio/play/to_end"); - - add_button(this, ButtonSizer, 0, "time/lead/in"); - add_button(this, ButtonSizer, 10, "time/lead/out"); - - add_button(this, ButtonSizer, 0, "audio/commit"); - wxButton *temp = new wxBitmapButton(this,Audio_Button_Goto,GETIMAGE(button_audio_goto_16)); - temp->SetToolTip(_("Go to selection")); - ButtonSizer->Add(temp,0,wxRIGHT,10); - - add_option(this, ButtonSizer, 0, "audio/opt/autocommit", "Audio/Auto/Commit"); - add_option(this, ButtonSizer, 0, "audio/opt/autonext", "Audio/Next Line on Commit"); - add_option(this, ButtonSizer, 10, "audio/opt/autoscroll", "Audio/Auto/Scroll"); - - ButtonSizer->AddStretchSpacer(1); - KaraokeButton = new wxBitmapToggleButton(this,Audio_Button_Karaoke,GETIMAGE(kara_mode_16)); KaraokeButton->SetToolTip(_("Toggle karaoke mode")); ButtonSizer->Add(KaraokeButton,0,wxRIGHT|wxEXPAND,0); @@ -191,7 +160,8 @@ AudioBox::AudioBox(wxWindow *parent, agi::Context *context) // Main sizer wxBoxSizer *MainSizer = new wxBoxSizer(wxVERTICAL); MainSizer->Add(TopSizer,1,wxEXPAND|wxALL,3); - MainSizer->Add(ButtonSizer,0,wxEXPAND|wxBOTTOM|wxLEFT|wxRIGHT,3); + MainSizer->Add(toolbar::GetToolbar(this, "audio", context, "Audio"),0,wxEXPAND|wxBOTTOM|wxLEFT|wxRIGHT,3); + MainSizer->Add(ButtonSizer); MainSizer->Add(karaokeSizer,0,wxEXPAND|wxBOTTOM|wxLEFT|wxRIGHT,3); MainSizer->AddSpacer(3); SetSizer(MainSizer); @@ -199,23 +169,15 @@ AudioBox::AudioBox(wxWindow *parent, agi::Context *context) SetKaraokeButtons(); // Decide which one to show or hide. controller->SetTimingController(timing_controller_dialogue); - - Bind(wxEVT_COMMAND_BUTTON_CLICKED, &AudioBox::OnCommand, this); - Bind(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, &AudioBox::OnCommand, this); } -/// @brief Destructor -/// -AudioBox::~AudioBox() -{ -} +AudioBox::~AudioBox() { } BEGIN_EVENT_TABLE(AudioBox,wxPanel) EVT_COMMAND_SCROLL(Audio_Horizontal_Zoom, AudioBox::OnHorizontalZoom) EVT_COMMAND_SCROLL(Audio_Vertical_Zoom, AudioBox::OnVerticalZoom) EVT_COMMAND_SCROLL(Audio_Volume, AudioBox::OnVolume) - EVT_BUTTON(Audio_Button_Goto, AudioBox::OnGoto) EVT_BUTTON(Audio_Button_Join,AudioBox::OnJoin) EVT_BUTTON(Audio_Button_Split,AudioBox::OnSplit) EVT_BUTTON(Audio_Button_Cancel,AudioBox::OnCancel) @@ -224,19 +186,10 @@ BEGIN_EVENT_TABLE(AudioBox,wxPanel) EVT_TOGGLEBUTTON(Audio_Button_Karaoke, AudioBox::OnKaraoke) END_EVENT_TABLE() -void AudioBox::OnCommand(wxCommandEvent &event) { - if (event.GetId() < Audio_Scrollbar) { - cmd::call(context, event.GetId()); - audioDisplay->SetFocus(); - } - else { - event.Skip(); - } +void AudioBox::OnVerticalLinkButton(wxCommandEvent &) { + cmd::call("audio/opt/vertical_link", context); } -/// @brief Horizontal zoom bar changed -/// @param event -/// void AudioBox::OnHorizontalZoom(wxScrollEvent &event) { // Negate the value, we want zoom out to be on bottom and zoom in on top, // but the control doesn't want negative on bottom and positive on top. @@ -268,7 +221,7 @@ void AudioBox::OnVerticalLink(agi::OptionValue const& opt) { VolumeBar->Enable(!opt.GetBool()); } -void AudioBox::OnKaraoke(wxCommandEvent &event) { +void AudioBox::OnKaraoke(wxCommandEvent &) { LOG_D("audio/box") << "OnKaraoke"; audioDisplay->SetFocus(); if (karaokeMode) { @@ -296,10 +249,6 @@ void AudioBox::OnKaraoke(wxCommandEvent &event) { LOG_D("audio/box") << "returning"; } - - -/// @brief Sets karaoke buttons -/// void AudioBox::SetKaraokeButtons() { // What to enable bool join,split; @@ -317,48 +266,26 @@ void AudioBox::SetKaraokeButtons() { karaokeSizer->Show(JoinSplitSizer, !audioKaraoke->splitting); } -/// @brief Join button in karaoke mode -/// @param event wxEvent -/// -void AudioBox::OnJoin(wxCommandEvent &event) { +void AudioBox::OnJoin(wxCommandEvent &) { LOG_D("audio/box") << "join"; audioDisplay->SetFocus(); audioKaraoke->Join(); } -/// @brief Split button in karaoke mode -/// @param event wxEvent -/// -void AudioBox::OnSplit(wxCommandEvent &event) { +void AudioBox::OnSplit(wxCommandEvent &) { LOG_D("audio/box") << "split"; audioDisplay->SetFocus(); audioKaraoke->BeginSplit(); } -/// @brief Cancel join/split in karaoke mode. -/// @param event wxEvent -/// -void AudioBox::OnCancel(wxCommandEvent &event) { +void AudioBox::OnCancel(wxCommandEvent &) { LOG_D("audio/box") << "cancel"; audioDisplay->SetFocus(); audioKaraoke->EndSplit(true); } -/// @brief Accept join/split button in karaoke mode. -/// @param event wxEvent -/// -void AudioBox::OnAccept(wxCommandEvent &event) { +void AudioBox::OnAccept(wxCommandEvent &) { LOG_D("audio/box") << "accept"; audioDisplay->SetFocus(); audioKaraoke->EndSplit(false); } - - -/// @brief Goto button -/// @param event -/// -void AudioBox::OnGoto(wxCommandEvent &event) { - audioDisplay->SetFocus(); - if (controller->GetTimingController()) - audioDisplay->ScrollSampleRangeInView(controller->GetTimingController()->GetIdealVisibleSampleRange()); -} diff --git a/aegisub/src/audio_box.h b/aegisub/src/audio_box.h index 8c2a6615a..2e1f80523 100644 --- a/aegisub/src/audio_box.h +++ b/aegisub/src/audio_box.h @@ -35,28 +35,24 @@ /// #ifndef AGI_PRE -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include #endif +namespace agi { + struct Context; + class OptionValue; +} + class AudioController; class AudioDisplay; class AudioKaraoke; class AudioTimingController; -class ToggleBitmap; -namespace agi { - struct Context; - class OptionValue; -} +class wxBitmapToggleButton; +class wxButton; +class wxCommandEvent; +class wxScrollEvent; +class wxSizer; +class wxSlider; /// @class AudioBox /// @brief Panel with audio playback and timing controls, also containing an AudioDisplay @@ -107,15 +103,13 @@ class AudioBox : public wxPanel { void OnVerticalZoom(wxScrollEvent &event); void OnVolume(wxScrollEvent &event); void OnVerticalLink(agi::OptionValue const& opt); + void OnVerticalLinkButton(wxCommandEvent&); - void OnKaraoke(wxCommandEvent &event); - void OnJoin(wxCommandEvent &event); - void OnSplit(wxCommandEvent &event); - void OnCancel(wxCommandEvent &event); - void OnAccept(wxCommandEvent &event); - void OnGoto(wxCommandEvent &event); - - void OnCommand(wxCommandEvent &event); + void OnKaraoke(wxCommandEvent &); + void OnJoin(wxCommandEvent &); + void OnSplit(wxCommandEvent &); + void OnCancel(wxCommandEvent &); + void OnAccept(wxCommandEvent &); /// DOCME AudioKaraoke *audioKaraoke; diff --git a/aegisub/src/command/audio.cpp b/aegisub/src/command/audio.cpp index 91e66280f..b4ab99f4b 100644 --- a/aegisub/src/command/audio.cpp +++ b/aegisub/src/command/audio.cpp @@ -323,7 +323,7 @@ struct audio_commit : public Command { /// Scroll the audio display to the current selection struct audio_go_to : public Command { - CMD_NAME("audio/?") + CMD_NAME("audio/go_to") STR_MENU("Go to selection") STR_DISP("Go to selection") STR_HELP("Go to selection") @@ -389,6 +389,23 @@ struct audio_autonext : public Command { } }; +/// Toggle spectrum analyzer mode +struct audio_toggle_spectrum : public Command { + CMD_NAME("audio/opt/spectrum") + STR_MENU("Spectrum analyzer mode") + STR_DISP("Spectrum analyzer mode") + STR_HELP("Spectrum analyzer mode") + CMD_TYPE(COMMAND_TOGGLE) + + bool IsActive(const agi::Context *c) { + return OPT_GET("Audio/Spectrum")->GetBool(); + } + + void operator()(agi::Context *c) { + toggle("Audio/Spectrum"); + } +}; + /// Toggle linked vertical zoom and volume struct audio_vertical_link : public Command { CMD_NAME("audio/opt/vertical_link") @@ -432,6 +449,7 @@ namespace cmd { reg(new audio_play_to_end); reg(new audio_save_clip); reg(new audio_stop); + reg(new audio_toggle_spectrum); reg(new audio_vertical_link); reg(new audio_view_spectrum); reg(new audio_view_waveform); diff --git a/aegisub/src/command/icon.cpp b/aegisub/src/command/icon.cpp index da78cc12f..c488df6f5 100644 --- a/aegisub/src/command/icon.cpp +++ b/aegisub/src/command/icon.cpp @@ -89,14 +89,17 @@ INSERT_ICON("app/language", languages_menu) INSERT_ICON("app/log", about_menu) INSERT_ICON("app/new_window", new_window_menu) INSERT_ICON("app/options", options_button) +INSERT_ICON("app/toggle/global_hotkeys", toggle_audio_medusa) INSERT_ICON("app/updates", blank_button) INSERT_ICON("audio/close", close_audio_menu) INSERT_ICON("audio/commit", button_audio_commit) +INSERT_ICON("audio/go_to", button_audio_goto) INSERT_ICON("audio/open", open_audio_menu) INSERT_ICON("audio/open/video", open_audio_from_video_menu) INSERT_ICON("audio/opt/autocommit", toggle_audio_autocommit) INSERT_ICON("audio/opt/autonext", toggle_audio_nextcommit) INSERT_ICON("audio/opt/autoscroll", toggle_audio_autoscroll) +INSERT_ICON("audio/opt/spectrum", toggle_audio_spectrum) INSERT_ICON("audio/opt/vertical_link", toggle_audio_link) INSERT_ICON("audio/play/selection", button_playsel) INSERT_ICON("audio/play/selection/after", button_playfivehafter) diff --git a/aegisub/src/include/aegisub/toolbar.h b/aegisub/src/include/aegisub/toolbar.h index 0f2e8edea..6c4d5d890 100644 --- a/aegisub/src/include/aegisub/toolbar.h +++ b/aegisub/src/include/aegisub/toolbar.h @@ -24,6 +24,8 @@ namespace agi { struct Context; } class wxFrame; +class wxToolBar; +class wxWindow; namespace toolbar { /// Add the named toolbar to a window @@ -32,4 +34,5 @@ namespace toolbar { /// @param context Project context /// @param hotkey Hotkey context for the tooltip void AttachToolbar(wxFrame *frame, std::string const& name, agi::Context *context, std::string const& hotkey); + wxToolBar *GetToolbar(wxWindow *parent, std::string const& name, agi::Context *context, std::string const& hotkey); } diff --git a/aegisub/src/libresrc/default_toolbar.json b/aegisub/src/libresrc/default_toolbar.json index 2f46b6846..b20d41c02 100644 --- a/aegisub/src/libresrc/default_toolbar.json +++ b/aegisub/src/libresrc/default_toolbar.json @@ -1,4 +1,28 @@ { + "audio" : [ + "time/prev", + "time/next", + "audio/play/selection", + "audio/stop", + "", + "audio/play/selection/before", + "audio/play/selection/after", + "audio/play/selection/begin", + "audio/play/selection/end", + "audio/play/to_end", + "", + "time/lead/in", + "time/lead/out", + "", + "audio/commit", + "audio/go_to", + "", + "audio/opt/autocommit", + "audio/opt/autonext", + "audio/opt/autoscroll", + "audio/opt/spectrum", + "app/toggle/global_hotkeys" + ], "main" : [ "subtitle/new", "subtitle/open", diff --git a/aegisub/src/toolbar.cpp b/aegisub/src/toolbar.cpp index 3a67769ff..37461c54a 100644 --- a/aegisub/src/toolbar.cpp +++ b/aegisub/src/toolbar.cpp @@ -176,4 +176,8 @@ namespace toolbar { void AttachToolbar(wxFrame *frame, std::string const& name, agi::Context *c, std::string const& hotkey) { frame->SetToolBar(new Toolbar(frame, name, c, hotkey)); } + + wxToolBar *GetToolbar(wxWindow *parent, std::string const& name, agi::Context *c, std::string const& hotkey) { + return new Toolbar(parent, name, c, hotkey); + } }