1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-21 14:50:06 +02:00

Scrub bar show/hide button on Scrubbing toolbar

This commit is contained in:
Paul Licameli 2016-06-14 23:21:42 -04:00
parent a590cbd343
commit b1ca48c23e
6 changed files with 75 additions and 36 deletions

View File

@ -374,6 +374,7 @@ void EditToolBar::EnableDisableButtons()
#include "../Track.h" #include "../Track.h"
#include "../UndoManager.h" #include "../UndoManager.h"
#include "../widgets/AButton.h" #include "../widgets/AButton.h"
#include "../widgets/Ruler.h"
#include "../tracks/ui/Scrubbing.h" #include "../tracks/ui/Scrubbing.h"
#include "../Experimental.h" #include "../Experimental.h"
@ -449,6 +450,9 @@ void ScrubbingToolBar::Populate()
_("Scrub"), true); _("Scrub"), true);
AddButton(bmpSeek, bmpSeek, bmpSeekDisabled, STBSeekID, AddButton(bmpSeek, bmpSeek, bmpSeekDisabled, STBSeekID,
_("Seek"), true); _("Seek"), true);
AddButton(bmpToggleScrubBar, bmpToggleScrubBar, bmpToggleScrubBar,
STBBarID,
_("Scrub bar"), true);
RegenerateTooltips(); RegenerateTooltips();
@ -491,6 +495,7 @@ void ScrubbingToolBar::RegenerateTooltips()
} }
mButtons[STBScrubID]->SetToolTip(_("Scrub")); mButtons[STBScrubID]->SetToolTip(_("Scrub"));
mButtons[STBSeekID]->SetToolTip(_("Seek")); mButtons[STBSeekID]->SetToolTip(_("Seek"));
mButtons[STBBarID]->SetToolTip(_("Scrub bar"));
#endif #endif
} }
@ -512,6 +517,9 @@ void ScrubbingToolBar::OnButton(wxCommandEvent &event)
case STBSeekID: case STBSeekID:
scrubber.OnSeek(event); scrubber.OnSeek(event);
break; break;
case STBBarID:
scrubber.OnToggleScrubBar(event);
break;
default: default:
wxASSERT(false); wxASSERT(false);
} }
@ -545,4 +553,10 @@ void ScrubbingToolBar::EnableDisableButtons()
startButton->Enable(); startButton->Enable();
else else
startButton->Disable(); startButton->Disable();
mButtons[STBBarID]->Enable();
if (p->GetRulerPanel()->ShowingScrubBar())
mButtons[STBBarID]->PushDown();
else
mButtons[STBBarID]->PopUp();
} }

View File

@ -116,6 +116,7 @@ enum {
STBStartID, STBStartID,
STBScrubID, STBScrubID,
STBSeekID, STBSeekID,
STBBarID,
STBNumButtons STBNumButtons
}; };
@ -133,8 +134,8 @@ public:
void Populate(); void Populate();
void Repaint(wxDC * WXUNUSED(dc)) {}; void Repaint(wxDC * WXUNUSED(dc)) {};
void EnableDisableButtons(); void EnableDisableButtons() override;
void UpdatePrefs(); void UpdatePrefs() override;
void RegenerateTooltips() override; void RegenerateTooltips() override;

View File

