Skip to content

Commit

Permalink
[palette] added layout for MeasureRepeat
Browse files Browse the repository at this point in the history
  • Loading branch information
igorkorsukov committed Jul 10, 2023
1 parent 5c22e2a commit 20438db
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 65 deletions.
68 changes: 3 additions & 65 deletions src/engraving/layout/pal/tlayout.cpp
Expand Up @@ -1496,72 +1496,10 @@ void TLayout::layoutMeasureNumberBase(MeasureNumberBase* item, LayoutContext& ct
}
}

void TLayout::layout(MeasureRepeat* item, LayoutContext& ctx)
void TLayout::layout(MeasureRepeat*, LayoutContext&)
{
for (EngravingItem* e : item->el()) {
layoutItem(e, ctx);
}

switch (item->numMeasures()) {
case 1:
{
item->setSymId(SymId::repeat1Bar);
if (ctx.conf().styleB(Sid::mrNumberSeries) && item->track() != mu::nidx) {
int placeInSeries = 2; // "1" would be the measure actually being repeated
staff_idx_t staffIdx = item->staffIdx();
Measure* m = item->measure();
while (m && m->isOneMeasureRepeat(staffIdx) && m->prevIsOneMeasureRepeat(staffIdx)) {
placeInSeries++;
m = m->prevMeasure();
}
if (placeInSeries % ctx.conf().styleI(Sid::mrNumberEveryXMeasures) == 0) {
if (ctx.conf().styleB(Sid::mrNumberSeriesWithParentheses)) {
item->setNumberSym(String(u"(%1)").arg(placeInSeries));
} else {
item->setNumberSym(placeInSeries);
}
} else {
item->clearNumberSym();
}
} else if (ctx.conf().styleB(Sid::oneMeasureRepeatShow1)) {
item->setNumberSym(1);
} else {
item->clearNumberSym();
}
break;
}
case 2:
item->setSymId(SymId::repeat2Bars);
item->setNumberSym(item->numMeasures());
break;
case 4:
item->setSymId(SymId::repeat4Bars);
item->setNumberSym(item->numMeasures());
break;
default:
item->setSymId(SymId::noSym); // should never happen
item->clearNumberSym();
break;
}

RectF bbox = item->symBbox(item->symId());

if (item->track() != mu::nidx) { // if this is in score rather than a palette cell
// For unknown reasons, the symbol has some offset in almost all SMuFL fonts
// We compensate for it, to make sure the symbol is visually centered around the staff line
double offset = (-bbox.top() - bbox.bottom()) / 2.0;

const StaffType* staffType = item->staffType();

// Only need to set y position here; x position is handled in MeasureLayout::layoutMeasureElements()
item->setPos(0, std::floor(staffType->middleLine() / 2.0) * staffType->lineDistance().val() * item->spatium() + offset);
}

item->setbbox(bbox);

if (item->track() != mu::nidx && !item->numberSym().empty()) {
item->addbbox(item->numberRect());
}
//! NOTE Moved to PaletteLayout
UNREACHABLE;
}

void TLayout::layout(MMRest* item, LayoutContext& ctx)
Expand Down
34 changes: 34 additions & 0 deletions src/palette/internal/palettelayout.cpp
Expand Up @@ -58,6 +58,7 @@
#include "engraving/libmscore/letring.h"
#include "engraving/libmscore/line.h"
#include "engraving/libmscore/marker.h"
#include "engraving/libmscore/measurerepeat.h"
#include "engraving/libmscore/note.h"
#include "engraving/libmscore/ornament.h"
#include "engraving/libmscore/ottava.h"
Expand Down Expand Up @@ -143,6 +144,8 @@ void PaletteLayout::layoutItem(EngravingItem* item)
break;
case ElementType::MARKER: layout(toMarker(item), ctx);
break;
case ElementType::MEASURE_REPEAT: layout(toMeasureRepeat(item), ctx);
break;
case ElementType::NOTEHEAD: layout(toNoteHead(item), ctx);
break;
case ElementType::OTTAVA: layout(toOttava(item), ctx);
Expand Down Expand Up @@ -978,6 +981,37 @@ void PaletteLayout::layout(Marker* item, const Context& ctx)
layoutTextBase(item, ctx);
}

void PaletteLayout::layout(MeasureRepeat* item, const Context& ctx)
{
switch (item->numMeasures()) {
case 1:
{
item->setSymId(SymId::repeat1Bar);
if (ctx.style().styleB(Sid::oneMeasureRepeatShow1)) {
item->setNumberSym(1);
} else {
item->clearNumberSym();
}
break;
}
case 2:
item->setSymId(SymId::repeat2Bars);
item->setNumberSym(item->numMeasures());
break;
case 4:
item->setSymId(SymId::repeat4Bars);
item->setNumberSym(item->numMeasures());
break;
default:
item->setSymId(SymId::noSym); // should never happen
item->clearNumberSym();
break;
}

RectF bbox = item->symBbox(item->symId());
item->setbbox(bbox);
}

void PaletteLayout::layout(Ornament* item, const Context& ctx)
{
double spatium = item->spatium();
Expand Down
2 changes: 2 additions & 0 deletions src/palette/internal/palettelayout.h
Expand Up @@ -73,6 +73,7 @@ class SLine;
class LineSegment;

class Marker;
class MeasureRepeat;

class NoteHead;

Expand Down Expand Up @@ -171,6 +172,7 @@ class PaletteLayout
static void layout(engraving::NoteHead* item, const Context& ctx);

static void layout(engraving::Marker* item, const Context& ctx);
static void layout(engraving::MeasureRepeat* item, const Context& ctx);

static void layout(engraving::Ornament* item, const Context& ctx);
static void layout(engraving::Ottava* item, const Context& ctx);
Expand Down

0 comments on commit 20438db

Please sign in to comment.