In this week, I have finished the basic prototype of the brush tool, the original data structure designed for storing spectral data has now been refactored. Adapting to agile development, I have setup a Kraken board on GitHub Projects over Jira since most of the team members are already on GitHub, the real-time progress of the project will now be traceable.
The Kraken board in GitHub project
The refactorization of the structure
The first design is to access SpectrumView
via static variable and it has now been fixed, the data should be local to each SpectrumView
, meaning that for each stereo channel, the selection is stored separately, same applies for different tracks.
Suggested by Paul, we are sticking to the workflow of the SpectrumView::DrawClipSpectrum
, the structure has been modified from Frequency -> Time points
to Time point -> Frequency Bins
.
The missing cursor coordinates
The mouse events associated with UIHandle is not captured constantly (or frequent enough), meaning that if the user drag the mouse dramatically, some of the coordinates will be missed, considering the following graph, where the dragging speed increases from top to bottom:
Different dragging speed affects the mouse position capturing
An easy cheat will be to connect the last visited coordinate to the current one using wxDC::DrawLine
, we can even customize the thickness with single parameter, however it only affects the selected area visually, the continuous coordinates are still missing from the structure. Since it is impossible to capture the pixel-perfect line on our screen, we need algorithm to estimate the line, ideally with customizable thickness, and Bresenham’s line drawing algorithm has been chosen, it will be further modified since we expect the brush to be circular, but it will be good enough for prototyping.
To be done: the UX and undo/redo
As an ordinary application user, using keyboard shortcuts like Ctrl+Z & Ctrl+Y
almost becomes our muscle memory, and of course we expect to have similar functionality for the tool! Since the structure is new to the codebase, and we cannot simply reuse the ModifyState
from the ProjectHistory
, we will need to inform the base class about copying this new structure when adding to the state history.