Skip to content

Commit b859402

Browse files
committed
Add option to disable UI updates during playback
1 parent e98b245 commit b859402

File tree

12 files changed

+193
-57
lines changed

12 files changed

+193
-57
lines changed

CHANGELOG

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ Release date:
55

66
New features:
77

8+
* Add option to disable UI updates during playback
9+
810
Bug fixes:
911

1012
Other:

src/application/service/editor_service.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "editor_service.hpp"
1717

18+
#include "../../infra/settings.hpp"
1819
#include "../../common/constants.hpp"
1920
#include "../../contrib/SimpleLogger/src/simple_logger.hpp"
2021
#include "../../domain/note_data.hpp"
@@ -1582,13 +1583,18 @@ void EditorService::requestPositionByTick(quint64 tick)
15821583
return;
15831584
}
15841585

1585-
const auto oldPosition = m_state.cursorPosition;
15861586
if (auto && songPosition = m_song->songPositionByTick(tick); songPosition.has_value()) {
1587-
m_state.cursorPosition.pattern = songPosition->pattern;
1588-
m_state.cursorPosition.line = static_cast<quint64>(songPosition->line);
1589-
notifyPositionChange(oldPosition);
1590-
setSongPositionInternal(songPosition->position, false);
1591-
updateTimes(songPosition->currentTime, m_song->lineToTime(songPosition->line));
1587+
if (Settings::uiUpdatesDisabledDuringPlayback()) {
1588+
setSongPositionInternal(songPosition->position, false);
1589+
updateTimes(songPosition->currentTime, m_song->lineToTime(songPosition->line));
1590+
} else {
1591+
const auto oldPosition = m_state.cursorPosition;
1592+
m_state.cursorPosition.pattern = songPosition->pattern;
1593+
m_state.cursorPosition.line = static_cast<quint64>(songPosition->line);
1594+
notifyPositionChange(oldPosition);
1595+
setSongPositionInternal(songPosition->position, false);
1596+
updateTimes(songPosition->currentTime, m_song->lineToTime(songPosition->line));
1597+
}
15921598
}
15931599
}
15941600

src/application/service/settings_service.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ static const auto TAG = "SettingsService";
2626

2727
SettingsService::SettingsService()
2828
: m_controllerPort { Settings::controllerPort("") }
29+
, m_uiUpdatesDisabledDuringPlayback { Settings::uiUpdatesDisabledDuringPlayback() }
2930
, m_visibleLines { Settings::visibleLines(32) }
3031
, m_trackHeaderFontSize { Settings::trackHeaderFontSize(20) }
3132
{
@@ -56,6 +57,20 @@ void SettingsService::setControllerPort(QString controllerPort)
5657
}
5758
}
5859

60+
bool SettingsService::uiUpdatesDisabledDuringPlayback() const
61+
{
62+
return m_uiUpdatesDisabledDuringPlayback;
63+
}
64+
65+
void SettingsService::setUiUpdatesDisabledDuringPlayback(bool disabled)
66+
{
67+
if (m_uiUpdatesDisabledDuringPlayback != disabled) {
68+
m_uiUpdatesDisabledDuringPlayback = disabled;
69+
Settings::setUiUpdatesDisabledDuringPlayback(disabled);
70+
emit uiUpdatesDisabledDuringPlaybackChanged();
71+
}
72+
}
73+
5974
QSize SettingsService::windowSize(QSize defaultSize) const
6075
{
6176
return Settings::windowSize(defaultSize);

src/application/service/settings_service.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class SettingsService : public QObject
2626
Q_OBJECT
2727

2828
Q_PROPERTY(QString controllerPort READ controllerPort WRITE setControllerPort NOTIFY controllerPortChanged)
29+
Q_PROPERTY(bool uiUpdatesDisabledDuringPlayback READ uiUpdatesDisabledDuringPlayback WRITE setUiUpdatesDisabledDuringPlayback NOTIFY uiUpdatesDisabledDuringPlaybackChanged)
2930
Q_PROPERTY(int visibleLines READ visibleLines WRITE setVisibleLines NOTIFY visibleLinesChanged)
3031
Q_PROPERTY(int trackHeaderFontSize READ trackHeaderFontSize WRITE setTrackHeaderFontSize NOTIFY trackHeaderFontSizeChanged)
3132

@@ -39,6 +40,9 @@ class SettingsService : public QObject
3940
virtual Q_INVOKABLE QString controllerPort() const;
4041
virtual Q_INVOKABLE void setControllerPort(QString controllerPort);
4142

43+
virtual Q_INVOKABLE bool uiUpdatesDisabledDuringPlayback() const;
44+
virtual Q_INVOKABLE void setUiUpdatesDisabledDuringPlayback(bool disabled);
45+
4246
virtual Q_INVOKABLE QSize windowSize(QSize defaultSize) const;
4347
virtual Q_INVOKABLE void setWindowSize(QSize size);
4448

@@ -65,12 +69,14 @@ class SettingsService : public QObject
6569

6670
signals:
6771
void controllerPortChanged();
72+
void uiUpdatesDisabledDuringPlaybackChanged();
6873

6974
void visibleLinesChanged();
7075
void trackHeaderFontSizeChanged();
7176

7277
private:
7378
QString m_controllerPort;
79+
bool m_uiUpdatesDisabledDuringPlayback;
7480

7581
int m_visibleLines;
7682
int m_trackHeaderFontSize;

src/infra/settings.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const auto stepKey = "step";
3838
const auto velocityKey = "velocity";
3939

4040
const auto trackHeaderFontSizeKey = "trackHeaderFontSize";
41+
const auto uiUpdatesDisabledDuringPlaybackKey = "uiUpdatesDisabledDuringPlayback";
4142
const auto visibleLinesKey = "visibleLines";
4243
const auto windowSizeKey = "size";
4344

@@ -184,6 +185,23 @@ void setTrackHeaderFontSize(int trackHeaderFontSize)
184185
settings.endGroup();
185186
}
186187

