Skip to content

Commit

Permalink
Copyright and page number text styles
Browse files Browse the repository at this point in the history
  • Loading branch information
mathesoncalum committed Jul 8, 2024
1 parent a654c72 commit b82c4ad
Show file tree
Hide file tree
Showing 68 changed files with 327 additions and 34 deletions.
2 changes: 2 additions & 0 deletions src/engraving/api/v1/apitypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,8 @@ enum class Tid {
INSTRUMENT_CHANGE = int(mu::engraving::TextStyleType::INSTRUMENT_CHANGE),
HEADER = int(mu::engraving::TextStyleType::HEADER),
FOOTER = int(mu::engraving::TextStyleType::FOOTER),
COPYRIGHT = int(mu::engraving::TextStyleType::COPYRIGHT),
PAGE_NUMBER = int(mu::engraving::TextStyleType::PAGE_NUMBER)
};
Q_ENUM_NS(Tid);

Expand Down
113 changes: 81 additions & 32 deletions src/engraving/dom/page.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,15 @@ void Page::appendSystem(System* s)

Text* Page::layoutHeaderFooter(int area, const String& ss) const
{
String s = replaceTextMacros(ss);
if (s.isEmpty()) {
bool isHeader = area < MAX_HEADERS;

TextBlock tb = replaceTextMacros(isHeader, ss);
if (tb.fragmentsWithoutEmpty().empty()) {
return nullptr;
}

Text* text;
if (area < MAX_HEADERS) {
if (isHeader) {
text = score()->headerText(area);
if (!text) {
text = Factory::createText((Page*)this, TextStyleType::HEADER);
Expand Down Expand Up @@ -131,9 +133,33 @@ Text* Page::layoutHeaderFooter(int area, const String& ss) const
case 5: align = { AlignH::RIGHT, AlignV::BOTTOM };
break;
}
text->mutldata()->blocks = { tb };

// TextBase properties
text->setAlign(align);
text->setXmlText(s);
text->setTextLineSpacing(style().styleD(isHeader ? Sid::headerLineSpacing : Sid::footerLineSpacing));
text->setColor(style().styleV(isHeader ? Sid::headerColor : Sid::footerColor).value<Color>());

const bool spatiumDependent = style().styleB(isHeader ? Sid::headerFontSpatiumDependent : Sid::footerFontSpatiumDependent);
const double factor = spatiumDependent ? SPATIUM20 : DPMM;
const PointF p = style().styleV(isHeader ? Sid::headerOffset : Sid::footerOffset).value<PointF>();
const PointF pointScaled = { p.x() * factor, p.y() * factor };
text->setOffset(pointScaled);

// Frame properties...
text->setFrameType(style().styleV(isHeader ? Sid::headerFrameType : Sid::footerFrameType).value<FrameType>());
text->setFrameColor(style().styleV(isHeader ? Sid::headerFrameFgColor : Sid::footerFrameFgColor).value<Color>());
text->setBgColor(style().styleV(isHeader ? Sid::headerFrameBgColor : Sid::footerFrameBgColor).value<Color>());
text->setFrameWidth(style().styleV(isHeader ? Sid::headerFrameWidth : Sid::footerFrameWidth).value<Spatium>());
text->setPaddingWidth(style().styleV(isHeader ? Sid::headerFramePadding : Sid::footerFramePadding).value<Spatium>());
text->setFrameRound(style().styleI(isHeader ? Sid::headerFrameRound : Sid::footerFrameRound));

// Generates text from ldata, ensures newlines are formatted properly...
text->genText();
text->createBlocks();

renderer()->layoutItem(text);

return text;
}

Expand Down Expand Up @@ -326,10 +352,14 @@ void Page::doRebuildBspTree()
// workTitle
//---------------------------------------------------------

String Page::replaceTextMacros(const String& s) const
TextBlock Page::replaceTextMacros(bool isHeader, const String& s) const
{
String d;
std::list<TextFragment> fragments(1);
for (size_t i = 0, n = s.size(); i < n; ++i) {
// Header / footer style by default...
fragments.back().format.setStyle(style().styleV(isHeader ? Sid::headerFontStyle : Sid::footerFontStyle).value<FontStyle>());
fragments.back().format.setFontSize(style().styleD(isHeader ? Sid::headerFontSize : Sid::footerFontSize));
fragments.back().format.setFontFamily(style().styleSt(isHeader ? Sid::headerFontFace : Sid::footerFontFace));
Char c = s.at(i);
if (c == '$' && (i < (n - 1))) {
Char nc = s.at(i + 1);
Expand All @@ -348,52 +378,61 @@ String Page::replaceTextMacros(const String& s) const
{
int no = static_cast<int>(m_no) + 1 + score()->pageNumberOffset();
if (no > 0) {
d += String::number(no);
TextFragment pageNumberFragment(String::number(no));
pageNumberFragment.format.setStyle(style().styleV(Sid::pageNumberFontStyle).value<FontStyle>());
pageNumberFragment.format.setFontSize(style().styleD(Sid::pageNumberFontSize));
pageNumberFragment.format.setFontFamily(style().styleSt(Sid::pageNumberFontFace));
fragments.emplace_back(pageNumberFragment);
fragments.emplace_back(TextFragment()); // Start next fragment
}
}
break;
case 'n':
d += String::number(score()->npages() + score()->pageNumberOffset());
fragments.back().text += String::number(score()->npages() + score()->pageNumberOffset());
break;
case 'i': // not on first page
if (!m_no) {
break;
}
// FALLTHROUGH
case 'I':
d += score()->metaTag(u"partName").toXmlEscaped();
fragments.back().text += score()->metaTag(u"partName").toXmlEscaped();
break;
case 'f':
d += masterScore()->fileInfo()->fileName(false).toString().toXmlEscaped();
fragments.back().text += masterScore()->fileInfo()->fileName(false).toString().toXmlEscaped();
break;
case 'F':
d += masterScore()->fileInfo()->path().toString().toXmlEscaped();
fragments.back().text += masterScore()->fileInfo()->path().toString().toXmlEscaped();
break;
case 'd':
d += muse::Date::currentDate().toString(muse::DateFormat::ISODate);
fragments.back().text += muse::Date::currentDate().toString(muse::DateFormat::ISODate);
break;
case 'D':
{
String creationDate = score()->metaTag(u"creationDate");
if (creationDate.isEmpty()) {
d += masterScore()->fileInfo()->birthTime().date().toString(muse::DateFormat::ISODate);
fragments.back().text += masterScore()->fileInfo()->birthTime().date().toString(
muse::DateFormat::ISODate);
} else {
d += muse::Date::fromStringISOFormat(creationDate).toString(muse::DateFormat::ISODate);
fragments.back().text += muse::Date::fromStringISOFormat(creationDate).toString(
muse::DateFormat::ISODate);
}
}
break;
case 'm':
if (score()->dirty() || !masterScore()->saved()) {
d += muse::Time::currentTime().toString(muse::DateFormat::ISODate);
fragments.back().text += muse::Time::currentTime().toString(muse::DateFormat::ISODate);
} else {
d += masterScore()->fileInfo()->lastModified().time().toString(muse::DateFormat::ISODate);
fragments.back().text += masterScore()->fileInfo()->lastModified().time().toString(
muse::DateFormat::ISODate);
}
break;
case 'M':
if (score()->dirty() || !masterScore()->saved()) {
d += muse::Date::currentDate().toString(muse::DateFormat::ISODate);
fragments.back().text += muse::Date::currentDate().toString(muse::DateFormat::ISODate);
} else {
d += masterScore()->fileInfo()->lastModified().date().toString(muse::DateFormat::ISODate);
fragments.back().text += masterScore()->fileInfo()->lastModified().date().toString(
muse::DateFormat::ISODate);
}
break;
case 'C': // only on first page
Expand All @@ -402,29 +441,36 @@ String Page::replaceTextMacros(const String& s) const
}
// FALLTHROUGH
case 'c':
d += score()->metaTag(u"copyright").toXmlEscaped();
break;
{
TextFragment copyrightFragment(score()->metaTag(u"copyright").toXmlEscaped());
copyrightFragment.format.setStyle(style().styleV(Sid::copyrightFontStyle).value<FontStyle>());
copyrightFragment.format.setFontSize(style().styleD(Sid::copyrightFontSize));
copyrightFragment.format.setFontFamily(style().styleSt(Sid::copyrightFontFace));
fragments.emplace_back(copyrightFragment);
fragments.emplace_back(TextFragment()); // Start next fragment
}
break;
case 'v':
if (score()->dirty()) {
d += score()->appVersion();
fragments.back().text += score()->appVersion();
} else {
d += score()->mscoreVersion();
fragments.back().text += score()->mscoreVersion();
}
break;
case 'r':
if (score()->dirty()) {
d += revision;
fragments.back().text += revision;
} else {
int rev = score()->mscoreRevision();
if (rev > 99999) { // MuseScore 1.3 is decimal 5702, 2.0 and later uses a 7-digit hex SHA
d += String::number(rev, 16);
fragments.back().text += String::number(rev, 16);
} else {
d += String::number(rev, 10);
fragments.back().text += String::number(rev, 10);
}
}
break;
case '$':
d += '$';
fragments.back().text += '$';
break;
case ':':
{
Expand All @@ -437,24 +483,27 @@ String Page::replaceTextMacros(const String& s) const
tag += s.at(k);
}
if (k != n) { // found ':' ?
d += score()->metaTag(tag).toXmlEscaped();
fragments.back().text += score()->metaTag(tag).toXmlEscaped();
i = k - 1;
}
}
break;
default:
d += '$';
d += nc;
fragments.back().text += '$';
fragments.back().text += nc;
break;
}
++i;
} else if (c == '&') {
d += u"&amp;";
fragments.back().text += u"&amp;";
} else {
d += c;
fragments.back().text += c;
}
}
return d;

TextBlock tb;
tb.fragments() = fragments;
return tb;
}

