Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions src/engraving/dom/bracket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "score.h"
#include "staff.h"
#include "system.h"
#include "text.h"

#include "log.h"

Expand All @@ -54,6 +55,18 @@ Bracket::Bracket(EngravingItem* parent)

Bracket::~Bracket()
{
if (m_text) {
delete m_text;
}
}

void Bracket::scanElements(std::function<void(EngravingItem*)> func)
{
if (m_text) {
m_text->scanElements(func);
}

EngravingItem::scanElements(func);
}

//---------------------------------------------------------
Expand Down Expand Up @@ -340,5 +353,19 @@ Fraction Bracket::tick() const
void Bracket::setSelected(bool f)
{
m_bi->setSelected(f);
if (m_text) {
m_text->setSelected(f);
}

EngravingItem::setSelected(f);
}

bool Bracket::intersects(const Bracket* other) const
{
return m_firstStaff <= other->m_lastStaff && m_lastStaff >= other->m_firstStaff;
}

bool Bracket::contains(staff_idx_t staffIdx) const
{
return staffIdx >= m_firstStaff && staffIdx <= m_lastStaff;
}
10 changes: 10 additions & 0 deletions src/engraving/dom/bracket.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ class Bracket final : public EngravingItem

Bracket* clone() const override { return new Bracket(*this); }

void scanElements(std::function<void(EngravingItem*)> func) override;

void setBracketItem(BracketItem* i) { m_bi = i; }
BracketItem* bracketItem() const { return m_bi; }

Expand Down Expand Up @@ -100,6 +102,12 @@ class Bracket final : public EngravingItem

void setSelected(bool f) override;

Text* text() const { return m_text; }
void setText(Text* t) { m_text = t; }

bool intersects(const Bracket* other) const;
bool contains(staff_idx_t staffIdx) const;

struct LayoutData : public EngravingItem::LayoutData {
SymId braceSymbol = SymId::noSym;
PainterPath path;
Expand Down Expand Up @@ -128,5 +136,7 @@ class Bracket final : public EngravingItem
// because layout needs width of brace before knowing height of system...
double m_magx = 0.0;
Measure* m_measure = nullptr;

Text* m_text = nullptr;
};
}
45 changes: 43 additions & 2 deletions src/engraving/dom/bracketItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ PropertyValue BracketItem::getProperty(Pid id) const
return m_column;
case Pid::BRACKET_SPAN:
return static_cast<int>(m_bracketSpan);
case Pid::STAFF_LONG_NAME:
return longName();
case Pid::STAFF_SHORT_NAME:
return shortName();
case Pid::GROUP_BRACKET_SHOW_TEXT:
return m_showText;
case Pid::GROUP_BRACKET_SHOW_BRACKET:
return m_showBracket;
default:
return EngravingItem::getProperty(id);
}
Expand All @@ -62,17 +70,29 @@ bool BracketItem::setProperty(Pid id, const PropertyValue& v)
{
switch (id) {
case Pid::SYSTEM_BRACKET:
staff()->setBracketType(column(), BracketType(v.toInt())); // change bracket type global
m_bracketType = v.value<BracketType>();
break;
case Pid::BRACKET_COLUMN:
staff()->changeBracketColumn(column(), v.value<size_t>());
m_column = v.toInt();
break;
case Pid::BRACKET_SPAN:
m_bracketSpan = static_cast<size_t>(v.toInt());
break;
case Pid::VISIBLE:
setVisible(v.toBool());
break;
case Pid::STAFF_LONG_NAME:
m_name.setLongName(v.value<String>());
break;
case Pid::STAFF_SHORT_NAME:
m_name.setShortName(v.value<String>());
break;
case Pid::GROUP_BRACKET_SHOW_TEXT:
m_showText = v.toBool();
break;
case Pid::GROUP_BRACKET_SHOW_BRACKET:
m_showBracket = v.toBool();
break;
default:
return EngravingItem::setProperty(id, v);
}
Expand All @@ -87,8 +107,29 @@ PropertyValue BracketItem::propertyDefault(Pid id) const
return int(BracketType::NORMAL);
case Pid::BRACKET_COLUMN:
return size_t(0);
case Pid::STAFF_LONG_NAME:
return muse::mtrc("systemBrackets", "GROUP");
case Pid::STAFF_SHORT_NAME:
return muse::mtrc("systemBrackets", "GR.", "Short for GROUP");
case Pid::GROUP_BRACKET_SHOW_TEXT:
case Pid::GROUP_BRACKET_SHOW_BRACKET:
return true;
default:
return EngravingItem::propertyDefault(id);
}
}

