26class Rhythm final :
public UnpatchedParam {
28 using UnpatchedParam::UnpatchedParam;
30 [[nodiscard]] int32_t getMinValue()
const override {
return 0; }
31 [[nodiscard]] int32_t getMaxValue()
const override {
return kMaxPresetArpRhythm; }
33 void drawValue()
override { display->setScrollingText(arpRhythmPatternNames[this->getValue()]); }
35 void drawInteger(int32_t textWidth, int32_t textHeight, int32_t yPixel)
override {
38 snprintf(name,
sizeof(name),
"%d: %s", this->getValue(), arpRhythmPatternNames[this->getValue()]);
41 canvas.
drawStringCentred(name, yPixel + OLED_MAIN_TOPMOST_PIXEL, textWidth, textHeight);
44 void renderInHorizontalMenu(int32_t startX, int32_t width, int32_t startY, int32_t height)
override {
47 renderColumnLabel(startX, width, startY);
51 DEF_STACK_STRING_BUF(shortOpt, kShortStringBufferSize);
52 if (soundEditor.editingKit() && !soundEditor.editingGateDrumRow()) {
53 shortOpt.append(arpRhythmPatternNames[this->getValue()]);
58 snprintf(name,
sizeof(name),
"%d: %s", this->getValue(), arpRhythmPatternNames[this->getValue()]);
59 shortOpt.append(name);
64 while ((pxLen = image.getStringWidthInPixels(shortOpt.c_str(), kTextSpacingY)) >= width) {
65 shortOpt.truncate(shortOpt.size() - 1);
68 int32_t pad = (width + 1 - pxLen) / 2;
69 image.drawString(shortOpt.c_str(), startX + pad, startY + kTextSpacingY + 2, kTextSpacingX, kTextSpacingY, 0,
70 startX + width - kTextSpacingX);
74 return !soundEditor.editingCVOrMIDIClip() && !soundEditor.editingNonAudioDrumRow();
void drawStringCentred(char const *string, int32_t pixelY, int32_t textWidth, int32_t textHeight, int32_t centrePos=OLED_MAIN_WIDTH_PIXELS/2)
Definition canvas.cpp:189