From b1ca48c23e93f88dee483c66a5b54e64d03e89ad Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 14 Jun 2016 23:21:42 -0400 Subject: [PATCH] Scrub bar show/hide button on Scrubbing toolbar --- src/toolbars/EditToolBar.cpp | 14 ++++++++ src/toolbars/EditToolBar.h | 5 +-- src/tracks/ui/Scrubbing.cpp | 69 ++++++++++++++++++++++++------------ src/tracks/ui/Scrubbing.h | 7 ++-- src/widgets/Ruler.cpp | 9 ++--- src/widgets/Ruler.h | 7 ++-- 6 files changed, 75 insertions(+), 36 deletions(-) diff --git a/src/toolbars/EditToolBar.cpp b/src/toolbars/EditToolBar.cpp index 009fc6b71..0de851951 100644 --- a/src/toolbars/EditToolBar.cpp +++ b/src/toolbars/EditToolBar.cpp @@ -374,6 +374,7 @@ void EditToolBar::EnableDisableButtons() #include "../Track.h" #include "../UndoManager.h" #include "../widgets/AButton.h" +#include "../widgets/Ruler.h" #include "../tracks/ui/Scrubbing.h" #include "../Experimental.h" @@ -449,6 +450,9 @@ void ScrubbingToolBar::Populate() _("Scrub"), true); AddButton(bmpSeek, bmpSeek, bmpSeekDisabled, STBSeekID, _("Seek"), true); + AddButton(bmpToggleScrubBar, bmpToggleScrubBar, bmpToggleScrubBar, + STBBarID, + _("Scrub bar"), true); RegenerateTooltips(); @@ -491,6 +495,7 @@ void ScrubbingToolBar::RegenerateTooltips() } mButtons[STBScrubID]->SetToolTip(_("Scrub")); mButtons[STBSeekID]->SetToolTip(_("Seek")); + mButtons[STBBarID]->SetToolTip(_("Scrub bar")); #endif } @@ -512,6 +517,9 @@ void ScrubbingToolBar::OnButton(wxCommandEvent &event) case STBSeekID: scrubber.OnSeek(event); break; + case STBBarID: + scrubber.OnToggleScrubBar(event); + break; default: wxASSERT(false); } @@ -545,4 +553,10 @@ void ScrubbingToolBar::EnableDisableButtons() startButton->Enable(); else startButton->Disable(); + + mButtons[STBBarID]->Enable(); + if (p->GetRulerPanel()->ShowingScrubBar()) + mButtons[STBBarID]->PushDown(); + else + mButtons[STBBarID]->PopUp(); } diff --git a/src/toolbars/EditToolBar.h b/src/toolbars/EditToolBar.h index aedf2a1bd..6a1e45dba 100644 --- a/src/toolbars/EditToolBar.h +++ b/src/toolbars/EditToolBar.h @@ -116,6 +116,7 @@ enum { STBStartID, STBScrubID, STBSeekID, + STBBarID, STBNumButtons }; @@ -133,8 +134,8 @@ public: void Populate(); void Repaint(wxDC * WXUNUSED(dc)) {}; - void EnableDisableButtons(); - void UpdatePrefs(); + void EnableDisableButtons() override; + void UpdatePrefs() override; void RegenerateTooltips() override; diff --git a/src/tracks/ui/Scrubbing.cpp b/src/tracks/ui/Scrubbing.cpp index 83caa47ed..cccd13877 100644 --- a/src/tracks/ui/Scrubbing.cpp +++ b/src/tracks/ui/Scrubbing.cpp @@ -22,6 +22,7 @@ Paul Licameli split from TrackPanel.cpp #include "../../prefs/PlaybackPrefs.h" #include "../../toolbars/ControlToolBar.h" #include "../../toolbars/EditToolBar.h" +#include "../../toolbars/ToolManager.h" #undef USE_TRANSCRIPTION_TOOLBAR #ifdef USE_TRANSCRIPTION_TOOLBAR @@ -216,6 +217,7 @@ namespace { wxString name; wxString label; wxString status; + CommandFlag flags; void (Scrubber::*memFn)(wxCommandEvent&); bool seek; bool (Scrubber::*StatusTest)() const; @@ -227,18 +229,28 @@ namespace { "Seeking" is normal speed playback but with skips, ... */ { wxT("Scrub"), XO("&Scrub"), XO("Scrubbing"), - &Scrubber::OnScrub, false, &Scrubber::Scrubs }, + AlwaysEnabledFlag, + &Scrubber::OnScrub, false, &Scrubber::Scrubs, + }, { wxT("Seek"), XO("See&k"), XO("Seeking"), - &Scrubber::OnSeek, true, &Scrubber::Seeks }, + AlwaysEnabledFlag, + &Scrubber::OnSeek, true, &Scrubber::Seeks, + }, { wxT("StartStopScrubSeek"), XO("Star&t/Stop"), XO(""), - &Scrubber::OnStartStop, true, nullptr }, + CanStopAudioStreamFlag, + &Scrubber::OnStartStop, true, nullptr + }, + + { wxT("ToggleScrubBar"), XO("Scrub Bar"), XO(""), + AlwaysEnabledFlag, + &Scrubber::OnToggleScrubBar, true, &Scrubber::ShowsBar, + }, }; enum { nMenuItems = sizeof(menuItems) / sizeof(*menuItems), StartMenuItem = 2 }; - // This never finds the last item: inline const MenuItem &FindMenuItem(bool seek) { return *std::find_if(menuItems, menuItems + nMenuItems, @@ -514,6 +526,11 @@ void Scrubber::StopScrubbing() mProject->GetRulerPanel()->HideQuickPlayIndicator(); } +bool Scrubber::ShowsBar() const +{ + return mProject->GetRulerPanel()->ShowingScrubBar(); +} + bool Scrubber::IsScrubbing() const { if (mScrubToken <= 0) @@ -804,7 +821,7 @@ void Scrubber::OnScrubOrSeek(bool &toToggle, bool &other) scrubbingToolBar->EnableDisableButtons(); scrubbingToolBar->RegenerateTooltips(); - CheckMenuItem(); + CheckMenuItems(); } void Scrubber::OnScrub(wxCommandEvent&) @@ -822,19 +839,28 @@ void Scrubber::OnStartStop(wxCommandEvent&) DoScrub(); } +void Scrubber::OnToggleScrubBar(wxCommandEvent&) +{ + mProject->GetRulerPanel()->OnToggleScrubBar(); + const auto toolbar = mProject->GetToolManager()->GetToolBar(ScrubbingBarID); + toolbar->EnableDisableButtons(); + CheckMenuItems(); +} + enum { CMD_ID = 8000 }; BEGIN_EVENT_TABLE(Scrubber, wxEvtHandler) EVT_MENU(CMD_ID, Scrubber::OnScrub) EVT_MENU(CMD_ID + 1, Scrubber::OnSeek) EVT_MENU(CMD_ID + 2, Scrubber::OnStartStop) + EVT_MENU(CMD_ID + 3, Scrubber::OnToggleScrubBar) END_EVENT_TABLE() BEGIN_EVENT_TABLE(Scrubber::Forwarder, wxEvtHandler) EVT_MOUSE_EVENTS(Scrubber::Forwarder::OnMouse) END_EVENT_TABLE() -static_assert(nMenuItems == 3, "wrong number of items"); +static_assert(nMenuItems == 4, "wrong number of items"); const wxString &Scrubber::GetUntranslatedStateString() const { @@ -870,49 +896,48 @@ bool Scrubber::CanScrub() const void Scrubber::AddMenuItems() { auto cm = mProject->GetCommandManager(); - auto flag = WaveTracksExistFlag; - auto flags = cm->GetDefaultFlags() | flag; - auto mask = cm->GetDefaultMask() | flag; cm->BeginSubMenu(_("Scru&bbing")); for (const auto &item : menuItems) { - if (!item.GetStatus().empty()) + if (item.StatusTest) cm->AddCheck(item.name, wxGetTranslation(item.label), FNT(Scrubber, this, item.memFn), false, - // Less restricted: - AlwaysEnabledFlag, AlwaysEnabledFlag); + item.flags, item.flags); else // The start item cm->AddItem(item.name, wxGetTranslation(item.label), FNT(Scrubber, this, item.memFn), - // More restricted: - flags, mask); + item.flags, item.flags); } cm->EndSubMenu(); - CheckMenuItem(); + CheckMenuItems(); } -void Scrubber::PopulateMenu(wxMenu &menu) +void Scrubber::PopulatePopupMenu(wxMenu &menu) { int id = CMD_ID; auto cm = mProject->GetCommandManager(); - const MenuItem *checkedItem = &FindMenuItem(mSeeking); for (const auto &item : menuItems) { if (cm->GetEnabled(item.name)) { - menu.AppendCheckItem(id, item.label); - if(&item == checkedItem) + auto test = item.StatusTest; + menu.Append(id, item.label, wxString{}, + test ? wxITEM_CHECK : wxITEM_NORMAL); + if(test && (this->*test)()) menu.FindItem(id)->Check(); } ++id; } } -void Scrubber::CheckMenuItem() +void Scrubber::CheckMenuItems() { auto cm = mProject->GetCommandManager(); - cm->Check(menuItems[0].name, mScrubbing); - cm->Check(menuItems[1].name, mSeeking); + for (const auto &item : menuItems) { + auto test = item.StatusTest; + if (test) + cm->Check(item.name, (this->*test)()); + } } #endif diff --git a/src/tracks/ui/Scrubbing.h b/src/tracks/ui/Scrubbing.h index 38a56c35a..378514ba6 100644 --- a/src/tracks/ui/Scrubbing.h +++ b/src/tracks/ui/Scrubbing.h @@ -103,6 +103,8 @@ public: bool Scrubs() const { return mScrubbing; } + bool ShowsBar() const; + void Cancel() { mCancelled = true; } @@ -118,12 +120,13 @@ public: // For the toolbar void AddMenuItems(); // For popup - void PopulateMenu(wxMenu &menu); + void PopulatePopupMenu(wxMenu &menu); void OnScrubOrSeek(bool &toToggle, bool &other); void OnScrub(wxCommandEvent&); void OnSeek(wxCommandEvent&); void OnStartStop(wxCommandEvent&); + void OnToggleScrubBar(wxCommandEvent&); // A string to put in the leftmost part of the status bar // when scrub or seek is in progress, or else empty. @@ -138,7 +141,7 @@ public: private: void DoScrub(); void OnActivateOrDeactivateApp(wxActivateEvent & event); - void CheckMenuItem(); + void CheckMenuItems(); // I need this because I can't push the scrubber as an event handler // in two places at once. diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index ed0938c88..ca334a299 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -2765,7 +2765,7 @@ void AdornedRulerPanel::UpdateStatusBarAndTooltips(StatusChoice choice) RegenerateTooltips(choice); } -void AdornedRulerPanel::OnToggleScrubbing(/*wxCommandEvent&*/) +void AdornedRulerPanel::OnToggleScrubBar(/*wxCommandEvent&*/) { mShowScrubbing = !mShowScrubbing; //WriteScrubEnabledPref(mShowScrubbing); @@ -2806,11 +2806,6 @@ void AdornedRulerPanel::UpdateButtonStates() : _("Unpinned play/record Head"); common(*pinButton, wxT("PinnedHead"), label); } - - auto &scrubber = mProject->GetScrubber(); - - if(mShowScrubbing != (scrubber.Scrubs() || scrubber.Seeks())) - OnToggleScrubbing(); } void AdornedRulerPanel::OnTogglePinnedState(wxCommandEvent & event) @@ -2888,7 +2883,7 @@ void AdornedRulerPanel::ShowScrubMenu(const wxPoint & pos) auto cleanup = finally([this]{ PopEventHandler(); }); wxMenu rulerMenu; - mProject->GetScrubber().PopulateMenu(rulerMenu); + mProject->GetScrubber().PopulatePopupMenu(rulerMenu); PopupMenu(&rulerMenu, pos); } diff --git a/src/widgets/Ruler.h b/src/widgets/Ruler.h index 6a6786f6a..d091bc43d 100644 --- a/src/widgets/Ruler.h +++ b/src/widgets/Ruler.h @@ -330,6 +330,9 @@ public: void HideQuickPlayIndicator(); void UpdateQuickPlayPos(wxCoord &mousPosX); + bool ShowingScrubBar() const { return mShowScrubbing; } + void OnToggleScrubBar(/*wxCommandEvent&*/); + private: void OnCapture(wxCommandEvent & evt); void OnPaint(wxPaintEvent &evt); @@ -413,8 +416,6 @@ private: void OnAutoScroll(wxCommandEvent &evt); void OnLockPlayRegion(wxCommandEvent &evt); - void OnToggleScrubbing(/*wxCommandEvent&*/); - void OnContextMenu(wxContextMenuEvent & WXUNUSED(event)); void OnTogglePinnedState(wxCommandEvent & event); @@ -440,7 +441,7 @@ private: StatusChoice mPrevZone { StatusChoice::NoChange }; - bool mShowScrubbing { true }; + bool mShowScrubbing { false }; DECLARE_EVENT_TABLE()