bool BracketItem::intersects(const BracketItem* other) const
{
staff_idx_t firstOfOther = other->staff()->idx();
staff_idx_t lastOfOther = firstOfOther + other->bracketSpan() - 1;
return intersects(firstOfOther, lastOfOther);
}

bool BracketItem::intersects(staff_idx_t first, staff_idx_t last) const
{
staff_idx_t firstOfThis = staff()->idx();
staff_idx_t lastOfThis = firstOfThis + bracketSpan() - 1;
return firstOfThis <= last && lastOfThis >= first;
}
}
16 changes: 16 additions & 0 deletions src/engraving/dom/bracketItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#define MU_ENGRAVING_BRACKET_ITEM_H

#include "engravingitem.h"
#include "stafflabel.h"

#include "../types/types.h"

Expand Down Expand Up @@ -54,6 +55,17 @@ class BracketItem final : public EngravingItem
size_t column() const { return m_column; }
void setColumn(size_t v) { m_column = v; }

StaffLabel& label() { return m_name; }
const StaffLabel& label() const { return m_name; }
const String& longName() const { return m_name.longName(); }
const String& shortName() const { return m_name.shortName(); }

bool showText() const { return m_showText; }
bool showBracket() const { return m_showBracket; }

bool intersects(const BracketItem* other) const;
bool intersects(staff_idx_t first, staff_idx_t last) const;

private:

friend class Factory;
Expand All @@ -65,6 +77,10 @@ class BracketItem final : public EngravingItem
size_t m_column = 0;
size_t m_bracketSpan = 0;
Staff* m_staff = nullptr;

StaffLabel m_name = StaffLabel(muse::mtrc("systemBrackets", "GROUP"), muse::mtrc("systemBrackets", "GR.", "Short for GROUP"));
bool m_showText = true;
bool m_showBracket = true;
};
}
#endif
18 changes: 9 additions & 9 deletions src/engraving/dom/measure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1559,19 +1559,19 @@

