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:
parent
a590cbd343
commit
b1ca48c23e
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user