[GSoC] LateNightQML: Deck (part 2) - #16691
Conversation
f99a567 to
5855cca
Compare
|
Just a note - not sure when it started nor whether this is related to running Mixxx QML in VirtualBox: Log spam frequency increases otably as soon as I load a track into a deck. And the EDIT mode (dnd to rearrange UI elements) doesn't work anymore. |
|
The log spam comes from
Yeah, it is not being introduced as of now. |
It's definetally a nice feature, but somehow we need to restrict the scope, so that we can deliver a complete product at the end of the project that doesn't have any significant functionality gaps. |
f4dd9e1 to
6355228
Compare
| } | ||
|
|
||
| function handleTapClick(mouse) { | ||
| if (Date.now() - root.tapModeEnteredAt < root.tapModeClickGuardTimeout) { |
There was a problem hiding this comment.
tapModeEnteredAt should be an required property
There was a problem hiding this comment.
tapModeEnteredAt is internal state set when the component enters tap mode, so making it required would add an invalid caller contract. I’ll keep it local.
There was a problem hiding this comment.
I meant "readonly property" with initialization. Without initialization the outcome of
if (Date.now() - root.tapModeEnteredAt < root.tapModeClickGuardTimeout)
is random.
There was a problem hiding this comment.
Understood. Since the guard is restarted whenever tap mode opens, the timestamp cannot be readonly. I replaced it with a Timer so the guard state is initialized and deterministic.
|
|
||
| function applyEditValueAndQuit() { | ||
| const parsedValue = Number(editInput.text); | ||
| if (!isFinite(parsedValue)) { |
There was a problem hiding this comment.
Number("") returns 0, not NaN, so isFinite guard does't catch empty input which result in 0.0 BPM display. Please fix and test this!
There was a problem hiding this comment.
NaN, doesn't legacy display it as 0.0 too? I didn't get you
There was a problem hiding this comment.
Legacy LateNight restores the original BPM value in case of an empty string. With 0.0 BPM the music would stop.
There was a problem hiding this comment.
Fixed. Empty input now closes the editor without writing the control, so the original BPM or rate is preserved.
| id: root | ||
|
|
||
| required property string group | ||
| required property var track |
There was a problem hiding this comment.
| required property var track | |
| required property Mixxx.Track track |
Always use typed vars
| Layout.preferredWidth: 180 | ||
| Layout.fillHeight: true | ||
| group: root.group | ||
| track: currentTrack |
There was a problem hiding this comment.
| track: currentTrack | |
| track: root.currentTrack |
| width: 12 | ||
| height: 10 | ||
| text: hotcueMarker.hotcueNumber | ||
| color: "#FFFFFF" |
There was a problem hiding this comment.
Hardcoded color values should only be used in LateNightTheme.qml
Please change this everywehere!
Despite that, the text color of hotcues depend on the hotcue color. please check the logic in existing Latenight. There is a light and dark decision logic.
| @@ -1,5 +1,6 @@ | |||
| #pragma once | |||
| #include <QObject> | |||
| #include <QPoint> | |||
There was a problem hiding this comment.
Why was this added? in the header file?
There was a problem hiding this comment.
It's a leftover from a pointer position implementation I was checking locally. Will clean up.
| pixmap, | ||
| endPixmap, | ||
| icon, | ||
| endPixmap, |
There was a problem hiding this comment.
This change is wrong. See
The previous order was correct. Did you find an issue somewhere else?
There was a problem hiding this comment.
You’re right. I did not find an issue elsewhere; I mixed up the WaveformMark::create() argument order with DefaultMarkerStyle. The struct’s original order is correct, so will restore it.
e61a59d to
815cfb2
Compare
JoergAtGithub
left a comment
There was a problem hiding this comment.
The numeric entry field for the BPM rate is not useable for me. It close automatically before I can enter all digits of the new value.
The expected behavior is that this remains open until I confirm the value by Enter keyboard button or cancel, e.g by. ESC,
|
This fix does not work for me: Aufzeichnung.2026-08-09.130634.mp4 |
506361a to
238ab3f
Compare
|
Rate value editing works now, but while the BPM entry field is open, there appear wrong placed + and - rate buttons and the borders of the area llok wrong too: Aufzeichnung.2026-08-10.212853.mp4For comparistion, the original LateNight: Aufzeichnung.2026-08-10.213733.mp4Somehow the borders in the video look different than on my screen |
| pixmap, | ||
| endPixmap, | ||
| icon, | ||
| endPixmap, |
| readonly property var deckPlayer: Mixxx.PlayerManager.getPlayer(root.group) | ||
| readonly property var currentTrack: deckPlayer?.currentTrack | ||
| readonly property Mixxx.Player deckPlayer: Mixxx.PlayerManager.getPlayer(root.group) | ||
| readonly property Mixxx.Track currentTrack: root.deckPlayer?.currentTrack |
There was a problem hiding this comment.
Not sure this will work because currentTrack may be null. Does this not raise any warning when this is the case?
There was a problem hiding this comment.
Good point. It now explicitly falls back to null when no player or track is available, in latest commit.
| width: parent.width | ||
| height: 24 | ||
| text: visualBpmProxy.value.toFixed(2) | ||
| text: bpmProxy.value.toFixed(2) |
There was a problem hiding this comment.
| @@ -26,41 +26,12 @@ Skin.EmbeddedText { | |||
| property double remaining: durationControl.value * (1 - playPositionControl.value) | |||
|
|
|||
| function toTime(value) { | |||
There was a problem hiding this comment.
What's the rational for moving this from JS to C++? Making this C++ makes customisation harder, as it requires our user to recompile Mixxx entirely.
Editing C++ also requires non trivial experience (e.g memory management, exception handling), while QML/JS is much more beginner friendly.
There was a problem hiding this comment.
This was explicitly requested in Joerg’s earlier review. cc @JoergAtGithub
Lifting my change request as I will be away for a while and don't want to block merge. Please do address my comment nevertheless!
This PR continues the LateNightQML deck work after Deck (part 1), focusing on the remaining deck waveform, overview, track metadata actions, vinyl/pass visuals, and rate-control polish for both the Classic and PaleMoon color schemes.
Testing the Experimental Skin
Since this is an early experimental milestone, you must first run Mixxx with the developer flag:
Once Mixxx is open, switch to the experimental skin:
Preferences -> Interface -> LateNight QML (Experimental)
You can dynamically toggle between the Classic and PaleMoon color schemes under preferences.
Previews
Classic
PaleMoon
Scope of Changes
Implemented in this PR:
Note:
Tracking
GSoC: LateNightQML PR-6