@ -22,6 +22,7 @@ Paul Licameli split from TrackPanel.cpp
#include "../../prefs/PlaybackPrefs.h" #include "../../prefs/PlaybackPrefs.h"
#include "../../toolbars/ControlToolBar.h" #include "../../toolbars/ControlToolBar.h"
#include "../../toolbars/EditToolBar.h" #include "../../toolbars/EditToolBar.h"
#include "../../toolbars/ToolManager.h"
#undef USE_TRANSCRIPTION_TOOLBAR #undef USE_TRANSCRIPTION_TOOLBAR
#ifdef USE_TRANSCRIPTION_TOOLBAR #ifdef USE_TRANSCRIPTION_TOOLBAR
@ -216,6 +217,7 @@ namespace {
wxString name; wxString name;
wxString label; wxString label;
wxString status; wxString status;
CommandFlag flags;
void (Scrubber::*memFn)(wxCommandEvent&); void (Scrubber::*memFn)(wxCommandEvent&);
bool seek; bool seek;
bool (Scrubber::*StatusTest)() const; bool (Scrubber::*StatusTest)() const;
@ -227,18 +229,28 @@ namespace {
"Seeking" is normal speed playback but with skips, ... "Seeking" is normal speed playback but with skips, ...
*/ */
{ wxT("Scrub"), XO("&Scrub"), XO("Scrubbing"), { wxT("Scrub"), XO("&Scrub"), XO("Scrubbing"),
&Scrubber::OnScrub, false, &Scrubber::Scrubs }, AlwaysEnabledFlag,
&Scrubber::OnScrub, false, &Scrubber::Scrubs,
},
{ wxT("Seek"), XO("See&k"), XO("Seeking"), { 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(""), { 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 }; enum { nMenuItems = sizeof(menuItems) / sizeof(*menuItems), StartMenuItem = 2 };
// This never finds the last item:
inline const MenuItem &FindMenuItem(bool seek) inline const MenuItem &FindMenuItem(bool seek)
{ {
return *std::find_if(menuItems, menuItems + nMenuItems, return *std::find_if(menuItems, menuItems + nMenuItems,
@ -514,6 +526,11 @@ void Scrubber::StopScrubbing()
mProject->GetRulerPanel()->HideQuickPlayIndicator(); mProject->GetRulerPanel()->HideQuickPlayIndicator();
} }
bool Scrubber::ShowsBar() const
{
return mProject->GetRulerPanel()->ShowingScrubBar();
}
bool Scrubber::IsScrubbing() const bool Scrubber::IsScrubbing() const
{ {
if (mScrubToken <= 0) if (mScrubToken <= 0)
@ -804,7 +821,7 @@ void Scrubber::OnScrubOrSeek(bool &toToggle, bool &other)
scrubbingToolBar->EnableDisableButtons(); scrubbingToolBar->EnableDisableButtons();
scrubbingToolBar->RegenerateTooltips(); scrubbingToolBar->RegenerateTooltips();
CheckMenuItem(); CheckMenuItems();
} }
void Scrubber::OnScrub(wxCommandEvent&) void Scrubber::OnScrub(wxCommandEvent&)
@ -822,19 +839,28 @@ void Scrubber::OnStartStop(wxCommandEvent&)
DoScrub(); DoScrub();
} }
void Scrubber::OnToggleScrubBar(wxCommandEvent&)
{
mProject->GetRulerPanel()->OnToggleScrubBar();
const auto toolbar = mProject->GetToolManager()->GetToolBar(ScrubbingBarID);
toolbar->EnableDisableButtons();
CheckMenuItems();
}
enum { CMD_ID = 8000 }; enum { CMD_ID = 8000 };
BEGIN_EVENT_TABLE(Scrubber, wxEvtHandler) BEGIN_EVENT_TABLE(Scrubber, wxEvtHandler)
EVT_MENU(CMD_ID, Scrubber::OnScrub) EVT_MENU(CMD_ID, Scrubber::OnScrub)
EVT_MENU(CMD_ID + 1, Scrubber::OnSeek) EVT_MENU(CMD_ID + 1, Scrubber::OnSeek)
EVT_MENU(CMD_ID + 2, Scrubber::OnStartStop) EVT_MENU(CMD_ID + 2, Scrubber::OnStartStop)
EVT_MENU(CMD_ID + 3, Scrubber::OnToggleScrubBar)
END_EVENT_TABLE() END_EVENT_TABLE()
BEGIN_EVENT_TABLE(Scrubber::Forwarder, wxEvtHandler) BEGIN_EVENT_TABLE(Scrubber::Forwarder, wxEvtHandler)
EVT_MOUSE_EVENTS(Scrubber::Forwarder::OnMouse) EVT_MOUSE_EVENTS(Scrubber::Forwarder::OnMouse)
END_EVENT_TABLE() END_EVENT_TABLE()
static_assert(nMenuItems == 3, "wrong number of items"); static_assert(nMenuItems == 4, "wrong number of items");
const wxString &Scrubber::GetUntranslatedStateString() const const wxString &Scrubber::GetUntranslatedStateString() const
{ {
@ -870,49 +896,48 @@ bool Scrubber::CanScrub() const
void Scrubber::AddMenuItems() void Scrubber::AddMenuItems()
{ {
auto cm = mProject->GetCommandManager(); auto cm = mProject->GetCommandManager();
auto flag = WaveTracksExistFlag;
auto flags = cm->GetDefaultFlags() | flag;
auto mask = cm->GetDefaultMask() | flag;
cm->BeginSubMenu(_("Scru&bbing")); cm->BeginSubMenu(_("Scru&bbing"));
for (const auto &item : menuItems) { for (const auto &item : menuItems) {
if (!item.GetStatus().empty()) if (item.StatusTest)
cm->AddCheck(item.name, wxGetTranslation(item.label), cm->AddCheck(item.name, wxGetTranslation(item.label),
FNT(Scrubber, this, item.memFn), FNT(Scrubber, this, item.memFn),
false, false,
// Less restricted: item.flags, item.flags);
AlwaysEnabledFlag, AlwaysEnabledFlag);
else else
// The start item // The start item
cm->AddItem(item.name, wxGetTranslation(item.label), cm->AddItem(item.name, wxGetTranslation(item.label),
FNT(Scrubber, this, item.memFn), FNT(Scrubber, this, item.memFn),
// More restricted: item.flags, item.flags);
flags, mask);
} }
cm->EndSubMenu(); cm->EndSubMenu();
CheckMenuItem(); CheckMenuItems();
} }
void Scrubber::PopulateMenu(wxMenu &menu) void Scrubber::PopulatePopupMenu(wxMenu &menu)
{ {
int id = CMD_ID; int id = CMD_ID;
auto cm = mProject->GetCommandManager(); auto cm = mProject->GetCommandManager();
const MenuItem *checkedItem = &FindMenuItem(mSeeking);
for (const auto &item : menuItems) { for (const auto &item : menuItems) {
if (cm->GetEnabled(item.name)) { if (cm->GetEnabled(item.name)) {
menu.AppendCheckItem(id, item.label); auto test = item.StatusTest;
if(&item == checkedItem) menu.Append(id, item.label, wxString{},
test ? wxITEM_CHECK : wxITEM_NORMAL);
if(test && (this->*test)())
menu.FindItem(id)->Check(); menu.FindItem(id)->Check();
} }
++id; ++id;
} }
} }
void Scrubber::CheckMenuItem() void Scrubber::CheckMenuItems()
{ {
auto cm = mProject->GetCommandManager(); auto cm = mProject->GetCommandManager();
cm->Check(menuItems[0].name, mScrubbing); for (const auto &item : menuItems) {
cm->Check(menuItems[1].name, mSeeking); auto test = item.StatusTest;
if (test)
cm->Check(item.name, (this->*test)());
}
} }
#endif #endif

View File

@ -103,6 +103,8 @@ public:
bool Scrubs() const bool Scrubs() const
{ return mScrubbing; } { return mScrubbing; }
bool ShowsBar() const;
void Cancel() void Cancel()
{ mCancelled = true; } { mCancelled = true; }
@ -118,12 +120,13 @@ public:
// For the toolbar // For the toolbar
void AddMenuItems(); void AddMenuItems();
// For popup // For popup
void PopulateMenu(wxMenu &menu); void PopulatePopupMenu(wxMenu &menu);
void OnScrubOrSeek(bool &toToggle, bool &other); void OnScrubOrSeek(bool &toToggle, bool &other);
void OnScrub(wxCommandEvent&); void OnScrub(wxCommandEvent&);
void OnSeek(wxCommandEvent&); void OnSeek(wxCommandEvent&);
void OnStartStop(wxCommandEvent&); void OnStartStop(wxCommandEvent&);
void OnToggleScrubBar(wxCommandEvent&);
// A string to put in the leftmost part of the status bar // A string to put in the leftmost part of the status bar
// when scrub or seek is in progress, or else empty. // when scrub or seek is in progress, or else empty.
@ -138,7 +141,7 @@ public:
private: private:
void DoScrub(); void DoScrub();
void OnActivateOrDeactivateApp(wxActivateEvent & event); void OnActivateOrDeactivateApp(wxActivateEvent & event);
void CheckMenuItem(); void CheckMenuItems();
// I need this because I can't push the scrubber as an event handler // I need this because I can't push the scrubber as an event handler
// in two places at once. // in two places at once.

View File

@ -2765,7 +2765,7 @@ void AdornedRulerPanel::UpdateStatusBarAndTooltips(StatusChoice choice)
RegenerateTooltips(choice); RegenerateTooltips(choice);
} }
void AdornedRulerPanel::OnToggleScrubbing(/*wxCommandEvent&*/) void AdornedRulerPanel::OnToggleScrubBar(/*wxCommandEvent&*/)
{ {
mShowScrubbing = !mShowScrubbing; mShowScrubbing = !mShowScrubbing;
//WriteScrubEnabledPref(mShowScrubbing); //WriteScrubEnabledPref(mShowScrubbing);
@ -2806,11 +2806,6 @@ void AdornedRulerPanel::UpdateButtonStates()
: _("Unpinned play/record Head"); : _("Unpinned play/record Head");
common(*pinButton, wxT("PinnedHead"), label); common(*pinButton, wxT("PinnedHead"), label);
} }
auto &scrubber = mProject->GetScrubber();
if(mShowScrubbing != (scrubber.Scrubs() || scrubber.Seeks()))
OnToggleScrubbing();
} }
void AdornedRulerPanel::OnTogglePinnedState(wxCommandEvent & event) void AdornedRulerPanel::OnTogglePinnedState(wxCommandEvent & event)
@ -2888,7 +2883,7 @@ void AdornedRulerPanel::ShowScrubMenu(const wxPoint & pos)
auto cleanup = finally([this]{ PopEventHandler(); }); auto cleanup = finally([this]{ PopEventHandler(); });
wxMenu rulerMenu; wxMenu rulerMenu;
mProject->GetScrubber().PopulateMenu(rulerMenu); mProject->GetScrubber().PopulatePopupMenu(rulerMenu);
PopupMenu(&rulerMenu, pos); PopupMenu(&rulerMenu, pos);
} }

View File

@ -330,6 +330,9 @@ public:
void HideQuickPlayIndicator(); void HideQuickPlayIndicator();
void UpdateQuickPlayPos(wxCoord &mousPosX); void UpdateQuickPlayPos(wxCoord &mousPosX);
bool ShowingScrubBar() const { return mShowScrubbing; }
void OnToggleScrubBar(/*wxCommandEvent&*/);
private: private:
void OnCapture(wxCommandEvent & evt); void OnCapture(wxCommandEvent & evt);
void OnPaint(wxPaintEvent &evt); void OnPaint(wxPaintEvent &evt);
@ -413,8 +416,6 @@ private:
void OnAutoScroll(wxCommandEvent &evt); void OnAutoScroll(wxCommandEvent &evt);
void OnLockPlayRegion(wxCommandEvent &evt); void OnLockPlayRegion(wxCommandEvent &evt);
void OnToggleScrubbing(/*wxCommandEvent&*/);
void OnContextMenu(wxContextMenuEvent & WXUNUSED(event)); void OnContextMenu(wxContextMenuEvent & WXUNUSED(event));
void OnTogglePinnedState(wxCommandEvent & event); void OnTogglePinnedState(wxCommandEvent & event);
@ -440,7 +441,7 @@ private:
StatusChoice mPrevZone { StatusChoice::NoChange }; StatusChoice mPrevZone { StatusChoice::NoChange };
bool mShowScrubbing { true }; bool mShowScrubbing { false };
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()