case ElementType::BRACKET:
{
Bracket* b = toBracket(e);
Selection sel = score()->selection();
staff_idx_t firstStaff = sel.staffStart();
staff_idx_t lastStaff = sel.staffEnd() - 1;
size_t level = 0;
staff_idx_t firstStaff = 0;
for (Staff* s : score()->staves()) {
for (const BracketItem* bi : s->brackets()) {
staff_idx_t lastStaff = firstStaff + bi->bracketSpan() - 1;
if (staffIdx >= firstStaff && staffIdx <= lastStaff) {
++level;
for (staff_idx_t staffIdx = 0; staffIdx < score()->nstaves(); ++staffIdx) {

Check warning on line 1566 in src/engraving/dom/measure.cpp

View workflow job for this annotation

GitHub Actions / windows_x64

declaration of 'staffIdx' hides previous local declaration
for (const BracketItem* bi : score()->staff(staffIdx)->brackets()) {
if (bi->intersects(firstStaff, lastStaff)) {
level = std::max(level, bi->column() + 1);
}
}
firstStaff++;
}
Selection sel = score()->selection();

Bracket* b = toBracket(e);
if (sel.isRange()) {
score()->undoAddBracket(staff, level, b->bracketType(), sel.staffEnd() - sel.staffStart());
} else {
Expand Down
5 changes: 5 additions & 0 deletions src/engraving/dom/property.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,10 @@ static constexpr PropertyMetaData propertyList[] = {

{ Pid::BRACKET_COLUMN, P_TYPE::SIZE_T, PropertyGroup::APPEARANCE, false, "level", QT_TRANSLATE_NOOP("engraving/propertyName", "level") },
{ Pid::INAME_LAYOUT_POSITION, P_TYPE::INT, PropertyGroup::APPEARANCE, false, "layoutPosition", QT_TRANSLATE_NOOP("engraving/propertyName", "layout position") },

{ Pid::GROUP_BRACKET_SHOW_TEXT, P_TYPE::BOOL, PropertyGroup::NONE, false, "groupBracketShowText", QT_TRANSLATE_NOOP("engraving/propertyName", "group bracket show text") },
{ Pid::GROUP_BRACKET_SHOW_BRACKET, P_TYPE::BOOL, PropertyGroup::NONE, false, "groupBracketShowBracket", QT_TRANSLATE_NOOP("engraving/propertyName", "group bracket show bracket") },

{ Pid::TEXT_STYLE, P_TYPE::TEXT_STYLE, PropertyGroup::TEXT, false, "style", QT_TRANSLATE_NOOP("engraving/propertyName", "style") },
{ Pid::FONT_FACE, P_TYPE::STRING, PropertyGroup::TEXT, false, "family", QT_TRANSLATE_NOOP("engraving/propertyName", "family") },
{ Pid::FONT_SIZE, P_TYPE::REAL, PropertyGroup::TEXT, false, "size", QT_TRANSLATE_NOOP("engraving/propertyName", "size") },
Expand Down Expand Up @@ -490,6 +494,7 @@ static constexpr PropertyMetaData propertyList[] = {
{ Pid::SCORE_FONT, P_TYPE::STRING, PropertyGroup::APPEARANCE, true, "scoreFont", QT_TRANSLATE_NOOP("engraving/propertyName", "score font") },
{ Pid::SYMBOLS_SIZE, P_TYPE::REAL, PropertyGroup::APPEARANCE, false, "symbolsSize", QT_TRANSLATE_NOOP("engraving/propertyName", "symbols size") },
{ Pid::SYMBOL_ANGLE, P_TYPE::REAL, PropertyGroup::APPEARANCE, false, "symbolAngle", QT_TRANSLATE_NOOP("engraving/propertyName", "symbol angle") },
{ Pid::TEXT_ANGLE, P_TYPE::REAL, PropertyGroup::APPEARANCE, false, "textAngle", QT_TRANSLATE_NOOP("engraving/propertyName", "text angle") },

{ Pid::APPLY_TO_ALL_STAVES, P_TYPE::BOOL, PropertyGroup::NONE, false, "applyToAllStaves", QT_TRANSLATE_NOOP("engraving/propertyName", "apply to all staves") },
{ Pid::IS_COURTESY, P_TYPE::BOOL, PropertyGroup::NONE, false, "isCourtesy", QT_TRANSLATE_NOOP("engraving/propertyName", "is courtesy") },
Expand Down
4 changes: 4 additions & 0 deletions src/engraving/dom/property.h
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,9 @@ enum class Pid : short {
BRACKET_COLUMN,
INAME_LAYOUT_POSITION,

GROUP_BRACKET_SHOW_TEXT,
GROUP_BRACKET_SHOW_BRACKET,

TEXT_STYLE,

FONT_FACE,
Expand Down Expand Up @@ -497,6 +500,7 @@ enum class Pid : short {
SCORE_FONT,
SYMBOLS_SIZE,
SYMBOL_ANGLE,
TEXT_ANGLE,

APPLY_TO_ALL_STAVES,

Expand Down
21 changes: 21 additions & 0 deletions src/engraving/dom/staff.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,10 @@ void Staff::swapBracket(size_t oldIdx, size_t newIdx)

void Staff::changeBracketColumn(size_t oldColumn, size_t newColumn)
{
if (oldColumn == newColumn) {
return;
}

size_t idx = std::max(oldColumn, newColumn);
fillBrackets(idx);
int step = newColumn > oldColumn ? 1 : -1;
Expand Down Expand Up @@ -422,6 +426,23 @@ void Staff::addBracket(BracketItem* b)
}
}

void Staff::insertBracket(BracketItem* b)
{
b->setStaff(this);
size_t column = b->column();
if (column < m_brackets.size()) {
if (m_brackets[column]) {
delete m_brackets[column];
}
m_brackets[column] = b;
} else if (column == m_brackets.size()) {
m_brackets.push_back(b);
} else {
fillBrackets(column - 1);
m_brackets.push_back(b);
}
}

//---------------------------------------------------------
// innerBracket
// Return type inner bracket.
Expand Down
1 change: 1 addition & 0 deletions src/engraving/dom/staff.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ class Staff final : public EngravingItem
void swapBracket(size_t oldIdx, size_t newIdx);
void changeBracketColumn(size_t oldColumn, size_t newColumn);
void addBracket(BracketItem*);
void insertBracket(BracketItem* b);
const std::vector<BracketItem*>& brackets() const { return m_brackets; }
std::vector<BracketItem*>& brackets() { return m_brackets; }
void cleanupBrackets();
Expand Down
30 changes: 1 addition & 29 deletions src/engraving/dom/system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,34 +307,6 @@ void System::deleteLockIndicators()
m_lockIndicators.clear();
}

void System::setBracketsXPosition(const double xPosition)
{
for (Bracket* b1 : m_brackets) {
BracketType bracketType = b1->bracketType();
// For brackets that are drawn, we must correct for half line width
double lineWidthCorrection = 0.0;
if (bracketType == BracketType::NORMAL || bracketType == BracketType::LINE) {
lineWidthCorrection = style().styleAbsolute(Sid::bracketWidth) / 2;
}
// Compute offset cause by other stacked brackets
double xOffset = 0;
for (const Bracket* b2 : m_brackets) {
if (!b2->bracketItem()->visible()) {
continue;
}
bool b1FirstStaffInB2 = (b1->firstStaff() >= b2->firstStaff() && b1->firstStaff() <= b2->lastStaff());
bool b1LastStaffInB2 = (b1->lastStaff() >= b2->firstStaff() && b1->lastStaff() <= b2->lastStaff());
if (b1->column() > b2->column()
&& (b1FirstStaffInB2 || b1LastStaffInB2)) {
xOffset += b2->ldata()->bracketWidth();
}
}
// Set position
double x = xPosition - xOffset - b1->ldata()->bracketWidth() + lineWidthCorrection;
b1->mutldata()->setPosX(x);
}
}

//---------------------------------------------------------
// nextVisibleStaff
//---------------------------------------------------------
Expand Down Expand Up @@ -727,7 +699,7 @@ void System::scanElements(std::function<void(EngravingItem*)> func)
return;
}
for (Bracket* b : m_brackets) {
func(b);
b->scanElements(func);
}

if (m_systemDividerLeft) {
Expand Down
12 changes: 11 additions & 1 deletion src/engraving/dom/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,6 @@ class System final : public EngravingItem
AccessibleItemPtr createAccessible() override;
#endif

void setBracketsXPosition(const double xOffset);
size_t getBracketsColumnsCount();

void resetShortestLongestChordRest();
Expand Down Expand Up @@ -232,6 +231,15 @@ class System final : public EngravingItem
double totalNamesWidth() const { return m_totalNamesWidth; }
void setTotalNamesWidth(double v) { m_totalNamesWidth = v; }

const std::unordered_map<staff_idx_t, double>& groupBracketsWidth() const { return m_groupBracketsWidth; }
void setGroupBracketsWidthAtStaffIdx(staff_idx_t i, double w) { m_groupBracketsWidth[i] = w; }
double groupBracketsWidthAtStaffIdx(staff_idx_t i) const
{
return m_groupBracketsWidth.count(i) ? m_groupBracketsWidth.at(i) : 0.0;
}

void clearGroupBracketsWidth() { m_groupBracketsWidth.clear(); }

const std::unordered_map<Part*, InstrumentName*>& partsWithGroupName() const { return m_partsWithGroupName; }
void addPartWithGroupNames(Part* p, InstrumentName* n) { m_partsWithGroupName.emplace(p, n); }
void clearPartsWithGroupNames() { m_partsWithGroupName.clear(); }
Expand All @@ -244,6 +252,8 @@ class System final : public EngravingItem
double m_secondColumnWidth = 0.0;
double m_totalNamesWidth = 0.0;

std::unordered_map<staff_idx_t, double> m_groupBracketsWidth;

std::unordered_map<Part*, InstrumentName*> m_partsWithGroupName;
};
DECLARE_LAYOUTDATA_METHODS(System)
Expand Down
Loading
Loading