//---------------------------------------------------------
Expand Down
3 changes: 2 additions & 1 deletion src/engraving/dom/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

#include "engravingitem.h"
#include "bsp.h"
#include "text.h"

namespace mu::engraving {
class RootItem;
Expand Down Expand Up @@ -93,7 +94,7 @@ class Page final : public EngravingItem
Page(RootItem* parent);

void doRebuildBspTree();
String replaceTextMacros(const String&) const;
TextBlock replaceTextMacros(bool isHeader, const String&) const;

std::vector<System*> m_systems;
page_idx_t m_no = 0; // page number
Expand Down
3 changes: 2 additions & 1 deletion src/engraving/dom/textbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,7 @@ class TextBase : public EngravingItem
DirectionV direction() const { return m_direction; }
void setCenterBetweenStaves(AutoOnOff v) { m_centerBetweenStaves = v; }
AutoOnOff centerBetweenStaves() const { return m_centerBetweenStaves; }
void genText();

protected:
TextBase(const ElementType& type, EngravingItem* parent = 0, TextStyleType tid = TextStyleType::DEFAULT,
Expand All @@ -507,7 +508,7 @@ class TextBase : public EngravingItem
void drawSelection(muse::draw::Painter*, const RectF&) const;
void insert(TextCursor*, char32_t code, LayoutData* ldata) const;
String genText(const LayoutData* ldata) const;
void genText();

virtual int getPropertyFlagsIdx(Pid id) const override;
String stripText(bool, bool, bool) const;
Sid offsetSid() const;
Expand Down
32 changes: 32 additions & 0 deletions src/engraving/style/styledef.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1320,6 +1320,38 @@ const std::array<StyleDef::StyleValue, size_t(Sid::STYLES)> StyleDef::styleValue
{ Sid::footerFrameFgColor, "footerFrameFgColor", PropertyValue::fromValue(Color::BLACK) },
{ Sid::footerFrameBgColor, "footerFrameBgColor", PropertyValue::fromValue(Color::transparent) },

// New for 4.4 - defaults taken from footer
{ Sid::copyrightFontFace, "copyrightFontFace", "Edwin" },
{ Sid::copyrightFontSize, "copyrightFontSize", 9.0 },
{ Sid::copyrightLineSpacing, "copyrightLineSpacing", 1.0 },
{ Sid::copyrightFontSpatiumDependent, "copyrightFontSpatiumDependent", false },
{ Sid::copyrightFontStyle, "copyrightFontStyle", int(FontStyle::Normal) },
{ Sid::copyrightColor, "copyrightColor", PropertyValue::fromValue(Color::BLACK) },
{ Sid::copyrightAlign, "copyrightAlign", Align(AlignH::HCENTER, AlignV::BOTTOM) },
{ Sid::copyrightOffset, "copyrightOffset", PointF(0.0, 0.0) },
{ Sid::copyrightFrameType, "copyrightFrameType", int(FrameType::NO_FRAME) },
{ Sid::copyrightFramePadding, "copyrightFramePadding", 0.2 },
{ Sid::copyrightFrameWidth, "copyrightFrameWidth", 0.1 },
{ Sid::copyrightFrameRound, "copyrightFrameRound", 0 },
{ Sid::copyrightFrameFgColor, "copyrightFrameFgColor", PropertyValue::fromValue(Color::BLACK) },
{ Sid::copyrightFrameBgColor, "copyrightFrameBgColor", PropertyValue::fromValue(Color::transparent) },

// New for 4.4 - defaults taken from header
{ Sid::pageNumberFontFace, "pageNumberFontFace", "Edwin" },
{ Sid::pageNumberFontSize, "pageNumberFontSize", 11.0 },
{ Sid::pageNumberLineSpacing, "pageNumberLineSpacing", 1.0 },
{ Sid::pageNumberFontSpatiumDependent, "pageNumberFontSpatiumDependent", false },
{ Sid::pageNumberFontStyle, "pageNumberFontStyle", 1 },
{ Sid::pageNumberColor, "pageNumberColor", PropertyValue::fromValue(Color::BLACK) },
{ Sid::pageNumberAlign, "pageNumberAlign", Align(AlignH::HCENTER, AlignV::TOP) },
{ Sid::pageNumberOffset, "pageNumberOffset", PointF() },
{ Sid::pageNumberFrameType, "pageNumberFrameType", int(FrameType::NO_FRAME) },
{ Sid::pageNumberFramePadding, "pageNumberFramePadding", 0.2 },
{ Sid::pageNumberFrameWidth, "pageNumberFrameWidth", 0.1 },
{ Sid::pageNumberFrameRound, "pageNumberFrameRound", 0 },
{ Sid::pageNumberFrameFgColor, "pageNumberFrameFgColor", PropertyValue::fromValue(Color::BLACK) },
{ Sid::pageNumberFrameBgColor, "pageNumberFrameBgColor", PropertyValue::fromValue(Color::transparent) },

{ Sid::instrumentChangeFontFace, "instrumentChangeFontFace", "Edwin" },
{ Sid::instrumentChangeFontSize, "instrumentChangeFontSize", 10.0 },
{ Sid::instrumentChangeLineSpacing, "instrumentChangeLineSpacing", 1.0 },
Expand Down
30 changes: 30 additions & 0 deletions src/engraving/style/styledef.h
Original file line number Diff line number Diff line change
Expand Up @@ -1327,6 +1327,36 @@ enum class Sid {
footerFrameFgColor,
footerFrameBgColor,

copyrightFontFace,
copyrightFontSize,
copyrightLineSpacing,
copyrightFontSpatiumDependent,
copyrightFontStyle,
copyrightColor,
copyrightAlign,
copyrightOffset,
copyrightFrameType,
copyrightFramePadding,
copyrightFrameWidth,
copyrightFrameRound,
copyrightFrameFgColor,
copyrightFrameBgColor,

pageNumberFontFace,
pageNumberFontSize,
pageNumberLineSpacing,
pageNumberFontSpatiumDependent,
pageNumberFontStyle,
pageNumberColor,
pageNumberAlign,
pageNumberOffset,
pageNumberFrameType,
pageNumberFramePadding,
pageNumberFrameWidth,
pageNumberFrameRound,
pageNumberFrameFgColor,
pageNumberFrameBgColor,

instrumentChangeFontFace,
instrumentChangeFontSize,
instrumentChangeLineSpacing,
Expand Down
Loading

0 comments on commit b82c4ad

Please sign in to comment.