188+
bool uiUpdatesDisabledDuringPlayback()
189+
{
190+
QSettings settings;
191+
settings.beginGroup(settingsGroupEditor);
192+
const auto disabled = settings.value(uiUpdatesDisabledDuringPlaybackKey, false).toBool();
193+
settings.endGroup();
194+
return disabled;
195+
}
196+
197+
void setUiUpdatesDisabledDuringPlayback(bool disabled)
198+
{
199+
QSettings settings;
200+
settings.beginGroup(settingsGroupEditor);
201+
settings.setValue(uiUpdatesDisabledDuringPlaybackKey, disabled);
202+
settings.endGroup();
203+
}
204+
187205
bool recordingEnabled()
188206
{
189207
QSettings settings;

src/infra/settings.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ void setVisibleLines(int visibleLines);
4646
int trackHeaderFontSize(int defaultTrackHeaderFontSize);
4747
void setTrackHeaderFontSize(int trackHeaderFontSize);
4848

49+
bool uiUpdatesDisabledDuringPlayback();
50+
void setUiUpdatesDisabledDuringPlayback(bool disabled);
51+
4952
bool recordingEnabled();
5053
void setRecordingEnabled(bool enabled);
5154

src/unit_tests/editor_service_test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ set(SRC
4141
../../domain/play_order.cpp
4242
../../domain/song.cpp
4343
../../domain/track.cpp
44+
../../infra/settings.cpp
4445
)
4546
qt_add_executable(${NAME} ${SRC})
4647
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${UNIT_TEST_BASE_DIR})

src/unit_tests/editor_service_test/editor_service_test.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "../../application/service/automation_service.hpp"
2222
#include "../../application/service/editor_service.hpp"
2323
#include "../../application/service/mixer_service.hpp"
24+
#include "../../infra/settings.hpp"
2425
#include "../../application/service/selection_service.hpp"
2526
#include "../../application/service/side_chain_service.hpp"
2627
#include "../../domain/column_settings.hpp"
@@ -2122,6 +2123,48 @@ void EditorServiceTest::test_velocityAtPosition_shouldReturnCorrectVelocity()
21222123
QCOMPARE(editorService.velocityAtPosition(0, 1, 0, 0), 0);
21232124
}
21242125

2126+
void EditorServiceTest::test_requestPositionByTick_shouldRespectUiUpdatesDisabledSetting()
2127+
{
2128+
EditorService editorService;
2129+
QSignalSpy positionChangedSpy { &editorService, &EditorService::positionChanged };
2130+
QSignalSpy currentTimeChangedSpy { &editorService, &EditorService::currentTimeChanged };
2131+
QSignalSpy songPositionChangedSpy { &editorService, &EditorService::songPositionChanged };
2132+
2133+
// Enable disabling UI updates
2134+
Settings::setUiUpdatesDisabledDuringPlayback(true);
2135+
2136+
// Initial position
2137+
QCOMPARE(editorService.songPosition(), 0);
2138+
2139+
// Populate song position map manually as we don't have a PlayerService rendering
2140+
editorService.song()->updateTickToSongPositionMapping(0, 0, 0, editorService.lineCount(0));
2141+
2142+
// Tick update that triggers a line change
2143+
const auto tick = editorService.ticksPerLine(); // Move to next line
2144+
editorService.requestPositionByTick(tick);
2145+
2146+
// Assert: Position should NOT change (UI update suppressed)
2147+
QCOMPARE(positionChangedSpy.count(), 0);
2148+
// Assert: Time should change
2149+
QCOMPARE(currentTimeChangedSpy.count(), 1);
2150+
// Assert: Song position should NOT change (we are still in the same pattern)
2151+
QCOMPARE(songPositionChangedSpy.count(), 0);
2152+
QCOMPARE(editorService.songPosition(), 0);
2153+
2154+
// Reset setting
2155+
Settings::setUiUpdatesDisabledDuringPlayback(false);
2156+
2157+
// Another tick
2158+
const auto nextTick = tick * 2;
2159+
editorService.requestPositionByTick(nextTick);
2160+
2161+
// Assert: Position should change now
2162+
QCOMPARE(positionChangedSpy.count(), 1);
2163+
QCOMPARE(currentTimeChangedSpy.count(), 2);
2164+
// Assert: Song position still 0
2165+
QCOMPARE(songPositionChangedSpy.count(), 0);
2166+
}
2167+
21252168
} // namespace noteahead
21262169

21272170
QTEST_GUILESS_MAIN(noteahead::EditorServiceTest)

src/unit_tests/editor_service_test/editor_service_test.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ private slots:
8989
void test_requestPosition_validPosition_shouldChangePosition();
9090
void test_requestPosition_shouldChangePosition();
9191
void test_requestPosition_shouldNotChangePosition();
92+
void test_requestPositionByTick_shouldRespectUiUpdatesDisabledSetting();
9293
void test_resetSongPosition_firstTrackRemoved_shouldResetPosition();
9394

9495
void test_requestScroll_shouldChangePosition();

src/unit_tests/editor_service_undo_test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ set(SRC
4141
../../domain/play_order.cpp
4242
../../domain/song.cpp
4343
../../domain/track.cpp
44+
../../infra/settings.cpp
4445
)
4546
qt_add_executable(${NAME} ${SRC})
4647
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${UNIT_TEST_BASE_DIR})

0 commit comments

Comments
 (0)