1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-01 16:19:43 +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 "../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();
}

View File

@ -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;

View File

@ -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

View File

@ -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.

View File

@ -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);
}

View File

@ -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()