Skip to content

Commit d99950d

Browse files
authored
Issue #675: User setting for beat slider in viewer (#688)
1 parent 8cec746 commit d99950d

17 files changed

+158
-39
lines changed

LATEST_RELEASE_NOTES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Other changes:
1212
* [#667](../../issues/667) remove CalChartDoc begin and end
1313
* [#669](../../issues/669) Put mCurrentReferencePoint into core/show
1414
* [#671](../../issues/671) Remove GetCurrentSheet from Doc
15+
* [#675](../../issues/675) User setting for beat slider in viewer
1516
* [#676](../../issues/676) Make the name spacing of draw easier to read and put new things in
1617
* [#679](../../issues/679) Fix the broken build by updating docopt
1718

src/AnimationPanel.cpp

Lines changed: 66 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,19 @@ using namespace CalChart;
4545

4646
BEGIN_EVENT_TABLE(AnimationPanel, AnimationPanel::super)
4747
EVT_SPINCTRL(CALCHART__anim_tempo, AnimationPanel::OnSlider_anim_tempo)
48+
EVT_COMMAND_SCROLL(CALCHART__anim_gotosheet, AnimationPanel::OnSlider_anim_gotosheet)
4849
EVT_COMMAND_SCROLL(CALCHART__anim_gotobeat, AnimationPanel::OnSlider_anim_gotobeat)
4950
EVT_TIMER(CALCHART__anim_next_beat_timer, AnimationPanel::OnCmd_anim_next_beat_timer)
5051
END_EVENT_TABLE()
5152

52-
AnimationPanel::AnimationPanel(CalChart::Configuration& config, wxWindow* parent, wxWindowID winid, wxPoint const& pos, wxSize const& size, long style, wxString const& name)
53+
AnimationPanel::AnimationPanel(CalChart::Configuration& config, wxWindow* parent, bool miniMode, wxWindowID winid, wxPoint const& pos, wxSize const& size, long style, wxString const& name)
5354
: super(parent, winid, pos, size, style, name)
5455
, mCanvas(new AnimationCanvas(config, this, wxID_ANY, wxDefaultPosition, wxSize(-1, GetAnimationCanvasMinY())))
5556
, mOmniCanvas(new CCOmniviewCanvas(this, config))
5657
, mTimer(new wxTimer(this, CALCHART__anim_next_beat_timer))
5758
, mTempo(120)
5859
, mTimerOn(false)
59-
, mInMiniMode(true)
60+
, mInMiniMode(miniMode)
6061
, mConfig(config)
6162
{
6263
Init();
@@ -92,6 +93,14 @@ void AnimationPanel::CreateControls()
9293
OnCmd_PlayButton();
9394
})
9495
.withProxy(mPlayPauseButton),
96+
wxUI::LayoutIf{
97+
!mInMiniMode && mConfig.Get_AnimationFrameSheetSlider(),
98+
wxUI::Text{ "Sheet" },
99+
wxUI::Slider{ CALCHART__anim_gotosheet, std::pair{ 1, 2 }, 1 }
100+
.withStyle(wxSL_HORIZONTAL | wxSL_LABELS)
101+
.withProxy(mSheetSlider),
102+
wxUI::Text{ "Beat" },
103+
},
95104
wxUI::Slider{ CALCHART__anim_gotobeat, std::pair{ 1, 2 }, 1 }
96105
.withStyle(wxSL_HORIZONTAL | wxSL_LABELS)
97106
.withFlags(ExpandSizerFlags())
@@ -147,15 +156,6 @@ void AnimationPanel::CreateControls()
147156
mCanvas->Show();
148157
mOmniCanvas->Hide();
149158

150-
for (auto&& i : mItemsToHide) {
151-
i->Show(!mInMiniMode);
152-
}
153-
SetInMiniMode(mInMiniMode);
154-
}
155-
156-
void AnimationPanel::SetInMiniMode(bool miniMode)
157-
{
158-
mInMiniMode = miniMode;
159159
for (auto&& i : mItemsToHide) {
160160
i->Show(!mInMiniMode);
161161
}
@@ -218,7 +218,19 @@ void AnimationPanel::OnSlider_anim_tempo(wxSpinEvent& event)
218218

219219
void AnimationPanel::OnSlider_anim_gotobeat(wxScrollEvent& event)
220220
{
221-
mView->GotoTotalBeat(event.GetPosition());
221+
if (mSheetSlider.control()) {
222+
mView->GotoSheetBeat(*mSheetSlider - 1, event.GetPosition());
223+
} else {
224+
mView->GotoTotalBeat(event.GetPosition());
225+
}
226+
}
227+
228+
void AnimationPanel::OnSlider_anim_gotosheet(wxScrollEvent& event)
229+
{
230+
if (mSheetSlider.control()) {
231+
// because we want to show the sheets with offset 1, we need -1.
232+
mView->GotoSheetBeat(event.GetPosition() - 1, 0);
233+
}
222234
}
223235

224236
void AnimationPanel::ToggleTimer()
@@ -231,31 +243,61 @@ void AnimationPanel::ToggleTimer()
231243
UpdatePanel();
232244
}
233245

246+
namespace {
247+
auto disableSlider(auto& slider)
248+
{
249+
if (slider.control() == nullptr) {
250+
return;
251+
}
252+
slider.control()->Enable(false);
253+
}
254+
255+
auto updateController(auto& slider, int num, int curr, bool zeroOffset = true)
256+
{
257+
if (slider.control() == nullptr) {
258+
return;
259+
}
260+
if (num > 0) {
261+
slider.control()->SetRange(zeroOffset ? 0 : 1, num);
262+
if (*slider != curr) {
263+
*slider = curr;
264+
}
265+
slider.control()->Enable(true);
266+
} else {
267+
slider.control()->Enable(false);
268+
}
269+
}
270+
}
271+
234272
void AnimationPanel::UpdatePanel()
235273
{
236274
if (!mView) {
237275
return;
238276
}
239-
// TODO Update this.
240-
auto num = mView->GetTotalNumberBeats() - 1;
241-
auto curr = mView->GetTotalCurrentBeat();
277+
auto totalBeats = mView->GetTotalNumberBeats() - 1;
278+
auto currentBeat = mView->GetTotalCurrentBeat();
279+
auto totalSheets = mView->GetNumSheets() - 1; // gives us the total number sheets
280+
auto sheetBeatStuff = mView->BeatToSheetOffsetAndBeat(currentBeat);
281+
if (!sheetBeatStuff) {
282+
disableSlider(mBeatSlider);
283+
disableSlider(mSheetSlider);
284+
return;
285+
}
286+
auto [currentSheet, sheetBeat] = *sheetBeatStuff; // gives us which shee we are on and beat
287+
auto beatsForCurrentSheet = mView->BeatForSheet(currentSheet) - 1; // gives us which shee we are on and beat
242288

243-
if (num > 0) {
244-
mBeatSlider.control()->Enable(true);
245-
if (mBeatSlider.control()->GetMax() != num)
246-
*mBeatSlider = 0; // So Motif doesn't complain about value
247-
mBeatSlider.control()->SetRange(0, num);
248-
if (*mBeatSlider != curr)
249-
*mBeatSlider = curr;
289+
if (mSheetSlider.control()) {
290+
updateController(mBeatSlider, static_cast<int>(beatsForCurrentSheet), static_cast<int>(sheetBeat));
250291
} else {
251-
mBeatSlider.control()->Enable(false);
292+
updateController(mBeatSlider, static_cast<int>(totalBeats), static_cast<int>(currentBeat));
252293
}
294+
updateController(mSheetSlider, totalSheets + 1, currentSheet + 1, false);
253295
*mPlayPauseButton = mTimerOn;
254296
}
255297

256298
bool AnimationPanel::OnBeat() const
257299
{
258-
return *mBeatSlider & 1;
300+
return mView->GetTotalCurrentBeat() & 1;
259301
}
260302

261303
void AnimationPanel::SetPlayState(bool playState)

src/AnimationPanel.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class AnimationPanel : public wxPanel {
4848
wxDECLARE_EVENT_TABLE();
4949

5050
public:
51-
AnimationPanel(CalChart::Configuration& config, wxWindow* parent, wxWindowID winid = wxID_ANY, wxPoint const& pos = wxDefaultPosition, wxSize const& size = wxDefaultSize, long style = wxTAB_TRAVERSAL | wxNO_BORDER, wxString const& name = wxPanelNameStr);
51+
AnimationPanel(CalChart::Configuration& config, wxWindow* parent, bool miniMode, wxWindowID winid = wxID_ANY, wxPoint const& pos = wxDefaultPosition, wxSize const& size = wxDefaultSize, long style = wxTAB_TRAVERSAL | wxNO_BORDER, wxString const& name = wxPanelNameStr);
5252
~AnimationPanel() override;
5353

5454
void OnUpdate(); // Refresh from the View
@@ -61,9 +61,6 @@ class AnimationPanel : public wxPanel {
6161
bool OnBeat() const;
6262
auto TimerOn() const { return mTimerOn; }
6363

64-
auto GetInMiniMode() const { return mInMiniMode; }
65-
void SetInMiniMode(bool);
66-
6764
private:
6865
void Init();
6966
void CreateControls();
@@ -72,6 +69,7 @@ class AnimationPanel : public wxPanel {
7269
void OnCmd_anim_next_beat_timer(wxTimerEvent& event);
7370
void OnSlider_anim_tempo(wxSpinEvent& event);
7471
void OnSlider_anim_gotobeat(wxScrollEvent& event);
72+
void OnSlider_anim_gotosheet(wxScrollEvent& event);
7573
void OnCmd_PlayButton();
7674
void OnCmd_ToggleAnimOmni();
7775

@@ -88,6 +86,7 @@ class AnimationPanel : public wxPanel {
8886
wxUI::Text::Proxy mTempoLabel{};
8987
wxUI::SpinCtrl::Proxy mTempoCtrl{};
9088
wxUI::Slider::Proxy mBeatSlider{};
89+
wxUI::Slider::Proxy mSheetSlider{};
9190
wxUI::CheckBox::Proxy mSpritesCheckbox{};
9291
wxUI::CheckBox::Proxy mZoomCheckbox{};
9392
wxUI::CheckBox::Proxy mCollisionCheckbox{};
@@ -97,7 +96,7 @@ class AnimationPanel : public wxPanel {
9796
wxTimer* mTimer{};
9897
unsigned mTempo{};
9998
bool mTimerOn{};
100-
bool mInMiniMode{};
99+
const bool mInMiniMode{};
101100
bool mShowOmni{};
102101
std::vector<wxWindow*> mItemsToHide;
103102
CalChart::Configuration& mConfig;

src/AnimationView.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,28 @@ void AnimationView::RefreshAnimationSheet()
146146
RefreshFrame();
147147
}
148148

149-
int AnimationView::GetTotalNumberBeats() const
149+
auto AnimationView::GetTotalNumberBeats() const -> CalChart::Beats
150150
{
151151
auto totalBeats = mView->GetTotalNumberAnimationBeats();
152152
return totalBeats.value_or(0);
153153
}
154154

155-
int AnimationView::GetTotalCurrentBeat() const
155+
auto AnimationView::GetNumSheets() const -> size_t
156+
{
157+
return mView->GetNumSheets();
158+
}
159+
160+
auto AnimationView::BeatToSheetOffsetAndBeat(CalChart::Beats beat) const -> std::optional<std::tuple<size_t, CalChart::Beats>>
161+
{
162+
return mView->BeatToSheetOffsetAndBeat(beat);
163+
}
164+
165+
auto AnimationView::BeatForSheet(int sheet) const -> CalChart::Beats
166+
{
167+
return mView->BeatForSheet(sheet);
168+
}
169+
170+
auto AnimationView::GetTotalCurrentBeat() const -> CalChart::Beats
156171
{
157172
return mCurrentBeat;
158173
}
@@ -191,6 +206,12 @@ void AnimationView::GotoTotalBeat(CalChart::Beats whichBeat)
191206
RefreshFrame();
192207
}
193208

209+
void AnimationView::GotoSheetBeat(int whichSheet, CalChart::Beats whichBeat)
210+
{
211+
mCurrentBeat = whichBeat + mView->GetTotalNumberBeatsUpTo(whichSheet);
212+
RefreshFrame();
213+
}
214+
194215
auto AnimationView::AtEndOfShow() const -> bool
195216
{
196217
auto totalBeats = mView->GetTotalNumberAnimationBeats();

src/AnimationView.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,18 @@ class AnimationView : public wxView {
5959
void PrevBeat();
6060
void NextBeat();
6161
void GotoTotalBeat(CalChart::Beats whichBeat);
62+
void GotoSheetBeat(int whichSheet, CalChart::Beats whichBeat);
6263
[[nodiscard]] auto AtEndOfShow() const -> bool;
6364

6465
void RefreshAnimationSheet();
6566

6667
// info
67-
[[nodiscard]] auto GetTotalNumberBeats() const -> int;
68-
[[nodiscard]] auto GetTotalCurrentBeat() const -> int;
68+
[[nodiscard]] auto GetTotalNumberBeats() const -> CalChart::Beats;
69+
[[nodiscard]] auto GetTotalCurrentBeat() const -> CalChart::Beats;
70+
[[nodiscard]] auto GetNumSheets() const -> size_t;
71+
[[nodiscard]] auto BeatToSheetOffsetAndBeat(CalChart::Beats beat) const -> std::optional<std::tuple<size_t, CalChart::Beats>>;
72+
[[nodiscard]] auto BeatForSheet(int sheet) const -> CalChart::Beats;
73+
[[nodiscard]] auto GetSheetBeatSheetFromTotalCurrentBeat() const -> CalChart::Beats;
6974

7075
[[nodiscard]] auto GetAnimationBoundingBox(bool zoomInOnMarchers) const -> std::pair<CalChart::Coord, CalChart::Coord>;
7176

src/CalChartDoc.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,30 @@ auto CalChartDoc::GetAnimationBoundingBox(bool zoomInOnMarchers, CalChart::Beats
403403
return { bounding_box_low_right - bounding_box_upper_left, (modeSize / 2) + bounding_box_upper_left };
404404
}
405405

406+
auto CalChartDoc::BeatToSheetOffsetAndBeat(CalChart::Beats whichBeat) const -> std::optional<std::tuple<size_t, CalChart::Beats>>
407+
{
408+
if (!mAnimation) {
409+
return std::nullopt;
410+
}
411+
return mAnimation->BeatToSheetOffsetAndBeat(whichBeat);
412+
}
413+
414+
auto CalChartDoc::BeatForSheet(int whichSheet) const -> CalChart::Beats
415+
{
416+
if (!mAnimation) {
417+
return 0;
418+
}
419+
return mAnimation->BeatForSheet(whichSheet);
420+
}
421+
422+
auto CalChartDoc::GetTotalNumberBeatsUpTo(int whichSheet) const -> CalChart::Beats
423+
{
424+
if (!mAnimation) {
425+
return 0;
426+
}
427+
return mAnimation->GetTotalNumberBeatsUpTo(whichSheet);
428+
}
429+
406430
auto CalChartDoc::BeatHasCollision(CalChart::Beats whichBeat) const -> bool
407431
{
408432
if (!mAnimation) {

src/CalChartDoc.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ class CalChartDoc : public wxDocument {
243243
std::optional<bool> onBeat,
244244
CalChart::Animation::AngleStepToImageFunction imageFunction) const -> std::vector<CalChart::Draw::DrawCommand>;
245245
[[nodiscard]] auto GetTotalNumberAnimationBeats() const -> std::optional<CalChart::Beats>;
246+
[[nodiscard]] auto BeatToSheetOffsetAndBeat(CalChart::Beats whichBeat) const -> std::optional<std::tuple<size_t, CalChart::Beats>>;
247+
[[nodiscard]] auto BeatForSheet(int whichSheet) const -> CalChart::Beats;
248+
[[nodiscard]] auto GetTotalNumberBeatsUpTo(int whichSheet) const -> CalChart::Beats;
246249
[[nodiscard]] auto GetAnimationBoundingBox(bool zoomInOnMarchers, CalChart::Beats whichBeat) const -> std::pair<CalChart::Coord, CalChart::Coord>;
247250
[[nodiscard]] auto BeatHasCollision(CalChart::Beats whichBeat) const -> bool;
248251
[[nodiscard]] auto GetAnimationBeatForCurrentSheet() const -> CalChart::Beats;

src/CalChartFrame.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -371,11 +371,11 @@ CalChartFrame::CalChartFrame(wxDocument* doc, wxView* view, CalChart::Configurat
371371
mContinuityBrowser = new ContinuityBrowser(this, GetContinuityBrowserConstructSize(), mConfig);
372372
mFieldThumbnailBrowser = new FieldThumbnailBrowser(mConfig, this, wxID_ANY, wxDefaultPosition, GetFieldThumbnailBrowserConstructSize());
373373
mAnimationErrorsPanel = new AnimationErrorsPanel(this);
374-
mAnimationPanel = new AnimationPanel(mConfig, this);
374+
mAnimationPanel = new AnimationPanel(mConfig, this, true);
375375
mPrintContinuityEditor = new PrintContinuityEditor(this, mConfig);
376376

377377
// for doing mini and main panels
378-
mShadowAnimationPanel = new AnimationPanel(mConfig, this);
378+
mShadowAnimationPanel = new AnimationPanel(mConfig, this, false);
379379

380380
// update our lookups:
381381
mLookupSubWindows = {
@@ -393,9 +393,6 @@ CalChartFrame::CalChartFrame(wxDocument* doc, wxView* view, CalChart::Configurat
393393
mLookupSubWindowToIndex[window] = which;
394394
}
395395

396-
mAnimationPanel->SetInMiniMode(true);
397-
mShadowAnimationPanel->SetInMiniMode(false);
398-
399396
// now patch up the controls with the views:
400397
SetViewsOnComponents(GetFieldView());
401398

src/CalChartView.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,21 @@ auto CalChartView::GetAnimationBoundingBox(bool zoomInOnMarchers, CalChart::Beat
454454
return mShow->GetAnimationBoundingBox(zoomInOnMarchers, whichBeat);
455455
}
456456

457+
auto CalChartView::BeatToSheetOffsetAndBeat(CalChart::Beats beat) const -> std::optional<std::tuple<size_t, CalChart::Beats>>
458+
{
459+
return mShow->BeatToSheetOffsetAndBeat(beat);
460+
}
461+
462+
auto CalChartView::BeatForSheet(int sheet) const -> CalChart::Beats
463+
{
464+
return mShow->BeatForSheet(sheet);
465+
}
466+
467+
auto CalChartView::GetTotalNumberBeatsUpTo(int whichSheet) const -> CalChart::Beats
468+
{
469+
return mShow->GetTotalNumberBeatsUpTo(whichSheet);
470+
}
471+
457472
auto CalChartView::BeatHasCollision(CalChart::Beats whichBeat) const -> bool
458473
{
459474
return mShow->BeatHasCollision(whichBeat);

src/CalChartView.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ class CalChartView : public wxView {
9797
[[nodiscard]] auto GetAnimationCollisions() const -> std::map<int, CalChart::SelectionList>;
9898
[[nodiscard]] auto GetTotalNumberAnimationBeats() const -> std::optional<CalChart::Beats>;
9999
[[nodiscard]] auto GetAnimationBoundingBox(bool zoomInOnMarchers, CalChart::Beats whichBeat) const -> std::pair<CalChart::Coord, CalChart::Coord>;
100+
[[nodiscard]] auto BeatToSheetOffsetAndBeat(CalChart::Beats beat) const -> std::optional<std::tuple<size_t, CalChart::Beats>>;
101+
[[nodiscard]] auto BeatForSheet(int sheet) const -> CalChart::Beats;
102+
[[nodiscard]] auto GetTotalNumberBeatsUpTo(int whichSheet) const -> CalChart::Beats;
100103

101104
[[nodiscard]] auto GetContinuities() const { return mShow->GetContinuities(); }
102105
[[nodiscard]] auto ContinuitiesInUse() const { return mShow->ContinuitiesInUse(); }

0 commit comments

Comments
 (0)